51单片机多字节接收问题
时间:10-02
整理:3721RD
点击:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num[32],k=0,count;
void UART_init()
{
TMOD = 0x20; //T11¤×÷?£ê?2 8??×??ˉ??×°
TH1 = 0xfd; TL1 = 0xfd; //±èì??ê9600
TR1 = 1;
SM0 = 0; SM1 = 1; //′??ú1¤×÷·?ê?1 10??òì2?
REN = 1; //′??ú?êDí?óê?
EA = 1; ES = 1;
}
uchar Task() //?ì2a?eê?D?o??D??1¤×÷?£ê?
{
bit bi;
char i=0,j;
for(;i<32;i++){
if(num[i]==0xa5) j=i;
switch(num[j+1]){
case 0x01: if(num[j+2]==0x08) {bi=1; k=0x01;}
break;
case 0x02: if(num[j+2]==0x0a) {bi=1; k=0x02;}
break;
case 0x03: if(num[j+2]==0x06) {bi=1; k=0x03;}
break;
default: bi=0;
break;}
if(bi==1) return j+3;
}
return 0;
}
bit Exam(uchar add) //?óoíD£?é£?D£?éí¨1y·μ??1
{
uchar he,i=0;
switch(k){
case 0x01:
{for(;i<8;i++) he+=num[add];
if(he==num[add+8]) return 1; else return 0;}
case 0x02:
{for(;i<10;i++) he+=num[add];
if(he==num[add+10]) return 1; else return 0;}
case 0x03:
{for(;i<6;i++) he+=num[add];
if(he==num[add+6]) return 1; else return 0;}
default: return 0;
}
}
void main()
{
UART_init(); //′??ú3?ê??ˉ
while(1);
}
void UART() interrupt 4
{
RI=0;
num[count++]=SBUF;
if(Exam(Task))
P1=0x0f;
else
P1=0xf0;
}
我想在起始信号a5下查询到数据,分三种工作模式,不同工作模式接收不同字节数据,各位大神帮忙看看有什么问题,一直达不到预期
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar num[32],k=0,count;
void UART_init()
{
TMOD = 0x20; //T11¤×÷?£ê?2 8??×??ˉ??×°
TH1 = 0xfd; TL1 = 0xfd; //±èì??ê9600
TR1 = 1;
SM0 = 0; SM1 = 1; //′??ú1¤×÷·?ê?1 10??òì2?
REN = 1; //′??ú?êDí?óê?
EA = 1; ES = 1;
}
uchar Task() //?ì2a?eê?D?o??D??1¤×÷?£ê?
{
bit bi;
char i=0,j;
for(;i<32;i++){
if(num[i]==0xa5) j=i;
switch(num[j+1]){
case 0x01: if(num[j+2]==0x08) {bi=1; k=0x01;}
break;
case 0x02: if(num[j+2]==0x0a) {bi=1; k=0x02;}
break;
case 0x03: if(num[j+2]==0x06) {bi=1; k=0x03;}
break;
default: bi=0;
break;}
if(bi==1) return j+3;
}
return 0;
}
bit Exam(uchar add) //?óoíD£?é£?D£?éí¨1y·μ??1
{
uchar he,i=0;
switch(k){
case 0x01:
{for(;i<8;i++) he+=num[add];
if(he==num[add+8]) return 1; else return 0;}
case 0x02:
{for(;i<10;i++) he+=num[add];
if(he==num[add+10]) return 1; else return 0;}
case 0x03:
{for(;i<6;i++) he+=num[add];
if(he==num[add+6]) return 1; else return 0;}
default: return 0;
}
}
void main()
{
UART_init(); //′??ú3?ê??ˉ
while(1);
}
void UART() interrupt 4
{
RI=0;
num[count++]=SBUF;
if(Exam(Task))
P1=0x0f;
else
P1=0xf0;
}
我想在起始信号a5下查询到数据,分三种工作模式,不同工作模式接收不同字节数据,各位大神帮忙看看有什么问题,一直达不到预期
自己没做51开发也有几年了,也看出小编程序里面有一些致命的错误哈,比如程序最后中断函数的if语句。
建议小编第一步是将串口接收程序给调试好,再进行后面的工作
自己没做51开发也有几年了,也看出小编程序里面有一些致命的错误哈,比如程序最后中断函数的if语句。
建议小编第一步是将串口接收程序给调试好,再进行后面的工作
建议不要把那个if(Exam(Task))
P1=0x0f;
else
P1=0xf0;
}
这个放在中断里面处理。