<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x
    查看: 23391|回復: 12
    打印 上一主題 下一主題

    STM32F072B_DISCOVERY開發板飛利浦RC-5(SAA3010)協議紅外遙控器解碼源程序

    [復制鏈接]
    跳轉到指定樓層
    樓主
    發表于 2014-3-17 23:53:40 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
          基于免費申請的STM32F072B_DISCOVERY開發板 對常用飛利浦RC-5(SAA3010)協議紅外遙控器解碼的測試,附源碼供有需要的朋友參考。
    SAA3010是使用RC-5編碼,有2位起始位、1位控制位、系統碼占5位、指令碼占6位, 一幀數據共占14位。其控制位每按一次
    按鍵便會翻轉一次,在編制發射程序的時候一定要注意。
    電路連接很簡單說明如下。
    腳連接說明:
    1、串口使用STM32F072B_DISCOVERY開發板的USART1,管腳接PA9(TX)、PA10(RX)。
    2、一體化紅外接收頭數據輸出端連接STM32F072B_DISCOVERY開發板的PA8管腳。

    功能說明:
           紅外遙控器的發射信號經一體化紅外接收頭數據端輸出,由STM32F072B_DISCOVERY開發板的PA8端口采樣(PA8配置為外部中斷下降沿觸發),由SysTick系統滴答定時器延時每20us采集一次,通過計數的方式得到一幀的所有低電平時間、高電平時間。通過對高、低電平時間的長短分析得出數據碼IrDA_receive_Code,使用printf語句由《串口調試助手》顯示RC-5紅外編碼格式的14位編碼。
           系統上電后LED3(紅色)閃爍,已說明接收系統正在運行中。按遙控按鍵,LED4(橙色)點亮,說明已進入中斷解碼,解碼完成后LED4(橙色)熄滅。
    中斷函數如下(其他部分與NEC解碼基本相同。請參閱
    STM32F072B_DISCOVERY開發板NEC紅外編碼格式解碼程序源碼
    http://www.portaltwn.com/thread-127802-1-1.html
    1. //////////PA8外部中斷函數//////////////////////////////////////////////////////////////
    2. void EXTI4_15_IRQHandler(void)
    3. {
    4.         u8 Data;
    5.         u8 flag=0;                  //進入低電平時間為1.688ms(TimL>=75 && TimL<=90)標志:flag=1

    6.         if(EXTI_GetITStatus(EXTI_Line8) != RESET)
    7.   {
    8.     /* Toggle LED4 */
    9.     GPIO_SetBits(GPIOC, GPIO_Pin_8);
    10.                 TimL=IrDA_receive_timeL();//獲得第一個低電平時間
    11.                 TimH=IrDA_receive_timeH();//獲得第一個高電平時間
    12.                
    13.                 if(TimL>=35 && TimL<49 && TimH>=35 && TimH<49)        //TimL、TimH:0.7ms--0.98ms(標準:0.844ms)
    14.                 {
    15.                         IrDA_receive_Code=1;        //RC-5編碼判斷低電平獲得數據,第一位起始碼為1                                       
    16.                         while(1)                                          
    17.                         {
    18.                                 if(IrDA_IN==0)
    19.                                 {
    20.                                         TimL=IrDA_receive_timeL();//獲得此次低電平時間
    21. /******************************************************************************/                                       
    22.                 //RC-5編碼一位數據:“1”接收為:先高電平0.844ms+低電平0.844ms
    23.                 //RC-5編碼一位數據:“0”接收為:先低電平0.844ms+高電平0.844ms
    24.                 //如果接收的低電平為1.688ms,則說明接收了一個高電平和一個低電平,即數據位2
    25.                 //只有前次低電平時間為1.688ms(TimL>=75 && TimL<=90),后面的短的低電平為“0”,其他情況均為“1”
    26. /******************************************************************************/
    27.                                         if(TimL>=35 && TimL<=49)        //0.7ms--0.98ms(標準:0.844ms)
    28.                                         {
    29.                                                 if(flag==1)
    30.                                                 {
    31.                                                         Data=0;//收到數據 0
    32.                                                         IrDA_receive_Code<<=1;
    33.                                                         IrDA_receive_Code+=Data;                                
    34.                                                 }
    35.                                                 else
    36.                                                 {
    37.                                                         Data=1;//收到數據 1
    38.                                                         IrDA_receive_Code<<=1;
    39.                                                         IrDA_receive_Code+=Data;
    40.                                                 }
    41.                                         }
    42.                                         else if(TimL>=75 && TimL<=90) //1.5ms--1.8ms(標準:1.688ms)
    43.                                         {
    44.                                                 flag=1;
    45.                                                 Data=2;//收到兩位數據1和0,即 2
    46.                                                 IrDA_receive_Code<<=2;          //數據碼左移2位
    47.                                                 IrDA_receive_Code+=Data;
    48.                                         }
    49.                                         else                        //信號異常(可能是干擾)
    50.                                         {
    51.                                                 printf("紅外編碼接收異常,請重按遙控按鍵 TIMEL=%d\r\n",TimL);
    52.                                                 break;
    53.                                         }               

    54.                                 }
    55.                                 if(IrDA_IN==1)
    56.                                 {
    57.                                         TimH=IrDA_receive_timeH();//獲得此高低電平時間
    58.                                         if(TimH>=75 && TimH<=90) flag=0;                                 
    59.                                         if(TimH>=1800)        //末位高電平時間超過36ms說明解碼完成,退出解碼循環
    60.                                         {

    61.                                                 IrDA_receive_flag=1;
    62. //                                                printf("接收RC-5編碼為   :%X\r\n",IrDA_receive_Code);
    63.                                                 break;
    64.                                         }
    65.                                 }                                
    66.                         }               
    67.                 }
    68.                 else
    69.                 {
    70.                         printf("非RC-5編碼\r\n");
    71.                 }
    72.         }
    73.         delay_ms(500);//延時-防止按鍵時間過長,再次進入中斷
    74.         GPIO_ResetBits(GPIOC, GPIO_Pin_8);
    75. //         EXTI->PR=1<<8;  //清除LINE8上的中斷標志位
    76.         /* Clear the EXTI line 8 pending bit */
    77.         EXTI_ClearITPendingBit(EXTI_Line8);
    78. //        EXTI->IMR&=0XFFFFFEFF;;//  關閉line8 BITx上的中斷(此為紅外中斷)
    79. }
    復制代碼

    系統時鐘配置:
    采用內部HSI(8Mhz)作為時鐘源,經PLL6倍頻到48Mhz輸出。AHB clock = SYSCLK、APB clock = HCLK
    注:如不配置,采用系統默認的HSI(8Mhz)時鐘,由于指令周期長了(指令周期占用時間長)采集出的時間與實際偏差較大。

    附件: 使用MDK-ARM 5.10編譯
    RC5紅外解碼.rar (1.93 MB)


    沙發
    發表于 2014-3-18 10:39:41 | 只看該作者
    感謝分享啊,好東西。。。!
    板凳
    發表于 2014-3-20 12:22:27 | 只看該作者
    感謝分享
    地板
    發表于 2014-3-22 10:31:43 | 只看該作者
    感謝樓主 ! 編譯器用的是keil哪個版本? 我的版本怎么沒有stm32f072的
    地下室
    發表于 2014-3-22 17:50:36 | 只看該作者
    多謝分享啊
    6
    發表于 2014-3-22 17:53:18 | 只看該作者
    qqfishbaby 發表于 2014-3-22 10:31
    感謝樓主 ! 編譯器用的是keil哪個版本? 我的版本怎么沒有stm32f072的

    看這個帖子http://www.portaltwn.com/thread-127306-1-1.html
    MDK5.1中有
    7
     樓主| 發表于 2014-3-22 21:10:19 | 只看該作者
    qqfishbaby 發表于 2014-3-22 10:31
    感謝樓主 ! 編譯器用的是keil哪個版本? 我的版本怎么沒有stm32f072的

    使用MDK-ARM 5.10編譯。六樓的鏈接有下載地址。
    8
    發表于 2014-7-3 09:44:56 | 只看該作者
    這種帖子一定要支持!
    9
    發表于 2014-7-19 00:18:02 | 只看該作者
    感謝樓主分享。。。
    10
    發表于 2014-8-6 16:26:39 | 只看該作者
    樓主辛苦了!
    11
    發表于 2015-7-13 14:32:53 | 只看該作者
    很不錯,樓主辛苦了
    12
    發表于 2015-12-6 19:57:45 | 只看該作者
    感謝樓主 !學習中,,,
    13
    發表于 2018-5-10 19:06:22 | 只看該作者
    感謝分享,支持樓主
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷