51单片机与触摸屏通讯实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


#include
#include
#include
#include
/* These macro define simple data type */
#define uchar unsigned char
#define ulint unsigned long
#define uint unsigned int
/* These macro for Mudbus function code */
#define ReadCoilSta 0x01 // 0X read coil function
#define ForceSingleCoil 0x05 // 0X force single coil function
#define ReadHoldReg 0x03 // 4X read input register
#define PresetMulReg 0x06 // 4X write multi register
/* These macro describe index of communiction message from start to end */
#define CommIndexSlaveID 0 // macro for slave ID
#define CommIndexFunction 1 // macro for function code
#define CommIndexStartAdrHi 2 // macro for data hight adr
#define CommIndexStartAdrLo 3 // macro for data low adr
#define CommIndexNoPointHi 4 // macro for hight quantity datas
#define CommIndexNoPointLo 5 // macro for low quantity datas
/* These macro describe recieve message lenght of different function code */
/* But not include data lenght ,the data is master write to slave */
/* because we don't know the data lenght prior, it depend on ComBuf[ComIndexNoPoint] value */
#define ReadCoilStaIndexEnd 7 // 0~7,0x01,0X
#define ForceSingleCoilIndexEnd 7 // 0~7,0x05,0X
#define ReadHoldRegIndexEnd 7 // 0~7,0x03,4X
#define PresetMulRegIndexEnd 7 // 0~8,0x10,4X
/* these macro describe send or recieve allowed */
#define SEND 1 // send allowed
#define RECIEVE 0 // recieve allowed
#define SlaveID 0x01 // the slave's ID
#define SendRecieveDelay 50 // Send turn to Recieve or Recieve turn to Send delay time vlaue
#define MaxDataLen 30 // preset CommBuf array Max lenght
#define MaxRegLen 20 // preset SlaveOutputBuf Max lenght
/* variable for modbus is following */
bit data RecFinishF;
uchar data CommIndex;
uchar data writeadr;
uchar data CommIndexEnd;
uchar idata CommBuf[MaxDataLen];
uchar idata SlaveOutputBuf[MaxRegLen]; // Hight 8 bit of word is front,Low 8 bit is back
uchar idata SlaveInputBuf[MaxRegLen];
uchar data *port _at_ 0x7F ;
/* exp data define */
//#define SlaveAdr XBYTE [0xD800]
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
uchar idata ForceCoilBuf[10];
uchar count=0;
uchar forceval=0x00;
//bit forcesendF=0;
/* Table Of CRC Values for high-order byte */
uchar code auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,

0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
} ;
/* Table of CRC values for low-order byte */
uchar code auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
} ;
uint crc16(uchar *puchMsg,uchar usDataLen) // puchMsg message to calculate CRC upon
{ // usDataLen quantity of bytes in message
uchar uchCRCHi = 0xFF ; // high byte of CRC initialized
uchar uchCRCLo = 0xFF ; // low byte of CRC initialized
uint uIndex ; // will index into CRC lookup table
while (usDataLen--) // Pass through message buffer
{
uIndex = uchCRCHi ^ *puchMsg++ ; // calculate the CRC
uchCRCHi = uchCRC

Lo ^ auchCRCHi[uIndex] ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (((uint)(uchCRCLo) << 8) | uchCRCHi) ;
}
/*------------- init code is following ----------------*/
void initSFR(void)
{
TH1=0xfa;
TL1=0xfa; // botelv set 9600 bps/s
TMOD=0x21; // T1 8bit timer for uart band rate, T0 16bit timer
PCON=PCON | 0x80; // band rate is 2 times
SCON=0x50; // uart mode is 01,start bit + 8 bit data +stop bit : peer to peer communication
PS=1; // uart intrrupt is hightest
TR1=1; // start T1
ES=1; // serially interrupt allow
EA=1; // chief interrupt allow
}
void initvar(void)
{
uchar i;
for (i=0;i<=250;i++)
_nop_();
T0=RECIEVE;
RecFinishF=0;
CommIndex=0;
CommIndexEnd=0xff; // First enlarge recieve lenght
for (i=0;iSlaveOutputBuf[i]=0;
}
void init(void)
{
initSFR();
initvar();
}
void AnalyzeRecieve(void)
{
uint crc16tem;
uchar i;
if (CommBuf[CommIndexSlaveID]==SlaveID) // The slave ID is matched
{
crc16tem=crc16(CommBuf,CommIndex-1); // calculate CRC check, erase two CRC byte
if (crc16tem==(((uint)(CommBuf[CommIndexEnd]) << 8) | CommBuf[CommIndexEnd-1]))
{ // crc16 check is OK
switch (CommBuf[CommIndexFunction])
{
case ReadCoilSta:
CommBuf[CommIndexSlaveID]=SlaveID; // 0
CommBuf[CommIndexFunction]=ReadCoilSta; // 1
CommBuf[2]=CommBuf[CommIndexNoPointLo] / 0x08; // 0x16 bit
//for (i=0;iSlaveOutputBuf[0]=~P1; // send data of master force coil val
SlaveOutputBuf[1]=0;
i=CommBuf[2]+3;
for(CommIndex=3;CommIndexCommBuf[CommIndex]=SlaveOutputBuf[CommIndex-3]; // hight 8 bit is first send
crc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit data
CommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front
CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bit
CommIndexEnd=CommIndex;
CommIndex=0;
SBUF=CommBuf[CommIndex++];
break;
case ForceSingleCoil:
// SlaveInputBuf[0]=CommBuf[4]; // get data 0x00 or 0xff

if (CommBuf[4]==0xff)

{
switch(CommBuf[3])
{
case 0:
LED0=0;
break;
case 1:
LED1=0;
break;
case 2:
LED2=0;
break;
case 3:
LED3=0;
break;
case 4:
LED4=0;
break;
case 5:
LED5=0;
break;
case 6:
LED6=0;
break;
case 7:
LED7=0;
break;
}
}
else

{
switch(CommBuf[3])
{
case 0:
LED0=1;
break;
case 1:
LED1=1;
break;
case 2:
LED2=1;
break;
case 3:
LED3=1;
break;
case 4:
LED4=1;
break;
case 5:
LED5=1;
break;
case 6:
LED6=1;
break;
case 7:
LED7=1;
break;
}
}

// LED0=!LED0;
ForceCoilBuf[count]=CommBuf[4];
forceval=CommBuf[4];
count++;
CommBuf[CommIndexSlaveID]=SlaveID; // 0
CommBuf[CommIndexFunction]=ForceSingleCoil; // 1
CommIndex=2;
// CommBuf[CommIndex++]=0x00;
// CommBuf[CommIndex++]=0x01;
// CommBuf[CommIndex++]=0x00;
// CommBuf[CommIndex++]=0xff;
// forcesendF=1;
CommBuf[CommIndex++]=CommBuf[Comm

IndexStartAdrHi]; // 2
CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrLo]; // 3
CommBuf[CommIndex++]=CommBuf[CommIndexNoPointHi]; // 4
CommBuf[CommIndex++]=CommBuf[CommIndexNoPointLo]; // 5
crc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit data
CommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front
CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bit
CommIndexEnd=CommIndex;
CommIndex=0;
SBUF=CommBuf[CommIndex++];
break;
case ReadHoldReg:
writeadr=CommBuf[3];
CommBuf[CommIndexSlaveID]=SlaveID; // 0
CommBuf[CommIndexFunction]=ReadHoldReg; // 1
CommBuf[2]=CommBuf[CommIndexNoPointLo]*2; // 2 Byte Count

port=(uchar data *)writeadr;


for (i=0;i
{
SlaveOutputBuf[i]=0;
i++;
SlaveOutputBuf[i]=*port;
port++;
}
i=CommBuf[2]+3;
for(CommIndex=3;CommIndexCommBuf[CommIndex]=SlaveOutputBuf[CommIndex-3]; // hight 8 bit is first send
crc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit data
CommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front
CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bit
CommIndexEnd=CommIndex;
CommIndex=0;
SBUF=CommBuf[CommIndex++];
break;
case PresetMulReg:
//writeadr=CommBuf[3]+CommBuf[2]*256;
//j=CommBuf[CommIndexNoPointLo]*2;
//for (i=0;i//{
//SlaveOutputBuf[i]=CommBuf[i+7]; // get data that master send start 7th byte
//XBYTE[writeadr]=SlaveOutputBuf[i];
///writeadr++;
//}
port=(uchar data *)CommBuf[3];
*port=CommBuf[5];
CommBuf[CommIndexSlaveID]=SlaveID; // 0
CommBuf[CommIndexFunction]=PresetMulReg; // 1
CommIndex=2;
CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrHi]; // 2
CommBuf[CommIndex++]=CommBuf[CommIndexStartAdrLo]; // 3
CommBuf[CommIndex++]=CommBuf[CommIndexNoPointHi]; // 4
CommBuf[CommIndex++]=CommBuf[CommIndexNoPointLo]; // 5
crc16tem=crc16(CommBuf,CommIndex); // then send low 8 bit data
CommBuf[CommIndex++]=(uchar)(crc16tem & 0x00ff); // send crccheck low 8 bit is front
CommBuf[CommIndex]=(uchar)(crc16tem>>8); // then send hight 8 bit
CommIndexEnd=CommIndex;
CommIndex=0;
SBUF=CommBuf[CommIndex++];
//XBYTE[writeadr]=SlaveOutputBuf[1];
break;
default:
for (i=0;i<=80;i++) // delay // error recieve again
_nop_();
CommIndex=0;
T0=RECIEVE;
break;
}
}
else
{
for (i=0;i<=80;i++) // delay
_nop_();
CommIndex=0;
T0=RECIEVE;
}
}
}
/*------------- intr code is following ----------------*/
void slavecomm(void) interrupt 4 using 2
{
uint i;
ES=0;
if(TI)
{
TI=0;
if (CommIndex<=CommIndexEnd)
{
SBUF=CommBuf[CommIndex++];
}
else
{
// if (forcesendF)
// _nop_();
for (i=0;i<=SendRecieveDelay;i++) // delay
_nop_();
CommIndex=0;
T0=RECIEVE;
}
}
if(RI)
{
RI=0;
if (CommIndex{
CommBuf[CommIndex]=SBUF;
if (CommIndex==CommIndexFunction)
{
switch (CommBuf[CommIndexFunction])
{
case ReadCoilSta:

CommIndexEnd=ReadCoilStaIndexEnd;
break;
case ForceSingleCoil:
CommIndexEnd=ForceSingleCoilIndexEnd;
break;
case ReadHoldReg:
CommIndexEnd=ReadHoldRegIndexEnd;
break;
case PresetMulReg:
CommIndexEnd=7 ;//6+CommBuf[CommIndexNoPointLo]*2+2;
break;
default:
break;
}
}
CommIndex++;
}
else // recieve finished CommIndex==CommIndexEnd
{
CommBuf[CommIndexEnd]=SBUF;
RecFinishF=1;
for (i=0;i<=SendRecieveDelay;i++) // delay
_nop_();
T0=SEND;
}
}
ES=1;
}
/*------------------ main code following -----------------*/
void main(void)
{
uint data i;
init();
while(1)
{
// LED0=!LED0;
for(i=0;i<=9;i++)
_nop_();
if (RecFinishF)
{
AnalyzeRecieve();
RecFinishF=0;
}
}
}

相关文档
最新文档