hs5104是乙個通用的紅外遙控編碼晶元,採用38khz載波紅外訊號編碼發射輸出,定向性,抗干擾性都不錯。採用的是按鍵起振模式,在平時沒有按鍵時是不通電的,沒有功耗。晶元有8個輸入通道及2個使用者碼設定鍵,最大可以管理32個按鍵編碼。可以用作一些家電和電動玩具的遙控器上,也可以與微控制器構成乙個短距離的(7~10m)的紅外遙控系統。
hs5104的編碼是12位資料編碼,每次按鍵按下時,先進行32ms延時,然後再連帶起始碼發出按鍵編碼,直到按鍵抬起,才停止傳送編碼。每次按鍵至少傳送兩次。這些需要在微控制器中進行軟體處理。hs5104資料輸出格式,連續兩幀碼之間間隔四位,根據48k訊號的長短來區分0和1。
紅外置收使用也是38khz整合紅外解碼模組,與微控制器的連線較為簡單,接收管的輸出通過三極體反向後連線到微控制器的io口。軟體中使用查詢方式進行解碼,也可以連線到微控制器中斷口,使用中斷方式進行解碼。這裡使用的是io查詢方式。
解碼程式,用的是stc微控制器,11.0592mhz晶振,使用微控制器的定時器進行計數定時,可以比較準備測得每乙個高電平低電平的延時時間,準確進行解碼。
一些預定義:
#define bit_low (750) //16個38khz的定時器值,跟晶振有關,在實際用時,可以先用串列埠把這個值發出來
#define bit_high (2250)
#define bit_low_l (bit_low - 500) //為提高抗干擾性所放的餘量,這樣低電平的長度就是250~1250
#define bit_low_r (bit_low + 500)
#define bit_high_l (bit_high - 1200) //高電平長度1050~3450
#define bit_high_r (bit_high + 1200)
#define bit_width (bit_low_l + bit_high_r) //一位總長度,低電平最長時加上高電平最長時間
解碼函式,只是校驗了起始碼後直接返回按鍵值,至於一次按鍵多個碼,需要在讀鍵值時進行處理。
//初始化,將定時器設定為16位計數模式
void irda_init(void)
解碼函式:
uint16 irda_soft_decord(void)
for (i=0; i<12; i++)
} while (irda_port);
irda_tr = 0;
irda_th = 0;
irda_tl = 0;
if (mid < bit_low_l) //less then 360 us, error
if (mid > bit_high_l) //big then 800us, 1, or 0;
irda_th = 0;
irda_tl = 0;
irda_tr = 1;
do
} while (!irda_port);
}
if ((key & start_code) == start_code)
else
}
//end