51單片機程序設計:[12]模擬PT2272無線解碼?

該經驗介紹如何使用單片機模擬PT2272進行315M無線模塊的解碼。對於無線控制窗簾等項目有借鑑意義。

工具/原料

51單片機開發板

Keil C IDE開發環境

315M發射模塊和接收模塊

方法/步驟

硬件實物圖下圖:

通過原理圖可以見,無線模塊的數據端連接在P32引腳上。

可以根據需求,修改該引腳。

51單片機程序設計:[12]模擬PT2272無線解碼

51單片機程序設計:[12]模擬PT2272無線解碼

51單片機程序設計:[12]模擬PT2272無線解碼

具體代碼如下:

//因為他的格式是00表示"0"11表示"1"01表示"F"所以我們要把12位乘以2等於24位剛好是3個字節//第一二個字節是地址碼,第三個字節是數據碼//發射芯片採用的是PT2262芯片用4.7M的震盪電阻315M發射//遙控我們全部默認地址碼是 FFFFFFFF 單片機解碼出來就是0x55 0x55//遙控處理函數

51單片機程序設計:[12]模擬PT2272無線解碼

51單片機程序設計:[12]模擬PT2272無線解碼

51單片機程序設計:[12]模擬PT2272無線解碼

51單片機程序設計:[12]模擬PT2272無線解碼

可以複製的源代碼如下:

/************************************************ ; 跳線設置:默認跳線位 ; 晶振:12MHz ; 注意:斷電後將接受模塊插入板子WX口,切記方向不能錯誤,看圖片目錄有圖 ; 接受模塊有元件的這面朝9針串口插座,在接受模塊的天線孔 ; 接上24cm長的普通導線能增加控制距離 ; 效果:按手持式4鍵發射器上的任意按鍵,程序能解碼出來,並在發光管上顯示 ;======= 模擬 pt2272 接收=========================************************************************/

#include"AT89x52.h"//#include"global.h"#include"intrins.h"#include"51hei.H"

#define uchar unsigned char#define uint unsigned int

uchar Rem_Code[3];uint TimeCount;sbit Get_Rem=P3^2;

void delay8(uint t){while(--t);}

void Delay100us(void){delay8(13); //8-18}

//因為他的格式是00表示"0"11表示"1"01表示"F"所以我們要把12位乘以2等於24位剛好是3個字節//第一二個字節是地址碼,第三個字節是數據碼//發射芯片採用的是PT2262芯片用4.7M的震盪電阻315M發射//遙控我們全部默認地址碼是 FFFFFFFF 單片機解碼出來就是0x55 0x55//遙控處理函數void Remote_Process(void){ uchar i,j,Count=0; Delay100us(); if(TimeCount>0)//當按鍵按下釋放後該值不在賦值就同通過遞減直到該值等於0 {//等於0後表示按鍵釋放 TimeCount--; } if(Get_Rem==0)//如果有低電平就進入解碼 { for(Count=0;Count<100;Count++)//判斷12毫秒左右的引導碼 { Delay100us();//100us*100=10ms if(Get_Rem==1)//如果在延時10毫秒期間有高電平出現就是干擾信號退出解碼 { return; } } while(Get_Rem==0);//等待低電平結束 for(j=0;j<3;j++)//8位地址碼加4位數據碼 { for(i=0;i<8;i++) { Count=0; do { Delay100us(); Count++; if(Count>20)//如果在大於2毫秒高電平還沒有結束認為是干擾退出解碼 {//理論上是1.2毫秒,我們2毫秒留有餘量,防止遙控批量中的誤差 return; } }while(Get_Rem==1);//計算高平時間並等待結束 Count=0; do { Delay100us(); Count++; if(Count>20)//如果在大於2毫秒低平還沒有結束認為是干擾退出解碼 { return; } }while(Get_Rem==0);//計算低電平時間並等待結束 Rem_Code[j]<<=1;//數據從高位開始接收所以每次向左移一位 if(Count<8)//如果低電平時間小於800毫秒認為該位為1 { Rem_Code[j]++; } } } ACC=Rem_Code[2]; if(ACC==0xc0) P0=0xef; if(ACC==0x30) P0=0xdf; if(ACC==0x0c) P0=0xbf; if(ACC==0x03) P0=0x7f;

if(TimeCount==0)//為0表示是新的一次按下對其進行處理 { } TimeCount=1000;//按鍵按下標誌 }}

void main(){AUXR=0x01;P1_4=0;guandz();guanled();

while(1) { Remote_Process();//遙控處理 }

}

模塊, 單片機, 點陣, 程序設計,
相關問題答案