搜索
bottom↓
回复: 6

哪位亲给个遥控器的C51解码程序?

[复制链接]

出0入0汤圆

发表于 2018-1-5 20:36:19 | 显示全部楼层 |阅读模式

分别对应从上到下为1,2,3,4号。
想弄个遥控车给孩子玩,以前用最下面的万能遥控器设置成康佳彩电模式成功地控制过STC的片子的小车玩过,但是现在遥控器貌似对码不成功了,现在也没有康佳的彩电了,大神给个程序能否解码上图的遥控器?按一下能出来一个编码,这样我就可以用这东东控制小车了。谢谢。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-1-5 20:44:12 来自手机 | 显示全部楼层
arduino 上有现成的硬体和软体,用IRRemote库

出0入0汤圆

 楼主| 发表于 2018-1-6 22:23:29 | 显示全部楼层
pisgah 发表于 2018-1-5 20:44
arduino 上有现成的硬体和软体,用IRRemote库

arduino跟51能一样吗?

出0入0汤圆

发表于 2018-1-6 23:30:43 | 显示全部楼层
gracialee 发表于 2018-1-6 22:23
arduino跟51能一样吗?

这是本坛的帖子,你参考看看

学习型红外遥控设计-基于STC51单片机

51串口红外遥控解码程序,小东西供大家学习一下!

出0入0汤圆

发表于 2018-1-10 13:11:25 | 显示全部楼层
有些遥控器可能是20位的,你要注意一下

出10入113汤圆

发表于 2018-1-10 13:47:30 | 显示全部楼层
红外遥控系统一般分发射和接收两个部分,发射部分的主要元件为红外发光二极管。目前大量使用的红外发光二极管发出的红外线波长为940mm左右,外形与普通φ5发光二极管相同。
接收部分的红外接收管是一种光敏二极管。红外发光二极管一般有圆形和方形两种。由于红外发光二极管的发射功率一般都较小(100mW左右),
所以红外接收二极管接收到的信号比较微弱,因此就要增加高增益放大电路。最近几年大多都采用成品红外接收头。
成品红外接收头的封装大致有两种:一种采用铁皮屏蔽;一种是塑料封装。均有三只引脚,即电源正(VDD)、电源负(GND)和数据输出(VO或OUT)。
红外接收头的引脚排列因型号不同而不尽相同,可参考厂家的使用说明。成品红外接收头的优点是不需要复杂的调试和外壳屏蔽,使用起来如同一只三极管,非常方便。
但在使用时注意成品红外接收头的载波频率。红外遥控常用的载波频率为38kHz,这是由发射端所使用455kHz晶振来决定的。在发射端要对晶振进行整数分频,
分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。也有一些遥控系统采用36 kHz、40 kHz、56 kHz等,由发射端晶振的振荡频率来决定。
红外遥控的特点是不影响周边环境的、不干扰其他电器设备。室内近距离(小于10米)遥控中得到了广泛的应用。
红外遥控在生产和生活中应用越来越广泛,不同的红外遥控芯片有不同的发码协议,但一般都是由引导码,系统码,键码三部分组成.
引导码是告诉接收机准备接收红外遥控码.系统码是识别码,不同的遥控芯片有不同的识别码,以免搞错.
遥控器上不同的按键有不同的键码,系统码和键码都是16位码,8位正码,8位反码.如SC6122的系统码是FF00,FF和00互为反码,键码1为EF10也是互为反码.

SC6122的引导码为低电平为9000微秒,高电平为4500微秒.当然高电平不可能精确为9000微秒,在8000微秒到10000微秒都看作是正常范围,低电平在4000-5000之间都看作是正常范围。

引导码后的32位编码(16位系统码和16位键码)不管高低电平,载波时间都是560微秒,但低电平持续时间是1125微秒,高电平持续时间是2250微秒,
所以低电平除去载波时间大约是560微秒,高电平除去载波时间大约是1680微秒.低电平也有一个波动范围,在400-700之间都看作是正常的,
具体多少可以通过示波器测量出来.高电平也有一个波动范围,在400-2000之间都看作是正常的,具体多少也是根据经验.当然范围越宽,捕捉红外线的范围也越宽,越精确。
在捕捉到有高低电平之间,在560-1680之间取一个中间值1120微秒,认为小于1120微秒是低电平,大于1120微秒是高电平.

以下程序能在LCD上显示系统码和键码,按不同的按键,系统码不变,变的是键码.

#include <reg52.h>

#define c(x) (x*110592/120000)

sbit Ir_Pin=P3^3;

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极数码显示码0-F.
unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7};

unsigned char Led_Buf[4]; //显示缓冲区
char Led_Index;           //位选         

unsigned char Ir_Buf[4];  //用于保存解码结果

//==============================================================
timer0() interrupt 1 using 1        //数码管扫描
{
        TL0=65536-1000;
        TH0=(65536-1000)/256;   //定时器0设定约1000us中断一次,用于数码管扫描
        P0=0xff;
        P2=Led_Sel[Led_Index];          //位选
        P0=Led_Tab[Led_Buf[Led_Index]]; //段选
        if(++Led_Index>3) Led_Index=0;  //四个扫描完了,到第一个数码管
}
//==============================================================
unsigned int Ir_Get_Low()
{
        TL1=0;
        TH1=0;
        TR1=1;
        while(!Ir_Pin && (TH1&0x80)==0);               
        TR1=0;           
        return TH1*256+TL1;
}
//=============================================================
unsigned int Ir_Get_High()
{
        TL1=0;
        TH1=0;
        TR1=1;
        while(Ir_Pin && (TH1&0x80)==0);
        TR1=0;
        return TH1*256+TL1;
}
//==============================================================
main()
{
        unsigned int temp;
        char i,j;
        Led_Index=1;

        TMOD=0x11;
        TL0=65536-1000;
        TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
        EA=1;
        ET0=1;
        TR0=1;

        Led_Buf[0]=0;
        Led_Buf[1]=0;
        Led_Buf[2]=0;
        Led_Buf[3]=0; //显示区设成0

        do
        {
                restart:
                while(Ir_Pin);
                temp=Ir_Get_Low();
                if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
                temp=Ir_Get_High();
                if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
                for(i=0;i<4;i++)         //4个字节
                        for(j=0;j<8;j++)         //每个字节8位
                        {
                                temp=Ir_Get_Low();
                                if(temp<c(200) || temp>c(800)) goto restart;
                                temp=Ir_Get_High();
                                if(temp<c(200) || temp>c(2000)) goto restart;
                                Ir_Buf[i]>>=1;
                                if(temp>c(1120)) Ir_Buf[i]|=0x80;
                        }
                Led_Buf[0]=Ir_Buf[2]&0xf;
                Led_Buf[1]=(Ir_Buf[2]/16)&0xf;
                Led_Buf[2]=Ir_Buf[3]&0xf;
                Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果
        }
        while(1);
}

出10入113汤圆

发表于 2018-1-10 13:48:27 | 显示全部楼层
这个是实际使用的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 13:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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