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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3999|回復: 14
收起左側

關于51單片機制作38K紅外遙控的代碼相關問題

[復制鏈接]
ID:417092 發表于 2019-6-12 00:56 | 顯示全部樓層 |閱讀模式
1.png
這個寫輸出效果接近于38K方波

2.jpg

如果寫成
3.png

出來的效果就成了。
4.png

高電平時間多了5uS.
如果不循環調用函數。
紅外起始信號。9ms就可重復寫342次嗎???
代碼中每位數所0.56mS,就需要重復寫21次呀。
如果不使用循環調用函數。寫出來的程序。
51單片機容量,還以寫進進去嗎???

5.png

如果這樣寫去掉6次。

6.png

這樣一直輸出還可以,如果加個變量統計次數,計算時間。高電平時間又變長了怎么辦呀。

7.png

加個變量,計時做開始信號。加個變量,計時做開始信號。
8.png


高電平時間22uS

多了9uS.
9.png

程序中已經去掉了6個空指令,
還有6個空指令。
高電平時間還多。9uS如何處理呀。
全去掉,高電平的時間還是多呀。

10.png

全部去掉
11.png

高電平的時間是15.75uS還是多2.6uS.
還個問題,怎么怎么辦呀。

12.png

38K高低電平,各占13.157uS.
這個時間是按38K來計算的。
紅外一體接收頭,接收38K-----40K之間載波。
電平時間可以再短一些。不能再長了。
定時中斷產生38K.
反復中斷壓棧時間就處理不過來。

回復

使用道具 舉報

ID:123289 發表于 2019-6-12 08:13 | 顯示全部樓層
一開始的設計方案就不對!
回復

使用道具 舉報

ID:123289 發表于 2019-6-12 08:14 | 顯示全部樓層
加上對單片機的了解不夠,問題就出來了。
回復

使用道具 舉報

ID:417080 發表于 2019-6-12 09:59 | 顯示全部樓層
51單片機本身執行周期就長,加上你要求這么高的精度,有點難搞。你所看到的高電平多一點,是因為從低電平到高電平的過程中會有波動,也就是常說的抖動,你要從原理上去分析,試著用去抖動的方法來完成。很簡單就是判斷一下,讓它變換的更迅速而已。
回復

使用道具 舉報

ID:417092 發表于 2019-6-12 10:45 | 顯示全部樓層
yzwzfyz 發表于 2019-6-12 08:14
加上對單片機的了解也膚淺,問題就出來了。

如何解決呀。讓單片機只輸出信號的高低電平。不產生38K方波嗎。
單片機,外部再加一個,38K方波產生的電路嗎???
回復

使用道具 舉報

ID:417092 發表于 2019-6-12 10:46 | 顯示全部樓層
sadbkj 發表于 2019-6-12 09:59
51單片機本身執行周期就長,加上你要求這么高的精度,有點難搞。你所看到的高電平多一點,是因為從低電平到 ...

沒聽明白,是什么意思。。。詳細說一下吧。。。
回復

使用道具 舉報

ID:417092 發表于 2019-6-12 17:43 | 顯示全部樓層
yzwzfyz 發表于 2019-6-12 08:14
加上對單片機的了解也不夠,問題就出來了。

說一下,這個問題,如何解決。。。
回復

使用道具 舉報

ID:514901 發表于 2019-6-12 19:50 | 顯示全部樓層
38K赫茲載波,每26us取反一次,用中斷與子函數配合著用,沒那么復雜的
回復

使用道具 舉報

ID:155507 發表于 2019-6-12 20:34 | 顯示全部樓層
我給你來個程序試試


  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC 1T Series MCU Demo Programme -------------------------------*/
  4. /* --- Mobile: (86)13922805190 ----------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 -----------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
  7. /* --- Web: www.STCMCU.com --------------------------------------------*/
  8. /* --- Web: www.GXWMCU.com --------------------------------------------*/
  9. /* --- QQ:  800003751 -------------------------------------------------*/
  10. /* 如果要在程序中使用此代碼,請在程序中注明使用了STC的資料及程序        */
  11. /*---------------------------------------------------------------------*/



  12. /*************  本程序功能說明  **************


  13. 用戶可以在宏定義中改變MCU主時鐘頻率. 范圍 8MHZ ~ 33MHZ.

  14. 紅外接收程序。模擬市場上用量最大的NEC的編碼。

  15. 用戶可以在宏定義中指定用戶碼.

  16. 使用PCA2高速輸出產生38KHZ載波, 1/3占空比, 每個38KHZ周期發射管發射9us,關閉16.3us.

  17. 使用開發板上的16個IO掃描按鍵, MCU不睡眠, 連續掃描按鍵.

  18. 當鍵按下, 第一幀為數據, 后面的幀為重復爭,不帶數據, 具體定義請自行參考NEC的編碼資料.

  19. 鍵釋放后, 停止發送.

  20. ******************************************/


  21. #include    "reg51.h"
  22. #include    "intrins.h"

  23. #define     MAIN_Fosc       11059200L   //定義主時鐘

  24. typedef     unsigned char   u8;
  25. typedef     unsigned int    u16;
  26. typedef     unsigned long   u32;

  27. sfr TH2  = 0xD6;
  28. sfr TL2  = 0xD7;
  29. sfr IE2   = 0xAF;
  30. sfr INT_CLKO = 0x8F;
  31. sfr AUXR = 0x8E;
  32. sfr AUXR1 = 0xA2;
  33. sfr P_SW1 = 0xA2;
  34. sfr P_SW2 = 0xBA;
  35. sfr S2CON = 0x9A;
  36. sfr S2BUF = 0x9B;

  37. sfr ADC_CONTR = 0xBC;   //帶AD系列
  38. sfr ADC_RES   = 0xBD;   //帶AD系列
  39. sfr ADC_RESL  = 0xBE;   //帶AD系列
  40. sfr P1ASF = 0x9D;   //只寫,模擬輸入(AD或LVD)選擇

  41. sfr CCON = 0xD8;    //
  42. sbit CCF0  = CCON^0;    //PCA 模塊0中斷標志,由硬件置位,必須由軟件清0。
  43. sbit CCF1  = CCON^1;    //PCA 模塊1中斷標志,由硬件置位,必須由軟件清0。
  44. sbit CCF2  = CCON^2;    //PCA 模塊2中斷標志,由硬件置位,必須由軟件清0。
  45. sbit CR    = CCON^6;    //1: 允許PCA計數器計數,必須由軟件清0。
  46. sbit CF    = CCON^7;    //PCA計數器溢出(CH,CL由FFFFH變為0000H)標志。PCA計數器溢出后由硬件置位,必須由軟件清0。
  47. sfr CMOD = 0xD9;    //
  48. sfr CCAPM0 = 0xDA;  //PCA模塊0的工作模式寄存器。
  49. sfr CCAPM1 = 0xDB;  //PCA模塊1的工作模式寄存器。
  50. sfr CCAPM2 = 0xDC;  //PCA模塊2的工作模式寄存器。
  51. sfr CL     = 0xE9;  //
  52. sfr CCAP0L = 0xEA;  //PCA模塊0的捕捉/比較寄存器低8位。
  53. sfr CCAP1L = 0xEB;  //PCA模塊1的捕捉/比較寄存器低8位。
  54. sfr CCAP2L = 0xEC;  //PCA模塊2的捕捉/比較寄存器低8位。
  55. sfr CH     = 0xF9;
  56. sfr CCAP0H = 0xFA;      //PCA模塊0的捕捉/比較寄存器高8位。
  57. sfr CCAP1H = 0xFB;      //PCA模塊1的捕捉/比較寄存器高8位。
  58. sfr CCAP2H = 0xFC;      //PCA模塊2的捕捉/比較寄存器高8位。
  59. sfr PCA_PWM0 = 0xF2;    //PCA模塊0 PWM寄存器。
  60. sfr PCA_PWM1 = 0xF3;    //PCA模塊1 PWM寄存器。
  61. sfr PCA_PWM2 = 0xF4;    //PCA模塊2 PWM寄存器。

  62. sbit PPCA   = IP^7;

  63. sfr P4   = 0xC0;
  64. sfr P5   = 0xC8;
  65. sfr P6   = 0xE8;
  66. sfr P7   = 0xF8;
  67. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  68. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  69. sfr P0M1 = 0x93;
  70. sfr P0M0 = 0x94;
  71. sfr P2M1 = 0x95;
  72. sfr P2M0 = 0x96;
  73. sfr P3M1 = 0xB1;
  74. sfr P3M0 = 0xB2;
  75. sfr P4M1 = 0xB3;
  76. sfr P4M0 = 0xB4;
  77. sfr P5M1 = 0xC9;
  78. sfr P5M0 = 0xCA;
  79. sfr P6M1 = 0xCB;
  80. sfr P6M0 = 0xCC;
  81. sfr P7M1 = 0xE1;
  82. sfr P7M0 = 0xE2;

  83. sbit P00 = P0^0;
  84. sbit P01 = P0^1;
  85. sbit P02 = P0^2;
  86. sbit P03 = P0^3;
  87. sbit P04 = P0^4;
  88. sbit P05 = P0^5;
  89. sbit P06 = P0^6;
  90. sbit P07 = P0^7;
  91. sbit P10 = P1^0;
  92. sbit P11 = P1^1;
  93. sbit P12 = P1^2;
  94. sbit P13 = P1^3;
  95. sbit P14 = P1^4;
  96. sbit P15 = P1^5;
  97. sbit P16 = P1^6;
  98. sbit P17 = P1^7;
  99. sbit P20 = P2^0;
  100. sbit P21 = P2^1;
  101. sbit P22 = P2^2;
  102. sbit P23 = P2^3;
  103. sbit P24 = P2^4;
  104. sbit P25 = P2^5;
  105. sbit P26 = P2^6;
  106. sbit P27 = P2^7;
  107. sbit P30 = P3^0;
  108. sbit P31 = P3^1;
  109. sbit P32 = P3^2;
  110. sbit P33 = P3^3;
  111. sbit P34 = P3^4;
  112. sbit P35 = P3^5;
  113. sbit P36 = P3^6;
  114. sbit P37 = P3^7;
  115. sbit P40 = P4^0;
  116. sbit P41 = P4^1;
  117. sbit P42 = P4^2;
  118. sbit P43 = P4^3;
  119. sbit P44 = P4^4;
  120. sbit P45 = P4^5;
  121. sbit P46 = P4^6;
  122. sbit P47 = P4^7;
  123. sbit P50 = P5^0;
  124. sbit P51 = P5^1;
  125. sbit P52 = P5^2;
  126. sbit P53 = P5^3;
  127. sbit P54 = P5^4;
  128. sbit P55 = P5^5;
  129. sbit P56 = P5^6;
  130. sbit P57 = P5^7;


  131. /*************  紅外發送相關變量    **************/
  132. #define User_code   0xFF00      //定義紅外用戶碼

  133. sbit    P_IR_TX   = P3^7;   //定義紅外發送端口

  134. u16     PCA_Timer2; //PCA2軟件定時器變量
  135. bit     B_Space;    //發送空閑(延時)標志
  136. u16     tx_cnt;     //發送或空閑的脈沖計數(等于38KHZ的脈沖數,對應時間), 紅外頻率為38KHZ, 周期26.3us
  137. u8      TxTime;     //發送時間


  138. /*************  IO口定義    **************/
  139. sbit    P_HC595_SER   = P4^0;   //pin 14    SER     data input
  140. sbit    P_HC595_RCLK  = P5^4;   //pin 12    RCLk    store (latch) clock
  141. sbit    P_HC595_SRCLK = P4^3;   //pin 11    SRCLK   Shift data clock

  142. /*************  IO鍵盤變量聲明  **************/

  143. u8  IO_KeyState, IO_KeyState1, IO_KeyHoldCnt;   //行列鍵盤變量
  144. u8  KeyHoldCnt; //鍵按下計時
  145. u8  KeyCode;    //給用戶使用的鍵碼, 1~16有效


  146. /*************  本地函數聲明    **************/
  147. void    delay_ms(u8 ms);
  148. void    DisableHC595(void);
  149. void    IO_KeyScan(void);
  150. void    PCA_config(void);
  151. void    IR_TxPulse(u16 pulse);
  152. void    IR_TxSpace(u16 pulse);
  153. void    IR_TxByte(u8 dat);




  154. /********************** 主函數 ************************/
  155. void main(void)
  156. {
  157.     P0M1 = 0;   P0M0 = 0;   //設置為準雙向口
  158.     P1M1 = 0;   P1M0 = 0;   //設置為準雙向口
  159.     P2M1 = 0;   P2M0 = 0;   //設置為準雙向口
  160.     P3M1 = 0;   P3M0 = 0;   //設置為準雙向口
  161.     P4M1 = 0;   P4M0 = 0;   //設置為準雙向口
  162.     P5M1 = 0;   P5M0 = 0;   //設置為準雙向口
  163.     P6M1 = 0;   P6M0 = 0;   //設置為準雙向口
  164.     P7M1 = 0;   P7M0 = 0;   //設置為準雙向口
  165.    
  166.     PCA_config();
  167.    
  168.     EA = 1;                     //打開總中斷
  169.    
  170.     DisableHC595();     //禁止掉學習板上的HC595顯示,省電

  171.     while(1)
  172.     {
  173.         delay_ms(30);       //30ms
  174.         IO_KeyScan();

  175.         if(KeyCode != 0)        //檢測到鍵碼
  176.         {
  177.             TxTime = 0;
  178.                                 //一幀數據最小長度 = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
  179.                                 //一幀數據最大長度 = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
  180.             IR_TxPulse(342);    //對應9ms,同步頭       9ms
  181.             IR_TxSpace(171);    //對應4.5ms,同步頭間隔 4.5ms
  182.             IR_TxPulse(21);     //開始發送數據          0.5625ms

  183.             IR_TxByte(User_code%256);   //發用戶碼高字節
  184.             IR_TxByte(User_code/256);   //發用戶碼低字節
  185.             IR_TxByte(KeyCode);         //發數據
  186.             IR_TxByte(~KeyCode);        //發數據反碼
  187.             
  188.             if(TxTime < 56)     //一幀按最大77ms發送, 不夠的話,補償時間     108ms
  189.             {
  190.                 TxTime = 56 - TxTime;
  191.                 TxTime = TxTime + TxTime / 8;
  192.                 delay_ms(TxTime);
  193.             }
  194.             delay_ms(31);

  195.             while(IO_KeyState != 0) //鍵未釋放
  196.             {
  197.                 IR_TxPulse(342);    //對應9ms,   同步頭        9ms
  198.                 IR_TxSpace(86);     //對應2.25ms,同步頭間隔    2.25ms
  199.                 IR_TxPulse(21);     //開始發送數據              0.5625ms
  200.                 delay_ms(96);
  201.                 IO_KeyScan();
  202.             }
  203.             KeyCode = 0;
  204.         }
  205.     }
  206. }
  207. /**********************************************/

  208. //========================================================================
  209. // 函數: void  delay_ms(unsigned char ms)
  210. // 描述: 延時函數。
  211. // 參數: ms,要延時的ms數, 這里只支持1~255ms. 自動適應主時鐘.
  212. // 返回: none.
  213. // 版本: VER1.0
  214. // 日期: 2013-4-1
  215. // 備注:
  216. //========================================================================
  217. void  delay_ms(u8 ms)
  218. {
  219.      u16 i;
  220.      do{
  221.           i = MAIN_Fosc / 13000;
  222.           while(--i)    ;   //13T per loop
  223.      }while(--ms);
  224. }



  225. void DisableHC595(void)
  226. {      
  227.     u8  i;
  228.     P_HC595_SER   = 1;
  229.     for(i=0; i<20; i++)
  230.     {
  231.         P_HC595_SRCLK = 1;
  232.         P_HC595_SRCLK = 0;
  233.     }
  234.     P_HC595_RCLK = 1;
  235.     P_HC595_RCLK = 0;                           //鎖存輸出數據
  236.     P_HC595_RCLK = 1;
  237.     P_HC595_RCLK = 0;                           //鎖存輸出數據
  238. }


  239. /*****************************************************
  240.     行列鍵掃描程序
  241.     使用XY查找4x4鍵的方法,只能單鍵,速度快

  242.    Y     P04      P05      P06      P07
  243.           |        |        |        |
  244. X         |        |        |        |
  245. P00 ---- K00 ---- K01 ---- K02 ---- K03 ----
  246.           |        |        |        |
  247. P01 ---- K04 ---- K05 ---- K06 ---- K07 ----
  248.           |        |        |        |
  249. P02 ---- K08 ---- K09 ---- K10 ---- K11 ----
  250.           |        |        |        |
  251. P03 ---- K12 ---- K13 ---- K14 ---- K15 ----
  252.           |        |        |        |
  253. ******************************************************/


  254. u8 code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};

  255. void IO_KeyDelay(void)
  256. {
  257.     u8 i;
  258.     i = 60;
  259.     while(--i)  ;
  260. }

  261. void    IO_KeyScan(void)    //50ms call
  262. {
  263.     u8  j;

  264.     j = IO_KeyState1;   //保存上一次狀態

  265.     P0 = 0xf0;  //X低,讀Y
  266.     IO_KeyDelay();
  267.     IO_KeyState1 = P0 & 0xf0;

  268.     P0 = 0x0f;  //Y低,讀X
  269.     IO_KeyDelay();
  270.     IO_KeyState1 |= (P0 & 0x0f);
  271.     IO_KeyState1 ^= 0xff;   //取反
  272.    
  273.     if(j == IO_KeyState1)   //連續兩次讀相等
  274.     {
  275.         j = IO_KeyState;
  276.         IO_KeyState = IO_KeyState1;
  277.         if(IO_KeyState != 0)    //有鍵按下
  278.         {
  279.             F0 = 0;
  280.             if(j == 0)  F0 = 1; //第一次按下
  281.             else if(j == IO_KeyState)
  282.             {
  283.                 if(++IO_KeyHoldCnt >= 20)   //1秒后重鍵
  284.                 {
  285.                     IO_KeyHoldCnt = 18;
  286.                     F0 = 1;
  287.                 }
  288.             }
  289.             if(F0)
  290.             {
  291.                 j = T_KeyTable[IO_KeyState >> 4];
  292.                 if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0))
  293.                     KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] + 16;    //計算鍵碼,17~32
  294.             }
  295.         }
  296.         else    IO_KeyHoldCnt = 0;
  297.     }
  298.     P0 = 0xff;
  299. }



  300. /************* 發送脈沖函數 **************/
  301. void    IR_TxPulse(u16 pulse)
  302. {
  303.     tx_cnt = pulse;
  304.     B_Space = 0;    //發脈沖
  305.     CCAPM2 = 0x48 | 0x04 | 0x01;    //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  306.     CR = 1;     //啟動
  307.     while(CR);
  308. }

  309. /************* 發送空閑函數 **************/
  310. void    IR_TxSpace(u16 pulse)
  311. {
  312.     tx_cnt = pulse;
  313.     B_Space = 1;    //空閑
  314.     CCAPM2 = 0x48 | 0x01;   //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  315.     CR = 1;     //啟動
  316.     while(CR);
  317. }


  318. /************* 發送一個字節函數 **************/
  319. void    IR_TxByte(u8 dat)
  320. {
  321.     u8 i;
  322.     for(i=0; i<8; i++)
  323.     {
  324.         if(dat & 1)     IR_TxSpace(63), TxTime += 2;    //數據1對應 1.6875 + 0.5625 ms
  325.         else            IR_TxSpace(21), TxTime++;       //數據0對應 0.5625 + 0.5625 ms
  326.         IR_TxPulse(21);         //脈沖都是0.5625ms
  327.         dat >>= 1;              //下一個位
  328.     }
  329. }

  330. //========================================================================
  331. // 函數: void   PCA_config(void)
  332. // 描述: PCA配置函數.
  333. // 參數: None
  334. // 返回: none.
  335. // 版本: V1.0, 2012-11-22
  336. //========================================================================
  337. void    PCA_config(void)
  338. {
  339.     AUXR1   = (AUXR1 & ~0x30) | 0x10;   //切換IO口, 0x00: P1.2 P1.1 P1.0 P3.7,  0x10: P3.4 P3.5 P3.6 P3.7, 0x20: P2.4 P2.5 P2.6 P2.7

  340.     CCON = 0x00;    //清除所有中斷標志
  341.     CCAPM2  = 0x48+ 1;  //工作模式 + 允許中斷 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  342.     CCAPM2 |= 0x04; //允許高速取反輸出, 一般用在16位軟件定時器
  343.     PCA_Timer2 = 100;   //隨便給一個小的初值
  344.     CCAP2L = (u8)PCA_Timer2;            //將影射寄存器寫入捕獲寄存器,先寫CCAPxL
  345.     CCAP2H = (u8)(PCA_Timer2 >> 8); //后寫CCAPxH

  346.     PPCA = 1;   //高優先級中斷
  347.     CMOD  = (CMOD  & ~0xe0) | 0x08; //選擇時鐘源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
  348.     CH = 0;
  349.     CL = 0;
  350.     CR = 0;
  351.     tx_cnt = 2;
  352. }

  353. //========================================================================
  354. // 函數: void   PCA_Handler (void) interrupt PCA_VECTOR
  355. // 描述: PCA中斷處理程序.
  356. // 參數: None
  357. // 返回: none.
  358. // 版本: V1.0, 2012-11-22
  359. //========================================================================

  360. #define D_38K_DUTY  ((MAIN_Fosc * 26) / 1000000UL + MAIN_Fosc / 3000000UL)  /*  38KHZ周期時間   26.3us */
  361. #define D_38K_OFF   ((MAIN_Fosc * 17) / 1000000UL + MAIN_Fosc / 3000000UL)  /* 發射管關閉時間   17.3us */
  362. #define D_38K_ON    ((MAIN_Fosc * 9) / 1000000UL)                           /* 發射管導通時間   9us */

  363. void    PCA_Handler (void) interrupt 7
  364. {
  365.     CCON = 0x40;    //清除所有中斷標志,但不關CR
  366.     if(!B_Space)    //發送載波
  367.     {                               //發送脈沖,交替裝載TH0值,溢出時自動重裝
  368.         if(P_IR_TX)
  369.         {
  370.             PCA_Timer2 += D_38K_OFF;    //裝載高電平時間    17.3us
  371.             if(--tx_cnt == 0)   CR = 0; //pulse has sent,   stop
  372.         }
  373.         else    PCA_Timer2 += D_38K_ON; //裝載低電平時間    9us
  374.     }
  375.     else    //發送暫停時間
  376.     {
  377.         PCA_Timer2 += D_38K_DUTY;   //裝載周期時間  26.3us
  378.         if(--tx_cnt == 0)   CR = 0; //空閑時間
  379.     }
  380.     CCAP2L = (u8)PCA_Timer2;            //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
  381.     CCAP2H = (u8)(PCA_Timer2 >> 8); //后寫CCAP0H
  382. }

復制代碼
回復

使用道具 舉報

ID:451448 發表于 2019-6-12 22:24 | 顯示全部樓層
做紅外的話,單片機的精度可能不夠,最好用STM32或者K60做,按著解碼的步驟,獲取高低電平的時間然后解碼就可以了
回復

使用道具 舉報

ID:417092 發表于 2019-6-14 01:03 | 顯示全部樓層
鄭漢松 發表于 2019-6-12 19:50
38K赫茲載波,每26us取反一次,用中斷與子函數配合著用,沒那么復雜的

13不是26.
26就成的19KHz了,不是38K了。
回復

使用道具 舉報

ID:417092 發表于 2019-6-14 01:04 | 顯示全部樓層
angmall 發表于 2019-6-12 20:34
我給你來個程序試試

謝謝,我試試。
回復

使用道具 舉報

ID:417092 發表于 2019-6-14 01:13 | 顯示全部樓層
angmall 發表于 2019-6-12 20:34
我給你來個程序試試

沒法用這,這個是什么型號的51呀。。。
怎么還有P5 IO口呀。
回復

使用道具 舉報

ID:417092 發表于 2019-6-14 01:20 | 顯示全部樓層
angmall 發表于 2019-6-12 20:34
我給你來個程序試試

MCU 還是1T的呀。
回復

使用道具 舉報

ID:417092 發表于 2019-6-14 17:02 | 顯示全部樓層
angmall 發表于 2019-6-12 20:34
我給你來個程序試試

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit IR_OUT = P0^0;                //紅外發射引腳

//T1 13us產生一次中斷 用于產生38K載波
//T0 方式1 16位  用于定時
void Init_Timer(void)
{
        TMOD=0x21;         //T0 mode 1      T1 mode 2  
       
        TH1=243;                                               

        //特殊
        TL1=TH1;
       
        ET1=1;
        EA=1;
}
//發送引導碼  發送方:9ms高電平 4.5ms低電平
void Send_Start_Bit(void)    //TR1的值=發送的電平
{
        //9ms 1
        TH0=0xDC;
        TL0=0xD9;
        TR0=1;
        TR1=1;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;
        //4.5ms 0
        TH0=0xEE;  
        TL0=0x6E;
        TR0=1;
        TR1=0;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;
}
//發送0  
void Send_Bit_0(void)
{
        //0.565ms 1
        TH0=0xFD;  
        TL0=0xCB;
        TR0=1;
        TR1=1;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;
        //0.565ms 0
        TH0=0xFD;  
        TL0=0xCB;
        TR0=1;
        TR1=0;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;

}
//發送1
void Send_Bit_1(void)
{
//0.565ms 1
        TH0=0xFD;  
        TL0=0xCB;
        TR0=1;
        TR1=1;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;
        //1.685ms 0
        TH0=0xF9;  
        TL0=0x6C;
        TR0=1;
        TR1=0;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;  
}

void Send_over(void)            //發送一個結束碼,因為最后一個位只有遇到下降沿才能讀取(發射端的上升沿)
{
//0.500ms 1                            //小于0.5ms 接收端很難識別到
        TH0=0xFE;  
        TL0=0x0C;
        TR0=1;
        TR1=1;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;
        //0.500ms 0
        TH0=0xFE;  
        TL0=0x0C;
        TR0=1;
        TR1=0;
       
        while(!TF0);
       
        TR1=0;
        TF0=0;
        TR0=0;
       
        IR_OUT=0;  
}
//發送一字節 8位
void Send_Char()
{
        unsigned char i,j1,j2,j3,j4;
        j1=0xCC;
        j2=0x1D;
        j3=0x08;
        j4=0xF7;
        Send_Start_Bit();                                                                



Send_Bit_0();
  //發射引導嗎
        for(i=0;i<8;i++)
        {
                if(j1&1)
                        Send_Bit_1();
                else
                        Send_Bit_0();
                j1=j1>>1;                                                                

                //先發射低位
        }

        for(i=0;i<8;i++)
        {
                if(j2&1)
                        Send_Bit_1();
                else
                        Send_Bit_0();
                j2=j2>>1;                                                                

                //先發射低位
        }

        for(i=0;i<8;i++)
        {
                if(j3&1)
                        Send_Bit_1();
                else
                        Send_Bit_0();
                j3=j3>>1;                                                                

                //先發射低位
        }
       
        for(i=0;i<8;i++)
        {
                if(j4&1)
                        Send_Bit_1();
                else
                        Send_Bit_0();
                j4=j4>>1;                                                                

                //先發射低位
        }
        Send_over();                                                                       

        //結束符
}
void T1_ISR(void) interrupt 3
{
        IR_OUT=!IR_OUT;
}

void main()
{
        Init_Timer();
        while(1)
        {
        Send_Char();
        }
       
}


這個程序可以嗎。。。仿真示波器,看著正常。做成電路,不知道為什么不行。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视频在线看 | 国产一区二区三区四区 | 九九久久这里只有精品 | 日韩精品免费播放 | 7777在线| 国产精品不卡视频 | 日韩日韩日韩日韩日韩日韩日韩 | 亚洲国产精品久久久 | 国产在线精品一区二区 | 国产精品久久国产精品久久 | 玖玖国产 | 在线视频一区二区三区 | 精品视频国产 | 黄色片大全在线观看 | 欧美极品少妇xxxxⅹ免费视频 | 免费a大片 | 亚洲444kkkk在线观看最新 | 毛片一区二区 | 中文字幕在线一区二区三区 | 国产亚洲精品久久午夜玫瑰园 | 午夜精品一区二区三区在线观看 | 91欧美激情一区二区三区成人 | 国产精品国产成人国产三级 | 国产精品福利视频 | 中文字幕在线观看 | 少妇精品亚洲一区二区成人 | 免费一级网站 | 天天色天天射天天干 | 精品国产一区二区国模嫣然 | 在线免费观看成人 | 国产精品国产三级国产aⅴ中文 | 天天操天天干天天爽 | 亚洲不卡 | 欧美一二三四成人免费视频 | 日韩免费福利视频 | 久久伊人久久 | 亚洲精品一区中文字幕 | 国产区视频在线观看 | 在线精品观看 | aaa一区| 99re在线视频精品 |