北京交大单片机课程设计电子密码锁设计报告.docx
《北京交大单片机课程设计电子密码锁设计报告.docx》由会员分享,可在线阅读,更多相关《北京交大单片机课程设计电子密码锁设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
北京交大单片机课程设计电子密码锁设计报告
单片机原理与应用
课程设计报告-电子密码锁
目录:
1密码锁简介:
2系统硬件电路设计
单片机电路图
显示电路图
键盘电路图
3芯片介绍
MAX7219的,管脚功能,操作指令,与单片机的连接
4程序设计框架
5在课程设计中遇到的困难及解决办法与心得体会
6程序
1,电子密码锁简介:
我使用MCS51系列单片机设计电路,运用汇编语言编程,达到用键盘输入密码,修改密码,报警并即时显示的目的。
MCS51系列单片机使用起来灵活,应用广泛。
它的直接并行互连具有一定的实用价值,能简化许多应用系统的硬件设计。
它还具有性能稳定、工作可靠、价格低廉等特点。
我是利用MCS51单片机系列AT89S52为依托,利用一块扩展4X4键盘输入密码,显示器采用MAX7219控制共阴极四位数码管和蜂鸣器。
最终使密码锁能够实现以下功能:
1、密码锁上电或复位后初始密码为0000,管理员密码是1105;
2、输入密码:
按“输入”键后可输入4位密码,按“确认”键后进行比较,当与设定密码或管理员密码一致时绿灯亮,输入正确;否则红灯亮,输入错误。
当连续3次输入错误时,红灯亮一段时间,期间发出报警的蜂鸣声,且键盘在此期间锁定。
10秒后退出报警系统,返回初始状态。
3、修改密码:
按“修改”键后,要先输入当前设定密码或管理员密码才可修改,否则退出修改模块。
当输入正确后,绿灯亮,可以修改密码。
首先输入4位数字,绿灯亮;然后再输入4位数字,当两次输入一致时,绿灯亮,修改成功。
否则,红灯亮,修改未成功,需要继续输入4位数字,只有连续输入的4位数字一致时,绿灯亮,修改成功。
退出修改密码模块。
4、存在的问题:
当复位或断电后,修改后的密码会丢失
电路设计图,包括电源,复位开关,单片机,和LED蜂鸣器
显示芯片与数码管的电路设计图
注意,这里我采用的4联共阴的数码管,所以要去掉两条线
键盘连接图,4X4
其中0-9是数字输入键,输入的是相应的数字,A为输入键,B为修改密码键,C为确认键。
3、主要芯片介绍
3.1MAX7219
MAX7219是一种高集成化的串行输入/输出的共阴极LED显示驱动器。
每片可驱动8位7段加小数点的共阴极数码管,可以数片级联,而与微处理器的连接只需3根线。
MAX7219内部设有扫描电路,除了更新显示数据时从单片机接收数据外,平时独立工作,极大地节省了MCU有限的运行时间和程序资源。
MAX7219芯片上包括BCD译码器、多位扫描电路、段驱动器、位驱动器和用于存放每个数据位的8×8静态RAM以及数个工作寄存器。
通过指令设置这些工作寄存器,可以使MAX7219进入不同的工作状态。
以下将从管脚功能、操作指令、与单片机的连接三个方面全面介绍MAX7219这个芯
3管脚功能:
(1)DIN为串行数据输入端。
当
CLK为上升沿时,数据被载入16b内部移位寄存器。
(2)CLK为串行时钟输入端。
其最大工作频率可达10MHz。
(3)LOAD为片选端,当LOAD为低电平时,芯片接收来自DIN的数据,接收完毕,LOAD回到高电平时,接收的数据将被锁定。
(4)DIG0~DIG7为吸收显示器共阴极电流的位驱动线。
其最大值可达500mA,关闭状态时,输出+VCC。
(5)SEGA~SEGG,DP为驱动显示器7段及小数点的输出电流,一般为40mA左右,可软件调整,关闭状态时,接入GND。
(6)DOUT为串行数据输出端,通常直接接入下片MAX7219的DIN端。
译码方式选择
操作代码为“09H”,操作数为“0”或“0FFH”。
选中“0”则不使用BCD译码器,在显示数字或符号时,按每段点亮与否编排传送码。
而选中“0FFH”时,则按8421标准二进制编码来代表相应的显示数字,如下:
显示内容
0
1
2
3
4
5
6
7
8
9
操作数(使用BCD译码)
00H
01H
02H
03H
04H
05H
06H
07H
08H
09H
操作数(不用BCD译码)
7EH
30H
6DH
79H
33H
5BH
5FH
70H
7FH
7BH
表1译码与不译码的比较
亮度调节选择
操作代码为“0AH”,这个指令可以用来调节显示器的亮度,改变其操作数可以改变MAX7219内部扫描脉冲的宽度,从而使电流的平均值有所变化,这个电流平均值可以从最小的1/32至最大的31/32之间进行16级调节,如表2所示。
操作数
00H
01H
02H
03H
04H
……
0CH
0DH
0EH
0FH
驱动电流
1/32
3/32
5/32
7/32
9/32
……
25/32
27/32
29/32
31/32
表2亮度调节操作数
扫描位数设定
操作代码为“0BH”,如果所用的显示器少于8位,则应通过这条
指令设置相应的位数。
因为设置的位数如果比实际使用的位数大,就会形成“虚位”,而一旦对“虚位”进行操作,将会引起整个显示器的混乱,另外,扫描位数的设置,会影响到扫描频率的变化,相应地,显示器亮度也会随着变化,所以应该先确定扫描位数,再设置显示器亮度.
如表3所示
操作数
00H
01H
02H
03H
04H
05H
06H
07H
扫描位数(位)
1
2
3
4
5
6
7
8
表3扫描位数设定操作数
待机开关
操作代码为“0CH”,操作数为“0”或“1”。
操作数为“0”,则显示器不工作(灭灯),反之,显示器正常工作。
待机状态下,7219的工作电流仅为150μA。
显示器检测
操作代码为“0FH”,操作数为“0”或“1”。
选择操作数为“1”时,可点亮整个显示器,通常用来检查数码管及连接电路是否存在故障。
检测时,不会改变各位原有的显示数据,即检测完毕后,再送入不检测指令“0”,又可恢复显示原数据。
位操作指令
位操作指令就是对8个数码管显示内容的操作,也是2个字节,第1个字节是位的代码,如表4所示,第2个字节则根据译码方式的选择来使用表1中的编码。
操作代码
01H
02H
03H
04H
05H
06H
07H
08H
位
1
2
3
4
5
6
7
8
表4位的代码
上述所有指令的输入,不分先后(但每个指令2个字节的秩序不能颠倒)。
通常,前5条指令一般在上电初始化程序中加以设置,而在工作程序中,仅使用位操作指令即可。
另外,MAX7219上电时,译码方式、亮度调节、扫描位数、待机开关、显示检测等5个控制寄存器全部归零。
3.1.3与单片机的连接
MAX7219与51单片机的连接形式有2种:
一种是将MAX7219的3个输入端DIN,CLK和LOAD与51单片机的任意3个端口连接;一种则是直接与51单片机的串行接口相连。
在此次实验中,我们采用第一种连接方式,以下将只介绍第一种方式。
4、程序流程图
5、在课程设计中遇到的困难及解决办法
从设计到焊板子过程中遇到了很多问题,最惨的是第一块板子,用万用表测电路一切正常,可是数码光就是死活不亮,不亮不亮不亮!
!
查了两个下午电路也没差出哪里错误,估计是元器件的问题,十分郁闷,结果以做快的速度重新焊了一个板子,结果一切正常,明明是完全一样的电路,可是一个好用一个不好用,!
在上电复位后,我发现不论按什么键,数码管都不能显示数字,经检查后才发现没有对MAX7219进行初始化,然后编了MAX7219的初始化程序,经调用后问题得到解决。
在蜂鸣器模块中,开始发现在程序没问题的情况下出不来想要的结果,进行研究后才发现三极管在功率放大的同时也起到了非门的作用,将蜂鸣器初值置1后问题得到解决。
做为指示的发光二极管指示时不太亮,经测量电压后测得单片机输出的电压较低,加了三极管对其进行功率放大后问题得到解决。
我开始时编写的程序只能进行密码的输入和修改,而且报警功能也不完善,后来经过与同学讨论后,加了一管理员密码并对报警模块进行了完善。
总之,过程十分艰难,不但联系了电工技巧,编程经验,就是对中发电子市场也是越来越熟悉…绝对是一次全身心,大脑和身体的全面锻炼和发展!
!
!
附件
源程序清单:
ORG0000H
DINBITP3.0;定义变量
CLKBITP3.1
LOADBITP3.2
AJMPMAIN
ORG0030H
MAIN:
MOVSP,#70H
SETBP3.5
SETBP3.6
SETBP3.7
LCALLPROCESS
M_Z:
MOVR1,#40H
MOVR2,#30H
M_Z1:
MOV@R1,#00H
INCR1
DJNZR2,M_Z1
MOVR1,#60H
LCALLDISPLAY
MOV55H,#01H
MOV56H,#01H
MOV57H,#00H
MOV58H,#05H
M_START:
LCALLSCAN;调用扫描程序
LCALLDELAY
MOVA,R1
CJNEA,#0EH,M_NEXT1
AJMPM_Z
M_NEXT1:
CJNEA,#0BH,M_NEXT2
AJMPINPUT
M_NEXT2:
CJNEA,#0CH,M_START
AJMPMODIFY1
SJMP$
;;;;;;;;;;;显示模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;MAX7219初始化子程序
PROCESS:
MOVA,#0BH;A中存入操作代码--扫描位数设定
MOVB,#03H;B中存入操作数--4位
LCALLW_7219
MOVA,#09H;译码方式选择
MOVB,#0FFH;使用BCD译码器
LCALLW_7219
MOVA,#0AH;亮度调节
MOVB,#09H;从最小的1/32至最大的31/32之间进行16级调节(00H-0FH)
LCALLW_7219
MOVA,#0CH;待机开关
MOVB,#01H;显示器正常工作
LCALLW_7219
RET
;把操作代码和操作数传送给MAX7219
W_7219:
CLRLOAD
LCALLSD_7219
MOVA,B
LCALLSD_7219
SETBLOAD
RET
;将8位数据传入MAX7219
SD_7219:
MOVR6,#08H
C_SD:
NOP
CLRCLK
RLCA
MOVDIN,C
NOP
SETBCLK
DJNZR6,C_SD
RET
;MAX7219显示子程序
DISPLAY:
MOVR4,#04H
MOVA,@R1
MOV21H,R1
MOV20H,A
ADDA,R1
MOVR0,A
C_DISP:
MOVA,@R0
MOVB,A
MOVA,R4
LCALLW_7219
DECR0
DEC@R1
DJNZR4,C_DISP
MOVR1,21H
MOVA,20H
MOV@R1,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;扫描模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;扫描程序
SCAN:
MOVR3,#0F7H;扫描初始值
MOVR1,#00H;取码数值
SCAN1:
MOVA,R3;开始扫描
LCALLMOVP;将扫描值输出到P
LCALLMOVA;读入P判断是否有按下
MOVR4,A;存到R4,判断是否放开
SETBC;C=1
MOVR5,#04H;扫描列
L1:
RLCA;将按键值左移一位元
JNCKEYIN;若C=0,有按,执行KEYIN
GO:
INCR1;将指标值加1,继续扫描下一行
DJNZR5,L1;扫描四行
MOVA,R3;载入扫描值
SETBC;C=1
RRCA;扫描下一行
MOVR3,A;存回扫描值
JCSCAN1;C=1,尚未完成扫描
AJMPSCAN;结束键盘扫描,回到SCAN
KEYIN:
MOVR7,#10消除弹跳
L2:
MOVR6,#248
DJNZR6,$
DJNZR7,L2
LCALLMOVA;读入P
XRLA,R4
JNZGO
INCR1
CJNER1,#0AH,L3
MOVR1,#00H
L3:
NOP
RET
;数值传递
MOVA:
RRCA
MOVC,P1.4
RRCA
MOVC,P1.5
RRCA
MOVC,P1.6
RRCA
MOVC,P1.7
RRCA
MOVC,P1.3
RRCA
MOVC,P1.2
RRCA
MOVC,P1.1
RRCA
MOVC,P1.0
RRCA
RET
MOVP:
RRCA
MOVP1.4,C
RRCA
MOVP1.5,C
RRCA
MOVP1.6,C
RRCA
MOVP1.7,C
RRCA
MOVP1.3,C
RRCA
MOVP1.2,C
RRCA
MOVP1.1,C
RRCA
MOVP1.0,C
RRCA
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;延时函数;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:
MOV40H,#20
DELAY1:
MOV41H,#100
DELAY2:
MOV42H,#100
DJNZ42H,$
DJNZ41H,DELAY2
DJNZ40H,DELAY1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;功能模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;输入模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INPUT:
LCALLCONFIRM
LCALLCOMP1
LJMPM_START
CONFIRM:
MOV50H,#04H
MOV60H,#00H
MOVR0,#61H
LOOP1:
LCALLSCAN
LCALLDELAY
MOVA,R1
MOV@R0,A
INCR0
INC60H
MOVR1,#60H
MOV6EH,R0
LCALLDISPLAY
MOVR0,6EH
DJNZ50H,LOOP1
LOOP2:
LCALLSCAN
MOVA,R1
CJNEA,#0DH,LOOP2
MOV60H,#00H
MOVR1,#60H
LCALLDISPLAY
RET
COMP1:
MOVA,61H
CJNEA,55H,NO0
MOVA,62H
CJNEA,56H,NO0
MOVA,63H
CJNEA,57H,NO0
MOVA,64H
CJNEA,58H,NO0
LCALLGREEN
LJMPTURN1
NO0:
MOVA,61H
CJNEA,51H,NO1
MOVA,62H
CJNEA,52H,NO1
MOVA,63H
CJNEA,53H,NO1
MOVA,64H
CJNEA,54H,NO1
LCALLGREEN
LJMPTURN1
NO1:
LCALLRED
INC4FH
MOVA,4FH
CJNEA,#03H,TURN1
MOV4FH,#00H
LCALLRING
TURN1:
NOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;修改模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODIFY1:
LCALLCONFIRM
LCALLCOMP3
MODIFY2:
LCALLCONFIRM
LCALLGREEN
MOV6AH,61H
MOV6BH,62H
MOV6CH,63H
MOV6DH,64H
LCALLCONFIRM
LCALLCOMP2
LJMPM_START
COMP2:
MOVA,61H
CJNEA,6AH,NO2
MOVA,62H
CJNEA,6BH,NO2
MOVA,63H
CJNEA,6CH,NO2
MOVA,64H
CJNEA,6DH,NO2
LCALLGREEN
MOV51H,61H
MOV52H,62H
MOV53H,63H
MOV54H,64H
LJMPTURN2
NO2:
LCALLRED
LJMPMODIFY2
TURN2:
NOP
RET
COMP3:
MOVA,61H
CJNEA,55H,NO4
MOVA,62H
CJNEA,56H,NO4
MOVA,63H
CJNEA,57H,NO4
MOVA,64H
CJNEA,58H,NO4
LCALLGREEN
LJMPTURN3
NO4:
MOVA,61H
CJNEA,51H,NO3
MOVA,62H
CJNEA,52H,NO3
MOVA,63H
CJNEA,53H,NO3
MOVA,64H
CJNEA,54H,NO3
LCALLGREEN
LJMPTURN3
NO3:
LCALLRED
INC5AH
MOVA,5AH
CJNEA,#03H,TURN4
LCALLRING
MOV5AH,#00H
TURN4:
LJMPM_START
TURN3:
NOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;绿灯模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GREEN:
CPLP3.5
LCALLDELAY
CPLP3.5
MOV4FH,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;红灯模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RED:
CPLP3.6
LCALLDELAY
CPLP3.6
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;报警模块;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RING:
CPLP3.6
CPLP3.7
MOV4AH,#200
SND1:
MOV4BH,#200
SND2:
MOV4CH,#250
DJNZ4CH,$
DJNZ4BH,SND2
DJNZ4AH,SND1
CPLP3.6
CPLP3.7
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END