|
基于免費申請的STM32F072B_DISCOVERY開(kāi)發(fā)板 對常用飛利浦RC-5(SAA3010)協(xié)議紅外遙控器解碼的測試,附源碼供有需要的朋友參考。
SAA3010是使用RC-5編碼,有2位起始位、1位控制位、系統碼占5位、指令碼占6位, 一幀數據共占14位。其控制位每按一次
按鍵便會(huì )翻轉一次,在編制發(fā)射程序的時(shí)候一定要注意。
電路連接很簡(jiǎn)單說(shuō)明如下。
腳連接說(shuō)明:
1、串口使用STM32F072B_DISCOVERY開(kāi)發(fā)板的USART1,管腳接PA9(TX)、PA10(RX)。
2、一體化紅外接收頭數據輸出端連接STM32F072B_DISCOVERY開(kāi)發(fā)板的PA8管腳。
功能說(shuō)明:
紅外遙控器的發(fā)射信號經(jīng)一體化紅外接收頭數據端輸出,由STM32F072B_DISCOVERY開(kāi)發(fā)板的PA8端口采樣(PA8配置為外部中斷下降沿觸發(fā)),由SysTick系統滴答定時(shí)器延時(shí)每20us采集一次,通過(guò)計數的方式得到一幀的所有低電平時(shí)間、高電平時(shí)間。通過(guò)對高、低電平時(shí)間的長(cháng)短分析得出數據碼IrDA_receive_Code,使用printf語(yǔ)句由《串口調試助手》顯示RC-5紅外編碼格式的14位編碼。
系統上電后LED3(紅色)閃爍,已說(shuō)明接收系統正在運行中。按遙控按鍵,LED4(橙色)點(diǎn)亮,說(shuō)明已進(jìn)入中斷解碼,解碼完成后LED4(橙色)熄滅。
中斷函數如下(其他部分與NEC解碼基本相同。請參閱
STM32F072B_DISCOVERY開(kāi)發(fā)板NEC紅外編碼格式解碼程序源碼
http://selenalain.com/thread-127802-1-1.html)
- //////////PA8外部中斷函數//////////////////////////////////////////////////////////////
- void EXTI4_15_IRQHandler(void)
- {
- u8 Data;
- u8 flag=0; //進(jìn)入低電平時(shí)間為1.688ms(TimL>=75 && TimL<=90)標志:flag=1
- if(EXTI_GetITStatus(EXTI_Line8) != RESET)
- {
- /* Toggle LED4 */
- GPIO_SetBits(GPIOC, GPIO_Pin_8);
- TimL=IrDA_receive_timeL();//獲得第一個(gè)低電平時(shí)間
- TimH=IrDA_receive_timeH();//獲得第一個(gè)高電平時(shí)間
-
- if(TimL>=35 && TimL<49 && TimH>=35 && TimH<49) //TimL、TimH:0.7ms--0.98ms(標準:0.844ms)
- {
- IrDA_receive_Code=1; //RC-5編碼判斷低電平獲得數據,第一位起始碼為1
- while(1)
- {
- if(IrDA_IN==0)
- {
- TimL=IrDA_receive_timeL();//獲得此次低電平時(shí)間
- /******************************************************************************/
- //RC-5編碼一位數據:“1”接收為:先高電平0.844ms+低電平0.844ms
- //RC-5編碼一位數據:“0”接收為:先低電平0.844ms+高電平0.844ms
- //如果接收的低電平為1.688ms,則說(shuō)明接收了一個(gè)高電平和一個(gè)低電平,即數據位2
- //只有前次低電平時(shí)間為1.688ms(TimL>=75 && TimL<=90),后面的短的低電平為“0”,其他情況均為“1”
- /******************************************************************************/
- if(TimL>=35 && TimL<=49) //0.7ms--0.98ms(標準:0.844ms)
- {
- if(flag==1)
- {
- Data=0;//收到數據 0
- IrDA_receive_Code<<=1;
- IrDA_receive_Code+=Data;
- }
- else
- {
- Data=1;//收到數據 1
- IrDA_receive_Code<<=1;
- IrDA_receive_Code+=Data;
- }
- }
- else if(TimL>=75 && TimL<=90) //1.5ms--1.8ms(標準:1.688ms)
- {
- flag=1;
- Data=2;//收到兩位數據1和0,即 2
- IrDA_receive_Code<<=2; //數據碼左移2位
- IrDA_receive_Code+=Data;
- }
- else //信號異常(可能是干擾)
- {
- printf("紅外編碼接收異常,請重按遙控按鍵 TIMEL=%d\r\n",TimL);
- break;
- }
- }
- if(IrDA_IN==1)
- {
- TimH=IrDA_receive_timeH();//獲得此高低電平時(shí)間
- if(TimH>=75 && TimH<=90) flag=0;
- if(TimH>=1800) //末位高電平時(shí)間超過(guò)36ms說(shuō)明解碼完成,退出解碼循環(huán)
- {
- IrDA_receive_flag=1;
- // printf("接收RC-5編碼為 :%X\r\n",IrDA_receive_Code);
- break;
- }
- }
- }
- }
- else
- {
- printf("非RC-5編碼\r\n");
- }
- }
- delay_ms(500);//延時(shí)-防止按鍵時(shí)間過(guò)長(cháng),再次進(jìn)入中斷
- GPIO_ResetBits(GPIOC, GPIO_Pin_8);
- // EXTI->PR=1<<8; //清除LINE8上的中斷標志位
- /* Clear the EXTI line 8 pending bit */
- EXTI_ClearITPendingBit(EXTI_Line8);
- // EXTI->IMR&=0XFFFFFEFF;;// 關(guān)閉line8 BITx上的中斷(此為紅外中斷)
- }
復制代碼
系統時(shí)鐘配置:
采用內部HSI(8Mhz)作為時(shí)鐘源,經(jīng)PLL6倍頻到48Mhz輸出。AHB clock = SYSCLK、APB clock = HCLK
注:如不配置,采用系統默認的HSI(8Mhz)時(shí)鐘,由于指令周期長(cháng)了(指令周期占用時(shí)間長(cháng))采集出的時(shí)間與實(shí)際偏差較大。
附件: 使用MDK-ARM 5.10編譯
RC5紅外解碼.rar
(1.93 MB)
2014-3-17 23:44 上傳
點(diǎn)擊文件名下載附件
飛利浦RC-5協(xié)議紅外遙控器解碼程序 下載積分: 積分 -1
|
|