单片机串口接收程序出现问题
2019-07-15 09:54发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
本人写了一个程序在单片机开发板试验运行,电脑第一次发十六进制aa0200ac给单片机串口时,D0(灯)有反应,但当我再发十六进制aa0000aa给单片机时发现D1并没有反应,望大神指导
12M的晶振,三个字节头部,数据位个数由第三个字节定,最后一位为检验和位
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit D0=P2^0;
sbit D1=P2^1;
sbit D2=P2^2;
unsigned char receive[64]={0};//接收缓存
bit off_whatdog=1;
bit feed_dog_start=0;
bit feed_dog_stop=0;
#define SYNC_BYTE 0xaa
enum cmd_type {
CMD_WD_START,
CMD_WD_STOP,
CMD_WD_FEED_START,
CMD_WD_FEED_STOP,
};
struct packagehead
{
unsigned char synchead;
unsigned char cmd;
unsigned char length;
};
struct packagehead pkgh;
void delay2s(void) //误差 0us
{
unsigned char a,b,c;
for(c=127;c>0;c--)
for(b=235;b>0;b--)
for(a=32;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void InitUART(void)
{
TMOD |= 0x20;
SCON = 0x50;
TH1 = 0xF3;
TL1 = TH1;
PCON = 0x80; //波特率4800
EA = 1;
ES = 1;
TR1 = 1;
}
void main(void)
{
uint i=0,j=0,a=0,aa=0,b=0,bb=0;
InitUART();
D2 = 1;
D1 = 0;
D0 = 1;
while (1)
{
i=0;
D2 = ~D2;
ES = 1; //开中断
delay2s();
if(a==0)
{
if (off_whatdog==1)
{
aa=1;
a=0;
}
else //串口数据接收检验成功,进入这个条件
{
aa=0;
D0 = ~D0;
}
ES = 1; //开中断
delay2s();
}
if((aa==0)&&(feed_dog_start==1))
{
a=1;
D1 = ~D1;
}
if(aa==0&&feed_dog_stop)
{
a=0;
}
}
}
void ser()interrupt 4
{
static unsigned char i=0;
static unsigned char total=0;
RI=0;
receive=SBUF;
if(i==0)
pkgh.synchead = receive;
if(i==1)
pkgh.cmd = receive;
if(i==2)
pkgh.length = receive;
if(i<(pkgh.length+3))
total+=receive;
i++;
if(pkgh.synchead==SYNC_BYTE&&receive[pkgh.length+3]==total )
{
if(pkgh.cmd==CMD_WD_STOP)
off_whatdog = 1;
if(pkgh.cmd==CMD_WD_FEED_START)
{
off_whatdog=0;
}
if(pkgh.cmd == CMD_WD_START)
{
feed_dog_start = 1;
}
if(pkgh.cmd == 0x03)
{
feed_dog_stop = 1;
}
i=0;
ES=0; //关中断,恢复完了再ES=1;
}
if(i>pkgh.length+4)
i=0;
}
一周热门 更多>