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