1:校验和;
2:串口发码;
#include "STK6037.h" //运行晶振:11.05926MHZ #define TIMER0_H (65536-1800)/256//定时2Ms #define TIMER0_L (65536-1800)%256 #define SYS_Fosc 11059200 //晶振频率 #define COMM_BAUD_RATE 9600 //串口波特率 #define OSC_FREQ 11059200 //11059200 static INT8U Send_buf[10] = {0} ; static INT8U Recv_buf[10] = {0} ; static INT8U SendDataLen = 0 ; static INT8U ResendDataLen = 0 ; /******************************串口1的波特率********************************/ //T1作波特率发生器 //在波特率加倍情况下 #define BAUD_57600 256 - (OSC_FREQ/192L)/57600L // 254 FF #define BAUD_28800 256 - (OSC_FREQ/192L)/28800L // 254 FE #define BAUD_19200 256 - (OSC_FREQ/192L)/19200L // 253 FD #define BAUD_14400 256 - (OSC_FREQ/192L)/14400L // 252 FC #define BAUD_9600 256 - (OSC_FREQ/192L)/9600L // 250 FA void Delay_Us(INT32U z) { while(z--); } void Delay_Ms(INT32U z) { INT32U x=0 , y=0; for(x=110 ; x>0 ;x--) for(y=z; y>0;y-- ); } /***************************************************************************************************** - 功能描述: 串口1初始化 9600波特率 *****************************************************************************************************/ void Serial_init(void) { TMOD = 0x20; // 设置 T1 为波特率发生器 SCON = 0x50; // 0101,0000 8位数据位, 无奇偶校验 PCON = 0x00; //PCON=0; TH1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12); //设置为9600波特率 TL1=256-(SYS_Fosc/COMM_BAUD_RATE/32/12); TR1 = 1; //定时器1打开 REN = 1; //串口1接收使能 ES = 1; //串口1中断使能 } /***************************************************************************************************** - 功能描述: 串口发送一帧数据 *****************************************************************************************************/ void SendCmd(INT8U len) { INT8U i = 0 ; Uart_PutByte(0x7E); //起始 串口发送 起始位; for(i=0; i<len; i++) //数据 { Uart_PutByte(Send_buf[i]) ; // 串口发送一个字节 } Uart_PutByte(0xEF) ; //结束 串口发送 结束位; } Uart_SendCMD(0x03 , 0 , 0x01) ; /******************************************************************************************** - 功能描述:求和校验 思路如下:发送的指令,去掉起始和结束。将中间的6个字节进行累加,最后取反码 接收端就将接收到的一帧数据,去掉起始和结束。将中间的数据累加,再加上接收到的校验 字节。刚好为0.这样就代表接收到的数据完全正确。 ********************************************************************************************/ void DoSum( INT8U *Str, INT8U len) { INT16U xorsum = 0; INT8U i; for(i=0; i<len; i++) { xorsum = xorsum + Str[i]; } xorsum = 0 - xorsum; *(Str+i) = (INT8U)(xorsum >>8); *(Str+i+1) = (INT8U)(xorsum & 0x00ff); } /******************************************************************************************** - 功能描述: 串口发送一个字节 - 隶属模块: 外部 - 参数说明: - 返回说明: - 注: ********************************************************************************************/ void Uart_PutByte(INT8U ch) { SBUF = ch; while(!TI){;} TI = 0; } /******************************************************************************************** - 功能描述: 串口向外发送命令[包括控制和查询] - 隶属模块: 外部 - 参数说明: CMD:表示控制指令,请查阅指令表,还包括查询的相关指令 feedback:是否需要应答[0:不需要应答,1:需要应答] data:传送的参数 ********************************************************************************************/ void Uart_SendCMD(INT8U CMD ,INT8U feedback , INT16U dat) { Send_buf[0] = 0xff; //保留字节 Send_buf[1] = 0x06; //长度 Send_buf[2] = CMD; //控制指令 Send_buf[3] = feedback; //是否需要反馈 Send_buf[4] = (INT8U)(dat >> 8); //datah Send_buf[5] = (INT8U)(dat); //datal DoSum(&Send_buf[0],6); //校验 SendCmd(8); //发送此帧数据 } void main() { Delay_Us(1) ; Delay_Ms(1) ; Serial_init() ; Delay_Ms(1000) ;//延时大概6S Uart_SendCMD(0x03 , 0 , 0x01) ; //播放第一首 Delay_Ms(1000) ;//延时大概6S Uart_SendCMD(0x03 , 0 , 0x02) ; //播放第二首 Delay_Ms(1000) ;//延时大概6S Uart_SendCMD(0x03 , 0 , 0x04) ; //播放第四首 while(1) ; }
联系人:客服在线
手机:全工:13903011251
电话:李R:13530006400
邮箱:729986191@qq.com
地址: GUANGDONG PROVINCE