电子密码锁proteus仿真设计报告Word文件下载.docx
《电子密码锁proteus仿真设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《电子密码锁proteus仿真设计报告Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
电容取值为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;
清屏
MOVp0,#3fh;
设置单片机与LCD接口数据位为8位
;
显示行数为2行,字型为5*10
MOVp0,#0fh;
整体开显示,显示光标光标字符位烁
MOVp0,#06h;
光标右移整体显示不移动
UnRegistered
液晶初始化
完毕
MOVr4,#10;
MOVtmod,#11h;
MOVth0,#3ch;
MOVtl0,#0b0h;
setbea;
允许开中断
setbet0;
定时器T0,0.5S定时中断初始化完毕
ret;
系统初始化完毕
中断服务程序
intermit_t0:
pushacc;
pushpsw;
初值的设置
djnzr4,return;
cplled;
return:
poppsw;
popacc;
reti;
intermit_t1:
MOVth1,#9eh;
MOVtl1,#58h;
初值设置
djnzr4,return_t1;
cplspeaker;
return_t1:
poppsw;
键盘扫描;
key:
callks;
调用行扫描程序
jnzk1;
判断是否有按键按下,若A不等于0按键按下
jmpkey;
A等于零再次扫描取值
k1:
calldelay;
调用延时子程序
callks;
调用扫描程序
jnzk2;
k2:
clrtr0;
关闭计时器
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列首号"
送到A
LJMPlk;
转至键号计算程序
l1:
jbacc.5,l2;
第1列有键按下吗?
若ACC.5=0说明有
按键按下
MOVa,#4;
将第1列首号"
04"
l2:
jbacc.6,l3;
第2列有键按
下吗?
若ACC.6=0说明有按键按下
MOVa,#8;
将第2列首号"
08"
l3:
jbacc.7,next_key;
第3列有键按下吗?
若ACC.7=0
;
说明有按键按下
MOVa,#12;
将第3列首号"
12"
lk:
adda,r6;
按键号=行号+列首号
(A)
MOVr6,a;
k4:
调用扫描子程序(等待按键释放)
jnzk4;
MOVa,r6;
MOVdptr,#table0;
MOVca,@a+dptr;
MOV50h,a;
查表取值存入50h,保护键值
next_key:
incr6;
行号加1
行扫描字送至A
jnbacc.7,key;
判断4行都扫描完了
rla;
若未扫描完将行扫描字左移
MOVr2,a;
行扫描字送至R2,为扫描下一行做准备
jmpk3;
循环继续扫描下一行
ks:
MOVp2,#0f0h;
送初值到P2口进行扫描,将列线P2.4~P2.7设置为低电平
将扫描的值输入A
xrla,#0f0h;
屏蔽与行按键无关的4
位,有任意键按下时,A不等于0
设置密码程序
set_password:
callclear_display;
调用LCD清零显示程序
MOVdptr,#table4;
查表液晶显示
'
INPUTPASSWROD:
'
callinput_hint;
LCD显示要显示的信息
输入密码的储存首地址
callpassword;
调用原始密码
jbcreturnbit,set_password;
先输入原密码完毕
MOVr5,#6;
输入的密码的首地址
MOVr1,#34h;
原始密码的首地址
input_compere:
MOVa,@r0;
xrla,@r1;
用异或进行比较输入密码和原密码
jnz