你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

红外遥控键盘解码讲解

[复制链接]
MouseCat 发布时间:2015-2-14 10:09

首先需要知道基本的信号波形:引导码,数据(0,1),连击码,具体如下图:




一个定时器,每50uS中断一次,扫描高低电平进行记数,每次中断电平计数,如果电平发生变化,再检测是上升沿还是下降沿判断是否要处理,再搞一个状态记录当前是要解同步码还是数据码,因为它们的电平宽度不一样需要独立开来。懒得讲那么多,贴个代码看吧。


void IrFun (void)
{
    static unsigned char TimeL,TimeH;
    static bit IoState,UpState;
    static unsigned char RxData[4];
    static unsigned char BitCount,ByteCount;
    static unsigned char Task;
    unsigned char i;
    IoState =IR_IN;
    if(IoState){
        if(TimeH<250)TimeH++;
    }
    else{
        if(TimeL<250)TimeL++;
    }
    if((!IoState)&&(UpState)){
        if(Task==0){            //收同步头
            if((TimeL<=(180+30))&&(TimeL>=(180-30))&&(TimeH<=(87+10))&&(TimeH>=(43-10))){
                BitCount=0;
                ByteCount=0;
                if(LongKeyCount)LongKeyCount=3;
                Task++;
            }
        }
        else if(Task==1){       //收数据
            if((TimeL<=(12+5))&&(TimeL>=(12-5))){
                if((TimeH<=(12+5))&&(TimeH>=(12-5)))        RxData[ByteCount] &= ~(1<<BitCount);
                else if((TimeH<=(32+8))&&(TimeH>=(32-8)))   RxData[ByteCount] |= (1<<BitCount);
                else                                        Task=0;
                BitCount++;
                if(BitCount>=8){
                    BitCount=0;
                    ByteCount++;
                    if(ByteCount>=4){
                        ByteCount=0;
                        for(i=0;i<4;i++){
                            IrData[i]=RxData[i];
                            IrOkFlag=1;
                            Task=0;
                            IrTime=5;
                           
                            LongKeyCount=3; //长键采样
                        }
                    }
                }
            }
            else{
                Task=0;
            }
        }
        else{
            Task=0;
        }
        TimeH=0;
        TimeL=0;
    }
    UpState=IoState;
    if(Time1msCount<250)Time1msCount++;
    if(DelayTime)DelayTime--;
    return;
}

这上面是最简单的一种处理试,只处理了每次按键消息的第一次按键码,连击码及按键弹击需要另外加代码进行处理。

另外,这个处理方法是在定时器中开了50US的定时中断,会占用较大的系统时间。


00.png
01.png
收藏 1 评论18 发布时间:2015-2-14 10:09

举报

18个回答
MouseCat 回答时间:2015-2-14 10:10:30
https://www.stmcu.org.cn/module/forum/thread-600158-1-1.html
这个帖子里有之前共享的一些红外遥控资料,可以参阅!
dwwzl 回答时间:2015-2-14 10:46:26
不错啊,支持
deepin666 回答时间:2015-2-14 10:54:48
好资料,收藏了
759611 回答时间:2015-2-14 12:27:21
感谢分享不错!
数码小叶 回答时间:2015-2-14 12:30:22
谢谢分享
逍遥李 回答时间:2015-2-14 13:05:05
谢谢分享!
_ilikerome_ 回答时间:2015-2-14 16:28:56
学习一下,谢谢!
星辰一方 回答时间:2015-2-14 20:37:24
以前用avr搞过红外,感谢分享!
feel-376797 回答时间:2015-2-14 20:47:27
谢谢分享
12下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版