|
本例程实现51单片机红外解码接收,结果发送到串口,大家可以从51黑电子论坛搜索到串口调试助手来查看红外数据
完整keil工程文件下载:
http://www.51hei.com/bbs/dpj-55490-1.html
下面是部分程序代码的预览:
- #include "IR_Receive.h"
- #include "UART.h"
- #include "delay.h"
- extern uint8_t IRcode_Type;//红外数据类型,RCA或NEC8或NEC16
- extern uint16_t IRcode[2]; //红外数据中的系统码IRcode[0],红外数据中的用户码IRcode[1]
- extern uint32_t RCAcode_Original;//RCA协议原码
- extern uint32_t NECcode_Original;//NEC原始数据
- void main(void)
- {
- Time0_INT0_Init();
- UART_Init();
- while(1)
- {
- if(IRdata_Analysis())//解析成功串口打印正确红外码值
- {
- switch(IRcode_Type)
- {
- case IRcode_TypeRCA:
- {
- UART_Printf("RCAcode_Original=",RCAcode_Original,Hex,"\r\n");//打印出未进行解析的原始红外NEC数据
- UART_SendString("IRcode_Type: RCA\r\n");
- UART_Printf("SystemCode= ",IRcode[0],Hex,"\r\n");
- UART_Printf("UserCode= ",IRcode[1],Hex,"\r\n");
- UART_SendString("\r\n");break;
- }
- case IRcode_TypeNEC8:
- {
- UART_Printf("NECcode_Original=",NECcode_Original,Hex,"\r\n");//打印出未进行解析的原始红外NEC数据
- UART_SendString("IRcode_Type: NEC-8\r\n");
- UART_Printf("SystemCode= ",IRcode[0],Hex,"\r\n");
- UART_Printf("UserCode= ",IRcode[1],Hex,"\r\n");
- UART_SendString("\r\n");break;
- }
- case IRcode_TypeNEC16:
- {
- UART_Printf("NECcode_Original=",NECcode_Original,Hex,"\r\n");//打印出未进行解析的原始红外NEC数据
- UART_SendString("IRcode_Type: NEC-16\r\n");
- UART_Printf("SystemCode= ",IRcode[0],Hex,"\r\n");
- UART_Printf("UserCode= ",IRcode[1],Hex,"\r\n");
- UART_SendString("\r\n");break;
- }
- default:{break;}
- }
- }
- }
- }
复制代码
UART.c
- #include "UART.h"
- uint8_t Dex_Hex_Buffer[Length_Max];//数据缓冲区
- /*************************************************************************************
- 函数:void Divide_Dex_Hex(uint32_t Num,uint8_t Format)
- 功能:数据分离,储存在缓冲中数组中,低位~高位=[0]~[Length_Max-1],返回数据位数
- *************************************************************************************/
- uint8_t Divide_Dex_Hex(uint32_t Num,uint8_t Format)
- {
- signed char i=0;
- uint8_t Num_Cnt = 0;
- for(i=0;i<Length_Max;i++) //缓冲清零
- {
- Dex_Hex_Buffer[i] = 0;
- }
- if(Num == 0)//Num = 0处理
- {
- Dex_Hex_Buffer[0] += 0x30;//处理成ASIIC码
- Dex_Hex_Buffer[1] += 0x30;
- if(Format == Dex)return 1;
- if(Format == Hex)return 2;
- }
- else if(Format == Dex)//把数据分离成十进制数
- {
- i = 0;
- while(Num)
- {
- Dex_Hex_Buffer[i] = Num%10+'0';//处理成ASIIC码
- Num /= 10;
- Num_Cnt++;
- i++;
- }
- }
- else if(Format == Hex)//把数据分离成十六进制数
- {
- i = 0;
- while(Num)
- {
- Dex_Hex_Buffer[i] = Num%16;
- Num /= 16;
- Num_Cnt++;
- i++;
- }
- if(Num_Cnt%2)Num_Cnt+=1; //十六进制返回的位数强制为偶数
- for(i=Num_Cnt-1;i>=0;i--) //把十六进制数据处理成ASIIC码
- {
- if(Dex_Hex_Buffer[i]<10)
- {
- Dex_Hex_Buffer[i] += 0x30;
- }
- else
- {
- Dex_Hex_Buffer[i] = Dex_Hex_Buffer[i]-0x0A+0x41;
- }
- }
- }
- return Num_Cnt;//返回数据十进制或十六进制位数
- }
- /*************************************************************************************
- 函数:void UART_Init(void);
- 功能:对串口进行初始化,串口工作方式1,波特率9600,SMOD = 0;
- *************************************************************************************/
- void UART_Init(void)
- {
- TMOD |= 0x20;
- TH1 = 0xFD;
- TL1 = 0xFD;
- SM0 = 0; //设置串口工作方式为1
- SM1 = 1;
- REN = 1; //允许单片机接收数据
- TR1 = 1;
- ES = 1;
- EA = 1;
- }
- /*************************************************************************************
- 函数:void UART_SendChar(char ch);
- 功能:发送一个字符;
- *************************************************************************************/
- void UART_SendChar(char ch)
- {
- REN = 0; //发送过程不接收数据
- SBUF= ch;
- while(!TI);
- TI = 0;
- REN = 1;
- }
- /*************************************************************************************
- 函数:void UART_SendHex(uint8_t *pTx_Buffer,uint8_t Length);
- 功能:发送一个十六进制数组数据,电脑端勾选“Hex显示”;
- *************************************************************************************/
- void UART_SendHex(uint8_t *pTx_Buffer,uint8_t Length)
- {
- uint8_t i=0;
- REN = 0; //发送过程不接收数据
- for(i=0;i<Length;i++)
- {
- SBUF = *pTx_Buffer;
- while(!TI);
- TI = 0;
- pTx_Buffer++;
- }
- REN = 1;
- }
- /*************************************************************************************
- 函数:void UART_SendString(uint8_t *String);
- 功能:发送一个字符串;
- *************************************************************************************/
- void UART_SendString(uint8_t *String)
- {
- while(*String != '\0')
- {
- UART_SendChar(*String);
- String++;
- }
- }
- /*************************************************************************************
- 函数:void UART_Printf(uint8_t *String,uint32_t Value,uint8_t Format,uint8_t *String);
- 功能:串口以十进制或者十六进制发送数据(ASII码数据,电脑端不需要勾选"Hex显示");
- *************************************************************************************/
- void UART_Printf(uint8_t *String1,uint32_t Value,uint8_t Format,uint8_t *String2)
- {
- uint8_t i;
- uint8_t Num_Cnt = 0;
- Num_Cnt = Divide_Dex_Hex(Value,Format);
- UART_SendString(String1);
- if(Format==Hex)UART_SendString("0x");//
- for(i=0;i<Num_Cnt;i++)
- {
- UART_SendChar(Dex_Hex_Buffer[(Num_Cnt-1)-i]);
- }
-
- UART_SendString(String2);
- }
复制代码
|
|