
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作、记住密码即可开锁等优点。
目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。
本系统由ATS51单片机系统(主要是ATS51单片机最小系统)、4×4矩阵键盘、LCD1602显示和报警系统等组成,具有设置、修改六位用户密码、超次报警、超次锁定、密码错误报警等功能(本设计由P0口控制LCD显示,密码正确显示password ok! 密码错误显示password error!超过三次输入错误自动锁定。由P1口控制矩阵键盘含有0-9数字键和A-F功能键。)。除上述基本的密码锁功能外,依据实际的情况还可以添加遥控功能。本系统成本低廉,功能实用。
关键词 ATS51 LCD1602 电子密码锁 4×4矩阵键盘
第一章 绪论
1.1、课题背景和意义
随着电子技术和计算机技术的飞速发展,单片机性能不断完善,性能价格比显著提高,技术日趋完善。由于单片机具有体积小、重量轻、价格便宜、功耗低、控制功能强及运算速度快等特点,因而在国民经济建设、军事及家用电器等各个领域均得到了广泛的应用。本设计利用单片机及附加电子元器件实现数据采集和控制算法,来完成某一实际功能,检验并提高同学对整体电路设计和把握能力,了解单片机系统设计流程,以及电路板的实际制作和调试能力。同时也加强对数字电路、单片机和微机原理等课程知识的实际应用能力,也为同类产品的进一步发展奠定理论和实践基础。
随着人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的安全性。由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因钥匙被仿制而留下安全隐患。电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。但较实用的还是按键式电子密码锁。
20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。
目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,
更加可靠的技术实现大门的管理。在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用
1.2、电子密码锁发展趋势
电子密码锁应用于金融业,其根本的作用是“授权”,即被“授权”的人才可以存取钱、物。广义上讲,金融业的“授权”主要包括以下三种层次的内容:1、授予保管权,如使用保管箱、保险箱和保险柜;2、授予出入权,如出入金库、运钞车和保管室;3、授予流通权,如自动存取款。目前,金融行业电子密码锁的应用主要集中在前两个层面上。下面将介绍几种在金融行业中使用较多的电子密码锁以及它们的技术发展方向。当然,以上所说的授权技术再高超,都必须由精良的“锁具”担当承载结构部件,实现开启、闭锁的功能,而且承担实体防护作用,抵抗住或尽量延迟破坏行为,让电子密码锁“软、硬不吃”。一般情况下,锁具防盗的关键是锁身外壳、闭锁的部件的强度、锁止型式、配合间隙和布局。提高电子密码锁之防护能力的必然途径是报警,在金融业的许多场所有人值守、有电视监控,具有报警功能,可以综合物理防范和人力防范两种作用。报警的前提是具备探测功能,根据电子密码锁的使用场所和防护要求,可选择多种多样的探测手段。在中国的城市金融业中,实现联网报警已经成为对各金融网点的基本要求。根据国内外的实践经验,金融业实行安全防范风险等级很有必要,即依据使用的防盗报警器材的性能、安装布局和人员值守状况等,可以评估被防护物或区域的防护能力,得出风险等级,其中,电子密码锁的性能至关重要。
由于数字、字符、图形图像、人体生物特征和时间等要素均可成为钥匙的电子信息,组合使用这些信息能够使电子密码锁获得高度的保密性,如防范森严的金库,需要使用复合信息密码的电子密码锁,这样对盗贼而言是“道高一尺、魔高一丈”。组合使用信息也能够使电子密码锁获得无穷扩展的可能,使产品多样化,对用户而言是“千挑百选、自得其所”。
第二章 总体设计方案的确定
2.1 电子密码锁设计的具体要求
(1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。
(2)设计开锁密码位六位密码的电子密码锁。
(3)能够LCD显示在密码正确时显示PASSWORD OK,密码错误时显示PASSWORD ERROR,输入密码时显示INPUT PASSWORD。
(4)实现输入密码错误超过限定的三次电子密码锁定。
(5)4×4的矩阵键盘其中包括0-9的数字键和A-F的功能键
(6)本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮。
(7)密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作 。
2.2总体设计方案选定
方案一:采用数字电路控制。
用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过10秒(一般情况下,用户不会超过10秒,若用户觉得不便,还可以修改)电路将报警20秒,若电路连续报警三次,电路将锁定键盘2分钟,防止他人的非法操作。采用数字电路设计的方案好处就是设计简单但控制的准确性和灵活性差。故不采用。
方案二:采用一种是用以ATS51为核心的单片机控制方案。
选用单片机ATS51 作为本设计的核心元件,利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,实现基本的密码锁功能。在单片机的外围电路外接输入键盘用于密码的输入和一些功能的控制,外接LCD1602显示器用于显示作用。其原理如下图2.1所示:
图2.1 单片机控制密码锁原理图
可以看出方案二控制灵活准确性好且保密性强还具有扩展功能,根据现实生活的需要此次设计采用此方案
第三章 系统硬件设计
3.1 单片机ATS51简介
ATS51是美国ATMEL公司生产的低功耗,高性能CMOS8位单片机,片内含4k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序存储器,既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,ATMEL公司的功能强大,低价位ATS51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
3.1.1 主要特性
与MCS-51 兼容
4K字节可编程闪烁存储器
寿命:1000写/擦循环
数据保留时间:10年
全静态工作:0Hz-24Hz
三级程序存储器锁定
128*8位内部RAM
32可编程I/O线
两个16位定时器/计数器
5个中断源
可编程串行通道
低功耗的闲置和掉电模式
片内振荡器和时钟电路
3.1.2 引脚功能说明
图2.2 单片机引脚图
Vcc:电源电压
GND:接地
P0口:P0口是一组8位漏极开路型双向I/0口,也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在F1ash编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
P1口:Pl 是一个带内部上拉电阻的8位双向I/O口,Pl的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“l”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL),Flash编程和程序校验期间,Pl接收低8位地址。
P2 口:P2 是一个带有内部上拉电阻的8 位双向I/O 口,P2 的输出缓冲级可驱动(吸收或输出电流)4 个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL),在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。在访问8 位地址的外部数据存储器(如执行MOVX@Ri 指令)时,P2 口线上的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。Flash编程或校验时,P2亦接收高位地址和其它控制信号。
P3 口:P3 口是一组带有内部上拉电阻的8 位双向I/0 口。P3 口输出缓冲级可驱动(吸收或输出电流)4 个TTL逻辑门电路。P3口除了作为一般的I/0口线外,更重要的用途是它的第二功能,如下表所示:P3口还接收一些用于Flash闪速存储器编程和程序校验的控制信号
RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT 溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0 位(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。
ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE 仍以时钟振荡频率的1/6 输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。
PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当ATS51 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。
EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。F1ash存储器编程时,该引脚加上+12V的编程电压Vpp。
XTALl:振荡器反相放大器及内部时钟发生器的输入端。
XTAL2:振荡器反相放大器的输出端。
S51相对于C51增加的新功能包括:
(1)ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离,是一个强大易用的功能。
(2)最高工作频率为33MHz,C51的极限工作频率为24MHz,就是说S51具有更高的工作频率,从而具有了更快的计算速度。
(3)具有双工UART串行通道。
(4)内部集成看门狗计时器,不再需要像C51那样外接看门狗计时器单元电路。
(5)双数据指示器。
(6)电源关闭标识。
(7)全新的加密算法,这使得对于S51的解密变为不可能,程序的保密性大大加强,这样就可以有效地保护知识产权不被侵犯。
(8)兼容性方面:向下完全兼容51全部字系列产品。
(9)程序存储器写入方式:二者的写入程序的方式不同,C51只支持并行写入,同时需要VPP烧写高压。S51则支持Isp在线编程写入技术。串行写入、速度更快、稳定性更好,烧写电压也仅仅需要4~5V即可。
(10)电源范围:S51电源范围宽达4~5.5V,而C51在低于4.8V和高于5.3V的时候则无法正常工作。
(11)烧写寿命更长:S51标称的1000次,实际最少是1000~10000次,这样更有利于初学者反复烧写,降低学习成本。
综上所述本设计选定ATS51。
液晶显示LCD1602的介绍
1、LM1602字符型模块的性能
重量轻:<100g;
体积小:<11mm 厚;
功耗低:10—15mW;
显示内容:192 种字符(5×7 点字型);
32 种字符(5×10 点字型);
可自编8(5×7)或许(5×10)种字符;
指令功能强:可组合成各种输入、显示、移位方式以满足不同的要求;
接口简单方便:可与8 位微处理器或微控制器相联;
工作温度宽:0—50oC
可靠性高:寿命为50,000 小时(25oC)
2、 基本原理
液晶体
液晶板上排列着若干5×7 或5×10 点阵的字符显示位,每个显示位可显示
1 个字符,从规格上分为每行8、16、20、24、32、40 位,有一行、两行及四行
三类。
工作电路
它由KS0066、KS0065 及几个电阻电容组成。KS0065 是扩展显示字符用的(例如:16 个字符×1 行模块就可不用KS0065,16 个字符×2 行模块就要用1 片KS0065)
接口方面,有8 条数据,三条控线。可与微处理器或微控制相连,通过送入数据和指令,就可使模块正常工作。
LCD 驱动器和控制器
A LCD 驱动器KS0065
KS0065 是用低功耗CMOS 技术制造的大规模LCD 驱动IC。它既可当行驱动用,也可以当列驱动用,由20×2Bin 二进制移位寄存器、20×2Bin 数据锁存器和20×2Bin 驱动器组成
功能:
a 40 通道点阵LCD 驱动;
b 可选择当做行驱动或列驱动;
c 输入/输出信号:输出,能产生20×2 个LCD 驱动波型;输入,接受控制器送出的串行数据和控制信号,偏压(V1—V6);
特性:
a 显示驱动偏压低:静态~1/5;
b 电源电压:+5V+10%;
c 显示驱动电源:-5V;
d CMOS 处理;
e 60 引脚、塑封;
B LCD 控制器KS0066
见图4,KS0066 是用低功耗CMOS 技术制造的大规模点阵LCD控制器(兼带驱动器),和4Bin/8Bin 微处理器相连连,它能使点阵LCD 显示大小英文字母、符号。应用KS0066,用户能有少量元件就可组成一个完整点阵LCD 系统。
特性:
a 容易和Bin/8Bin Mpu 相连;
b 可选择5×7 或5×10 点字符;
c 显示数据RAM 容量:80×8Bin(80 字符);
d 字符发生器ROM 能提供户所需字符库或标准库;字符容量:192 个字符(5×7 点字符);32 个字符(5×10 点字符);
e DDRAM 和CGRAM 都能从Mpu 读取数据;
f 输出信号:16 个行扫信号(common singnal),40 个列扫信号(sengment singnal)
g 电源复位电路;
h 显示占空比:1/8duty(1Line,5×7dots+Cursor);1/11 duty(1Line,5×10dote+Cuesor);1/16 duty(2Line,5×7dots+Cuesir);
i 振荡电路;
j 指令:11 种;
k 80 引脚、塑封。
技术参数
a 极限参数
b电参数
3.2 硬件电路的设计
本设计单片机硬件资源的分配:
P0.0~P0.7用于LCD液晶显示作用。
P2.6、P2.7用于蜂鸣器和报警灯的控制。
P2.0用于开锁电路的控制。
P1.0~P1.7用于键盘电路的控制。
P3.3~P3.5用于LCD显示模块的控制端口的控制。
3.2.1 最小系统的设计
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和开关复位。图3.3即为手动(开关)复位电路。
图3.3 手动复位电路
(2)复位后的状态
a、复位后PC值为0000H,表明复位后的程序从0000H开始执行。
b、SP值为07H,表明堆栈底部在07H,一般需要重新设置SP值。
c、P0~P3口值为FFH。P0~P3口用作输入口时,必须先写入“1”。单片机在复位后,已使P0~P3口每一端线为“1”,为这些端线用作输入口做好了准备。
(3)WDT 溢出将使该引脚输出高电平,所以本设计采用图3.4的手动复位电路:
图3.4 本设计手动复位电路
ATS51 中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1 和XTAL2 分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见图3.5。外接石英晶体(或陶瓷谐振器)及电容Cl、C2 接在放大器的反馈回路中构成并联振荡电路。对外接电容Cl、C2 虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,我们推荐电容使用30pF±10pF,而如使用陶瓷谐振器建议选择40pF±10F。用户也可以采用外部时钟。采用外部时钟的电路如图1所示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。
图3.5 单片机自激震荡电路
由于单片机有内部振荡器,所以本设计采用图3.6的晶振电路:
图3.6 晶振电路
3.2.2 芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,ATS51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
3.2.3 开锁机构
用户通过LCD提示信息,用键盘输入正确密码,从而达到开锁的目的。当用户输入的密码正确并且是在按下确定键的话,单片机便输出开门信号,送到开锁驱动 电路,然后驱动电磁锁,达到开门的目的。电路驱动和开锁两级组成。由D5、R1、T10组成驱动电路,其中T10可以选择普通的小功率三极管如9014、9018都可以满足要求。D5作为开锁的提示;由D6、C24、T11组成。其中D6、C24是为了消除电磁锁可能产生的反向高电压以及可能产生的电磁干扰。T11可选用中功率的三极管如8050,电磁锁的选用要视情况而定,但是吸合力要足够且由一定的余量。
在本次设计中,基于节省材料的原则,暂时用发光二极管代替电磁锁,发光管亮,表示开锁;灭,表示没有开锁。
图3.7 密码锁开锁机构电路图
3.2.4 键盘设计
本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
4×4矩阵键盘的工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
扫描原理
把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。
比如说扫描码送入01111111,前面的0111是代表此时扫描第一行P1.0列,而后面的1111是让读取的4行接脚先设为VDD,若此时第一行的第三列按键被按下,那读取的结果就会变成01111101(注意1111变成1101),其中LSB的第三个bit会由1变成0,这是因为这个按键被按下之后,会被垂直的扫描码电位short,而把读取的LSB的bit电位拉到0,此即为扫描原理。
由於这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,
我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。图3.8为键盘整体模框图:
图3.8 键盘整体模框图
3.2.5显示电路设计
显示设计采用字符型液晶屏设计,由单片机的p0口控制显示,由p3.3~p3.5控制lcd的控制端口。
本设计采用以下液晶显示设计:
图3.9 LCD液晶显示电路抓图
3.3 电路设计总图
Proteus软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS、ARES等软件模块,ARES模块主要用来完成PCB的设计,而ISIS模块用来完成电路原理图的布图与仿真。Proteus的软件仿真基于VSM技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC系列等等,以及单片机外围电路,比如键盘、LED、LCD等等。通过Proteus软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。
本密码锁采用proteus进行电路图设计,经过元件选型,用万能实验版进行硬件焊接,以实现硬件部分。
下图为proteus设计的密码锁电路图整体抓图
第四章 系统软件设计
因设计主要是作用汇编语言来开发的51单片机项目程序,所以首先必须有一个可以在Windows XP或Windows vista操作系统下执行的汇编语言编译器,本设计采用Keil编译器进行编程,因为它可以支持一系列的51单片机。
图4.1 主程序的流程图
4.1主程序模块
主程序主要是完成系统初始化、设置中断向量、检查有无键按下、以及调用显示等等。主程序部分如下所示:
en bit p3.5 ;将lcd的en管脚连接到单片机的p3.5口
rw bit p3.4 ;将lcd的rw管脚连接到单片机的p3.4口
rs bit p3.3 ;将lcd的rs管脚连接到单片机的p3.3口
display equ p0 ;将lcd的显示端口连接到p0口上
speaker bit p2.6 ;蜂鸣器连接到p2.6口
led bit p2.7 ;与蜂鸣器共同作用的led灯连到p2.7口
open bit p2.0 ;开锁电路的控制端连接到p2.0口
returnbit bit 20h.1;
ORG 0000h ;程序开始地址
LJMP start;
ORG 000bh;
LJMP intermit_t0;
ORG 001bh;
LJMP intermit_t1;
ORG 0030h;
start:
MOV sp,#60h;
lcall sys_initialization ;调用子程序sys_initialization
4.2 键盘扫描及识别子程序
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。其程序流程如图4.2所示
键盘部分程序如下:
key: ;键盘程序名称
call ks ;调用子程序ks
jnz k1 ;判断是否有键按下
jmp key ;跳回键盘程序
ks:mov p1,#0f0h;
mov a,p1;
xrl a,#0f0h;
ret;
图4.2 键盘扫描程序流程图
4.3 系统模块密码设置子程序
由于设计是分模块化进行,所以子程序是整体软件系统的组成部分,子程序不但可以使程序化整为零,使其复杂简单化,同时也方便阅读,修改等,每个功能模块都有它自己的子程序,在本设计中是用LCD显示数据,所以就要用到显示子程序,设计中用的是矩阵键盘,所以就用到键盘扫描子程序,例如还有显示初始化子程序、LCD忙检测子程序、关闭状态显示子程序、开锁状态显示子程序、密码输入及修改状态显示子程序、密码输入错误后的提示子程序等。如下图为密码修改子程序流程图
图4.3 设置密码子程序
4.4程序调试
在硬件支持的环境下,用proteus设计好的电路,Keil编好的程序编译成芯片可识别的S51文件,利用PC机写进proteus程序图芯片内进行仿真测试,并对其出现的错误进行修改,由图4.4~图4.8可看出最终调试成功。
图4.4 keil编译程序成功
图4.5 keil生成hex文件
图4.6 proteus调用keil的hex文件进行仿真
图4.7 仿真成功密码正确
图4.8 密码正确绿灯亮
第五章 系统制作及调试
5.1焊接注意事项:
LCD的注意事项
1. 采用焊接方法将金属基PIN安装于LCD时,从玻璃末端到PCB的焊接位置的长度至少5mm,焊接温度必须在260℃以下,且焊接时间必须在10秒以内,以免焊接过程中对装置的损坏,确保焊接性能。在230℃,30秒条件下,90%的焊料须紧密附着于PIN上。
2. 对LCD基板或基PIN焊接位置的调整必须在安装前完成。严禁猛烈移动基PIN,否则会机械地破坏LCD屏与基PIN之间的连接点。焊接时平放LCD,尽量不让LCD受力。
3. 焊接LCD基板时,将其小心、平衡地插入PCB插槽,以避免损坏基PIN或LCD基板。
4. 焊接时,LCD基板不应长时间置于焊锡蒸汽中,清洗PCB时,必须避免污染LCD基板,否则可能损坏显示器表面的偏光片及封口胶。
5. 显示器表面的保护膜直到焊接完成才可揭掉,禁止手指及其它硬物接触偏光片,禁止水和其他化学物质沾污装置,因为这些物质会污染显示器表面。
单片机焊接注意事项:
80s51单片机与其它单片机,dsp,arm芯片相比较而言是脆弱的,如果焊接时不小心就很可能把芯片损坏!建议用比较好的恒温可调的烙铁,功率在30瓦左右,温度控制在260到300度,建议采用点焊而不用拉焊,焊接时烙铁放在每个引脚的时间不能太长(最好低于3秒)。上边提到的方法还不能确保芯片完好,对芯片有危害的还有带电烙铁的静电感应!烙铁质量不是太好的,焊接时可以把烙铁电源插头拔掉。
其他的电子器件焊接须知:
一般分四步骤进行。①准备焊接:清洁被焊元件处的积尘及油污,再将被焊元器件周围的元器件左右掰一掰,让电烙铁头可以触到被焊元器件的焊锡处,以免烙铁头伸向焊接处时烫坏其他元器件。焊接新的元器件时,应对元器件的引线镀锡。②加热焊接:将沾有少许焊锡和松香的电烙铁头接触被焊元器件约几秒钟。若是要拆下印刷板上的元器件,则待烙铁头加热后,用手或银子轻轻拉动元器件,看是否可以取下。③清理焊接面:若所焊部位焊锡过多,可将烙铁头上的焊锡甩掉(注意不要烫伤皮肤,也不要甩到印刷电路板上!),用光烙锡头"沾"些焊锡出来。若焊点焊锡过少、不圆滑时,可以用电烙铁头"蘸"些焊锡对焊点进行补焊。④检查焊点:看焊点是否圆润、光亮、牢固,是否有与周围元器件连焊的现象。
焊接流程按照附录所示的电子密码锁的硬件联接原理图按下列顺序依次焊接:
(1)焊接单片机的晶振电路、复位电路等单片机的最小系统的外围电路。
(2)焊接LCD的相应管脚并把LCD的管脚单片机相连接。
(3)焊接键盘的按键电路。
(4)焊接电子密码锁的密码输入错误的报警电路。
(5)焊接密码锁的开锁机构电路。
(6)焊接其他接口及辅助电路。
(7)焊接接地及高电平。
5.2、硬件调试问题及解决方法
本设计在焊接调试时遇到的问题以及解决方法:
单片机的最小系统问题:
电源、晶振电路和复位电路都无异常。
Lcd焊接时的问题:
(1)接通电源后lcd无反应,各个引脚均属正常。推断可能是初始化程序出现问题。
经查找得知是lcd显示器的15和16管脚控制背光功能,连接好之后还是不能显示字符。
(2)接通电源开门灯和报警电路就会工作,分析原因是单片机刚开始各个管脚输出高电平。
以下为所做实物:
参考文献
[01] 何宏主编. 单片机原理与接口技术. 北京:国防工业出版社. 2006.07
[02] 杨西明, 朱骐主编 . 单片机编程与应用入门. 北京:机械工业出版社 .2004.06
[03] 先锋工作室编著. 单片机程序设计实例. 北京: 清华大学出版社 .2003.01
[04] 谢宜仁主编 . 单片机实用技术问答. 北京: 人民邮电出版社 . 2003.02
[05] 梁丽.电子密码锁的计算机仿真设计.计算机仿真,2005
[06] 房小翠,王金凤编著. 单片机实用系统设计技术. 北京: 国防工业出版社 . 1999.06
[07] 各种网络教程及其他
[08] 王宽仁. 可靠安全的智能密码锁. 电子技术应用 , 2001
[09] 李捷 , 陈典涛 , 陈建华 , 等. 一种基于单片机的电子密码锁的设计 [J]. 农机化研究 , 2004, 5
[10] 董继成. 能防止多次试探密码的单片机密码锁.国外电子元器件 , 2004, 3
[11]赵益丹,徐晓林,周振峰编著.电子密码锁的系统原理、设计程序及流程图.嘉兴学院学报,2003,15
[12] 张培仁. 基于 C语言编程 MCS- 51单片机原理与应用. 北京: 清华大学出版社 , 2002.12
[13] 李朝清. PC机及单片机数据通信技术. 北京:北京航空航天大学出版社 , 1999.
[14] 路而红.专用集成电路设计与电子设计自动化.北京:清华大学出版社,2004
[15] 刘文涛.MCS-51单片机培训教程(C51)版.电子工业出版社,2005.8
[16] 王为青 程国钢.单片机Keil Cx51 应用开发技术.人民邮电出版社,2007.2
[17] 范风强 兰婵丽.单片机语言C51应用实战集锦.电子工业出版社,2003.3
[18] 龚运新.单片机C语言开发技术.清华大学出版社,2006.10
[19] 邵贝贝.单片机嵌入式应用的在线开发方法.清华大学出版社,2006.3
[20] 王宜怀.单片机原理及其嵌入式应用教程.北京希望电子出版社,2002.8
附录Ⅰ 电子密码锁整体设计图
附录Ⅱ 电子密码锁程序源代码
en bit p3.5;
rw bit p3.4;
rs bit p3.3;
display equ p0;
speaker bit p2.6;
led bit p2.7;
open bit p2.0;
returnbit bit 20h.1;
ORG 0000h;
LJMP start;
ORG 000bh;
LJMP intermit_t0;
ORG 001bh;
LJMP intermit_t1;
ORG 0030h;
start:
MOV sp,#60h;
lcall sys_initialization;
main0: lcall strat_display;
main:
MOV 52h,#0;52h ;判断输入错误次数存储地址
setb led;
setb tr0;
lcall key;
cjne a,#'A',next1;
LJMP set_password;
next1: cjne a,#'B',next2;
LJMP input_password;
next2: ajmp main;
sys_initialization:
clr led;
clr open;
clr speaker;
MOV 34h,#'1';
MOV 35h,#'1';
MOV 36h,#'1';
MOV 37h,#'1';
MOV 38h,#'1';
MOV 39h,#'1'; ;存放初始密码
MOV r7,#12;
MOV r0,#40h;
loop: MOV @r0,#10h;
inc r0;
djnz r7,loop; ;密码键值存放区清零完毕
lcall delay0_1s;
MOV p0,#03h;
call write_instruction; ;液晶软复位
MOV p0,#01h;
call write_instruction;
mov p0,#3fh;
call write_instruction;
mov p0,#0fh;
call write_instruction;
mov p0,#06h;
call write_instruction; ;液晶初始化完毕
mov r4,#10;
mov tmod,#11h;
mov th0,#0b0h;
setb ea;
setb et0; ;定时器t0,0.5s定时中断初始化完毕
ret; ;系统初始化完毕
intermit_t0:
push acc;
push psw;
mov th0,#3ch;
mov tl0,#0b0h;
djnz r4,return;
cpl led;
mov r4,#10;
return: pop psw;
pop acc;
reti;
intermit_t1:
push acc;
push psw;
mov th1,#9eh;
mov tl1,#58h;
djnz r4,return_t1;
cpl led;
cpl speaker;
mov r4,#10;
return_t1:pop psw;
pop acc;
reti;
;;;;;;;;;;;;;;;;; 键盘扫描
key: call ks;
jnz k1;
jmp key;
k1:
call delay;
call ks;
jnz k2;
jmp key;
k2:
clr tr0;
clr led;
mov r2,#0feh;
mov r6,#00h;
k3:mov a,r2;
mov p1,a;
mov a,p1;
jb acc.4,l1;
mov a,#0;
LJMP lk;
l1: jb acc.5,l2;
mov a,#4;
ljmp lk;
l2: jb acc.6,l3;
mov a,#8;
ljmp lk;
l3: jb acc.7,next_key;
mov a,#12;
lk: add a,r6;
mov r6,a;
k4: call ks;
jnz k4;
mov a,r6;
mov dptr,#table0;
movc a,@a+dptr;
mov 50h,a; ;查表取值存入50H,保护键值
ret;
next_key:inc r6;
mov a,r2;
jnb acc.7,key;
rl a;
mov r2,a;
jmp k3;
;;;;;;;;;;;;
ks:mov p1,#0f0h;
mov a,p1;
xrl a,#0f0h;
ret;
;;;;;;;;;;;;;;;;; 设置密码程序
set_password:
call clear_display;
mov dptr,#table4;
call input_hint;
mov r0,#40h;
call password;
jbc returnbit,set_password; ;先输入原密码完毕
mov r5,#6;
mov r0,#40h;
mov r1,#34h;
input_compere:
mov a,@r0;
xrl a,@r1;
jnz input_error;
inc r0;
inc r1;
nop;
nop;
djnz r5,input_compere; ;验证输入密码完毕
jmp set_password0;
input_error:
setb led;
call clear_display;
mov dptr,#table5;
call input_hint;
call delay1_5s;
clr speaker;
clr led;
inc 52h;
mov a,52h;
cjne a,#3,set_password;
sjmp $; ;输入密码错误次数超过3次,锁死
set_password0:
call clear_display;
mov dptr,#table2;
call input_hint;
mov r0,#40h;
call password;
jbc returnbit,set_password; ;第一次输入新密码完毕
call clear_display;
mov dptr,#table3;
call input_hint;
call delay1_5s; ;显示再次输入新密码完毕
call clear_display;
mov dptr,#table4;
call input_hint;
mov r0,#46h;
call password;
jbc returnbit,set_password; ;第二次输入新密码完毕
mov r5,#6;
mov r0,#40h;
mov r1,#46h;
set_compere:
mov a,@r0;
xrl a,@r1;
jnz set_error;
inc r0;
inc r1;
djnz r5,set_compere;
mov 34h,40h;
mov 35h,41h;
mov 36h,42h;
mov 37h,43h;
mov 38h,44h;
mov 39h,45h; ;存入新密码完毕
jmp main0; ;设置新密码成功,返回主程序
set_error:
setb speaker;
setb led;
call clear_display;
mov dptr,#table5;
call input_hint;
call delay1_5s;
clr speaker;
clr led;
ljmp set_password0; ;前后两次输入新密码不一致,返回重设
;;;;;;;;;;;;;;;;;输入密码开锁程序
input_password:
call clear_display;
mov dptr,#table4;
call input_hint;
mov r0,#40h;
call password;
jbc returnbit,input_password; ;输入原密码完毕
mov r5,#6;
mov r0,#40h;
mov r1,#34h;
input_compere0:
mov a,@r0;
xrl a,@r1;
jnz input_error22;
inc r0;
inc r1;
nop;
nop;
djnz r5,input_compere0; ;验证输入密码完毕
jmp display_right;
input_error22:
setb speaker;
setb led;
call clear_display;
mov dptr,#table5;
call input_hint;
call delay1_5s;
clr speaker;
clr led;
inc 52h;
mov a,52h;
cjne a,#3,input_password;
sjmp $; ;输入密码错误超过3次,锁死
display_right:
call clear_display;
mov dptr,#table6;
call input_hint; ;显示输入密码正确提示完毕
setb open; ;开锁
next_key1:call key;
nop;
nop;
cjne a,#'F',next_key1;
clr open; ;按下开锁键,开锁
jmp main0; ;返回主程序
;;;;;;;;;;;;;;;
strat_display:
mov p0,#80h;
call write_instruction;
mov dptr,#table1;
call input_hint;
mov p0,#0c0h;
call write_instruction;
mov dptr,#table11;
call input_hint;
ret;
clear_display:
mov display,#01h;
call write_instruction;
ret;
input_hint:
mov r5,#16;
mov a,#00h;
all_or_not:
movc a,@a+dptr;
mov display,a;
call writedata;
inc dptr;
clr a;
nop;
nop;
djnz r5,all_or_not;
ret;
password:
mov r5,#6;
mov r1,#0c0h;
mov a,r1;
mov p0,a;
call write_instruction;
loop1: call key;
nop;
nop;
cjne a,#'C',next_to;
setb returnbit;
jmp endt;
next_to:
mov a,50h;
mov @r0,a;
mov display,#'*';
call writedata;
inc r1;
inc r0;
djnz r5,loop1;
endt:
ret;
;;;;;;;;;;;;;;写数据指令
writedata: SETB rs;
CLR rw;
clr en;
setb en;
nop;
nop;
clr en;
call delay;
ret;
;;;;;;;;;;;;;;;;写指令
write_instruction:
CLR rs;
CLR rw;
clr en;
setb en;
nop;
nop;
clr en;
call delay;
ret;
;;;;;;;;;;;;;;;;;;延时程序
delay1_5s: push 07h;
push 02h;
push 03h;
mov r7,#15;
del22s: MOV r3,#0;
del11s: MOV r2,#0;
djnz r2,$;
djnz r3,del11s;
djnz r7,del22s;
pop 03h;
pop 02h;
pop 07h;
ret;
delay0_1s: push 02h;
push 03h;
mov r3,#0;
del21s: mov r2,#0;
nop;
nop;
djnz r2,$;
djnz r3,del21s;
pop 03h;
pop 02h;
ret;
delay: push 07h;
push 06h;
mov r7,#10;
dl: mov r6,#248;
nop;
nop;
djnz r6,$;
djnz r7,dl;
pop 06h;
pop 07h;
ret;
;;;;;;;;;;;;;;;;;;;
table0:
db 'C','B','0','A';
db 'D','9','8','7';
db 'E','6','5','4';
db 'F','3','2','1';
table1: db 'PASSWORD:A SET';
table11: db ' B OPEN';
table2: db 'SET PASSWORD: ';
table3: db 'INPUT AGAIN!';
table4: db 'INPUT PASSWORD:';
table5: db 'PASSWORD ERROR!';
table6: db 'PASSWORD OK!!!';
end
