EXTI15_10_IRQHandler()
begin
pulse_time = 0
leader_code_flag = 0 /* 引导码标志位,当引导码出现时,表示一帧数据开始 */
irda_data = 0 /* 数据暂存位 */
while 1
if 红外接收头数据引脚的电平 == 高电平
//获取高电平时间
pulse_time = Get_Pulse_Time()
//>=50ms 不是有用信号 当出现干扰或者连发码时,也会break跳出while(1)循环
if( pulse_time >= 50ms
break;
//0.56ms:低电平0
if pulse_time > 0.2ms and pulse_time < 1ms
irda_data = 0
//1.68ms:高电平1
else if pulse_time > 1ms and pulse_time < 2ms
irda_data = 1
//4.5ms:前导位
else if pulse_time > 4ms and pulse_time < 4.5ms
leader_code_flag = 1
//2.1ms:连发码,在第二次中断出现,40ms:16位操作码后的高电平时间,位于重复码之前
else if (pulse_time > 2ms and pulse_time < 4ms) or (pulse_time > 36ms and pulse_time < 44ms)
frame_flag = 1; /* 一帧数据接收完成 */
frame_cnt++; /* 按键次数加1 */
break
//在第一次中断中完成
if leader_code_flag == 1
frame_data <<= 1
frame_data += irda_data
frame_cnt = 0
清除中断标志
end