R5的作用在于限制按键按下瞬间电容C1的放电电流,避免产生火花,以保护按键触电。
其原理图如图5所示:
图5复位电路原理图
2.7LED显示部分
LED显示部分如图6所示:
图6LED显示部分
本系统的LED显示部分主要由两个LED组成,其中D1代表开锁信号,当密码两次都正确时,D1会闪亮一下;D2代表密码错误,当三次输入错误时,D2亮,且上锁。
2.8晶振部分
AT89C52引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按图4-7所示方式连接。
晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C1、C2取值范围在5~30pF之间。
根据实际情况,本设计中采用12MHZ做为系统的外部晶振。
电容取值为30pF。
图7晶振电路原理图
2.9开锁部分
开锁控制电路的功能是当输入正确的密码后将锁打开。
用户通过键盘任意设置密码,并储存在EEPROM中作为锁码指令。
只有用户操作键盘时,单片机的电源端才能得到3V电源,否则.单片机处于节电工作方式。
开锁步骤如下:
首先按下键盘上的开锁按键,然后利用键盘上的数字键0-9输入密码,最后按下确认键。
当用户输入一密码后,单片机自动识码,如果识码不符,则报警。
只有当识码正确,完成本次开锁。
开锁以后,单片机自动清除掉由用户输人的这个密码。
3主要元器件介绍
3.1主控芯片AT89C52
AT89C52是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
3.1.1AT89C52性能简介
AT89C52具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
图8AT89C52芯片引脚图
其主要功能特性:
兼容MCS-51指令系统4k可反复擦写(>1000次)ISPFlashROM
32个双向I/O口4.5-5.5V工作电压
2个16位可编程定时/计数器时钟频率0-33MHz
全双工UART串行中断口线128x8bit内部RAM
2个外部中断源低功耗空闲和省电模式
中断唤醒省电模式3级加密位
看门狗(WDT)电路软件设置空闲和省电功能
灵活的ISP字节和分页编程双数据寄存器指针
可以看出AT89C52提供以下标准功能:
4K字节Flash闪速存储器,128字节内部RAM,32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时器/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟。
同时,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式何在RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直接到一个硬件复位。
3.1.2AT89C52引角功能说明
VCC:
电源电压
GND:
地
P0口:
P0口是一组8位漏极开路型双向I/O口,也即地址/数据总线复用口,作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端口。
在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。
在Flash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号校验期间,P1接收低8位地址。
表1为P1口第二功能。
表1P1口第二功能
端口引脚
第二功能
P1.5
MOSI(用于ISP编程)
P1.6
MISO(用于ISP编程)
P1.7
SCK(用于ISP编程)
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流I。
在访问8位地址的外部数据存储器(如执行:
MOVX@Ri指令)时,P2口线上的内(也即特殊功能寄存器,在整个访问期间不改变。
Flash编程或校验时,P2也接收高位地址和其它控制信号。
P3口:
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。
作输入端口时,被外部拉低的P3口将用上拉电阻输出电流I。
P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能,P3口的第二功能如下表2。
表2P3口的第二功能
端口功能
第二功能
端口引脚
第二功能
RXD(P3.0)
串行输入口
T0(P3.4)
定时/计数器0外部输入
TXD(P3.1)
串行输出口
T1(P3.5)
定时/计数器1外部输入
INT0(P3.2)
外中断0
WR(P3.6)
外部数据存储器写选通
INT1(P3.3)
外中断1
RD(P3.7)
外部数据存储器读选通
RST:
复位输入。
当振荡工作时,RST引脚出现两个机器周期上高电平将使单片机复位。
WDT益出将使该引脚输出高电平,设置SFRAUXR的DISRTO位(地址8EH)可打开或关闭该功能。
DISRTO位缺省为RESET输出高电平打开状态。
ALE/PROG:
当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。
即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出的正脉冲信号,因此它可对外输出时钟或用于定时目地,要注意的是:
第当访问外部数据存储器时将跳过一个ALE脉冲。
如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。
该位禁位后,只有一条MOVX和MOVC指令ALE才会被激活。
此外,该引脚伎被微弱拉高,单片机执行外部程序时,应设置ALE无效。
PSEN:
程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。
当访问外部数据存储器,高有两次有效的PSEN信号。
EA/VPP:
外部访问允许。
欲使CPU公访问外部程序存储器(地址0000H-FFFFH),EA端必须保持低电平(接地)。
需注意的是:
如果加密位LB1被编程,复位时内部会锁存EA端状态。
如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。
Flash存储器编程时,该引脚加上+12V的编程电压Vpp。
XTAL1:
振荡器反相放大器及内部时钟发生器的输入端。
XTAL2:
振荡器反相放大器的输出端。
3.1.3AT89C52芯片内部结构
特殊功能寄存器:
特殊功能寄存器的片内空间分存如下图3-2所示。
这些地址并没有全部占用,没有占用的地址不可使用,读这些地址将得到一个随意的数值。
而写这些地址单元将不能得到预期的结果。
中断寄存器:
各中断允许控制位于IE寄存器,5个中断源的中断优先级控制位于IP寄存器。
双时钟指针寄存器:
为方便地访问内部和外部数据存储器,提供了两个16位数据指针寄存储器:
PD0位于SFR区块中的地址82H、83H和DP1位于地址84H、85H,当SFR中的位DPS=0时选择DP0,而DPS=1时选择DP1。
在使用前初始化DPS。
电源空闲标志:
电源空闲标志(POF)在特殊功能寄存储器SFR中PCON的第4位(PCON.4),电源打开时POF置“1”,它可由软件设置睡眠状态并不为复位所影响。
存储器结构:
MCS-51单片机内核采用程序存储器和数据存储器空间分开的结构,均具有64KB外部程序和数据的寻址空间。
程序存储器:
如果EA引脚接地(GND),全部程序均执行外部存储器。
在AT89S51,假如接至Vcc(电源+),程序首先执行从地址0000H-0FFFH(4KB)内部程序存储器,再执行地址为1000H-FFFFH(60KB)的外部程序存储器。
数据存储器:
在AT89S51的具有128字节的内部RAM,这128字节可利用直接或间接寻址方式访问,堆栈操作可利用间接寻址方式进行,128字节均可设置为堆栈区空间。
看门狗定时器(WDT):
WDT是为了解决CPU程序运行时可能进入混乱或死循环而设置,它由一个14bit计数器和看狗复位SFR(WDTRST)构成。
外部复位时,WDT默认为关闭状态,要打开WDT,必按顺序将01H和0E1H写到WDTRST寄存器,当启动了WDT,它会随晶体振荡器在每个机器周期计数,除硬件复位或WDT溢出复位外没有其它方法关闭WDT,当WDT溢出,将使RST引脚输出高电平的复位脉冲。
3.2LCD1602显示器
现在的字符型液晶模块已经是单片机应用设计中最常用的信息显示器件了。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
3.2.1接口信号说明
1602型LCD的接口信号说明如表3所示:
表31602型LCD的接口信号说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
V0
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据/命令选择端(H/L)
12
D5
DataI/O
5
R/W
读写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D0
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
3.2.2主要技术参数
1602型LCD的主要技术参数如下表所示:
表41602型LCD的主要技术参数
显示容量
16X2个字符
芯片工作电压
4.5~5.5V
工作电流
2.0mA(5.0V)
模块最佳工作电压
5.0V
字符尺寸
2.95X4.35(WXH)mm
3.2.3基本操作程序
读状态:
输入:
RS=L,RW=L,E=H输出:
D0~D7=状态字
读数据:
输入:
RS=H,RW=H,E=H输出:
无
写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:
D0~D7=数据
写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=高脉冲输出:
无
4系统软件设计
本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。
主要程序设计流程图如下所示:
图9主程序流程图
图10密码设置流程图
图11开锁流程图
5调试
调试过程如下:
首先把密码锁接通电源,使之运行程序,从而置入初始密码,其模拟电路图如图12所示,当前状态为初始状态,这时的初始密码根据程序可作为:
012345,此时从键盘上依次按下代表0,1,2,3,4,5的按键在按下代表确认的键,当输入密码正确时模拟图如图13所示,再次输入密码后确认开锁,绿灯(D1)亮起,其模拟图如图14所示。
若输入密码错误时,其模拟图如图15所示,当三次都输入错误密码后,红灯(D2)亮起,其模拟图如图16所示。
模拟电路图12(键盘扫描,LCD开)
模拟电路图13(密码第一次输入正确)
模拟电路图14(绿灯(D1)亮起,开锁状态)
模拟电路图15(输入错误密码)
模拟电路图16(三次输入都错,红灯(D2)亮起,上锁状态)
6总结
本设计从经济实用的角度出发,采用美国Atmel公司的单片机AT89C52作为主控芯片与数据存储器单元,结合外围的键盘输入、显示、报警、开锁等电路并用汇编编写主控芯片的控制程序,研制了一款可以多次更改密码具有报警功能的电子密码锁。
设计完全可行可以达到设计目地。
使用单片机制作的电子密码锁具有软硬件设计简单,易于开发,成本较低,安全可靠,操作方便等特点,可应用于住宅、办公室的保险箱及档案柜等需要防盗的场所,有一定的实用性。
该电路设计还具有按键有效提示,输入错误提示,控制开锁电平,控制报警电路,修改密码等多种功能。
可在意外泄密的情况下随时修改密码。
保密性强,灵活性高,特别适用于家庭、办公室、学生宿舍及宾馆等场所。
7参考文献
[1]祖龙起,刘仁杰.一种新型可编程密码锁[J].大连轻工业学院学报,2002.
[2]李瀚荪.电路分析基础[M],北京:
高等教育出版社1991.
[3]童诗白,华成英,模拟电子技术基础[M],北京:
高等教育出版社,2000.
[4]王千.实用电子电路大全[M],电子工业出版社,2001,p101.
[5]何立民.单片机应用技术选编[M],北京:
北京航空大学出版社,1998.
[6]李华.MCS-51系列单片机使用接口技术[M],北京航空航天大学出版社,1993.
[7]彭为.单片机典型系统设计实例精讲[M],北京:
电子工业出版社,2006.
[8]潘永雄.新编单片机原理与应用[M],西安:
西安电子科技大学出版社,2003.
[9]董继成.一种新型安全的单片机密码锁[J].电子技术,2004.
[10]祖龙起,刘仁杰,孙乃凌.一种新颖的电子密码锁[J].电子世界,2001.
[11]李明喜.新型电子密码锁的设计[J].机电产品开发与创新,2004.
[12]杨茂涛.一种电子密码锁的实现[J].福建电脑,2004.
附录
主程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharjian[16]={0xe7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb,0x7e,0x7d,0x7b,0x77,0xb7,0xd7};
ucharUsers[6]={0,1,2,3,4,5};//用户密码
ucharFu_hao=0;//符号输出控制位
ucharU_Interrupt=0;//中断标志位
ucharTxet=0;
uchartimer_1=0;
ucharcodetable4[]="Isexiting!
";
ucharcodetable7[]="inputnewcode";
ucharcodetable12[]="Timeistoolong";
sbitlcd