《毕业数设计(论文)基于AT89S52单片机的数字密码锁设计.doc》由会员分享,可在线阅读,更多相关《毕业数设计(论文)基于AT89S52单片机的数字密码锁设计.doc(31页珍藏版)》请在三一办公上搜索。
1、摘 要本数字密码锁采用单片机AT89S52为主控芯片,由EEPROM存储密码。硬件部分包括主控制系统、人机交互界面以及输出系统三大部分。主控制系统中主控制芯片使用了AT89S52单片机,该单片机性能优良,能满足一般的普通应用;EEPROM采用AT24C02芯片,掉电后可以存储密码,从而保证了系统的安全性。人机交互通道部分采用了44矩阵键盘输入以及LCD1602标准字符型液晶显示。输出系统部分包括驱动开锁电路和报警电路;其中,在本系统设计中,驱动开锁电路用发光二极管表示,而报警电路则使用蜂鸣器。本系统中使用的AT24C02芯片是一个带有I2C总线接口的EEPROM存储器。I2C总线是一种双向二线
2、制总线,它的结构简单,可靠性和抗干扰性能好。I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。本数字密码锁的功能为:(1)密码位数为8位,可选值为09,从而保证足够的锁体强度;(2)用户可以自行设定和修改密码;(3)防止密码被盗,输入密码错误次数超过3次则报警;(4)友好的人机界面;(5)输入正确的密码后,驱动开锁电路。软件部分应用单片机C语言实现了本设计的全部控制功能。C语言编译方便,易读性好,且移植性方便,能够满足实现本系统的功能要求。在设计过程中,给出了本系统C语言编程的原理和流程
3、图。本数字密码锁系统稳定性好,设计人性化,由于使用单片机控制并有记忆模块,功能齐全可靠,并有很好的扩展性,而且成本低廉,具有良好的发展前景。1 前言随着社会物质财富的日益增长,安全防盗已成为社会问题。而锁自古以来就是把守门户的铁将军,人们对它要求甚高,既要安全可靠地防盗,又要使用方便,这也是制锁者长期以来研制的主题。目前国内,大部分人使用的还是传统的机械锁。然而,眼下假冒伪劣的机械锁泛滥成灾,互开率非常之高。所谓互开率,是各种锁具的一个技术质量标准,也就是1把钥匙能开几把锁的比率。经国家工商局、国家内贸局、中国消协等部门对锁具市场的调查,发现个别产品的互开率居然超标26倍。为何弹子锁的“互开率
4、”会如此之高?据有关专家人士剖析,弹子锁质量好坏主要取决于弹子数量的多少以及弹子的大小,而弹子的多少和大小受一定条件的限制。此外,即使是一把质量过关的机械锁,通过急开锁,甚至可以在不损坏锁的前提下将锁打开。机械锁的这些弊端为一种新型的锁-电子密码锁,提供了发展的空间。电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁,主要特点如下:(1)保密性好,编码量多,远远大于弹子锁,随机开锁成功率
5、几乎为零。(2)密码可变。 用户可以经常更改密码,防止密码被盗,同时也可以避免因人的更替而使锁的密级下降。(3)误码输入保护。当输入密码多次错误时,报警系统自动启动,防止试探密码。从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。键盘式电子密码在键盘上输入,与打电话差不多,因而易于掌握,其突出优点是“密码”是记在被授权人脑子里的数字和字符,既准确又可靠,不会丢失(除了忘记),难以被窃(除非自己泄露)。但是密码不能太简单,太简单了就容易被他人在键盘上试探出来,或者可能被旁观者窥测出来,造成保密性不足。当然,密
6、码又不能太复杂,太复杂了可能自己都糊涂了,或者输入密码操作成功率低,造成使用不便。因此,为了发扬优点、克服弱点,键盘式电子密码也在不断发展中,如“任意设定密码”技术使得被授权人可以根据自己的需要或喜好设定密码,常用常新;而“自动更改密码”技术使得本次输入的密码将自动更改成下次应输入的密码,更改的规律不为他人所知,因而不怕旁观者窥测;独出心裁的“键盘乱序显示”技术使得键盘上的固定键位每次显示出的字符不固定,并且显示的窄小角度只能由操作者正面看得到,因而即使旁观者看见操作动作也难以窥测出密码;“多重密码设定”技术使得单组密码不一定有效,适合多人分权使用,需要输入两组以上的密码才被认可,大大提高了保
7、密性,如果限定输入这些密码的先后顺序或时间区段,则保密性还可提高。在输入密码的过程中,为了限制试探密码的企图,通常输入错误码若干次或若干时间内输入不正确,即“封锁”键盘,不再接受输入操作。总之,尽管新式电子防盗锁层出不穷,但键盘式电子密码防盗锁不仅在市场上居于主流地位,而且,还经常作为其他类型电子防盗锁的辅助输入手段。2 系统的硬件设计2.1 硬件的总体结构和原理 2.1.1 硬件系统的总体结构图硬件系统的总体结构图如图1所示。 AT89S52驱动电路报警电路振荡电路LCD1602显示AT24C0244键盘输入图1 硬件系统的总体结构图2.1.2 硬件系统组成 如图1所示,本系统的硬件部分主要
8、由单片机AT89S52、存储芯片AT24C02、44矩阵键盘、LCD1602、报警电路和驱动电路组成;其中驱动电路用发光二极管LED表示,而报警电路使用蜂鸣器。总的来说,数字密码锁主要由微处理器模块、记忆模块、键盘模块、声光提示模块和显示模块构成。微处理器模块,也就是AT89S52单片机,因为本系统要实现密码检测、密码设定、声光提示等功能,要求微处理器必须能提供很多I/O口,而且由于系统体积限制,很难扩展I/O口和使用外部程序存储器,所以选用AT89S52单片机。记忆模块,AT24C02芯片作为记忆模块的核心部分,作用是存储用户设置的有效开锁密码。由于一片AT24C02拥有256字节存储空间,
9、而本设计中只需要存储8个字节的数据,所以只需要一片AT24C02就已足够了。并且AT24C02是一种非易失性存储器,掉电后数据不会掉失,而且该存储器内数据保存寿命可以保证达到100年以上,功耗低,十分适合本设计使用。声光提示模块,由发光二极管LED和蜂鸣器组成,由单片机控制。发光二极管LED有绿色和红色两种,绿色LED亮表示密码输入正确,驱动开锁电路;相反,红色LED亮就表示输入密码错误。蜂鸣器采用5V驱动蜂鸣器,作为报警电路。当输入密码错误次数超过3次后就发出声音警报。显示模块,考虑到友好的人机界面,采用LCD1602液晶显示。显示模块的作用主要是显示提示信息和输入的密码,以方便用户使用。键
10、盘模块,键盘模块的作用是让用户输入密码和修改密码。考虑到本系统需要用到大量的按键,键盘模块采用44的16矩阵键盘模式。2.1.3 系统的可能性分析系统工作原理分析:使用AT89S51单片机、44矩阵键盘、发光二极管LED、蜂鸣器等。44矩阵键盘的按键分别为0、1、2、3、4、5、6、7、8、9、取消、全取消、确定、修改密码、密码初始化还原、返回。系统启动后,开始时LCD1602显示时钟界面,切换到密码锁输入界面后,LCD1602显示“Enter Password”提示输入密码;输入密码时,LCD1602显示输出为“*”,以保证密码的安全性。当密码输入完毕按下确定键时,对输入密码与设定的密码进行
11、比较,若密码正确则LCD1602显示为“Right!”,并驱动开锁电路,绿色发光二极管LED亮;若密码不正确,LCD1602显示为“Error!”,红色发光二极管LED亮;若连续3次输入不正确,则发出警报声同时锁定键盘。在按下修改密码键时,LCD1602显示“Enter old Key”提示输入旧密码,此时若输入正确的旧密码,则LCD1602显示会有提示输入新密码,在输入新密码后,LCD1602显示会再次提示“再次输入新密码”。若两次输入的新密码不一致,则修改密码失败;一致则成功,并将新密码保存到AT24C02芯片中。在修改密码的过程中,如果一开始输入的旧密码错误LCD1602会显示错误提示,
12、同时系统返回到开始界面。若在“再次输入新密码”的时候输入新密码与前次不一致,则会返回到系统并要求重新输入新密码。修改密码完成后,系统自动储存到AT24C02中,要再次开锁则需要输入正确的新密码。 系统中取消键用于退格,在输入密码时,若输入错误且未按下确定键,按下取消键可以删除刚输入的密码,然后再次输入。 为了防止恶意尝试,系统采用若连续输入3次错误密码则发出报警声,同时锁定键盘。以此提高系统的安全系数,同时也能够保护合法用户的正常使用。若用户忘记了密码,可以按下密码初始化还原键,恢复到最原始的密码。2.2 单片机AT89S51简介AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8
13、K系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU
14、在掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。2.2.1 主要性能 与MCS-51单片机产品兼容 8K字节在系统可编程Flash存储器 1000次擦写周期 全静态操作:0Hz33Hz 三级加密程序存储器 32个可编程I/O口线 三个16位定时器/计数器 八个中断源 全双工UART串行通道 低功耗空闲和掉电模式 掉电后中断可唤醒 看门狗定时器 双数据指针 掉电标识符 2.2.2 引脚功能描述AT89S52的引脚如图2所示,其中各引脚为:图2 AT89S52引脚图VCC: 供电电压。GND: 接地 。 P0口:P0口是一个8位漏极开路的双向I/
15、O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在Flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1口:P1口是一个具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P
16、1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX)。在Flash编程和校验时,P1口接收低8位地址字节。 引脚号第二功能: P1.0T2(定时器/计数器T2的外部计数输入),时钟输出。 P1.1T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)。 P1.5MOSI(在系统编程用)。 P1.6MISO(在系统编程用)。 P1.7SCK(在系统编程用)。 P2口:P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出
17、电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址访问外部数据存储器时,P2口输出P2锁存器的内容。在Flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P3输出缓冲器能驱动4个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。P3口亦作为AT89S52特殊功能(第二功能)使用,在Flash编程和校验时,P3口也接
18、收一些控制信号。 引脚号第二功能: P3.0RXD(串行输入)。P3.1TXD(串行输出)。P3.2INT0(外部中断0)。 P3.3INT0(外部中断0)。P3.4T0(定时器0外部输入)。P3.5T1(定时器1外部输入)。P3.6WR(外部数据存储器写选通)。 P3.7RD(外部数据存储器写选通)。 RST: 复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。看门狗计时完成后,RST脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部
19、程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚(PROG)也用作编程输入脉冲。在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”, ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。PSEN: 外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当AT89S52从外部程序存
20、储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。EA/VPP: 访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在Flash编程期间,EA也接收12伏VPP电压。XTAL1: 振荡器反相放大器和内部时钟发生电路的输入端。XTAL2: 振荡器反相放大器的输出端。2.3 AT24C02简介 AT24C02如图3所示,是一个2K位串行CMOS EEPROM内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗,有一个16字节
21、页写缓冲器,该器件通过I2C总线接口进行操作;有一个专门的写保护功能。2.3.1 功能描述AT24C02支持I2C总线数据传送协议,I2C总线协议规定任何将数据传送到总线的器件作为发送器,任何从总线接收数据的器件为接收器。数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式通过器件地址输入端A0、A1和A2可以实现将最多8个AT24C02器件连接到总线上。2.3.2 管脚描述AT24C02的管脚如图3所示,其中各管脚为:SCL 串行时钟AT24C02串行时钟输入管脚,用于产生器件所有数据发送或接收的时钟,这是一
22、个输入管脚。SDA 串行数据/地址AT24C02双向串行数据/地址管脚,用于器件所有数据的发送或接收。SDA是一个开漏输出管脚。A0 A1 A2 器件地址输入端这些输入脚用于多个器件级联时设置器件地址。当这些脚悬空时默认值为0。使用AT24C02时最大可级联8个器件.如果只有一个AT24C02被总线寻址,这三个地址输入脚A0、A1、A2可悬空或连接到Vss。 WP 写保护如果WP管脚连接到Vcc,所有的内容都被写保护只能读;当WP管脚连接到Vss 或悬空,允许器件进行正常的读/写操作。图3 AT24C02引脚图2.3.3 I2C总线协议I2C总线是一种双向二线制总线,它的结构简单,可靠性和抗干
23、扰性能好。目前很多公司都推出了基于I2C总线的外围器件,AT24C02芯片就是一个带有I2C总线接口的EEPROM存储器,I2C总线结构很简单,只有两条线,包括一条数据线(SDA)和一条串行时钟线(SCL)。具有I2C接口的器件可以通过这两根线接到总线上,进行相互之间的信息传递。连接到总线的器件具有不同的地址,CPU根据不同的地址进行识别,从而实现对硬件系统简单灵活的控制。I2C总线协议定义如下:(1)只有在总线空闲时才允许启动数据传送。(2)在数据传送过程中当时钟线为高电平时,数据线必须保持稳定状态不允许有跳变;时钟线为高电平时数据线的任何电平变化将被看作总线的起始或停止信号。起始信号时钟线
24、保持高电平期间数据线电平从高到低的跳变作为I2C总线的起始信号。停止信号时钟线保持高电平期间数据线电平从低到高的跳变作为作为I2C总线的停止信号。2.4 LCD1602介绍液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。目前液晶显示模块已经是单片机应用设计中最常用的信息显示器件。其中LCD1602液晶显示模块是常用的选择,它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。考虑到本系统设计中友好的人机界面,相对采用多个LED作为显示模块,LCD1602更合适。2.4.1 引脚描述1602
25、采用标准的16脚接口,如图4所示,其中: 第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时 对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命
26、令。第714脚:D0D7为8位双向数据线。第15脚:LEDA为背光接5V正电源。第16脚:LEDK为背光地电源。图4 LCD1602管脚图2.4.2 LCDI602控制指令 如表1所示,LCD1602的读写操作、屏幕和光标的操作都是通过指令编程来实现的。指令 1:清显示。指令码01H,光标复位到地址00H位置。 指令 2:光标复位。光标返回到地址00H。指令 3:光标和显示模式设置,I/D:光标移动方向,高电平右移,低电平左移 ;S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。指令 4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的
27、开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁 指令5:光标或显示移位。S/C:高电平时移动显示的文字,低电平时移动光标 。指令 6: 功能设置命令 。DL:高电平时为4位总线,低电平时为8位总线; N:低电平时为单行显示,高电平时双行显示;F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。 指令 7:字符发生器RAM地址设置 。指令 8:DDRAM地址设置 。指令9:读忙信号和光标地址。BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据。 指令11:读数据。表1 LCD1602的控制
28、指令表指 令RS R/W D7 D6 D5 D4 D3 D2 D1 D01清显示2光标返回3置输入模式4显示开/关控制5光标或字符移位6置功能7置字符发生存储器地址8置数据存储器地址9读忙标志或地址10写数CGRAM或DDRAM11从CGRAM或DDRAM读数0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 1 *0 0 0 0 0 0 0 1 I/D S0 0 0 0 0 0 1 D C B0 0 0 0 0 1 S/C R/L * *0 0 0 0 1 DL N F * *0 0 0 1 字符发生存储器地址0 0 1 显示数据存储器地址0 1 BF 计数器地址1 0 要
29、写的数1 1 读出的数据2.4.3 LCDI602读写控制时序LCD1602的读写控制时序如表2所示,使用LCD1602显示时要严格按照时序要求,否则LCD1602显示会出现问题。表2 LCD1602的读写控制时序表RS R/W E 功能0 0 下降沿 写指令代码0 1 高电平 读忙标志和AC码1 0 下降沿 写数据1 1 高电平 读数据2.5 44矩阵键盘如图5所示,本系统采用44矩阵键盘。当LCD1602为时钟界面显示时,S2为时设置键,S3为分设置键,S4为切换键;当切换到密码锁界面显示时,16个按键分为输入数字键和功能键。其中,S2、S6、S7、S8、S10、S11、S12、S14、S
30、15、S16依次表示数字09,S3为取消键,S4为全取消键,S5为确定键,S9为密码初始化还原键,S13为返回键,S17为密码修改键。图5 44矩阵键盘2.6 复位电路为确保系统中电路稳定可靠工作,复位电路是必不可少的一部分,复位电路的第一功能是上电复位。如图6所示,时钟电路工作后,在REST管脚上加两个机器周期的高电平,芯片内部开始进行初始复位。图6 复位电路2.7 振荡电路图7所示为单片机晶体振荡电路。在本系统设计中晶振选择频率为12MHz,其中两个电容叫晶振的负载电容,分别接在晶振的两个脚上和对地,一般在几十皮法,它会影响到晶振的谐振频率和输出幅度。多数情况下电容取值在20pF-30pF
31、左右,在本系统中取电容为30pF。图7 振荡电路2.8 发光二极管LED电路图8所示为发光二极管LED电路,开始时发光二极管LED1、LED2连接的单片机I/O口均为高电平。当输入密码正确后,LED1连接的I/O口由高电平变为低电平,绿色的发光二极管LED点亮,表示驱动了开锁电路;当输入密码错误时,LED2连接的I/O口由高电平变为低电平,红色的发光二极管LED点亮。其中R10、R11为发光二极管LED的保护电阻,阻值均为1K。图8 发光二极管LED电路2.9 报警电路 本系统中的报警电路采用蜂鸣器,如图9所示。当连续3次输入错误密码后,就会驱动报警电路,蜂鸣器不停地响,以示警报。其中,R5阻
32、值为1k,R6阻值为100。三极管为8550。8550是PNP型中功率高频三极管,最大耗散功率为700mW,在此电路中起功率放大作用。图9 报警电路2.10 电源输入电路电源输入电路如图10所示,输入直流电源后,经过三端稳压集成电路7805,使电压输出稳压在5V左右。图10 电源输入电路用7805三端稳压IC来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路。7805只有三条引脚输出,分别是输入端、接地端和输出端,如图11所示。使用7805要注意最高输入电压是35V左右。图11 7805引脚图2.11 使用到的元器件列表表3所示为硬件设计中使用到的元器件。表3 元器件列
33、表元器件 规格/型号 数量单片机 AT89S52 1三极管 8550 1EEPROM AT24C02 1稳压管 7805 1液晶显示器 LCD1602 1晶振 12M 1电阻 10K/1K/100 4/6/1排阻 10K 1电容 104/30Pf4.7uF 3/2/1发光二极管 红色/绿色/黄色 1/1/1蜂鸣器 13 软件程序设计目前,对单片机的编程主要采用汇编跟C语言。汇编语言有执行效率高、速度快、与硬件结合紧密等特点。尤其在进行I/O端口管理时,使用汇编语言有快捷、直观的优点。但是使用汇编语言相对于使用高级语言编程难度要大一些,且程序可读性低,开放性差,从系统开发时间来看,效率不是很高。
34、 C语言是一种结构化语言,可产生紧凑代码。C语言可以用许多机器级函数直接控制操作8051硬件。与汇编语言相比,C语言有如下的优点:不要求了解单片机的指令系统,仅要求对8051的存储结构有初步了解;寄存器分配,不同存储器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,可分为不同的函数,这种方式可使程序结构化;具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;关键字及运算符可用近似人的思维方式使用;编程及程序调试时间显著缩短,从而提高效率;提供的库包含许多标准子程序,具有较强的数据处理能力;已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。当然,采用混编模式,就
35、能结合两者的优点。本系统程序使用C语言编写。使用C语言编程,目的是实现数字密码锁的所有功能。C语言编程主要实现显示功能,进行密码输入,对密码进行比较,判断密码对错和修改密码等功能。3.1 编译器Keil uVision2简介Keil uVision2 是德国Keil公司开发的一个单片机C语言编译器,可以用它来编译C源码,汇编编写的汇编源程序,连接和重定位目标文件和库文件,创建HEX文件,调试目标程序。和其他的C语言编译器相比,Keil uVision2有着很多的优点,例如可产生最少的代码、支持浮点和长整数、支持重入和递归。在Keil uVision2的仿真功能中,有两种仿真模式:软件仿真模式和
36、目标板仿真模式,在软件仿真模式下我们不需要任何8051单片机硬件即可完成用户程序仿真调试,极大地提高了用户程序开发的效率。在目标板调试方式下,用户可以将程序下载到自己的8051单片机板上,利用8051的串口与PC机进行通讯来实现程序的实时在线仿真。3.2 软件总设计流程图 软件总设计流程图如图12所示。开始LCD初始化时钟显示检测命令键S2S3设置时间S4密码锁界面检测命令键Return键输入密码N密码正确Y开锁N红色LED亮N+1N3报警YN修改密码修改密码键图12 软件设计流程图3.3 具体功能软件实现3.3.1 44矩阵键盘扫描程序当键盘中按键数量较多时,为了减少对I/O口的占用,通常将
37、按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图13所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU通过检测行或列线上的电平变化可以确定哪个按键被按下。图13 44矩阵键盘图13为一个44行列结构,可以构成16个键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O口线。矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法
38、,反复查询按键的状态,因此会大量占用MCU的时间,所以较好的方式是采用状态机的方法来设计,尽量减少键盘查询过程对MCU的占用时间。图13中,KEY1、KEY2、KEY3、KEY4为4根列线,作为键盘的输入口(工作于输入方式)。KEY5、KEY6、KEY7、KEY8为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。 行扫描法也称为逐行扫描查询法,其按键识别的过程如下:(1)将全部行线KEY5KEY8置低电平输出,然后读KEY1KEY4四根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。(2)在确认有键
39、按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依次将行线置为低电平,并检测列线的输入(扫描),进而确认具体的按键位置。如当KEY5输出低电平时(KEY5=0、KEY6=1、KEY7=1、KEY8=1),测到KEY2的输入为低电平(KEY=1、KEY2=0、KEY3=1、KEY4=1),则可确认按键S3处于闭合状态。通过以上分析可以看出,MCU对矩阵键盘的按键识别,是采用扫描方式控制行线的输出和检测列线输入的信号相配合实现的。(3)矩阵按键的识别仅仅是确认和定位了行和列的交叉点上的按键,接下来还要考虑键盘的编码,即对各个按键进行编号。在软件中常通过计算的方法或查表的方法对按键进行具体的定
40、义和编号。具体扫描程序如下所示: uchar keyscan() uchar X,Y,temp; P3=0xf0; if (P3!=0xf0) delay10ms(); if (P3!=0xf0) X=P3; P3=0x0f; Y=P3; temp=X|Y; while(P3!=0x0f) ; return temp;3.3.2 显示程序本系统使用LCD1602实现显示,只要参照LCD1602的使用手册进行初始化和程序编写就可以显示,即在程序编写中添加LCD1602的驱动程序。这里的驱动程序主要包括:初始化函数、设置显示坐标、写字符函数及写字符串函数。在时钟界面时显示时间的运行,在密码锁界面时
41、主要显示提示信息和输入的密码,当然,当输入密码数字时,输出不是显示数字,而是用“*”显示代替。LCD1602的部分读写控制时序程序如下所示:(1)写命令函数:向寄存器写入控制字参数:command-控制字void LCD_en-command (unsigned char command)LCD delay(); /延时一段时间LCD 1602_RW=LOW; /写命令时,R/W为低电平LCD1602_ RS=LOW; /写入指令。RS为低电平LCD1602_EN=HIGH; /置高使能线 LCDIO=command; / 接收命令字并送到数据总线上LCD1602_EN=LOW: /在使能线的
42、下降沿写入数据(2)写数据函数:向寄存器写入数据参数:dat-待要显示数据void LCD_en-dat(unsigned char dat)LCDdelay(); /延时一段时间LCD1602_RW=LOW; /写指令时,R/W为低电平LCD1602_RS=LOW: /写入数据,RS为高电平LCD1602_EN=HIGH;/置高使能线LCDIO=dat; / 接收数据并送到数据总线上LCD1602_EN=LOW;/在使能线的下降沿写入数据3.3.3 时钟运行子程序 当系统开始后,LCD1602初始化,然后显示时钟界面,程序在T0中断,进入时钟运行子程序,其流程图如图14所示。T0中断入口 显
43、示时钟数据秒计数加1=500?秒计数0SECOND加1=60?NYSECOND=0,并MINITE加1=60?NYMINITE=0,并HOUR加1=24?NYHOUR=0显示数据处理中断返回图14 时钟运行流程图3.3.4 时钟时、分修改子程序在时钟运行界面是可以修改时钟的时和分,如图15所示,S2为时修改的按键,S3为分的修改按键.如按一下时、分加1。当分为59的时候,再按一下S3,分变为00,而当时为23的时候,再按一下S2,时变为00.其流程图如图15所示。N 分按键识别成功?YMINITE加1N=60?YMINITE=0显示数据处理N 时按键识别成功?YHOUR加1N=24?YHOUR=0显示数据处理图15 时钟时、分修改流程图3.3.5 掉电存储服务程序当比较密码的时候,需要读AT24C02程序,将存储在芯片内的数据读到RAM中,然后和输入的密码相比较。当修改密码的时候,需要把输入的密码保存到AT24C02中。AT24C02的时序程序如下所示。当AT24C02的SCL引脚为高电平期间SDA引脚上产生的电平变化则表示I2C总线工作的“开始”或“停止”两种状态:当SCL为高电平,SDA由高电平转向低电平时表示“开始” 状态,而由低电平转向高电平时表示“结束” 状态。编