找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5960|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


本例程實(shí)現(xiàn)51單片機(jī)紅外解碼接收,結(jié)果發(fā)送到串口,大家可以從51黑電子論壇搜索到串口調(diào)試助手來查看紅外數(shù)據(jù)
完整keil工程文件下載:
http://www.torrancerestoration.com/bbs/dpj-55490-1.html


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

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

  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");//打印出未進(jìn)行解析的原始紅外NEC數(shù)據(jù)       
  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");//打印出未進(jìn)行解析的原始紅外NEC數(shù)據(jù)       
  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");//打印出未進(jìn)行解析的原始紅外NEC數(shù)據(jù)       
  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. }
復(fù)制代碼

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

  2. uint8_t Dex_Hex_Buffer[Length_Max];//數(shù)據(jù)緩沖區(qū)

  3. /*************************************************************************************
  4. 函數(shù):void Divide_Dex_Hex(uint32_t Num,uint8_t Format)
  5. 功能:數(shù)據(jù)分離,儲存在緩沖中數(shù)組中,低位~高位=[0]~[Length_Max-1],返回數(shù)據(jù)位數(shù)
  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)//把數(shù)據(jù)分離成十進(jìn)制數(shù)
  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)//把數(shù)據(jù)分離成十六進(jìn)制數(shù)
  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;  //十六進(jìn)制返回的位數(shù)強(qiáng)制為偶數(shù)
  44.                 for(i=Num_Cnt-1;i>=0;i--)        //把十六進(jìn)制數(shù)據(jù)處理成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;//返回數(shù)據(jù)十進(jìn)制或十六進(jìn)制位數(shù)
  57. }

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

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

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

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

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

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

  93.         REN = 0;                                                                //發(fā)送過程不接收數(shù)據(jù)
  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. 函數(shù):void UART_SendString(uint8_t *String);
  105. 功能:發(fā)送一個字符串;
  106. *************************************************************************************/
  107. void UART_SendString(uint8_t *String)
  108. {
  109.         while(*String != '\0')
  110.         {
  111.                 UART_SendChar(*String);
  112.                 String++;
  113.          }
  114. }
  115. /*************************************************************************************
  116. 函數(shù):void UART_Printf(uint8_t *String,uint32_t Value,uint8_t Format,uint8_t *String);
  117. 功能:串口以十進(jìn)制或者十六進(jìn)制發(fā)送數(shù)據(jù)(ASII碼數(shù)據(jù),電腦端不需要勾選"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. }
復(fù)制代碼




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

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:221482 發(fā)表于 2017-7-21 22:49 | 只看該作者
強(qiáng)烈支持一下,前來學(xué)習(xí)了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表