|
按你的意圖寫了串口通訊程序
- #include <reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit LED_3_S=P1^6;
- sbit LED_4_S=P1^7;
- bit flag=0;
- uchar buff[]={0,0,0}; //緩存
- /*************初始化串口**************/
- void InitUART() //9600bps@11.0592MHz
- {
- PCON &= 0x7F; //波特率不倍速
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- TMOD= 0x20; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
- TL1 = 0xFD; //設(shè)定定時(shí)初值
- TH1 = 0xFD; //設(shè)定定時(shí)器重裝值
- ET1 = 0; //禁止定時(shí)器1中斷
- TR1 = 1; //啟動(dòng)定時(shí)器1
- EA = 1; //開總中斷
- ES = 1; //開串口中斷
- }
- /**********串口發(fā)送函數(shù)*************/
- void SendOneByte(uchar c)
- {
- SBUF = c; //發(fā)送數(shù)據(jù)
- while(!TI); //等待發(fā)送完成
- TI = 0; //發(fā)送中斷請(qǐng)求標(biāo)志位清0
- }
- /**************主程序**************/
- void main()
- {
- uchar i;
- InitUART(); //初始化串口
- while(1)
- {
- if(flag==1) //3字節(jié)數(shù)據(jù)串接收完成
- {
- ES=0; //關(guān)串口中斷
- flag=0; //接收完成標(biāo)志清0
- for(i=0;i<3;i++)
- SendOneByte(buff[i]);//返回收到的數(shù)據(jù)
- ES=1; //開串口中斷
- if(buff[1]=='C')
- {
- switch (buff[2])
- {
- case '1': LED_3_S=1;break;
- case '3': LED_3_S=0;break;
- }
- }
- if(buff[1]=='D')
- {
- switch (buff[2])
- {
- case '1': LED_4_S=1;break;
- case '3': LED_4_S=0;break;
- }
- }
- for(i=0;i<3;i++)
- buff[i]=0; //清空緩存
- }
- }
- }
- /*****通訊中斷接收程序**********/
- void uart_rx() interrupt 4
- {
- static uchar i=0;
- RI=0;
- buff[i]=SBUF;
- if(buff[0]==':') //驗(yàn)證數(shù)據(jù)頭,否則重新接收覆蓋
- {
- i++;
- if(i==3)
- {
- flag=1; //接收完成標(biāo)志置1
- i=0;
- }
- }
- }
復(fù)制代碼
|
|