电子密码锁proteus仿真设计报告.docx

上传人:b****5 文档编号:8047052 上传时间:2023-01-28 格式:DOCX 页数:19 大小:199.55KB
下载 相关 举报
电子密码锁proteus仿真设计报告.docx_第1页
第1页 / 共19页
电子密码锁proteus仿真设计报告.docx_第2页
第2页 / 共19页
电子密码锁proteus仿真设计报告.docx_第3页
第3页 / 共19页
电子密码锁proteus仿真设计报告.docx_第4页
第4页 / 共19页
电子密码锁proteus仿真设计报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

电子密码锁proteus仿真设计报告.docx

《电子密码锁proteus仿真设计报告.docx》由会员分享,可在线阅读,更多相关《电子密码锁proteus仿真设计报告.docx(19页珍藏版)》请在冰豆网上搜索。

电子密码锁proteus仿真设计报告.docx

电子密码锁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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1