还剩60页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
毕业设计(论文)(说明书)题目GSM家庭防盗系统设计平顶山工业职业技术学院平顶山工业职业技术学院毕业设计(论文)任务书姓名专业班级任务下达日期2014年2月18日设计(论文)开始日期2014年2月25日设计(论文)完成日期2014年4月30日设计(论文)题目指导教师院(部)主任郭宗跃2014年5月8日平顶山工业职业技术学院毕业设计(论文)答辩委员会记录电力工程学院专业,学生于2014年6月10日进行了毕业设计(论文)答辩设计题目专题(论文)题目指导老师答辩委员会根据学生提交的毕业设计(论文)材料,根据学生答辩情况,经答辩委员会讨论评定,给予学生毕业设计(论文)成绩为答辩委员会人,出席人答辩委员会主任(签字)答辩委员会副主任(签字)答辩委员会委员,,,,,平顶山工业职业技术学院毕业设计(论文)评语第页共页学生姓名专业班级年级毕业设计(论文)题目评阅人指导教师(签字)2014年6月12日成绩系(科)主任(签字)2014年6月12日毕业设计(论文)及答辩评语摘要目录TOC\o1-3\h\z\u前言
11.总体设计方案
21.1基于GSM安全系统简介
21.2基于GSM安全系统现状与发展趋势
22.设计正文
42.1基于GSM的安全系统简介
52.1单片机控制模块
52.2传感器模块
62.3GSM模块
72.4存储器模块
72.5液晶键盘模块
83.硬件设计
103.1系统硬件电路设计
103.2单片机控制模块电路设计
113.3传感器模块电路设计
113.4报警模块电路设计
123.5GSM模块接口电路设计
133.6存储器模块电路设计
133.7液晶模块电路设计
144.软件设计
154.1传感器模块软件设计
154.2GSM模块软件设计
174.3存储器模块软件设计
184.4液晶键盘模块软件设计
194.5密码锁软件设计
215.调试与结果
235.1密码锁调试
235.2开门功能调试
235.3修改密码功能调试
235.4报警功能调试
245.5调试存在问题
246.总结
267.参考文献27附录28前言以单片机中控主机为核心,采用国际领先的室内无线组网技术,实现门禁、空调、地暖、灯光、热水器、家庭影院、窗帘、各类报警器等家庭电子设备与控制主机之间的通讯组网,用户可以通过手机、座机、遥控面板以及互联网通信终端等方式,一键搞定所有家电设备,随时了解家中的实时信息,远程完成对家里各项设备的控制只要手指轻轻一触,家里所有电器都可以通过用手机平板电脑或者遥控面板一键操控,轻松对家居中的灯光、电视、空调、窗帘、摄像头等进行实时查看与控制,让你提前享受未来生活,一切变化尽在你的指尖!
1.总体方案设计
1.1家庭防盗安全系统简介家庭防盗安全系统是基于移动通信网络的监控报警技术,彻底解决了普通防盗器、监控器无法解决的远程报警和易于破解的难题利用通信加密技术,让用户的家居安全无忧,是继单向防盗器、双向防盗器后的新一代防盗产品家庭智能防盗器具备智慧灵魂,使人与财产的安全保障得到保证在性能上必须要在各种情况条件下的高可靠性,在功能上必须既要让用户有不可破解的最高安全等级,又要让用户操作方便,甚至系统为用户自动服务智能防盗器符合全能的防盗技术特点及时通知超大范围最高安全杜绝解码操作方便手动自动实用功能防盗防火
1.2家庭防盗安全系统现状与发展趋势城市规模迅速扩大,外来人口大量涌入,使本来就复杂的城市管理更加复杂家庭被盗,住户被抢,常有发生对此,公安部门虽作了大量投入,仍不尽人意其原因大体是
(1)有的家庭被盗,损失数目极少,公安部门没有用常规的方法立案侦察
(2)有的住户虽然损失严重,但法律意识浅薄,不能将当时的情况和线索作一个明确的表述,自然增加了破案难度
(3)作案人诡计多端,狡猾、飘忽不定,没有固定的着落和去处
2.设计正文随着生活水平的提高,提别是物质生活水平的不断提高,人们对自己的个人安全和家庭财产安全越来越重视,安全已成为一种市场需求;同时经济的飞速发展伴随着城市流动人口的急剧增加,给家庭防控增加了新的难题和提出了新的课题,传统的人防物防的形式已难以适应社会形式发展的需求科学技术的进步和普遍应用,进一步同动了智能化家庭的建设步伐,家庭安全技术防范系统已经从本地向远程监控发展,从社会的周边防范向家庭内部防控逐渐靠拢,家庭防盗报警系统在人们对美好生活的追求中迅速崛起一个完善的职能家庭,具有便捷、安全、舒适、高档的生活环境,确保每一个家庭住户的声明财产安全,是建设本系统的最大意义和根本目的通过终端接收报警短信,并且可以发送命令短信异地遥控系统实现各种操作利用各种传感器对可能出现的煤气泄露、火灾、家中门窗被打开并有人闯入等意外情况进行,并通过短信发送特定报警信息于预先设定好的手机号码,通知事主做出相应措施通过网络,即使远在千里之外也能对家中发生的各种突发意外情况了如指掌,使生活更安全更智能
2.1家庭防盗安全系统简介本系统是基于无线模块的监控报警技术,彻底解决了普通防盗器、监控器无法解决的远程报警和易于破解的难题利用通信加密技术,让用户的家居安全无忧,是继单向防盗器、双向防盗器后的新一代防盗产品本系统在性能上必须要在各种情况条件下的高可靠性,在功能上必须既要让用户有不可破解的最高安全等级,又要让用户操作方便,甚至系统为用户自动服务,系统设计如图1图1系统设计图
2.1单片机控制模块单片机控制模块主要采用STC89C52单片机作为主控制芯片STC89C52作为普通51单片机已广泛应用于各种产品中,其接口简单,方便使用,且功能强大STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器片上Flash允许程序存储器在系统可编程,亦适于常规编程器在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使STC89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案STC89C52具有以下标准功能8K字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止其引脚图如图2所示图2STC89C52引脚图
2.2传感器模块传感器模块主要由红外传感式集发射接收于一体的ITR9909这是一种光电开关光电开关(光电传感器)是光电接近开关的简称,它是利用被检测物对光束的遮挡或反射,由同步回路选通电路,从而检测物体有无的物体不限于金属,所有能反射光线的物体均可被检测光电开关将输入电流在发射器上转换为光信号射出,接收器再根据接收到的光线的强弱或有无对目标物体进行探测
2.3传输模块传输模块主要采用SIEMENS公司的TC35模块,通过串口接入电路与单片机控制模块相连,主要负责实现远距离报警的功能采用该模块的短信功能,可以使某些控制达到“零距离”由于短信息的费用低廉,可以取代传统的无线遥控因此本系统采用单片机控制无线模块发送短信,实现远距离报警的功能TC35模块是SIEMENS公司为嵌入式设备设计的双频通讯核心模块,TC35T内含TC35/SIM卡座/电源/天线/RS232接口,是可独立使用的通讯终端TC35支持标准的AT命令集,通过AT指令可实现发送短信功能模块有AT命令集接口,支持文本和PDU模式的短消息、第三组的二类传真、以及
2.4K、
4.8K、
9.6K的非透明模式TC35模块主要由基带处理器、射频模块、供电模块ASIC、闪存、ZIF连接器、天线接口六部分组成作为TC35的核心,基带处理器主要处理终端内的语音、数据信号,并涵盖了蜂窝射频设备中的所有的模拟和数字功能在不需要额外硬件电路的前提下,可支持FR、HR和EFR语音信道编码设置以下AT指令,GSM模块可以发送短消息AT+CMGF=1回车采用文本格式发送,如用PDU格式,则AT+CMGF=0AT+CMGS=“+8613xxxxxxxxx”回车输入短消息Crtl+Z结束并发送
2.4存储器模块为了实现对密码的存储,防止不法分子切断电源造成密码丢失,本系统采用了AT24C02存储器对密码进行存储AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节内部有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作,有一个专门的写保护功能AT24C02支持I2C总线数据传送协议I2C总线协议规定,任何将数据传送到总线的器件为发送器任何从总线接收数据的器件为接收器数据传送是由产生串行时钟和所有起始停止信号的主器件控制的主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据(发送或接收)的模式AT24C02通过8个引脚实现数据的存储功能,其引脚图如下图3所示图3AT24C02引脚图
2.5液晶键盘模块液晶键盘模块主要由4*4矩阵键盘和LCD1602液晶显示器组成4*4矩阵键盘主要提供用户操作输入功能,是实现人机通信的主要控制部分;LCD1602液晶显示器主要负责显示系统信息,协助用户操作系统下面分别简单介绍矩阵键盘和LCD1602液晶显示器的性能和工作原理
2.
5.1LCD1602液晶显示器LCD1602是一种字符型液晶显示模块,是一种专门用于显示字母、数字、符号等点阵式的LCD该液晶显示器使用方便,功耗小,因此本系统采用LCD1602作为系统的显示部分LCD1602包括4种工作状态,通过MCU设置RS、RW和E值,可使液晶工作在不同的状态读状态输入RS=0,RW=1,E=1输出D0~D7=状态字写指令输入RS=0,RW=0,D0…D7=指令码,E=高脉冲输出无读数据输入RS=1,RW=1,E=1输出D0~D7=数据写数据输入RS=0,RW=1,E=1输出无
2.
5.24*4矩阵键盘在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接这样,一个端口(如P1口)就可以构成4*4=16个按键,从而节省I/O资源,因此在本设计中采用4*4矩阵键盘矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定对于矩阵式键盘,按键的位置由行号和列号唯一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号编码相互转换可通过计算或查表的方法实现
3.硬件设计(与第二章合并)
3.1系统硬件电路设计系统硬件电路主要由单片机控制模块电路、报警模块电路、GSM模块电路、存储器模块电路、液晶键盘模块电路和传感器模块电路组成系统硬件电路如图4所示图4系统电路图
3.2单片机控制模块电路设计单片机电路主要包括晶振电路、复位电路、P0口的上拉电阻等组成,电路如图7所示接口P3为单片机P0引脚的上拉电阻,接口P2为矩阵键盘的接入口在晶振电路中,晶振频率选为
11.0592MHz,原因是使初值为整数,从而产生精确的波特率,如图5图5单片机控制模块电路图
3.3传感器模块电路设计在本设计中,为了提高传感器的精确度和方便性,传感器都通过引线连接到相应的接口上,而非直接焊接到电路板上由于传感器的信号为弱电平信号,容易造成单片机的误操作为保证系统具有较高的灵敏度,故加入由LM324组成的放大电路,电路如图8所示接口P6为烟雾传感器的接口;接口P7为人体感应传感器的接口通过分别调整可变电阻R2和R7,可以改变烟雾传感器和人体感应传感器信号的放大倍数由于单片机的中断方式为低电平中断,所以经放大器放大后的信号要先接入反相器,才能再连接到单片机的中断引脚上如图6图6传感器模块电路图
3.4报警模块电路设计由于单片机STC89C52提供的工作电流只有20mA,而蜂鸣器正常工作电流一般比较大,片机的I/O口是无法直接驱动的,因此需要一个外部的驱动电路,提供正常工作所需要的电流报警模块电路图如图7所示,在该电路中,speaker连接在单片机引脚上,接口P4为蜂鸣器,晶体管工作在饱和状态,相当于一个开关图7报警模块电路图
3.5GSM模块接口电路设计GSM模块的工作主要由单片机通过串口将AT指令发送到GSM模块串口电路主要由芯片MAX232进行电平转换,实现串口电压与单片机电压的转换,确保双方可以相互通信,电路如图8所示单片机的TXD引脚接到MAX232的T2IN引脚,单片机的RXD引脚接到MAX232的T2OUT引脚图8GSM模块接口电路图
3.6存储器模块电路设计存储器模块电路主要由芯片AT24C02构成,存储器模块电路图如图9所示在本设计中,只有一个AT24C02被总线寻址这三个地址,故输入脚A0A1A2可悬空或连接到Vss串行时钟SCL和串行数据/地址引脚SDA分别接到单片机引脚P
3.6和P
3.7上,通过单片机编程控制存储器的读写图9存储器模块电路图
3.7液晶模块电路设计液晶模块电路如图10所示可调电阻R1调节液晶偏压,RS、RW和EN分别接到单片机的P
0.
5、P
0.
6、P
0.7引脚,通过单片机按相应时序编程控制液晶显示Data0~Data7为液晶数据位,接到单片机P2引脚图10液晶模块电路图
4.软件设计该系统主要实现的功能是输入密码,密码正确则进入系统当输入密码错误次数小于3次时,可以重新输入当错误次数达到3次,系统便进入自锁状态并通过GSM发送短信通知用户成功进入系统后可以选择不同的功能开门、修改系统密码和开启报警系统选择开门功能则开门的指示灯会亮选择修改系统密码功能,则按照系统指引输入旧密码、新密码和重复新密码若输入的密码都正确,则修改密码成功若输入的密码错误,则需要重新输入,当错误次数达到3次时,系统也会进入自锁状态和通过GSM发送短信通知用户选择开启报警功能,烟雾传感器和红外热释能传感器便开始工作,一旦检测到信号,报警音响并通过GSM发送短信通知用户若需要关闭报警功能,只要按关闭报警的按键,并正确输入密码后,报警功能就会关闭主程序流程图如图17所示
4.1传感器模块软件设计在本系统中,LCD1602液晶显示是通过调用voiddisplayucharposuchar*q函数实现的,其流程图如图12所示在voiddisplayucharposuchar*q函数中,pos是写入的位置,q指向要写入的数据所在的数组该函数主要调用lcd_wcmd,lcd_pos两个函数,先写显示地址,后写显示数据单片机P2口接LCD1602的数据引脚,P0^
5、P0^
6、P0^7分别接LCD1602的RS、RW、EP引脚,通过单片机控制液晶显示图12流程图在本系统中,键盘的软件实现通过分时扫描、键盘编码的形式来实现,其流程图如图13所示P1口低4位作为键盘的行,高4位作为键盘的列P1口低4位先循环输出0,单片机扫描P1口高4位如果有键按下,P1口高4位不会全为1如果读取不到P1口的值,比如是干扰,则不做键值处理,返回继续循环下次图13主程序流程图
4.2GSM模块软件设计在本系统中,GSM模块软件设计是通过串口发送AT指令给GSM模块来实现发送短信的功能,其流程图如图14所示首先串口发送字符串“AT+CMGF=1\r”给GSM模块,设置短信为TXT模式;然后发送“AT+CMGS=13760727792\r”,设置收信方的手机号码;接着将待发送短信的内容发给GSM模块;最后发送十六进制的0x1A(回车)确认发送,这样就能通过GSM模块最终实现报警通知用户的功能程序见附录图14短信发送流程图在GSM模块和单片机的串行通信中,选用定时器T1在工作方式2设定波特率为9600,其初值计算公式如下已知为
11.00592MHz,设波特率控制位SMOD=0,则有故在程序设计时,定时器初值设置为0xFD
4.3存储器模块软件设计在本系统中,AT24C02的存储功能主要是通过I2C总线来实现串行读写,其流程图如图15所示I2C总线在写入和读取一个8位二进制数时,总是高位在前低位在后在读函数_24C02Readunsignedcharl_address中,先向I2C总线发出读取24C02的写地址,在完成I2C串口协议后,写入24C02的读地址,再读取存储器对应位置的数据在写函数_24C02Writeunsignedchardat,unsignedcharl_address中,先向总线发出写24C02的地址,在完成I2C串口协议后,写入24C02的写地址,然后写入数据程序见附录图15AT24C02读写流程图
4.4液晶键盘模块软件设计在本系统中,LCD1602液晶显示是通过调用voiddisplayucharposuchar*q函数实现的,其流程图如图16所示在voiddisplayucharposuchar*q函数中,pos是写入的位置,q指向要写入的数据所在的数组该函数主要调用lcd_wcmd,lcd_pos两个函数,先写显示地址,后写显示数据单片机P2口接LCD1602的数据引脚,P0^
5、P0^
6、P0^7分别接LCD1602的RS、RW、EP引脚,通过单片机控制液晶显示程序见附录图16LCD1602显示流程图在本系统中,键盘的软件实现通过分时扫描、键盘编码的形式来实现,其流程图如图17所示P1口低4位作为键盘的行,高4位作为键盘的列P1口低4位先循环输出0,单片机扫描P1口高4位如果有键按下,P1口高4位不会全为1读取P1口的值,查表获得相应的16进制值存放l_key变量中,退出循环如果读取不到P1口的值,比如是干扰,则不做键值处理,返回继续循环下次程序见附录图17键盘扫描流程图
4.5密码锁软件设计在本系统中,密码锁的软件实现是通过比较输入密码值和实际密码值是否一样来进行的,其流程图如图18所示如果密码正确,则进入下一步操作如果密码错误,则需要重新输入密码,直到密码正确为止每输错一次密码,错误次数记录变量times就会加1一旦times增加到3,则调用GSM程序发短信,并且系统进入死锁状态程序见附录图18密码锁设置流程图
5.调试与结果建议更名为“家庭防盗系统系统仿真”电路板焊接成功后就可以进行调试,在调试之前,应先将已编好的程序下载到芯片STC89C52编写好程序后,将文件加载到工程中,然后“build”,生成“*.hex”文件,将AT89S52芯片插到下载开发板中,然后打开下载软件,通过它导入“*.hex”运行编译,载入到芯片即可
5.1密码锁调试系统上电后,液晶显示“Pleaseinputthepassword:”字样,如图24所示2秒后,系统进入输入状态,此时可通过键盘输入6位密码在输入状态,当输入错误时,可通过键盘上的“Delect”键删除错误位当输入完成以后,按“Enter”键确认输入若输入的密码正确,则进入操作系统,液晶显示“Pleasepressthefunctionkey”字样,此时可通过按不同的功能键选择不同的功能若输入的密码错误,蜂鸣器长鸣同时液晶显示“Error!”,如图26所示若错误次数小于3次,2秒后可重新输入密码若错误次数达到三次,系统进入死锁状态,液晶显示“Tryittomorrow!”,并通过GSM模块发送短信通知用户,
5.2开门功能调试在进入操作系统后,按“Open”键进入开门功能此时,开门灯亮,液晶显示“Openthedoor.”
5.3修改密码功能调试在进入操作系统后,按“Change”键进入修改密码功能按照液晶指示“Inputoldpassword”,输入旧密码;然后提示“Inputnewpassword”,输入新密码;最后在提示“Inputitagain!”后重复输入新密码若输入的密码都正确,则修改密码成功,显示“Establishessuccessful!”,如图28所示若密码有一次错误,则需要从输入旧密码开始重新操作,当错误次数达到3次时,系统也会进入死锁状态
5.4报警功能调试在进入操作系统后,按“Alarm”键进入开启报警功能,此时液晶显示“Systemstartup.”当烟雾传感器检测到烟雾时,启动中断程序,蜂鸣器报警,液晶显示“Alarm!”和“Onfire!”,并通过GSM发送短信通知用户,当红外热释能传感器检测到人体时,启动中断程序,蜂鸣器报警,液晶显示“Alarm!”和“Steal!”,并通过GSM发送短信通知用户
5.5调试存在问题整个设计的难点在于调试方面,因此在调试中也遇到了很多问题,但经过查看资料和细心分析后,最终都能顺利解决下面总结以下调试过程中出现的问题及解决方法在制板过程中,难免会出现各种差错而导致电路短路或断路等现象为避免此类情况的发生影响调试结果,在调试前,先用万用表二极管档将电路板的线路都测一下,确保电路正常调试过程首先验证LCD1602能否正常运行先编写简单的LCD1602显示程序,然后通过串口下载HEX格式文件到单片机上电后,液晶只亮但没有显示,初步怀疑是RS、RW和E控制位设置错误但通过万用表测试控制引脚电平跳变情况,发现正常,故排除该可能最后经过反复检查,发现原来是因为单片机P2引脚为倒序排列,在画板图时没有留意,导致接错数据引脚采用飞线修改后,LCD1602能正常显示在设计程序时,考虑到存储器AT24C02全新时存储内容为0,此时才写入初始化密码但经过验证,该设想不实际,故直接写入初始化密码在设计功能选择时,采用按键获得键值,再根据键值选择不同功能函数的方式来实现的在调试时,出现第一次按键有反应,之后都没有反应的现象经过仔细分析后得知,在每次按键后,程序跳入不同功能函数时要将键值重设初值0xFF,否则会进入死循环调试过程遇到的最大难题是中断问题刚开始时,传感器没有检测到信号,但单片机却运行中断程序通过万用表测试中断引脚,发现电平正常试过更换单片机芯片和将中断引脚接地,问题依然存在最后使用示波器测试中断引脚,发现存在干扰信号,使得单片机出现误中断现象故在程序中加入延时检测中断信号部分后,干扰信号被排除掉,中断正常编程时要注意规范问题编程过程中要注意加注释或分割线,否则,在程序过长时容易变得很乱,不便于查找或更改程序的结构要设计的合理,避免上下乱调用的现象,这样会使程序更加清晰化编程前要画流程图,这样会使思路清晰此外,使用循环结构体时要注意有退出循环体的出口,避免程序进入死循环
6.总结该设计在一定程度上解决了传统机械式防盗的弊端,利用高科技将防盗报警智能化、自动化,可以减少和避免户主的损失由于该系统主要利用现代移动通信网络作为承载,不需要考虑布线等因素,减少了环境因素对系统的影响,提高了该系统的可移动性由于时间的关系和考虑到元器件的价格等因素,该设计还存在一些不足的地方例如,该设计存在不够人性化的地方,可通过添加实时时钟芯片增加时间功能,并在此基础上加入自动开启和关闭系统的功能等等除此以外,还可以通过增加断电保护电路增强系统的安全性在设计的这段时间里,我对这四年学习到的知识有了一个全面的认识,也因此学到了很多东西这一次的实训设计,从查找资料、方案确定、电路设计到PCB制作和调试,整个过程都是我自己亲自去完成在整个设计期间,我遇到了很多问题,但经过仔细的分析和其他同学的帮助后,最终都把问题解决,我也从中学会了解决问题的方法
7.参考文献
[1]祁伟,杨事.单片机C5l语言教程与实验[M].北京北京航空航天大学出版社,2006.
[2]林桂花.基于GSM模块的数据传输及实时控制系统[J].计算机与现代化,2006222~24.
[3]李晓辉,等.基于GSM技术的汽车防盗系统的设计[J].现代电子技术,20083l9l~193.
[4]刘字静.基于GSM的远程监控系统数据传输[J].科学技术与工程,2007510-14.
[5]师俊宏.智能家居中的安全防范系统[J].上海建设科技,2006,05.
[6]游燕,随善坤.一种智能家居安防系统的设计[J].中国科技信息,2005,12.
[7]陈刚,李叶紫,胡辉.基于GSM的车辆防盗抢系统设计与实现[J].电气自动化,2005,06
[8]丁元杰.单片微机原理及应用[M].北京机械工业出版社,200156-69附录#includereg
52.h#includemath.h#includestdio.h#includekey.h#includelcd
1602.h#includegsm.h#includeat24c
02.hsbitdoor=P0^0;//定义P0^0为门锁控制标志位sbitspeaker=P0^1;//定义P0^1为喇叭控制标志位sbitalarm=P0^3;//定义P0^3为人体热释能检测标志位sbitint1=P3^3;sbitint0=P3^2;ucharpswd
[6]={0};//存储输入键值ucharpswd_flash
[6]={0};//存储密码ucharpswd_new
[6]={0};//暂存新密码ucharcorrect_old=0;//检测旧密码标志位ucharcorrect_new=0;//检测新密码标志位ucharcorrect_old_change=0;//检测修改旧密码标志位uchartimes;//每次输入密码错误次数uchartest;//存储器检测inti=0;//密码位bitchange=0;//修改密码控制标志位bitset=0;//设定控制标志位bitdelect;//删除控制吧标志位bitok;//确定控制标志位bitcancle;//取消控制标志位voidsend_messagevoid//发送彩信函数voidinputvoid;//输入函数voidpswd_errorvoid;//密码错误函数voidonfirevoid;//火灾报警函数voidstealvoid;//盗窃报警函数voidfunctionvoid;//功能选择函数voidchange_fvoid;//修改密码函数voidalarm_fvoid;//报警功能函数#includeSTC_NEW_
8051.h#includestring.h#includeintrins.h#includeUART
1.h#includeUART
2.h#includeDelay_ms.h#includeInit_Timer
0.h#defineBuf1_Max500//串口1缓存长度sbitYellow_LED=P1^5;//LED1黄色指示灯sbitGreen_LED=P1^6;//LED2绿色指示灯sbitRed_LED=P1^7;//LED3红色指示灯sbitIGT=P2^5;//启动TC35I信号sbitK1=0xC1;//继电器unsignedcharBuf_First_Serial[Buf1_Max];unsignedcharrunxun_ser1=0Flag_Buf1_Rec=0;unsignedintStart_weiziEnd_weizi;unsignedintFirst_Int=0Second_Int=0;unsignedcharTimer0_Start=0;unsignedintTimes=0shijian=0Count_time=0;//发送换行回车函数voidSend_LRvoid{Send_Hex0x0D;Send_Hex0x0A;}//清除串口1缓存数据函数voidCLR_Buf1void{unsignedintk;fork=0;kBuf1_Max;k++//将缓存内容清零{Buf_First_Serial[k]=0x30;}First_Int=0;//接收字符串的起始存储位置}//判断缓存中是否含有指定的字符串函数unsignedcharHandunsignedchar*a{ifstrstrBuf_First_Seriala!=NULLreturn1;elsereturn0;}//定位字串+32符位置voidFind_dw_TEXTvoid{unsignedintk;fork=0;kBuf1_Max;k++{ifBuf_First_Serial[k]==+Buf_First_Serial[k+1]==3Buf_First_Serial[k+2]==2{Start_weizi=k+6;break;}}fork=0;kBuf1_Max;k++{ifBuf_First_Serial[k]==OBuf_First_Serial[k+1]==K{End_weizi=k-5;break;}}}//送命令函数//不允许出错voidSecond_AT_Commandunsignedchar*bunsignedintwait_time{unsignedchari;unsignedchar*c;c=b;//保存字符串地址到cCLR_Buf1;i=0;whilei==0{if!HandOK{ifTimer0_Start==0{b=c;//将字符串地址给bforb;*b!=\0;b++{Send_Hex*b;}Send_LR;Times=0;shijian=wait_time;Timer0_Start=1;}}else{i=1;Timer0_Start=0;}}CLR_Buf1;}//发送命令函数//允许出错voidSecond_AT_ERRORunsignedchar*bunsignedintwait_time{unsignedchari;unsignedchar*c;c=b;//保存字符串地址到cCLR_Buf1;i=0;whilei==0{if!HandOK!HandERROR{ifTimer0_Start==0{b=c;//将字符串地址给bforb;*b!=\0;b++{Send_Hex*b;}Send_LR;Times=0;shijian=wait_time;Timer0_Start=1;}}else{i=1;Timer0_Start=0;}}CLR_Buf1;}voidSet_Text_Modevoid{Second_AT_CommandATE03;//取消回显Second_AT_CommandAT+CNMI=213;//新短信到来时提示Second_AT_CommandAT+CMGF=13;//PDU模式Second_AT_CommandAT+CSDH=03;//TEXT显示模式//Second_AT_CommandAT+CSCS=\GSM\3;//使用GSM字符集//Second_AT_CommandAT+CSMP=17167083;//设置PDU模式参数Second_AT_CommandAT+CPMS=\SM\\SM\\SM\3;//所有操作都在MT模块终端中进行;Second_AT_ERRORAT+CMGD=110;}voidCheck_Message_recvoid{unsignedintk;ifstrstrBuf_First_Serial+CMTI!=NULL//若缓存字符串中含有+CMTI就表示有新的短信{Delay_ms500;CLR_Buf1;//while!HandOK!HandERROR//{//CLR_Buf1;Send_ASCIIAT+CMGR=1;//发送读取信息指令Send_LR;Delay_ms10000;//}Find_dw_TEXT;fork=Start_weizi;k=End_weizi;k++{Second_Serial_Port_SendBuf_First_Serial[k];}ifstrstrBuf_First_Serialonled1!=NULL{Yellow_LED=0;}elseifstrstrBuf_First_Serialoffled1!=NULL{Yellow_LED=1;}elseifstrstrBuf_First_Serialonled3!=NULL{Red_LED=0;}elseifstrstrBuf_First_Serialoffled3!=NULL{Red_LED=1;}elseifstrstrBuf_First_Serialonrelay!=NULL{K1=1;}elseifstrstrBuf_First_Serialoffrelay!=NULL{K1=0;}//Second_AT_CommandAT+CMGD=110;Second_AT_ERRORAT+CMGD=110;CLR_Buf1;}}voidWait_CREGvoid{unsignedchari;unsignedintk;i=0;CLR_Buf1;whilei==0{CLR_Buf1;Send_ASCIIAT+CREG;Send_LR;Delay_ms5000;fork=0;kBuf1_Max;k++{ifBuf_First_Serial[k]==:{ifBuf_First_Serial[k+4]==1||Buf_First_Serial[k+4]==5{i=1;break;}}}}}voidmainvoid{P4M1=0x00;//P40-P43设置为推挽输出P4M0=0x0f;P4=0x00;Delay_ms100;IGT=0;Delay_ms5000;IGT=1;Timer0_init;//定时器0初始化Serial_Init;//第一个串口初始化Second_Serial_Port_Initial;Wait_CREG;Set_Text_Mode;Green_LED=0;while1{Check_Message_rec;Delay_ms1000;Green_LED=0;Delay_ms1000;Green_LED=1;}}//定时器0中断处理函数voidTimer0voidinterrupt1{TR0=0;//停止定时器0Count_time++;ifCount_time=60000{Count_time=0;}ifTimer0_Start==1Times++;ifTimes40*shijian{Timer0_Start=0;Times=0;}TH0=0x4C;//设置溢出一次为50msTL0=0x00;TR0=1;//开启定时器0}//串口1中断处理函数voidSerial_Intvoidinterrupt4{ES=0;//关串口中断,防止中断嵌套ifTI//如果是发送中断,则不做任何处理{TI=0;//清除发送中断标志位}ifRI//如果是接送中断,则进行处理{RI=0;//清除接收中断标志位Buf_First_Serial[First_Int]=SBUF;//将接收到的字符串存到缓存中First_Int++;//缓存指针向后移动ifFirst_IntBuf1_Max//如果缓存满将缓存指针指向缓存的首地址{First_Int=0;}}ES=1;//开启串口中断}/*****/voidinputvoid{intk=0;lcd_wcmd0x01;//清屏whilek6{ReadKey;ifl_key=9//输入数字0-9{pswd[k]=l_key+0x30;display0x00+k*;l_key=0xff;k++;}ifl_key==12//删除{delect=1;k--;display0x00+k;l_key=0xff;}}whilek=6{ReadKey;ifl_key==14//确定{ok=1;l_key=0xff;break;}}}voidpswd_errorvoid{codeucharsms[]={Alarm!someonehasinputedwrongpasswordthreetimes.};inttj;speaker=0;t=times;lcd_wcmd0x01;display0x00Error!;longdelay10;ift=3//错误输入3次后自锁{lcd_wcmd0x01;display0x00Tryittomorrow!;gsmsms;forj=0;j=0;j++//自锁forj=0;j=0;j++;}return;}voidfunctionvoid{display0x00Pleasepressthe;display0x40functionkey;while1{ReadKey;ifl_key==10//开门{lcd_wcmd0x01;display0x00Openthedoor.;door=0;longdelay10;door=1;l_key=0xff;break;}elseifl_key==11//修改密码{l_key=0xff;change_f;break;}elseifl_key==13//启动防盗系统{alarm_f;break;}}}voidchange_fvoid{lcd_wcmd0x01;display0x00Inputoldpasswo;display0x40rd:;longdelay10;input;fori=0correct_old_change=0;i6;i++correct_old_change=pswd[i]-pswd_flash[i]+correct_old_change;ifcorrect_old_change==0//旧密码正确输入新密码{speaker=1;times=0;lcd_wcmd0x01;display0x00Inputnewpasswo;display0x40rd:;longdelay10;input;fori=0;i=6;i++pswd_new[i]=pswd[i];lcd_wcmd0x01;display0x00Inputitagain!;longdelay10;input;fori=0correct_new=0;i6;i++correct_new=pswd[i]-pswd_new[i]+correct_new;ifcorrect_new==0//新密码正确修改密码成功{speaker=1;times=0;fori=0;i6;i++_24C02Writepswd_new[i]0x00+i;//将新的六位密码写入E2PRAMAT24C02lcd_wcmd0x01;display0x00Establishessucc;display0x40essful!;longdelay10;change=0;}else//新密码不正确{times++;pswd_error;}}else//旧密码不正确{times++;pswd_error;}}voidalarm_fvoid{l_key=0xff;lcd_wcmd0x01;display0x00Systemstartup.;longdelay10;EX0=1;EX1=1;EA=1;while1{ReadKey;ifl_key==15//关闭防盗系统{lcd_wcmd0x01;display0x00Shutdownthesys;display0x40tem.;longdelay10;EA=0;break;}}}voidmain{InitCom;int1=0;//while1;IT0=1;EX0=1;IT1=1;EX1=1;EA=0;times=0;//错误次数清零_24C02Write50x05;//写入初始密码012345_24C02Write40x04;_24C02Write30x03;_24C02Write20x02;_24C02Write10x01;_24C02Write00x00;while1{lcd_init;//lcd初始化display0x00Pleaseinputthe;display0x40password:;longdelay10;fori=0;i6;i++pswd_flash[i]=_24C02Read0x00+i;delay200;input;fori=0correct_old=0;i6;i++//输入密码与实际密码比较correct_old=pswd[i]-pswd_flash[i]+correct_old;ifcorrect_old==0//密码正确{speaker=1;times=0;lcd_wcmd0x01;display0x00Correct!;longdelay10;lcd_wcmd0x01;while1{ifl_key==15{l_key=0xff;break;}function;}}else//密码不正确{times++;pswd_error;}}}voidstealinterrupt2{codeucharsms[]={Alarm!Someonehasinterruptyourhouse!};delay200;ifint1==0{speaker=0;lcd_wcmd0x01;display0x00Alarm!;display0x40Steal!;gsmsms;EX1=0;}}#define_at24c02_H#includereg
52.h#includeintrins.h#includelcd
1602.h#defineW24C020xA0//存储器的写地址#defineR24C020xA1//存储器的读地址sbitSDA=P3^7;//AT24C02串行数据sbitSCL=P3^6;//AT24C02串行时钟unsignedchar_24C02Readunsignedcharl_address;//24C02读函数void_24C02Writeunsignedchardatunsignedcharl_address;//24C02写函数voidI2C_writeunsignedchartmp//I2C写入一个8位二进制数,高位在前低位在后{unsignedchari;fori=0;i8;i++{SCL=0;_nop_;_nop_;_nop_;SDA=bittmp0x80;tmp=1;_nop_;_nop_;_nop_;_nop_;_nop_;SCL=1;_nop_;_nop_;_nop_;_nop_;_nop_;}SCL=0;}unsignedcharI2C_readvoid////I2C读取一个8位二进制数,也是高位在前低位在后{unsignedcharitmp;tmp=0;fori=0;i8;i++{SCL=0;_nop_;_nop_;_nop_;//加入空指令增加稳定性,这关系到频率问题SDA=1;_nop_;_nop_;_nop_;_nop_;_nop_;SCL=1;_nop_;_nop_;_nop_;_nop_;_nop_;tmp=1;ifSDA==1tmp++;}SCL=0;returntmp;}voidI2C_ACKbittmp//根据tmp的
1、0来决定应答信号{SDA=tmp;_nop_;_nop_;_nop_;_nop_;_nop_;SCL=1;_nop_;_nop_;_nop_;_nop_;_nop_;SCL=0;}voidI2C_startvoid//看看I2C开始的波形,再对应SDA、SCL的输出{SDA=1;_nop_;SCL=1;_nop_;SDA=0;_nop_;SCL=0;_nop_;}voidI2C_stopvoid//I2C结束{SDA=0;_nop_;SCL=1;_nop_;SDA=1;_nop_;SCL=0;_nop_;}unsignedchar_24C02Readunsignedcharl_address{unsignedchartmp=0;I2C_start;//I2C读数据的开始,到下面的结束是读一地址的整个过程,I2C_writeW24C02;//向I2C总线发出读取24C02的地址I2C_ACK0;//下面就得你们自己结合I2C串口协议进行,先看看24C02数据手册是怎么讲I2C协议的I2C_writel_address;//先写入地址,I2C_ACK1;I2C_stop;I2C_start;//再开始读取数据I2C_writeR24C02;I2C_ACK0;tmp=I2C_read;I2C_ACK1;I2C_stop;//读取一个地址的数据结束delay20;returntmp;}void_24C02Writeunsignedchardatunsignedcharl_address{I2C_start;//下面是写一地址数据的过程I2C_writeW24C02;//先向总线发出写24C02的地址I2C_ACK0;I2C_writel_address;//写入地址I2C_ACK0;I2C_writedat;//然后写入数据I2C_ACK1;I2C_stop;delay20;}#endif#define_gsm_H#includereg
52.h#includelcd
1602.hucharsms1[]={AT+CMGF=1\r};ucharsms2[]={AT+CMGS=13760727792\r};ucharsms3=0x1A;voidInitComvoid;voidgsmuchar*sms;//初始化串行口voidInitComvoid{ucharTHTL;THTL=0xFD;ET1=0;SCON=0x40;//串口方式1TMOD=0x20;//定时器1定时方式2TH1=THTL;TL1=THTL;TI=0;TR1=1;//启动定时器}voidgsmuchar*sms{uchari=0j=0k=0;//InitCom;longdelay10;whilesms1[i]!=\0{SBUF=sms1[i];while!TI;TI=0;i++;}longdelay10;whilesms2[j]!=\0{SBUF=sms2[j];while!TI;TI=0;j++;}longdelay10;whilesms[k]!=\0{SBUF=sms[k];while!TI;TI=0;k++;}SBUF=sms3;while!TI;TI=0;}#endif#ifndef_key1_H#define_key1_H#includereg
52.h#includeintrins.hcodeunsignedcharkey_tab
[17]={0xed0x7e0x7d0x7b0xbe0xbd0xbb0xde0xdd0xdb0x770xb70xee0xd70xeb0xe70XFF};//键盘的读取,我们采用分时扫描unsignedcharl_key=0xff;//定义变量,存放键值unsignedcharl_keyold=0xFF;//做为按键松开否的凭证voidReadKeyvoid;//扫描键盘获取键值voidReadKeyvoid//读键盘值{unsignedcharijkey;j=0xfe;key=0xff;//设定初值fori=0;i4;i++{P1=j;//P1口低4位循环输出0,扫描键盘ifP10xf0!=0xf0{//如果有键按下,P1高4位不会全为1,key=P1;//读取P1口,退出循环,否则循环下次break;}j=_crol_j1;//此函数功能为左循环移位}ifkey==0xff{//如果读取不到P1口的值,比如是干扰,不做键值处理,返回l_keyold=0xff;return;}ifl_keyold==key{//检测按键放开否,如return;}l_keyold=key;//获取键码做为放开的凭证fori=0;i17;i++{//查表获得相应的16进制值存放l_key变量中ifkey==key_tab[i]{l_key=i;break;}}//程序运行到这里,就表明有键值被读取存放于l_key变量中,主程序就可以检测此变量做相应外理}#endif#ifndef_LCD1602_H#define_LCD1602_H#includereg
52.h#includeintrins.h#defineucharunsignedchartypedefbitBOOL;sbitrs=P0^5;sbitrw=P0^6;sbitep=P0^7;voiddelayuchar;voidlongdelayuchar;voidlcd_wcmduchar;BOOLlcd_bz;voidlcd_posuchar;voidlcd_wdatuchar;voiddisplayucharuchar*;voidlcd_init;voiddelayucharms{//延时子程序uchari;whilems--{fori=0;i250;i++;}}voidlongdelayuchars//长延时{whiles--{delay80;}}BOOLlcd_bz{//测试LCD忙碌状态BOOLresult;rs=0;rw=1;ep=1;result=BOOLP20x80;ep=0;returnresult;}voidlcd_wcmducharcmd{//写入指令数据到LCD//whilelcd_bz;rs=0;rw=0;ep=0;P2=cmd;ep=1;ep=0;}voidlcd_posucharpos{//设定显示位置lcd_wcmdpos|0x80;}voidlcd_wdatuchardat{//写入字符显示数据到LCD//whilelcd_bz;rs=1;rw=0;ep=0;P2=dat;ep=1;ep=0;}voidlcd_init{//LCD初始化设定lcd_wcmd0x38;//functionsetdelay1;lcd_wcmd0x38;//functionsetdelay1;lcd_wcmd0x08;//displayon/offdelay1;lcd_wcmd0x01;//清除LCD的显示内容delay1;lcd_wcmd0x06;//entrymodesetdelay1;lcd_wcmd0x0c;//开显示,并显示光标delay1;}函数名称display功能在LCD上显示数组的数据,打印模式说明先写显示地址,后写显示数据调用lcd_wcmdlcd_pos入口参数pos写入的位置,q指向要写入的数据所在的数组返回值无voiddisplayucharposuchar*q{lcd_pospos;while*q!=\0{delay10;lcd_wdat*q;q++;}}。