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

红外遥控键盘解码讲解

[复制链接]
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-15 09:26:34
本帖最后由 MouseCat 于 2015-2-15 09:29 编辑
zministaryfw 发表于 2015-2-15 09:18
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个 ...

同一系列是通用的,你看一下发射头的载波频率,接收头跟发射头的载滤频率一样就行;应该说跟信号没关系,只跟载波有关系,然后只要注意解码了,有挺多种编码的,对应起来就行了,不过这个是软件上的功能了。
有36K 38K 40K 56K,
好像38K的比较通用

0000000000.png
MouseCat 回答时间:2015-2-15 09:28:10
zministaryfw 发表于 2015-2-15 09:18
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个 ...

我这边上传一份接收头的DATASHEET。你参考下

IRM-3638T.pdf

下载

260.68 KB, 下载次数: 2

zministaryfw 回答时间:2015-2-15 09:18:43
谢谢,楼主分享。不够我想问一下, 对应不同的红外发射器的信号,是不是可以通用以红外接收头?还是说一个红外发射头,必须有一个与他对应的红外接收头?
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
感谢分享不错!
wyxy163@126.com 回答时间: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
谢谢分享
lkl0305 回答时间:2015-2-14 21:33:15
多谢分享,学习下
MouseCat 回答时间:2015-2-15 09:05:10
这个只用了定时器的资源,每间隔50US就去扫一次,比较占CPU,另外一种就是得用IO中断和定时器,这种能够释放一些CPU。
12下一页

所属标签

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