国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼

這篇具有很好參考價(jià)值的文章主要介紹了【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼


前言

紅外通信協(xié)議是一種基于紅外線的傳輸技術(shù),廣泛使用的家電遙控器幾乎都是采用的紅外線傳輸技術(shù),由于紅外線為不可見光,對(duì)環(huán)境影響很小,紅外線遙控不會(huì)影響其他家用電器,也不會(huì)影響臨近的無線電設(shè)備。紅外遙控的編碼方式目前廣泛使用的是: PWM(脈沖寬度調(diào)制)的 NEC 協(xié)議和 PhilipsPPM(脈沖位置調(diào)制) 的 RC-5 協(xié)議的。本文分享NEC協(xié)議接收端的解碼程序。

紅外NEC協(xié)議

通信協(xié)議分為發(fā)送端和接收端,接收端的波形與發(fā)射端剛好相反。
NEC IR 協(xié)議使用 32 位幀格式對(duì)密鑰進(jìn)行編碼,如下所示

1、NEC 幀格式

地址碼0 地址碼1 命令碼 命令碼反碼
LSB-MSB(0-7) LSB-MSB(8-15) LSB-MSB(16-23) LSB-MSB(24-31)

在標(biāo)準(zhǔn)的NEC協(xié)議中,地址碼1為地址碼0的反碼,而在許多遙控器中,地址碼0和地址碼1共同作為紅外遙控器的編碼值。

2、發(fā)射端的波形

【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼
每個(gè)位都使用如圖所示的脈沖距離進(jìn)行傳輸。
邏輯“0”:562.5μs高電平,562.5μs低電平,總時(shí)長為1.125ms
邏輯“1”:562.5μs高電平,1.6875ms低電平,總時(shí)長為2.25ms

在遙控器上按某個(gè)鍵時(shí),傳輸?shù)南错樞虬韵聝?nèi)容:

引導(dǎo)碼:持續(xù)9ms 高電平,4.5ms低電平,作為啟動(dòng)信號(hào);
緊接著是32bit的數(shù)據(jù),按照上述的NEC幀格式的順序;最后以562.5μs脈沖高電平結(jié)尾,表示一幀消息傳輸結(jié)束。
數(shù)據(jù)位的四個(gè)字節(jié)首先發(fā)送最低有效位
下圖示例展示了NEC 紅外傳輸幀的格式,以地址為 00h (00000000b) 和 ADh (10101101b) 的命令碼為例。
傳輸一個(gè)消息幀總共需要 67.5ms。它需要27ms來傳輸16位地址(地址+地址反碼)和16位命令(命令+命令反碼)。
【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼
重復(fù)碼
如果遙控器上的鍵保持按下狀態(tài),則會(huì)發(fā)射重復(fù)碼,通常在完整的一幀消息結(jié)束后約40ms后發(fā)送;重復(fù)碼將繼續(xù)以 108 ms的間隔發(fā)出,直到紅外遙控按鍵被釋放。
重復(fù)碼按順序包含以下內(nèi)容:

  • 9ms 前導(dǎo)高電平
  • 2.25ms的低電平
  • 562.5μs的高電平來標(biāo)記一幀重復(fù)碼的結(jié)束。

波形如下圖所示:

【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼

3、接收端程序解碼

由于接收端的波形與發(fā)射端的波形剛好相反,在下述程序中,只需要一個(gè)定時(shí)器即可解碼紅外NEC協(xié)議,包含了紅外重復(fù)碼的檢測(cè),可區(qū)別紅外遙控長按和短按事件。文章來源地址http://www.zghlxwxcb.cn/news/detail-428466.html


#define IR_IN  GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)   // PA1 紅外接收DQ引腳
unsigned char ir_code[4];      // 解碼值保存變量
unsigned char ir_decode_ok_flag = RESET;    // 解碼成功標(biāo)志位

/*
    NEC紅外編碼: 引導(dǎo)碼 + 地址碼 + 地址碼(取反) + 數(shù)據(jù) + 數(shù)據(jù)(取反)
      引導(dǎo)嗎:0.56ms(低電平) + 2.25ms(高電平)
       數(shù)據(jù)1: 0.56ms(低電平) + 1.12ms(高電平)
*/
// 紅外解碼程序,100us定期執(zhí)行就可以,將該函數(shù)放在100us的定時(shí)器中即可。
void Ir_Decode(void)
{
    static unsigned int l_cnt = 0;                            // 低電平時(shí)間計(jì)數(shù)
    static unsigned int h_cnt = 0;                            // 高電平時(shí)間計(jì)數(shù)
    static unsigned int l_cnt_save = 0;                       // 保存低電平時(shí)長
    static unsigned int h_cnt_save = 0;                       // 保存高電平時(shí)長
    static unsigned char falling_edge_valid_flag = RESET;      // IR電平由高變低標(biāo)志位
    static unsigned char rcv_sync_ok_flag = RESET;             // 同步碼接收成功標(biāo)志位
    static unsigned char bit_value = 0;                        // 位解碼值
    static unsigned char bit_rcv_cnt = 0;                      // 位接收個(gè)數(shù)變量
    if( RESET == IR_IN )
    {
        if( 0 == l_cnt )    // IR由高變低后立馬記錄上次測(cè)得的高電平時(shí)長
        {
            h_cnt_save = h_cnt;
            falling_edge_valid_flag = SET;
        }
        
        
        l_cnt ++;
        if( l_cnt > 1600 )    // 防止計(jì)數(shù)溢出
        {
            l_cnt = 1600;
        }
        h_cnt = 0;  // 計(jì)數(shù)清零
				
    }
    else
    {
        if( 0 == h_cnt )   // IR由低變高后立馬記錄上次測(cè)得的低電平時(shí)長
        {
            l_cnt_save = l_cnt;
        }
        
        h_cnt ++;
        if( h_cnt > 1600 )   // 防止計(jì)數(shù)溢出
        {
            h_cnt = 1600;
        }
				
        l_cnt = 0;  // 計(jì)數(shù)清零
				
				
		if(ir_decode_ok_flag == 1)
		{
				if(h_cnt > 1200)
				ir_decode_ok_flag = 2;		//  短按
		}
       
    }
    
    if( SET == falling_edge_valid_flag )
    {
        falling_edge_valid_flag = RESET;
        
        /* 位解碼 */
        if( ((l_cnt_save >= 3)&&(l_cnt_save <= 9)) &&          // 560us低電平, 560us高電平
            ((h_cnt_save >= 3)&&(h_cnt_save <= 9)) )
        {
            bit_value = 0;
        }
        else if( ((l_cnt_save >= 3)&&(l_cnt_save <= 9)) &&    // 560us低電平,1680us高電平
                  ((h_cnt_save >= 14)&&(h_cnt_save <= 20)) )
        {
            bit_value = 1;
        }
        else
        {                    
            bit_value = 2;
        }
        
        if( SET == rcv_sync_ok_flag )
        {
            if((1 == bit_value) || (0 == bit_value) )
            {
                if( bit_rcv_cnt < 8 )
                {
                    ir_code[0] |= (bit_value<< (bit_rcv_cnt%8));
                }
                else if( bit_rcv_cnt < 16 )
                {
                    ir_code[1] |= (bit_value<< (bit_rcv_cnt%8));
                }
                else if( bit_rcv_cnt < 24 )
                {
                    ir_code[2] |= (bit_value<< (bit_rcv_cnt%8));
                }
                else if( bit_rcv_cnt < 32 )
                {
                    ir_code[3] |= (bit_value<< (bit_rcv_cnt%8));
                }
                
                if( bit_rcv_cnt >= 31 )
                {
                    ir_decode_ok_flag = SET;
                    rcv_sync_ok_flag = RESET; 
                }
                
                bit_rcv_cnt ++;
            }
            else
            {
                rcv_sync_ok_flag = RESET;                 // 位接收錯(cuò)誤,重新解碼
            }
        } 
				
        if( ((l_cnt_save >= 87)&&(l_cnt_save <= 93))  &&
            ((h_cnt_save >= 42)&&(h_cnt_save <= 48)) )            // 同步碼,9ms低電平,4.5ms高電平
        { 
            rcv_sync_ok_flag = SET;
            bit_rcv_cnt = 0;
            ir_code[0] = 0;
            ir_code[1] = 0;
            ir_code[2] = 0;
            ir_code[3] = 0;
        } 
		else if(((l_cnt_save >= 87)&&(l_cnt_save <= 93))  &&
			((h_cnt_save >= 20)&&(h_cnt_save <= 25)) )
		{
				printf("repeate code\r\n");
				ir_decode_ok_flag = 3;		//長按
		}
		
    }     
}

到了這里,關(guān)于【stm32單片機(jī)基礎(chǔ)】紅外NEC協(xié)議解碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 基于STM32單片機(jī)的智能家居窗戶窗簾控制系統(tǒng)紅外遙控proteus仿真原理圖PCB

    基于STM32單片機(jī)的智能家居窗戶窗簾控制系統(tǒng)紅外遙控proteus仿真原理圖PCB

    功能: 0.本系統(tǒng)采用STM32F103RCT6作為單片機(jī) 1.LCD1602液晶實(shí)時(shí)顯示當(dāng)前時(shí)間/窗簾狀態(tài)/光照強(qiáng)度 2.支持手動(dòng)按鍵/定時(shí)/光強(qiáng)檢測(cè)三種模式控制窗簾 3.\\\'設(shè)置’鍵進(jìn)入設(shè)置界面 4.默認(rèn)狀態(tài)下’確定’鍵可切換模式 5.設(shè)置界面’確定’為確定 6.支持掉電保存 7.采用DC002作為電源接口可直

    2024年02月11日
    瀏覽(102)
  • STM32單片機(jī)(五)第二節(jié):EXTI外部中斷練習(xí)(對(duì)射式紅外傳感器計(jì)次和旋轉(zhuǎn)編碼器計(jì)次)

    STM32單片機(jī)(五)第二節(jié):EXTI外部中斷練習(xí)(對(duì)射式紅外傳感器計(jì)次和旋轉(zhuǎn)編碼器計(jì)次)

    ?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。 ?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機(jī),且有一定C語言基礎(chǔ)的的童鞋

    2024年02月09日
    瀏覽(28)
  • 105-基于stm32單片機(jī)智能家居溫濕度煙霧監(jiān)測(cè)人體紅外防盜報(bào)警系統(tǒng)Proteus仿真+程序源碼

    105-基于stm32單片機(jī)智能家居溫濕度煙霧監(jiān)測(cè)人體紅外防盜報(bào)警系統(tǒng)Proteus仿真+程序源碼

    一:功能介紹 1、采用stm32單片機(jī)+LCD1602+DHT11溫濕度傳感器+煙霧傳感器+按鍵開關(guān)+蜂鳴器+LED燈,制作一個(gè)智能家居溫濕度煙霧監(jiān)測(cè)人體紅外防盜報(bào)警系統(tǒng); 2、通過按鍵開關(guān)來模擬人體紅外檢測(cè)觸發(fā),并且可以通過按鍵開關(guān)來設(shè)置正在布防和停止布防狀態(tài),布防狀態(tài)下,當(dāng)檢測(cè)

    2024年02月03日
    瀏覽(94)
  • STM32單片機(jī)(九)USART串口----第一節(jié):USART串口協(xié)議

    STM32單片機(jī)(九)USART串口----第一節(jié):USART串口協(xié)議

    ?? 專欄簡介:本專欄記錄了從零學(xué)習(xí)單片機(jī)的過程,其中包括51單片機(jī)和STM32單片機(jī)兩部分;建議先學(xué)習(xí)51單片機(jī),其是STM32等高級(jí)單片機(jī)的基礎(chǔ);這樣再學(xué)習(xí)STM32時(shí)才能融會(huì)貫通。 ?? 專欄適用人群 :適用于想要從零基礎(chǔ)開始學(xué)習(xí)入門單片機(jī),且有一定C語言基礎(chǔ)的的童鞋

    2024年02月16日
    瀏覽(164)
  • POWERLINK協(xié)議在stm32單片機(jī)+w5500移植成功經(jīng)驗(yàn)分享

    POWERLINK協(xié)議在stm32單片機(jī)+w5500移植成功經(jīng)驗(yàn)分享

    連續(xù)折騰了多個(gè)晚上,又趁周末又花了一天時(shí)間,終于把powerlink協(xié)議移植成功到單片機(jī)上啦。本想放棄,但想了下不管我能不能用上,結(jié)個(gè)尾吧,分享給有需要的人。放棄并不難,但堅(jiān)持一定很酷。為了移植測(cè)試這個(gè)協(xié)議花了不少血本。stm32開發(fā)板就買了兩套,其中第一套板

    2024年02月09日
    瀏覽(22)
  • K_A12_004 基于STM32等單片機(jī)采集人體紅外感應(yīng)(HC-SR501)模塊串口與OLED0.96雙顯示

    K_A12_004 基于STM32等單片機(jī)采集人體紅外感應(yīng)(HC-SR501)模塊串口與OLED0.96雙顯示

    單片機(jī)型號(hào) 測(cè)試條件 模塊名稱 代碼功能 STC89C52RC 晶振11.0592M HC-SR501模塊 STC89C52RC采集HC-SR501模塊參數(shù) 串口與OLED0.96雙顯示 STM32F103C8T6 晶振8M/系統(tǒng)時(shí)鐘72M HC-SR501模塊 STM32F103C8T6采集HC-SR501模塊參數(shù) 串口與OLED0.96雙顯示 其他資料目錄 直戳跳轉(zhuǎn) HC-SR501模塊 引腳說明 VCC 正極 3.3-5V供電

    2024年01月19日
    瀏覽(35)
  • 【STM32】基礎(chǔ)知識(shí) 第一課 單片機(jī)簡介

    【STM32】基礎(chǔ)知識(shí) 第一課 單片機(jī)簡介

    單片機(jī) (Single-Chip Microcomputer) 單品微型計(jì)算機(jī), 是一種集成電路芯片. 電腦 vs 單片機(jī): 電腦 單片機(jī) CPU CPU 內(nèi)存 SRAM 硬盤 Flash 主板 外設(shè) SRAM 靜態(tài)隨機(jī)讀取器 (Static Random-Access Memory): SRAM 是隨機(jī)存儲(chǔ)器的一種, 屬于靜態(tài)數(shù)據(jù), 這類存儲(chǔ)器要是維持電源, 里面存儲(chǔ)的信息就可以恒常維持

    2024年02月11日
    瀏覽(101)
  • 單片機(jī)第三季-第一課:STM32基礎(chǔ)

    單片機(jī)第三季-第一課:STM32基礎(chǔ)

    STM32系列分類: 型號(hào)命名原則: STM32F103系列: 涉及到的幾個(gè)概念: DMA:Direct Memory Access,直接存儲(chǔ)器訪問。DMA傳輸將數(shù)據(jù)從一個(gè)地址空間復(fù)制到另一個(gè)地址空間,提供外設(shè)和存儲(chǔ)器或存儲(chǔ)器和存儲(chǔ)器之間的高速數(shù)據(jù)傳輸; 2.0到3.6V供電,IO口可以兼容5V電壓; 與51單片機(jī)不同

    2024年02月09日
    瀏覽(20)
  • 101、基于STM32單片機(jī)智能輸液器紅外點(diǎn)滴液位監(jiān)控報(bào)警系統(tǒng)設(shè)計(jì)(程序+原理圖+PCB源文件+參考論文+硬件設(shè)計(jì)資料+元器件清單等)

    101、基于STM32單片機(jī)智能輸液器紅外點(diǎn)滴液位監(jiān)控報(bào)警系統(tǒng)設(shè)計(jì)(程序+原理圖+PCB源文件+參考論文+硬件設(shè)計(jì)資料+元器件清單等)

    單片機(jī)主芯片選擇方案 方案一:AT89C51是美國ATMEL公司生產(chǎn)的低電壓,高性能CMOS型8位單片機(jī),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和Flash存儲(chǔ)單元,功能強(qiáng)大。其片內(nèi)的4K程序存儲(chǔ)器是FLASH工藝的,這種單

    2024年02月13日
    瀏覽(35)
  • 32、基于51單片機(jī)紅外智能垃圾桶系統(tǒng)設(shè)計(jì)

    32、基于51單片機(jī)紅外智能垃圾桶系統(tǒng)設(shè)計(jì)

    隨著現(xiàn)代化進(jìn)程的日益推進(jìn),科技越來越發(fā)達(dá),人們的生活水平也提高了,城市化程度越來越高,與此同時(shí)也帶了許多問題,生活垃圾越來越多垃圾設(shè)施卻不夠完善。無論是在公共場合還是家庭廚房的垃圾大都是沒有蓋或者有蓋但需要人用手打開的,比如夏天的家庭廚房沒有

    2023年04月14日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包