久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6954|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 伊人精品久久久久77777 | 免费视频一区二区 | 久久综合香蕉 | 久久激情五月丁香伊人 | 日韩一区中文字幕 | 国产在线观看一区二区 | 亚洲成人精 | 一区二区三区在线 | 国产精品美女一区二区 | 国产精品国产精品国产专区不片 | 福利成人 | 91在线精品视频 | 国产区在线观看 | 手机三级电影 | 亚洲男人的天堂网站 | 亚洲男人的天堂网站 | 国产在线视频一区 | 国产探花在线观看视频 | 成人在线免费网站 | 日日精品 | 一级毛片在线播放 | 亚洲一区二区三区久久 | 婷婷成人在线 | 激情五月综合 | 久久国产视频网站 | 久草网在线视频 | 欧美成人精品一区 | 欧美视频日韩 | 日本网站免费在线观看 | 亚洲精品久久嫩草网站秘色 | 国产欧美精品一区二区 | 欧美专区在线 | 国产清纯白嫩初高生视频在线观看 | 精品福利一区二区三区 | 久草免费在线视频 | 久久久久久高潮国产精品视 | 中文字幕国产精品 | 一二三四在线视频观看社区 | www.天天干.com | 91文字幕巨乱亚洲香蕉 | 亚洲欧美aⅴ |