单片机之串口通信
#include "reg52.h"#include <string.h>unsigned char idata RevBuffer[30];bit CmdValid; void iccardcode(){ unsigned char cmd; cmd = RevBuffer[0];//获取命令switch(cmd) {case 1: //判断命令P1=0XFB;break;case 2: //判断命令 P1=0XF7; break;case 3: //判断命令P1=0XF0;break;}}///////////////////////////////////////////////////////////////////////系统初始化/////////////////////////////////////////////////////////////////////void InitializeSystem(){ P0 = 0xFF; P1 = 0x7F; P3 = 0xFF; PCON = 0x80; //设置波特率加倍 此时波特率为19200bps SCON = 0x70; TMOD = 0x20; //定时器1作为波特率发生器;TH1 = 0xfd; // 11.0592M晶振 在波特率不加倍情况:9600pbs// 波特率 加 倍情况:19200bpsTL1 = TH1;TR1 = 1; // 启动定时器T1 即波特率发生器 EA=1; //开总中断 ES = 1; //开串口中断CmdValid=0; //设置接收消息标记}///////////////////////////////////////////////////////////////////////用T2做延时子程序////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 接收和发送中断///////////////////////////////////////////////////////////////////////void isr_UART(void) interrupt 4 using 1{ unsigned char len, i; unsigned int j=0; /********************************************* //把接收到的第一个字符作为数 据 的 长度len, // //在短时间内再连续发送len个字节赋给RevBuffer // //加入最后i的值等于len的值,说明接收数据正确 // **********************************************/if(RI){len=SBUF; RI=0;for(i=0;i<len;i++){while(!RI){j++;if(j>1000){ break;}}if(j<1000){RevBuffer[i]=SBUF;RI=0;j=0;}else{ break;}}if(i==len){CmdValid=1;P1=0X00;}}} void main( ){ InitializeSystem( ); while (1) { if (CmdValid) { CmdValid = 0; if(RevBuffer[0]==0x11) //判断命令 { P1=0XFE; } else if(RevBuffer[0]==0x13) //判断命令 { P1=0XFD; } else { iccardcode(); } } }}
?