基于单片机的家居智能防盗控制系统设计_课程设计论文.doc

上传人:哈尼dd 文档编号:3922542 上传时间:2019-10-10 格式:DOC 页数:22 大小:242.52KB
返回 下载 相关 举报
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第1页
第1页 / 共22页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第2页
第2页 / 共22页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第3页
第3页 / 共22页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第4页
第4页 / 共22页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《基于单片机的家居智能防盗控制系统设计_课程设计论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的家居智能防盗控制系统设计_课程设计论文.doc(22页珍藏版)》请在三一文库上搜索。

1、单片机原理及应用课程设计说明书题目:基于单片机的家居智能防盗控制系统设计(二) 目 录1 选题背景22 原理与设计221 流程图222 系统总体设计323 系统模块设计43 代码54 结果分析195 总结19参考文献1 选题背景随着科技的发展和人们生活水平的提高,家居智能防盗成了越来越热门的话题。本课题贴近日常生活,又能很好地运用所学的单片机知识,主要是针对家庭的安全问题,既可以安装在门外,作为一个报警系统,防止钥匙丢失或被复制时被不法分子利用,造成不必要的损失。也可以外加传感器,连接至报警系统上,将窗户等需要监测的地方与大门构成整体的监控报警系统,对房屋进行整体监控。保证住户的人身财产安全。

2、2 原理与设计开始2.1 流程图系统初始化检测中断信号1N语音提示,并触发中断0YNLED显示中断0时间,P1.0置位,语音报警持续30秒,P1.1置位,电话报警。Y报警结束,等待下次中断信号。Y结束N 图2-12.2 系统总体设计本系统的设计中,采用51单片机为主控制器,用不同颜色的LED灯为装态指示灯,水银开关为开门的触发中断开关,按钮开关作为识别主人和陌生人的装置,DS1302作为时钟芯片提供准确的时间,在LCD1602上显示时间,当有陌生人闯入,触发报警系统包报警。LCD记录报警时间,并通过继电器控制给主人拨打电话。系统工作原理介绍:本系统控制有三种状态:正常状态,仅绿灯亮,LCD时间

3、正常显示,此状态可以调整时间,调整时间是通过时间修改按键来调整的,按键分为调整启动按键(即时间显示停止,KEY_STOP),按键按下,时间停止更新,同时出现调整位置的光标,按动KEY_R(右移)或KEY_L(左移),移动光标,选择需要调整的时间单位,再按键KEY_ADD(加)或KEY_DEC(减),来调整时间,调整好后,按键KEY_START,开启动时间更新显示。警告状态,这个状态在门开后触发水银开关使得,黄灯亮,蜂鸣响,LCD时间更新,处于警告状态,并且识别是否是陌生人。此时,如果按下识别按钮,5s后进入正常状态,如果不按下识别按钮或者时间超过5s,则触发报警状态。报警状态,时间停止更新,红

4、色灯亮,黄色灯不灭,继电器触100ms拨打电话给主人,同时警报启动,1分钟后除了LCD时间显示停止外其他模块恢复正常工作状态。整体硬件点路设计图见图2-2。图2-2 2.3 系统模块设计本系统的模块设计分为显示部分,时钟部分和实时控制显示部分主要是LED灯和LCD等为状态指示灯和系统时间显示等显示电路部分,绿色LEDP10,黄色LEDP11,红色LEDP12,蜂鸣器在仿真时用蓝色LED代替,接P13,LCD1602数据口接P0,RSP20,RWP21,ENP22。见图2-3。 图2-3时钟部分,该部分主要是由时钟芯片DS1302和时钟调整按键组成,DS1302的VCC1和VCC2同时接+5V,

5、RST接上拉电阻,由51的P23控制,SCLKP24,IOP25,2脚和3脚接晶振,并通过2个22uF的电容接地。时钟调整按键分别是KEY_STOP 图2-4P16,KEY_STARTP17,KEY_RP30,KEY_LP31,KEY_ADDP34,KEY_DECP35。见图2-4。实时控制部分,该部分主要是由扬声器,蜂鸣器,继电器等器件模块组成,蜂鸣器P13,扬声器P14,继电器P15,其中蜂鸣器,扬声器和继电器前端接各一个三极管为功率放大。见图2-5。图2-53 代码以下为LCD1602的头文件。#include/包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#ifndef

6、 LCD1602_H#define LCD1602_H#define uint unsigned int/预定义#define uchar unsigned charsbit rs=P20;/1602的数据/指令选择控制线sbit rw=P21;/1602的读写控制线sbit en=P22;/1602的使能控制线/*P0口接1602的D0D7,注意不要接错了顺序*/void lcddelay(uint n) /延时函数uint x,y;for(x=n;x0;x-)for(y=110;y0;y-); void lcd_wcom(uchar com)/1602写命令函数rs=0;/选择指令寄存器

7、rw=0;/选择写P0=com;/把命令字送入P2 lcddelay(5);/延时一小会儿,让1602准备接收数据 en=1;/使能线电平变化,命令送入1602的8位数据口 en=0; void lcd_wdat(uchar dat)/1602写数据函数rs=1;/选择数据寄存器 rw=0;/选择写 P0=dat;/把要显示的数据送入P2 lcddelay(5);/延时一小会儿,让1602准备接收数据 en=1;/使能线电平变化,数据送入1602的数据口 en=0; void lcd_init()/1602初始化函数 lcd_wcom(0x38);/8位数据,双列,5*7字形 lcd_wcom

8、(0x0c);/开启显示屏,关光标,光标不闪烁 lcd_wcom(0x06);/显示地址递增,即写一个数据后,显示位置右移一位 lcd_wcom(0x01);/清屏 #endif以下为DS1302的头文件/=/- 星期一 monday 星期二 tuesday 星期三 wednesday/- 星期四 thursday 星期五 friday 星期六 saturday/- 星期日 sunday/=#ifndef _DS1302_h_ #define _DS1302_h_ /-#define uchar unsigned char#define uint unsigned int/-/- 定义端口 -

9、sbit rst=P23;sbit sclk=P24;sbit io=P25;/-uint tab_13027=0,20,16,27,12,4,12; /初始化时时间日期设置 /秒 分 时 日月 星期 年uint tab1_13027=0,20,16,27,12,4,12; /-/- 函数声明 -/-void ds1302(); /获取DS1302时间void writeds_byte(uchar); /向DS1302写一字节uchar readds_byte(); /从DS1302读一字节void ds1302_init(); /DS1302初始化void writeds_add(uchar

10、,uchar); /指定地址向1302写一数据uchar readds_add(uchar); /指定地址从1302读一数据/=/- 函数 -/=/-/- 向DS1302写一字节 (上升沿有效) -/- 数据输入从低位到高位 -/-void writeds_byte(uchar dat) uchar i,dat_w; dat_w=dat; /数据送给变量dat_w for(i=0;i1; /右移一位 sclk=0; /先拉低时钟信号 sclk=1; /拉高时钟信号 sclk=0; /写一字节完毕,拉低时钟信号/-/- 从DS1302读一字节 (下降沿有效) -/- 读出数据时从低位0位到高位7

11、 -/-uchar readds_byte() uchar i,k; k=0; for(i=0;i1; /k右移一位,确保先读来的数据在低位 if(io) k=k|0x80; /读取的值先送K最高位 clk=1; /先拉低时钟信号 sclk=0; sclk=0; return (k);/-/- 指定地址写一数据 -/-void writeds_add(uchar add,uchar dat) /dat为十进制数 rst=0; sclk=0; rst=1; /拉高RST writeds_byte(add); / 写地址 writeds_byte(dat/104)|(dat%10); / DS13

12、02中的时间数据是BCD码形式sclk=0;rst=0;/-/- 指定地址读出一数据 -/-uchar readds_add(uchar add) uchar temp,dat1,dat2; rst=0;sclk=0; rst=1; writeds_byte(add); temp=readds_byte(); /读取的数据为16进制 sclk=0; /读取完毕,拉低SCLK rst=0; /拉低SCLK dat1=temp/16; /16进制转成BCD dat2=temp%16; temp=dat1*10+dat2; /转换成10进制数字 return (temp); /-/- DS1302初

13、始化 -/- 设置初始时间 -/-void ds1302_init() uchar i,add; add=0x80; writeds_add(0x8e,0x00); /允许写入 for(i=0;i7;i+) writeds_add(add,tab1_1302i); add+=2; writeds_add(0x90,0xa6); /写充电控制寄存器. writeds_add(0x8e,0x80); /禁止写入/-/- 获取DS1302时间 -/- 在主函数中调用 -/-void ds1302() uchar i,add=0x81;/ writeds_add(0x8e,0x00); /允许向DS1

14、302写入数据 for(i=0;i7;i+) tab_1302i=readds_add(add); /获得的数据已转换为十进制 add+=2; /writeds_add(0x8e,0x80);/获取完一次时间,禁止向DS1302写入数据,提高可靠#endif以下为按键的头文件#ifndef _KEY_H_ #define _KEY_H_#include #include ds1302.h#include lcd1602.h/-#define uchar unsigned char#define uint unsigned intsbit key_stop =P16; /光标停止sbit key

15、_right =P30;/光标右移sbit key_left =P31;/光标左移sbit key_add =P34;/数字加sbit key_dec =P35;/数字减sbit key_start =P17;/*模糊延时延时函数*/void delay_0ms(uint time)/延时0.1ms uchar i,j; do for(i=0;i10;i+) for(j=0;j0); /*扫描按键*/int scan_key()if(key_stop=0)|(key_right=0)|(key_left=0)|(key_add=0)|(key_dec=0)|(key_start=0)delay

16、_0ms(130);if(key_stop=0)|(key_right=0)|(key_left=0)|(key_add=0)|(key_dec=0)|(key_start=0)if(key_stop=0) while(key_stop); return 1;else if(key_right=0)while(key_right);return 2;else if(key_left=0)while(key_left);return 3;else if(key_add=0)while(key_add);return 4;else if(key_dec=0)while(key_dec);retur

17、n 5;else if(key_start=0)while(key_start);return 6;else return 0;以下为主程序#include #include ds1302.h#include lcd1602.h#include key.h/typedef unsigned int uint; /无符号类型别名定义/typedef unsigned char uchar;sbit led_green =P10; /安全标志sbit led_yellow =P11;/警告提示标志sbit led_red =P12;/报警标志sbit buzzer =P13;/警告提示sbit s

18、peaker =P14;/扬声器报警sbit relay =P15;/继电器拨打电话int flag0=0,flag1=0,flag=0,flag_change=0;int x=6;uchar tab_date14=2012-08-24 FRI;/表示年月日星期uchar tab_time8=00:00:00;/表示时分秒/* 数据转换*/void trans()tab_date2=tab_13026/10+0; /年十位 tab_date3=tab_13026%10+0; /年个位 tab_date5=tab_13024/10+0; /月十位 tab_date6=tab_13024%10+0

19、; /月个位 tab_date8=tab_13023/10+0; /日十位tab_date9=tab_13023%10+0; /日个位tab_time0=tab_13022/10+0; /小时十位 tab_time1=tab_13022%10+0; /小时个位 tab_time3=tab_13021/10+0; /分十位 tab_time4=tab_13021%10+0; /分个位 tab_time6=tab_13020/10+0; /秒十位 tab_time7=tab_13020%10+0; /秒个位/-/ 星期显示/-void week()uchar i; if(tab_13025=1)

20、i=7;else i=tab_13025-1; /*实时时钟里的值是6,但是2008/08/08是星期五,所以减1, Proteus的问题? */ switch(i) case 1: tab_date11=M;tab_date12=O;tab_date13=N; break; case 2: tab_date11=T;tab_date12=U;tab_date13=E; break; case 3: tab_date11=W;tab_date12=E;tab_date13=D; break; case 4: tab_date11=T;tab_date12=H;tab_date13=U; bre

21、ak; case 5: tab_date11=F;tab_date12=R;tab_date13=I; break; case 6: tab_date11=S;tab_date12=T;tab_date13=A; break; case 7: tab_date11=S;tab_date12=U;tab_date13=N; break; default: ; break; /其它情况 int xxxx(int x)switch(x)case 0: return 3; case 1: return 6;case 2: return 9;case 3: return 13;case 4: retur

22、n 0x44;case 5: return 0x47;case 6: return 0x4A;default : return 0;break;void updata_time()uchar i,j;if(flag=0)&(flag_change=0)ds1302(); trans(); week();/如果没有中断,更新时间,反之,停止时间更新lcd_wcom(0x80+0x01);/显示地址设为80H(即00H,)上排第一位for(i=0;i14;i+)lcd_wdat(tab_datei);lcddelay(10);lcd_wcom(0x80+0x44);/重新设定显示地址为0xc4,即

23、下排第5位for(j=0;j8;j+)/将table1中的数据依次写入1602显示 lcd_wdat(tab_timej);lcddelay(10); void main()/flag0 flag1uchar i;P1=0x2F; /IO口初始化EA =1; /打开全局中断EX1 =1; /外部中断1打开IT1 =0;/低电平触发中断PX1 =1;/设置中断优先级,外部中断1EX0 =0;/屏蔽外部中断0ds1302_init();lcd_init();/led_green=0;while(1)/获取时钟芯片内的数据 updata_time();if(scan_key()=0)if(flag1

24、) /*有人开门,处于警告状态,绿灯灭,黄灯亮,蜂鸣器*/ led_green =1; led_yellow=0; buzzer =0; for(i=0;i5;i+) delay_0ms(100); /延时约5supdata_time(); /*如果按下开关,说明是主人,取消警告状态,回复正常状态*/ if(flag0) /*取消警告,绿灯亮,黄灯灭,蜂鸣器关*/ led_yellow=1; buzzer =1; led_green =0; /*没按下开关,说明不是主人,警报状态*/ else /*警报状态:只有红灯亮,声音警报启动,并且继电器工作拨打电话*/ flag =1; /标志置位时间

25、停止 led_green =1; led_red =0; buzzer =0; speaker =1; relay =0; delay_0ms(1000); /10ms左右 relay =1; for(i=0;i20;i+) /持续60s左右 delay_0ms(1000); updata_time(); buzzer =1; speaker =0; flag0 =0; flag0 =0; flag1 =0;led_green =0;led_yellow =1;led_red =1;buzzer =1;elseswitch(scan_key()case 1: flag_change=1; lc

26、d_wcom(0x80+xxxx(x); lcd_wcom(0x0f); /case 2: flag_change=1; x+; lcd_wcom(0x80+xxxx(x); /lcd_wcom(0x0f); case 3:flag_change=1; x-; lcd_wcom(0x80+xxxx(x); /lcd_wcom(0x0f); case 4: flag_change=1; /时钟停止tab_1302x+; tab1_1302x+; /修改ds1302初值的数据 flag_change=0; /打开时钟更新updata_time(); lcd_wcom(0x80+xxxx(x);/打

27、开闪烁光标 /ds1302_change(x); /把修改的数据放到ds1302寄存器ds1302();trans();week();/时间转换 lcd_wdat(tab_datexxxx(x);/让lcd显示修改后的时间lcddelay(10);/延时flag_change=1; break;/停止时间更新case 5: flag_change=1; tab1_1302x-; flag_change=0; writeds_add(0x8e,0x00);tab_1302x=readds_add(0x81); updata_time(); flag_change=1; break;case 6:

28、 flag_change=0;ds1302_init();lcd_wcom(0x0f);updata_time();default: break;/*外部中断1的服务程序*/void exist1() interrupt 2 flag1 =1;EA =1;EX0 =1;IT0 =1;/*外部中断0的中断服务程序*/void exist0() interrupt 0flag0 =1;4 结果分析当整正常状态,绿色LED灯亮,时间正常显示,修改时间正确无误,如果触发外部中断1,则响应中断,系统切换到警告状态,黄灯亮,绿灯灭,蜂鸣器响,提示主人关 闭警告状态,如果是陌生人或者时间过长而没有按下识别按

29、钮,则系统默认是陌生人,系统进入报警状态:继电器工作,给主人拨打电话,声音警报系统触发,报警,而且时间停止更新并显示当前时间,即记录案发时间,同时主人可报110等采取一些必要措施来应对盗窃行为。5 总结刚开始做这个课程设计的时候,我还真是没有头绪,不知道该如何下手,因为对单片机的了解并不是很精,所以一下子要做这样一个设计的确有些困难。后来我上网查了一下以往同学做的和网上已有的资料,慢慢知道了该怎么去做,我也向做同样题目的学的好的同学请教,虽然最后还是没有完全掌握,但是还是学到了很多。 这次单片机课程设计,是要设计家具智能防盗系统,虽然平时生活中类似的东西很常见,但从没有想过其中的原理以及涉及的

30、东西,这其中既要用到以前学过的硬件电路的知识,又要用到89C52单片机中程序及C语言的编写、调试等内容。因此这就要求我们对所学过的知识不仅要懂,而且会用。实验的硬件由老师提供,可以在已有的硬件条件下作相应的修改,我们这次的修改是增加了一个主人识别按钮,以免影响其他市面上的防盗报警,只有一个触发开关,出发了就报警,这样很不切合实际,只要触发开关就会报警而不会识别是否是陌生人,是否需要报警。在做课程设计之前,我对单片机这门课还多少有些吃不透,但通过这次的课程设计,我学到了许多平时不了解或不熟悉的知识,得到了一次用专业知识分析和解决问题的锻炼,使我在单片机的基本原理及应用以及编程方面都有了提高,通过这样的锻炼,让我学到了之前没有接触的过的东西,也激发了对设计的兴趣,在以后的学习中我会更加努力,使自己设计的更加完美。参 考 文 献1魏立峰等.单片机原理与应用技术.北京大学出版社.2010.12胡汉才等.单片机原理及其接口技术(第三版).清华大学出版社.2010.53赵建领,薛园园.零基础学单片机C语言程序设计.机械工业出版社.2009.422

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1