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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3830|回復(fù): 14
收起左側(cè)

關(guān)于51單片機(jī)制作38K紅外遙控的代碼相關(guān)問題

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

2.jpg

如果寫成
3.png

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

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

5.png

如果這樣寫去掉6次。

6.png

這樣一直輸出還可以,如果加個(gè)變量統(tǒng)計(jì)次數(shù),計(jì)算時(shí)間。高電平時(shí)間又變長了怎么辦呀。

7.png

加個(gè)變量,計(jì)時(shí)做開始信號。加個(gè)變量,計(jì)時(shí)做開始信號。
8.png


高電平時(shí)間22uS

多了9uS.
9.png

程序中已經(jīng)去掉了6個(gè)空指令,
還有6個(gè)空指令。
高電平時(shí)間還多。9uS如何處理呀。
全去掉,高電平的時(shí)間還是多呀。

10.png

全部去掉
11.png

高電平的時(shí)間是15.75uS還是多2.6uS.
還個(gè)問題,怎么怎么辦呀。

12.png

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

回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2019-6-12 08:13 | 顯示全部樓層
一開始的設(shè)計(jì)方案就不對!
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:417080 發(fā)表于 2019-6-12 09:59 | 顯示全部樓層
51單片機(jī)本身執(zhí)行周期就長,加上你要求這么高的精度,有點(diǎn)難搞。你所看到的高電平多一點(diǎn),是因?yàn)閺牡碗娖降礁唠娖降倪^程中會有波動,也就是常說的抖動,你要從原理上去分析,試著用去抖動的方法來完成。很簡單就是判斷一下,讓它變換的更迅速而已。
回復(fù)

使用道具 舉報(bào)

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

如何解決呀。讓單片機(jī)只輸出信號的高低電平。不產(chǎn)生38K方波嗎。
單片機(jī),外部再加一個(gè),38K方波產(chǎn)生的電路嗎???
回復(fù)

使用道具 舉報(bào)

ID:417092 發(fā)表于 2019-6-12 10:46 | 顯示全部樓層
sadbkj 發(fā)表于 2019-6-12 09:59
51單片機(jī)本身執(zhí)行周期就長,加上你要求這么高的精度,有點(diǎn)難搞。你所看到的高電平多一點(diǎn),是因?yàn)閺牡碗娖降?...

沒聽明白,是什么意思。。。詳細(xì)說一下吧。。。
回復(fù)

使用道具 舉報(bào)

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

說一下,這個(gè)問題,如何解決。。。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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


  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. /* 如果要在程序中使用此代碼,請?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
  11. /*---------------------------------------------------------------------*/



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


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

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

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

  16. 使用PCA2高速輸出產(chǎn)生38KHZ載波, 1/3占空比, 每個(gè)38KHZ周期發(fā)射管發(fā)射9us,關(guān)閉16.3us.

  17. 使用開發(fā)板上的16個(gè)IO掃描按鍵, MCU不睡眠, 連續(xù)掃描按鍵.

  18. 當(dāng)鍵按下, 第一幀為數(shù)據(jù), 后面的幀為重復(fù)爭,不帶數(shù)據(jù), 具體定義請自行參考NEC的編碼資料.

  19. 鍵釋放后, 停止發(fā)送.

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


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

  23. #define     MAIN_Fosc       11059200L   //定義主時(shí)鐘

  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中斷標(biāo)志,由硬件置位,必須由軟件清0。
  43. sbit CCF1  = CCON^1;    //PCA 模塊1中斷標(biāo)志,由硬件置位,必須由軟件清0。
  44. sbit CCF2  = CCON^2;    //PCA 模塊2中斷標(biāo)志,由硬件置位,必須由軟件清0。
  45. sbit CR    = CCON^6;    //1: 允許PCA計(jì)數(shù)器計(jì)數(shù),必須由軟件清0。
  46. sbit CF    = CCON^7;    //PCA計(jì)數(shù)器溢出(CH,CL由FFFFH變?yōu)?000H)標(biāo)志。PCA計(jì)數(shù)器溢出后由硬件置位,必須由軟件清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. /*************  紅外發(fā)送相關(guān)變量    **************/
  132. #define User_code   0xFF00      //定義紅外用戶碼

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

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


  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; //鍵按下計(jì)時(shí)
  145. u8  KeyCode;    //給用戶使用的鍵碼, 1~16有效


  146. /*************  本地函數(shù)聲明    **************/
  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. /********************** 主函數(shù) ************************/
  155. void main(void)
  156. {
  157.     P0M1 = 0;   P0M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  158.     P1M1 = 0;   P1M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  159.     P2M1 = 0;   P2M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  160.     P3M1 = 0;   P3M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  161.     P4M1 = 0;   P4M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  162.     P5M1 = 0;   P5M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  163.     P6M1 = 0;   P6M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  164.     P7M1 = 0;   P7M0 = 0;   //設(shè)置為準(zhǔn)雙向口
  165.    
  166.     PCA_config();
  167.    
  168.     EA = 1;                     //打開總中斷
  169.    
  170.     DisableHC595();     //禁止掉學(xué)習(xí)板上的HC595顯示,省電

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

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

  183.             IR_TxByte(User_code%256);   //發(fā)用戶碼高字節(jié)
  184.             IR_TxByte(User_code/256);   //發(fā)用戶碼低字節(jié)
  185.             IR_TxByte(KeyCode);         //發(fā)數(shù)據(jù)
  186.             IR_TxByte(~KeyCode);        //發(fā)數(shù)據(jù)反碼
  187.             
  188.             if(TxTime < 56)     //一幀按最大77ms發(fā)送, 不夠的話,補(bǔ)償時(shí)間     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);    //對應(yīng)9ms,   同步頭        9ms
  198.                 IR_TxSpace(86);     //對應(yīng)2.25ms,同步頭間隔    2.25ms
  199.                 IR_TxPulse(21);     //開始發(fā)送數(shù)據(jù)              0.5625ms
  200.                 delay_ms(96);
  201.                 IO_KeyScan();
  202.             }
  203.             KeyCode = 0;
  204.         }
  205.     }
  206. }
  207. /**********************************************/

  208. //========================================================================
  209. // 函數(shù): void  delay_ms(unsigned char ms)
  210. // 描述: 延時(shí)函數(shù)。
  211. // 參數(shù): ms,要延時(shí)的ms數(shù), 這里只支持1~255ms. 自動適應(yīng)主時(shí)鐘.
  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;                           //鎖存輸出數(shù)據(jù)
  236.     P_HC595_RCLK = 1;
  237.     P_HC595_RCLK = 0;                           //鎖存輸出數(shù)據(jù)
  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;   //保存上一次狀態(tài)

  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)   //連續(xù)兩次讀相等
  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;    //計(jì)算鍵碼,17~32
  294.             }
  295.         }
  296.         else    IO_KeyHoldCnt = 0;
  297.     }
  298.     P0 = 0xff;
  299. }



  300. /************* 發(fā)送脈沖函數(shù) **************/
  301. void    IR_TxPulse(u16 pulse)
  302. {
  303.     tx_cnt = pulse;
  304.     B_Space = 0;    //發(fā)脈沖
  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. /************* 發(fā)送空閑函數(shù) **************/
  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. /************* 發(fā)送一個(gè)字節(jié)函數(shù) **************/
  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;    //數(shù)據(jù)1對應(yīng) 1.6875 + 0.5625 ms
  325.         else            IR_TxSpace(21), TxTime++;       //數(shù)據(jù)0對應(yīng) 0.5625 + 0.5625 ms
  326.         IR_TxPulse(21);         //脈沖都是0.5625ms
  327.         dat >>= 1;              //下一個(gè)位
  328.     }
  329. }

  330. //========================================================================
  331. // 函數(shù): void   PCA_config(void)
  332. // 描述: PCA配置函數(shù).
  333. // 參數(shù): 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;    //清除所有中斷標(biāo)志
  341.     CCAPM2  = 0x48+ 1;  //工作模式 + 允許中斷 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  342.     CCAPM2 |= 0x04; //允許高速取反輸出, 一般用在16位軟件定時(shí)器
  343.     PCA_Timer2 = 100;   //隨便給一個(gè)小的初值
  344.     CCAP2L = (u8)PCA_Timer2;            //將影射寄存器寫入捕獲寄存器,先寫CCAPxL
  345.     CCAP2H = (u8)(PCA_Timer2 >> 8); //后寫CCAPxH

  346.     PPCA = 1;   //高優(yōu)先級中斷
  347.     CMOD  = (CMOD  & ~0xe0) | 0x08; //選擇時(shí)鐘源, 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. // 函數(shù): void   PCA_Handler (void) interrupt PCA_VECTOR
  355. // 描述: PCA中斷處理程序.
  356. // 參數(shù): None
  357. // 返回: none.
  358. // 版本: V1.0, 2012-11-22
  359. //========================================================================

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

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

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

謝謝,我試試。
回復(fù)

使用道具 舉報(bào)

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

沒法用這,這個(gè)是什么型號的51呀。。。
怎么還有P5 IO口呀。
回復(fù)

使用道具 舉報(bào)

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

MCU 還是1T的呀。
回復(fù)

使用道具 舉報(bào)

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

#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit IR_OUT = P0^0;                //紅外發(fā)射引腳

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

        //特殊
        TL1=TH1;
       
        ET1=1;
        EA=1;
}
//發(fā)送引導(dǎo)碼  發(fā)送方:9ms高電平 4.5ms低電平
void Send_Start_Bit(void)    //TR1的值=發(fā)送的電平
{
        //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;
}
//發(fā)送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;

}
//發(fā)送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)            //發(fā)送一個(gè)結(jié)束碼,因?yàn)樽詈笠粋(gè)位只有遇到下降沿才能讀取(發(fā)射端的上升沿)
{
//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;  
}
//發(fā)送一字節(jié) 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();
  //發(fā)射引導(dǎo)嗎
        for(i=0;i<8;i++)
        {
                if(j1&1)
                        Send_Bit_1();
                else
                        Send_Bit_0();
                j1=j1>>1;                                                                

                //先發(fā)射低位
        }

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

                //先發(fā)射低位
        }

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

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

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

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

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


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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久综合久久综合久久综合 | 日日骚视频 | 欧美一区二区三区视频 | 成人一区av偷拍 | 超级黄色一级片 | 久精品视频 | 一级h片 | 国产黄色大片在线免费观看 | 91se在线| 免费看黄视频网站 | 成人免费在线小视频 | 91在线观看视频 | 成人免费观看男女羞羞视频 | 国产精品久久久久久 | 久久99视频 | 成人精品国产免费网站 | 国产xxx在线观看 | www精品| 国产精品无码久久久久 | 男女视频免费 | 亚洲国产精品久久久 | 日本精品裸体写真集在线观看 | 欧美一区二区三区久久精品视 | 色婷婷综合网 | 日韩精品在线播放 | 亚洲精选久久 | 国产一区免费 | 久久久久一区 | 国产日韩中文字幕 | 99热电影| 欧美8一10sex性hd | 激情 婷婷| 亚洲 欧美 另类 日韩 | chinese中国真实乱对白 | 国产精品区一区二区三 | 免费在线观看成年人视频 | 欧美精品三区 | 亚洲国产精品久久久久 | 黄色一级网| 91福利网 | 国产免费一区二区 |