请高手指教 红外串口解码 返回的数据乱码
刚做了个红外遥控解码,初学编程,写入C51程序如下,通过串口助手调试返回的遥控数据无规则,请哥哥姐姐们指点#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
/////////////////////////////////AtomE//////2010.8.7//////////393275398//////////////////////
uchar flag=0;//是否接到起始位标志 未接到为0 接到为1
uchar traflag=0;//翻译是否完成标记 完成为1
uchar rec[33];//接收遥控器发送的所有数据 用来记录两个下降沿之间的时间
uchar recok=0;//是否接收完一帧数据标记 接收完为1
uchar sendok=0;//是否发送完毕标记 发送完成为1
uchar num=0;//变相记录时间
uchar n=0;//rec[]中的数组定位
void timerinit();//定时器0初始化
void ruptinit();//外部中断0初始化
void tradata();//一帧数据的翻译 即把时间记录转换成0/1
void send();//把收到的数据发给上位机
void delay();
//////////////////////////定时器 中断初始化/////////////////////////////////
void timerinit()//定时器0
{
TMOD=0x02;//定时器0使用方式2
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;//定时器中断开
TR0=1;//计时开
}
void ruptinit()//外部中断0
{
EA=1;
EX0=1;//外部中断开
IT0=1;//下降沿触发 0是电平触发
}
////////////////////////////定时器 中断函数//////////////////////////////
void timer() interrupt 1 //系统从0x00记到0xff 每记一次时间大概为1us 记256次 即256us中断一次
{
num++;//num记录的是256us的个数 总时间=num*256us
}
void rupt() interrupt 0 //外部中断0 当遇到下降沿时触发
{
if(flag==1)//flag为1 说明收到了起始位 接下来要开始进行记录了
{
if(num>32)//时间为32*256us=8.2ms是整个起始位的时间
{ n=0; }
rec[n]=num;//记录两个下降沿之间的num值 这样也就相当于记录了其间的时间
num=0;
n++;
if(n==33)//因为前面是n++ 所以当n=33时 数组已经从0记到了32 已经记满了
{
recok=1;//标记 接收一帧数据完成
n=0;
}
}
else//首次得到下降沿到达这里 使flag变1 用来说明收到了起始位
{
flag=1;
}
}
/////////////////////////////时间翻译函数///////////////////////////////////////
void tradata()//一帧数据的翻译 即把时间记录转换成0/1
{
uchar i;
for(i=1;i<33;i++)//0的数据时间是num=4.4 1的数据时间是num=8.8
{ //记住要从rec[1]开始 因为rec[0]记录的是引导码的num值
if(rec[i]>6)//使用6做中间值 小于则为0 大于为1 用0/1替换rec中的数据 这样就进行了翻译
{ rec[i]='1'; }//因为要以字符串发送 所以这里用字符形式
else
rec[i]='0';
}
traflag=1;//翻译完成标记
}
/////////////////////////////发送数据函数////////////////////////////////////
void send()//把收到的数据发送给上位机 具体细节不懂看串口通信 mcu to pc
{
uchar i;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
for(i=25;i<33;i++)//选择要发送出去的数据 这里是从25开始发送的
{
SBUF=rec[i];
while(!TI);
TI=0;
}
sendok=1;
}
////////////////////////////////////////////////////////////////////////
void delay()//1ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void main()
{
timerinit();//定时器0初始化
ruptinit();//外部中断0初始化
while(1)
{
if(recok==1)//接收一帧数据完成
{
P2=0xfe;//灯亮一下 为了指示是否收到了数据
// P2^2=0xfe;//灯亮一下 为了指示是否收到了数据
tradata();//翻译数据
}
delay();
if(traflag==1)//翻译完成
{
send();//发送
}
delay();
if(sendok==1)//发送完成
{
flag=0;
traflag=0;
recok=0;
sendok=0;
P2=0xff;
timerinit();
ruptinit();
} //全部恢复初始
}
}
按遥控串口助手返回的HEX如下,每次按同样的键返回的数据都不同
4A 4A 4A 42 4A 4A
01 4A 4A 4A 44 FF 4A 4A 2A 84 6A 6A 86
FF 4A 4A 4A 8A 06 4A 4A 27 FF 6A CA FF
4A 42 4A 0B FF 4A 26 FF 42 0A FF 4B 4A 42 4A