求帮忙看看单片机代码是不是有什么问题;描述是:发送的串口协议的 帧头AA,长度4,数据(3个字节)异或校验(只校验数据位);
只有输入正确的话会把数据发送到串口助手在电脑上显示出来;
现在是发什么它都接受,根本给规定的不一样;
代码:#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr S2CON = 0x9a;
sfr S2BUF = 0x9b;
sfr IE2 = 0xaf;
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
bit busy;
uchar xor_check;//异或校验
uchar recv_data;//临时变量用来接收S2BUF中的数据
uchar recv_cnt = 0;
uchar recv_buf[10];//接收数据
uchar recv_flag = 0;
uchar machine_step = 0;
void delay_140us(void);
//void delay_1ms(unsigned int i);
void Uart2SEND(uint dat);
void Uart2SENDStr(char *p);
void Delay500ms() //@11.0592MHz
{
uchar i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Uart2Isr() interrupt 8
{
if ((S2CON & 0x01) == 1)
{
S2CON &= ~0x01;
recv_data = S2BUF;
switch(machine_step)
{
case 0:
if(recv_data == 0xAA)//判断是不是帧头
{
machine_step = 1;
}
else
{
machine_step = 0;
}
break;
case 1:
if(recv_data == 04)//判断第二个数据
{
machine_step = 2;
recv_cnt = 0;//
}
else
{
machine_step = 0;
}
break;
case 2: //开始接收数据(3个字节)
xor_check ^= recv_data;
recv_buf[recv_cnt] = recv_data;
recv_cnt++;
if(recv_cnt > 2)
{
machine_step = 3;
}
else
{
machine_step = 2;
}
break;
case 3:
if(xor_check == recv_data)
{
recv_flag = 1;
}
machine_step = 0;
recv_cnt = 0;
xor_check = 0;
break;
default: break;
}
}
if ((S2CON & 0x02)== 1)
{
S2CON &= ~0x02;
busy = 0;
}
}
void Uart2Init()
{
S2CON = 0x10;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x14;
busy = 0;
}
void Uart2SEND(uint dat)
{
while (busy)
busy = 1;
S2BUF = dat;
//Delay500ms();
}
void Uart2SENDStr(char *p)
{
while (*p)
{
Uart2SEND(*p++);
}
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
Uart2Init();
IE2 = 0x01;
EA = 1;
Uart2SENDStr("test");
while (1)
{
if(recv_flag == 1)
{
recv_flag = 0;
// Uart2SEND(recv_data);
Uart2SENDStr(recv_buf);
}
}
}
|