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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10234|回復: 9
打印 上一主題 下一主題
收起左側

STC15單片機只用一個定時器的紅外接收程序

  [復制鏈接]
跳轉到指定樓層
樓主
紅外線
紅外接收程序,請測試。
紅外接收輸入可以定義在任何IO。
串口使用9600,N,8,1來監控。
主頻適應5~36MHZ。



  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* If you want to use the program or the program referenced in the  */
  4. /* article, please specify in which data and procedures from STC    */
  5. /*------------------------------------------------------------------*/


  6. /*************        功能說明        **************

  7. 紅外接收程序。適用于市場上用量最大的HT6121/6122及其兼容IC的編碼。

  8. 對于用戶碼與User_code定義不同的遙控器,程序會將用戶碼一起從串口輸出。

  9. 使用模擬串口發送監控顯示編碼,顯示內容為ASCII碼和中文。

  10. 本接收程序基于狀態機的方式,占用CPU的時間非常少。

  11. HEX文件在本目錄的/list里面。

  12. ******************************************/


  13. /*************        用戶系統配置        **************/

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

  15. #define D_TIMER0                125                        //選擇定時器時間, us, 紅外接收要求在60us~250us之間

  16. #define        User_code                0xFD02                //定義紅外接收用戶碼


  17. /*************        以下宏定義用戶請勿修改        **************/
  18. #include        "reg51.H"
  19. #define        uchar        unsigned char
  20. #define uint        unsigned int

  21. #define freq_base                        (MAIN_Fosc / 1200)
  22. #define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 10000))




  23. /*************        本地常量聲明        **************/



  24. /*************        本地變量聲明        **************/
  25. sbit        P_TXD1 = P3^1;                //定義模擬串口發送腳,打印信息用
  26. sbit        P_IR_RX = P0^1;                //定義紅外接收輸入端口

  27. bit                P_IR_RX_temp;                //Last sample
  28. bit                B_IR_Sync;                        //已收到同步標志
  29. uchar        IR_SampleCnt;                //采樣計數
  30. uchar        IR_BitCnt;                        //編碼位數
  31. uchar        IR_UserH;                        //用戶碼(地址)高字節
  32. uchar        IR_UserL;                        //用戶碼(地址)低字節
  33. uchar        IR_data;                        //數據原碼
  34. uchar        IR_DataShit;                //數據反碼

  35. bit                B_IrUserErr;                //User code error flag
  36. bit                B_IR_Press;                        //Key press flag,include repeat key.
  37. uchar        IR_code;                        //IR code        紅外鍵碼


  38. /*************        本地函數聲明        **************/
  39. void        Tx1Send(uchar dat);
  40. uchar        HEX2ASCII(uchar dat);
  41. void        InitTimer(void);
  42. void        PrintString(unsigned char code *puts);



  43. /*************  外部函數和變量聲明 *****************/



  44. /********************* 主函數 *************************/
  45. void main(void)
  46. {
  47.         InitTimer();                //初始化Timer
  48.         
  49.         PrintString("****** STC系列MCU紅外接收程序 2010-12-10 ******\r\n");        //上電后串口發送一條提示信息

  50.         while(1)
  51.         {
  52.                 if(B_IR_Press)                //有IR鍵按下
  53.                 {
  54.                         PrintString("紅外碼: 0x");                        //提示紅外鍵碼
  55.                         Tx1Send(HEX2ASCII(IR_code >> 4));        //鍵碼高半字節
  56.                         Tx1Send(HEX2ASCII(IR_code));                //鍵碼低半字節
  57.                         if(B_IrUserErr)                                                //用戶碼錯誤,則發送用戶碼
  58.                         {
  59.                                 Tx1Send(' ');                                        //發空格
  60.                                 Tx1Send(' ');                                        //發空格
  61.                                 PrintString("用戶碼: 0x");                //提示用戶碼
  62.                                 Tx1Send(HEX2ASCII(IR_UserH >> 4));        //用戶碼高字節的高半字節
  63.                                 Tx1Send(HEX2ASCII(IR_UserH));                //用戶碼高字節的低半字節
  64.                                 Tx1Send(HEX2ASCII(IR_UserL >> 4));        //用戶碼低字節的高半字節
  65.                                 Tx1Send(HEX2ASCII(IR_UserL));                //用戶碼低字節的低半字節
  66.                         }
  67.                         Tx1Send(0x0d);                //發回車
  68.                         Tx1Send(0x0a);                //發回車
  69.                         B_IR_Press = 0;                //清除IR鍵按下標志
  70.                 }
  71.         }
  72. }


  73. /********************* 十六進制轉ASCII函數 *************************/
  74. uchar        HEX2ASCII(uchar dat)
  75. {
  76.         dat &= 0x0f;
  77.         if(dat <= 9)        return (dat + '0');        //數字0~9
  78.         return (dat - 10 + 'A');                        //字母A~F
  79. }




  80. //*******************************************************************
  81. //*********************** IR Remote Module **************************

  82. //*********************** IR Remote Module **************************
  83. //this programme is used for Receive IR Remote (HT6121).

  84. //data format: Synchro,AddressH,AddressL,data,/data, (total 32 bit).

  85. //send a frame(85ms), pause 23ms, send synchro of another frame, pause 94ms

  86. //data rate: 108ms/Frame


  87. //Synchro:low=9ms,high=4.5/2.25ms,low=0.5626ms
  88. //Bit0:high=0.5626ms,low=0.5626ms
  89. //Bit1:high=1.6879ms,low=0.5626ms
  90. //frame space = 23 ms or 96 ms

  91. /******************** 紅外采樣時間宏定義, 用戶不要隨意修改        *******************/

  92. #if ((D_TIMER0 <= 250) && (D_TIMER0 >= 60))
  93.         #define        D_IR_sample                        D_TIMER0                //定義采樣時間,在60us~250us之間
  94. #endif

  95. #define D_IR_SYNC_MAX                (15000/D_IR_sample)        //SYNC max time
  96. #define D_IR_SYNC_MIN                (9700 /D_IR_sample)        //SYNC min time
  97. #define D_IR_SYNC_DIVIDE        (12375/D_IR_sample)        //decide data 0 or 1
  98. #define D_IR_DATA_MAX                (3000 /D_IR_sample)        //data max time
  99. #define D_IR_DATA_MIN                (600  /D_IR_sample)        //data min time
  100. #define D_IR_DATA_DIVIDE        (1687 /D_IR_sample)        //decide data 0 or 1
  101. #define D_IR_BIT_NUMBER                32                                        //bit number

  102. //*******************************************************************************************
  103. //**************************** IR RECEIVE MODULE ********************************************

  104. void IR_RX_HT6121(void)
  105. {
  106.         uchar        SampleTime;

  107.         IR_SampleCnt++;                                                        //Sample + 1

  108.         F0 = P_IR_RX_temp;                                                //Save Last sample status
  109.         P_IR_RX_temp = P_IR_RX;                                        //Read current status
  110.         if(F0 && !P_IR_RX_temp)                                        //Last sample is high,and current sample is low, so is fall edge
  111.         {
  112.                 SampleTime = IR_SampleCnt;                        //get the sample time
  113.                 IR_SampleCnt = 0;                                        //Clear the sample counter

  114.                          if(SampleTime > D_IR_SYNC_MAX)                B_IR_Sync = 0;        //large the Maxim SYNC time, then error
  115.                 else if(SampleTime >= D_IR_SYNC_MIN)                                        //SYNC
  116.                 {
  117.                         if(SampleTime >= D_IR_SYNC_DIVIDE)
  118.                         {
  119.                                 B_IR_Sync = 1;                                        //has received SYNC
  120.                                 IR_BitCnt = D_IR_BIT_NUMBER;        //Load bit number
  121.                         }
  122.                 }
  123.                 else if(B_IR_Sync)                                                //has received SYNC
  124.                 {
  125.                         if(SampleTime > D_IR_DATA_MAX)                B_IR_Sync=0;        //data samlpe time to large
  126.                         else
  127.                         {
  128.                                 IR_DataShit >>= 1;                                        //data shift right 1 bit
  129.                                 if(SampleTime >= D_IR_DATA_DIVIDE)        IR_DataShit |= 0x80;        //devide data 0 or 1
  130.                                 if(--IR_BitCnt == 0)                                //bit number is over?
  131.                                 {
  132.                                         B_IR_Sync = 0;                                        //Clear SYNC
  133.                                         if(~IR_DataShit == IR_data)                //判斷數據正反碼
  134.                                         {
  135.                                                 if((IR_UserH == (User_code / 256)) &&
  136.                                                         IR_UserL == (User_code % 256))
  137.                                                                 B_IrUserErr = 0;        //User code is righe
  138.                                                 else        B_IrUserErr = 1;        //user code is wrong
  139.                                                         
  140.                                                 IR_code      = IR_data;
  141.                                                 B_IR_Press   = 1;                        //數據有效
  142.                                         }
  143.                                 }
  144.                                 else if((IR_BitCnt & 7)== 0)                //one byte receive
  145.                                 {
  146.                                         IR_UserL = IR_UserH;                        //Save the User code high byte
  147.                                         IR_UserH = IR_data;                                //Save the User code low byte
  148.                                         IR_data  = IR_DataShit;                        //Save the IR data byte
  149.                                 }
  150.                         }
  151.                 }
  152.         }
  153. }


  154. /**************** Timer初始化函數 ******************************/
  155. void InitTimer(void)
  156. {
  157.         TMOD = 0;                //for STC15Fxxx系列        Timer0 as 16bit reload timer.
  158.         TH0 = Timer0_Reload / 256;
  159.         TL0 = Timer0_Reload % 256;
  160.         ET0 = 1;
  161.         TR0 = 1;

  162.         EA  = 1;
  163. }


  164. /********************** Timer0中斷函數************************/
  165. void timer0 (void) interrupt 1
  166. {
  167.         IR_RX_HT6121();
  168. }


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

  170. void        BitTime(void)        //位時間函數
  171. {
  172.         uint i;
  173.         i = ((MAIN_Fosc / 100) * 104) / 140000 - 1;                //根據主時鐘來計算位時間
  174.         while(--i);
  175. }

  176. //模擬串口發送
  177. void        Tx1Send(uchar dat)                //9600,N,8,1                發送一個字節
  178. {
  179.         uchar        i;
  180.         EA = 0;
  181.         P_TXD1 = 0;
  182.         BitTime();
  183.         for(i=0; i<8; i++)
  184.         {
  185.                 if(dat & 1)                P_TXD1 = 1;
  186.                 else                        P_TXD1 = 0;
  187.                 dat >>= 1;
  188.                 BitTime();
  189.         }
  190.         P_TXD1 = 1;
  191.         EA = 1;
  192.         BitTime();
  193.         BitTime();
  194. }

  195. void PrintString(unsigned char code *puts)                //發送一串字符串
  196. {
  197.     for (; *puts != 0;        puts++)  Tx1Send(*puts);         //遇到停止符0結束
  198. }
復制代碼


STC15系列只用一個定時器的紅外接收程序.rar

9.51 KB, 下載次數: 119, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

來自 2#
ID:67274 發表于 2020-3-29 02:47 | 只看該作者
這個程序定時器時間溢出計算有個不嚴謹寫法,初學者可能會暈。
#define freq_base                        (FOSC  / 1200)
#define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 10000))
應該是

#define freq_base                        (FOSC  / 12)
#define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 1000000))
回復

使用道具 舉報

板凳
ID:597505 發表于 2019-8-8 12:56 | 只看該作者
請問這個程序, 如何判斷重復碼??  

比如按音量加 , 這個程序只能按一次加一次, , 正常應該是按住, 音量一直加 才正確.
回復

使用道具 舉報

地板
ID:694878 發表于 2020-2-19 22:55 | 只看該作者
學習了,謝謝!
回復

使用道具 舉報

5#
ID:695423 發表于 2020-2-20 07:25 | 只看該作者
真好,多么詳細的說明
回復

使用道具 舉報

6#
ID:67274 發表于 2020-3-28 01:11 | 只看該作者
好巧妙的模擬串口。
回復

使用道具 舉報

7#
ID:27916 發表于 2020-3-28 08:20 | 只看該作者
贊贊


回復

使用道具 舉報

8#
ID:685070 發表于 2020-3-29 08:58 | 只看該作者
學習了 謝謝
回復

使用道具 舉報

9#
ID:272612 發表于 2020-5-17 01:12 | 只看該作者
學習了 謝謝
回復

使用道具 舉報

10#
ID:746849 發表于 2020-5-17 13:35 | 只看該作者
學習了,頂了,希望出更精彩的教程
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波多野结衣av中文字幕 | 在线不卡av| 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 亚洲精品91 | 色网在线观看 | 久久精品a| 国产精品资源在线观看 | 久久在线免费 | 久久精品99久久 | 99成人在线视频 | 成人超碰 | 能看的av| av在线影院| 日韩在线免费播放 | 久久免费精品视频 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 欧美成人aaa级毛片在线视频 | 亚洲综合婷婷 | 国产高清一区二区三区 | 全免费a级毛片免费看视频免费下 | 国产精品99久久久久久宅男 | 国产欧美一区二区三区在线看 | 丁香五月缴情综合网 | 午夜免费视频 | 日韩一二三区视频 | 国产在线精品一区二区三区 | 金莲网 | 久久一级| 色爱综合 | 亚洲综合一区二区三区 | 国产精品国产三级国产a | 中文字幕av亚洲精品一部二部 | 欧美一区二区三区在线视频 | 成人国产午夜在线观看 | 日韩在线免费视频 | 日韩免费视频一区二区 | av网站免费在线观看 | 色爱综合网 | 中文字幕在线播放第一页 | 狠狠爱综合 | 免费在线观看成人 |