找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

基于51单片机的空调红外解码程序

查看数: 6054 | 评论数: 10 | 收藏 7
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-6-4 20:43

正文摘要:

基于51单片机的红外解码程序   1602显示屏  可以显示8位16进制 38k的遥控都可以,制作万能遥控器的话这个程序可以起到作用 制作出来的实物图如下:

回复

ID:479579 发表于 2020-3-15 17:37
51_User 发表于 2019-6-20 20:13
感谢回复。
那我可能抓错了。
自己再研究一下。

中断程序如果执行周期过长,同时你进入中断后应该是关闭中断的。所以肯定会漏掉部分下降沿的。所以你那个方法在51单片机中无法实现。除非是有时钟频率更高的单片机来实现你的方法。
ID:398534 发表于 2019-6-20 20:13
感谢回复。
那我可能抓错了。
自己再研究一下。
ID:425846 发表于 2019-6-7 16:40
肯定会有33个下降沿啊
ID:73182 发表于 2019-6-5 14:01
感谢分享
ID:499469 发表于 2019-6-5 12:53
devcang 发表于 2019-6-4 23:02
还有一些是长度不同。

受教了 我是业余玩玩,40位还真闹不明白了 哈哈
ID:398534 发表于 2019-6-5 12:49
我是新手,正好在学习红外信号解码,遇到困难,望高手指教。
我想通过中断响应一次红外遥控器发出的一帧数据(有33个脉冲)的每个脉冲信号来启动定时器计算并保存脉冲信号的宽度来解码红外信号。
但是实际上一直不成功。
通过多次检查中间变量的值,发现一帧红外数据虽然有33个脉冲,但是实际上只会引起几次中断,并不是33此。
请问我原本希望一帧数据的33个脉冲都能引起中断响应的想法是错误的吗?实际上一帧数据会引起几次中断响应?
ID:398534 发表于 2019-6-5 12:40
本帖最后由 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;//下降沿触发
//中断设定结束*/
}

ID:277550 发表于 2019-6-4 23:05
这有一篇空调编码的,可以参考 https://my.oschina.net/u/1242247/blog/3052004
ID:277550 发表于 2019-6-4 23:02
还有一些是长度不同。


像格力的空调遥控器,是40位,各功能不同的拼合,每次都发送这40位。但起始码相似的


音响的也不同。
ID:499469 发表于 2019-6-4 20:46
按照 顺序显示 用户码 用户反码  数据码 和数据反码  ,空调遥控比较特殊,

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表