本章,介紹如何通過stm32來解碼紅外遙控器的訊號。戰艦stmf103標配了紅外置收頭和乙個很小巧的紅外遙控器。在本章中,將利用stm32f1的輸入捕獲功能,解碼開發板標配的這個紅外遙控器的編碼訊號,並將解碼後的鍵值在tftlcd模組上顯示出來。
紅外遙控是一種無線、非接觸摸制技術,具有抗干擾能力強,資訊傳輸可靠,功耗低,成本低,易實現等顯著優點,被諸多電子裝置特別是家用電器廣泛採用,並越來越多的應用到計算機系統中。
由於紅外線遙控不具有像無線電遙控那樣穿過障礙物去控制被控物件的能力,所以,在設計紅外線遙控器時,不必要像無線電遙控器那樣,每套(發射器和接收器)要有不同的遙控頻率或編碼(否則,就會隔牆控制或干擾鄰居的家用電器),所以同類產品的紅外線遙控器,可以有相同的遙控頻率或編碼,而不會出現遙控訊號「串門」的情況。這對於大批量生產以及在家用電器上普及紅外線遙控提供了極大的方便。由於紅外線為不可見光,因此對環境影響很小,再由紅外光波動波長遠小於無線電波的波長,所以紅外線遙控不會影響其他家用電器,也不會影響臨近的無線電裝置。
紅外遙控的編碼目前廣泛使用的是:nec protocol的pwm(脈衝寬度調製)和philips rc-5 protocol的ppm(脈衝位置調製)。戰艦stm32開發板配套的遙控器使用的是nec協議,其特徵如下:
8位位址和8位指令長度
位址和命令2次傳輸(確保可靠性)
ppm脈衝位置調製,以發射紅外載波的占空比代表「0」和「1」
載波頻率為38khz
位時間為1.125ms或2.25ms
nec碼的位定義:乙個脈衝對應560us的連續載波,乙個邏輯1傳輸需要2.25ms(560us脈衝+1680us低電平),乙個邏輯0的傳輸需要1.125ms(560us脈衝+560us低電平)。而遙控接收頭在收到脈衝的時候為低電平,在沒有脈衝的時候為高電平,這樣,我們在接收頭端收到的訊號為:
邏輯1應該是560us低+1680us高。
邏輯0應該是560us低+560us高。
nec遙控指令的資料格式為:同步碼頭、位址碼、位址反碼、控制碼、控制反碼。
同步碼頭由乙個9ms的低電平和乙個4.5ms的高電平組成。
位址碼、位址反碼、控制碼、控制反碼均是8位資料格式。按照低位在前,高位在後的順序傳送。
採用反碼是為了增加傳輸的可靠性(可用於校驗)。
main.c函式
#include
"led.h"
#include
"delay.h"
#include
"key.h"
#include
"sys.h"
#include
"lcd.h"
#include
"usart.h"
#include
"remote.h"
intmain
(void
)lcd_fill(86
,170
,116+8
*8,170+16
,white)
;//清楚之前的顯示
lcd_showstring(86
,170
,200,16
,16,str)
;//顯示symbol
printf
("str = %d.\n"
,str);}
else
delay_ms(10
);
t++;if
(t==20)
}}
remote.c函式
#include
"remote.h"
#include
"delay.h"
#include
"usart.h"
//紅外遙控初始化
//設定io以及定時器4的輸入捕獲
void
remote_init
(void
)//遙控器接收狀態
//[7]:收到了引導碼標誌
//[6]:得到了乙個按鍵的所有資訊
//[5]:保留
//[4]:標記上公升沿是否已經**獲
//[3:0]:溢位計時器
u8 rmtsta=
0;
u16 dval;
//下降沿時計數器的值
u32 rmtrec=0;
//紅外置收到的資料
u8 rmtcnt=0;
//按鍵按下的次數
//定時器4中斷服務程式
void
tim4_irqhandler
(void)}
}if(tim_getitstatus
(tim4,tim_it_cc4)
!=reset)
else
//下降沿捕獲
else
if(dval>
1400
&&dval<
1800
)//1680為標準值,1680us
else
if(dval>
2200
&&dval<
2600
)//得到按鍵鍵值增加的資訊 2500為標準值2.5ms
}else
if(dval>
4200
&&dval<
4700
)//4500為標準值4.5ms
} rmtsta&=~
(1<<4)
;}}tim_clearitpendingbit
(tim4,tim_it_update|tim_it_cc4);}
//處理紅外鍵盤
//返回值:
// 0,沒有任何按鍵按下
//其他,按下的按鍵鍵值.
u8 remote_scan
(void)if
((sta==0)
||((rmtsta&
0x80)==
0))//按鍵資料錯誤/遙控已經沒有按下了
}return sta;
}
remote.**件
#ifndef __red_h
#define __red_h
#include
"sys.h"
#define rdata pbin(9)
//紅外資料輸入腳
//紅外遙控識別碼(id),每款遙控器的該值基本都不一樣,但也有一樣的.
//我們選用的遙控器識別碼為0
#define remote_id 0
extern u8 rmtcnt;
//按鍵按下的次數
void
remote_init
(void);
//紅外感測器接收頭引腳初始化
在定時器4的中斷處理程式中對紅外訊號進行解碼並儲存解碼後的資料,在紅外掃瞄函式中對解碼資料進行傳輸,因此,只需在主函式中呼叫紅外掃瞄函式即可得知遙控器按下的鍵值。
STM32F1開發指南筆記25 繼電器
當2個xq引腳通電時,電磁感應定律 電磁鐵會產生磁,從而吸附上面的銜鐵向下,下面的ck常開電路導通。微控制器可以直接驅動2個xq引腳 微控制器輸出的電流較小 也可以借助驅動電路 uln2003或者三極體 來驅動xq引腳,經過uln2003可以輸出較大的電流。2個xq引腳接在p26端子上,然後連線ul...
STM32F1開發指南筆記10 串列埠通訊
串列埠設定的一般步驟可以總結為如下幾個步驟 串列埠時鐘使能,gpio 時鐘使能 串列埠復位 gpio 埠模式設定 串列埠引數初始化 開啟中斷並且初始化 nvic 如果需要開啟中斷才需要這個步驟 使能串列埠 編寫中斷處理函式 插入換行 usart rx sta 0 else if times 200 ...
STM32f1學習筆記 GPIO
參考文章 stm32自學筆記 stm32可以提供很多gpio,一般分別在5個埠 port gpioa gpioe 每個埠有16個gpio,最大耐壓值為5v。每個埠有32為寬頻的設定暫存器,一共64位,每個gpio占用4位配置位。其中兩位設定gpio的方向,另外兩位設定gpio的工作模式。1 gpio...