微控制器定時器實現紅外遙控資料接收

2021-09-10 06:17:29 字數 2787 閱讀 4792

一、原理

1、紅外發射協議

紅外通訊的協議有很多種。這個實驗使用的是nec協議。這個協議採用pwm的方法進行調製,利用脈衝寬度來表示 0 和 1 。

nec 遙控指令的資料格式為:同步碼頭、位址碼、位址反碼、控制碼、控制反碼。同步碼由乙個 9ms 的低電平和乙個 4.5ms 的高電平組成,位址碼、位址反碼、控制碼、控制反碼均是 8 位資料格式。按照低位在前,高位在後的順序傳送。採用反碼是為了增加傳輸的可靠性。因此,每幀的資料為 32 位,包括位址碼,位址反碼,控制碼,控制反碼。反碼可用於解碼時進行校驗比對。

nec碼的位定義:乙個脈衝對應 560us 的連續載波,乙個邏輯 1 傳輸需要 2.25ms(560us 脈衝+1680us 低電平),乙個邏輯 0 的傳輸需要 1.125ms(560us 脈衝+560us 低電平)。而遙控接收頭在收到脈衝的時候為低電平,在沒有脈衝的時候為高電平,這樣,在接收頭端收到的訊號為:邏輯 1 應該是 560us 低+1680us 高,邏輯 0 應該是 560us 低+560us 高。

紅外資料的波形如下圖:包括乙個同步頭和 32 幀資料。

下圖可看出,同步頭為 9ms 低電平加上 4.5ms 高電平,控制碼為 8 個 0,控制反碼為 8 個 1。

2、定時器計數

定時器就是按照乙個特定的頻率對計數值進行加一或減一操作,當數值溢位時則產生乙個標誌或中斷。這裡是用定時器計數產生乙個週期性的中斷。

3、實現方法

利用定時器記錄兩個下降沿之間的時間,通過該時間判斷是否是同步頭資訊、資料 1 或者資料 0。當檢測到同步頭,開始記錄 32 個資料的時間值。

二、實現

1、配置 gpio 口下降沿觸發中斷

示例**中使用 pa7 管腳,配置為上拉輸入模式。

選擇下降沿觸發,是因為紅外置收管預設情況下保持高電平,接收到資料時從高電平轉變為低電平。

中斷源選擇為 exti_line7 ,在庫函式中對該中斷源定義的服務函式為 exti9_5_irqhandler(),也就是說外部中斷 5 到 9 是 共用乙個中斷服務函式的。

配置**如下:

void ir_pin_init()

2、配置定時器計數值

定時器使用的是 tim2 通用定時器,模式為向上計數。在該模式中,計數器從 0 計數到自動載入值 (timx_arr計數器的內容) ,然後重新從 0 開始計數並且產生乙個計數器溢位事件。

示例函式接收兩個引數,分別為預分頻器的值和自動載入值。通過調整這兩個引數,可以靈活地改變定時器的計數週期。例如在 tim2 的預設時鐘源 pclk1 為96mhz時,使用語句 tim2_upcount_init(systemcoreclock/1000000-1,100-1); 進行初始化,可以每 0.1ms 產生一次中斷。

示例**如下:

void tim2_upcount_init(u16 prescaler,u16 period)

3、定時器中斷函式統計時間

如上所說,定時器每 0.1ms 計數完成,產生中斷,在中斷函式中對標誌位 uctim2flag 加 1,意味著時間過去了 0.1ms。

時間標誌位原型為 uint16_t uctim2flag; 。

示例**如下:

void tim2_irqhandler(void)

4、gpio 中斷函式中接收 32 位資料

在下降沿觸發的 io 口中斷函式中,需要實現統計兩個下降沿之間的時間,並將其記錄在陣列中。

下降沿第一次觸發時,清除當前定時器中的計數值,以便統計時間。之後每一次下降沿觸發就記錄下當前計數值,然後再對其清零。如果該時間在同步頭的時間區間內,對索引進行清零,表示重新開始接收資料。

完整接收同步頭和 32 個資料之後,表示接收完成。

示例**如下:

uint8_t irdata[33]; //用於記錄兩個下降沿之間的時間

bool receivecomplete; //接收完成標誌位

uint8_t idx; //用於索引接收到的數值

bool startflag; //表示開始接收

void exti9_5_irqhandler(void)

irdata[idx] = uctim2flag; // 獲取計數時間

uctim2flag = 0; // 清零計數時間,以便下次統計

idx++; // 接收到乙個資料,索引加1

if(idx==33) // 如果接收到33個資料,包括32位數和以乙個同步頭

}else // 下降沿第一次觸發

exti_clearitpendingbit(exti_line7); // 清除中斷標誌

}5、判斷控制碼值

由於中斷函式中接收並記錄下的資料是兩個下降沿之間的時間,並不是紅外所傳送的資料。因此需要根據紅外協議,對 32 個時間進行判斷,從而獲得紅外真正傳送的資料。

下面這個函式需要在紅外完整接收資料後執行,可通過判斷接收完成標誌位 receivecomplete 來實現。

示例**如下:

uint8_t ir_server()

else if(irdata[idx] >=18 && irdata[idx]<25) //表示 1

remote_code <<= 1;

remote_code |= temp;

idx++;}}

return remote_code[2]; // 該陣列中記錄的是控制碼,每個按鍵不一樣

//for(idx=0; idx<4; idx++)//}

6、主函式

在 main 函式中,對 io 口和 定時器進行初始化。

主迴圈中,通過判斷接收完成標誌位,對接收完成的按鍵控制碼進行列印。

示例**如下:

void main()}}

51微控制器 紅外遙控

紅外遙控系統主要由紅外發射裝置和紅外置收裝置構成。紅外發射裝置主要由鍵盤電路 紅外編碼晶元 電源和紅外發射電路組成 比如遙控器 如圖 紅外置收裝置主要由紅外置收電路 紅外解碼晶元 電源和應用電路組成,在微控制器開發板上有紅外置收電路,而且微控制器充當解碼晶元。人的眼睛能看到的可見光按波長從長到短排列...

微控制器定時器雙擊 微控制器實現60s定時器

2個定時中斷,2個按鈕中斷 include define seg p2 數碼管 斷碼口 define scanp p1 數碼管 com掃瞄口sbit oc p0 0 定義573鎖存器使能口,我是用的573驅動7段數碼管 sbit pb0 p3 2 按鈕0 sbit pb1 p3 3 按鈕1 第乙個定...

51微控制器 紅外遙控解碼

ir infrared radiation 通用紅外遙控系統由發射和接受兩大部分組成,應用編 解碼專用積體電路晶元來進行控制操作。發射部分包括鍵盤矩陣,編碼調製,led紅外線發射。接受部分包括光,電轉化放大器,解調,解碼電路。接收電路可以使用一種集紅外線接受和放大於一體的一體化紅外置收器,不需要任何...