PT2264解码心得
PT2264解碼心得
最近閑暇時間在琢磨無線RF解碼程序,正好在數碼之家論壇中翻出大佬的解碼程序(http://bbs.mydigit.cn/read.php?tid=245739),于是乎,慢慢學習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 <STC15F2K60S2.H> //STC15F104W頭文件
3 #include <intrins.h> //左移右移函數頭文件
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
12 void Init()
13 {
14 TMOD = 0x01; //定時器T0,工作模式1,16位定時,不自動重裝,TL0、TH0全用
15 TR0=0; //(可位尋址)關閉定時器T0運行
16 // ET0=0; //(可位尋址)T0的溢出中斷允許控制位,ET0=1允許T0中斷; ET0=0禁止T0中斷;
17
18 EX1 =1; //允許外部中斷1中斷
19 IT1=0; //IT1=0 --上升沿和下降沿均可觸發中斷; IT1=1 ----下降沿觸發
20 EA=1; //(可位尋址)開啟總中斷
21
22 }
23
24 void main()
25 {
26 Init();
27 OK_LED=0;
28 D0=0;
29 D1=0;
30 D2=0;
31 D3=0;
32 while(1);
33 }
34
35 void ex0(void) interrupt 2 //外部中斷1入口函數
36 {
37
38
39
40 //PT2262發碼為窄高+寬低+窄高+寬低=0 /寬高+窄低+寬高+窄低=1 /窄高+寬低+寬高+窄低=F
41 //數值表示: 00 = 0 / 11 = 1 / 01 = F
42 //反碼表示: 11 = 0 / 00 = 1 / 10 = F(本例所用)
43 bit err = 0;
44 uchar I = 0; //用來記錄位數,正常會收到24位
45 uchar TL,TH; //用來記錄每位的低電平總時長
46 uchar MA1,MA2,MA3; //用來記錄地址碼(占16位)和鍵碼(占8位)(MA1、MA2、MA3各8個bit位)
47 uchar TimeCount;
48 uint L,M;
49
50
51 EX1 = 0; //暫停外部中斷
52 TR0 = 1; //啟動定時器計數器0
53 if(TimeCount > 0) //當按鍵按下釋放后該值不在賦值就同通過遞減直到該值等于0
54 {
55 TimeCount--; //等于0后表示按鍵釋放
56 }
57 while(WuXian_IN == 0); //如果為0一直等待,等待高電平出現
58 while(I < 24) //共接收24位
59 {
60 while(WuXian_IN == 0); //等待高電平到來
61 TL = TL0;
62 TH = TH0;
63 TH0 = TL0 = 0; //記錄低電平長度
64 L = TH;
65 L = ((L << 8) + TL); //將計時器的高低8位合并
66 if(I == 0) //處理同步位
67 {
68 if(L > 2360) //確認是引導頭(判斷同步位低電平時長31a)
69 {
70 M = L / 31; //M即4a亦即是窄電平的時長
71 }
72 else //不符合規則(出錯)
73 {
74 I = TR0 = TH0 = TL0 = 0;
75 err = 1;
76 break;
77 }
78 }
79 else
80 {
81 //短555 長1666
82 //4.7M的振蕩電阻時同步位的低電平時長為L=15378uS;即31a
83 //4.7M的振蕩電阻時窄電平時長為M=492uS;即4a
84 //4.7M的振蕩電阻時寬電平時長為1488uS即12a
85 //以下語句即判斷窄電平與寬電平的寬度是否合格
86 /*
87 窄電平時長為M即 M=4a;a為一個振蕩頻率, fosc=(2x1000x16/Rosc(KΩ))KHz,fosc單位為KHz, (Rosc為振蕩電阻,單位為KΩ),則一個振蕩周期T=1/fosc
88
89 例如常用振蕩電阻為4.7M;則振蕩頻率a=fosc=1/(2x1000x16/4700)=6.8KHz ,則振蕩周期T=1/6.8K=147uS,即窄電平M=a=4T=588us;則寬電平3xM=3a=1764us;
90
91 程序中窄電平的誤差范圍為正(M+M/4)負(M-M/4)一個振蕩周期a=M/4;
92
93 程序中寬電平的誤差范圍為正(M * 3 + M / 2)負(M * 3 - M / 2) 兩個振蕩周期2a=M/2;
94
95 */
96 if(((L < M - M / 4) && (L > M + M / 4)) || ((L < M * 3 - M / 2) && (L > M * 3 + M / 2))) //如果窄電平小于4a與大小4a或寬電平小于12a與大小12a則表示出錯
97 { //窄電平的誤差范圍為正(M+M/4)負(M-M/4)一個振蕩周期a=M/4;
98 I = TR0 = TH0 = TL0 = 0; //寬電平的誤差范圍為正(M * 3 + M / 2)負(M * 3 - M / 2) 兩個振蕩周期2a=M/2;
99 err = 1;
100 break;
101 }
102 }
103 while(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 { //窄電平的誤差范圍為正(M+M/4)負(M-M/4)一個振蕩周期a=M/4;
112 I++;
113 MA1 <<= 1; //本位置0
114 }
115 /*以下語句即判斷寬電平是否合格(4.7M的振蕩電阻時寬電平時長為1488uS即12a) */
116 else if(((L > (M * 3 - M / 2)) && (L < (M * 3 + M / 2))))////如果此時為12a則本位為1 長1488uS
117 { //寬電平的誤差范圍為正(M * 3 + M / 2)負(M * 3 - M / 2) 兩個振蕩周期2a=M/2;
118 I++;
119 MA1 <<= 1;
120 MA1++; //本位置1
121 }
122 else //已不是4a也不是12a則不符合規表示出錯
123 {
124 I = 0;
125 TR0 = TH0 = TL0 = 0;
126 err = 1;
127 break;
128 }
129 if(I == 8)
130 {
131 MA3 = MA1; //每二位對應PT2262的一個引腳,bit7/bit6二位對應PT2262的1腳,類推對應PT2262的1~4腳 / 11 = 接+ / 00 = 接地 / 01 = 懸空
132 //P1 = MA3; //送P1口顯示方便調試
133 }
134 if(I == 16)
135 {
136 MA2 = MA1; //每二位對應PT2262的一個引腳,bit7/bit6二位對應PT2262的5腳,類推
137 //對應PT2262的5~8腳 / 11 = 接+ / 00 = 接地 / 01 = 懸空
138 //P0 = MA2; //送P1口顯示方便調試
139 }
140 if(I == 24) //24位已收完則解碼結束
141 {
142 if(TimeCount == 0) //為0表示是新的一次按下對其進行處理,如過該值大于0表示已經按下不在處理
143 {
144 switch(MA1)
145 {
146 case 0xC0: //PT2262的10腳按鍵按下時
147 D0 = ~D0;
148 break;
149 case 0x30: //PT2262的11腳按鍵按下時
150 D1 = ~D1;
151 break;
152 case 0x0C: //PT2262的12腳按鍵按下時
153 D2 = ~D2;
154 break;
155 case 0x03: //PT2262的13腳按鍵按下時
156 D3 = ~D3;
157 break;
158 }
159 }
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 }
167
168
169 //void timer0(void) interrupt 1 //***********定時器T0中斷子函數**************
170 //{
171 //TH0=(65536-5000)/256;
172 //TL0=(65536-5000)%256;
173 // i++;
174 //}
總結
以上是生活随笔為你收集整理的PT2264解码心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flash怎么制作茶壶水壶
- 下一篇: 信用飞上征信吗2020