我这个红外解码程序无法实现按下遥控器1则小灯全亮,这个解码程序没问题,我用这个程序用uart通信发送能实现。但是实现小灯不行,而且用uart发送,设置的波特率不同,串口调试助手显示的也不同,用9600出现四个十六进制数,分别是用户吗,用户吗,数据吗和数据反码,但是用2400波特率时就出现一个十六进制,我和9600的对照了一下,没有相同的,这是为啥??我看有的程序例程里还要把数据吗加上0x37,0x30这样的东西,另外,红外遥控键值吗到底是怎么出来的,红外遥控键值吗是数据吗还是数据反码??问题 有点多,呵呵呵/*
* 红外接收数据,查询方式,并通过串口发送
*
* 晶振:11.0592M
*/
#include <reg52.h>
typedef unsigned char uint8;
sbit Ir_Pin = P3^2;
uint8 Ir_Buf[4]; //用于保存解码结果
unsigned int Ir_Get_Low()
{
TL0 = 0;
TH0 = 0;
TR0 = 1;
while (Ir_Pin ==0); //一直计到Ir_Pin不等0与计到大于1.085*32768=35553.28us
TR0 = 0;
return (TH0 * 256 + TL0);
}
/*
* 获取高电平时间
*/
unsigned int Ir_Get_High()
{
TL0 = 0;
TH0 = 0;
TR0 = 1;
while (Ir_Pin ==1);
TR0 = 0;
return (TH0 * 256 + TL0);
}
main()
{
unsigned int temp;
char i,j;
while (1)
{
start:
while (Ir_Pin);
temp = Ir_Get_Low();
if ((temp < 7833) || (temp > 8755)) //引导脉冲低电平8500~9500us
goto start;
temp = Ir_Get_High();
if ((temp < 3686) || (temp > 4608)) //引导脉冲高电平4000~5000us
goto start;
for (i=0; i<4; i++) //4个字节
{
for (j=0; j<8; j++) //每个字节8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
goto start;
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
goto start;
Ir_Buf[i] >>= 1;
if (temp > 1032) //1120us
Ir_Buf[i] |= 0x80;
}
}
if(Ir_Buf[2]!=~Ir_Buf[3])
{
return ;
}
else
{
if(Ir_Buf[2]==0x4f)//遥控器1的键值
P0=0x00;
}
}
}
|