找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5209|回复: 1
收起左侧

单片机红外接收程序(串口显示)

[复制链接]
ID:137504 发表于 2016-9-11 22:27 | 显示全部楼层 |阅读模式
0.png

本例程实现51单片机红外解码接收,结果发送到串口,大家可以从51黑电子论坛搜索到串口调试助手来查看红外数据
完整keil工程文件下载:
http://www.51hei.com/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. }
复制代码




回复

使用道具 举报

ID:221482 发表于 2017-7-21 22:49 | 显示全部楼层
强烈支持一下,前来学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表