资源描述
现代智能家居
安全系统
题目:现代智能家居安全系统设计
学院:电子与通信学院
班级:课程组
组员:
指导老师:
目录
第一章、概述
1. 课程介绍
2。 功能简介
第二章、系统设计
1。 系统框架
2。 功能模块
第三章、电路设计
1.模块介绍及其原理
第四章、程序设计
1.代码展示
第五章、实验与调试
1、下载调试
2、LCD的调试
3、按键的调试
4、电源模块的调试
5、语音模块的调试
6、LED与蜂鸣器的调试
第六章、测试结果
第七章、结论
附录
程序代码
第一章概述
1、 课程介绍
智能家居是以住宅为平台,利用综合布线技术、网络通信技术、智能家居-系统设计方案安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。伴随着数字化和网络化的进程,智能化的浪潮席卷了世界的每一个角落,成为一种势不可挡的历史化大趋势。这一切的最终目的为人们提供一个以人为本的舒适、便捷、高效、安全的生活环境。如何建立一个高效率、低成本的智能家居系统已成为当今世界的一个热点问题。本项目的起源与产生既基于此背景。
2、 功能简介
该系统主要能够实现的功能:正常情况下,该系统能够采集室内的温度,并显示出来供主人参考。当温度过高时该系统就会发出报警,灯光发亮,语音提示等,使得主人知道家中发生了险情,并及时进行处理。当有盗贼从窗户或者其他一些地方进入时家中时,会触动红外设置,单片机发信号给声光模块,告知主人和邻居有险情。采取有效的措施,防止损失。
第二章 系统设计
1、系统框架
单片机
电源模块
显示模块
警报模块
语音模块
输入模块
ISP下载模块
温度模块
红外模块
2、功能模块
(1)温度检测模块:采集温度
(2)声光报警模块:通过声音
(3)红外模块:检测有无人闯入
(4)液晶显示模块:显示信息,人机交流
(5)电源模块:给各个模块提供电源
(6)输入模块:4*4键盘,输入信息
(7)语音模块:发出语音
第三章电路设计
1、温度检测模块
该模块主要用于检测室内温度。采用改进型智能温度传感器DS18B20 与传统的热敏电阻相比,DS18B20能够直接读出被测温度,它仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源.因而使用DS18B20可使系统结构更趋简单,可靠性更高。当温度过高时即发生火灾时,单片机向声光模块发出信号,即发出声光报警。DS18B20的1脚接地,2脚接PORTC。0,3脚接电源,在2脚接一个4。7K的上拉电阻抗干扰。
2、声光报警模块
当温度过高时,该模块接收到单片机发出的信号后,声光模块开始动作,LED灯开始闪烁,蜂鸣器并发出声音报警,告知主人或邻居及时发现险情,及时的控制火情。当红外模块感知到有外人闯入时,该模块发出报警,威慑他人,使其不敢进入主人家中,并提醒邻居或主人,及早做出防范.
我们把若干个LED灯摆成笑脸形状。因为若干个LED灯和一个蜂鸣器工作时需要较大的电流。因此我们设计一个三极管(S9013)来进行驱动,保证了电路有足够大的电流。三极管的基极与PORTD.6连接.同时我们用了俩个1K分别与LED和蜂鸣器串联来进行分压保证其安全性.
3、红外线模块
该模块主要用于防盗,安置在窗户或者门口等地方,当有盗贼闯入时,会触动到那些安置好了的红外装置,发送信号给单片机,单片机经过处理后发送给声光模块。为了防止错报,我们安装若干个红外对管,当只有达到一定数量的红外对管发生中断时才报警。因为单片机的中断资源有限,所以我们用了2对红外对管来模拟若干个,当只有其中一个红外对管发生中断时,系统不报警,当两个红外对管都发生中断时,系统发出警报.这两对红外对管分别接单片机的PORTD.4(INT0)、PORTD。5(INT1)。
4、液晶显示模块
该模块主要应用于显示一些信息,起到与用户进行人机交流作用,用户可以通过显示模块,看到一些信息,例如现在的室内温度、现在系统启用的模式等.
我们将采用1602lcd来显示,四线制方式将1602与单片机的PORTB口相连接,1602的RS、RW、E、D4、D5、D6、D7分别接PORTA.0、PORTA。1、PORTA.2、PORTA。4、PORTA。5、PORTA.6、PORTA。7。电路如下:
5、电源模块
该模块主要用于给整个系统提供能够应用且稳定的电源。我们采用了7805这种型号的稳压器件,在输入端我们用了火牛插孔,便于连接电源,在输入的负极安装了一个按键开关,便于控制电源的开关,如下图:
6、输入模块
该模块由4*4个按键组成,用于用户对系统的设置与控制等,给用户提供一个输入的方式,输入用户所需求的信息.我们将键盘与单片机的PORTA口相连,PORTA口的高八位接按键的行,低八位接按键的列。电路如下:
按键功能如下图所示:
0
1
2
3
4
5
6
7
8
9
空
取消
确定
设防
撤防
空
7、语音模块
该模块主要由ISD1730、扬声器、mic、按键及其一些电阻电容等组成。它的作用的是通过语音提示,指导用户对安全系统的操作,例如设防,撤防等,把语音芯片的复位脚(24脚)与单片机的PORTD.1相连接,播放脚(23脚)与单片机的PORTD。4相连接,快进脚(26脚)与单片机的PORTD。5脚相连接.
第四章 程序设计
1、显示模块
该模块主要有1602液晶显示屏组成,上电后初始化1602,屏幕上显示欢迎界面,2秒后显示温度,设防时显示Fortification of success,撤防时显示Please enter your password,第一次输入密码错误时,显示Please try again,第二次输入密码错误时,显示The last chance,当发生火灾时显示Alarm!!!Fire!!!,当发生盗窃是显示Burglar alarms!!!,及其一些其他的显示都用putsf()函数来完成显示工作。
2、语音模块
当开机时PORTD。1给一个低电平,让语音芯片的指针复位,POTD.4给一个低电平并进行延时,然后在给高电平,进行播放语音“欢迎使用智能家居安全系统”.然后PORTD.5给一个低电平并进行适当的延时,当设防按键按下时PORTD。4给一个低电平并进行延时,然后在给高电平,播放“请输入密码",然后进行快进,让播放指针指向下一个语音片断,撤防成功后播放“成功撤防”。
3、输入模块
我们采用键盘扫描的方式来采取键盘的输入信息,单片机的A口高四输出,轮流输出0,A口第四位输入,采集键盘的信息,检测是否有按键按下,那一列有按键按下。根据当哪一行输出0时,那一列检测到了0,计算出是哪个按键,即:行*4+列
//键盘扫描
unsigned char getkeyval(void)
{
unsigned char col[4]={0xef,0xdf,0xbf,0x7f};//行
unsigned char row[4]={0x07,0x0b,0x0d,0x0e}; //列
unsigned char i,j,getsta,keyval;
for(i=0;i〈4;i++)
{
PORTA=col[i];
delay_us(2);
if(PINA!=col[i])
{
getsta=PINA&0x0F;
for(j=0;j<4;j++)
if(getsta==row[j])
{
keyval=j+i*4;
delay_ms(30); //300
while(getsta==row[j])
{
getsta=PINA&0x0F;////////////判断按键是否放开。
}
return keyval;
}
}
}
return 16;
}
4、红外模块
开启外部中断INT0和INT1,定义中断标志flage_0和flage_1,当发生中断时flage_0=1和flage_1=1,设防开启后进行循环判断当两个中断都发生时,发出警报。用两个嵌套在一起的if来进行判断.
if(flage_1==1) //红外报警
{
if(flage_0==1)
{
flage_1=0;
flage_0=0;
lcd_gotoxy(0,0);
lcd_putsf("Burglar alarms!!!”);
PORTD。6=1;
}
}
5、温度模块
设定单总线的接口为PC.0。定义一个变量利用函数ds1820_temperature_10()取出当前温度值,再把该变量换算成个位和十位即小数位,再分别显示出来.
//温度显示
void wendu(void)
{
char lcd_buffer[33];
int temp,temp_h,temp_l,_1,_2;
temp=ds1820_temperature_10(0);
temp_h=temp/80; //DS18B20要/80
temp_l=temp%80;
shi = temp_h/10;
ge = temp_h%10;
_1 = temp_l/10;
if(_1 == 4)
_1 =5;
else
_1 = 0;
_2 = temp_l%10;
lcd_gotoxy(0,1);
sprintf(lcd_buffer,”TEMP:%d%d.%d\xDFC\n\r”,shi,ge,_1);
lcd_puts(lcd_buffer);
}
第五章 实验与调试
一、下载调试
将一个10针的插座与单片机的MOSI MISO SCK RESET VCC GND 等连接好后,用下载线连接电脑好单片机,用下载软件进行下载,运行成功。
二、LCD的调试
当LCD与PA口相连上电后,没有反应,屏幕是黑的,进过上网查找资料后,才发现原来LCD的背景灯那两个管脚没有接上电源和地。焊接好后,上电屏幕亮了,但是什么都显示不出来,看到LCD的3管脚是空的,所以想到可能是这个原因,查资料后知道这个是管脚的作用是调节对比度的,于是我就用两个1K的电阻串联在一起,一端接电源一端接地中间接3脚,上电后下载程序显示一个很模糊的字迹,看不清楚。猜测可能是因为电阻大小不当导致的,进过三四次的调整后才显示出来清晰的字迹。
三、按键的调试
把程序下载后,按键按下去一下后,在屏幕上显示很多个同一个的数,考虑可能是因为在按键按下去还没放开的一瞬间,键盘扫描好多次,单片机的扫描的速度很快,就认为按键按下了很多次,而没有判断是否是同一次按下去的,所以要解决这个问题的方法是让程序判断按键是否释放。
四、电源模块的调试
电源模块焊接好后,上电发现一点输出端没有电压,通过用万用表的测量得知火牛插座负极没有连接好,再次进行焊接,上电后依然没有现象,就再次进行从输入到输出一个点一个点的测量,测量出无论开关怎样开关,开关的另外一端都没有反应,才发现开关的管脚焊错了。焊接好后,上电,电源的输出端输出正常的5V。
五、语音模块的调试
语音模块按照电路的焊好后,能正常播放语音,正常快进与复位等,各方面都正常.
六、LED与蜂鸣器的调试
PORTD。6输出高电平时LED灯,蜂鸣器鸣叫.功能正常。
第六章 测试结果
开机显示welcome 和 ^_^,延时2秒后显示当前温度并根据当前的温度变化而不断变化,进入正常运行状态.当设防按键按下后,语音提示设防成功,LCD显示Fortification of success(设防成功),并进入防御状态,不断检测温度是否超过设定值(火灾检测),检测红外对管是否都发生了中断(防盗报警)。当温度过高时,LCD显示”Alarm!!!Fire!!!”,蜂鸣器鸣叫LED亮;当红外对管都发生中断时,LCD显示"Burglar alarms!!!”,蜂鸣器和LED报警。当撤防键按下时,语音提示 请输入密码,LCD提示Please enteryour password,然后你输入密码,若输入第一次错误,LCD提示Please try again,第二次错误,LCD显示"The last chance”,当第三次错误时,LED与蜂鸣器发出警报,程序锁死.若输入密码正确时,则显示OK,语音提示 撤防成功,显示温度.
第七章 结语
该设计在一定程度上解决了传统机械式防盗的弊端,利用高科技将防盗报警智能化、自动化,可以减少和避免户主的损失。
由于时间的关系和考虑到元器件的价格等因素,该设计还存在一些不足的地方。例如,该设计存在不够人性化的地方,可通过添加实时时钟芯片增加时间功能,并在此基础上加入自动开启和关闭系统的功能等等。除此以外,还可以通过增加断电保护电路增强系统的安全性。
在做该设计的这段时间里,我对之前学习到的知识有了一个全面的认识,也因此学到了很多东西。这一次的设计,从查找资料、方案确定、电路设计到焊接和调试,整个过程都是我们自己亲自去完成。在整个设计期间,我遇到了很多问题,但经过仔细的分析和其他同学的帮助后,最终都把问题解决,我也从中学会了解决问题的方法。
附录 程序
/*****************************************************
Project : 智能家居安全系统
Version :
Date : 2012 12 12
Author : pang
Company :
Comments:
Chip type : ATmega16L
Program type : Application
Clock frequency : 8.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
/* 1602和MEGA 16L的连接方式如下: */
/* RS--————> PB0 */
/* RW——--—-〉 PB1 */
/* E ———-——〉 PB2 */
/* FREE————> PB3 */
/* D4—-——--> PB4 */
/* D5——---—〉 PB5 */
/* D6—----—〉 PB6 */
/* D7——-———〉 PB7 */
/*****************************************************/
#include 〈mega16。h〉
#include <delay。h〉
#include <stdio。h>
#include <ds1820。h〉
#include <lcd.h〉
#asm
.equ __lcd_port=0x18;PORTB
#endasm
#include 〈1wire.h>
#asm
。equ __w1_port=0x15 ;PORTC
。equ __w1_bit=0
#endasm
#define fuwei PORTD.1
#define jingbao PORTD.6
unsigned char mima[]={1,2,3,1,2,3};
unsigned char shuru[6]={0,0,0,0,0,0};
int shi,ge; //温度的十位与个位
unsigned char flage_0=0; //中断0标志
unsigned char flage_1=0; //中断1标志
/************************************************************************/
//初始化
void init(void)
{
w1_init();
lcd_init(16);
PORTA=0xff;
DDRA=0xF0;
PORTD=0x32;
DDRD=0x72;
jingbao=0;
GICR|=0xC0; //INT0 ON INT1 ON INT2 OFF
MCUCR=0x0F;
MCUCSR=0x00;
GIFR=0xC0;
#asm("sei”)
}
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
flage_0=1; //待补充
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
flage_1=1;//待不从
}
void wendu(void) //温度显示
{
char lcd_buffer[33];
int temp,temp_h,temp_l,_1,_2;
temp=ds1820_temperature_10(0);
temp_h=temp/80; //DS18B20要/80
temp_l=temp%80;
shi = temp_h/10;
ge = temp_h%10;
_1 = temp_l/10;
if(_1 == 4)
_1 =5;
else
_1 = 0;
_2 = temp_l%10;
lcd_gotoxy(0,1);
sprintf(lcd_buffer,"TEMP:%d%d.%d\xDFC\n\r”,shi,ge,_1);
lcd_puts(lcd_buffer);
}
unsigned char getkeyval(void) //键盘扫描
{
unsigned char col[4]={0xef,0xdf,0xbf,0x7f};
unsigned char row[4]={0x07,0x0b,0x0d,0x0e};
unsigned char i,j,getsta,keyval;
for(i=0;i〈4;i++)
{
PORTA=col[i];
delay_us(2);
if(PINA!=col[i])
{
getsta=PINA&0x0F;
for(j=0;j<4;j++)
if(getsta==row[j])
{
keyval=j+i*4;
delay_ms(300); //300
while(getsta==row[j])
{
getsta=PINA&0x0F;
}
return keyval;
}
}
}
return 16;
}
void yuyin(void) //播放语音
{
PORTD。4=0;
delay_ms(35); //播放
PORTD.4=1;
}
void nextone(void) //快进
{
PORTD.5=0;
delay_ms(35); //快进到第一段语音
PORTD.5=1;
}
void kaiji(void) //开机界面
{
lcd_clear();
lcd_gotoxy(6,0);
lcd_putsf(”^_^");
lcd_gotoxy(5,1);
lcd_putsf("WELCOM”);
PORTD。1=0; //复位不用时间
PORTD。1=1;
delay_ms(10);
yuyin(); //播放开机音
delay_ms(2000);
delay_ms(2000); //语音播放完后进入快进
nextone();
wendu();
}
void shuzuqingkong(void)
{
unsigned char i;
for(i=0;i<6;i++)shuru[i]=0;
}
void main(void)
{
unsigned char ttt; //密码错误,死循环ttt
unsigned char yyy; //密码错误,死循环yyy+到10
unsigned char keyval; //键值
unsigned char i=0;
unsigned char j=0;
unsigned char flage=1;
unsigned char t=0; //密码与输入中相同的个数
unsigned char cishu=3; //密码次数3
init();
delay_ms(100);
kaiji();
while(1)
{
ttt=1; //密码错误,死循环ttt
yyy=0; //密码错误,死循环yyy+到10
flage=1;
t=0; //密码与输入中相同的个数
cishu=3; //密码次数3
shuzuqingkong(); // 数组清空
wendu();
keyval=getkeyval();
if(keyval==13) //设防
{
yuyin();//播放语音
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Fortification of success”);
delay_ms(1000);
delay_ms(1000); ///足够的时间
lcd_clear();
nextone();
while(flage)
{
keyval=getkeyval();
wendu();
if(shi〉1&ge>7) //温度报警
{
lcd_gotoxy(0,0);
lcd_putsf(”Alarm!!!Fire!!!”);
jingbao=1;
}
if(flage_1==1) //红外报警
{
if(flage_0==1)
{
flage_1=0;
flage_0=0;
lcd_gotoxy(0,0);
lcd_putsf("Burglar alarms!!!");
jingbao=1;
}
}
if(keyval==14) //撤防
{
i=0;
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf(”Please enter your password”);
yuyin();//播放语音
delay_ms(2000);
delay_ms(1000);
nextone();
lcd_clear();
while(flage)
{
keyval=getkeyval();
if(keyval〈10)
{
shuru[i]=keyval;
lcd_putchar(shuru[i]+0x30);
i++;
}
if(keyval==12)
{
i=0;
lcd_clear();
for(j=0;j<6;j++)
{
if(mima[j]==shuru[j]) {t++;}
}
if(t==6)
{
shuzuqingkong();
lcd_gotoxy(0,0);
lcd_putsf("OK”);
yuyin(); //播放语音
flage=0;
i=0;
t=0;
jingbao=0;
delay_ms(1000);
delay_ms(2000);
fuwei=0;
fuwei=1;
delay_ms(10);
nextone();
lcd_clear();
lcd_gotoxy(5,0);
lcd_putsf("WELCOM”);
}
else
{
i=0;
t=0; //标志清空
shuzuqingkong();
lcd_putsf("ERROR”);
cishu——;
lcd_putchar(cishu+0x30);
lcd_gotoxy(0,1);
展开阅读全文