久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11988|回復: 12
收起左側

基于51單片機驅動PT2262+DA1527收發解碼C語言程序

  [復制鏈接]
ID:50658 發表于 2013-6-7 22:47 | 顯示全部樓層 |閱讀模式
本帖最后由 hurong 于 2013-6-7 22:51 編輯

    2262+1527解碼,da1527[0][0],da1527[0][1],da1527[0][2]存地址,key_d存按鍵值;未學習,led慢閃;按3S按鍵進入學習,LED常亮,學習成功后閃兩下,后LED再常亮,進入下一個搖控器的學習, 如此循環,過程中再短按一下按鍵,LED滅,退出學習;長按8S清除學習過的內容,3S時燈亮,8時燈滅再閃7下;短按IO口致反。 兩種方式退出學習:1、學習過程中,短按按鍵;2、學習過程中,不進行任何操作,10S自動退出學習。STC_11xx.H根據自己單片機型號選擇!STC15F104e
  1. //RF_IN_OUT.H頭文件


  2. #define MAIN_Fosc5529000//定義主時鐘, 模擬串口和紅外接收會自動適應。5~36MHZ

  3. #define T0_YS           50   //t0定時時間50MS

  4. sbit led=P3^4;

  5. sbit P_TXD1 = P3^1;//定義模擬串口發送腳,打印信息用

  6. sbit p_rxd=P3^4;      //定義模擬串口接收腳

  7. sbit RFIN = P3^5;           //RF接收腳

  8. sbit out22=P3^3;            //RF發射腳

  9. sbit k1=P3^0;

  10. //----------------------------------------------------------------------

  11. voidPrintString(unsigned char code *puts);

  12. voidsend_char(uchar dat);//9600,N,8,1發送一個字節

  13. voidBitTime(void);

  14. uchar uart_rx_da[10];uchar rx_da_num=0;// 串口接收數據緩存

  15. led_ss(uchar h){uchar y;TR0=0;for(y=0;y<h;y++){led=0;delays(8);led=1;delays(8);}TR0=1;}//在這里只能用TR0=0,不能用EA=0,不然會多收到一個OXFF;

  16. //***********************************************************

  17. void TIME0_INT() interrupt 1 using 0  //time0中斷程序,模擬外中斷,用于串口接收

  18. {

  19. uchar ii,u,tem;

  20. BitTime();                   //開始信號

  21. for(ii=0;ii<8;ii++)

  22. {

  23. if(p_rxd==0)

  24. {

  25.   tem&=(~(1<<ii));                    

  26. }

  27. else if(p_rxd==1)

  28. {

  29.   tem|=(1<<ii);                  

  30. }

  31.   BitTime();         

  32. }

  33. BitTime();  //停止脈沖

  34. for (u=10;u>1;u--)uart_rx_da[u-1]=uart_rx_da[u-2];  //已收到的數據后移

  35. uart_rx_da[0]=tem;                                 //新數據始終放在最前面   

  36. rx_da_num++;            

  37.    TH0=0XFF;TL0=0XFF;

  38. }

  39. //***********************************************************

  40. /********************** 模擬串口相關函數************************/

  41. voidBitTime(void)//位時間函數

  42. {

  43. uint i;

  44. i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;//根據主時鐘來計算位時間

  45. while(--i);

  46. }

  47. //模擬串口發送

  48. void send_char(uchar dat)//9600,N,8,1發送一個字節

  49. {

  50. uchari;

  51. EA = 0;

  52. P_TXD1 = 0;

  53. BitTime();

  54. for(i=0; i<8; i++)

  55. {

  56. if(dat & 1)P_TXD1 = 1;

  57. elseP_TXD1 = 0;

  58. dat >>= 1;

  59. BitTime();

  60. }

  61. P_TXD1 = 1;

  62. EA = 1;

  63. BitTime();

  64. BitTime();

  65. }

  66. void send_str(unsigned char code *puts)//發送一串字符串

  67. {

  68. for (; *puts != 0;puts++)  send_char(*puts); //遇到停止符0結束

  69. }

  70. //************************************************************************

  71. //IO.H頭文件


  72. uchar rf_en=0;

  73. bit jmnx=0;  //為0是2262,1是1527

  74. uchar da1527[2][3],key_d;

  75. uchar short_k=0;     //短脈沖脈部寬度,在發射前可用此數據初始成與接收相同脈沖寬度

  76. void RF_IN()

  77. {

  78. uchar ii=0,j=0,k=0,rep=0;

  79. uint head_k=0;           //短脈沖及頭脈沖寬度   

  80. if(rf_en==0)

  81. {

  82. //-------------------------------數據接收-----------------------------------------

  83. short_k=0;while(RFIN && j<250) {delay(1);short_k++;} //檢測信號前一個高脈沖的寬度

  84. while(!RFIN) {delay(1);head_k++;} //檢測頭信號的寬度

  85. if(((short_k*24)<head_k) && (head_k<(short_k*38)))   //頭信號的寬度是短脈沖的32倍

  86. {

  87. for(rep=0;rep<2;rep++)

  88.   {  

  89.     for(ii=0;ii<3;ii++)//3字節

  90.             {

  91.           for(k=0;k<8;k++)//每個字節8位

  92.              {         

  93.    j=0;while(RFIN && j<245) {delay(1);j++;}//  16us(6mhz:2~5)

  94.              if(j>(short_k-short_k/2-short_k/3)&&j<(short_k*1.96)) da1527[rep][ii]&=~(1<<((7-k)));

  95.                else if(j>(short_k*1.96)&&j<(short_k*5))da1527[rep][ii]|=(1<<(7-k)); //%25 長脈沖的寬度是短脈沖的3倍        

  96.                        else {rf_en=0;return;}          //亂碼退出

  97.              j=0;while(!RFIN && j<150){delay(2);j++;}      //跳過低電平           

  98. }

  99.         }//for(ii=0;ii<12;ii++)  

  100.   j=0;while(RFIN && (j<200)){delay(1);j++;}            //跳個最后一個高脈沖

  101.       head_k=0;while(!RFIN) {delay(1);head_k++;} //檢測下一個前導信號的寬度  

  102.       if((head_k<(short_k*26)) || (head_k>(short_k*38)))  {rf_en=0;return;} //頭信號的寬度是短脈沖的32倍  //亂碼退出

  103.   }

  104. //+++++++++++++++++++++++++2262與1527數據分離處理++++++++++++++++++++++++++++++++++++++++   

  105. if((da1527[0][0]==da1527[1][0]) && (da1527[0][1]==da1527[1][1]) && (da1527[0][2]==da1527[1][2]))//兩次接收到的數據相同,就執行

  106.              {

  107. uchar u,i;   

  108. for(i=0;i<3;i++)  //判定2262與1527

  109. {

  110.   for(u=0;u<4;u++) {if(((da1527[0][i]>>(u*2)) & 3)==2) {i=80;break;}}  //有10則為1527

  111.   if(i==80) break;

  112. }

  113. if(i==80)  //1527

  114. {

  115. key_d=da1527[1][2] & 0x0f;         //分出1527的按鍵值

  116. da1527[0][2]=da1527[1][2]>>4; //分出1527的后4位地址

  117. jmnx=1;         //為0是2262,1是1527

  118. }

  119. else      //2262

  120. {

  121. key_d=0;

  122. for(i=0;i<4;i++){if(((da1527[0][2]>>(i*2))&3)==3) key_d|=1<<i;}   //計算出2262的按鍵數據                                 

  123. da1527[0][2]=00; //2262無后4位地址,全為0

  124. jmnx=0;         //為0是2262,1是1527

  125. }   

  126. rf_en=4;               

  127. }

  128. }      

  129. }//if(rf_en==0)

  130. }

  131. //^^^^^^^^^^^^rf接收END^^^^^^^

  132. //*******************rf發射********

  133. ////uchar wid發射脈沖寬度,//

  134. //發送8次數據的時間為120ms.=(0.96+0.34)*12*8

  135. //dat1,dat2,dat3為2262與1527地址,dat4為按鍵值,wid為發射脈沖的寬度一般為60

  136. //****************************************************************8

  137. out0();//發射0

  138. out1();//發射1  

  139. uchar short_width=60;     //初始發射的短脈沖寬度

  140. send_bat(uchar dat);

  141. send_rf(uchar dat1,uchar dat2,uchar dat3,uchar dat4,uchar wid)//1527編碼發射

  142. {

  143. unsigned char dd,b;

  144. EA=0;short_width=wid;

  145. // ---------------------2262與1527自動按鍵值處理-------------------------------------

  146. for(b=0;b<4;b++){if(((dat1>>(b*2)) & 3)==2) {b=80;break;}}  //有10則為1527

  147. if(b!=80)for(b=0;b<4;b++){if(((dat2>>(b*2)) & 3)==2) {b=80;break;}}  //有10則為1527

  148. if(b!=80)for(b=0;b<2;b++){if((((dat3)>>(b*2)) & 3)==2) {b=80;break;}}  //有10則為1527

  149. if(b==80) dat3=dat3*16+dat4;  //1527

  150. else  //2262

  151. {

  152. dd=0;

  153. for (b=0;b<4;b++) if((dat4>>b)&1==1)dd|=3<<(b*2);  //還原按鍵值的2262編碼

  154. dat3=dd;

  155. }      

  156. //------------------------------------------------------------------------------------     

  157. for(dd=0;dd<8;dd++)         //發送相同的8組碼

  158.    {

  159. send_bat(dat1);send_bat(dat2);send_bat(dat3);

  160. out22=1;delay(short_width); out22=0;delay(short_width*32);//這幾句是發射結束碼及頭信號           

  161.    }

  162. EA=1;

  163. }

  164. send_bat(uchar dat)

  165. {

  166.   uchar a;

  167.   for (a=0;a<8;a++)//發送一個字節數據

  168.     {

  169.   if((dat>>(7-a))&1==1)out1();

  170.   else out0();

  171. }

  172. }

  173. out0()//發射0  

  174.   {

  175. out22=1;delay(short_width);    //延時320us.

  176. out22=0;delay(short_width*3);   //長脈衝信號是短脈衝寬度的3倍.

  177.   }

  178. out1()//發射1

  179.   {

  180. out22=1;delay(short_width*3);   //延時960us.

  181. out22=0;delay(short_width);    //延時320us.

  182.   }


復制代碼
  1. //>>>>>>>>>>>>>>>>>>>>>>>>  rf發射end  >>>>>>>>>>>>>>>>>>>>>>>>>

  2. //主程序

  3. #include <intrins.h>

  4. #include <STC_11xx.H>

  5. #include <IO.H>

  6. #include <RF_IN_OUT.H>

  7. uchar key_d=0;

  8. #define time_long 160   //8s

  9. #define time_short 60  //3s

  10. uchar tim_ys=0;       //未學習時閃燈計時

  11. uchar ys_t1=0;//學習中未收到信號定時計時,自動退出學習

  12. uint key_time=0;      //按鍵時間長短計時

  13. uchar start_en=0;//學習標志,

  14. uchar start_num=0;// 學習個數

  15. show_jm();

  16. //**************************

  17. main()

  18.   {

  19. uchar i;   

  20. out22=0;RFIN=1;p_rxd=1;                //輸出腳初始  

  21.   //**********定時器0,初始化,模擬中斷,用于串口接收**************            

  22.     TMOD|=0X05;                 //定時器0計數模式,模擬外部中斷

  23. TH0=0XFF;TL0=0XFF;

  24. ET0=1; TR0=1;                //打開中斷,//啟動定時器0,  

  25. EA=1;

  26. //--------------定時器1--50ms定時用----------------

  27. TMOD|=0X10;      //定時器0設為16位定時器模式,方式1.方式0為13位定時器           

  28. clrbit(AUXR,6);//AUXR&=~(1<<7);     //t1 12Tmode

  29. TH1=(65536-MAIN_Fosc/12/1000*T0_YS)>>8;TL1=65536-MAIN_Fosc/12/1000*T0_YS;     //50MS定時器計數設定

  30. ET1=1; TR1=1;                //打開中斷,//啟動定時器0,  

  31. EA=1;                        

  32. //******************************************************

  33. //************初始學習個數*************

  34.   start_num=bat_read(0x3fe);

  35. if(start_num<1 || start_num>12)  //沒學習過

  36. {

  37. bat_prog(0x00);bat_prog(0x200);start_num=0;         

  38. }     

  39.   //************************************

  40. led_ss(2);      

  41. while(1)

  42.     {

  43. //-----------------------------------------------------------

  44. if(key_time>3 && key_time<10) //短按發射

  45. {

  46. delays(20);

  47. if(key_time<10)

  48.   {

  49. led^=1;     //取反

  50.   }        

  51. }

  52.   else if(key_time>time_short && key_time<(time_long-10)) {bat_prog(0x000);led=0;start_en=1;ys_t1=0;}    //3S正常學習            

  53.   else if(key_time>time_long) {led=1;delays(80);bat_prog(0x00);bat_prog(0x200);start_num=0;start_en=0;led_ss(7);}//8S清除,3S時燈亮,8時燈滅再閃7下

  54.   //---------------------------------------------------------------------------------------------------------------------------------------------------------

  55. RF_IN();     //2262接收

  56. if(rf_en==4)  //表示已接收到數據

  57.           {  

  58.             uchar u;

  59. for(i=0;i<3;i++){send_char(da1527[0][i]);}send_char(key_d);//串口發送接收到的數據

  60. show_jm();  //串口中文顯示收到的數據

  61.   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=

  62. if(start_en==1)   //學習狀態

  63. {               

  64. if(start_num<11)  //個數未到最大學習個數

  65. {

  66.   for(u=0;u<3;u++)bat_white(start_num*4+u,da1527[0][u]);  //存地址

  67.   bat_white(start_num*4+3,key_d);                         //存鍵值

  68.   start_num++;bat_prog(0x200);bat_white(0x3fe,start_num); //存學習個數

  69.   led_ss(2);led=0;                                         //led閃后常亮,繼續學習

  70. }

  71. }

  72. else                  //控制狀態

  73. {

  74.   for(u=0;u<start_num;u++)  //一個一個的地址讀出比較

  75. {

  76. if(da1527[0][0]==bat_read(u*4) && da1527[0][1]==bat_read(u*4+1) && da1527[0][2]==bat_read(u*4+2)) //地址比較  

  77. {

  78. if(key_d==1)  //按鍵值相同則執行

  79. {

  80. led^=1;     //取反

  81. u=20;     //退出FOR循環

  82. }

  83. }

  84. }

  85. }

  86.   rf_en=0;//

  87. }               

  88. }

  89.   }

  90. //***************************************************

  91. void TIME1_INT() interrupt 3 using 0  //time0中斷程序(50ms)  

  92. {

  93.   //********************************

  94. if(!k1)  {key_time++;if(key_time<time_short)led=1;if(start_en>0 && key_time<time_short){led_ss(5);start_en=0;}}   //按鍵時間計數,學習中按鍵退出學習

  95. else key_time=0;      

  96.   //********************學習中計數****************************

  97. if(start_en==1) {ys_t1++;}         

  98. if(ys_t1>200){ys_t1=0;led_ss(5);start_en=0;}  //退出學習。

  99.   //********************         

  100.   TH1=(65536-MAIN_Fosc/12/1000*T0_YS)>>8;TL1=65536-MAIN_Fosc/12/1000*T0_YS;     //50MS定時器

  101. }

  102. //***********************************************************

  103. show_jm()

  104. {

  105. uchar i;uint da2262h;da2262h=da1527[0][0]*256+da1527[0][1];        

  106.   if(!jmnx)  //2262

  107. {        

  108.   //***********************************//發射收到并經轉換后的數據2262*******************************************************************

  109.     send_str("\r\n");

  110. send_str("      本次解碼結果如下:\r\n\r\n");

  111. send_str("  解碼類型:2262  \r\n\r\n");

  112.     send_str("地址:OX");for(i=0;i<4;i++)if(((da2262h>>(12-(i*4)))&0x0f)>9)send_char(((da2262h>>(12-(i*4)))&0x0f)+0x37);else send_char(((da2262h>>(12-(i*4)))&0x0f)+0x30);

  113. send_str("  地址管腳配制:");

  114.     for(i=0;i<8;i++)                                  //以字符的方式發送接收到的數據

  115.     {

  116.   if(((da2262h>>((7-i)*2))& 3)==3)send_char(1+0x30);

  117.   else if(((da2262h>>((7-i)*2))& 3)==1)send_char('F');

  118.   else send_char(0+0x30);

  119. }

  120. send_str("\r\n\r\n");

  121.     send_str("按鍵值:OX");if(key_d>9)send_char(key_d+0x37);else send_char(key_d+0x30);

  122.     send_str("   按鍵管腳狀態:");

  123.     for(i=0;i<4;i++){send_char(((key_d>>(3-i))&1)+0x30);}

  124.     send_str("\r\n\r\n");

  125.     send_str("震蕩電阻參考值:OX");

  126.     if((short_k>>4)>9)send_char((short_k>>4)+0x37);else send_char((short_k>>4)+0x30);

  127. if((short_k&0x0f)>9)send_char((short_k&0x0f)+0x37);else send_char((short_k&0x0f)+0x30);

  128.     send_str("\r\n\r\n");

  129. }

  130. //************************************************************************************************************************

  131. else

  132. {

  133. send_str("\r\n");

  134. send_str("      本次解碼結果如下:\r\n\r\n");

  135. send_str("  解碼類型:1527  \r\n\r\n");  

  136. send_str("地址:OX");for(i=0;i<4;i++)if(((da2262h>>(12-(i*4)))&0x0f)>9)send_char(((da2262h>>(12-(i*4)))&0x0f)+0x37);else send_char(((da2262h>>(12-(i*4)))&0x0f)+0x30);

  137. if(da1527[0][2]>9)send_char(da1527[0][2]+0x37);else send_char(da1527[0][2]+0x30);

  138. send_str("\r\n\r\n");

  139.     send_str("按鍵值:OX");if(key_d>9)send_char(key_d+0x37);else send_char(key_d+0x30);

  140. send_str("震蕩電阻參考值:OX");

  141. if((short_k>>4)>9)send_char((short_k>>4)+0x37);else send_char((short_k>>4)+0x30);

  142. if((short_k&0x0f)>9)send_char((short_k&0x0f)+0x37);else send_char((short_k&0x0f)+0x30);

  143.     send_str("\r\n\r\n");            

  144. }

  145. }
復制代碼
編碼發射芯片振蕩的電阻
同步位寬度
窄脈沖寬度
寬脈沖寬度
配套的解碼接收芯片振蕩電阻
PT2262
SC2260-R4



PT2272/SC2272
1.2M




200K
1.5M
5.1M
4.8毫秒
150微秒
450微秒
270K
2.2M




390K
3.3M
12M
10毫秒
320微秒
960微秒
680K
4.7M
20M
14毫秒
450微秒
1350微秒
820K



作者:mcuc 來源:智凡單片機



回復

使用道具 舉報

ID:137334 發表于 2016-8-22 21:13 | 顯示全部樓層
我是菜鳥,學習學習再學習,謝謝!
回復

使用道具 舉報

ID:73340 發表于 2017-9-28 23:17 | 顯示全部樓層
看不到東西
回復

使用道具 舉報

ID:249545 發表于 2017-11-27 10:58 | 顯示全部樓層
PT2272這芯片加接收電路就很好玩,做無線遙控就很需要.
回復

使用道具 舉報

ID:686858 發表于 2021-9-19 17:03 | 顯示全部樓層
IO.H(2): error C129: missing ';' before 'rf_en'
請問一下rf_en就是什么,沒有定義的
回復

使用道具 舉報

ID:686858 發表于 2021-9-19 17:39 | 顯示全部樓層
Build target 'Target 1'
compiling RF.C...
IO.H(27): warning C206: 'delay': missing function-prototype
IO.H(27): error C267: 'delay': requires ANSI-style prototype
Target not created
缺少delay函數,不能編譯
回復

使用道具 舉報

ID:970121 發表于 2021-12-8 21:02 | 顯示全部樓層
winsinzhao 發表于 2021-9-19 17:39
Build target 'Target 1'
compiling RF.C...
IO.H(27): warning C206: 'delay': missing function-protot ...

自已加一個函數
回復

使用道具 舉報

ID:970121 發表于 2021-12-26 10:06 | 顯示全部樓層
樓主厲害!參考樓主的代碼,終于學會了RF信號接收是怎么處理的!
回復

使用道具 舉報

ID:31119 發表于 2021-12-27 00:45 | 顯示全部樓層
幸苦很不錯
回復

使用道具 舉報

ID:31119 發表于 2021-12-27 00:45 | 顯示全部樓層
辛苦了很不錯的東西
回復

使用道具 舉報

ID:686858 發表于 2022-3-26 23:38 | 顯示全部樓層
感謝樓主的無私奉獻!你這代碼寫得很好,我是個初學者,有這代碼我可以理解1527的解碼過程,有些不懂的地方想請教一下,請問振蕩電阻參考值是怎么樣對應到實際的電阻的,如0X44,還有我發現這個代碼不能解SC2640這個IC。
回復

使用道具 舉報

ID:1058675 發表于 2023-11-3 17:27 | 顯示全部樓層
這個電路有成功的兄弟嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人二区 | 欧美日韩一区精品 | 免费一区二区 | 日韩一区二区三区视频在线观看 | 91精品国产乱码久久久久久久久 | 久久只有精品 | 在线精品一区二区三区 | 日本在线免费观看 | 亚洲精品视频一区 | 另类 综合 日韩 欧美 亚洲 | 午夜视频免费 | 日日夜夜精品视频 | 精品一区二区三区四区 | 欧美视频一区二区三区 | 免费在线观看av网址 | 日韩成人在线网站 | 欧美国产视频一区二区 | 男女免费在线观看视频 | 国产精品视频网址 | 久久久久国产一区二区三区四区 | 综合一区二区三区 | 久久亚 | 国产精品天堂 | 中文字幕在线观看第一页 | 超碰人人做 | 99久久视频 | 欧美日韩成人在线 | 一区二区三区国产精品 | 在线观看亚洲精品视频 | 日韩精品久久一区二区三区 | 精品国产欧美一区二区 | www.久久 | 久久久久香蕉视频 | 亚洲精品自拍 | 国产精品成人国产乱一区 | 操网站 | 97国产精品 | 精品国产乱码久久久久久闺蜜 | 粉嫩一区二区三区国产精品 | 亚洲国产欧美国产综合一区 | 97精品久久 |