电子密码锁proteus仿真设计报告.docx
《电子密码锁proteus仿真设计报告.docx》由会员分享,可在线阅读,更多相关《电子密码锁proteus仿真设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
![电子密码锁proteus仿真设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/28/a4b6a1f1-3b94-4834-88a6-ea9598d7b379/a4b6a1f1-3b94-4834-88a6-ea9598d7b3791.gif)
电子密码锁proteus仿真设计报告
中国海洋大学
———单片机课程实验设计报告
设计题目:
电子锁密码proteus仿真计姓名:
班级:
学号:
任课教师:
课时:
一、实验设计功能描述
本设计采用单片机为主控芯片,结合外围电路,组成**电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。
密码可以由用户自己修改设定,锁打开后才能修改密码。
修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
二、设计所用原器件
主控芯片AT89S51、4*4矩阵按键、LCD1602显示器、蜂鸣器、24c04a芯片、存储芯片AT24C02、晶体振荡器
三、硬件电路设计
1、键盘输入部分
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。
采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。
2、密码存储部分
用EPROM芯片AT24C02存储密码。
AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,内含256×8位存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)、抗干扰能力强、数据不易丢失、体积小等特点。
而且他是采用了I2C总线式进行数据读写的串行器件,占用很少的资源和I/O线,并且支持在线编程,进行数据实时的存取十分方便。
3、晶振部分
AT89S51引脚XTAL1和XTAL2与晶体振荡器及电容C2、C1按图4.5所示方式连接。
晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz之间,电容C1、C2取值范围在5~30pF之间。
根据实际情况,本设计中采用12MHZ做为系统的外部晶振。
电容取值为20pF。
4、显示部分
为了提高密码锁的密码显示效果能力。
本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。
只有按下键盘上的开启按键后,显示器才处于开启状态。
同理只有按下关闭按键后显示器才处于关闭状态。
否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。
5、报警部分
报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下时,“叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的P2.1引脚为低电平,三极管T3导通轰鸣器发出噪鸣声报警。
6、开锁部分
开锁控制电路的功能是当输入正确的密码后将锁打开。
系统使用单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开。
用户通过键盘任意设置密码,并储存在EEPROM中作为锁码指令。
四、软件设计
本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键功能程序、密码设置程序、EEPROM读写程序和延时程序等组成。
主要程序设计流程图如下所示:
五、仿真抓图
1、输入原始密码:
2.输入正确:
3.输入错误:
六、设计体会
设计刚开始时,我感到茫然不知从何下手,对程序的总体思路也缺乏了解。
后来在老师的指导下,渐渐有了思路知道大体的框架。
之后又参考了有关的书籍和资料,慢慢的经过两三周的时间才把程序调试好,理清仿真图的出口与入口。
在仿真方面因为程序的思路都理清了,所以只要按要求调用器件连接好电路,并且与KILL软件进行互接,功能比较顺利的就实现了,没有出现太大的问题。
设计很小,可是在这过程中我学会了很多课本上学不到的知识。
也明白书本的知识永远不够,我们自己要学会自学。
同时对于学工科的学生还是要多多动手,在调试硬件时很多东西是要靠经验来检查电路的问题,而且动手经验也可以免去很多不必要的错误。
七、设计程序
ORG0000h;
LJMPstart;
ORG000bh;中断T0入口地址
LJMPintermit_t0;调用中断服务程序清指示灯
ORG001bh;中断T1入口地址
LJMPintermit_t1;初始化喇叭
ORG0030h;
start:
MOVsp,#60h;设栈底
lcallsys_initialization;调用系统
初始化程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;主程序
main0:
lcallstrat_display;液晶最初显示的程序
main:
MOV52h,#0;52h判断输入错误次数储存地址
setbled;使指示灯处于亮的状态
setbtr0;开启定时器
lcallkey;扫描键值
cjnea,#'A',next1;输入A设置密码
LJMPset_password;设置密码程序
next1:
cjnea,#'B',next2;输入B输入密码
LJMPinput_password;输入密码程序
next2:
ajmpmain;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;系统初始化
sys_initialization:
clrled;使指示灯处于初始灭的状态
clropen;继电器的初始化
clrspeaker;喇叭的初始化
MOV34h,#'1';
MOV35h,#'2';
MOV36h,#'3';
MOV37h,#'4';
MOV38h,#'5';
MOV39h,#'6';34h~39h存放初始密码
MOVr7,#12;
MOVr0,#40h;设置新密码存储的首地址
loop:
MOV@r0,#10h;
incr0;
djnzr7,loop;密码键值存放区清零完毕
lcalldelay0_1s;
MOVp0,#03h;液晶的控制代码
callwrite_instruction;液晶软复位
MOVp0,#01h;
callwrite_instruction;清屏
MOVp0,#3fh;设置单片机与LCD接口数据位为8位
;显示行数为2行,字型为5*10
callwrite_instruction;
MOVp0,#0fh;整体开显示,显示光标光标字符位烁
callwrite_instruction;
MOVp0,#06h;光标右移整体显示不移动
UnRegistered
callwrite_instruction;液晶初始化
完毕
MOVr4,#10;
MOVtmod,#11h;
MOVth0,#3ch;
MOVtl0,#0b0h;
setbea;允许开中断
setbet0;定时器T0,0.5S定时中断初始化完毕
ret;系统初始化完毕
;;;;;;;;;;;;;;;;;;;;;;中断服务程序
intermit_t0:
pushacc;
pushpsw;
MOVth0,#3ch;
MOVtl0,#0b0h;初值的设置
MOVr4,#10;
djnzr4,return;
cplled;
return:
poppsw;
popacc;
reti;
intermit_t1:
pushacc;
pushpsw;
MOVth1,#9eh;
MOVtl1,#58h;初值设置
djnzr4,return_t1;
cplled;
cplspeaker;
MOVr4,#10;
return_t1:
poppsw;
popacc;
reti;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;键盘扫描;;;;;;;
key:
callks;调用行扫描程序
jnzk1;判断是否有按键按下,若A不等于0按键按下
jmpkey;A等于零再次扫描取值
k1:
calldelay;调用延时子程序
callks;调用扫描程序
jnzk2;
jmpkey;
k2:
clrtr0;关闭计时器
clrled;
MOVr2,#0feh;行扫描初值为"0FE",
从0行开始逐行扫描
MOVr6,#00h;设置行号初始值为"00"
k3:
MOVa,r2;取行扫描字
MOVp2,a;行扫描字送至P2口
MOVa,p2;到P2取值
jbacc.4,l1;判断A取列值,第0列有键按下吗?
若
;ACC.4=0说明有按键按下
MOVa,#0;将第0列首号"00"送到A
LJMPlk;转至键号计算程序
l1:
jbacc.5,l2;第1列有键按下吗?
若ACC.5=0说明有
;按键按下
MOVa,#4;将第1列首号"04"送到A
LJMPlk;转至键号计算程序
l2:
jbacc.6,l3;第2列有键按
下吗?
若ACC.6=0说明有按键按下
MOVa,#8;将第2列首号"08"送到A
LJMPlk;转至键号计算程序
l3:
jbacc.7,next_key;第3列有键按下吗?
若ACC.7=0
;说明有按键按下
MOVa,#12;将第3列首号"12"送到A
lk:
adda,r6;按键号=行号+列首号
(A)
MOVr6,a;
k4:
callks;调用扫描子程序(等待按键释放)
jnzk4;
MOVa,r6;
MOVdptr,#table0;
MOVca,@a+dptr;
MOV50h,a;查表取值存入50h,保护键值
ret;
next_key:
incr6;行号加1
MOVa,r2;行扫描字送至A
jnbacc.7,key;判断4行都扫描完了
UnRegistered
rla;若未扫描完将行扫描字左移
MOVr2,a;行扫描字送至R2,为扫描下一行做准备
jmpk3;循环继续扫描下一行
;;;;;;;;;;;;;;;;;;;;;;;;;;
ks:
MOVp2,#0f0h;送初值到P2口进行扫描,将列线P2.4~P2.7设置为低电平
MOVa,p2;将扫描的值输入A
xrla,#0f0h;屏蔽与行按键无关的4
位,有任意键按下时,A不等于0
ret;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;设置密码程序
set_password:
callclear_display;调用LCD清零显示程序
MOVdptr,#table4;查表液晶显示
'INPUTPASSWROD:
'
callinput_hint;LCD显示要显示的信息
MOVr0,#40h;输入密码的储存首地址
callpassword;调用原始密码
jbcreturnbit,set_password;先输入原密码完毕
MOVr5,#6;
MOVr0,#40h;输入的密码的首地址
MOVr1,#34h;原始密码的首地址
input_compere:
MOVa,@r0;
xrla,@r1;用异或进行比较输入密码和原密码
jnzinput_error;输入密码与原密码不一致时跳至input_error
incr0;
incr1;
nop;
nop;
djnzr5,input_compere;验证输入密码完毕
jmpset_password0;
input_error:
setbspeaker;蜂鸣器响
setbled;指示灯亮
callclear_display;清屏
MOVdptr,#table5;查表显示
'PASSWORDERROR!
'
callinput_hint;
calldelay1_5s;
clrspeaker;关蜂鸣器
clrled;指示灯灭
inc52h;密码错误次数加1
MOVa,52h;
cjnea,#3,set_password;
sjmp$;输入密码错误次数超过3次,锁死
set_password0:
callclear_display;清屏
MOVdptr,#table2;显示设置密码信息
callinput_hint;调用LCD显示程序
MOVr0,#40h;
callpassword;输入密码显示程序
jbcreturnbit,set_password;;第一次输入新密码完毕
callclear_display;清屏
MOVdptr,#table3;提示再次输入密码信息
callinput_hint;LCD显示
calldelay1_5s;延时
;显示再次输入新密码完毕
callclear_display;清屏
MOVdptr,#table4;提示输入密码信息
callinput_hint;调用LCD显示程序
MOVr0,#46h;第二次输入密码的首地址
callpassword;
jbcreturnbit,set_password;;第二次输入新密码完毕
MOVr5,#6;
MOVr0,#40h;
MOVr1,#46h;
set_compere:
MOVa,@r0;
xrla,@r1;
jnzset_error;显示设置错误信息
incr0;
incr1;
UnRegistered
djnzr5,set_compere;
MOV34h,40h;
MOV35h,41h;
MOV36h,42h;
MOV37h,43h;
MOV38h,44h;
MOV39h,45h;
;存入新密码完毕jmpmain0;;设置新密码成功,返主程序
set_error:
setbspeaker;蜂鸣器响
setbled;指示灯亮
callclear_display;清屏
MOVdptr,#table5;
callinput_hint;
calldelay1_5s;
clrspeaker;蜂鸣器关
clrled;指示灯灭
LJMPset_password0;;前后两次输入
新密码不一致,返回重设
;;;;;;;输入密码开锁程序
input_password:
callclear_display;清屏
MOVdptr,#table4;查表显示'INPUT
PASSWROD:
'
callinput_hint;调用显示程序
MOVr0,#40h;
callpassword;调用原密码
jbcreturnbit,input_password;;输
入原密码完毕
MOVr5,#6;
MOVr0,#40h;输入密码的首地址
MOVr1,#34h;原始密码的首地址
input_compere0:
MOVa,@r0;
xrla,@r1;用异或判断输入密码是否
与原始密码一样
jnzinput_error22;判断密码有误
incr0;
incr1;
nop;
nop;
djnzr5,input_compere0;;验证输入码完毕
jmpdisplay_right;调用密码正确息
input_error22:
setbspeaker;蜂鸣器响
setbled;指示灯亮
callclear_display;清屏
MOVdptr,#table5;调用密码错误的显示信息
callinput_hint;显示子程序
calldelay1_5s;延时
clrspeaker;蜂鸣器关
clrled;指示灯灭
inc52h;输入密码次数加1
MOVa,52h;
cjnea,#3,input_password;
sjmp$;;输入密码错误超过3次,锁死
display_right:
callclear_display;清屏
MOVdptr,#table6;密码正确显示信息
callinput_hint;;显示输入密码正确提示完毕
setbopen;开锁
next_key1:
callkey;
nop;
nop;
cjnea,#'F',next_key1;
clropen;按下关锁键,关锁
jmpmain0;返回主程序
;;;;;;;;;;;;;主程序的子程序
strat_display:
MOVp0,#80h;第一行显示地址
callwrite_instruction;调用写指令程序
MOVdptr,#table1;
callinput_hint;调用显示子程序
MOVp0,#0c0h;第二行显示地址
callwrite_instruction;调用写指令程序
MOVdptr,#table11;
callinput_hint;调用显示子程序
ret;
clear_display:
MOVdisplay,#01h;LCD屏幕清零
callwrite_instruction;
MOVp0,#06h;
callwrite_instruction;
ret;
input_hint:
MOVr5,#16;要显示的字符个数(液晶行为16位)
MOVa,#00h;查询的初值
all_or_not:
MOVca,@a+dptr;
MOVdisplay,a;
callwritedata;调用写数据
incdptr;
clra;
nop;
nop;
djnzr5,all_or_not;
ret;
password:
MOVr5,#6;密码个数
MOVr1,#0c0h;LCD第二行显示地址
MOVa,r1;
MOVp0,a;
callwrite_instruction;调用LCD初
始化程序
loop1:
callkey;
nop;
nop;
cjnea,#'C',next_to;如果按键为C
时,按键标志为1
setbreturnbit;2.0位置一
jmpendt;
next_to:
MOVa,50h;
MOV@r0,a;
MOVdisplay,#'*';a;输入
键盘的密码值显示为"*"
callwritedata;调用写数
据指令初始化程序
incr1;
incr0;
djnzr5,loop1;
endt:
ret;
;;;;;;写数据指令
writedata:
SETBrs;选择数据寄存
器
CLRrw;选择写操作
clren;使能端初始化
setben;使能端置1
nop;
nop;
clren;
calldelay;
ret;
;;;;;写指令
write_instruction:
CLRrs;选择指令寄存器
CLRrw;选择写操作
clren;使能端初始化
setben;使能端置1
nop;
nop;
clren;
calldelay;调用延时子程序
ret;
;;;;;;;;;;;;延时程序
delay1_5s:
push07h;
push02h;
push03h;
MOVr7,#15;
del22s:
MOVr3,#0;
del11s:
MOVr2,#0;
djnzr2,$;
djnzr3,del11s;
djnzr7,del22s;
pop03h;
pop02h;
pop07h;
ret;
delay0_1s:
push02h;
push03h;
MOVr3,#0;
del21s:
MOVr2,#0;
nop;
nop;
djnzr2,$;
djnzr3,del21s;
pop03h;
pop02h;
ret;
delay:
push07h;
push06h;
MOVr7,#10;
d1:
MOVr6,#248;
nop
nop
djnzr6,$;
djnzr7,d1;
pop06h;
pop07h;
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:
ASET';
table11:
db'BOPEN';
table2:
db'SETPASSWORD:
';
table3:
db'INPUTAGAIN!
';
table4:
db'INPUTPASSWROD:
';
table5:
db'PASSWORDERROR!
';
table6:
db'PASSWORDOK!
!
!
';
;;;;;;;;;;;;;;;;;
end