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

STM32外設(shè)系列—紅外遙控

這篇具有很好參考價值的文章主要介紹了STM32外設(shè)系列—紅外遙控。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


?? 文章作者:二土電子

?? 關(guān)注文末公眾號獲取其他資料和工程文件!

?? 期待大家一起學(xué)習交流!


一、紅外遙控簡介

紅外遙控,顧名思義,就是利用紅外線實現(xiàn)遙控。這里就不單獨對紅外線做介紹了,紅外線的波長再可見光范圍外,所以人眼是看不到的。紅外遙控的原理就是利用紅外線進行通訊,比如生活中常用的電視遙控器,空調(diào)遙控器等,大多都是紅外通訊實現(xiàn)的遙控功能。

二、紅外遙控的原理

紅外遙控是一種非接觸,無線控制技術(shù)。具有抗干擾能力強,信息傳輸可靠,功耗低,成本低,易實現(xiàn)等特點。紅外遙控系統(tǒng)一般有紅外發(fā)射裝置和紅外接收設(shè)備兩大部分組成。

  • 紅外發(fā)射裝置就是我們常見的遙控器,由鍵盤電路,紅外編碼電路,電源電路和紅外發(fā)射電路組成。
  • 紅外接收設(shè)備是由紅外接收電路,紅外解碼,電源和應(yīng)用電路組成。紅外接收裝置有三個引腳,VDD,GND和數(shù)據(jù)輸出VOUT。通常正對接收頭凸起處看,從左到右引腳順序為VOUT,GND,VDD

stm32紅外遙控,STM32開發(fā)筆記—外設(shè)系列,stm32,嵌入式硬件,單片機

通常紅外遙控為了提高抗干擾性能和降低電源消耗,紅外遙控器常用載波的方式傳送二進制編碼,常用的載波頻率為38kHz,這是由發(fā)射端所使用的455kHz晶振來決定的。在發(fā)射端要對晶振進行整數(shù)分頻,分頻系數(shù)一般取12,所以為38kHz。也有一些遙控系統(tǒng)采用36kHz、40 kHz、56 kHz等,一般由發(fā)射端晶振的振蕩頻率來決定。所以,通常的紅外遙控器是將遙控信號(二進制脈沖碼) 調(diào)制在38KHz的載波上,經(jīng)緩沖放大后送至紅外發(fā)光二極管,轉(zhuǎn)化為紅外信號發(fā)射出去的。

三、二進制脈沖編碼

二進制脈沖碼的形式有多種,其中最為常用的是NEC Protocol 的PWM碼(脈沖寬度調(diào)制)和 Philips RC-5 Protoco 的 PPM碼(脈沖位置調(diào)制碼,脈沖串之間的時間間隔來實現(xiàn)信號調(diào)制)。如果要開發(fā)紅外接收設(shè)備,一定要知道紅外遙控器的編碼方式和載波頻率,才可以選取一體化紅外接收頭和制定解碼方案。這里針對NEC編碼形式做一個詳細介紹。NEC編碼形式有以下特點

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

3.1 NEC碼的位定義

一個脈沖對應(yīng) 560us 的連續(xù)載波,一個邏輯1傳輸需要 2.25ms(560us脈沖+1680us 低電平) ,一個邏輯 0的傳輸需要 1.125ms (560us脈沖+560us 低電平)。而紅外接收頭在收到脈沖的時候為低電平,在沒有脈沖的時候為高電平,這樣,我們在接收頭端收到的信號為: 邏輯 1應(yīng)該是 560us 低+1680us 高,邏輯 0 應(yīng)該是 560us 低+560us 高。所以可以通過計算高電平時間判斷接收到的數(shù)據(jù)是0還是1。NEC碼位定義時序圖如下

stm32紅外遙控,STM32開發(fā)筆記—外設(shè)系列,stm32,嵌入式硬件,單片機

特別標注一下,上圖邏輯0和邏輯1的時序圖對應(yīng)的是接收端的時序圖。

3.2 NEC遙控指令的數(shù)據(jù)格式

NEC遙控指令的數(shù)據(jù)格式為:引導(dǎo)碼、地址碼、地址反碼、控制碼控制反碼。引導(dǎo)碼由一個 9ms 的低電平和一個 4.5ms 的高電平組成地址碼、地址反碼、控制碼、控制反碼均是8 位數(shù)據(jù)格式。按照低位在前,高位在后的順序發(fā)送。采用反碼是為了增加傳輸?shù)目煽啃?(可用于校驗)。數(shù)據(jù)格式如下

stm32紅外遙控,STM32開發(fā)筆記—外設(shè)系列,stm32,嵌入式硬件,單片機

特別標注一下,上圖為發(fā)送端的時序圖。

NEC碼還規(guī)定了連發(fā)碼(由 9ms 低電平+2.5m 高電平+0.5ms 低電平+97.94ms 高電平組成),如果在一幀數(shù)據(jù)發(fā)送完畢之后,紅外遙控器按鍵仍然沒有放開,則發(fā)射連發(fā)碼,可以通過統(tǒng)計連發(fā)碼的次數(shù)來標記按鍵按下的長短或次數(shù)。

四、紅外遙控程序設(shè)計思路

紅外發(fā)射裝置只需要按鍵按下即可產(chǎn)生紅外信號,我們只需要針對紅外接收設(shè)備編寫程序即可。上面介紹了,紅外接收設(shè)備在收到脈沖的時候為低電平,在沒有脈沖的時候為高電平。根據(jù)“0”和“1”的時序圖可知,我們只需要監(jiān)測紅外接收設(shè)備的數(shù)據(jù)輸出引腳的高電平持續(xù)時間就可以判斷接收到的是“0”還是“1”。

另外,沒有按鍵按下時,也就是沒有發(fā)紅外信號,沒有脈沖,紅外接收設(shè)備的數(shù)據(jù)輸出引腳一直為高電平。只有接收到脈沖時,說明有按鍵按下,此時紅外接收設(shè)備的數(shù)據(jù)輸出引腳為低電平。因此,可以利用外部中斷的下降沿出發(fā)來判斷是否有按鍵按下,在中斷中測量高電平持續(xù)時間來判斷接收到的是“0”還是“1”。

五、紅外遙控程序設(shè)計

5.1 紅外遙控初始化程序

需要初始化GPIO和外部中斷,GPIO配置為上拉輸入模式

/*
 *==============================================================================
 *函數(shù)名稱:Drv_Hw_Init
 *函數(shù)功能:初始化紅外遙控模塊
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:紅外端口初始化函數(shù),時鐘端口及外部中斷初始化
 *==============================================================================
 */
void Drv_Hw_Init (void)
{
	// 結(jié)構(gòu)體定義
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	// 開啟時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

	// 配置GPIO結(jié)構(gòu)體
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;   // 紅外接收
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;   // 上拉輸入模式
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);   // 選擇GPIO管腳用作外部中斷線路
	EXTI_ClearITPendingBit(EXTI_Line11);
	
	// 配置外部中斷
	EXTI_InitStructure.EXTI_Line=EXTI_Line11;
	EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_InitStructure.EXTI_LineCmd=ENABLE;
	EXTI_Init(&EXTI_InitStructure); 

	// 配置NVIC結(jié)構(gòu)體
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 搶占優(yōu)先級為0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   // 響應(yīng)優(yōu)先級為1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // 使能
	NVIC_Init(&NVIC_InitStructure);
}

5.2 記錄高電平持續(xù)時間函數(shù)

利用記錄延時次數(shù)的方法測量高電平持續(xù)時間

/*
 *==============================================================================
 *函數(shù)名稱:Drv_Hw_RecordHightTime
 *函數(shù)功能:記錄高電平持續(xù)時間并返回
 *輸入?yún)?shù):無
 *返回值:t:高電平持續(xù)時間
 *備  注:無
 *==============================================================================
 */
u8 Drv_Hw_RecordHightTime (void)
{
	u8 t = 0;
	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1)   // 高電平
	{
		t ++;
		delay_us(20);
		if(t >= 250)
		{
			return t;   // 超時溢出
		}
	}
	return t;
}

5.3 中斷服務(wù)函數(shù)

中斷服務(wù)函數(shù)中接收數(shù)據(jù),接收完成后對應(yīng)的接收完成標志位置1

/*
 *==============================================================================
 *函數(shù)名稱:EXTI15_10_IRQHandler
 *函數(shù)功能:外部中斷服務(wù)函數(shù)
 *輸入?yún)?shù):無
 *返回值:無
 *備  注:無
 *==============================================================================
 */
void EXTI15_10_IRQHandler(void)   // 紅外遙控外部中斷
{
	u8 Tim = 0,Ok = 0,Data,Num = 0;

   while(1)
   {
	   	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 1)
		{
			 Tim = Drv_Hw_RecordHightTime();   //獲得此次高電平時間

			 if(Tim>=250)
			 {
				 break;   // 不是有用的信號
			 }

			 if(Tim >= 200 && Tim < 250)
			 {
			 	Ok = 1;   // 收到起始信號
			 }
			 else if(Tim >= 60 && Tim < 90)
			 {
			 	Data = 1;   // 收到數(shù)據(jù) 1
			 }
			 else if(Tim >= 10 && Tim < 50)
			 {
			 	Data = 0;   // 收到數(shù)據(jù) 0
			 }
			 
			 if(Ok == 1)
			 {
			 	hw_jsm <<= 1;
				hw_jsm += Data;

				 // 接收完成
				if(Num >= 32)
				{
					hw_jsbz = 1;
				  	break;
				}
			 }
			 Num ++;
		}
   }
	 
	 // 清除中斷標志位
   EXTI_ClearITPendingBit(EXTI_Line11);	
}

5.4 讀取鍵值

判斷鍵盤上按下的是哪個按鍵。不同的遙控器,按鍵對應(yīng)的紅外編碼可能不同,可以通過串口打印接收到的鍵值的方法來讀出每一個按鍵的鍵值。

/*
 *==============================================================================
 *函數(shù)名稱:Med_Hw_ReadKeyValue
 *函數(shù)功能:讀取鍵值
 *輸入?yún)?shù):無
 *返回值:紅外鍵值
 *備  注:每一個鍵值是測試出來的,不同遙控器鍵值可能不同
 *==============================================================================
 */
u8 Med_Hw_ReadKeyValue (void)
{
	if(hw_jsm == 0x00FF9867)
	{
		return 0;
	}
	else if(hw_jsm == 0x00FFA25D)
	{
		return 1;
	}
	else if(hw_jsm == 0x00FF629D)
	{
		return 2;
	}
	else if(hw_jsm == 0x00FFE21D)
	{
		return 3;
	}
	else if(hw_jsm == 0x00FF22DD)
	{
		return 4;
	}
	else if(hw_jsm == 0x00FF02FD)
	{
		return 5;
	}
	else if(hw_jsm == 0x00FFC23D)
	{
		return 6;
	}
	else if(hw_jsm == 0x00FFE01F)
	{
		return 7;
	}
	else if(hw_jsm == 0x00FFA857)
	{
		return 8;
	}
	else if(hw_jsm == 0x00FF906F)
	{
		return 9;
	}
	else if(hw_jsm == 0x00FF6897)   // 按鍵*按下
	{
		return 10;
	}
	else if(hw_jsm == 0x00FFB04F)   // 按鍵#按下
	{
		return 11;
	}
	else if(hw_jsm == 0x00FF38C7)   // 按鍵OK按下
	{
		return 12;
	}
	
	else if(hw_jsm == 0x00FF18E7)   // 按鍵"上"按下
	{
		return 13;
	}
	else if(hw_jsm == 0x00FF4AB5)   // 按鍵"下"按下
	{
		return 14;
	}
	else if(hw_jsm == 0x00FF10EF)   // 按鍵"左"按下
	{
		return 15;
	}
	else if(hw_jsm == 0x00FF5AA5)   // 按鍵"右"按下
	{
		return 16;
	}
	return 17;
}

5.5 參數(shù)定義

定義了以下兩個參數(shù)

u32 hw_jsm;	  // 定義一個32位數(shù)據(jù)變量,保存接收碼
u8 hw_jsbz;  // 定義一個8位數(shù)據(jù)的變量,用于指示接收標志

六、應(yīng)用實例

利用紅外遙控控制LED的亮滅,按下“1”點亮,按下“0”熄滅。每次執(zhí)行完對應(yīng)按鍵的內(nèi)容后,需要清除接收完成標志位和接收碼。main函數(shù)如下文章來源地址http://www.zghlxwxcb.cn/news/detail-619964.html

u8 gHwKeyValue = 0;   // 紅外鍵值

int main(void)
{
	Med_Mcu_Iint();   // 系統(tǒng)初始化
	
	while(1)
  {
		if (hw_jsbz == 1)
		{
			// 獲取紅外鍵值
			gHwKeyValue = Med_Hw_ReadKeyValue();
			
			// 按下按鍵“1”
			if (gHwKeyValue == 1)
			{
				// 點亮LED
				Med_Led_StateCtrl(LED1,LED_ON);
			}
			// 按下按鍵“0”
			if (gHwKeyValue == 0)
			{
				// 熄滅LED
				Med_Led_StateCtrl(LED1,LED_OFF);
			}
			
			hw_jsbz = 0;   // 清除接收完成標志位
			hw_jsm = 0;   // 清零接收碼
		}
	}
}

到了這里,關(guān)于STM32外設(shè)系列—紅外遙控的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 嵌入式開發(fā)--STM32G4系列片上FLASH的讀寫

    嵌入式開發(fā)--STM32G4系列片上FLASH的讀寫

    這個玩意吧,說起來很簡單,就是幾行代碼的事,但楞是折騰了我大半天時間才搞定。原因后面說,先看代碼吧: 讀操作很簡單,以32位方式讀取的時候是這樣的: 需要注意的是,當以32位方式讀取時,地址需要是4的整數(shù)倍,即32位。 8位或16位方式類似操作即可 需要注意的

    2024年01月18日
    瀏覽(98)
  • STM32外設(shè)系列—OLED

    STM32外設(shè)系列—OLED

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! OLED是開發(fā)時常用的顯示器件,這里介紹的是0.96寸的四針腳OLED,IIC控制。 供電電壓在3V~5V,用3.3V即可。 I2C通信接口由從地址位DC、I2C總線數(shù)據(jù)信號SDA(輸出SDAOUT/D2輸出,SD

    2024年02月13日
    瀏覽(16)
  • 嵌入式系統(tǒng)開發(fā)筆記104:在STM32CubeIDE中導(dǎo)入工程

    嵌入式系統(tǒng)開發(fā)筆記104:在STM32CubeIDE中導(dǎo)入工程

    ??本文講述如何在STM32CubeIDE中導(dǎo)入現(xiàn)有工程。

    2024年02月16日
    瀏覽(90)
  • STM32外設(shè)系列—BH1750

    STM32外設(shè)系列—BH1750

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! BH1750是一款數(shù)字型光照強度傳感器,能夠獲取周圍環(huán)境的光照強度。其測量范圍在0~65535 lx。 lx勒克斯,是光照強度的單位。 BH1750可用于調(diào)節(jié)手機屏幕和鍵盤的背光功率,或

    2024年02月12日
    瀏覽(18)
  • STM32外設(shè)系列—DHT11

    STM32外設(shè)系列—DHT11

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! 更新記錄 日期 更新內(nèi)容 2023.10.27 2023.10.27 添加了DHT11復(fù)位程序、DHT11連接檢測程序、DHT11初始化程序,修改了DHT11接收一個字節(jié)程序邏輯,更新了接收溫濕度數(shù)據(jù)并校準的程序

    2024年02月15日
    瀏覽(14)
  • STM32外設(shè)系列—HC-05(藍牙)

    STM32外設(shè)系列—HC-05(藍牙)

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! 藍牙(Bluetooth)是一種無線技術(shù)標準,可實現(xiàn)固定設(shè)備、移動設(shè)備和樓宇個人域網(wǎng)之間的短距離數(shù)據(jù)交換(使用2.4~2.485GHz的ISM波段的UHF無線電波)。藍牙技術(shù)最初由電信巨頭愛立信

    2024年02月12日
    瀏覽(29)
  • STM32外設(shè)系列—sg90(舵機)

    STM32外設(shè)系列—sg90(舵機)

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! 首先介紹說一下什么是舵機。舵機是一種位置(角度)伺服的驅(qū)動器。適用于一些需要角度不斷變化的,可以保持的控制系統(tǒng)。sg90就是舵機的一種。 舵機的工作原理比較簡

    2024年02月15日
    瀏覽(15)
  • 嵌入式項目分享 單片機遠程wifi紅外無接觸體溫測量系統(tǒng) - 物聯(lián)網(wǎng) stm32

    嵌入式項目分享 單片機遠程wifi紅外無接觸體溫測量系統(tǒng) - 物聯(lián)網(wǎng) stm32

    ?? 這兩年開始畢業(yè)設(shè)計和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點,往往達不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長自己做的項目系統(tǒng)達不到老師的要求。 為了大家能夠順利以及最少的精力通過畢設(shè),學(xué)長分享優(yōu)質(zhì)畢業(yè)設(shè)計項目,今天

    2024年02月20日
    瀏覽(90)
  • STM32外設(shè)系列—TB6612FNG

    STM32外設(shè)系列—TB6612FNG

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! 本文涉及到定時器和串口的知識,詳細內(nèi)容可見博主STM32速成筆記專欄。 TB6612FNG是東芝半導(dǎo)體的一款驅(qū)動電機的IC。一個TB6612FNG可以驅(qū)動兩個電機,每一個驅(qū)動都有兩個邏輯

    2024年02月14日
    瀏覽(21)
  • STM32外設(shè)系列—ESP8266(WIFI)

    STM32外設(shè)系列—ESP8266(WIFI)

    ?? 文章作者:二土電子 ?? 關(guān)注文末公眾號獲取其他資料和工程文件! ?? 期待大家一起學(xué)習交流! ESP8266是嵌入式和物聯(lián)網(wǎng)開發(fā)中常用的模塊,它可以單獨作為MCU使用,也可以作為一個簡單的WIFI模塊。ESP8266可以利用串口與單片機進行通訊。利用ESP8266可以訪問一些API,獲取

    2024年02月16日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包