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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

PT2264解码心得

發布時間:2023/12/24 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 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解码心得的全部內容,希望文章能夠幫你解決所遇到的問題。

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