日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

433遥控器无线解码 1527中断方式解码 51单片机

發布時間:2023/12/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 433遥控器无线解码 1527中断方式解码 51单片机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

433遙控器無線解碼 1527中斷方式解碼 51單片機

這版為1527遙控器解碼,是為了項目洗臀器做遙控器控制。1527遙控器原理如下。

碼分別為:同步碼 地址碼20位 鍵碼4位(也可以同步碼16位 鍵碼八位)
本方法的核心思想先判斷同步碼是否接收成功,如果接收成功開始接收后面的24位數據并且存入三個字節當中,最后一個字節的后四位就是鍵碼,然后通過鍵碼的不同確定不同的功能。

本實驗所使用遙控器,因為遙控器發出波形時間會有誤差,所以下面都是大概值 程序中也會以范圍方式判斷。
每楨碼間隔時間為12MS (即同步碼)
同步碼:0.4MS+12MS
0:0.4MS+1.2MS 為0
1:1.2MS+0.4MS 為1
以下就是這次的代碼了

#include <stc15.h> #include <intrins.h>#define uchar unsigned char #define uint unsigned intsbit RF = P0^5; //信號輸入 sbit LED = P3^4; //sbit D0 = P3^6; //用于后面按位取鍵值 sbit D1 = P3^7; sbit D2 = P4^1; sbit D3 = P4^2; sbit VT = P3^5; //解碼成功bit decode_ok; //解碼成功標志 uchar hh_w,ll_w; //高低電平寬度 uchar ma_x; //接收到第幾位編碼 uchar bma1,bma2,bma3,bma4; //四個字節存放編碼 第一次的 uchar idata mmb1,mmb2,mmb3,mmb4; // 存放編碼 第二次 當兩次一樣才算一次有效按鍵bit rf_ok1,rf_ok2; //臨時成功接收標志 分別第一次和第二次 bit rf_ok; //接收成功 可以解碼 bit old_rc5; //接收到24為碼可以開始解碼 bit tb_ok; //同步碼接收成功標志uchar mma1,mma2,mma3,mma4; //四個字節用來存放編碼 uchar temp_h;temp_l; bit bt_auto; //自動設置遙控接收波特率標志 根據碼不同的長度做不同的波特率 uint s,s1;用于系統延遲 分別為留時間做第二次解碼 和 留時間實現功能 目的保證系統穩定性void timeint() interrupt 1 //定時器中斷{ if(!bt_auto) //{TL0=0x70; // 90TH0=0xfB; //fc 定時器100uselse{TL0=temp_l; // TH0=temp_h; }TF0=0; // if (!RF){ ll_w++;old_rc5=0; } //接收到低電平else // 接收到高電平{ hh_w++;if (!old_rc5) // 檢測到從低到高的跳變 表示接收到一個完整的(高-低)電平周期{ if (((hh_w>=2)&&(hh_w<=8))&&((ll_w>=50)&&(ll_w<=190))) // 滿足同步碼時長 H:0.4ms L:12ms{ if((ll_w>=110)&&(ll_w<=140)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=0;} //根據更精確的時長確定波特率和后面的定時器長度 保證精確else{ if((ll_w>140)&&(ll_w<=160)){ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfe;temp_l=0x6b; } else{ if((ll_w>160)&&(ll_w<=190)){ ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xfd;temp_l=0xdc; }else{ if((ll_w>70)&&(ll_w<=90)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x30; }else{if((ll_w>90)&&(ll_w<=110)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x00; }else{if((ll_w>=50)&&(ll_w<=70)){ma_x=0;tb_ok=1;bma1=0; bma2=0; bma3=0; bt_auto=1;temp_h=0xff;temp_l=0x7a; } }}} }} }else if ((tb_ok)&&((ll_w>=10)&&(ll_w<=14))) // 已經接收到同步碼 且下一個電平周期的低電平時長滿足H:0.4ms L:1.2ms 判0 { ma_x++; //取編碼的數量 達到24表示接收到一個完整的碼if(ma_x>23){if(!rf_ok1)第一次接收到{mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//將接收到的碼放入解碼寄存器 (第一次解碼的寄存器) rf_ok1=1; // 可以解碼tb_ok=0;bt_auto=0;s=1500; }else //第二次接收到{mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//將接收到的碼放入解碼寄存器 (第二次解碼的寄存器) rf_ok2=1; //可以解碼tb_ok=0;bt_auto=0; }}} else if ((tb_ok)&&((ll_w>=2)&&(ll_w<=8))) // 已經接收到同步碼 且下一個電平周期的低電平時長滿足H:1.2ms L:0.4ms 判1 { switch (ma_x) //判1 所以按位或等于取1{ case 0 : { bma1=bma1 | 0x80; break; }//遙控編碼第一位case 1 : { bma1=bma1 | 0x40; break; }case 2 : { bma1=bma1 | 0x20; break; }case 3 : { bma1=bma1 | 0x10; break; }case 4 : { bma1=bma1 | 0x08; break; }case 5 : { bma1=bma1 | 0x04; break; }case 6 : { bma1=bma1 | 0x02; break; }case 7 : { bma1=bma1 | 0x01; break; }case 8 : { bma2=bma2 | 0x80; break; }case 9 : { bma2=bma2 | 0x40; break; }case 10: { bma2=bma2 | 0x20; break; }case 11: { bma2=bma2 | 0x10; break; }case 12: { bma2=bma2 | 0x08; break; }case 13: { bma2=bma2 | 0x04; break; }case 14: { bma2=bma2 | 0x02; break; }case 15: { bma2=bma2 | 0x01; break; }case 16: { bma3=bma3 | 0x80; break; }case 17: { bma3=bma3 | 0x40; break; }case 18: { bma3=bma3 | 0x20; break; }case 19: { bma3=bma3 | 0x10; break; }case 20: { bma4=bma4 | 0x80; break; }//°′?ü×′ì?μú1??case 21: { bma4=bma4 | 0x40; break; }case 22: { bma4=bma4 | 0x20; break; }case 23: { bma4=bma4 | 0x10;if(!rf_ok1){ mma1=bma1;mma2=bma2;mma3=bma3;mma4=bma4;//將接收到的編碼復制到寄存器中 前面是最后一個鍵值為0 這里是最后一個鍵值為1 (為1的第一次用于解碼的寄存器) rf_ok1=1; // 可以解碼tb_ok=0;bt_auto=0;s=1500;break; }else{mmb1=bma1;mmb2=bma2;mmb3=bma3;mmb4=bma4;//將接收到的編碼復制到寄存器中 前面是最后一個鍵值為0 這里是最后一個鍵值為1 (為1的第二次用于解碼的寄存器)rf_ok2=1; // 可以解碼tb_ok=0;bt_auto=0;break; } }} ma_x++;}else {ma_x=0; tb_ok=0; bt_auto=0;bma1=0; bma2=0; bma3=0; bma4=0;hh_w=1;ll_w=0;} //沒有接收到同步碼ll_w=0;hh_w=1; } old_rc5=1; // 記錄本次電平}if(rf_ok1) //成功接收兩次編碼有效{s--;if(!s) rf_ok1=0;if(rf_ok2) {if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3)&&(mma4==mmb4))//兩次編碼相等 為有效{rf_ok=1; //解碼有效 接收成功的標志rf_ok1=0;rf_ok2=0; }else{rf_ok=0;rf_ok1=0;rf_ok2=0; } } }if((rf_ok)) //解碼有效 接收成功{ EA=0;rf_ok=0; D3=mma4 & 0x80; //取出鍵碼D2=mma4 & 0x40;D1=mma4 & 0x20;D0=mma4 & 0x10; // D4=mma4 & 0xC0;decode_ok=1;VT=0; s1=1500;EA=1;}if(decode_ok) //接收成功標志{s1--;if(!s1){VT=1;//接收成功亮燈decode_ok=0;//接收成功標志位置零 用于下一次} }}void system_start() //系統初始化 AUXR=0xb5; P0M0=0x01;P0M1=0x20;P3M0=0xC0;P3M1=0x00;P4M0=0x06;P4M1=0x00;P0=0xfe;P3=0x3f; //將LED燈拉低電平 判高電平亮P4=0xf9;TMOD = 0x11; //T1/T0改為定時器方式1TL0=0xb5;TH0=0xfb;ET0=1;TR0=1; EA=1; }void main() {system_start();while(1); } 這次有點累了 下次補查詢方式解碼 下次用2262來寫吧 有不明白的可以下面提出來

總結

以上是生活随笔為你收集整理的433遥控器无线解码 1527中断方式解码 51单片机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。