捕获格力、海尔空调遥控器协议
- 红外接收管工作时处于反接状态。没有红外光照射时,电流非常小,内阻很大,输出到单片机IO的口的电压约等于5V;被红外光照射时,电流加大,内阻变小,输出低电平。
- 捕获思路:定一个大数组,每当IO口产生跳变沿(上升沿或下降沿)将计时时间保存下来,同时启动下一次计时。一段时间后,将时间通过串口发送到电脑,显示
相邻两次跳变沿的时间就是高电平或低电平的时间。
3.用NXP K60,写代码捕获
uint32 high[1000]; //定时数据
uint32 count=0; //跳变沿个数
void PORTA_IRQHandler(void) //PORTA中断函数
{
PORTA->ISFR = 0xffffffff;//清除中断标志位
/*把时间保存到数组,定时时间=定时器计数值/总线时钟*/
high[count++]= (0xffffffff - PIT->CHANNEL[0].CVAL)/bus_clk_mhz;
pit_time_start(pit0); //启动下一次计时
}
int main(void)
{
int i,Double=0,effective=0;
gpio_init(E26,GPO,1);//LED指示灯
gpio_init(A19,GPO,1);//红外接收引脚
uart_init(uart4,115200);//串口初始化,波特率115200
pit_init_ms(pit0,1000);//设置定时1秒
port_init(A19,ALT1|PULLUP|IRQ_FALLING);//设置接收管引脚上升沿和下降沿产生中断
while(1)
{
gpio_set(E26,1); //先让指示灯灭
while(count<1); //等待第一个跳变沿
pit_time_start(pit0); //启动计时
gpio_set(E26,0); //指示灯亮
pit_delay_ms(pit2,500); //延时,等待跳变沿中断记录完成
printf("count:%lu\n\n",count);//显示总跳变沿个数
for(i=1;i<count;i++) //循环,显示计时数据
{
if(high[i]>5)//滤掉抖动
{
effective++; //计算有效的跳变沿个数
printf("%lu\n",high[i]);//显示微秒数(lu:无符号长整数)
if(++Double==2){printf("\n");Double=0;}//每隔两个数空出一行
if(high[i]>19000)printf("\n");//遇到连接码也空出一行
}
}
printf("effect:%d",effective/2);//编码数据长度=有效长度/2(高-低表示1位)
//为下一次测量清零
effective=0;
for(i=0;i<count;i++)
{
high[i]=0;
}
count=0;
pit_delay_ms(pit2,1500);
}
}
4.捕获结果:
海尔空调:制冷24°,自动风向,不扫风,开
每一段的第一行表示红外发射的时间,第二行表示不发射的时间。单位us
count:825
3130 //引导码
3004
3131 //引导码
4380
617
1601
617
481
617
1601
617
480
616
481
617
1601
617
1601
617
481
617
1601
617
481
617
481
617
481
616
482
617
481
616
481
616
482
617
1601
617
1601
617
1600
616
481
616
482
616
482
616
482
616
482
616
482
617
481
617
481
616
482
616
482
616
482
616
482
616
482
616
482
617
481
616
482
615
481
616
482
616
482
616
482
616
482
616
482
616
482
617
1601
616
481
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
481
616
482
616
482
616
482
616
482
616
482
616
482
616
1601
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
481
616
482
616
482
616
482
616
482
616
482
616
482
616
482
615
482
616
482
616
482
616
482
616
483
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
482
616
1601
616
482
616
1601
616
482
616
1601
615
481
616
482
616
1601
616
482
616
1602
616
1601
616 //结束码
40000
effect:114
格力空调:制冷16°,自动风速,左右扫风,开灯光和显示温度,开空调
count:547
//起始码
9070
4444
670
1627
671
515
671
516
671
1627
670
515
671
516
670
1627
671
515
670
516
670
516
670
516
669
516
669
517
669
517
668
517
669
517
669
517
669
516
669
517
669
517
669
516
669
1629
669
517
669
517
669
516
668
518
669
517
669
517
669
1628
669
517
669
1628
669
517
669
517
669
1628
669
517
//连接码
669
19980
669
1629
669
517
669
517
668
518
669
1629
668
517
669
517
669
517
669
1629
669
517
669
517
669
517
669
517
669
1628
668
517
668
517
669
517
669
518
669
517
669
517
669
517
669
517
668
518
669
518
669
517
669
517
669
517
669
517
669
517
668
1629
668
1629
669
517
//结束码
668
40012
effect:69