跟我學(xué)51單片機(jī)(六):?jiǎn)纹瑱C(jī)外部中斷及紅外遙控器解碼
PHILIPS 標(biāo)準(zhǔn):載波頻率為38kHz ;沒(méi)有簡(jiǎn)碼,點(diǎn)按鍵時(shí),控制碼在1 和0 之間切換,若持續(xù)按鍵,則控制碼不變。一個(gè)全碼可等同于起始碼、控制碼、系統(tǒng)碼、數(shù)據(jù)碼的時(shí)間總和,如圖4 所示。
圖4 PHILIPS標(biāo)準(zhǔn)下的全碼表示
數(shù)據(jù)0 用“低電平0. 889ms +高電平0. 889ms”
表示;數(shù)據(jù)1 用“ 高電平0. 889ms + 低電平0.
889ms”表示(圖5)。連續(xù)碼重復(fù)延時(shí)114ms。
圖5 PHILIPS標(biāo)準(zhǔn)下的數(shù)據(jù)0和1的表示
在本講中采用的是SAA3010 這款紅外遙控器(見(jiàn)圖6(a)),其符合常見(jiàn)的PHILIPS 標(biāo)準(zhǔn)中的RC-5 編碼格式,其一幀碼序列是由2 位控制碼,1 位翻轉(zhuǎn)碼,5 為地址碼,6 位數(shù)據(jù)碼,結(jié)束碼組成。其數(shù)據(jù)位時(shí)間長(zhǎng)度是1.688ms。連續(xù)碼重復(fù)延時(shí)為108ms,即在每按鍵一直被按下時(shí)延時(shí)為108ms 再輸出同樣的一幀數(shù)據(jù)。
圖6 (a) SAA3010遙控器外觀圖 (b) SAA3010的數(shù)據(jù)位 (c) SAA3010的數(shù)據(jù)重復(fù)周期
從圖6 中可以看出,SAA3010 的位傳送方式是采用雙相位,位1 和位0 的相位正好相反。在解碼時(shí)可以用定時(shí)采樣的方式進(jìn)行解碼,一個(gè)位采樣二次,分別在位波形的四分之一和四分之三處進(jìn)行采樣,如位1 用這種方法采樣的值就是0 和1。當(dāng)然也可以只采樣一次,例如在波形的四分之一處進(jìn)行采樣,然后定時(shí)一個(gè)波形的周期再采樣,這樣位1 采樣的值就是0(本講的實(shí)例即是采用這種方法)。
三、電路詳解
如圖7 (a) 中所示,紅外接收頭解碼電路非常簡(jiǎn)單,采用的是一體化紅外線接收頭,一體化的紅外接收頭將遙控信號(hào)的接收、放大、檢波、整形集于一身,并且輸出可以讓單片機(jī)識(shí)別的TTL 信號(hào),這樣大大簡(jiǎn)化了接收電路的復(fù)雜程度和電路的設(shè)計(jì)工作,方便使用。在本講中采用的是紅外一體化接收頭HS0038,其外觀圖如7(b) 所示。其為黑色環(huán)氧樹脂封裝,不受日光、熒光燈等光源干擾,內(nèi)附磁屏蔽,功耗低,靈敏度高。在用小功率發(fā)射管發(fā)射信號(hào)情況下,接收距離可達(dá)30m。它能與TTL、COMS 電路兼容。HS0038 為直立側(cè)面收光型。它接收紅外信號(hào)頻率為38 kHz, 周期約26μs,同時(shí)能對(duì)信號(hào)進(jìn)行放大、檢波、整形,得到TTL 電平的編碼信號(hào)。
圖7 (a) 紅外接收頭解碼電路 (b) HS0038外觀圖
其三個(gè)管腳分別是地、電源正、解調(diào)信號(hào)輸出端。
為了響應(yīng)速度,紅外接收頭的解碼信號(hào)輸出接入到單片機(jī)P3.3(外部中斷1)端口上,這樣一旦有紅外解碼信號(hào)輸出就可觸發(fā)進(jìn)去中斷。此外,電容C7 用于電源去耦濾波,保證紅外接收頭穩(wěn)定工作。
四、程序設(shè)計(jì)
本講設(shè)計(jì)的核心程序如下:
void time0() interrupt 1 ( 1)
bit in = ~IR_Input; ( 2)
TH0 = 0XFF; ( 3)
TL0 = 0X83; ( 4)
IR_Data[IR_sign] = IR_Data[IR_sign] | in; ( 5)
IR_count++; ( 6)
if(IR_count == 1 || IR_count == 2) ( 7)
{
if(in == 0) ( 8)
{
TR0 = 0; ( 9)
EX1 = 1; ( 10)
return; ( 11)
}
}
if(IR_count == 3) ( 12)
{
IR_sign = 1; ( 13)
}
else if(IR_count == 8) ( 14)
{
if(IR_Data[1] != 0) ( 15)
{
TR0 = 0; ( 16)
EX1 = 1;
return;
}
IR_sign = 2; ( 17)
}
else if(IR_count == 14) ( 18)
{
IR_sign = 3; ( 19)
}
else if(IR_sign == 3) ( 20)
{
TR0 = 0; ( 21)
IR_Success(); ( 22)
return; ( 23)
}
else
IR_Data[IR_sign] = IR_Data[IR_sign] 《 1; ( 24)
評(píng)論