dr2攻略2-9 为什么再门上的密码锁房屋逃脱攻略处输入密码没有显示?!

防盗门上的智能指纹密码锁显示屏不停闪烁,并且开不了门,是何原因?_百度知道君,已阅读到文档的结尾了呢~~
密室逃脱2第二章攻略 完美三星通关图文详解
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
密室逃脱2第二章攻略 完美三星通关图文详解
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口LCD电子密码锁的设计_自动化设计论文_毕业论文和毕业设计
专业学科论文:
当前位置 |
LCD电子密码锁的设计
1 本设计课题的目的和意义 2
1.1 机械锁的缺点 2
1.2 电子密码锁的优点 2
1.3 本设计课题的研究现状 3
2 LCD电子密码锁的设计 4
2.1 系统设计方案 4
2.2 系统功能 4
2.3 硬件部分的相关介绍 5
2.3.1 AT89C51 简介 5
2.3.2 1602 液晶显示器简介 5
2.3.3 Protel99 简介 7
2.4 各个硬件模块的设计 9
2.4.1 电源部分的设计 9
2.4.2 最小系统部分的设计 9
2.4.3 输出部分的设计 10
2.4.4 液晶接口部分的设计 11
2.4.5 系统PCB图 12
3 软件部分 13
3.1 软件编写环境简介 13
3.2 Intel HEX 文件简介 13
3.3 软件的总体编写思路和流程图 15
3.4 各个软件子模块的编写 17
3.4.1 1602 液晶驱动程序 17
3.4.2 键盘扫描程序 21
3.4.3 密码输入和处理部分程序 22
3.4.4 时钟部分程序 27
参考文献 33
图1 系统组成 4
图2 1062引脚 6
1602的内部框图 7
图4电源部分 9
图5 最小系统部分 10
图6 输出部分 11
图7液晶接口部分 12
图8键盘接口部分 12
图9流程图 16
图10读操作时序 20
图11 写操作时序 20
表1 1602 接口信号说明 11
表2 1602液晶时序参数 17
表3 1602 指令表 18
表4 状态字说明 20
LCD电子密码锁的设计
单片机单芯片的微小体积和低的成本,可广泛地嵌入到如家用电器、仪器仪表、工业控制单元、办公自动化设备、金融电子系统、个人信息终端及通讯产品中,成为现代电子系统中最重要的智能化工具。
本设计是基于单片机的密码锁设计方案,根据要求,给出了该单片机密码锁的硬件电路和软件程序,同时给出了单片机型号的选择、硬件设计、软件流程图、单片机存储单元的分配、汇编语言源程序及详细注释等内容。该方案具有电路简单、成本低、高安全性、操作简单等特点。
【关键词】:单片机
电子密码锁
The Design of LCD Electronic Encryption Lock
Because of small volume and low cost, MCU widely inserts to like domestic electric appliances, instrument measuring appliance, the industry control unit, in the office automation equipment, the financial electron system, individual information terminal and the communication product, becomes in the modern electron system the most important intellectualized tool.
This design describes an LCD electronic encryption lock control program affected by MCU. According to the request, has given the hardware electric circuit and the software procedure which this monolithic integrated circuit password locks, simultaneously has given monolithic integrated circuit model contents and so on choice, hardware design, software flow chart, monolithic integrated circuit memory cell assignment, assembly language source program and detailed annotation. The program has characteristics of simple circuit, low-cost, high security, and simple operation and so on.
【Key words】 MCU
Electronic Encryption Lock
随着人们生活水平的提高,如何实现家庭防盗这一问题也变得尤其的突出,传统的机械锁由于其构造的简单,被撬的事件屡见不鲜, 同时,机械锁一般配有金属钥匙,带起来太重,万一弄丢了,锁可能也就没用了。电子锁保密性高,密码泄露了,换个密码,锁照样能用;使用灵活性好,万一忘记密码,可以通过功能键,给用户提示密码;安全系数高,能够防止不法分子多次试探密码;性价比好,因此,密码锁受到了广大用户的亲呢。该密码锁有密码提示功能,更改密码等功能,使用灵活性好,安全系数高,适用范围广,生产成本底, 因此,该类密码锁有望成为琐业的主流产品。经多次调式观察,该密码锁性能好,可靠性强,已达到设计要求。
而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。目前国内,大部分人使用的还是传统的机械锁。然而,眼下假冒伪劣的机械锁泛滥成灾,互开率非常之高。所谓互开率,是各种锁具的一个技术质量标准,也就是1把钥匙能开几把锁的比率。电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。目前,电子密码锁在国外已大量使用,技术已趋于成熟。在国内这种锁主要出现在保险柜、密码箱、高级宾馆等场所。
本设计课题的目的和意义
机械锁的缺点
随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问之一。锁自古以来就是把守门户的铁将军,目前,最常用的锁是美国人L.耶尔发明的圆柱形销栓的弹子锁,其机构简单,使用方便,价格便宜,但在使用中暴露了很多缺点:
1.容易被技术开启:目前,与防盗门配套的传统机械门锁仅仅是单纯的契合型机械装置,无论其宣称如何复杂、坚固,所谓"开锁大王"在数分钟之内就可开启,并且不迹。锁是防盗门的"心脏",一旦锁芯被攻破,防盗门锁再多也没用。
2.结构复杂、故障率极高:机械门锁由单纯的契合型机械装置构成。由于机械结构复杂,制造、装配工艺落后,在使用中锁具会因为其配件出现阻滞、变形、脱落等问题而导致失效。
3.换锁的烦恼:当钥匙遗失、被人配制、房子出租收回后或有其它不安全因素存在时,就必须换锁,一年内换几次锁的情况也时有发生。
4.互开率高:由于机械钥匙自身编码能力极低,导致互开率高,即使机械钥匙匙形编码不同,也同样存在互开的问题。在同一幢楼里甚至是同一单元的两对门,也可能会出现别人家的钥匙能打开你家门的问题。
5.易被破坏:我们长期以来所使用的门锁不但很不安全,而且非常容易被破坏,因为机械锁具的锁芯孔被一点点异物堵塞就会开不了门,类似的破坏随手操作几秒钟就可得逞,报纸、电视等媒体上经常有此类报道。
6.带钥匙的烦恼:一道门至少需要带一把钥匙,所以我们都曾饱受携带一大串钥匙的痛苦。一旦有一串钥匙丢失,出于安全考虑,会造成多把门锁需要更换的情况。
7.钥匙开门的烦恼:开门前总要花一定时间在许多钥匙之间挑选,在插入钥匙开门过程中还要分清左旋还是右旋,并转动几周方能开锁,经常会因为天地杆等机械运动不畅而导致开门困难,特别是老人和小孩有时根本就开不了门。
电子密码锁的优点
1.硬件结构简单,功能丰富:采用单片机来实现的电子密码锁,在设计时遵循以软件代替硬件,能用软件实现的东西就不用硬件去做,而且可以在硬件不变的情况下,改动相应的软件,派生出不同功能的产品。
2.密码组合多,安全性好:本设计采用了0~9 共十个数字作为密码编码,密码可在1~10 位内任意设置。如果设定密码为10 位,则密码组合为910 种,即使每20 秒测试一组密码,进行试探性破译,试完全部密码大约要1100 多年。如果密码长度再增加,破译就更加困难。
3.安全方便:无需携带金属钥匙,只需记得一组密码。一旦发现密码有泄露的危险,可即时更改密码。
4.为社区的电子化管理提供了方便:现代社会是电子社会,电子存在于我们生活的每一角落,出于管理的统一和方便考虑,电子密码锁替代机械门锁是一种趋势。根据国外的统计资料,装有电子防盗的商业区或居民区盗窃犯罪率平均下降30%左右。
本设计课题的研究现状
随着单片机的问世,出现了带微处理器的智能密码锁,它除了具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性。目前发达国家已经大规模地应用智能门禁系统,可以通过多种更加安全,更加可靠的方法来实现大门的管理。但电子密码锁在我国的应用还不广泛,主要出现在保险柜、密码箱、高级宾馆等场所,家居用的较少,究其原因,我认为有以下几点:
1.价格原因。现在普通的家庭买一把机械锁,价格在几块到几十块左右,而电子密码锁的价格一般在百元以上,进口的甚至要上千元,买一把这样的锁对很多家庭来说,是很难接受的。
2.厂商的推广力度不够。电子密码锁属于较新的高科技产品,许多用户根本不知道有这种锁,更不用说拿它与传统的机械锁作比较。而一般的商场也不会经营这种产品,用户即使想买也难以买到。
目前我国开发的电子密码锁的技术还比较落后,开发的密码锁大多采用分离电子元件或普通数字电路设计生产的,尽管与机械钥匙锁相比有许多优点,但智能化程度低,编码组合仍较少。现介绍一款本人设计的采用AT89S51 单片机制作的电子密码锁,就克服了以上的两大缺陷,主要特点为:
(1)保密性好。由于采用15 位密码,随机破码率很低,并且在密码可能泄露的情况下及时更改密码,避免因人员的更替等特殊情况而使锁的安全性下降。
(2)破解保护。连续三次输入错误密码将发出警告声并锁定键盘一段时间。
(3)界面简洁,操作简单人性化,故障率低,密码输入操作简便。
(4)平时本密码锁就是一个电子时钟,带整点提示功能。
(5)通用性强,可根据需要可***在不同的设备上。
LCD电子密码锁的设计
系统设计方案
图1 系统组成
键盘按键密码输入,送AT89C51处理,显示输出用于及时显示按键输入的数字,便于修改,声音输出当密码错误时候的报警信息,开锁部分采用电磁锁接受芯片送来的信号后自动开锁。
本电子密码锁具备以下功能:
1.没有settime时液晶显示器只显示当时时间,在主界面下如果按settime 键,就可以重设时间。
2.在主界面下按set psw键后进入设置密码状态,密码可在1-15 位范围内自由设置,最多达1015 种组合,使穷举法套解密码成为不可能。
3.在主界面下按input键后输入密码,密码正确时,在输出口1 输出0.5 秒的高脉冲开锁电平,在输出口2 输出0.5 秒的低脉冲开锁电平,用于开锁。如果连续三次输入错误密码,则启动报警系统并锁定键盘一段时间。
4.退格和按键提示功能。每次按键都有发光二极管发光和声光提示音,用于指示按键有效。同时液晶显示可以显示所输入的数字是不是错误,错误的话用退格修改并从输入,可返回主界面。
5.系统设有超级用户密码,用于解除用户忘记其所设密码时使用,抑或当密码锁用于宾馆,房客走后,宾馆管理员用于清除旧密码。
6.在外部掉电时,内部电源会使芯片继续工作原来设置的密码也不会丢失。
硬件部分的相关介绍
AT89C51 简介
AT89C51 是美国Atmel 公司生产的低功耗,高性能CMOS 8 位单片机,片内含4k bytes的系统可编程的Flash 只读程序存储器,器件采用Atmel 公司的高密度,非易失性存储技术生产,兼容标准8051 指令系统及引脚。它集成Flash 程序存储器,既可在线编程(ISP)也可采用传统的方法进行编程。集8 位微处理器于单片芯片中,功能强大,价位低的AT89C51 提供许多高性价比的应用场合,可灵活应用于各种控制领域。
主要性能参数如下:
1.32 个可编程I/O 口线
2.4K 字节在系统编程(ISP)Flash 闪速存储器
3.与MCS-51 指令系统完全兼容
4.4.0~5.5V 的工作电压范围
5.全静态工作模式0Hz~33MHz
6.全双工串行URAT 通道
7.128*8 字节内部RAM
8.1000 次擦写周期
9.2 个16 位定时/计数器
10.6 个中断源
11.三级程序加密锁
12.低功耗空闲和掉电模式
13.掉电标识和快速编程特性中断
14.看门狗(WDT)及数据指针
15.可从空闲模式唤醒系统
16.灵活的在系统编程(ISP-字节或页写模式)
功能特性概述
AT89C51的功能与结构如下: 128 字节内部RAM,32 个I/O 口线, 4K 字节Flash 闪速存储器,看门狗(WDT),两个16 位定时/计数器,两个数据指针,一个5 向量两级中断结构,片内振荡器及时钟电路,同时AT89C51 可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式,空闲方式停止CPU 的工作,但允许RAM 定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM 中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
1602 液晶显示器简介
LCD显示大体分为字符型液晶、点阵图形液晶、笔段型液晶等几大类。
图2 1602引脚
液晶显示模块是一类专门用于显示数字、字母、符号、图形等的点阵型液晶显示模块,每一个点阵字符位都可以显示一个字符,点阵字符位之间的一个点距的间隔起字符间距和行距的作用。它是由若干个5×7 或5×11 等点阵字符组成。目前市面上常用的有1 行16 个字、2 行16 个字、2 行20 个字和2 行40 个字等字符模型,这些LCD 虽然显示的字数各不相同,内部结构也有点差异,但是都具有相同的输入输出界面因此编程时候也差不多。
1.液晶显示模块LCD1602 的引脚功能如下:
LCD1602 的引脚功能排列如上图2所示,它采用的是16 脚接口,而且引脚都分布在LCD1602的一侧使用时只要把对应的电源、数据线等接好就可以其中:
第1 脚:VSS 为电源
第2 脚:VDD 接地
第3 脚:V0 用于调节LCD1602的亮度,为液晶显示器对比度调整端,很多时候液晶显示没显示可能就是这里的原因,LCD 驱动电压范围为VDD~VO 接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生"鬼影",使用时可通过一个10K 的电位器调整对比度。
第4 脚:RS 为寄存器选择位,低电平时选择命令寄存器IR、高电平时选择数据寄器DR。
第5 脚:RW 为读写控制位,高电平时进行读操作。当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS 为低电平RW 为高电平时可以读忙信号,当RS 为高电平RW 为低电平时可以写入数据。
第6 脚:Enable 端为使能控制位,当E 端由高电平跳变成低电平时,液晶模块执行命令。
第7~14 脚:D0~D7 为8 位的双向数据总线。
第15~16 脚:背光灯的正负极
1602的内部框图
2.液晶显示模块1602 的内部结构
液晶显示模块LCD1602 的内部结构如上图3所示,它主要由CGROM、CGRAM、DDRAM、BF、IR、DR、AC 等大规模集成电路组成。
CGROM 为字符产生器ROM(Character Generator ROM,简称CGROM),它存储了192个5×7 的点阵字型,但只能读出不能写入。
CGRAM 为字型、字符产生器的RAM(Character Generator RAM,简称CGRAM), 可供使用者存储特殊造型的造型码,CGRAM 最多可存8 个造型码。
DDRAM 为数据显示用的RAM(Data Display RAM,简称DDRAM),用以存放要LCD 显示的数据,只要将标准的ASCII 码放入DDRAM,内部控制线路就会自动将数据传送到显示器上,并显示出该ASCII 码对应的字符。
BF 为忙碌信号(Busy Flag,简称BF),当BF 为1 时,不接受微机送来的数据或指令;当BF 为0 时,接受外部数据或指令,所以,在写数据或指令到LCD 之前,必须查看BF 是否为0。
IR 为指令寄存器(Instruction Register,简称IR),负责存储MCU 要写给LCD 的指令码,当RS 及R/W 引脚信号为0 且Enable 引脚信号由1 变为0 时,D0~D7 引脚上的数据便会存入到IR 寄存器中。
DR 为数据寄存器(Data Register,简称DR),它们负责存储微机要写到CGRAM 或DDRAM 的数据,或者存储MCU 要从CGRAM 或DDRAM 读出的数据。因此,可将DR 视为一个数据缓冲区,当RS 及R/W 引脚信号为1 且Enable 引脚信号由1 变为0 时,读取数据;当RS 引脚信号为1,R/W 引脚信号为0 且Enable 引脚信号由1 变为0 时,存入数据。
AC 为地址计数器(Address Counter,简称AC),负责记数写入/读出CGRAM 或DDRAMD的数据地址,AC 依照MCU 对LCD 的设置值而自动修改它本身的内容。
Protel99 简介
Protel99se主要由组成软件有:
原理图编辑器(advanced schematic )
用于原理图的输入、编辑、查错。
仿真器(Simulator) 用于对原理图的仿真,包含了常用的直流、交流特性、瞬态响应等常用的仿真测度,并可以查看波形。
PCB编辑器(Advanced PCB) 用于PCB的设计、查错。
PLD设计工具(PLD designer) 简单PLD的设计工具。
文本编辑器(Text editor) 用于说明文档、网络表等的编辑,不支持中文。
表格处理软件(Spread) 用于处理元件表,相当于excel 97。
Protel 99se集成了从原理图设计、仿真到PCB过程中可能涉及到的常用工具,只用它几科可以完成整个设计的所有工作,功能非常强大,需要一定的时间与精力去学习。
Protel99se创建工程及所需文件的方法如下:
1、创建工程
启动Protel99SE,如果是刚刚***完毕打开后只有一个程序的主窗口,有标准菜单及标准菜单栏,左边是文档管理器窗口(Document Manager),此窗口可以通过上面的工具栏的文档管理器窗口切换按钮开关,可以在画图时为节省屏幕空间而关闭此按窗口。在此窗口中将显示打开的工程中所包含的文件夹及文件,就像在WINDOWS的资源管理器中管理文件一样,支持拖放。
执行命令File>New会弹出一个对话框,让你选择该工程文件的参数。
在Location选项卡有两个选项:
Design Storage Type:选择文件的保存类型,有两个选项,一个是Ms Access Database就是前面所说的将所有文件组织在一个DDB文件中,在外部看到的只是一个DDB文件,另一个是WINDOWS FILE SYSTEM则是标准的WINDOWS组织形式,生成几个文件就会都放到工作目录中,是单个文件的形式保存的。除了Protel99SE支持前一种类型外其它版本包括DXP都是推荐后者,但本人比较喜欢前者,因为这样组织文件很方便,除了DDB文件之外在资源管理器中看到的其它文件都可以删除,移动、复制也比较方便,而如果以后者方式存储也会生成一个DDB文件,但此文件只保存工程信息,其中没有文件,如果把同目录下的文件删除后,打开DDB也看不到该文件。DXP可以对DDB进行转换。
Data File Name:工程文件名filename.ddb。
Password选项卡是用于为工程文件设置密码的。由于PROTEL启动是会默认打开上次退出程序时没有关闭的项目,如果是公用的计算机的话可能会有人下次使用计算机时会误改你的工作,所以为保护你的数据或者保密可以设上密码,但此密码要记牢了,忘了的话你知道后果的。
其实如果PROTEL99SE的密码忘了的话也不要紧,用DXP打开就行了,它会提示你是否将DDB转换为DXP格式的工程,你只要同意就行了,PROTEL99SE中设置的密码对DXP是无效的,这样你再把各个电路图文件导出来就行了。
创建一个工程文件后会自动打开,然后你会看到三个目录:
Design Team: 设计工作组的一些信息,如果有多个人同时设计一个项目时可以分配权限及工作任务,还可以设置用户组,与WINDOWS的用户组类似,详细信息可查阅相关资料。
Recycle Bin: Protel99se的回收站,用法与WIDOWS的回收站用法一样,只是它不在WINDOWS的回收站中而是在此DDB文件中,如果确实没用的文件可以在从回收站中彻底删除,DDB文件就会小一些。
Documents: 存放你的电路图相关文件,包括前一小节的所有文件,不过你还可以建立其它目录,操作与WINDOWS资源管理器中一样。
2、创建原理图文件
进入Documents目录,在空白处单击右键,选择New命令,或者File>New弹出对话框,选择Schematic Document,点击OK即可,或者双击该图标,然后改名。
创建其它文件操作一样,不再赘述。
按此步骤可以创建所需的所有原理图文件,此时在左边的Explorer窗口就可以看到整个工程的树状结构,与资源管理器中的目录树非常相似,可以进行相同的复制、移动等操作。
Protel 99 的主要特点:
1.集成设计管理系统(Design Explore)
2.使用了智能工具(SmartTool)技术,在设计环境中集成了所有设计所用到的工具。
3.使用了智能文档(SmartDoc)管理技术,把所有设计时用到的文档都保存在一个数据库中,在工作中可以使用各种文档。
4.使用了智能组(SmartTeam)管理技术,允许多个设计者通过网络安全地为同一
工程工作。通过集成的设计管理系统,可以方便地管理用户、设置访问权限等。
5.提供了功能强大的各种文档的快速浏览工具,使用户可以快速方便地查询、定位、修改文档。
6.提供了全面而方便使用的帮助系统[3]。
各个硬件模块的设计
电源部分的设计
电源部分是先通过一个变压器把220 伏的交流电变换为9 伏的交流电,再通过全桥整流电路整流成单向脉动的直流电,大容量电解电容C1 用于使脉动的直流电波形更加平直,C2 用于抵消输入线较长时的电感效应,以防止电路产生自激振荡,其容量较小,一般小于1μF。在输出端加接电容C6,一般取值0.1μF,其目的是改善负载的瞬态响应、防止自激振荡和减少高频声,输出端输出较为稳定的5V 电压为整个系统提供工作电压。E为备用电池一端接地另一端通过二极管接电源,当芯片工作时,二极管反向,当掉电时,二极管正向导通,继续工作。
图4电源部分
最小系统部分的设计
最小部分的设计如下图5所示,时钟周期是芯片工作时候的最小周期,时钟电路是计算机的心脏,它控制着计算机的工作节奏。AT89S51内部有一个带反馈的线性反相放大器,外接晶振(或陶瓷谐振器)和电容就组成振荡器,产生时钟送至单片机的内部工作部件。加电以后延迟一段时间(约10ms)振荡起振产生时钟,不受软件控制(XTAL2输出幅度为3V左右的正弦波)。振荡器产生的时钟频率主要由晶振上标明的频率参数确定,电容C4和C5的作用有两个:其一是使振荡器起振,其二是对振荡器的频率f起微调作用(C4、C5变大,则f变小),其值一般是30pF左右。
复位电路由电容串联电阻构成,复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。由图并结合电容电压不能突变的性质,可以知道,当系统一上电,RST脚将会出现高电平,而且,这个高电平持续的时间由电路的RC值来决定。典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,时间常数τ=RC[6]越大,上电时RST端保持高电平的时间越长,所以,适当组合RC的取值就可以保证可靠的复位。当振荡频率为12MHz时,推荐C 取10μ,R取8.2K,当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平。若复位电路失效,加电后,CPU将从一个随机的状态开始工作,系统就不能正常运转。除了上电复位以外常常需要人工复位,将一个按钮并联于上电自动复位电路,按一下开关就在RST端出现一段时间的高电平,即使器件复位。
图5 最小系统部分
输出部分的设计
输出部分主要包括声光提示部分和电磁锁部分。
图中三极管Q1 工作于饱和状态,复位后单片机输出口的初始状态是高电平,三极管截止,蜂鸣器得不到工作电压而不能发声;当用软件控制此端口为低电平时,三极管导通,蜂鸣器得电而工作,发出声音。通过程序控制此三极管的间歇导通和截止以及导通和截止的时间长短,就可以达到控制声音频率和发声长短的目的,得到我们所需要的不同声音。
发光二极管LED1 和一个470 欧的电阻口串接到地,当输出口P3.4 为高电平时,发光二极管导通发光,当输出口为低电平时,发光二极管截止熄灭。在程序的初始化部分,要加一条clr p3.4 指令以熄灭此发光二极管。
开锁部分,使用了P3口的两跟口线,实际应用中应加上光电隔离以及缓冲放大电路。光电隔离用于防止后面电路的尖峰脉冲干扰通过单片机端口串扰进来,影响单片机的正常运行。缓冲放大电路进行电平转换和提高驱动能力以直接驱动电磁锁。做好电磁锁在市面上就可以买到这里就不介绍了。
图6 输出部分
液晶接口部分的设计
表1 1602 接口信号说明
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 DATA I/O
2 VDD 电源正极 10 D3 DATA I/O
3 VL 液晶显示偏压信号 11 D4 DATA I/O
4 RS 数据/命令选择(H/L) 12 D5 DATA I/O
5 R/W 读/写选择端(H/L) 13 D6 DATA I/O
6 E 使能信号 14 D7 DATA I/O
7 D0 DATA I/O 15 BLA 背光源正极
8 D1 DATA I/O 16 BLK 背光源负极
LCD 接口设计可以分为8 位及4 位控制方式,由于本电路采用多达32 个I/O 口的AT89S51 芯片,不存在I/O 口资源使用紧张,不够使用的情况,为方便程序的编写,采用最为常见的8 位接口设计。V0 为液晶显示器对比度调整端,LCD 驱动电压范围为Vss~Vdd,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生"鬼影",故通过一个10K 的电位器调整显示屏的对比度。15 和16 脚是液晶背光电压输入端,通过一
个单向自锁开关控制背光的开启和关闭。
图7液晶接口部分
通过自动布线和手工布线后得到的PCB图 如下:
软件编写环境简介
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。
C51工具包的整体结构中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。然后分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
Keil C51工具包各部分功能及使用简介如下:
1.C51与A51,C51是C语言编译器,其使用方法为:
C51 sourcefile[编译控制指令]或者C51 @ commandfile其中sourcefile为C源文件(.C)。大量的编译控制指令完成C51编译器的全部功能。包控C51输出文件C.LST,.OBJ,.I和.SRC文件的控制。源文件(.C)的控制等,详见第五部分的具体介绍。而Commandfile为一个连接控制文件其内容包括:.C源文件及各编译控制指令,它没有固定的名字,开发人员可根据自己的习惯指定,它适于用控制指令较多的场合。
A51是汇编语言编译器,使用方法为:
A51 sourcefile[编译控制指令]或A51 @ commandfile其中sourcefile为汇编源文件(.asm或.a51),而编译控制指令的使用与其它汇编如ASM语言类似,可参考其他汇编语言材料。Commandfile同C51中的Commandfile类似,它使A51使用和修改方便。
2. L51和BL51,L51是Keil C51软件包提供的连接/定位器,其功能是将编译生成的OBJ文件与库文件连接定位生成绝对目标文件(.ABS),其使用方法为:
L51 目标文件列表[库文件列表] [to outputfile] [连接控制指令]或 L51 @Commandfile
源程序的多个模块分别经C51与A51编译后生成多个OBJ文件,连接时,这些文件全列于目标文件列表中,作为输入文件,如果还需与库文件(.LiB)相连接,则库文件也必须列在其后。outputfile为输文件名,缺少时为第一模块名,后缀为.ABS。连接控制指令提供了连接定位时的所有控制功能。Commandfile为连接控制文件,其具体内容是包括了目标文件列表,库文件列表及输出文件、连接控制命令,以取代第一种繁琐的格式,由于目标模块库文件大多不止1个,因而第2种方法较多见,这个文件名字也可由使用者随意指定。BL51也是C51软件包的连接/定位器,其具有L51的所有功能,此外它还具有以下3点特别之处:
a.可以连接定位大于64kBytes的程序。
b.具有代码域及域切换功能(CodeBanking & Bank Switching)
c.可用于RTX51操作系统可以连接定位大于64kBytes的程序。
Intel HEX 文件简介
Intel HEX 文件是由一行行符合Intel HEX 文件格式的文本所构成的ASCII 文本文件。在Intel HEX 文件中,每一行包含一个HEX 记录。这些记录由对应的机器语言和/或常量数据的十六进制编码数字组成。Intel HEX 文件通常用于传输将被存于ROM 或者EPROM 中的程序和数据。保存单片机或其他处理器的目标程序代码的文件,它保存物理程序存储器中的目标代码的映像,以便编程器和仿真器调用。绝大多数编程器都支持Intel HEX 格式。
记录格式如下:
Intel HEX由任意数量的十六进制记录组成。每个记录包含5个域,它们按以下格式排列:
:llaaaatt[dd...]cc
每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字。每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:
: 每个Intel HEX记录都由冒号开头。
ll 是数据长度域,它代表记录当中数据字节(dd)的数量。aaaa 是地址域,它代表记录当中数据的起始地址。tt 是代表HEX记录类型的域,它可能是以下数据当中的一个:
00 - 数据记录
01 - 文件结束记录
02 - 扩展段地址记录
04 - 扩展线性地址记录
dd 是数据域,它代表一个字节的数据。一个记录可以有许多数据字节。记录当中数据字节的数量必须和数据长度域中指定的数字相符。cc 是校验和域,它表示这个记录的校验和。校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足。
数据记录Intel HEX文件由任意数量以回车换行符结束的数据记录组成.数据记录外观如下:
其中:10 是这个记录当中数据字节的数量。2462 是数据将被下载到存储器当中的地址。00 是记录类型(数据记录)464C…464C是数据。33 是这个记录的校验和。扩展线性地址记录(HEX386),扩展线性地址记录也叫作32位地址记录或HEX386记录。这些记录包含数据地址的高16位。扩展线性地址记录总是有两个数据字节,外观如下:
其中:02 是这个记录当中数据字节的数量。0000 是地址域,对于扩展线性地址记录,这个域总是0000。04 是记录类型 04(扩展线性地址记录)。FFFF 是地址的高16位。
FC 是这个记录的校验和,计算方法如下:01h + NOT(02h + 00h + 00h + 04h + FFh + FFh)。当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从IntelHEX文件读取来的随后的记录。.线性地址保持有效,直到它被另外一个扩展地址记录所改变。通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址。以下的例子演示了这个过程。
来自数据记录地址域的地址
扩展线性地址记录的数据域
绝对存储器地址
扩展段地址记录(HEX86)
扩展段地址记录也叫HEX86记录,它包括4-19位数据地址段。扩展段地址记录总是有两个数据字节,外观如下::EA其中:02 是记录当中数据字节的数量。0000 是地址域。对于扩展段地址记录,这个域总是0000。
02 是记录类型 02(扩展段地址记录)1200 是地址段。EA 是这个记录的校验和,计算方法如下:01h + NOT(02h + 00h + 00h + 02h + 12h + 00h)。
当一个扩展段地址记录被读取,存储于数据域的扩展段地址被保存,它被应用于从Intel HEX文件读取来的随后的记录。段地址保持有效,直到它被另外一个扩展地址记录所改变。通过把记录当中的地址域与被移位的来自扩展段地址记录的地址数据相加获得数据记录的绝对存储器地址。
以下的例子演示了这个过程..
来自数据记录地址域的地址
扩展段地址记录数据域
绝对存储器地址
文件结束(EOF)记录
Intel HEX文件必须以文件结束(EOF)记录结束。这个记录的记录类型域的值必须是01。EOF记录外观总是如下:
其中:00 是记录当中数据字节的数量。0000 是数据被下载到存储器当中的地址。在文件结束记录当中地址是没有意义被忽略的。0000h是典型的地址。01 是记录类型 01(文件结束记录)FF 是这个记录的校验和,计算方法如下:01h + NOT(00h + 00h + 00h + 01h)。
软件的总体编写思路和流程图
整个流程采用调用子程序的方式增强可读性,住循环为无限循环,程序在KEIL C51的环境下运行。先调试出液晶驱动程序,键盘扫描程序两个最基本的子程序,在需要使用时直接调用即可。在接下来的主循环中进行时钟的更新查询和是否有按键的判断,如果时间有更新(过了一秒)就转去处理时间更新;如果有按键按下,则转去按键处理,并判断是否是相应的几个键,是就跳转到相应的功能模块,不是则返回主界面。
由于51 单片机架构的原因,容易会受到外界干扰而出错,故程序写完后还要进行进行抗干扰方面的优化。通过指令冗余,软件陷阱等措施将受到干扰而乱飞的程序纳入正轨。比如在未开的中断入口处加入RETI 指令等等。在程序的按键部分加延时或者RS触发器去键盘抖动。
各个软件子模块的编写
1602 液晶驱动程序
表2 1602液晶时序参数
时序参数 符号 极限值 单位
最小值 典型值 最大值
E信号周期 Tc 400 - - ns
E脉冲宽度 Tpw 150 - - ns
E上升沿/下降沿时间 Tr tf - - 25 ns
地址建立时间 Tsp1 30 - - ns
引脚E。RS。R/W
地址保持时间 Thd1 10 - - ns
数据建立时间(读操作) Td - - 100 ns
引脚DB9-DB7
数据保持时间(读操作) Thd2 20 - - ns
数据建立时间(写操作) Tsp2 40 - - ns
数据保持时间(写操作) Thd2 10 - - ns
驱动程序:
硬件端口定义及软件资源分配:
rs bit p1.4 ;//寄存器选择线
rw bit p1.5 ;//LCD 读写线
en bit p1.6 ;//启用控制线,高电平动作
lcd equ p0 ;//LCD 双向数据总线
pos_flag bit 20h.0 ;//字符串显示位置标志,为0 时显示在第一行;为1 时显示在第二行
blank equ 30h ;//清行时填入的空格个数控制变量
LCD 初始化:
液晶显示模块1602 的控制指令1602 的控制指令共11 条,其中9 条针对命令寄存器IR 的,另外2 条是针对数据寄存器DR 的,具体指令如下表所列:
表3 1602 指令表
指令 指令码 说明 37us
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
清显示 0 0 0 0 0 0 0 0 0 0
光标返回 0 0 0 0 0 0 0 0 0 0 光标回到显示器左上方 1.52ms
输入方式 0 0 0 0 0 0 0 1 I/D S
是否移动及移动方向 37us
显示器开关控制 0 0 0 0 0 0 1 D C B D:显示 C:光标 B:光标闪烁 37us
移位 0 0 0 0 0 1 S/C R/L * * 移动光标及整体显示 37us
功能设置 0 0 0 0 1 DL N F * * DL:数据位数 N:数据行数 F:字型 37us
CGRAM地址设置 0 0 0 1 CGRAM的地址 设置CGRAM地址 37us
DDRAM地址设置 0 0 1 DDRAM的地址 设置DDRAM地址 37us
忙标志/读地址计数器件 0 1 BF 地址计数器(AC)的值 读出忙标志和AC的值 37us
CGRAM或DDRAM数据写 1 0 写数据 将内容写入RAM中 37us
CGRAM或DDRAM数据读 1 1 读数据 将内容写入RAM中读出 37us
指令1:清显示,指令码01H,光标复位到地址00H位置
指令2:光标复位,光标返回到地址00H
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符
指令7:字符发生器RAM地址设置
指令8:DDRAM地址设置
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据
指令11:读数据
init_lcd: mov a,#01h ;clr display
call write_cmd
mov a,#02h
call write_cmd ;clear address pointer
mov a,#06h
call write_cmd;
mov a,#0fh
mov a,#0ch
call write_cmd ;cursor on,blink
mov a,#1ch
call write_cmd ;display&cursor rotate right
mov a,#38h
call write_cmd;two lines,8 bits,5*7
LCD 忙标志位检测程序
图10读操作时序
表4 状态字说明
STA0-6 当前数据地址指针的数值
STA7 读写操作使能 1:禁止 0:允许
对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7 为0
check: push acc
mov lcd,#0ffh
jb lcd.7,ck
写指令子程序
图11 写操作时序
writec: call check
写数据子程序
writed: call check
键盘扫描程序
键盘扫描程序主要有下面五个方面:
1.在主程序中判断有无键闭合:其方法为在四根列线输出全"0",读取四根行线的电平状态,若四根行线电平全为"1",则键盘上没有闭合键;若四根行线不全为1,则有键处于闭合状态。
2.去除按键的机械抖动:其方法为判别到键盘上有键闭合后,延迟一段时间再判别键盘的状态,若仍有按键闭合,则认为键盘上有一个按键处于稳定的闭合期;否则,认为是按键的抖动或单片机受到干扰。
3.判别闭合按键的键号:方法为对键盘的列线P2.0-P2.3 进行扫描,读取行线P2.4-P2.7 返回的电平状态,若P2.4-P2.7 为全"1",则列线输出"0"的这一列上没有键闭合。设立一按键编号计数单元,每次判断一个键就加1,直到找到闭合键,此时计数单元中的值就是此闭合键的编号。
4.使CPU 对按键的一次闭合作一次处理:设立一按键标志key_flag,为1 表明有键闭合,为0 表明无键闭合。当有键按下后,CPU 循环检测此按键标志,为1 则继续检测,直到该标志量等于0,等待按键放开,保证CPU 对每一次按键仅作一次处理。
5.取自已定义的键盘布局:取到按键编号后,通过查表的方法,取到自己定义的按键值。
软件资源分配:
key_flag bit 20h.1
cnt_loop2 equ 31h
key_cnt equ 32h
key_num equ 33h
scan_sig equ 34h
扫描主程序:
get_key:call key_scan
jb key_flag,get_key
mov a,key_num
mov dptr,#key_pad
movc a,@a+dptr
;=======================================
key_scan;clr key_flag
mov p2,#0f0h
anl a,#0f0h
cjne a,#0f0h,key_in
jmp key_scan
;------------------------------------
key_in: clr key_flag
mov key_cnt,#0
mov scan_sig,#0f7h
mov r5,#3
call delay
scan_loop1:mov a,scan_sig
mov cnt_loop2,#4
scan_loop2: jb acc.4,next_key
setb key_flag
mov key_num,key_cnt
next_key: inc key_cnt
djnz cnt_loop2,scan_loop2
mov a,scan_sig
mov scan_sig,a
jc scan_loop1
密码输入和处理部分程序
软件资源分配:
pass_flag bit 20h.2
pass0 equ 40h;40h to 4Eh
pass1 equ 4fh ;4Fh to 5Dh
lenth0 equ 35h
lenth1 equ 36h
cnt_err equ 37h;error time
c_alm1 equ 38h ;alarm_time control
c_alm2 equ 39h
1.密码输入程序(含退格功能)
编写思路:执行清屏指令和开启光标显示和闪烁,取字符串"Input Password"并送到屏幕上显示,移动光标到第二行第一个位置。把密码计数单元清为0,并把指针指向输入密码存储RAM 的首地址,长度为15(可根据需要进行增减)。在输入主循环中一直调用等待按键,取到键值后,用一特定算法判断是否是确定键,退格键和数字键,如果不是则丢弃,如果是确定键,则返回;如果是退格键,则把密码计数单元减1 并把指针指向上一个RAM 单元;如果是数字键,则把它存储到当前指针所指向的RAM 单元,密码计数单元加1,同时把指针指向下一RAM 单元。每次密码计数单元加1 都要判断是否已经满15 位,如果满15 位则等待退格键和确定键,遇到其它键丢弃。
input_psw:mov a,#01h
call write_cmd
mov a,#0fh
call write_cmd
mov dptr,#ipt
clr pos_flag
call print
mov a,#0c0h
call write_cmd
mov lenth1,#0
mov r1,#pass1
input_loop: call get_key
key_enter1:cjne a,#0ch,key_bk1 ;enter key
key_bk1: cjne a,#0dh,n1;backspace key
bk_in1: mov a,lenth1
subb a,#1
jc relay1 ;jump to main_loop,but target out of range
dec lenth1
call lcd_add
setb acc.7
call write_cmd
mov a,' '
call write_data
call write_cmd
jmp input_loop
subb a,#10
jnc input_loop ;function key
mov a,b ;digital key
mov @r1,a
mov a,#'*'
call write_data
inc lenth1
mov a,lenth1
cjne a,#15,input_loop
n2:call get_key
cjne a,#0ch,n3
n3:cjne a,#0dh,n2
jmp bk_in1
2.密码比较和判断程序
编写思路:清除密码正确标志,比较内部设置密码的长度存储单元和待比较的密码长度存储单元,如果不同,则跳到密码错误处理部分;如果两者相等,则进行下一步判断,取两指针,分别指向内部设置的密码存储单元的首个RAM 地址,和待比较的密码存储单元的首个RAM 地址,如果两者相等则把指针指向下一个RAM 地址,再进行比较,遇到不相等就跳到错误处理部分。如果在密码长度范围内两比较单元都相等,则跳转到密码正确处理部分。
错误处理部分:取字符串"Access Denied"并送到显示屏显示,同时蜂鸣器发出警示音。每进入错误处理部分一次就把密码错误计数单元加1,当计到第三次时,执行报警部分,锁定键盘,锁定时间过后返回主界面。
密码正确处理部分:清空密码错误计数单元,取字符串"Access Granted"并送到显示屏显示,同时蜂鸣器发出密码正确的提示音,执行开锁部分。
Compare: clr pass_flag
mov a,lenth1
cjne a,lenth0,wrong
mov r0,#pass0
mov r1,#pass1
cmp_loop:mov a,@r0
mov b,@r1
cjne a,b,wrong
djnz lenth1,cmp_loop
wrong:clr pass_flag
mov dptr,#error
clr pos_flag
call print
mov r5,#150
call delay
inc cnt_err
mov a,cnt_err
cjne a,#3,n21
mov cnt_err,,#0
mov dptr,#lock
clr pos_flag
call print;加上一段延时锁定键盘
mov c_alm1,#255
n20: call beep
mov r5,#10
call delay
djnz c_alm1,n20
n21:call beep
mov r5,#15
call delay
mov r5,#15
call delay
mov r5,#15
call delay
mov r5,#100
call delay
right:setb pass_flag
mov cnt_err,#0
mov dptr,#ok
clr pos_flag
call print
mov c_alm2,#25
c22: call beep
djnz c_alm2,c22
mov r5, #255
call delay
3.密码设置程序(含退格功能)
编写思路:执行清屏指令,取字符串"Input new...."并送到显示屏进行显示,把光标移动到第二行第一个位置。 取一指针指向内部设置密码存储单元的首个RAM 的地址同时把内设密码长度计数单元清为0。在设置密码主循环中一直调用等待按键,取到键值后,用一特定算法判断是否是确定键,退格键和数字键,如果不是则丢弃并跳到输入循环中继续等待按键。如果是确定键看是否已经有输入至少一位密码,如果有则返回,如果还未有输入则跳到设置密码主循环中继续等待按键。如果是退格键,则密码长度计数单元减1,同时把密码计数单元减1 并把指针指向上一个RAM 单元。如果是数字键,则把它存储到当前指针所指向的RAM 单元,密码计数单元加1,同时把指针指向下一RAM 单元。每次密码长度计数单元加1 都要判断是否已经满15 位,如果满15 则等等待退格键和确定键,遇到其它键丢弃。
set_psw: mov a,#01h
call write_cmd
mov dptr,#new
clr pos_flag
call print
mov a,#0c0h
call write_cmd
mov r0,#pass0
mov lenth0,#0
set_loop: call get_key
key_enter2:cjne a,#0ch,key_bk2;enter key
mov a,lenth0
subb a,#1
key_bk2: cjne a,#0dh,n11 ;backspace key
jc set_loop
bk_in2: mov a,lenth0
subb a,#1
jc set_loop
dec lenth0
call lcd_add
setb acc.7
call write_cmd
mov a,#' '
call write_data
call write_cmd
jmp set_loop
n11:clr c
subb a,#10
jnc set_loop ;function key
mov @r0,a
add a,#30h
call write_data
inc lenth0
mov a,lenth0
cjne a,#15,set_loop
n12:call get_key
cjne a,#0ch,n13
n13:cjne a,#0dh,n12
jmp bk_in2
时钟部分程序
软件资源分配:
hour equ 3ah
min equ 3bh
sec equ 3ch
sec0 equ 3dh
cnt_timer equ 3eh
hour1 equ 21h
hour0 equ 22h
min1 equ 23h
min0 equ 24h
1.时钟中断程序
在中断入口处把A 和B 寄存器入堆栈保护起来,重新载入定时器初值,并把时间计数单元加1,查看一下是否已经累积到1 秒了,如果不是则退出中断;如果已经1 秒了,则查看是否已满1 分钟,如果不是则退出中断;如果已经满1 分钟则查看是否满1 小时,如果不是是退出中断;如果已经满1 小时则查看是否满24 小时,如果不是则退出中断;如果已经满24 小时则复位小时分钟和秒计数单元并退出中断。
考虑到晶振频率的误差和并在两端的微调电容的误差,实际的振荡频率不可能在我们所期望的理想值,结合中断处理所占用的时间,时钟实际上会有一定的误差,这时我们可以进行软件微调,对中断中载入的定时器初值进行微调,先用载入标准初值进行试调,测试一段时间看是偏快还是偏慢,如果偏快则增加定时器初值,如果测试偏慢则减少定时器初值。在前面标准值的基础上进和相应的处理,增加或减少定时器初值,再测试新的时钟是偏快还是偏慢,再进行调节,直到时钟的误差到达一个让人满意的结果为止。
t0_int: push acc
mov th0,#34h
mov tl0,#0E0h ;subbtract 4T time
inc cnt_timer
mov a,cnt_timer
cjne a,#20,exit
mov cnt_timer,#0
mov a,sec
cjne a,#60,exit
mov sec,#0
mov a,min
cjne a,#60,exit
mov min,#0
mov a,hour
cjne a,#24,exit
mov hour,#0
mov min,#0
mov sec,#0
exit: pop b
2.秒刷新程序
编写思路:把液晶显示器地址指针移到第二行第一个位置,依次填入三个空格位,分别把小时变量,分钟变量和秒变量分离为高位和低位,并转化为ASCII 码,送到液晶数据口调用液晶写指令子程序,在液晶屏上显示出来,同时在小时和分钟后插入":"
以符合日常习惯。在主程序中循环查看秒变量有没有变化,有则刷新旧的时间内容,新完毕后返回主界面。
Reflash:mov a,#0c0h
call write_cmd
mov a,#' '
call write_data
mov a,#' '
call write_data
mov a,#' '
call write_data
mov a,hour
call convert
mov a,#':'
call write_data
mov a,min
call convert
mov a,#':'
call write_data
mov a,sec
call convert
mov a,#0c0h
call write_cmd
3.时间设置程序
编写思路:此部分是整个程序中最复杂的部分之一。先开启光标显示并开闪烁;关闭定时器,清空秒变量;把小时变量和分钟变量高低位分离并分别到保护到四个RAM 存储单元中;每按set time 键一次,读取当前液晶显示器地址计数器(Address Counter)的内容,根据光标所在的位置,把地址计数器的内容进行加1 或加2,使光标移到下一个设置位。能根据取到的按键值分别判断该次按键是不是有效,有效则存储到相应的存储单元,否则丢弃。比如当光标在小时高位时,只有按数字键1,2 或确定键才有效,其它键丢弃。当设置完成,按下确定键,把存储小时和分钟变量的四个存储间RAM 单元进行整合并还原到小时变量存储单元和分钟变量存储单元,开启定时器,返回主界面。
set_time: mov a,#0fh
call write_cmd ;cursor on
mov a,hour
mov b,#10
mov hour1,a
mov hour0,b
mov a,min
mov b,#10
mov min1, a
mov min0,b
mov sec,#0
mov a,#0c9h
call write_cmd
mov a,#'0'
call write_data
mov a,,#'0'
call write_data ;set second counter zero
n30: mov a,#0c3h
call write_cmd
settime_loop: call get_key
key_settime2: cjne a,#0fh,key_enter5
call lcd_add
setb acc.7
add1:cjne a,#0c3h,add2
mov a,#0c4h
call write_cmd
jmp settime_loop
add2:cjne a,#0c4h,add3
mov a,#0c6h
call write_cmd
jmp settime_loop
add3: cjne a,#0c6h,n30
mov a,#0c7h
call write_cmd
jmp settime_loop
;----------------------------------
key_enter5: cjne a,#0ch,n31
relay:jmp settime_loop
n31:call lcd_add
setb acc.7
add11:cjne a,#0c3h,add12 ;hour high
subb a,#3
jnc settime_loop
mov hour1,a
add a,#30h
call write_data
jmp settime_loop
add12:cjne a,#0c4h,add13 ;hour low
mov a,hour1
cjne a,#2,n32 ;小时高们不为2 则低位可为1-9
subb a,#4
jnc settime_loop
mov hour0,a
add a,#30h
call write_data
mov a,#0c6h
call write_cmd
jmp settime_loop
n32:mov a,b ;小时高位为2 时低位不高于3
subb a,#10
jnc settime_loop
mov hour0,a
add a,#30h
call write_data
mov a,#0c6h ;显示在分钟设置高位
call write_cmd
jmp settime_loop
add13: cjne a,#0c6h,add14 ;min high
subb a,#6
jnc settime_loop
mov min1,a
add a,#30h
call write_data
jmp relay ;jump to settime_loop but target out of range
add14:cjne a,#0c7h,relay ;jump to settime_loop,target out of range
subb a,#10
jnc relay ;jump to settime_loop but target out of range
mov min0,a
add a,#30h
call write_data
mov a,#0c7h ;let the cursor stay still
call write_cmd
jmp settime_loop
经过将近三个月的努力,我终于完成了大学生涯最具有挑战性的毕业设计。通过本次设计,我得到了一次难得的将理论与实践相结合的机会,让我更加熟悉了Protel99和KeilC51 的使用。我在本次设计中取得了自己人生中的一次重大突破,程序突破六百条,而且我现在对单片机的理解与三个月前相比又上升了一个台阶。由于考虑不周全和本人知识能力的限制,设计方案不可避免地存在着一些不足之处,总结一下大体有以下几个方面:
1.在电路的输出部分加入光电隔离和缓冲放大电路,以提高电路的抗干扰和直接驱动电磁锁的能力。
2.在设计初期,本想加入EEPROM 实现断电记忆密码功能,但考虑到万一忘记密码,会出现锁无法打开的尴尬情况。下一个版本可以取个两全的方法,加入EEPROM 存储器,在程序中设定一个超级密码和一个普通密码,超级密码具有最高权限,可以清除和修改普通密码,这样既实现了断电记忆和忘记密码等问题。
3.扩展其它新的功能。比如在三次错误报警的同时,发送短消息到主人手机提醒等实用功能。
4.从实用和用户使用习惯出发,修改硬件和软件的相关部分。
5.本设计的软件部分是用汇编语言编写的,由于开发速度、软件质量、结构化、可维护性等方面的原因,C 语言渐渐有取代汇编的趋势[15],希望下个版本可以采用C 语言来编写此程序。
[1]苏家健,曹柏荣,汪志锋.单片机原理及应用技术[M].北京:高等教育出版社.
[2]刘建清.从零开始学单片机C 语言[M].北京:国防工业出版社.
[3]孙江宏,李良玉.Protel 99 电路设计与应用[M].北京:机械工业出版社.
[4]童诗白,华成英.模拟电子电路基础[M].第三版.北京:高等教育出版社.
[5]谭博学,苗汇静.集成电路原理与应用[M].电子工业出版社.
[6]邱关源.电路[M].第四版.北京:高等教育出版社.
[7]张友德,赵志英,涂时亮.单片微型机原理、应用与实验[M].第四版.复旦大学出版社.
[8]马全喜.电子元器件与电子实习[M].北京:机械工业出版社.8
[9]陈明荧.8051 单片机课程设计实训教材[M].北京:科学出版社.
[10]阎石.数字电子技术基础[M].第四版.北京:高等教育出版社.
[11]刘文涛.单片机应用开发实例[M].北京:清华大学出版社.2005:5
[12]周立功.增强型80C51 单片机速成与实战[M].北京航空航天大学出版社.
[13]周航慈.单片机应用程序设计技术[M].修订版.北京航空航天大学出版社.
[14]潭浩强.C 语言程序设计[M].第三版.北京:清华大学出版社.
[15]胡伟,季晓衡.单片机C 程序设计及应用实例[M].北京:人民邮电出版社.2004:
参数文献的标识
参考文献类型 专著 论文集 单篇论文 报纸文章 期刊文章
文献类型标识 M C A N J
参考文献类型 学位论文 报告 标准 专利 其它文献
文献类型标识 D R S P Z
总电路原理图:
部分程序:
;=================lcd==================
rs bit p1.4
rw bit p1.5
En bit p1.6
Lcd equ p0
pos_flag bit 20h.0
blank equ 30h
;=================keyboard==================
key_flag bit 20h.1
cnt_loop2 equ 31h
key_cnt equ 32h
key_num equ 33h
scan_sig equ 34h
;=================password=========================
pass_flag bit 20h.2
pass0 equ 40h;40h to 4Eh
pass1 equ 44Fh to 5Dh
lenth0 equ 35h
lenth1 equ 36h
cnt_err equ 37h;errortime
c_alm1 equ 38h;alarm_time control
c_alm2 equ 39h
c_alm3 equ 5sharptimebeep
log_hour equ 25h;logintime
log_min equ 26h
c_blank equ 27h
;===================================================
spk bit p1.7
Led bit p3.4
op1 bit p3.0
;output signal port
op2 bit p3.1
;=================timer=============================
hour equ 3ah
min equ 3bh
sec equ 3ch
sec0 equ 3dh
cnt_timer equ 3eh
hour1 equ 21h
hour0 equ 22h
min1 equ 23h
min0 equ 24h
;=================main==============================
reti org 000bh
jmp t0_int
jmp t1_int
begin:mov sp,#5fh
watch dog timer
call delay
call init_23Ttime
call init_164Ttime
call init_21Ttime
call init_wdt
setb op1;output port initial
;----------------------------------------------------------
main_loop:mov a,#0ch
call write_cursor off
mov dptr,#menu1
clr pos_flag
call print
mov a,#0c0h
call write_cmd
call clear_line
call reflash
;=======================================
loop:call ck_update
call ck_key
invade:call get_key
key_ip1:cjne a,#0ah,key_set1
call input_psw
call compare
jb pass_flag,door_open
jmp main_loop
;--------------------------------------------
本站论文包含(论文,程序,源代码,开题报告,答辩稿)***,欢迎购买。如果未找到您的题目,您还可以联系站长定做。QQ:
计算机毕业论文|毕业设计
专业学科论文
毕业论文和毕业设计辅助
本类论文使用帮助

参考资料

 

随机推荐