|
//利用串口傳輸控制信號(hào)不是簡(jiǎn)單的發(fā)送一幀數(shù)據(jù),而是需要多功能的數(shù)據(jù)串,也不要把控制程序放在中斷里。
//以下是依你的程序和要求改為串口信號(hào)多功能控制,供參考。自定義協(xié)議:以此為例 "AA 55 AA 5A 59"共五位數(shù)據(jù)
//AA是數(shù)據(jù)頭,55 AA 5A 是三位有效數(shù)據(jù),59是數(shù)據(jù)尾,是三位有效數(shù)據(jù)和的余數(shù),依此驗(yàn)證數(shù)據(jù)傳輸是否正確
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table0[] ="OK "; //用于串口助手返回驗(yàn)證
uchar table1[]="ERROR ";//用于串口助手返回驗(yàn)證
uchar rec_buf[5]; //數(shù)據(jù)緩存
bit flag=0; //接收完成標(biāo)志
bit sign=0; //數(shù)據(jù)驗(yàn)證標(biāo)志
sbit beep=P2^3;
/**********串口發(fā)送函數(shù)*************/
void SendOneByte(uchar k)
{
SBUF = k; //發(fā)送數(shù)據(jù)
while(!TI); //等待發(fā)送完成
TI = 0; //發(fā)送中斷請(qǐng)求標(biāo)志位清0
}
void main(void)
{
uchar i,j; //臨時(shí)變量
SCON=0x50; //設(shè)定串口工作方式
PCON=0x00; //波特率不倍增
TMOD=0x20; //定時(shí)器1工作于8位自動(dòng)重載模式, 用于產(chǎn)生波特率
TL1=0xfd;
TH1=0xfd; //波特率9600
TR1=1;
EA=1;
ES = 1; //允許串口中斷
while(1)
{/************數(shù)據(jù)解析*************/
if(flag==1) //5位數(shù)據(jù)串接收完成
{
ES=0; //關(guān)串口中斷
flag=0; //接收完成標(biāo)志清0
j=rec_buf[1]+rec_buf[2]+rec_buf[3];//三位有效數(shù)據(jù)的和,溢出部分舍棄
if(rec_buf[4]==j)//驗(yàn)證數(shù)據(jù)和
{
for(i=0;i<3;i++)
SendOneByte(table0[i]);//返回串口助手字符"OK"
sign=1; //數(shù)據(jù)傳輸正確
}
else
{
for(i=0;i<6;i++)
SendOneByte(table1[i]);//返回串口助手字符"ERROR"
sign=0; //數(shù)據(jù)傳輸錯(cuò)誤
}
ES=1; //開串口中斷
/******控制任務(wù)*******/
if(sign==1)
{
P0=rec_buf[1];
P1=rec_buf[2];
P2=rec_buf[3];
beep=1;
}
else
{
P0=0xff;
P1=0xff;
P2=0xff;
beep=0;
}
}
}
}
/*********************************************************
串口中斷服務(wù)函數(shù)
*********************************************************/
void serial() interrupt 4
{
static uchar num=0; //靜態(tài)計(jì)數(shù)變量
RI=0; //接收中斷請(qǐng)求標(biāo)志位清0
rec_buf[num]=SBUF; //接收到的數(shù)據(jù)串保存在緩存數(shù)組
if(rec_buf[0]==0xAA) //驗(yàn)證數(shù)據(jù)頭(起始位)
{
num++;
if(num>=5)
{
flag=1; //接收完成標(biāo)志置1
num=0; //計(jì)數(shù)變量清0
}
}
} |
評(píng)分
-
查看全部評(píng)分
|