51_User 发表于 2019-6-20 20:13 中断程序如果执行周期过长,同时你进入中断后应该是关闭中断的。所以肯定会漏掉部分下降沿的。所以你那个方法在51单片机中无法实现。除非是有时钟频率更高的单片机来实现你的方法。 |
|
感谢回复。 那我可能抓错了。 自己再研究一下。 |
| 肯定会有33个下降沿啊 |
| 感谢分享 |
devcang 发表于 2019-6-4 23:02 受教了 我是业余玩玩,40位还真闹不明白了 哈哈 |
|
我是新手,正好在学习红外信号解码,遇到困难,望高手指教。 我想通过中断响应一次红外遥控器发出的一帧数据(有33个脉冲)的每个脉冲信号来启动定时器计算并保存脉冲信号的宽度来解码红外信号。 但是实际上一直不成功。 通过多次检查中间变量的值,发现一帧红外数据虽然有33个脉冲,但是实际上只会引起几次中断,并不是33此。 请问我原本希望一帧数据的33个脉冲都能引起中断响应的想法是错误的吗?实际上一帧数据会引起几次中断响应? |
|
本帖最后由 51_User 于 2019-6-5 14:20 编辑 我是新手,正好在学习红外解码,遇到困难,望指教。 我采用P32口中断和定时器方式接收解码红外信号,想法是中断为低电平跳边沿方式,红外遥控器按下一个按键后,发出的一帧数据里的每个脉冲都能引起中断响应,在中断响应程序里保存通过定时器计算出的前后两个低电平脉冲之间的时间,用于解码。 实际上运行程序,无法解码。 经过多次测试后,发现好像单片机的中断无法对红外遥控器发出的一帧数据里的每个脉冲都响应,实际上似乎只响应数次(原本以为33个脉冲,应该会有33次中断响应)。 请问我对红外信号的中断响应的理解是不是错了。 附上中断程序和定时器源码,请帮忙分析指教。 void Infraredrevive() interrupt 0 { if (timercounter>31 && timercounter<50)//判断是否为NEC编码引导码 { //计算引导码接收次数13500x11.592/12/256=48,识别引导码的定时器计数为48次 //识别引导码丢掉,不保存 count_i=0;//数组下标清零,准备保存脉冲时间 } if(newpulse_flag==1) //下一个pulse来临,保存两个跳低电平pulse之间的计时器时间倍数 { timerArray[count_i]=timercounter; count_i=count_i+1; }else { newpulse_flag=1;//下一个pulse来临标志,也是为了识别第一个pulse的开始 } if (count_i==32)//33个脉冲信号,丢掉引导码,共32个信号 { decode_pulse();//33个脉冲信号接收结束,调用解码函数 count_i=0; } timercounter=0;//timer时间倍数清零,用于下一个计数 } void timer0() interrupt 1//定时器中断一次256x12/1105920秒 { timercounter++; } void IRinitial()//中断设定初始化 { ///*中断设定开始 EA=1;//中断总开关 // IE0=0;// EX0=1;//外部中断0 ET0=1;//定时器T0 TR0=1;//启动T0定时器,后面需要放在中断程序里嵌套使用定时器 ,清零 // TF0=0;//为timer溢出标志位,用于判断 TMOD=0x02;//设置定时器t0为8位模式,自動裝入 TH0=0;//196;//重装数据,为了精确时间,每次跳12/11059200秒 TL0=0;//196;//初始值 IT0=1;//下降沿触发 //中断设定结束*/ } |
| 这有一篇空调编码的,可以参考 https://my.oschina.net/u/1242247/blog/3052004 |
|
还有一些是长度不同。 像格力的空调遥控器,是40位,各功能不同的拼合,每次都发送这40位。但起始码相似的 音响的也不同。 |
| 按照 顺序显示 用户码 用户反码 数据码 和数据反码 ,空调遥控比较特殊, |