基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第1页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第2页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第3页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第4页
基于单片机的家居智能防盗控制系统设计_课程设计论文.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理及应用课程设计说明书题目:基于单片机的家居智能防盗控制系统设计(二) 目 录1 选题背景22 原理与设计221 流程图222 系统总体设计323 系统模块设计43 代码54 结果分析195 总结19参考文献1 选题背景随着科技的发展和人们生活水平的提高,家居智能防盗成了越来越热门的话题。本课题贴近日常生活,又能很好地运用所学的单片机知识,主要是针对家庭的安全问题,既可以安装在门外,作为一个报警系统,防止钥匙丢失或被复制时被不法分子利用,造成不必要的损失。也可以外加传感器,连接至报警系统上,将窗户等需要监测的地方与大门构成整体的监控报警系统,对房屋进行整体监控。保证住户的人身财产安全。2 原理与设计开始2.1 流程图系统初始化检测中断信号1n语音提示,并触发中断0ynled显示中断0时间,p1.0置位,语音报警持续30秒,p1.1置位,电话报警。y报警结束,等待下次中断信号。y结束n 图2-12.2 系统总体设计本系统的设计中,采用51单片机为主控制器,用不同颜色的led灯为装态指示灯,水银开关为开门的触发中断开关,按钮开关作为识别主人和陌生人的装置,ds1302作为时钟芯片提供准确的时间,在lcd1602上显示时间,当有陌生人闯入,触发报警系统包报警。lcd记录报警时间,并通过继电器控制给主人拨打电话。系统工作原理介绍:本系统控制有三种状态:正常状态,仅绿灯亮,lcd时间正常显示,此状态可以调整时间,调整时间是通过时间修改按键来调整的,按键分为调整启动按键(即时间显示停止,key_stop),按键按下,时间停止更新,同时出现调整位置的光标,按动key_r(右移)或key_l(左移),移动光标,选择需要调整的时间单位,再按键key_add(加)或key_dec(减),来调整时间,调整好后,按键key_start,开启动时间更新显示。警告状态,这个状态在门开后触发水银开关使得,黄灯亮,蜂鸣响,lcd时间更新,处于警告状态,并且识别是否是陌生人。此时,如果按下识别按钮,5s后进入正常状态,如果不按下识别按钮或者时间超过5s,则触发报警状态。报警状态,时间停止更新,红色灯亮,黄色灯不灭,继电器触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,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 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;/选择指令寄存器 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(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/-/- 定义端口 -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,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 -/-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); / ds1302中的时间数据是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初始化 -/- 设置初始时间 -/-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); /允许向ds1302写入数据 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_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_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);return 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 speaker =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; /月个位 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) 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; break; 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: return 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,即下排第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) /*有人开门,处于警告状态,绿灯灭,黄灯亮,蜂鸣器*/ 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; /标志置位时间停止 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; lcd_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);/打开闪烁光标 /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: 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的中断服务程序*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论