,给大家学习研究!因为字数有限制,只能给前面的串口通讯和协议程序.
单片机演示程序和通讯协议
#include<Atmel/AT89x52.H>
//定义数据类型(可以是数据结构,有什么不明白的可以加我QQ交流2321069078)
//*************************************************************
void InitUART(void) //串口初始化使用22.1184M晶体
{
SCON = 0x50; //选择模式1,8位数据格式,使能UART
PCON |= 0x80; //波特率加倍
TMOD =TMOD| 0x20; //定时器1:模式2 ,自动装载初值
//波特率计算公式:TH1=TL1=256-(2*22.1184*1000000)/(32*12*baud)
//若选115200波特率则TH1=TL1=256-(2*22.1184*1000000)/(32*12*115200)=0xff
//若选19200波特率则TH1=TL1=256-(2*22.1184*1000000)/(32*12*19200)=0xfa
TH1 = 0xfa;
TL1 = 0xfa;
TR1 = 1; //定时器1计数使能
REN = 1; //允许串口接受使能
}
/*
******************************************************************
*
* 名称: write_byte()
* 功能: 向串口发送一个字节的数据
* 入口参数:i为待发送的字节数据
******************************************************************
*/
void UART_SendByte(unsigned char i)
{
SBUF=i; //发送本次数据
while(TI==0){}//等待发送完毕
TI=0;
}
void SetVariable(unsigned int adr,unsigned short nBytes,unsigned char *m_VarP)
{
unsigned char temp;
unsigned short m_CheckCRC;//命令校验
UART_SendByte(0x81); //开始,固定,一个字节
UART_SendByte(0x0); //命令类型,设置变量
UART_SendByte(0x2); //接收方的设备号
m_CheckCRC=0x81+0x0+0x2;
temp=adr&0xff;
UART_SendByte(temp); //地址1
m_CheckCRC=m_CheckCRC+temp;
temp=(adr>>8)&0xff;
UART_SendByte(temp); //地址2
m_CheckCRC=m_CheckCRC+temp;
temp=(adr>>16)&0xff;
UART_SendByte(temp); //地址3
m_CheckCRC=m_CheckCRC+temp;
temp=(adr>>24)&0xff;
UART_SendByte(temp); //地址4
m_CheckCRC=m_CheckCRC+temp;
temp=(nBytes)&0xff;
UART_SendByte(temp); //个数低8位
m_CheckCRC=m_CheckCRC+temp;
temp=(nBytes>>8)&0xff;
UART_SendByte(temp); //个数高8位
m_CheckCRC=m_CheckCRC+temp;
while(nBytes!=0)
{
temp=*m_VarP;
UART_SendByte(temp);
m_CheckCRC=m_CheckCRC+temp;
nBytes--;
m_VarP++;
}
UART_SendByte(m_CheckCRC);
UART_SendByte(m_CheckCRC>>8);
}