|
0.png (66.21 KB, 下載次數: 90)
下載附件
2016-9-11 22:25 上傳
本例程實現51單片機紅外解碼接收,結果發送到串口,大家可以從51黑電子論壇搜索到串口調試助手來查看紅外數據
完整keil工程文件下載:
http://www.zg4o1577.cn/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);
- }
復制代碼
|
|