一体化接收头是不是接收数据以后会将数据反向?也就是说0的高电平持续时间长,而1的高电平持续时间变为短,还有就是,接收到的数据分哪几部分,是不是先是引导码,然后数据,最后停止码,结束码是啥?是不是也就是停止?如果一直按着按键数据会怎样?如何检测按键抬起,菜鸟求解,
先自己研究研究吧,时间很关键的
/******************************************/
/*红外遥控解码程序 */
/******************************************/
#include
/******************************************/
/*端口定义 */
/******************************************/
sbit p32=P3 ^ 2;
/******************************************/
/*定时器1初始化 */
/******************************************/
void T1_INIT()
{
TMOD |= 0X10;
}
/******************************************/
/*稍小于9ms延时 */
/******************************************/
void delay9ms()
{
TH1 = (65535 - 8700) >> 8;
TL1 = (65535 - 8700) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*稍大于4.5ms延时,与9ms相加稍大于13.5ms */
/******************************************/
void delay5ms()
{
TH1 = (65535 - 5000) >> 8;
TL1 = (65535 - 5000) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*1ms延时 */
/******************************************/
void delay1ms()
{
TH1 = (65535 - 1000) >> 8;
TL1 = (65535 - 1000) & 0XFF;
TF1 = 0;
TR1 = 1;
while(!TF1); //等待延时完毕
}
/******************************************/
/*外部中断0初始化 */
/******************************************/
void IT0_INIT()
{
IT0 = 1; //外中断0,下降沿触发
EX0 = 1; //允许外中断0,外部中断0接收数据
}
/******************************************/
/*外部中断0处理程序 */
/******************************************/
void IT0_ISR() interrupt 0 using 2
{
unsigned char a,b;
unsigned char table[4] = {0,0,0,0};
EX0 = 0; //关外中断0,开始解码
delay9ms();
if(p32) //9ms内出现高电平,干扰信号
goto end;
if(!p32) //9ms内一直为低电平,执行解码
{
delay5ms(); //再延时5ms与9ms相加,跳过引导码,下一步解用户码及数据码
for(a=0;a<4;a++)
{ for(b=0;b<8;b++)
{
while(!p32); //等待高电平到来
delay1ms(); //延时1ms(时间在0.56ms和1.69ms)之间即可,判断是0还是1
if(p32) //为1
{
table[a] >>= 1; //写1
table[a] |= 0x80;
delay1ms(); //延时1ms,等待高电平结束
}
else //为0
{
table[a] >>= 1; //写0
table[a] |= 0x00;
}
}
}
IR_DATA = table[3]; //提取最后一字节作为按键区分标志
}
end: EX0 = 1; //解码结束,开外中断0
}