我编写的主程序中LED无法点亮,硬件电路核查过没问题,void Data_anlysize()函数也没问题,Data_ok能收到,不清楚问题在哪?
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#define uint unsigned int //对数据类型进行声明定义
#define uchar unsigned char
uchar Data_buf[22]; //串口接收数据缓存数组
uint Data_recieve[22]; //串口接收到完整帧
uint flag; //串口接收结束标志
uint Data_ok; //有效数据提取标志
sbit ticket=P1^0; //将单片机的P1.0端口定义为乘客购票检测
sbit voice=P1^4; //将单片机的P1.4端口定义为语音提示开关
sbit led=P0^0; //将单片机的P0.0端口定义bug检测
void UsartInit(); //串口初始化
void Data_anlysize(); //数据分析
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
UsartInit(); //串口初始化
while(1)
{
voice=0;
Data_anlysize(); //数据分析
if(Data_ok==1&&ticket==0) //判断乘客有购票行为
{
voice=1; //开语音提示
led=0;
}
}
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Usart() interrupt 4
{
static uchar count=0; //静态计数变量
RI=0; //接收中断请求标志位清0
Data_buf[count]=SBUF; //接收到的数据串保存在缓存数组
if(Data_buf[0]==0x02) //验证数据头(起始位)
{
count++;
if(count>=23)
{
flag=1; //接收完成标志置1
count=0; //计数变量清0
}
}
}
/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :串口初始化
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void UsartInit()
{
SCON=0X50; //设置为串口工作方式1(SM0=0,SM0=1),允许接收 (REN=1)
T2CON=0X34; //设置T2为波特率发生器工作方式(TCLK=1,RCLK=1,TR2=1),T2为定时器(C_T2=0 )
//T2MOD=0X00; //设置T2为加法计数DCEN=0,时钟输出不使能T2OE=0
TH2=0XFF;
TL2=0XFD;
RCAP2H=0XFF;
RCAP2L=0XFD; //计数器T2初始值设置,波特率115200
EA=1; //打开总中断
ES=1; //设置中断允许控制寄存器IE,允许串行中断
}
/*******************************************************************************
* 函数名 :Data_anlysis()
* 函数功能 :串口协议分析
* 输入 : 无
* 输出 : 无
* 备注 : 帧结构
02 //帧头
14 //数据长度: 长度=命令+参数+效验
30 57 00 //命令
64 00 //找零箱内硬币数
00 00 00 00 00 00 00 00 00 00 00 00 00 00
17 //XOR :XOR=长度xor命令xor参数
03 //帧尾
*******************************************************************************/
void Data_anlysize()
{
uchar i,j; //临时变量
if(flag==1) //23位数据串接收完成
{
ES=0; //关串口中断
flag=0; //接收完成标志清0
j=Data_buf[2]^Data_buf[3]^Data_buf[4]^Data_buf[5]^Data_buf[6]^Data_buf[7]^Data_buf[8]^Data_buf[9]^Data_buf[10]^Data_buf[11]^Data_buf[12]^Data_buf[13]^Data_buf[14]^Data_buf[15]^Data_buf[16]^Data_buf[17]^Data_buf[18]^Data_buf[19]^Data_buf[20];//XOR校验
if(Data_buf[21]==j) //校验通过
{
for(i=0;i<=22;i++)
Data_recieve[i]=Data_buf[i];//接收完整帧
if(Data_recieve[5]==0x64)
Data_ok=1;
}
ES=1; //开串口中断
}
}
|