91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32F103C8T6對紅外遙控信號解碼 實現(xiàn)HX1838接收頭接收數(shù)據(jù)

jf_88434166 ? 來源:jf_88434166 ? 作者:jf_88434166 ? 2026-01-30 19:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、紅外遙控簡介

紅外遙控是一種無線、非接觸控制技術(shù),具有抗干擾能力強,信息傳輸可靠,功耗低,成本低,易實現(xiàn)等顯著優(yōu)點,被諸多電子設(shè)備特別是家用電器廣泛采用,并越來越多的應(yīng)用到計算機系統(tǒng)中。由于紅外線遙控不具有像無線電遙控那樣穿過障礙物去控制被控對象的能力,所以,在設(shè)計紅外線遙控器時,不必要像無線電遙控器那樣,每套(發(fā)射器和接收器)要有不同的遙控頻率或編碼(否則就會隔墻控制或干擾鄰居的家用電器),所以同類產(chǎn)品的紅外線遙控器,可以有相同的遙控頻率或編碼,而不會出現(xiàn)遙控信號“串門”的情況。這對于大批量生產(chǎn)以及在家用電器上普及紅外線遙控提供了極大的方便。由于紅外線為不可見光,因此對環(huán)境影響很小,再由紅外光波動波長遠小于無線電波的波長,所以紅外線遙控不會影響其他家用電器,也不會影響臨近的無線電設(shè)備。

HW1.jpg

二、紅外遙控特性

紅外遙控的情景中,必定會有一個紅外發(fā)射端和紅外接收端。要使兩者通信成功,收/發(fā)紅外波長與載波頻率需一致,在這里波長就是940nm,載波頻率就是38kHz。
紅外發(fā)射管也是屬于二極管類,紅外發(fā)射電路通常使用三極管控制紅外發(fā)射器的導(dǎo)通或者截至,在導(dǎo)通的時候,紅外發(fā)射管會發(fā)射出紅外光,反之,就不會發(fā)射出紅外光。雖然用肉眼看不到紅外光,但是可以借助手機攝像頭就能看到紅外光。但是紅外接收管的特性是當(dāng)接收到紅外載波信號時,OUT引腳輸出低電平;假如沒有接收到紅外載波信號時,OUT引腳輸出高電平。
紅外載波信號其實就是由一個個紅外載波周期組成。在頻率為38KHz下,紅外載波周期約等于26.3us(1s/38KHz≈26.3us)。在一個紅外載波發(fā)射周期里,發(fā)射紅外光時間8.77us和不發(fā)射紅外光17.53us,發(fā)射紅外光的占空比一般為1/3。相對的,整個周期內(nèi)不發(fā)射紅外光,就是載波不發(fā)射周期。在紅外遙控器內(nèi)已經(jīng)把載波和不載波信號處理好,只需要做的就是識別遙控器按鍵發(fā)射出的信號,信號也是遵循某種協(xié)議的。

三、紅外編解碼協(xié)議介紹

紅外遙控的編碼方式目前廣泛使用的是:PWM(脈沖寬度調(diào)制)的NEC協(xié)議和PhilipsPPM(脈沖位置調(diào)制)的RC-5協(xié)議的。以NEC協(xié)議為例,其特征如下:

1、8位地址和8位指令長度;
2、地址和命令2次傳輸(確??煽啃?;
3、PWM脈沖位置調(diào)制,以發(fā)射紅外載波的占空比代表“0”和“1”;
4、載波頻率為38Khz;
5、位時間為1.125ms或2.25ms;

在NEC協(xié)議中,如何為協(xié)議中的數(shù)據(jù)‘0’或者‘1’?這里分開紅外接收器和紅外發(fā)射器。
紅外發(fā)射器:
發(fā)送協(xié)議數(shù)據(jù)‘0’=發(fā)射載波信號560us+不發(fā)射載波信號560us
發(fā)送協(xié)議數(shù)據(jù)‘1’=發(fā)射載波信號560us+不發(fā)射載波信號1680us
紅外發(fā)射器的位定義如下圖所示:

紅外接收器:
接收到協(xié)議數(shù)據(jù)‘0’=560us低電平+560us高電平
接收到協(xié)議數(shù)據(jù)‘1’=560us低電平+1680us高電平
紅外接收器的位定義如下圖所示:

NEC遙控指令的數(shù)據(jù)格式為:同步碼頭、地址碼、地址反碼、控制碼、控制反碼。同步碼由一個9ms的低電平和一個4.5ms的高電平組成,地址碼、地址反碼、控制碼、控制反碼均是8位數(shù)據(jù)格式。按照低位在前,高位在后的順序發(fā)送。采用反碼是為了增加傳輸?shù)目煽啃?(可用于校驗)。除了上面的數(shù)據(jù)格式,NEC還規(guī)定了一個連發(fā)碼(由9ms低電平+2.5ms高電平+0.56ms低電平+97.94ms高電平組成),如果在一幀數(shù)據(jù)發(fā)送完畢之后,按鍵仍然沒有放開,則發(fā)射重復(fù)碼,即連發(fā)碼可以通過統(tǒng)計連發(fā)碼的次數(shù)來標記按鍵按下的長短/次數(shù)。紅外NEC協(xié)議編碼如圖所示:

當(dāng)遙控器的按鍵按下時,從紅外接收頭端收到的波形如圖所示,從圖中可以看到,其地址碼為0,控制碼為21(正確解碼后00010101)。

四、STM32F103解碼接收紅外信號

準備工作

STM32F103C8T6開發(fā)板,940nm波長 38kHz載波頻率的紅外遙控器,HX1838接收頭,OLED屏幕

接線說明

STM32F103C8T6HX1838接收頭
3.3V接收頭的+ 和 OLED的VCC
GND共地
PA0S
PB8OLED->SCL
PB9OLED->SDA

代碼示例

HX1838.c

#include "IR.h"
#include "timer.h"

// 遙控器接收狀態(tài)
//[7]:收到了引導(dǎo)碼標志
//[6]:得到了一個按鍵的所有信息
//[5]:保留
//[4]:標記上升沿是否已經(jīng)被捕獲
//[3:0]:溢出計時器
uint8_t RmtSta = 0;
uint16_t Dval;		// 下降沿時計數(shù)器的值
uint32_t RmtRec = 0; // 紅外接收到的數(shù)據(jù)
uint8_t RmtCnt = 0;	// 按鍵按下的次數(shù)

void IR_Init(void)
{
	Timer_Init();
}

void TIM2_IRQHandler(void)
{
 	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
	{
		if (RmtSta & 0x80) // 上次有數(shù)據(jù)被接收到了
		{
			RmtSta &= ~0X10; // 取消上升沿已經(jīng)被捕獲標記
			if ((RmtSta & 0X0F) == 0X00)
				RmtSta |= 1 < < 6; // 標記已經(jīng)完成一次按鍵的鍵值信息采集
			if ((RmtSta & 0X0F) < 14)
				RmtSta++;
			else
			{
				RmtSta &= ~(1 < < 7); // 清空引導(dǎo)標識
				RmtSta &= 0XF0;		 // 清空計數(shù)器
			}
		}
	}
	
	if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
	{
		if (RDATA) // 上升沿捕獲
		{
			TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Falling); // CC4P=1	設(shè)置為下降沿捕獲
			TIM_SetCounter(TIM2, 0);							 // 清空定時器
			RmtSta |= 0X10;										 // 標記上升沿已經(jīng)被捕獲
		}
		else // 下降沿捕獲
		{
			Dval = TIM_GetCapture1(TIM2);						// 讀取CCR4也可以清CC4IF標志位
			TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising); // CC4P=0	設(shè)置為上升沿捕獲
			if (RmtSta & 0X10)									// 完成一次高電平捕獲
			{
				if (RmtSta & 0X80) // 接收到了引導(dǎo)碼
				{
 
					if (Dval > 300 && Dval < 800) // 560為標準值,560us
					{
						RmtRec < <= 1; // 左移一位.
						RmtRec |= 0;  // 接收到0
					}
					else if (Dval > 1400 && Dval < 1800) // 1680為標準值,1680us
					{
						RmtRec < <= 1; // 左移一位.
						RmtRec |= 1;  // 接收到1
					}
					else if (Dval > 2200 && Dval < 2600) // 得到按鍵鍵值增加的信息 2500為標準值2.5ms
					{
						RmtCnt++;		// 按鍵次數(shù)增加1次
						RmtSta &= 0XF0; // 清空計時器
					}
				}
				else if (Dval > 4200 && Dval < 4700) // 4500為標準值4.5ms
				{
					RmtSta |= 1 < < 7; // 標記成功接收到了引導(dǎo)碼
					RmtCnt = 0;		  // 清除按鍵次數(shù)計數(shù)器
				}
			}
			RmtSta &= ~(1 < < 4);
		}
	}
	TIM_ClearITPendingBit(TIM2, TIM_IT_Update | TIM_IT_CC1);
}
 
// 處理紅外鍵盤
// 返回值:
//	 0,沒有任何按鍵按下
// 其他,按下的按鍵鍵值.
uint8_t Remote_Scan(void)
{
	uint8_t sta = 0;
	uint8_t t1, t2;
	if (RmtSta & (1 < < 6)) // 得到一個按鍵的所有信息了
	{
		t1 = RmtRec > > 24;						// 得到地址碼
		t2 = (RmtRec > > 16) & 0xff;				// 得到地址反碼
		if ((t1 == (uint8_t)~t2) && t1 == REMOTE_ID) // 檢驗遙控識別碼(ID)及地址
		{
			t1 = RmtRec > > 8;
			t2 = RmtRec;
			if (t1 == (uint8_t)~t2)
				sta = t1; // 鍵值正確
		}

		RmtSta &= ~(1 < < 6); // 清除接收到有效按鍵標識
		RmtCnt = 0;			 // 清除按鍵次數(shù)計數(shù)器
	}
	return sta;
}

main.c

#include "stm32f10x.h"                  // Device header
#include "oled.h" 
#include "delay.h"  
#include "IR.h" 

uint8_t IR_Address;
uint8_t IR_Command;
uint8_t IR_Count;  
uint8_t *str = 0;
uint8_t key;
	
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	OLED_Init();
	IR_Init();
	
	OLED_ShowString(1,1,"ADDR HEX CMD NUM");
	OLED_ShowString(2,1,"00   00   0  000");
	
	while(1)
	{
		IR_Address = (RmtRec > > 24) & 0xFF;
        IR_Command = (RmtRec > > 8)  & 0xFF;
		
		key = Remote_Scan();
        if (key) {
            switch (key) {
                case IR_1:
                    str = "1";
                    break;
                case IR_2:
                    str = "2";
                    break;
                case IR_3: 
                    str = "3";
                    break;
                case IR_4: 
                    str = "4";
                    break;
                case IR_5: 
                    str = "5";
                    break;
                case IR_6: 
                    str = "6";
                    break;
                case IR_7: 
                    str = "7";
                    break;
                case IR_8: 
                    str = "8";
                    break;
                case IR_9: 
                    str = "9";
                    break;
                case IR_0:
                    str = "0";
                    break;
                case IR_SP1:
                    str = "*";
                    break;
                case IR_SP2:
                    str = "#";
                    break;
                case IR_UP:			//"↑"
                    IR_Count++;
                    break;
                case IR_LEFT:		//"←"
					//
                    break;
                case IR_DOWN:		//"↓"
                    IR_Count--;
                    break;
                case IR_RIGHT:		//"→"
					//
                    break;
                case IR_CONFIRM:
                    str = "OK ";
                    break;
                default:
                    str = "EMOURE";
                    break;
            }
			
			OLED_ShowHexNum(2, 1,  IR_Address, 2);
			OLED_ShowHexNum(2, 6,  IR_Command, 2);
			OLED_ShowString(2,12," ");
			OLED_ShowString(2,11,str);
			OLED_ShowNum(2, 14, IR_Count,   3);
        }
		Delay_ms(10);
	}
}

效果展示

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 紅外遙控
    +關(guān)注

    關(guān)注

    22

    文章

    351

    瀏覽量

    47599
  • STM32F103C8T6
    +關(guān)注

    關(guān)注

    113

    文章

    166

    瀏覽量

    88707
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    STM32驅(qū)動串口屏,STM32F103C8T6串口發(fā)送指令控制HMI串口屏

    僅是一部分常用的基礎(chǔ)指令,更多更仔細的指令或者函數(shù)可以訪問陶晶馳資料官網(wǎng)。 硬件和接線 硬件需要一塊STM32F103C8T6的開發(fā)板,杜邦線諾干,2.4寸串口屏一塊 接線 串口屏 STM32 +5V 5V TX PA10 RX PA9 GND GND 實驗前準備 準備前
    的頭像 發(fā)表于 02-10 17:07 ?134次閱讀
    <b class='flag-5'>STM32</b>驅(qū)動串口屏,<b class='flag-5'>STM32F103C8T6</b>串口發(fā)送指令控制HMI串口屏

    f103c8t6使用adc采樣時程序無法正常工作怎么解決?

    我在學(xué)習(xí)使用stm32f103c8t6的adc的使用時遇到了這個問題。 是按照教程一步一步操作的:這是教程地址:https://blog.csdn.net/WTF___000/article
    發(fā)表于 10-13 07:25

    CherryUSB +STM32F103C8 example usb cdc device不識別是怎么回事?

    stm32f103c8t6 配置cdc,使用cubeMX 配置生成xxx_msp.c 為什么 放開 CONFIG_USBDEV_SETUP_LOG_PRINT 發(fā)現(xiàn) usb 中斷 一直未能進入 ____usbd_event_ep0_setup_complete_hand
    發(fā)表于 09-10 07:03

    stm32f103c8t6讀不到完整的MC6C遙控器Uart數(shù)據(jù)幀怎么辦

    我用stm32c8t6最小系統(tǒng)板做飛控,時鐘為72MHz,在使用Usart通信嘗試讀取sbus信號時,發(fā)現(xiàn)只能讀取到16.16.16.16.16.16226.181.117.91.56.13為循環(huán)
    發(fā)表于 08-13 09:29

    STM32F103C6T6 DCAC逆變器原理圖

    STM32F103C6T6 DCAC逆變器原理圖
    發(fā)表于 05-19 17:48 ?2次下載

    stm32f103c8t6主控芯片無人機原理圖

    stm32f103c8t6主控芯片無人機原理圖
    發(fā)表于 04-29 17:02 ?3次下載

    STM32F103C8T6無法選擇外部晶振怎么解決?

    我從網(wǎng)上購入了STM32F103C8T6的核心板,板上有外部晶振。但我使用STM32CubeMX生成項目時,卻無法選擇外部晶振(如下圖)。請問要在哪里設(shè)置才能選擇外部晶振呀?
    發(fā)表于 04-28 07:03

    基于STM32F103C8T6控制多路VL53L0X激光測距傳感器

    使用STM32F103C8T6的一條IIC總線控制4個激光測距傳感器,我使用的激光測距傳感器是亞博智能的 地址相同改不了,我要怎么控制多路,求指點
    發(fā)表于 04-23 18:23

    STM32F103x8 STM32F103xB單片機數(shù)據(jù)手冊

    STM32F103x8STM32F103xB單片機數(shù)據(jù)手冊
    發(fā)表于 04-14 14:55 ?8次下載

    STM32F103C8T6開發(fā)板最小系統(tǒng)原理圖

    電子發(fā)燒友網(wǎng)站提供《STM32F103C8T6開發(fā)板最小系統(tǒng)原理圖》資料免費下載
    發(fā)表于 03-24 09:09 ?92次下載

    STM32F103×8/STM32F103×B MCU手冊

    參考第2.2節(jié):整個系列的完全兼容性。中密度STM32F103xx數(shù)據(jù)手冊必須與低、中、高密度STM 32 f 10 xx參考手冊一起閱讀。有關(guān)數(shù)據(jù)手冊和參考手冊的設(shè)備勘誤表信息,請參
    發(fā)表于 03-18 16:37 ?0次下載

    stm32f103c8t6沒有對flash進行任何操作,flash的內(nèi)容發(fā)生變化了,是哪些原因?

    stm32f103c8t6:沒有對flash進行任何操作,flash的內(nèi)容發(fā)生變化了。具體是哪些原因?如何調(diào)試排查原因。
    發(fā)表于 03-14 07:14

    stm32f103c8t6編碼器模式在keil的debug調(diào)試時遇到的問題求解

    stm32f103c8t6編碼器模式在keil的debug調(diào)試時,手動把編碼器的計數(shù)器置為一個數(shù)500(比如計數(shù)器溢出值是4000),然后在在讓編碼器繼續(xù)開始輸出,此時計數(shù)器的計數(shù)變?yōu)樵瓉碚5膬杀读?,直到計?shù)器溢出一次就變正常了
    發(fā)表于 03-14 06:06

    stm32f103的uac模式對usb接收數(shù)據(jù)實時處理,要怎么操作?

    我將 stm32f103c8t6 設(shè)置成了 usb 聲卡模式,電腦已經(jīng)能檢測到設(shè)備。下一步想對電腦傳出的聲音數(shù)據(jù)進行處理,得到實時的聲音大小。處理程序應(yīng)該放在哪里?聲音大小怎么計算?純小白問題,感謝大佬指點。
    發(fā)表于 03-12 07:23

    STM32F103C8T6使用CubeIDE燒錄運行報硬件錯誤,相同代碼MDK燒錄卻可以正常運行,為什么?

    自制PCB使用STM32F103C8T6,通過STM32CubeMX生成了CubeIDE項目和MDK項目,編譯下載相同的代碼CubeIDE不能正常執(zhí)行,經(jīng)過調(diào)試發(fā)現(xiàn)進入了硬件錯誤循環(huán)。而使用MDK燒錄卻沒有任何問題,完美執(zhí)行代碼,請問這是為什么?
    發(fā)表于 03-12 06:18