- #include <at89x51.h>
- #define kai 0;
- #define guan 1;
- unsigned char table[2];
- unsigned char flag;
- unsigned char a;//a用来存放串口接收到的数据
- unsigned char b;//b用来存放串口接收到的数据
- sbit a0=P2^0;
- sbit a1=P2^1;
- main()
- {
- TMOD=0x20;//定时器1使用初值自动重装方式,方式2
- TH1=0xfd;
- TL1=0xfd;//9600波特率初值
- TR1=1;//允许定时器计数
- SM0=0;//方式1设置
- SM1=1;
- REN=1; //允许串口接收
- EA=1; //开总中断
- ES=1; //开串口中断
- while(1)
- {
- a=table[0];
- b=table[1];
- if(flag==1){
- if(a==49&&b==49)
- {
- a0=kai;
- SBUF=1;
- flag=0;
-
- }
- else if(a==49&&b==48)
- {
- a1=kai;
- SBUF=2;
- flag=0;
- }
- else ;
- }
- }
- }
- void serial () interrupt 4
- {
- unsigned char i;
- if(RI)
- {
- RI=0;
- for(i=0;i<2;i++)
- {
- while(!RI);
- table[i]=SBUF;
- flag=1;
-
- }
- }
- if(TI)
- {
- TI=0;
- }
- }
复制代码以上就是程序啦。现在遇到这么一个问题。上位机发送字符11。进入if(a==49&&b==49)。发送10 有时候进入这个,有时候进入if(a==49&&b==48)。发送1有时候也会进入if(a==49&&b==49)。反正就是很乱。如果把flag==1去掉。又正常。这个是为什么。我觉得问题应该出在中断上,我刚学中断,一直没搞懂,现在还是没搞懂,求助。
引导码不就是相当于多发送了一个或两个字节的数据么。。。。比如你原来是发送11程12两个数据,现在加上两字节的的引导码。那就是一次发送四个数据嘛。。
稍微改了下。。
#include <at89x51.h>
#define kai 0;
#define guan 1;
unsigned char table[4];
unsigned char flag;
unsigned char a;//a用来存放串口接收到的数据
unsigned char b;//b用来存放串口接收到的数据
sbit a0=P2^0;
sbit a1=P2^1;
//----------------------------------------------
//增加部份
unsigned char DataLen;
//----------------------------------------------
main()
{
TMOD=0x20;//定时器1使用初值自动重装方式,方式2
TH1=0xfd;
TL1=0xfd;//9600波特率初值
TR1=1;//允许定时器计数
SM0=0;//方式1设置
SM1=1;
REN=1; //允许串口接收
EA=1; //开总中断
ES=1; //开串口中断
//----------------------------------------------
// 增加部份
DataLen = 0x00;
//----------------------------------------------
while(1)
{
if(flag==1)
{
if(a==49&&b==49)
{
a0=kai;
SBUF=1;
}
else if(a==49&&b==48)
{
a1=kai;
SBUF=2;
}
else ;
flag = 0;
}
}
}
void serial () interrupt 4
{
if(RI)
{
if(DataLen > 1)
{
table[DataLen] = SBUF;
//判断一帧数据是否接收完毕
if(++DataLen > 3)
{
DataLen = 0x00;
flag = 1;
}
}
else
{
table[DataLen] = SBUF;
if(++DataLen == 0x02)
{
// 已接收到大于2字节数据,判断引导码是否正确
if((table[0] != 0xA5) || (table[1] != 0x5A))
{
// 引导码不正确,接收数据长度指针置0
DataLen = 0x00;
}
}
}
}
TI = 0;
RI = 0;
}
一周热门 更多>