找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6299|回复: 7
打印 上一主题 下一主题
收起左侧

关于单片机解码433M/315M摇控器程序

  [复制链接]
跳转到指定楼层
楼主
ID:301968 发表于 2021-6-12 12:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近需要使用的一个16按键433M摇控器方案,一时没有找到好的程序参考,于是自已设计了一个程序使用,效果很好。设计思想,首先通过示波器抓出接收板数据波形,分析波形特征。一般都是首先同步信号出现,约10MS左右低电平,之后跟着出现数据信号,一般来讲是地址+数据,其实我们不用管,只要程序能分析出同步信号之间的数据就行。数据0=0.4ms高电平+1.2ms低电平的组合,数据1=1.2ms高电平+0.4ms低电平的组合,数据25位。我们定义一个32位的变量,将数据一位一位的移进变量中,最后得出变量值,于是解码成功。连续解码出5组数据进行对比,如其中有2组以上的码相同,则认为相同的数据解码正确。解程序使用0.1mS定时器中断,用来检测数据电平。详见程序:

bit F_TongBu_Flag=0;  //低电平同步头标志
u8 Da_cont_HV=0;    //高电平计数
u8 Da_cont_LV=0;    //低电平计数
u8 MoveBit=0;              //移位
bit starLVFlag=0; //高电平开始后才能使用的低电平检测标志
u32 xdata DataBuf[5]={0};   //临时保存25位数据区
u32 xdata T433M_data=0x00000000;
u32 xdata T433M_Tem=0;

void Init433M();  //初始化433M接收设置数据

void Timer0Init(void)                //100微秒@24.000MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xA0;                //设置定时初值
        TH0 = 0xF6;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0=1;                             //打开中断
        IP|=0X02; IPH|=0X02;  //最高优先级
}



void TM0_Isr() interrupt 1        //定时器0中断函数0.1mS
{
        if(!T_433M&&!F_TongBu_Flag)      //  数据脚低电平&&未检测到同步
        {
                Da_cont_LV++; //开始计数,0.1ms累加
                if(Da_cont_LV>80) //大于8ms
                {
                        F_TongBu_Flag=1;  //周步标志有效
                //        printf("0X%lX.\r\n",T433M_data);
                        Init433M();  //初始化433M接收设置数据                    
                }
        }
        else
        {
                Da_cont_LV=0;
        }

                if(F_TongBu_Flag)  //同步标志有效且高电平
                        {
                                if(T_433M)   //同步标志有效且高电平
                                {
                                        starLVFlag=1;   //高电平开始后才能使用的低电平检测标志
                                        Da_cont_HV++;         //高电平计数
                                        if(Da_cont_HV>=250)  //电平计数异常,一般不会有这种情况
                                        {
                                                F_TongBu_Flag=0; Da_cont_HV=0; Da_cont_LV=0;  return; //返回
                                        }
                                }
                                else
                                {
                                        if(starLVFlag)  //当高电平过后的低电平时,开始判断高电平的宽度
                                        {
                                                starLVFlag=0;  
                                                if(Da_cont_HV>2&&Da_cont_HV<8) //如果高电平大于0.2小于0.6ms,
                                                {                                
                                                       T433M_Tem=0;
                                                        T433M_data|=T433M_Tem<<MoveBit;
                                                        if(MoveBit>0)
                                                                { MoveBit--;}
                                                        else
                                                        {F_TongBu_Flag=0;}
                                                               
                                                }
                                                else
                                                {
                                                        if(Da_cont_HV>8&&Da_cont_HV<18)
                                                        {
                                                                T433M_Tem=1;                                                               
                                                                T433M_data|=T433M_Tem<<MoveBit;
                                                                if(MoveBit>0)
                                                                 { MoveBit--;}
                                                         else
                                                                { F_TongBu_Flag=0;}
                                                        }
                                                        else
                                                        {
                                                             F_TongBu_Flag=0;Da_cont_LV=0;  //周步标志有效
                                                        }
                                                }
                                                
                                                Da_cont_HV=0;         //判断完后高电平计数复位
                                        }
                                }
                        }
}
        

/*100US中断,测量同步低电平连续约12mS,0数据为H:0.44ms+L:1.32ms,1数据为H:1.32ms+L:0.44mm,一串25位。
解码编程:首先检测同步头,>连续200次低电平,同步头出现,进入第一个高电平时间检测,若高电平检测次数
大于6,小于9,为0数据,若大于20小于26,为高。继续检测下一个高电平,如连续30个低电平,结束检测,重新检测同步头
在500MS内,进行一次数据比对,当有两组数据为相同时,可得出这个数据为一组正确的数据。
*/

void Init433M()  //初始化433M接收设置数据
{
                MoveBit=30;          //移位设置
                T433M_data=0x00000000; //数据复位
                T433M_Tem=0;
          Da_cont_HV=0;
          Da_cont_LV=0;
          starLVFlag=0;
          //高电平开始后才能使用的低电平检测标志
}




评分

参与人数 2黑币 +102 收起 理由
AAA_MCU + 12 很给力!
admin + 90 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏17 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:230742 发表于 2021-6-18 02:02 | 只看该作者
完整的工程文件打包上来就100黑币了。感谢分享。
回复

使用道具 举报

板凳
ID:23844 发表于 2021-6-18 08:05 | 只看该作者
啤酒瓶子老大 发表于 2021-6-18 02:02
完整的工程文件打包上来就100黑币了。感谢分享。

强烈支持上完整工程拿100黑币
回复

使用道具 举报

地板
ID:368534 发表于 2021-8-13 10:29 | 只看该作者
用定时器的门控计数功能配合外中断,解码方案是最佳的,门控端口刚好就是外中断口,51版本的解码,这个方案是最方便,代码量很少也很好理解,对于GD32系列,则用定时器的捕获功能,也很方便。
回复

使用道具 举报

5#
ID:970121 发表于 2021-10-21 11:22 | 只看该作者
xdqfc 发表于 2021-8-13 10:29
用定时器的门控计数功能配合外中断,解码方案是最佳的,门控端口刚好就是外中断口,51版本的解码,这个方案 ...

大师,有例子共享下吗?新手想学习下!
回复

使用道具 举报

6#
ID:543255 发表于 2021-12-24 08:02 | 只看该作者
本帖最后由 踮起脚摘苹果 于 2021-12-27 15:34 编辑

这个检测同步时长的思路不错,但为什么MobeBit的移位是30位而不是25位呢 ?
回复

使用道具 举报

7#
ID:390416 发表于 2022-11-25 23:11 | 只看该作者
T433M_Tem=0;
T433M_data|=T433M_Tem<<MoveBit;
实测 判断数据0 的时候,这两行可以删除,只需保留 MoveBit的代码即可
回复

使用道具 举报

8#
ID:303010 发表于 2023-4-15 09:54 | 只看该作者
这个对简单的51单片机很适用,包头包尾的实时检测,和红外遥控器的解码过程差不多
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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