单片机电子密码锁的设计.docx
《单片机电子密码锁的设计.docx》由会员分享,可在线阅读,更多相关《单片机电子密码锁的设计.docx(34页珍藏版)》请在冰豆网上搜索。
单片机电子密码锁的设计
单片机电子密码锁的设计
1.系统功能要求
通过学习的数电、模电、单片机原理的相关知识,利用所学的综合理论知识,设计单片机电子密码锁。
本系统由单片机系统、LCD显示器和报警系统等组成。
要求具有有键盘输入、LED数码管显示、开锁、超时报警基本的密码锁的功能,主要通过密码按键预设输入密码,,解锁后能通过按键手动复位,误输入密码三次后自动报警,鸣叫并退出,简单易懂、使用方便、安全性能高等。
2.设计方案描述
该方案采用一种是用以AT89C52为核心的单片机控制方案。
这样单片机可具有足够的空余硬件资源实现其它的扩充功能,利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,实现最基本的密码锁功能。
其原理如图2-1所示。
AT89C52
单片机
密码输入错误退出
延时报警控制电路
键盘输入
LCD显示模块
图2-1单片机控制方案
3.系统硬件的设计
单片机电子密码锁的总电路图如图3.1。
该设计是用以AT89C52单片机为中心。
在这个设计中有8位LCD数码管的数字显示,采用的是行列键盘,比较简单易操作。
图3-1
3.1.行列键盘的设计
各按键功能为P1.0-P1.7为"0"-"7"数字键,P3.0为"8"键,P3.4为"9"键,P3.1为开锁开始键,P3.2为重输键,P3.3确认键。
p3.6时间设定,长按住为"分调整"-"时调整"-退出,短按为省电-分加1-时加1,P3.5为分或时减1,P3.7为小喇叭口。
本设计采用行列设计如图3—1—1。
图3—1—1
3.2.单片机系统
设计采用的是AT89C52单片机如图3—2—2。
该单片机性能稳定性高,成本低。
单片机引脚接口P1.0到P1.7分别接到LCD显示数码管,P2.0到P2.7通过放大器分别接到LCD数码管的另一端。
都是作为数码管显示电路输入端口,使得数码管显示各功能的结果。
图3-2—2单片机系统
3.3.报警电路的设计
报警电路图如图3—3—3所示。
密码输入值的比较主要有两个部分,密码位数与内容,任何一个条件不满足,都会产生出错信息。
利用设定的行列键盘输入密码并确认,如果连续三次出错,就会出现报警信息,LCD显示出错信息,蜂鸣器鸣叫,P3.7口红灯亮并退出开锁程序。
图3-3—3报警系统电路图
4.系统软件的设计
4.1.主程序
主程序流程图如图4-1
图4-1
4.2.键盘扫描的设计
键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。
4.3.开锁报警程序的设计
报警功能程序的设计方法:
设置40H-45H为原始密码存放单元(预设为123456),06H为开锁状态标志,=1为开锁状态,=0为时钟状态。
按下P3.1,确定开锁键,等待开锁开始,利用P1.0到P1.7,P3.0,P3.4数字键输入6位密码,密码输入完毕,然后按P3.3确定键。
输入正确则开锁。
当连续三次输入密码出错时,则会出现报警信息并退出开锁程序。
其程序流程如图所示4—3.
图4—3
5.系统调试
5.1.硬件调试
硬件调试时可先检查印制板及焊接的质量情况,在检查无误后可通电检查LCD显示器的点亮状况,若亮度不理想可以调整P0口的电阻大小,一般情况下取200Ω电阻即可获得满意的亮度效果。
实验室制作时可结合示波器测试晶振及P0、P2端口的波形情况进行综合硬件测试分析。
5.2.软件调试
软件调试在Wave或KeilC51编译器下进行,源程序编译及仿真调试应分段或以子程序为单位一个一个进行,最后可结合硬件实时调试。
5.3.性能分析
由于计时中断程序中加了中断延时误差处理,所以实际计时的走时精度非常高,可满足多种场合的应用需要,另外上电时具有一个滚动显示子程序,可以方便显示制作日期等信息。
6.结论
该电子密码锁充分利用了51单片机软,硬件资源,具有开锁,三次密码错误自动退出的功能。
如果能引入了智能化分析功能,提高了系统的可靠性和安全性,应用于生活中,那将会给人们省去了用传统锁的麻烦与不安全性。
另外通过学习并设计单片机电子密码锁,使自己对课本上的知识可以应用于实际,使得理论与实际相结合,加深了自己对课本知识的更好理解。
对我们学生来说,理论与实践同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
7.参考文献
[1]楼然苗,李光飞.51系列单片机设计实例(第2版)[M].北京:
北就航空航天大学出版社,2006.02.
[2]李光飞等.单片机课程设计实例指导[M].北京:
北就航空航天大学出版社,2004.09.
[3]何立民.MCS-51单片机应用系统设计[M].北航出版社,1990年
[4]霍孟友,王爱群.单片机原理与应用——学习概要及题解[M].机械工业出版社,2005年
李群芳等《单片微型计算机及接口技术》,电子工业出版社
[5]李广弟编,单片机基础.北京航天航天大学出版社,2001
程序
;;;;;;;;;;;;;;;;;;;;*****************************************************;;;;;;;;;;;;;;;;;;;;;
;;STC89C52RC时钟\密码锁演示程序;
;;使用新时钟电路实验板式;
;;;;;;;;;;;;;;;;;;;;******************************************************;;;;;;;;;;;;;;;;;;;;
;*********************************************************************************************;
;p3.6时间设定,长按住为"分调整"-"时调整"-退出,短按为省电-分加1-时加1,P3.5为分或时减1;
;P3.7为小喇叭口,采用共阳显示管,50H-55H为密码输入存放单元,60H-65H为开锁时倒计时单元;
;40H-45H为原始密码存放单元(预设为123456),70H-75H为显示时间单元,76H-79H为分时计时单元;
;06H为开锁状态标志,=1为开锁状态,=0为时钟状态;
;P1.0-P1.7为"0"-"7"数字键,P3.0为"8"键,P3.4为"9"键,P3.1为开锁开始键,P3.2为重输键,P3.3确认键;
;*********************************************************************************************;
DISPFIRSTEQU30H;显示首址存放单元
BELLEQUP3.7;小喇叭或蜂呜器
KSCONEQU2EH;存放开锁次数
SONGCONEQU31H;唱歌程序计数器
CONR2EQU32H;以下唱歌程序用寄存器
CONR3EQU33H
CONR4EQU34H
CONR6EQU36H
CONR7EQU37H
CONR5EQU35H;以上唱歌程序寄存器
DELAYR3EQU38H;以下延时程序用寄存器
DELAYR5EQU39H;
DELAYR6EQU3AH;
DELAYR7EQU3BH;
;
;****************************************
;;中断入口程序;;
;****************************************
;
ORG0000H;程序执行开始地址
LJMPSTART;跳到标号START执行
ORG0003H;外中断0中断程序入口
RETI;外中断0中断返回
ORG000BH;定时器T0中断程序入口
LJMPINTT0;跳至INTTO执行
ORG0013H;外中断1中断程序入口
RETI;外中断1中断返回
ORG001BH;定时器T1中断程序入口
LJMPINTT1;跳至INTT1执行
ORG0023H;串行中断程序入口地址
RETI;串行中断程序返回
;
;****************************************
;;以下程序开始;;
;****************************************
;开锁程序进入
DJS:
LCALLDS20MS
JBP3.1,START1;
WAITH111:
LCALLDISPLAY
JNBP3.1,WAITH111;等待键释放
MOVKSCON,#3;允许三次开锁
LJMPDJSST
;****************************************
;;主程序开始;;
;****************************************
;
START:
MOVSP,#80H;堆栈在80H以上
LCALLSTMEN;时钟程序初始化子程序
SETBEA;总中断开放
SETBET0;允许T0中断
SETBTR0;开启T0定时器
MOVR4,#14H;1秒定时用计数值(50MS×20)
MOVDISPFIRST,#70H;显示单元为70-75H
;LCALLMUSIC0;唱歌测试程序
;以下主程序循环
START1:
LCALLDISPLAY;调用显示子程序
JNBP3.6,SETMM1;P3.6口为0时转时间调整程序
JNBP3.1,DJS;启动开锁
AJMPSTART1;P3.6口为1时跳回START1
;
SETMM1:
LJMPSETMM;转到时间调整程序SETMM
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;1秒计时程序;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;T0中断服务程序
INTT0:
PUSHACC;累加器入栈保护
PUSHPSW;状态字入栈保护
CLRET0;关T0中断允许
CLRTR0;关闭定时器T0
MOVA,#0B7H;中断响应时间同步修正
ADDA,TL0;低8位初值修正
MOVTL0,A;重装初值(低8位修正值)
MOVA,#3CH;高8位初值修正
ADDCA,TH0;
MOVTH0,A;重装初值(高8位修正值)
SETBTR0;开启定时器T0
SETBP3.6
SETBP3.5
DJNZR4,OUTT0;20次中断未到中断退出
ADDSS:
MOVR4,#14H;20次中断到(1秒)重赋初值
CPL07H;闹铃时间隔呜叫用
MOVR0,#71H;指向秒计时单元(71H-72H)
ACALLADD1;调用加1程序(加1秒操作)
MOVA,R3;秒数据放入A(R3为2位十进制数组合)
CLRC;清进位标志
CJNEA,#60H,ADDMM;
ADDMM:
JCOUTT0;小于60秒时中断退出
ACALLCLR0;大于或等于60秒时对秒计时单元清0
MOVR0,#77H;指向分计时单元(76H-77H)
ACALLADD1;分计时单元加1分钟
MOVA,R3;分数据放入A
CLRC;清进位标志
CJNEA,#60H,ADDHH;
ADDHH:
JCOUTT0;小于60分时中断退出
ACALLCLR0;大于或等于60分时分计时单元清0
LCALLDS20MS;正点报时
SETB08H
MOVR0,#79H;指向小时计时单元(78H-79H)
ACALLADD1;小时计时单元加1小时
MOVA,R3;时数据放入A
CLRC;清进位标志
CJNEA,#24H,HOUR;
HOUR:
JCOUTT0;小于24小时中断退出
ACALLCLR0;大于或等于24小时小时计时单元清0
OUTT0:
MOV72H,76H;中断退出时将分、时计时单元数据移
MOV73H,77H;入对应显示单元
MOV74H,78H;
MOV75H,79H;
POPPSW;恢复状态字(出栈)
POPACC;恢复累加器
SETBET0;开放T0中断
RETI;中断返回
;
;****************************************
;;闪动调时程序\秒表功能程序;;
;****************************************
;T1中断服务程序,用作时间调整时调整单元闪烁指示或秒表计时
INTT1:
PUSHACC;中断现场保护
PUSHPSW;
JB09H,SPCC
JB06H,DJSFUN
JB03H,MMFUN;=1时秒表
MOVTL1,#0B0H;装定时器T1定时初值
MOVTH1,#3CH;
DJNZR2,INTT1OUT;0.3秒未到退出中断(50MS中断6次)
MOVR2,#06H;重装0.3秒定时用初值
CPL02H;0.3秒定时到对闪烁标志取反
JB02H,FLASH1;02H位为1时显示单元"熄灭"
MOV72H,76H;02H位为0时正常显示
MOV73H,77H;
MOV74H,78H;
MOV75H,79H;
INTT1OUT:
POPPSW;恢复现场
POPACC;
RETI;中断退出
FLASH1:
JB01H,FLASH2;01H位为1时,转小时熄灭控制
MOV72H,7AH;01H位为0时,"熄灭符"数据放入分
MOV73H,7AH;显示单元(72H-73H),将不显示分数据
MOV74H,78H;
MOV75H,79H;
AJMPINTT1OUT;转中断退出
FLASH2:
MOV72H,76H;01H位为1时,"熄灭符"数据放入小时
MOV73H,77H;显示单元(74H-75H),小时数据将不显示
MOV74H,7AH;
MOV75H,7AH;
AJMPINTT1OUT;转中断退出
;
SPCC:
INCSONGCON;中断服务,中断计数器加1
MOVTH1,#0D8H
MOVTL1,#0EFH;12M晶振,形成10毫秒中?
AJMPINTT1OUT;
DJSFUN:
LJMPDJSS
MMFUN:
CLRTR1
MOVA,#0F7H;中断响应时间同步修正,重装初值(10ms)
ADDA,TL1;低8位初值修正
MOVTL1,A;重装初值(低8位修正值)
MOVA,#0D8H;高8位初值修正
ADDCA,TH1;
MOVTH1,A;重装初值(高8位修正值)
SETBTR1;开启定时器T0
MOVR0,#61H;指向秒计时单元(71H-72H)
ACALLADD1;调用加1程序(加1秒操作)
CLRC;
MOVA,R3;
JZFSS1;加1后为00,C=0
AJMPOUTT01;加1后不为00,C=1
FSS1:
ACALLCLR0;大于或等于60秒时对秒计时单元清0
MOVR0,#63H;指向分计时单元(76H-77H)
ACALLADD1;分计时单元加1分钟
MOVA,R3;分数据放入A
CLRC;清进位标志
CJNEA,#60H,ADDHH1;
ADDHH1:
JCOUTT01;小于60分时中断退出
LCALLCLR0;大于或等于60分时分计时单元清0
MOVR0,#65H;指向小时计时单元(78H-79H)
ACALLADD1;小时计时单元加1小时
OUTT01:
POPPSW;恢复状态字(出栈)
POPACC;恢复累加器
RETI;中断返回;
;****************************************
;;加1子程序;;
;****************************************
;
;
ADD1:
MOVA,@R0;取当前计时单元数据到A
DECR0;指向前一地址
SWAPA;A中数据高四位与低四位交换
ORLA,@R0;前一地址中数据放入A中低四位
ADDA,#01H;A加1操作
DAA;十进制调整
MOVR3,A;移入R3寄存器
ANLA,#0FH;高四位变0
MOV@R0,A;放回前一地址单元
MOVA,R3;取回R3中暂存数据
INCR0;指向当前地址单元
SWAPA;A中数据高四位与低四位交换
ANLA,#0FH;高四位变0
MOV@R0,A;数据放入当削地址单元中
RET;子程序返回
;
;****************************************
;;分减1子程序;;
;****************************************
;
SUB1:
MOVA,@R0;取当前计时单元数据到A
DECR0;指向前一地址
SWAPA;A中数据高四位与低四位交换
ORLA,@R0;前一地址中数据放入A中低四位
JZSUB11
DECA;A减1操作
SUB111:
MOVR3,A;移入R3寄存器
ANLA,#0FH;高四位变0
CLRC;清进位标志
SUBBA,#0AH
SUB1111:
JCSUB1110
MOV@R0,#09H;大于等于0AH,为9
SUB110:
MOVA,R3;取回R3中暂存数据
INCR0;指向当前地址单元
SWAPA;A中数据高四位与低四位交换
ANLA,#0FH;高四位变0
MOV@R0,A;数据放入当削地址单元中
RET;子程序返回
;
SUB11:
MOVA,#59H
AJMPSUB111
SUB1110:
MOVA,R3;移入R3寄存器
ANLA,#0FH;高四位变0
MOV@R0,A
AJMPSUB110
;****************************************
;;时减1子程序;;
;****************************************
;
SUBB1:
MOVA,@R0;取当前计时单元数据到A
DECR0;指向前一地址
SWAPA;A中数据高四位与低四位交换
ORLA,@R0;前一地址中数据放入A中低四位
JZSUBB11;00减1为23(小时)
DECA;A减1操作
SUBB111:
MOVR3,A;移入R3寄存器
ANLA,#0FH;高四位变0
CLRC;清进位标志
SUBBA,#0AH;时个位大于9为9
SUBB1111:
JCSUBB1110;
MOV@R0,#09H;大于等于0AH,为9
SUBB110:
MOVA,R3;取回R3中暂存数据
INCR0;指向当前地址单元
SWAPA;A中数据高四位与低四位交换
ANLA,#0FH;高四位变0
MOV@R0,A;时十位数数据放入
RET;子程序返回
;
SUBB11:
MOVA,#23H
AJMPSUBB111
SUBB1110:
MOVA,R3;时个位小于0A不处理
ANLA,#0FH;高四位变0
MOV@R0,A;个位移入
AJMPSUBB110
;****************************************
;;清零程序;;
;****************************************
;对计时单元复零用
CLR0:
CLRA;清累加器
MOV@R0,A;清当前地址单元
DECR0;指向前一地址
MOV@R0,A;前一地址单元清0
RET;子程序返回
;
;****************************************
;;时钟时间调整程序;;
;****************************************
;当调时按键按下时进入此程序
SETMM:
cLRET0;关定时器T0中断
CLRTR0;关闭定时器T0
LCALLDL1S;调用1秒延时程序
LCALLDS20MS;消抖
JBP3.6,CLOSEDIS;键按下时间小于1秒,关闭显示(省电)
MOVR2,#06H;进入调时状态,赋闪烁定时初值
MOV70H,#00H;调时时秒单元为00秒
MOV71H,#00H
SETBET1;允许T1中断
SETBTR1;开启定时器T1
SET2:
JNBP3.6,SET1;P3.6口为0(键未释放),等待
SETB00H;键释放,分调整闪烁标志置1
SET4:
JBP3.6,SET3;等待键按下
LCALLDL05S;有键按下,延时0.5秒
LCALLDS20MS;消抖
JNBP3.6,SETHH;按下时间大于0.5秒转调小时状态
MOVR0,#77H;按下时间小于0.5秒加1分钟操作
LCALLADD1;调用加1子程序
MOVA,R3;取调整单元数据
CLRC;清进位标志
CJNEA,#60H,HHH;调整单元数据与60比较
HHH:
JCSET4;调整单元数据小于60转SET4循环
LCALLCLR0;调整单元数据大于或等于60时清0
CLRC;清进位标志
AJMPSET4;跳转到SET4循环
CLOSEDIS:
SETBET0;省电(LED不显示)状态。
开T0中断
SETBTR0;开启T0定时器(开时钟)
CLOSE:
JBP3.6,CLOSE;无按键按下,等待。
LCALLDS20MS;消抖
JBP3.6,CLOSE;是干扰返回CLOSE等待
WAITH:
JNBP3.6,WAITH;等待键释放
LJMPSTART1;返回主程序(