51单片机多字节接收问题

2019-07-15 16:30发布

#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;   //T1¹¤×÷ģʽ2  8λ×Ô¶¯ÖØ×°
TH1 = 0xfd;   TL1 = 0xfd;  //±ÈÌØÂÊ9600
TR1 = 1;  
SM0 = 0;   SM1 = 1;   //´®¿Ú¹¤×÷·½Ê½1 10λÒì²½
REN = 1;  //´®¿ÚÔÊÐí½ÓÊÕ
EA  = 1;  ES  = 1;  
}
uchar Task()       //¼ì²âÆðʼÐźÅÅжϹ¤×÷ģʽ
{
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)      //ÇóºÍУÑ飬УÑéͨ¹ý·µ»Ø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(); //´®¿Ú³õʼ»¯
while(1);
}

void UART() interrupt 4
{
RI=0;
num[count++]=SBUF;
if(Exam(Task))
  P1=0x0f;
else
  P1=0xf0;
}


我想在起始信号a5下查询到数据,分三种工作模式,不同工作模式接收不同字节数据,各位大神帮忙看看有什么问题,一直达不到预期
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
zjbhello
1楼-- · 2019-07-15 19:52
自己没做51开发也有几年了,也看出楼主程序里面有一些致命的错误哈,比如程序最后中断函数的if语句。
建议楼主第一步是将串口接收程序给调试好,再进行后面的工作
zjbhello
2楼-- · 2019-07-15 19:55
自己没做51开发也有几年了,也看出楼主程序里面有一些致命的错误哈,比如程序最后中断函数的if语句。
建议楼主第一步是将串口接收程序给调试好,再进行后面的工作
mrzhong
3楼-- · 2019-07-15 21:46
建议不要把那个if(Exam(Task))
  P1=0x0f;
else
  P1=0xf0;
}
这个放在中断里面处理。。

一周热门 更多>