PT2264解碼心得

2022-09-01 20:30:15 字數 3624 閱讀 7925

pt2264解碼心得

最近閒暇時間在琢磨無線rf解碼程式,正好在數碼之家論壇中翻出大佬的解碼程式(於是乎,慢慢學習2264解碼程式,正好用上之前買的邏輯分析儀,帶看波形,帶看程式,琢磨了兩天,程式已可完美解碼,在此來總結下心得。        

一、管腳如下圖所示:

osc1和osc2為振盪電阻管腳,常用有4.7m、3.3m等,a0-a7位2264位址位管腳,可設定為懸空(f)、高(1)、低(0)三態;d0-d3為四位資料位;

振盪頻率 f=2x1000x16/rosc(kω) ,rosc為振盪電阻阻值,單位為kω;例:rosc=4.7mω;則,f=6.8khz,則振盪週期為trosc=1/f=147us;

二、pt2264編碼格式如下:

1.位值格式(1、0、f)(長脈衝(3a)是短脈衝(a)的3倍)

窄高+寬低+窄高+寬低=0        寬高+窄低+寬高+窄低=1             窄高+寬低+寬高+窄低=f

2.時序圖

同步碼低電平(l)是窄脈衝(a)的31倍,即,a=l/31

上圖中osc表示振盪電阻週期 trosc,則上圖時序t=2xtrosc

3.資料結構

三、解碼思路

1、首先識別出幀與幀,依據同步碼區分開來,同步碼低電平時長為31t;

2、再依據識別出的同步碼,判斷計算出窄電平時間t,則寬電平時間為3t;(判斷窄電平思路,窄電平的誤差範圍為正(t+t/4)負(t-t/4)乙個振盪週期a=t/4;寬電平的誤差範圍為正(t * 3 + t / 2)負(t * 3 - t / 2) 兩個振盪週期2a=t/2)

3.依據寬窄電平組合即可解出遙控器碼值。

四、程式如下所示,借鑑數碼之家各位大佬程式再結合自己理解

1

//自適應頻率的2262解碼** 晶振11.0592

2 #include //

stc15f104w標頭檔案

3 #include //

左移右移函式標頭檔案

4#define uchar unsigned char

5#define uint unsigned int

6 sbit wuxian_in =p3^3; //

外部中斷1,rf模組data訊號輸入管腳

7 sbit ok_led =p3^0; //

解碼成功

8 sbit d0=p3^1; //

資料位1000

9 sbit d1=p3^2; //

資料位0100

10 sbit d2=p3^4; //

資料位0010

11 sbit d3=p3^5; //

資料位0001

12void

init()

1323

24void

main()

2534

35void ex0(void) interrupt 2

//外部中斷1入口函式

36

57while(wuxian_in == 0); //

如果為0一直等待,等待高電平出現

58while(i < 24) //

共接收24位

5972

else

//不符合規則(出錯)

7378}79

else

80

102}

103while(wuxian_in == 1); //

等待低電平到來

104 th =th0;

105 tl =tl0;

106 th0 = tl0 = 0

;107 l =th;

108 l = ((l << 8) + tl); //

將計時器的高低8位合併

109/*

以下語句即判斷是窄電平是否合格(4.7m的振盪電阻時窄電平時長為492us即4a)

*/110

if(((l > (m - m / 4)) && (l < (m + m / 4))))//

如果此時為4a則本位為0 短492us

111

115/*

以下語句即判斷寬電平是否合格(4.7m的振盪電阻時寬電平時長為1488us即12a)

*/116

else

if(((l > (m * 3 - m / 2)) && (l < (m * 3 + m / 2))))///

/如果此時為12a則本位為1 長1488us

117

122else

//已不是4a也不是12a則不符合規表示出錯

123129

if(i == 8

)130

134if(i == 16

)135

140if(i == 24) //

24位已收完則解碼結束

141159

}160 ok_led = !ok_led; //

解碼正確後取反一次

161 timecount =20000; //

pt2262每按一次會發出4組相同的編碼防止按鍵沒放開直在取反,保證按1次只做1次處理

162}

163}

164 tr0 = th0 = tl0 = 0; //

關閉定時器t0,並重置th0、tl0

165 ex1 = 1; //

開啟外部中斷1

166}

167168

169//

void timer0(void) interrupt 1

//***********定時器t0中斷子函式**************

170//