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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機紅外接收程序(串口顯示)

[復制鏈接]
跳轉到指定樓層
樓主


本例程實現51單片機紅外解碼接收,結果發送到串口,大家可以從51黑電子論壇搜索到串口調試助手來查看紅外數據
完整keil工程文件下載:
http://www.zg4o1577.cn/bbs/dpj-55490-1.html


下面是部分程序代碼的預覽:
  1. #include "IR_Receive.h"
  2. #include "UART.h"
  3. #include "delay.h"

  4. extern uint8_t  IRcode_Type;//紅外數據類型,RCA或NEC8或NEC16
  5. extern uint16_t IRcode[2];  //紅外數據中的系統碼IRcode[0],紅外數據中的用戶碼IRcode[1]
  6. extern uint32_t RCAcode_Original;//RCA協議原碼       
  7. extern uint32_t NECcode_Original;//NEC原始數據

  8. void main(void)
  9. {
  10.         Time0_INT0_Init();
  11.         UART_Init();
  12.         while(1)
  13.         {
  14.                 if(IRdata_Analysis())//解析成功串口打印正確紅外碼值
  15.                 {
  16.                         switch(IRcode_Type)
  17.                         {
  18.                                 case IRcode_TypeRCA:
  19.                                 {
  20.                                         UART_Printf("RCAcode_Original=",RCAcode_Original,Hex,"\r\n");//打印出未進行解析的原始紅外NEC數據       
  21.                                         UART_SendString("IRcode_Type: RCA\r\n");
  22.                                         UART_Printf("SystemCode=  ",IRcode[0],Hex,"\r\n");
  23.                                         UART_Printf("UserCode=    ",IRcode[1],Hex,"\r\n");
  24.                                         UART_SendString("\r\n");break;
  25.                            }
  26.                                 case IRcode_TypeNEC8:
  27.                                 {
  28.                                         UART_Printf("NECcode_Original=",NECcode_Original,Hex,"\r\n");//打印出未進行解析的原始紅外NEC數據       
  29.                                         UART_SendString("IRcode_Type: NEC-8\r\n");
  30.                                         UART_Printf("SystemCode=  ",IRcode[0],Hex,"\r\n");
  31.                                         UART_Printf("UserCode=    ",IRcode[1],Hex,"\r\n");
  32.                                         UART_SendString("\r\n");break;
  33.                                  }
  34.                                 case IRcode_TypeNEC16:
  35.                                 {
  36.                                         UART_Printf("NECcode_Original=",NECcode_Original,Hex,"\r\n");//打印出未進行解析的原始紅外NEC數據       
  37.                                         UART_SendString("IRcode_Type: NEC-16\r\n");
  38.                                         UART_Printf("SystemCode=  ",IRcode[0],Hex,"\r\n");
  39.                                         UART_Printf("UserCode=    ",IRcode[1],Hex,"\r\n");
  40.                                         UART_SendString("\r\n");break;
  41.                                  }
  42.                                 default:{break;}
  43.                          }       
  44.                  }
  45.    }
  46. }
復制代碼

UART.c
  1. #include "UART.h"

  2. uint8_t Dex_Hex_Buffer[Length_Max];//數據緩沖區

  3. /*************************************************************************************
  4. 函數:void Divide_Dex_Hex(uint32_t Num,uint8_t Format)
  5. 功能:數據分離,儲存在緩沖中數組中,低位~高位=[0]~[Length_Max-1],返回數據位數
  6. *************************************************************************************/
  7. uint8_t Divide_Dex_Hex(uint32_t Num,uint8_t Format)
  8. {
  9.         signed char i=0;
  10.         uint8_t Num_Cnt = 0;

  11.         for(i=0;i<Length_Max;i++) //緩沖清零
  12.         {
  13.                 Dex_Hex_Buffer[i] = 0;
  14.          }

  15.   if(Num == 0)//Num = 0處理
  16.         {
  17.                 Dex_Hex_Buffer[0] += 0x30;//處理成ASIIC碼
  18.                 Dex_Hex_Buffer[1] += 0x30;
  19.                 if(Format == Dex)return 1;
  20.                 if(Format == Hex)return 2;
  21.          }

  22.         else if(Format == Dex)//把數據分離成十進制數
  23.         {
  24.                 i = 0;
  25.                 while(Num)
  26.                 {
  27.                         Dex_Hex_Buffer[i] = Num%10+'0';//處理成ASIIC碼
  28.                         Num /= 10;
  29.                         Num_Cnt++;
  30.                         i++;
  31.                  }       
  32.          }

  33.         else if(Format == Hex)//把數據分離成十六進制數
  34.         {
  35.                 i = 0;
  36.                 while(Num)
  37.                 {
  38.                         Dex_Hex_Buffer[i] = Num%16;
  39.                         Num /= 16;
  40.                         Num_Cnt++;
  41.                         i++;
  42.                  }
  43.                 if(Num_Cnt%2)Num_Cnt+=1;  //十六進制返回的位數強制為偶數
  44.                 for(i=Num_Cnt-1;i>=0;i--)        //把十六進制數據處理成ASIIC碼
  45.                 {
  46.                         if(Dex_Hex_Buffer[i]<10)
  47.                         {
  48.                                  Dex_Hex_Buffer[i] += 0x30;
  49.                          }
  50.                         else
  51.                         {
  52.                                 Dex_Hex_Buffer[i] = Dex_Hex_Buffer[i]-0x0A+0x41;
  53.                          }
  54.                  }
  55.          }

  56.         return Num_Cnt;//返回數據十進制或十六進制位數
  57. }

  58. /*************************************************************************************
  59. 函數:void UART_Init(void);
  60. 功能:對串口進行初始化,串口工作方式1,波特率9600,SMOD = 0;
  61. *************************************************************************************/
  62. void UART_Init(void)
  63. {
  64.         TMOD |= 0x20;
  65.         TH1   = 0xFD;
  66.         TL1   = 0xFD;

  67.         SM0   = 0;   //設置串口工作方式為1
  68.         SM1   = 1;
  69.         REN   = 1;          //允許單片機接收數據

  70.         TR1   = 1;
  71.         ES    = 1;
  72.         EA    = 1;
  73. }

  74. /*************************************************************************************
  75. 函數:void UART_SendChar(char ch);
  76. 功能:發送一個字符;
  77. *************************************************************************************/
  78. void UART_SendChar(char ch)
  79. {
  80.         REN = 0;        //發送過程不接收數據

  81.         SBUF= ch;
  82.         while(!TI);
  83.         TI  = 0;

  84.         REN = 1;
  85. }
  86. /*************************************************************************************
  87. 函數:void UART_SendHex(uint8_t *pTx_Buffer,uint8_t Length);
  88. 功能:發送一個十六進制數組數據,電腦端勾選“Hex顯示”;
  89. *************************************************************************************/
  90. void UART_SendHex(uint8_t *pTx_Buffer,uint8_t Length)
  91. {
  92.         uint8_t i=0;

  93.         REN = 0;                                                                //發送過程不接收數據
  94.         for(i=0;i<Length;i++)
  95.         {
  96.                 SBUF = *pTx_Buffer;
  97.                 while(!TI);
  98.                 TI   = 0;
  99.                 pTx_Buffer++;
  100.          }
  101.         REN = 1;
  102. }
  103. /*************************************************************************************
  104. 函數:void UART_SendString(uint8_t *String);
  105. 功能:發送一個字符串;
  106. *************************************************************************************/
  107. void UART_SendString(uint8_t *String)
  108. {
  109.         while(*String != '\0')
  110.         {
  111.                 UART_SendChar(*String);
  112.                 String++;
  113.          }
  114. }
  115. /*************************************************************************************
  116. 函數:void UART_Printf(uint8_t *String,uint32_t Value,uint8_t Format,uint8_t *String);
  117. 功能:串口以十進制或者十六進制發送數據(ASII碼數據,電腦端不需要勾選"Hex顯示");
  118. *************************************************************************************/
  119. void UART_Printf(uint8_t *String1,uint32_t Value,uint8_t Format,uint8_t *String2)
  120. {
  121.         uint8_t i;
  122.         uint8_t Num_Cnt = 0;

  123.         Num_Cnt = Divide_Dex_Hex(Value,Format);

  124.         UART_SendString(String1);
  125.         if(Format==Hex)UART_SendString("0x");//

  126.         for(i=0;i<Num_Cnt;i++)
  127.         {
  128.                 UART_SendChar(Dex_Hex_Buffer[(Num_Cnt-1)-i]);
  129.          }
  130.          
  131.         UART_SendString(String2);
  132. }
復制代碼




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

使用道具 舉報

沙發
ID:221482 發表于 2017-7-21 22:49 | 只看該作者
強烈支持一下,前來學習了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91色网站| 在线观看视频91 | 本道综合精品 | 亚洲av毛片 | 91成人在线| 久草网站 | 免费毛片网站在线观看 | 国产99久久精品一区二区永久免费 | 免费在线观看一级毛片 | 91视视频在线观看入口直接观看 | 成人依人| 欧美伊人久久久久久久久影院 | 国产精品久久久精品 | 国产激情福利 | 一区影院 | 亚洲精品一区二区三区 | 一区二区三区高清在线观看 | 国产精品久久 | av先锋资源 | 久久久亚洲综合 | 久久99精品久久久久久国产越南 | 久久亚洲精品久久国产一区二区 | 亚洲视频在线观看 | 中文字幕av在线 | 91美女在线观看 | 日日干夜夜操 | 精品久久一区 | 国产精品视频一区二区三区不卡 | 神马久久久久久久久久 | 久久久久国产一区二区三区 | 国产精品一区二区在线 | 国产精彩视频在线观看 | 亚洲色图在线观看 | 国产一区二区在线看 | 精品国产乱码 | 精品欧美一区二区久久久伦 | 天堂一区二区三区 | 亚洲欧美激情国产综合久久久 | 福利一区视频 | 九色在线视频 | 国产精品成人品 |