用atmega8做簡(jiǎn)單的紅外線報(bào)警器
本實(shí)驗(yàn)將制做一個(gè)簡(jiǎn)單的被動(dòng)式紅外線防盜報(bào)警器。該報(bào)警器由紅外線發(fā)射、接收、蜂鳴器和LED指示燈組成。正常情況下,綠色的LED常爍,表示監(jiān)控區(qū)域正常。一旦監(jiān)控區(qū)域有人闖入,綠色LED熄滅,紅色的LED快速閃爍,同時(shí)蜂鳴器立即報(bào)警。需要準(zhǔn)備的器材:Atmega8、紅色LED一只、綠色LED一只、萬(wàn)能實(shí)驗(yàn)板一塊、5V電源、電阻、TTL0038或者其他類(lèi)似38KHZ的紅外接收頭、5V長(zhǎng)鳴型蜂鳴器。
該電路工作原理非常簡(jiǎn)單,Atmega8的PD0端口輸出經(jīng)過(guò)調(diào)制的38KHZ的方波信號(hào),然后經(jīng)Q2驅(qū)動(dòng)紅外線發(fā)射管LED0發(fā)出紅外線信號(hào)。TL0038是集紅外線信號(hào)接收放大為一體的接收器。其中心接收頻率為38KZH,輸出為T(mén)TL電平,平時(shí)輸出高電平,當(dāng)收到碼信號(hào)后,輸出低電平。BELL為長(zhǎng)鳴蜂鳴器,兩個(gè)引腳分別為正負(fù)極,當(dāng)正負(fù)極兩端加上5V電壓后,蜂鳴器發(fā)出響聲。注意,該蜂鳴器兩腳不能接反,否則蜂鳴器會(huì)燒毀。電路工作后,正常情況下TL0038接收不到紅外信號(hào),而輸出高電平。當(dāng)有物體出現(xiàn)在發(fā)射管前方時(shí),TTL0038會(huì)接收到從物體上反射回來(lái)的紅外光信號(hào),然后輸出低電平通知MCU打開(kāi)蜂鳴器報(bào)警。該電路工作原理非常簡(jiǎn)單,Atmega8的PD0端口輸出經(jīng)過(guò)調(diào)制的38KHZ的方波信號(hào),然后經(jīng)Q2驅(qū)動(dòng)紅外線發(fā)射管LED0發(fā)出紅外線信號(hào)。TL0038是集紅外線信號(hào)接收放大為一體的接收器。其中心接收頻率為38KZH,輸出為T(mén)TL電平,平時(shí)輸出高電平,當(dāng)收到碼信號(hào)后,輸出低電平。BELL為長(zhǎng)鳴蜂鳴器,兩個(gè)引腳分別為正負(fù)極,當(dāng)正負(fù)極兩端加上5V電壓后,蜂鳴器發(fā)出響聲。注意,該蜂鳴器兩腳不能接反,否則蜂鳴器會(huì)燒毀。電路工作后,正常情況下TL0038接收不到紅外信號(hào),而輸出高電平。當(dāng)有物體出現(xiàn)在發(fā)射管前方時(shí),TTL0038會(huì)接收到從物體上反射回來(lái)的紅外光信號(hào),然后輸出低電平通知MCU打開(kāi)蜂鳴器報(bào)警。同時(shí),程序通過(guò)不斷地讀取PC5腳的電平值來(lái)判斷TL0038是否接收到紅外信號(hào)。一旦連續(xù)檢測(cè)到N次PC5為低電平,則立即打開(kāi)蜂鳴器和紅色的LED。之所以要連續(xù)檢測(cè)N次,主要是防止TL0038上產(chǎn)生雜波信號(hào)而誤告警。
#include
#include
實(shí)驗(yàn)2:簡(jiǎn)單的被動(dòng)式紅外線報(bào)警器
PB1:綠色LED
PB0:紅色LED
PD7:蜂鳴器
PC5:連接TL0083的輸出端
PD0:紅外LED
2004年8月4日
***************************************************************************/
voiddelay_nus(unsignedintn);//voiddelay_nms(unsignedintn);
voidmain(void)//主函數(shù)
{
unsignedinti;
unsignedcharn;
OSCCAL=0X98;//系統(tǒng)時(shí)鐘校準(zhǔn),不同的芯片和不同的頻率,
//其校準(zhǔn)值是不一樣的
TCCR0=BIT(CS01);//T/C0時(shí)鐘8分頻
TIMSK=BIT(TOIE0);//允許定時(shí)器T/C0溢出中斷
SEI();//開(kāi)中斷
DDRD|=BIT(0)|BIT(7);//設(shè)置PD0、7為輸出口
DDRC&=~BIT(5);//設(shè)置PC5為輸入口
DDRB|=BIT(1)|BIT(0);//定義B口的PB0、PB1為輸出口
PORTB|=BIT(1);//PB1口輸出高電平,綠燈亮
while(1)
{
for(n=0;n<10;n++)
{
delay_nus(60);
if((PINC&0B00100000)==0)//檢測(cè)PC5是否為低電平
{
i++;
if(i>8)//如果連續(xù)檢測(cè)到有301-399次PC5都為低電平,則報(bào)警
{
CLI();
for(i=0;i<10;i++)
{
PORTB&=~BIT(1);//關(guān)閉綠燈
PORTD|=BIT(7);//打開(kāi)蜂鳴器
PORTB^=BIT(0);//翻轉(zhuǎn)PB1口,紅燈快閃
delay_nms(300);
}
PORTD&=~BIT(7);//關(guān)閉蜂鳴器
PORTB&=~BIT(0);//關(guān)閉紅燈
i=0;
SEI();
}
PORTB|=BIT(1);//打開(kāi)綠燈
}
}
/***************碼調(diào)制*****************************/
CLI();//PD0連續(xù)2ms都無(wú)輸出
PORTD&=~BIT(0);
delay_nms(2);
TCNT0=245;
SEI();//PD0連續(xù)600us產(chǎn)生38KHZ信號(hào)
}
}
#pragmainterrupt_handlerLED0:iv_TIMER0_OVF//指定中斷服務(wù)程序的入口
voidLED0(void)//產(chǎn)生38KHz的方波信號(hào)
{
PORTD^=BIT(0);//翻轉(zhuǎn)PD0口電平
TCNT0=245;
}
voiddelay_nus(unsignedintn)//n微秒延時(shí)函數(shù)
{
unsignedinti;
for(i=0;i
asm("nop");
}
}
voiddelay_nms(unsignedintn)//n毫秒延時(shí)函數(shù)
{
unsignedinti;
for(i=0;i
}