基于AVR Mega16单片机的红外防盗系统.docx
《基于AVR Mega16单片机的红外防盗系统.docx》由会员分享,可在线阅读,更多相关《基于AVR Mega16单片机的红外防盗系统.docx(13页珍藏版)》请在冰点文库上搜索。
基于AVRMega16单片机的红外防盗系统
红外报警系统
隋淞印唐国梁孙家齐
设计目的:
为个人家居以及公共场所提供一个防盗报警的有力保障。
目前市场上的主流红外线防盗系统大都由红外对管加简单外围电路直接驱动报警器,这样虽然节省了成本却达不到一定的精度要求。
我们设计基于AVRMega16单片机的红外防盗系统的目的就在于使防盗系统有更高的灵敏度和精确度,并且很重要的一点是我们在这个装置中加入了一个时钟系统,能够记录下有人擅自或非法闯入的准确时刻,为破案取证提供了重要的线索。
同时将所学的单片机知识应用于实践。
设计用途及功能:
本产品可安置在一些禁止入内的场所的入口,如军火库、金库、危险物品存放地等,能够起到提示警告的作用。
同时也可以用于家居或办公场所,安置于隐蔽处,当有盗贼闯入时,报警将盗贼吓跑或提示主人采取行动,同时记录下的闯入的时刻有助于警方破案。
电路原理图:
硬件设计及使用:
如以上原理图所示,PB0、PB1和PB5为输出口,分别驱动红色LED、绿色LED和蜂鸣器,所连电阻即R0和R1、R2、R3都是电路板自带的。
蜂鸣器的两个引脚分别为正负极,当正负极两端加上5V电压后,蜂鸣器发出响声。
注意,该蜂鸣器两脚不能接反,否则蜂鸣器会烧毁。
PB7为输入口,设置内部上拉使能,外接红外探测器。
红外探测器实为红外光电开关,采用实验室里的12V直流电源供电,其特性为:
当光电开关发出的光线在探测距离内未被反射时,OUT输出9V高电平;当光电开关发出的光线在探测距离内被反射时,OUT输出0V低电平。
根据这一电平特性,采用上图分压电路,该分压电路采用串联分压,使红外探测器高电平时有4.7伏左右电压输入到MAGE16单片机,从而达到输入电平的变化。
此分压电路为自己焊接而成,电路板上没有。
七段数码管的七个端口分别连接180欧姆的电阻,再连接至单片机的PA0-PA6端口。
4个位选端口分别与PD0-PD3连接。
软件设计思想及功能:
软件在设计的时候也是分为两个部分,即报警部分和时钟部分。
设计的思路来自市面上流行的防盗系统的运作方式。
简单的说就是用单片机控制各个硬件的状态变化,从而达到报警的效果。
报警部分比较简单,大体就是判断PB7端口输入的是高电平还是低电平,若输入低电平,则命令单片机,使驱动红色LED灯闪亮,同时蜂鸣器报警。
时钟部分比较复杂,但也是比较常规的程序设计,与常见的主流时钟程序类似,在此不多做介绍,可参看我们的源程序。
系统的检测与调试:
对于时钟精确度的检测,我们给系统提供电源使其运行12个小时后,再与标准时间对照,确定时钟系统在12小时内几乎无误差,精确运行。
对于报警系统的检测,我们甚至用一根细线在光电开关前迅速划过,结果系统及时精确报警,灵敏度极高。
所需资源:
Mega16单片机、CourseProject实验板、4位的七段数码管、光电开关、红色LED,电阻若干,导线若干。
应用拓展:
见证了我们作品的实际效果之后,我们联想到可以把此装置加以改进,制成短跑冲刺时的精确记录统计装置。
当运动员冲过终点线(光电开关正对的水平直线)时,此装置精确记录下时刻,十分精确灵敏。
当然,要实现这种用途,在软硬件上还要做出少许改动。
成员分工情况:
隋淞印:
总体设计及硬件焊接,程序烧录,论文、总结及PPT编写。
唐国梁:
软件设计及后期调试。
孙家齐:
硬件调试及Protel原理图。
以上是各成员分工情况,实际工作中大家通力合作互相补充,共同为完成课程设计而努力,任何一个成员的贡献都是我们这个团队不可或缺的一部分。
我们团队各成员的贡献系数为:
隋淞印0.4唐国梁0.3孙家齐0.3
实物照片:
参考资料:
《AVR单片机嵌入式系统原理与应用实践》
《大学生科技创新大赛培训教程》
《单片机与C语言开发》
源程序:
//ICC-AVRapplicationbuilder:
2009-6-722:
20:
51
//Target:
M16
//Crystal:
4.0000Mhz
#include
#include
voidport_init(void)
{
PORTB=0x1E;
DDRB=0x23;
PORTA=0x00;
DDRA=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
}
voidinit_devices(void)
{
CLI();
port_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x00;
SEI();
}
voiddelay_nus(unsignedintn);
voiddelay_nms(unsignedintn);
voidmain(void)
{PORTB=0x1E;
DDRB=0x23;
while
(1)
{if((PINB&0b10000000)==0)
{
PORTB=0x7D;
DDRB=0x23;
delay_nms(30000);
}
}
}
voiddelay_nus(unsignedintn)
{
unsignedinti;
for(i=0;i{
asm("nop");
}
}
voiddelay_nms(unsignedintn)
{
unsignedinti;
for(i=0;idelay_nus(1000);
}
/*******************************************************
Filename;时钟
Chiptype;ATmega16
Programtype;Application
Clockfrequency;1.000000MHz
Memorymodel;Small
ExternalSPAMsize;0
Datastacksize;256
********************************************************/
#include
#include
unsignedcharled_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsignedcharposition[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsignedintt[9]={0,956,865,759,716,638,568,506,470};
unsignedchard[9]={0,105,116,132,140,157,176,198,209};
#defineMax_note32
unsignedcharmusic[Max_note]={5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,3,2,3,2,1,2,3,2,4,2,5,8};
unsignedcharnote_n;
unsignedintint_n;
intplay_on;
unsignedchartime[3],time_set[3];
unsignedchardis_buff[6];
unsignedchartime_counter,key_stime_counter;
unsignedcharclock_state=6,return_time;
intpoint_on,set_on,time_1s_ok,key_stime_ok;
voiddisplay(void)
{
staticunsignedcharposit=0;
PORTD=0xff;
PORTA=led_7[dis_buff[posit]];
if(set_on&&(posit==clock_state))PORTA=0x00;
if(point_on&&(posit==2||posit==4))PORTA|=0x80;
PORTD=position[posit];
if(++posit>=6)posit=0;
}
#pragmainterrupt_handlertimer0_comp_isr:
iv_TIMER0_COMP
voidtimer0_comp_isr(void)
{
display();
if(++key_stime_counter>=5)
{
key_stime_counter=0;
key_stime_ok=1;
if(!
(++time_counter%25))set_on=!
set_on;
if(time_counter>=100)
{
time_counter=0;
time_1s_ok=1;
}
}
}
#pragmainterrupt_handlertimer1_compa_isr:
iv_TIMER1_COMPA
voidtimer1_compa_isr(void)
{
if(!
play_on)
{
note_n=0;
int_n=1;
play_on=1;
}
else
{
if(--int_n==0)
{
TCCR1B=0x08;
if(note_n{
OCR1A=t[music[note_n]];
int_n=d[music[note_n]];
note_n++;
int_n=int_n*music[note_n];
note_n++;
TCCR1B=0x09;
}
else
play_on=0;
}
}
}
voidtime_to_disbuffer(unsignedchar*time)
{
unsignedchari,j=0;
for(i=0;i<=2;i++)
{
dis_buff[j++]=time[i]%10;
dis_buff[j++]=time[i]/10;
}
}
#definekey_inputPINC
#definekey_mask0b11000000
#definekey_no0
#definekey_k11
#definekey_k22
#definekey_state_00
#definekey_state_11
#definekey_state_22
unsignedcharread_key(void)
{
staticunsignedcharkey_state=0,key_old;
unsignedcharkey_press,key_return=key_no;
key_press=key_input&key_mask;
switch(key_state)
{
casekey_state_0:
if(key_press!
=key_mask)
{
key_old=key_press;
key_state=key_state_1;
}
break;
casekey_state_1:
if(key_press==key_old)
{
if(key_press==0b01000000)key_return=key_k1;
elseif(key_press==0b01000000)key_return=key_k2;
key_state=key_state_2;
}
else
key_state=key_state_0;
break;
casekey_state_2:
if(key_press==key_mask)key_state=key_state_0;
break;
}
returnkey_return;
}
voidmain(void)
{
unsignedcharkey_temp,i;
DDRA=0xFF;
PORTD=0xFF;
DDRD=0x3F;
OCR0=0xF9;
TCCR0=0x0A;
TCCR1A=0x40;
TCCR1B=0x08;
TIMSK=0x12;
time[2]=23;time[1]=58;time[0]=55
SEI();
while
(1)
{
if(time_1s_ok)
{
time_1s_ok=0;
point_on=~point_on;
if(++time[0]>=60)
{
time[0]=0;
if(!
play_on)TCCR1B=0x09;
if(++time[1]>=60)
{
time[1]=0;
if(++time[2]>=24)time[2]=0;
}
}
if((++return_time>=20)&&(clock_state!
=6))clock_state=6;
if(clock_state==6)time_to_disbuffer(time);
}
if(key_stime_ok)
{
key_stime_ok=0;
key_temp=read_key();
if(key_temp)
{
return_time=0;
if(key_temp==key_k1)
{
if(++clock_state>=7)clock_state=0;
if(clock_state==0)
{
for(i=0;i<=2;i++)time_set[i]=0;
time_to_disbuffer(time_set);
}
if(clock_state==6)
{
for(i=0;i<=2;i++)time[i]=time_set[i];
time_to_disbuffer(time);
}
}
if((clock_state!
=6)&&(key_temp==key_k2))
{
if(clock_state%2)time_set[clock_state/2]+=10;
else
{
if((time_set[clock_state/2]%10)==9)
time_set[clock_state/2]-=9;
else
time_set[clock_state/2]+=1;
}
if(time_set[0]>=60)time_set[0]-=60;
if(time_set[1]>=60)time_set[1]-=60;
if(time_set[2]>=24)time_set[2]-=10;
time_to_disbuffer(time_set);
}
}
}
}
}