单片机课程设计-密码锁
1 设计课题任务、功能要求说明及总体方案介绍
1.1 设计课题任务
设计一个具有特定功能的密码锁。该密码锁上电或按键复位后能自动显示系统提示符“P.”, 进入准备工作状态。该密码锁具有系统原始密码888888,用户可以设定并存储用户密码,密码输入时应处于保密显示状态,密码输入正确时应显示密码输入正确提示信息,否则,显示密码输入错误提示信息。
1.2 总体方案介绍及工作原理说明
(1) 原始密码的设定,此密码是固定在程序存储器ROM中,假设预设的密码为“888888”共6位密码。
(2)密码的输入: 采用按键来完成密码的输入,输入时密码处于显示保密状态,输入六位密码后,自动结束输入,并判断其正确性
(3)密码若输入错误,显示输入错误提示信息,密码输入正确后,可以用键盘任意输入数字,若按下第八个按键,则进入修改密码
(4)密码修改:可以任意输入“1-7”中的六位数字作为密码,密码输入时处于保密显示状态,六位密码输入结束确认后显示P.。
图1 设计总框图
2 密码锁硬件系统的设计
2.1 密码锁硬件系统各模块功能简要介绍
此次课程设计是基于单片机控制的电子密码锁,结合主要设计条件,本设计由单片机系统、独立式键盘、LED显示和报警系统组成,系统能完成开锁、错误报警、密码修改功能等功能,设计硬件系统如下: (1)单片机系统:
此次课题采用一种是用以AT89S52为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,进行电子密码锁的设计。此次课题用单片机P1口与键盘相连,做输入口,P0口与显示器段控相连,输入段控码,P2口输入位控码。 (2)独立式键盘接口电路:
此次课程设计采用独立式键盘,与P1口相连,键按下则会使该端口变成低电平,单片机读P1口,通过对P1口数据的判断来确定哪一个键按下。 (3)数码管显示模块:
此次课程设计采用的是共阴数码管,P0口段控,P2口送位控,八个数码管共用八根段控,由位控决定在哪一位显示。本次采用的是数码管动态显示法,先给数码管送位控,再送位控,延时1ms左右让显示稳定,利用人眼的视觉反应时间,八位的滚动显示,人眼看来是静态的,从而实现了动态显示的功能。 (4)报警系统:
此次课程设计,当输入密码错误后,系统报警,报警装置由一扬声器实现,给P3.1口规律性的赋低电平,使扬声器鸣报警、二极管发光。 (5)电源电路:
该密码锁设计了一个电源电路用一个发光二级管显示电源电路的通/断情况。另外,系统也可通过下载口接通电源,且都与单片机EA引脚连接给整个硬件系统供电。
(6)复位及振荡电路:
时钟电路工作后,在REST管脚上加两个机器周期的高电平,芯片内部开始进行初始复位。本设计晶振选择频率为12MHZ,电容选择33pF。经计算得单片机工作的机器周期为:
12×(1÷12M)=1us。
(7)下载口:
该密码锁系统设计了一个下载口用于单片机系统的程序导入,附带可以作为补充电源只用,即用一个引脚接电源VCC,因此可以实现程序输入和供电。
2.2 密码锁电路原理图、PCB图、元器件布局分布图
电路原理图见附录A PCB 顶层图见附录B PCB 底层图见附录B 元器件布局图见附录C
2.3 密码锁元器件清单 元器件清单见附录D
3 密码锁软件系统的设计
3.1 密码锁设计使用单片机资源的情况
原始密码存放在内部程序存储器中,78H-7FH单元做字形代码缓冲区,70H-77H单元做数据比较缓冲区,61H-66H作为新密码存放区,88H-8DH做密码缓冲区。
3.2 密码锁设计软件系统各模块功能简介及流程图
密码锁软件的设计主要包括:键盘扫描、密码显示、密码比较、密码修改、错误报警。
程序设计总流程图如图2所示:
图2 程序设计总流程图
3.2.1 键盘扫描程序:
本设计采用独立式键盘,共八个按键,程序开始时,先给P1口送高电平,有按键按下后,相应的P1口线会变为低电平,将P1口的电平取反,再送到20H中,20H为可位寻址区,通过查询20H的八位,即可得到是哪个按键按下,就可以转向每个按键所要执行的程序。
键盘扫描程序流程框图如图3所示:
图3 键盘扫描程序流程图
3.2.2 显示程序:
本设计采用数码管共阳极显示,位控由P0口输出,段控由P2口输出,程序开始后,先对程序初始化,选好寄存器以及查表显示的表地址,先将低位位控码送到P2口,然后通过查表得到段控码,并送到该位,这样依次查完八位,使八位数码管显示,以此循环。
显示程序流程图如图4所示:
图4 显示程序流程图
3.2.3 密码判断程序:
原密码存放在内部程序存储器中,程序开始后,上电后通过键盘输入六位
密码来解锁,六位密码输入完后,会自动判断是否与原始密码相同,相同的话可以解锁,解锁后可以更改用户密码,若与原始密码不同,则出错报警,然后按复位键可以重新输入。修改完用户密码后若再解锁,步骤与上述相同。 密码判断程序流程图如图5所示:
图5 密码判断程序流程图
3.2.4 错误报警程序
密码输入错误后,会进入自动错误报警,报警时数码管上会显示“ERROR”字样,蜂鸣器会响,与蜂鸣器连在一起的LED灯也会亮,从而实现错误报警。
错误报警程序流程图如图6所示:
图6 密码修改程序流程图
3.3 密码锁设计程序清单
程序清单见附录E
4 设计结论、缺陷分析、仿真结果、心得体会、教学建议
4.1 密码锁设计结论及使用说明
该密码锁基本实现了开锁,修改用户密码,错误报警等功能,具有一定的应
用推广价值。
密码锁上电后,屏幕上会显示“P.”,通过键盘可以输入六位密码,保密显示“口”形;密码输完后,密码正确则自动开锁,出现上“口”形,并可以任意输入1-7在数码管显示,若错误数码管会出现“ERROR”和蜂鸣器与LED灯间歇性鸣叫、闪烁报警,按复位键返回重输。密码正确后按下第八个键出现六“_”,“口”形显示保密输入六位新密码,完成后按第八个键确认后又可回到输密码状态“P.”;在修改密码后,如果出现密码输入错误,也会出现“ERROR”字样和蜂鸣器与LED的报警,但可按任意键返回到输密码状态重新输入密码状态;现在可以摆脱复位键,可重复修改密码。
4.2 密码锁设计的缺陷分析
本设计的密码锁不能进行掉电保护,即用户修改密码后不能进行密码保存,
掉电后密码就变为原始密码,在实际应用中还须进行改进,例如在硬件电路中加入存储芯片24C02。由于硬件电路的限制,按键过少,使有些功能缺失或复杂,在实际应用中可采用行列式键盘。
4.3 密码锁的仿真结果
为了能让本次课程设计的准确性特用Protues仿真软件做了仿真如图7:
图7 仿真图P点的显示
4.4 心得体会
本次单片机课程设计安排在临近期末。由于期末复习紧张,要在短时间内完成程序设计到硬件调试,我遇到很大的困难。首先在程序设计上,基于强大的网络资源和图书资源我很快的确定了设计方案和总体设计思路——构建一个由数码管和独立按键以单片机为核心的电子密码锁。但是,从软件设计完成到实现仿真却并不简单。好在,前期在做单片机实验上积累了一定的程序设计和分析功底,经过反复调试和修改,到底还是实现了当初预定的功能。
通过这次实践课程,我不光学到了很多关于单片机应用的知识,同时也增长见识、开扩了专业方面的视野。另外,我感觉课程设计与实验课这样的实践课程对理论知识的巩固,动手能力的增强,综合素质的提高有着理论课堂学习无法比拟的效果,是大学,尤其是应用型工科学院必不可少的学习单元。
4.5 教学建议
经过为期半年的单片机学习,我们在王老师的指导下对单片机有了较系统的认识,有了一定了程序设计能力,掌握各个应用软件的使用。但是,我也有个人的感受:王老师在理论课上教学认真细致,实践课时习惯让同学们自我摸索,也许希望这样锻炼同学们独立解决问题的能力。但是,我们更希望在实践课时有更多机会得到老师的点拨和指导,这样会令我们的学习效率更高,积极性更高。那样,我相信我们的学习成绩将会更进一步,老师的教学效果将更突出。
结束语
作为本学期的单片机课程设计,由单片机为控制核心的密码锁从设计方案确定到原理图设计,到程序设计及软硬件结合调试,整个过程有苦有甜,但我收获了颇多,学到了许多课本上没有的东西,增强了自己的动手能力,还培养了自己查阅资料,自学的技能,总之,是获益匪浅的。尤其在资料查阅和程序设计和调试上能力提高效果明显。
此次设计的密码锁虽然实现了其基本功能,但还有很多要改进的地方,比如掉电保护的实现,必须在原有的电路上增加模块(比如24C52芯片),但由于时间紧凑,资源有限未能完成。在以后的学习中,我还应该继续努力去完善。 此次课程设计虽然接近尾声,但我对单片机的学习和研究将永远不会停止,我必将努力自我探索,不断自主学习,孜孜以求。
致谢
期末考试结束了,我的单片机课程设计也要完成了。能够顺利完成密码锁的设计,当然要感谢王韧老师悉心教授单片机的理论知识以及在实验课程上的严格要求。王老师在课程设计前期的单片机技术课的教授上认真细致,使我们夯实了理论知识基础;在单片机实验课上,王老师严格要求,使我们强化了实践动手能力、能够熟练的运用各种应用软件。并且,在我们遇到技术难题和设计瓶颈的时候适当的启发了我们。另外,在程序设计和硬件调试上,我很大程度上获得了班上同学的帮助,尤其是上期暑假参加过单片机培训的三位同学使我顺利完成了程序的后期完善。在设计结束之际,祝老师新年快乐,工作顺利,桃李满天下,祝同学们期末考试顺利,学有所成。
参考文献
[1] 李广第,朱月秀,冷祖祁.单片机基础[M].北京:北京航空航天大学出版社,2007.6
LiGuang first, ZhuYueXiu, LengZuQi. Single chip microcomputer based [M]. Beijing: Beijing university of aeronautics &astronautics press, 2007.6
[2] 康华光.电子技术基础 模拟部分(第五版) [M].北京:高等教育出版社,2006
kang uh guano. Electronic technology foundation simulation part (fifth edition) [M]. Beijing: higher education press, 2006
[3] 阎石,数字电子技术基础(第五版) [M].北京:高等教育出版社,2006
YanShi, digital electronic technology foundation (fifth edition) [M]. Beijing: higher education press, 2006
[4] 邱光源.电路(第五版) [M].北京:高等教育出版社,2006
QiuGuangYuan. Circuit (fifth edition) [M]. Beijing: higher education press, 2006
附 录
附录A:电路原理图
图A 密码锁电路原理图
附录B: PCB图
图B1 电子密码锁PCB图顶层
图B2 电子密码锁PCB图底层
附录C: 元器件分布图
图C 电子密码锁元器件分布3D效果图
附录D: 元器件清单
表D 电子密码锁元器件清单
附录E: 程序清单
项目名称:密码锁
项目功能:初始自动显示系统提示符“P.”, 进入准备工作状态。具有系统原
始密码888888,用户可以设定并存储用户密码,密码输入时应处于保密显示状态,密码输入正确时应显示密码输入正确提示信息,否则,显示密码输入错误提示信息并报警。 电路描述:采用芯片AT89S52单片机,利用P1口与键盘相连,做输入口,P0
口与显示器段控相连,输入段控码,P2口输入位控码,将P3.1口与
蜂鸣器和二极管电路相连,产生错误报警。
编程作者:喻鹏
完成时间:2013年1月3日
备注: 78H~7FH单元做字形代码缓冲区,70H~77H单元做数据比较缓冲单元,
MAIN为原始密码存放区,61H~66H作为新密码的存放区,88H~8DH为密码缓冲区。
密码锁程序清单:
ORG 0000H LJMP START ORG 0100H
START : MOV SP, #30H
MOV R0, #70H MOV 6FH, #00H MOV R1, #78H MOV 20H, #00H CLR 21H.1 MOV A, #00H MOV DPTR, #MAIN MOV 78H, #0CH MOV 79H, #0FFH MOV 7AH, #0FFH MOV 7BH, #0FFH MOV 7CH, #0FFH MOV 7DH, #0FFH MOV 7EH, #0FFH MOV 7FH, #0FFH
LOOP: LCALL DISP
LCALL KEYCL
JB 20H.0, KEY11
JB 20H.1, KEY12
JB 20H.2, KEY13
JB 20H.3, KEY14
JB 20H.4, KEY15
JB 20H.5, KEY16
JB 20H.6, KEY17
JB 20H.7, KEY18
CLR CY
DEC R0
MOV R4,A
MOVC A, @A+DPTR ;
SUBB A, @R0 ;密码值与输入值的比较
INC R0
JZ HERE ;相等则转移过去继续判断按键
SETB 21H.1 ;不等则将21H.1置1
HERE: MOV A, R4 ;
CJNE R1, #7EH,LOOP;
LJMP BIJIAO
//**判断是哪个按键,然后进行相应操作**//
KEY11: MOV @R0, #01H
SJMP ZZZ
KEY12: MOV @R0, #02H
SJMP ZZZ
KEY13: MOV @R0, #03H
SJMP ZZZ
KEY14: MOV @R0, #04H
SJMP ZZZ
KEY15: MOV @R0, #05H
SJMP ZZZ
KEY16: MOV @R0, #06H
SJMP ZZZ
KEY17: MOV @R0, #07H
SJMP ZZZ
KEY18: MOV @R0, #08H
ZZZ: MOV @R1, #0A3H ; 送显示字形,保密输出显示“口”形 INC R0 ;将R0、R1、A加1
INC R1
INC A
MOV 20H, #00H
LJMP LOOP ;返回再继续判断按键
//*********比较后对标志位进行判断***//
BIJIAO: JB 21H.1, ERROR ;标志位等于1则进入错误提醒设置 MOV R1, #7FH ;密码正确后显示缓冲段
MOV 78H, #9DH ;上半'口'
MOV 79H, #0FFH ;'灭'
MOV 7AH, #0FFH ;'灭'
MOV 7BH, #0FFH ;'灭'
MOV 7CH, #0FFH ;'灭'
MOV 7DH, #0FFH ;'灭'
MOV 7EH, #0FFH ;'灭'
MOV 7FH, #0FFH ;‘灭’
BOOP1: MOV 20H, #00H
LCALL DISP
LCALL KEYCL
JB 20H.0, KEY21
JB 20H.1, KEY22
JB 20H.2, KEY23
JB 20H.3, KEY24
JB 20H.4, KEY25
JB 20H.5, KEY26
JB 20H.6, KEY27
JB 20H.7, KEY28 ;第八个键按下,直接进入密码修改 CJNE R1, #77H,BOOP1
MOV R1, #7FH
SJMP BOOP1
//错误提示则出现‘ERROR’字样,并伴有蜂鸣声和LED灯闪烁//
ERROR: MOV 79H, #88H ;‘R’
MOV 7AH, #0C0H ;'O'
MOV 7BH, #88H ;'R'
MOV 7CH, #88H ;'R'
MOV 7DH, #86H ;'E'
MOV 7EH, #0FFH ;'灭'
MOV 7FH, #0FFH ;‘灭’
MOV 78H, #0FFH ;‘灭’
LOOP2: MOV R5,#32H ;显示函数的循环次数
CLR P3.1 ; 蜂鸣器和P3.1对应的灯隔0.5响灭
LOOP1: LCALL DISP
DJNZ R5,LOOP1 ;显示循环50次,约为0.4s
SETB P3.1 ;取反P3.1口
LCALL DELAY400MS ;调延时0.4s
SJMP LOOP2 ;按复位键返回重新输入
;//***密码输入正确后,可以任意输入1~7中的数字**//
KEY21: MOV @R1, #0F9H
DEC R1
LJMP BOOP1
KEY22: MOV @R1, #0A4H
DEC R1
LJMP BOOP1
KEY23: MOV @R1, #0B0H
DEC R1
LJMP BOOP1
KEY24: MOV @R1, #99H
DEC R1
LJMP BOOP1
KEY25: MOV @R1, #92H
DEC R1
LJMP BOOP1
KEY26: MOV @R1, #82H
DEC R1
LJMP BOOP1 DEC R1 LJMP BOOP1
;‘_’
;'_' KEY27: MOV @R1, #0F8H //*****密码修改*******************// KEY28: MOV 78H, #0F7H MOV 79H, #0F7H
MOV 7AH, #0F7H
MOV 7BH, #0F7H
MOV 7CH, #0F7H ;'_'
MOV 7DH, #0F7H
MOV 7EH, #0FFH
MOV 7FH, #0FFH
MOV R0, #61H
MOV R1, #7DH
KOOP1: LCALL DISP
MOV 20H, #00H
LCALL KEYCL
JB 20H.0, KEY31
JB 20H.1, KEY32
JB 20H.2, KEY33
JB 20H.3, KEY34
JB 20H.4, KEY35
JB 20H.5, KEY36
JB 20H.6, KEY37
JB 20H.7, KEY38
CJNE R1, #7EH,KOOP1
MOV R1, #78H
SJMP KOOP1
KEY31: MOV @R0, #01H
MOV @R1, #0A3H
SJMP PANDUAN
KEY32: MOV @R0, #02H
MOV @R1, #0A3H
;'_' ;'_' ;'_' ;'灭' ;‘灭’ ;新密码存放区 ;显示代码缓冲区
SJMP PANDUAN
KEY33: MOV @R0, #03H
MOV @R1, #0A3H
SJMP PANDUAN
KEY34: MOV @R0, #04H
MOV @R1, #0A3H
SJMP PANDUAN
KEY35: MOV @R0, #05H
MOV @R1, #0A3H
SJMP PANDUAN
KEY36: MOV @R0, #06H
MOV @R1, #0A3H
SJMP PANDUAN
KEY37: MOV @R0, #06H
MOV @R1, #0A3H
PANDUAN:CJNE R1, #77H,THE1
SJMP KOOP1
THE1: INC R0
DEC R1 SJMP KOOP1
KEY38: CJNE R1, #77H,THE ;确认密码修改成功(并判断是否满足密码要求)
SJMP THE2
THE: LJMP KEY28
;//*********新密码执行*************//
THE2: MOV R0,#61H
MOV R1,#78H MOV 20H,#00H CLR 21H.1 MOV DPTR,#0061H ;利用DPTR做间址寻址寄存器 MOV 78H,#0CH ;‘P’ MOV 79H,#0FFH ;'灭' MOV 7AH,#0FFH ;'灭' MOV 7BH,#0FFH ;'灭' ;数据比较缓冲段 ;显示缓冲段
MOV 7CH,#0FFH ;'灭'
MOV 7DH,#0FFH ;'灭'
MOV 7EH,#0FFH ;'灭'
MOV 7FH,#0FFH ;‘灭’
TOOP: LCALL DISP
LCALL KEYCL
CLR CY
JB 20H.0,KEY41
JB 20H.1,KEY42
JB 20H.2,KEY43
JB 20H.3,KEY44
JB 20H.4,KEY45
JB 20H.5,KEY46
JB 20H.6,KEY47
JB 20H.7, KEY48
CJNE R1, #7EH,TOOP;
LJMP BIJIAO1
//*改密码后的密码输入时判断是哪个按键,然后进行相应操作*//
KEY41:MOV A, #01H
SUBB A, @R0
SJMP KKK
KEY42:MOV A, #02H
SUBB A, @R0
SJMP KKK
KEY43:MOV A, #03H
SUBB A, @R0
SJMP KKK
KEY44:MOV A, #04H
SUBB A, @R0
SJMP KKK
KEY45:MOV A, #05H
SUBB A, @R0
SJMP KKK
KEY46:MOV A, #06H
SUBB A, @R0
SJMP KKK
KEY47:MOV A, #07H
SUBB A, @R0
KKK: JZ EY6
SETB 21H.1 INC R0 INC R1 ;返回再继续判断按键 ;返回再继续判断按键 EY6: MOV @R1, #0A3H ;送显示字形,保密输出显示“口”形 MOV 20H, #00H LJMP TOOP LJMP TOOP KEY48:MOV 20H, #00H
;*********新密码的比较*******************
BIJIAO1: JB 21H.1,ERROR1 ;标志位等于1则进入错误提醒设置
LJMP BIJIAO
;错误提示表现为出现‘ERROR’字样,并伴有蜂鸣声和LED灯闪烁
ERROR1:MOV 79H,#88H ;‘R’
MOV 7AH,#0C0H ;'O' MOV 7BH,#88H ;'R' MOV 7CH,#88H ;'R' MOV 7DH,#86H ;'E' MOV 7EH,#0FFH ;'灭' MOV 7FH,#0FFH ;‘灭’ MOV 78H,#0FFH ;‘灭’
; 蜂鸣器和P3.1对应的灯隔0.5响灭 LOOP3: MOV R5,#32H ;显示函数的循环次数 CLR P3.1
LOOP4: LCALL DISP
LCALL KEYCL
MOV R7,20H CJNE R7,#00H,XXX ;修改密码后,进入密码报错后按任意键可以重新输入
DJNZ R5,LOOP4 ;显示循环50次,约为0.4s
SETB P3.1 ;取反P3.1口
LCALL DELAY400MS ;调延时0.4s
LCALL KEYCL
SJMP LOOP3 ;按复位键返回重新输入
XXX: SETB P3.1 ;关报警器
LJMP THE2 ;跳过去重新输入
;//***********显示程序***************//
DISP: PUSH PSW ; 保护寄存器里面的数据
PUSH ACC
PUSH DPH
PUSH DPL
MOV PSW,#08H
MOV A,#00H ; 设置查表显示为首个数据
MOV R1,#78H ; 表首地址
MOV R3,#0FEH ; 位控,首先控制最低位为低电平 MOV R2,#08H ; 循环显示的次数
DOOP1:MOV P2,R3 ;先送位控到P2口
MOV A,@R1 ;查表去字形代码
MOV P0,A ;送段控到P0口
LCALL DELAY1MS ;调1MS的延时程序
MOV A,R3
RL A
MOV R3,A ;位控位左移一位
INC R1 ;将A,即查表向后推移一位 DJNZ R2,DOOP1 ;判断是否查询了八个缓冲字节 POP DPL ;出栈
POP DPH
POP ACC
POP PSW
RET ;子程序返回
;//***********独立式按键处理************************// KEYCL:PUSH PSW
PUSH ACC
LCALL KEYSM ;调键扫,返回A的值
JZ FH ;判断A是否为0,为0则跳FH处返回
LCALL DISP ;A不等于0,调去抖显示(代替延时程序8MS)程序 LCALL DISP LCALL KEYSM JZ FH
MOV B,A ;再调键扫 ;再次判断A ;A不为0,则确实有键按下 ;A=0则为释放了,跳KEY1保存键值到可位寻址;判断键是否释放,调键扫 KEYSF:LCALL KEYSM JZ KEY1
单元
LCALL DISP ;调延时
SJMP KEYSF ;跳回判断键释放
KEY1: MOV 20H,B ;保存键值
FH: POP ACC
POP PSW
RET
;//***************独立式按键扫描***********************// KEYSM: MOV P1, #0FFH ;给P1口都送高电平 NOP
MOV A, P1 ;再把P1口的电平值送给A CPL A ;将A取反
RET
;//**************1ms延时子程序************************// DELAY1MS:PUSH PSW
MOV PSW, #08H
MOV R7, #01H
DL2: MOV R6, #8EH
DL3: MOV R5, #02H
DJNZ R5, $
DJNZ R6, DL3
DJNZ R7, DL2
POP PSW
RET
;//****************0.4s延时程序*******************// DELAY400MS: ;误差 0us
PUSH PSW
MOV PSW,#08H
MOV R7,#1DH
DL1: MOV R6,#46H
DL0: MOV R5,#61H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
POP PSW
RET
MAIN:DB 00H,08H,08H,08H,08H,08H,08H END