毕业设计
基于C语言STC89C52单片机电子
密码锁设计与仿真
姓 名 系 别、 专 业 物电系 导 师 姓 名、职 称 讲师 完 成 时 间 2010-5-10
目
录
摘 要 ...................................................... I ABSTRACT ..................................................... II 1 概述 ........................................................ 1
1.1电子密码锁的研究现状及前景 ......................... 1 1.2电子密码锁的基本构件及优点 ......................... 1
2 系统硬件构成 ................................................ 2
2.1硬件电路主要芯片(MCS-52) ........................... 2 2.2 1602液晶显示 ...................................... 4
3 功能分析 .................................................... 6
3.1 中断 .............................................. 6 3.2键盘 ............................................... 9 3.3I2C总线 ........................................... 11
4 程序分析 ................................................... 13 5 系统电路与Proteus仿真 ..................................... 25
5.1Proteus简介 ....................................... 25 5.2仿真步骤 .......................................... 25 5.3系统仿真电路(如下图) ............................ 25 5.4 仿真结果 ......................................... 26
6结论 ........................................................ 26 参考文献 ..................................................... 27 致 谢 ..................................................... 27
摘 要
密码锁是现代生活中经常用到的工具之一,常用于各类保险柜、房门、防盗门等。电子密码锁, 克服了传统的机械式密码锁密码量少、安全性能差的缺点。特别是使用微处理器制作的智能电子密码锁, 它除具有电子密码锁的功能外, 还可引入了智能化管理功能, 从而使密码锁具有更高的安全性和可靠性。
本文介绍如何使用C语言编写8051单片机程序,制作智能电子密码锁。系统由矩阵键盘、单片机系统、lcd显示器和报警系统组成。该智能电子密码锁主要可由使用者自己设定一个6位数的密码, 将密码锁上锁。只有在按“PUT IN CODES”码后12秒内输入和设定的密码相同时, 才能将锁打开,否则报警,报警后只有通过使用钥匙才能打开并停止报警。为了保证密码的更改方便与永久保存, 使用了存储芯片,这样, 在断电条件下, 其内部密码数据则可保持100年不丢失。
本程序已经在proteus仿真以及开发板用行成功。
关键词:电子密码锁;单片机;矩阵键盘;lcd显示器;报警
I
ABSTRACT
Code-Lock, one of the tools used in various types of insurance to resist, doors, security doors, is already extensively used in modern life.The electronic lock replacing the traditional mechanical locks overcome the limited password number and the poor security of the mechanical lock. Particularly, the intelligent electronic lock produced by microprocessors, which, in addition with an electronic code lock function, but also introducing a intelligent management feature to let the code-lock possess a higher security and reliability. This article describes how to use the C language program 8051 to make the intelligent electronic code-lock. The System consists of matrix keyboard, SCM system, lcd display and alarm system components. The intelligent electronic lock provide the user to set a six-digit password himself and let the password lock locked. Only in accordance with \"PUT IN CODES\" yards input the right code within 12 seconds you can open the lock, or it will alarm, after which you can open the lock by key only and in the same time it stopping alarming. In order to ensure the convenience changing and permanent preseving of the code we use the memory chips, so that when we are under the condition of interruption of power supply, its internal password data can be maintained without loss of 100 years. This program has already been successful used in proteus-simulation, and development boards. Key words: Electronic Locks; Microcomputer; Matrix Keyboard; Lcd Monitor; Alarm
II
1 概述
1.1电子密码锁的研究现状及前景
电子密码锁是现代生活中常用的加密工具。它不克服了机械式密码锁密码量少、安全性能差的缺点,尤其是微控制器的智能电子密码锁,不仅具有电子密码锁的功能,还可引入智能化管理功能,从而使密码锁具有更高的安全性和可靠性。
当今的电子密码锁常使用arm[1]和单片机控制。单片机相对arm实现较为简单,功能较为完善,因此使用单片机控制较多。用单片机控制的密码锁常使用汇编语言编[2]写程序,显示器多数用数码管[3]。而本文所介绍的电子密码锁使用移植性及可读性强的高级语言C语言编写,便于修改和增减功能;同时采用显示清楚,功率消耗小而且寿命长的1602液晶显示器,显示更加直观,使用更加方便。从经济实用的角度出发, 采用STC89 C52[4]单片机设计一种具有密码设置、报警功能和防止多次试探密码的电子密码锁所需成本很低。
1.2电子密码锁的基本构件及优点
1.2.1 STC89C52的选择
STC89C52[5] 是一种低功耗、高性能CMOS8位微控制器,具有8K可编程Flash存储器。使用高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在线系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具体特点如下:
一、加密性强,很难解密或破解,解密费用很高、国内能解密的人少. 二、超强抗干扰: 三、超低功耗:
四、在系统可编程,无需编程器,可远程升级 。
五、STC单片机直接替换ATMEL,PHILIPS,Winbond等产品 。 1.2.2液晶显示模块的选择
液晶是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。
具有功耗低,显示信息大,寿命长和抗干扰能力强等优点,在低功耗的单片机系
http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您1 !
统中得到大量使用。液晶显示模块和键盘输入模块作为便携式仪表的通用器件,在单片机系统的开发过程中也可以作为常用的程序和电路模块进行整体设计。液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就显示黑色,这样即可显示出图形。
2 系统硬件构成
2.1硬件电路主要芯片(MCS-52)
2.1.1 MCS-51的引脚图
P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST/VpRXDP3.0TXDP3.1INT0P3.2INT1P3.3T0T1WRRD12345678910111213141516171819204039383736353433323130292827262524232221VccP0.0P0.1P0.2P1.3P0.4P0.5P0.6P0.7EA/VppALE/PROGPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0P3.4P3.5P3.6P3.7XTAL2XTAL1VssMCS-51双列直插方式引脚 2.1.2电源及时钟引脚 1、电源引脚
电源引脚接入单片机的工作电源。 (1) Vcc(40脚):接+5V电源; (2) Vss(20脚):接地。 2、时钟引脚
http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您2 !
两个时钟引脚XTAL1、XTLA2外接晶体与片内的反向放大器构成了一个晶振器,它为单片机提供了时钟控制信号。2个时钟引脚也可外接晶体振荡器。
(1) XTAL1:接外部晶振一个引脚。该引脚是内部反向放大器的输入端,这个反向放大器构成了片内振荡器。
(2) XTAL2:接外部晶振另一端,该引脚是内部反向放大器的输出端。采用外部时钟振荡器时,该引脚接收时钟振荡器的信号,即把此信号直接接到内部时钟发生器的输入端。 2.1.3 控制引脚 1、RST/VPD
RST该引脚是复位信号输入端,高电平有效。当单片机运行时,若此引脚上的电压持续保持两个机器周期(24个时钟振荡周期)的高电平,单片机就会复位。当单片机正常工作时候应该保持为0.5V低电平。
VPD为第9引脚第二功能,为备用电源的输入端。当主电源发生故障的时候,降低到某一规定的低电平时,将+5V电源自动接入RST端,为内部RAM提供备用电源,这样可以保证RAM的数据不会丢失,从而当单片机再次开机的时候能继续正常运行。 2、ALE/PROG ALE为地址所存允许信号,当单片机正常工作后,ALE引脚不断地输出正脉冲信号。当访问单片机外部存储时,ALE输出信号的负跳沿用作8位地址的锁存信号。即使不访问外部锁存器,ALE仍有正脉冲信号输出,此频率为时钟振荡器频率的1/6.但是,每当访问外部数据存储器时,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲。因此,严格来说,用户不宜用ALE作精细的时钟或定时钟或定时信号。ALE端可以驱动8个TTL负载。如果想判断单片机芯片的好坏,可以用示波器查看ALE端是否有正脉冲输出。若有正脉冲输出,那么单片机基本是正常的。 PROG为30脚第二功能。在对片内EPROM型单片机编程写入时,此引脚作为编程脉冲输入端。 3、PSEN 程序存储器允许输出控制端。在单片机访问外部程序存储器时,此引脚输出的负脉冲作为读外部程序存储器的选通信号。此引脚接外部程序存储器的OE端。PSEN可以驱动8个LS型TTL负载。 如果检查一个MCS-51单片机应用系统上电后,CPU能否正常到外部程序存储器读取指令,也可以用示波器查PSEN端有无脉冲输出,如果有脉冲输出,那么说明单片机应用系统基本正常工作。 4、EA/VPP http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您3 !
EA、VPP为内外程序存储器选择控制端。当EA端为高电平时,单片机访问内部程序存储器,但在PC(程序计数器)值超过4KB,将自动转向执行外部程序存储器内的程序。当保持低电平时,则只访问外部程序存储器,不论是否有外部程序存储器。 2.1.4 I/O口引脚
(1)P0口:双向8位三态I/O口,此口为地址总线(低8位)及数据总线分时复用口,可驱动8个TTL负载。
(2) P1口:8位准双向I/O口,可驱动4个TTL负载。
(3) P2口:8位准双向I/O口,与地址总线(高8位)复用,可以驱动4个TTL负载 (4) P3口:8位准双向I/O口,双功能复用口,可以驱动4个TTL负载。 P1口、P2口、P3口线片内均有固定的上拉电阻,当这3个准双向I/O口作输入口使用时,要向该口先写“1”,另外准双向I/O口无高阻态。P0口线内无固定的上拉电阻,有两个MOS管串接而成,即可以开漏输出,又可以处于高阻态的“浮空”状态,称之为双向三态I/O口。
2.2 1602液晶显示
液晶[6]是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄型显示器上。它具有体积小、功耗低、显示操作简单等特点。 2.2.1 1602接口信号说明如下图
编号符号VSSVDDVORSR/WED0D1引脚说明电源地电源正极液晶显示对比度调节数据/命令选择端读写选择端使能信号端数据口数据口编号符号D2D3D4D5D6D7BLABLK引脚说明数据口数据口数据口数据口数据口数据口背光灯电源正极背光灯电源负极
http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您4 !
2.2.2 主要技术参数:
显示容量芯片工作电压工作电流模块最佳工作电压字符尺寸16×2字节4.5-5.5V2.0MA 5.0V 5.V2.95×4.35mm 2.2.3基本操作时序
读状态 输入: RS=L,R/W=H,E=H 输出:D0~D7=状态字 读数据 输入: RS=H,R/W=H,E=H 输出:无
写指令 输入: RS=L,R/W=L,E=高脉冲 输出:D0~D7=数据 写数据 输入: RS=H,R/W=L,E=高脉冲 输出:无 2.2.4 RAM地址映射图
控制器内部带有80B的RAM缓存区,对应关系如下图
LCD16字*2行000102030405060708090A0B0C0D0E0F10404142434445464748494A4B4C4D4E4F50............2767 2.2.5.状态字说明
STA7D7STA6D6STA5D5STA4D4STA3D3STA2D2STA1D1STA0D0STA0-STA6STA72.2.6.数据指针设置 当前地址指针的数值1-禁止读/写操作使能0-允许 控制器内部设有一个数据地址指针,用户可以通过让它们访问内部80B的RAM,如下图:
指令码80H+地址码(0-27H,40-67H)功能设置数据地址指针 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您5 !
2.2.7 其他设置(如下图)
指令码01H02H功能显示清屏:1.数据指针清02.所有显示清0显示回车:数据指针清0 2.2.8 初始化设置 (1)显示模式设置
指令码00111000功能设置16*2显示,5*7点阵,8位数据接口 (2)显示/关及光标设置
指令码00001DCB功能D=1开显示;D=0关显示C=1显示光标;C=0不显示光标B=1光标闪烁;B=0光标不显示N=1当读或写一个字符后地址指针加1且光标加1N=0当读或写一个字符后地址指针减1且光标减1S=1当写一个字符时,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果S=0当写一个字符时,整屏显示不移动000001NS00000000000011110011010100000000光标左移光标右移整屏左移,同时光标跟随移动整屏右移,同时光标跟随移动
3 功能分析
3.1 中断
51单片机内部一共有5个中断[7]源,也就是说,有5种情况发生时,会使单片机去处理中断程序。对于单片机来说,中断时CPU在处理某一件A时,发生了另外一件事B,请求CPU迅速处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事情B(中断服务);待CPU处理某一件事B完毕后,再回到原来事情A被中断的地方继续处理事情A(中断返回),这一过程称为中断,其流程图如下图。
主程序 中断响应 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您6 !
中断请求 断点 继续 执行程序 执行 中断 处理 程序 中断返回 单片机中断过程 3.1.1 52单片机6个中断源
INT0—外部中断0,有P3.2端口引入,低电平或下降沿引起。 INT1—外部中断1,有P3.3端口引入,低电平或下降沿引起。 T0—定时器、计数器0中断,有T0计数满后回零引起。 T1—定时器、计数器1中断,有T1计数满后回零引起。 T2—定时器、计数器2中断,有T2计数满后回零引起。
TI/RI—串行口中断,串行端口完成一帧字节符号发送、接收后引起。
中断源INT0-外部中断0T0-定时器/计数器0中断默认中断级别最高第一 第二第三第四第五序号(c语言)入口地址(汇编)012345003H00BH0013H001BH0023H002BHINT1-外部中断一T1-定时器/计数器1中断T1/R1-串行口中断T2-定时器/计数器中断 3.1.2 中断允许寄存器IE
中断允许寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是AS8H—AFH,该寄存器可以进行位寻址,即可以对该寄存器的每一位进行单独操作。单片机复位时全部清零,各位定义见下表:
位序号位符号位地址D7EAAFHD6----D5ET2ADHD4ESACHD3ET1ABHD2EX1AAHD1ET0A9HD0EX0A8H EA-全局中断允许位;
EA=1,打开全局中断,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您7 !
3.1.3中断优先级寄存器IP
中断优先级寄存器在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高
位)分别是B8H—BFH,IP用来设定各个中断源属于两级中断的那一级。单片机复位时IP自动清零。各位定义如下表:
位序号位符号位地址D7----D6----D5----D4PSBCHD3PT1BBHD2PX1BAHD1PT0B9HD0PX0B8H (--为无效位)
3.1.4定时器/计数器工作方式寄存器TMOD
定时器/计数器工作方式寄存器在特殊功能寄存器中,字节地址为89H,不能位寻址,TOMD用来确定定时器的工作方式及其功能选择。单片机复位时TMOD全部被清零。各位定义如下表:
位序号位符号D7GATED6C/T定时器0D5M1D4M0D3GATED2C/TD1M1定时器1D0M0 TOMD的高四位用于设置定时器1,低四位用于设置定时器0,对应四位的含义如下: GATE-门控制位。
GATE=0,定时器/计时器启动与停止仅受TCON寄存器TRX控制。
GATE=1,定时器/计时器启动与停止受TCON寄存器TRX和外部中断共同控制。
CT-定时器模式和计数器模式选择位。 CT=1,为计数模式;CT=0,为定时模式。 M1M0-工作方式如下图:
M10011M00101工作方式方式0,为13位定时/计数器方式1,为16位定时/计数器方式2,8位初值自动重装的8位定时器/计数器方式3,仅适合于T0,分成两个8位计数器,T1停止计数 定时器/计数器控制寄存器TCOND如下图:
位序号位符号位地址D7TF18FHD6TR18EHD5TF08DHD4TR08CHD3IE18BHD2IT18AHD1IE089HD0IT088H http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您8 !
3.1.5计算定时器初值:
定时器一旦启动,它便在原来的数值上开始叫1计数,若在程序开始时,没有设置TH0和TL0,它们的默认值为0,假设时钟频率为12Mz,12个时钟周期为一个机器周期,那么此时机器周期就是1毫秒,计满TH0和TL0就需要2161个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需要65536毫秒,约等于65.5ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上计50000个数后,定时器溢出,此时刚好就是50ms中断一次,当初值需定时1s时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控制定时时间了。
3.1.6中断服务程序的写法
void函数名()interrupt中断号using工作组 {
中断服务程序内容 }
通常定时器初始化过程如下:
1对TOMD赋值,以确定T0和T1的工作方式。 ○2计算初值,并将初值写入TH0、TL0或TH1、HL1。 ○3中断方式时,对IE赋值,开放中断。 ○4是TR0或TR1位置,启动定时器/计数器定时/或计数。 ○
3.2键盘
键盘[8]分为编码键盘和非编码键盘。键盘上闭合的识别有专门的硬件编码器实现,生产编码号或键值的成为编码键盘。靠软件编写程序识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的最多的是非编码键盘。 3.2.1键盘输入的特点
键盘实质是一组按键开关的集合。通常,键盘所用开关为机械弹性开关,均利用了
机械触点的合、断作用。一个电压信号通过机械触点的断开、闭合过程,其行线电压输出波形图,如下:
断开闭合t0t1t2t3断开t4 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您9 !
图中t1和t3分别为按键的闭合和断开过程的抖动时间(呈现一串负脉冲),抖动
的时间长短与按键的机械特性有关,一般为5-10ms,t2为稳定的闭合期,其时间由按键的动作所决定,一般为十分之一秒到几秒,t0、t4为断开期。 3.2.2 按键的确定
按键的闭合与否,反映在行线输出电压上就是呈现出高电平或低电平,如果为高电
平表示断开,低电平表示按键的闭合,所以通过对行线电平的高低状态的检测,便可确定按键是否按下。但是为了确保CPU对一次按键按下只识别一次,必须消除抖动。 3.2.3如何消除抖动
消除抖动分为硬件消抖和软件消抖,一般的情况下采用软件消抖。在第一次检测到
有按键按下时,执行延时程序,延时10ms,再次确定该键是否仍保持闭合状态,如果保持闭合状态确定的确有键按下,从而消除了抖动。 3.2.4矩阵键盘工作原理
+5V048121 159132261014337111541234 按键设置在行、列线点上,行、列线分别连接到按键开关的两端。行线通过上拉电阻接到+5V电源上。当无按键按下时,行线处于高电平状态,当有键按下时,行线电平状态将由与此线相连的列线电平决定。列线电平若为低电平,则行线电平为低;列线电平为高,则行线电平也为高。这是识别矩阵键盘是否按下关键。由于矩阵键盘中的行、列线为多键共用,各按键均影响该键所在的行和列的电平。因此各按键彼此将互相发生影响,所以必须将行、列线信号线配合起来并作适当处理,这样才能确定闭合键的具体位置。
10 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您!
3.2.5按键的识别
如上矩阵按键图。当3好键被按下时,与此相连的行线电平将有与此键相连的列线
电平决定,而行线电平在无按键按下时处于高电平状态。如果所有的列线都处于高电平状态,那么按键是否按下,不会引起行线电平状态的变化,行线始终为高电平。所以,让所有的列线处于高电平是没有办法识别按键的。现在反过来,让所有的列线处于低电平,很明显,按键所在行电平将被接成低电平,根据此行电平的变化,便能判断此行一定有键按下。但不能确定按下的键是3,因为,如果是将2、1或0之一按下,也会产生相同的结果。所以,让所有列线处于低电平只能得出某行有键被按下的结论。为了进一步判断到底是哪一列的键被按下,可在某一时刻只让一条列线处于低电平,而其余所有列线都处于高电平状态。当第一列为低电平,其余的各列都为高电平时,因为是3键被按下,所以第1行仍处于高电平状态;当第2列为低电平,其余的各列为高电平时,同样发现第1行仍处于高电平状态。直到让第4列为低电平时因为是3号键被按下,所以第1行的电平将由高电平转换到第4列所处的低电平,因此,确定第1行第4列交I2叉点处的键即3号键被按下。
3.3IC总线
3.3.1IC总线介绍
传统的单片机外围电路扩展通常使用并行方式,即单片机与外围电路器件用8根数据线进行数据交换,再加上一些地址、控制线,占用了单片机大量的引脚,这往往不能接受。I2C总线[9]是一种用于IC之间连接的总线。它通过SDA和SCL两根线与连接到总线上的器件之间传送信息。总线上每个节点都有一个固定的节点地址,根据地址识别每个器件,可以方便地构成多机系统和外围电路的扩展。它的传输速率为100kb/ s总线的驱动能力为400pF. 3.3.2 IC总线工作原理
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,222只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。
11 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您!
SCLSDA起始信号S终止信号P
SCLSDA要求数据稳定允许数据变化要求数据稳定 起始和终止信号 :SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
数据传送格式:每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。
SCL(主机)SDA(主机)SDA非应答(主机)应答起始信号S
3.3.3 EEPROM AT24C02 1.AT24C02引脚功能
A0A1A2GND12348765VccWPSCLSDA AT24C02引脚
各引脚功能:
1,2,3(A0、A1、A2)——可编程地址输入端。 12 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您!
4(GND)——电源地。
5(SDA)——串行数据输入/输出端。 6(SCL)——串行时钟输入端。
7(WP)——写保护输入端,用于硬件数据保护。该引脚为低电平时,可以对整个存储器进行正常的读和写操作;当为高电平时,存储器只有读操作功能,不能对改存储器进行写操作。
8(Vcc)——电源正端。 2、存储结构与寻址 AT24C02的存储器容量为2KB,内部分为32页,每页8B,操作时有两种寻址方式:芯片寻址和片内子地址寻址。
(1) 芯片寻址。AT24C02的芯片地址为1010,其他的控制字格式为
1010A2A1A0R/W。其中A2,A1,A0为可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码。R/W为芯片读写控制位,该位为0,表示对芯片进行写操作;该位为1表示对芯片进行读操作。 (2) 片内子地址寻址。芯片寻址可对内部256B中的任意一个进行读写操作。
4 程序分析
#include uchar a0,a1,a2,a3,a4,a5,b0,b1,b2,b3,b4,b5; char count1=0; uint numb,i; //定义 uchar number, a,j,m,k,time=0; /*******************函数声明**************************/ void delay(uint); void write_dat(uchar); uchar keyscan(void); int consure(); int besure(); /**************eeprom函数声明************************/ void delay1(); void start(); void stop(); void respons() ; void init(); void write_byte(uchar date); uchar read_byte(); uchar read_add(uchar address); void write_add(uchar address,uchar date); void delay2(uchar x); /********************主函数*************************/ void main() { uint key,ket,kot; int i; init(); loop://返回位置 /*******************eeprom读取************************/ b0=read_add(1);delay2(100);b1=read_add(11);delay2(100); b2=read_add(21);delay2(100);b3=read_add(31);delay2(100); b4=read_add(41);delay2(100);b5=read_add(51);delay2(100); i=0; P1=0xff; EA=0; //关闭总中断 14 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! ET0=0;//关闭定时器中断0 TR0=0;//关闭定时器0 if(time==3) p1_3=0; /****************写命令*****************************/ write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口 write_com(0x09); //开显示并光标闪烁 write_com(0x0c);//开显示光标不显示并光标不闪烁 write_com(0x01);//清零 for(number=0;number<7;number++) { } write_dat(table[number]); delay(10); write_com(0x80+0x05); while(1) { key=keyscan();//调用键盘扫描 /******************密码控制*****************************/ if(key==0xe7) { write_com(0x80+0x42); for(number=0;number<16;number++) { write_dat(table1[number]); delay(5); } delay(3000); key=keyscan(); if(key!=0xe7) { write_com(0x38);//设置16*2显示,5*7点阵 write_com(0x09); //开显示并光标闪烁 write_com(0x0c);//开显示光标不显示并光标不闪烁 //write_com(0x80); 15 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! write_com(0x01);//显示清屏 */ /**************初始化中断系统*********************/ TMOD=0x00;//设置定时器0为工作方式0(00000000) TH0=(8192-4607)/32; TL0=(8192-4607)%32;//赋初值 EA=1; //开总中断 ET0=1;//开定时器中断0 TR0=1;//启动定时器0 while(1) { a0=consure(); if(a0==b0) { while(1) { a1=consure(); if(a1==0x10) { time=time+1; a1=0xff; goto loop; } if(a1==b1) while(1) { a2=consure(); if(a2==0x10) { time=time+1;a2=0xff; goto loop; } if(a2==b2) while(1) { 16 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! a3=consure(); if(a3==0x10) { time=time+1;a3=0xff; goto loop; } while(1) { a4=consure(); if(a4==0x10) { time=time+1; a4=0xff; goto loop; } if(a4==b4); while(1) { a5=consure(); if(a5==0x10) { time=time+1;a5=0xff; goto loop; } if(a3==b3) if(a5==b5) { kot=keyscan(); if(kot==0xd7) { p1_4=0; delay(200); } key=keyscan(); if(key==0xed) 17 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! { P1=0xff; write_com(0x01); write_com(0x80+0x43); for(number=0;number<16;number++) { } } } } } } write_dat(table3[number]); delay(5); } delay(3000); write_com(0x01); write_com(0x80+0x43); while(1) { ket=keyscan(); if(i>=6) goto loop; m=i*10+1; j=besure(); write_add(m,j); } if(ket==0xee) { } i++; delay(500); write_dat('*'); 18 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! } } } } } } } delay(10); if(a0==0x10) { time=time+1; a0=0xff; goto loop; } /************LCD子函数*********************************/ void write_com(uchar com) { E=0; RS=0; RW=0; P0=com; delay(5); E=1; delay(5); E=0; } void write_dat(uchar dat) { E=0; RW=0;RS=1; P0=dat; delay(5); E=1; delay(5);E=0; } /*******************矩阵键盘**************************/ uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 { uchar cord_h,cord_l;//行列值 19 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! P3=0x0f; //行线输出全为0 cord_h=P3&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { delay(5); //去抖 if(cord_h!=0x0f) { cord_h=P3&0x0f; //读入列线值 P3=cord_h|0xf0; //输出当前列线值 cord_l=P3&0xf0; //读入行线值 return(cord_h+cord_l);//键盘最后组合码值 } }return(0xff); //返回该值 } /***********************延时函数**********************/ void delay(uint z) { uint a,b; for(a=z;a>0;a--) for(b=110;b>0;b--); } /***************键盘确定函数******************************/ int consure() { int key; key=keyscan(); if(key==0x7e||0x7d||0x7b||0x77||0xbe||0xbd||0xbb||0xb7||0xde||0xdd) { key=keyscan(); { case 0x7d:{write_dat('*');numb=0x01;delay(1000);}break;//1 case 0x7b:{write_dat('*');numb=0x02;delay(1000);}break;//2 switch(key) case 0x7e:{write_dat('*');numb=0x00;delay(1000);}break;//0 20 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! } } case 0x77:{write_dat('*');numb=0x03;delay(1000);}break;//3 case 0xbe:{write_dat('*');numb=0x04;delay(1000);}break;//4 case 0xbd:{write_dat('*');numb=0x05;delay(1000);}break;//5 case 0xbb:{write_dat('*');numb=0x06;delay(1000);}break;//6 case 0xb7:{write_dat('*');numb=0x07;delay(1000);}break;//7 case 0xde:{write_dat('*');numb=0x08;delay(1000);}break;//8 case 0xdd:{write_dat('*');numb=0x09;delay(1000);}break;//9 case 0xeb:{write_dat('b');numb=0x10;}break;//e } return numb; int besure() { int key; key=keyscan(); if(key==0x7e||0x7d||0x7b||0x77||0xbe||0xbd||0xbb||0xb7||0xde||0xdd) { } return numb; key=keyscan(); { case 0x7d:{write_dat('1');numb=0x01;delay(1000);}break;//1 case 0x7b:{write_dat('2');numb=0x02;delay(1000);}break;//2 case 0x77:{write_dat('3');numb=0x03;delay(1000);}break;//3 case 0xbe:{write_dat('4');numb=0x04;delay(1000);}break;//4 case 0xbd:{write_dat('5');numb=0x05;delay(1000);}break;//5 case 0xbb:{write_dat('6');numb=0x06;delay(1000);}break;//6 case 0xb7:{write_dat('7');numb=0x07;delay(1000);}break;//7 case 0xde:{write_dat('8');numb=0x08;delay(1000);}break;//8 case 0xdd:{write_dat('9');numb=0x09;delay(1000);}break;//9 switch(key) case 0x7e:{write_dat('0');numb=0x00;delay(1000);}break;//0 } 21 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! } /*********************中断系统*********************/ void Timer0() interrupt 1 { } TH0=(8192-4607)/32; //重新装初值 } /******************eeprom***************************/ void delay1() { ;; } void start() //开始信号 { } void stop() //停止 { { uchar i; sda=0; delay1(); scl=1; delay1(); sda=1; delay1(); } sda=1; delay1(); scl=1; delay1(); sda=0; delay1(); TL0=(8192-4607)%32; static count1=0; if(count1>=4000&&p1_4!=0) //定时20秒 { p1_3=0;count1=0; TR0=0; count1++; void respons() //应答 22 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! scl=1; delay1(); } while((sda==1)&&(i<250))i++; scl=0; delay1(); /***********************初始化eeprom**********************/ void init() { } void write_byte(uchar date) { } uchar read_byte() { } 23 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! sda=1;delay1(); scl=1; delay1(); uchar i,temp; temp=date; for(i=0;i<8;i++) { } scl=0; delay1(); sda=1; delay1(); temp=temp<<1; scl=0; delay1(); sda=CY; delay1();scl=1; delay1(); uchar i,k; scl=0; delay1(); sda=1; delay1(); for(i=0;i<8;i++) { scl=1; delay1(); k=(k<<1)|sda; scl=0; delay1(); } return k; void delay2(uchar x) { } void write_add(uchar address,uchar date) { } uchar read_add(uchar address) { } uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--); start(); write_byte(0xae); respons(); write_byte(address); respons(); write_byte(date); respons(); stop(); uchar date; start(); write_byte(0xae); respons(); write_byte(address); respons(); start(); write_byte(0xaf); //不同 respons(); date=read_byte(); stop(); return date; //不同 24 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! 5 系统电路与Proteus仿真 5.1Proteus简介 Proteus[10]是一款集单片机仿真和SPICE分析于一身的EDA仿真软件,于1989年由英国Labcenter Electronics Ltd.研发成功,经过18年的发展,现在成为当前EDA市场上性价比最高,性能最强的一款仿真软件。 5.2仿真步骤 第一步:在protues中找出对应的元器件; 第二步:将元器件按照电路的需要将线连接好; 第三步:将编写好的程序导入单片机内; 第四步:按下开始键,按照液晶显示器提示输入密码; 第五步:当密码输入正确,设置密码并检验密码是否设置成功。 5.3系统仿真电路(如下图) 开始下一步暂停停止 Protues仿真图 25 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! 5.4 仿真结果 (1)当点击开始键后,1602液晶显示器开始显WELCOME; (2)P1.4为开锁使能端,当D1亮时,将锁打开; (3)P1.3为报警使能端,当输入密码三次都错误蜂鸣器发出警报; (4)当密码输入正确,按SET键后能设置密码。 6结论 (1)成功实现了1602液晶显示,密码开锁,密码设置,防止多次试探,报警等功能。 (2)采用C语言编写程序,具有很强的移植性,增加和修改系统功能方便。 (3)通过仿真软件Protues成功仿真。 26 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! 参考文献 [1]郭海英.基于单片机的电子安全密码锁的设计.现代电子技术[J].2005(13):95-97. [2]赵益丹,徐晓林,周振峰.电子密码锁的系统原理、设计程序及流程图[J].嘉兴学院报.2003(15): 103-105. [3]曾高荣,胡宁,高扬.一种新型电子安全密码锁的设计[J].电子科技.2003(8):44-45. [4]张天凡.完全手册51单片机C语言开发详解[M].北京:电子工业出版社.2008. [5]周功明. 基于AT89C2051单片机的防盗自动报警电子密码锁系统的设计[J].绵阳师范学院学 报.2007:112-115. [6] 郭天祥,51单片机C语言教程——入门、提高、开发、拓展全功略[M].电子工业出版社,2009. [7]倪淑艳,李晓波,于涵.单片机C8051F303在数字锁相式频率合成器中的应用[J].现代电子技 术.2006(4):19-21. [8] 唐德礼, 王襄.单片机学习机及编程器的设计与制作[J](5):现代电子技术.2005(12):117-120. [9]刘振栋.EPROM 芯片的特殊应用[J].电子工程师.1999(6).26-27. [10]李娜,刘雅举.Proteus在单片机仿真中的应用[J].现代电子技术.2007(4):181-182. 27 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! 致 谢 本论文是在我的导师XX亲切关怀和悉心指导下完成的。金老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样。他渊博的知识和阅历,良好的工作作风给作者留下了深深的印象,对作者今后在工作岗位上的工作学习、为人处世都有很好的指导意义,永远值得作者学习。谨表衷心的谢意。 感谢湘南学院物电系的位老师和同学在我大学四年里给我的无私教导和帮助。 谨祝各位老师同学生活更美好! 27 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您! 论文成果 本论文《基于C语言STC89C52单片机电子密码锁的设计与仿真》已通过《现代电子技术》审核并录用,将于2010年10月1日刊登在刊《现代电子技术》2010第19期上。 http://tanshishuiyi.taobao.com/ 麒麟家居服欢迎您28 ! 因篇幅问题不能全部显示,请点此查看更多更全内容