单片机之串口通讯
单片机之串口通信
#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 // 波特率 加 倍情况:19200bps TL1 = 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(); } } } }