1、 中国海洋大学单片机课程实验设计报告设计题目:电子锁密码 proteus 仿真计姓名: 班级: 学号:任课教师: 课时: 一、 实验设计功能描述本设计采用单片机为主控芯片,结合外围电路,组成*电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误有提示,为了提高安全性,当密码输入错误三次将报警。密码可以由用户自己修改设定,锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。二、 设计所用原器件主控芯片 AT89S51、4*4 矩阵按键、 LCD1602 显示器 、蜂鸣器 、24c04a 芯片、存储芯片 AT24C02、
2、晶体振荡器三、 硬件电路设计1、键盘输入部分由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多 I/O 口。2、密码存储部分用 EPROM 芯片 AT24C02 存储密码。AT24C02 是美国 Atmel公司的低功耗 CMOS 型 E2PROM,内含 2568 位存储空间,具有工作电压宽(2.5 5.5 V)、擦写次数多( 大于 10000 次) 、写入速度快( 小于 10 ms)、抗干扰能力强、数据不易丢失、体积小等特点。而且他是采用了 I2
3、C 总线式进行数据读写的串行器件,占用很少的资源和 IO 线,并且支持在线编程,进行数据实时的存取十分方便。3、晶振部分AT89S51 引脚 XTAL1 和 XTAL2 与晶体振荡器及电容 C2、C1按图 4.5 所示方式连接。晶振、电容 C1 C2 及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容 C1、C2 的容量有关,但主要由晶振频率决定,范围在 033MHz 之间,电容 C1、C2 取值范围在 530pF 之间。根据实际情况,本设计中采用 12MHZ 做为系统的外部晶振。电容取值为 20pF。4、显示部分为了提高密码锁的密码显示效果能力。本设计的显
4、示部分由液晶显示器 LCD1602 取代普通的数码管来完成。只有按下键盘上的开启按键后,显示器才处于开启状态。同理只有按下关闭按键后显示器才处于关闭状态。否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键 09 输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个 *。5、报警部分报警部分由陶瓷压电发声装置及外围电路组成,加电后不发声,当有键按下时, “叮”声,每按一下,发声一次,密码正确时,不发声直接开锁,当密码输入错误时,单片机的 P2.1 引脚为低电平,三极管 T3 导通轰鸣器发出噪鸣声报警。6、开锁部分开锁控制电路的功能
5、是当输入正确的密码后将锁打开。系统使用单片机其中一引脚线发出信号,经三极管放大后,由继电器驱动电磁阀动作将锁打开。用户通过键盘任意设置密码,并储存在 EEPROM 中作为锁码指令。四、 软件设计本系统软件设计由主程序、初始化程序、LCD 显示程序、键盘扫描程序、键功能程序、密码设置程序、EEPROM 读写程序和延时程序等组成。主要程序设计流程图如下所示:五、 仿真抓图1、输入原始密码:2输入正确:3.输入错误:六、 设计体会设计刚开始时,我感到茫然不知从何下手,对程序的总体思路也缺乏了解。后来在老师的指导下,渐渐有了思路知道大体的框架。之后又参考了有关的书籍和资料,慢慢的经过两三周的时间才把程
6、序调试好,理清仿真图的出口与入口。在仿真方面因为程序的思路都理清了,所以只要按要求调用器件连接好电路,并且与 KILL 软件进行互接,功能比较顺利的就实现了,没有出现太大的问题。设计很小,可是在这过程中我学会了很多课本上学不到的知识。也明白书本的知识永远不够,我们自己要学会自学。同时对于学工科的学生还是要多多动手,在调试硬件时很多东西是要靠经验来检查电路的问题,而且动手经验也可以免去很多不必要的错误。七、 设计程序ORG 0000h; LJMP start; ORG 000bh;中断 T0 入口地址 LJMP intermit_t0;调用中断服务程序清指示灯 ORG 001bh;中断 T1 入
7、口地址 LJMP intermit_t1;初始化喇叭 ORG 0030h; start: MOV sp,#60h;设栈底 lcall sys_initialization;调用系统初始化程序 ; ;主程序 main0: lcall strat_display;液晶最初显示的程序 main: MOV 52h,#0; 52h 判断输入错误次数储存地址 setb led;使指示灯处于亮的状态 setb tr0;开启定时器 lcall key;扫描键值 cjne a,#A,next1;输入 A 设置密码 LJMP set_password;设置密码程序 next1: cjne a,#B,next2;输
8、入 B 输入密码 LJMP input_password; 输入密码程序 next2: ajmp main; ; 系统初始化 sys_initialization: clr led;使指示灯处于初始灭的状态 clr open;继电器的初始化 clr speaker;喇叭的初始化 MOV 34h,#1; MOV 35h,#2; MOV 36h,#3; MOV 37h,#4; MOV 38h,#5; MOV 39h,#6;34h39h 存放初始密码 MOV r7,#12; MOV r0,#40h;设置新密码存储的首地址 loop: MOV r0,#10h; inc r0; djnz r7,loop
9、;密码键值存放区清零完毕 lcall delay0_1s; MOV p0,#03h;液晶的控制代码 call write_instruction; 液晶软复位 MOV p0,#01h; call write_instruction;清屏 MOV p0,#3fh;设置单片机与 LCD 接口数据位为 8 位;显示行数为 2 行,字型为 5*10 call write_instruction; MOV p0,#0fh;整体开显示,显示光标光标字符位烁 call write_instruction; MOV p0,#06h;光标右移整体显示不移动 UnRegisteredcall write_inst
10、ruction;液晶初始化完毕 MOV r4,#10; MOV tmod,#11h; MOV th0,#3ch; MOV tl0,#0b0h; setb ea;允许开中断 setb et0;定时器 T0,0.5S 定时中断初始化完毕 ret;系统初始化完毕 ; 中断服务程序 intermit_t0: push acc; push psw; MOV th0,#3ch; MOV tl0,#0b0h;初值的设置 MOV r4,#10; djnz r4,return; cpl led; return: pop psw; pop acc; reti; intermit_t1: push acc; pus
11、h psw; MOV th1,#9eh; MOV tl1,#58h;初值设置 djnz r4,return_t1; cpl led; cpl speaker; MOV r4,#10; return_t1:pop psw; pop acc; reti; ; 键盘扫描; key: call ks;调用行扫描程序 jnz k1;判断是否有按键按下,若 A 不等于 0 按键按下 jmp key;A 等于零再次扫描取值 k1: call delay;调用延时子程序 call ks;调用扫描程序 jnz k2; jmp key; k2: clr tr0;关闭计时器 clr led; MOV r2,#0fe
12、h;行扫描初值为“0FE“, 从 0 行开始逐行扫描 MOV r6,#00h;设置行号初始值为 “00“ k3: MOV a,r2;取行扫描字 MOV p2,a;行扫描字送至 P2 口 MOV a,p2;到 P2 取值 jb acc.4,l1;判断 A 取列值,第 0 列有键按下吗?若;ACC.4=0 说明有按键按下 MOV a,#0;将第 0 列首号 “00“送到 A LJMP lk;转至键号计算程序 l1: jb acc.5,l2;第 1 列有键按下吗?若 ACC.5=0 说明有;按键按下 MOV a,#4;将第 1 列首号 “04“送到 A LJMP lk;转至键号计算程序 l2: jb
13、 acc.6,l3;第 2 列有键按下吗?若 ACC.6=0 说明有按键按下 MOV a,#8;将第 2 列首号 “08“送到 A LJMP lk;转至键号计算程序 l3: jb acc.7,next_key;第 3 列有键按下吗?若 ACC.7=0;说明有按键按下 MOV a,#12;将第 3 列首号 “12“送到 A lk: add a,r6;按键号=行号+列首号(A) MOV r6,a; k4: call ks;调用扫描子程序( 等待按键释放) jnz k4; MOV a,r6; MOV dptr,#table0; MOVc a,a+dptr; MOV 50h,a; 查表取值存入 50h
14、,保护键值 ret; next_key: inc r6;行号加 1 MOV a,r2;行扫描字送至 A jnb acc.7,key;判断 4 行都扫描完了UnRegisteredrl a;若未扫描完将行扫描字左移 MOV r2,a;行扫描字送至 R2,为扫描下一行做准备 jmp k3;循环继续扫描下一行 ; ks: MOV p2,#0f0h;送初值到 P2 口进行扫描,将列线 P2.4P2.7 设置为低电平 MOV a,p2;将扫描的值输入 A xrl a,#0f0h;屏蔽与行按键无关的 4 位,有任意键按下时,A 不等于 0 ret; ; 设置密码程序 set_password: call
15、clear_display;调用 LCD 清零显示程序 MOV dptr,#table4; 查表液晶显示INPUT PASSWROD: call input_hint;LCD 显示要显示的信息 MOV r0,#40h;输入密码的储存首地址 call password;调用原始密码 jbc returnbit,set_password;先输入原密码完毕 MOV r5,#6; MOV r0,#40h;输入的密码的首地址 MOV r1,#34h;原始密码的首地址 input_compere: MOV a,r0; xrl a,r1;用异或进行比较输入密码和原密码 jnz input_error;输入密
16、码与原密码不一致时跳至 input_error inc r0; inc r1; nop; nop; djnz r5,input_compere;验证输入密码完毕 jmp set_password0; input_error: setb speaker;蜂鸣器响 setb led;指示灯亮 call clear_display;清屏 MOV dptr,#table5; 查表显示PASSWORD ERROR! call input_hint; call delay1_5s; clr speaker;关蜂鸣器 clr led;指示灯灭 inc 52h;密码错误次数加 1 MOV a,52h; cjn
17、e a,#3,set_password; sjmp $;输入密码错误次数超过 3 次, 锁死 set_password0: call clear_display;清屏 MOV dptr,#table2;显示设置密码信息 call input_hint;调用 LCD 显示程序 MOV r0,#40h; call password;输入密码显示程序 jbc returnbit,set_password; 第一次输入新密码完毕 call clear_display;清屏 MOV dptr,#table3;提示再次输入密码信息 call input_hint;LCD 显示 call delay1_5s
18、;延时 ;显示再次输入新密码完毕 call clear_display;清屏 MOV dptr,#table4;提示输入密码信息 call input_hint;调用 LCD 显示程序 MOV r0,#46h;第二次输入密码的首地址 call password; jbc returnbit,set_password; 第二次输入新密码完毕 MOV r5,#6; MOV r0,#40h; MOV r1,#46h; set_compere: MOV a,r0; xrl a,r1; jnz set_error;显示设置错误信息 inc r0; inc r1; UnRegistereddjnz r5,
19、set_compere; MOV 34h,40h; MOV 35h,41h; MOV 36h,42h; MOV 37h,43h; MOV 38h,44h; MOV 39h,45h; ;存入新密码完毕 jmp main0;设置新密码成功,返主程序 set_error: setb speaker;蜂鸣器响 setb led;指示灯亮 call clear_display;清屏 MOV dptr,#table5; call input_hint; call delay1_5s; clr speaker;蜂鸣器关 clr led;指示灯灭 LJMP set_password0;前后两次输入新密码不一致
20、,返回重设 ;输入密码开锁程序 input_password: call clear_display;清屏 MOV dptr,#table4; 查表显示INPUT PASSWROD: call input_hint;调用显示程序 MOV r0,#40h; call password;调用原密码 jbc returnbit,input_password; 输入原密码完毕 MOV r5,#6; MOV r0,#40h;输入密码的首地址 MOV r1,#34h;原始密码的首地址 input_compere0: MOV a,r0; xrl a,r1;用异或判断输入密码是否与原始密码一样 jnz inp
21、ut_error22;判断密码有误 inc r0; inc r1; nop; nop; djnz r5,input_compere0;验证输入码完毕 jmp display_right;调用密码正确息 input_error22: setb speaker;蜂鸣器响 setb led;指示灯亮 call clear_display;清屏 MOV dptr,#table5;调用密码错误的显示信息 call input_hint;显示子程序 call delay1_5s;延时 clr speaker;蜂鸣器关 clr led;指示灯灭 inc 52h;输入密码次数加 1 MOV a,52h; cj
22、ne a,#3,input_password; sjmp $;输入密码错误超过 3 次,锁死 display_right: call clear_display;清屏 MOV dptr,#table6;密码正确显示信息 call input_hint;显示输入密码正确提示完毕 setb open; 开锁 next_key1:call key; nop; nop; cjne a,#F,next_key1; clr open; 按下关锁键,关锁 jmp main0; 返回主程序 ;主程序的子程序 strat_display: MOV p0,#80h;第一行显示地址 call write_instr
23、uction;调用写指令程序 MOV dptr,#table1; call input_hint;调用显示子程序 MOV p0,#0c0h;第二行显示地址 call write_instruction;调用写指令程序 MOV dptr,#table11; call input_hint;调用显示子程序 ret; clear_display: MOV display,#01h;LCD 屏幕清零 call write_instruction; MOV p0,#06h; call write_instruction; ret; input_hint: MOV r5,#16;要显示的字符个数(液晶行为
24、 16 位) MOV a,#00h;查询的初值 all_or_not: MOVc a,a+dptr; MOV display,a; call writedata;调用写数据 inc dptr; clr a; nop; nop; djnz r5,all_or_not; ret; password: MOV r5,#6;密码个数 MOV r1,#0c0h;LCD 第二行显示地址 MOV a,r1; MOV p0,a; call write_instruction;调用 LCD 初始化程序 loop1: call key; nop; nop; cjne a,#C,next_to;如果按键为 C 时,
25、按键标志为 1 setb returnbit;2.0 位置一 jmp endt; next_to: MOV a,50h; MOV r0,a; MOV display,#*;a; 输入键盘的密码值显示为“*“ call writedata;调用写数据指令初始化程序 inc r1; inc r0; djnz r5,loop1; endt: ret; ;写数据指令 writedata: SETB rs;选择数据寄存器 CLR rw;选择写操作 clr en;使能端初始化 setb en;使能端置 1 nop; nop; clr en; call delay; ret; ;写指令 write_inst
26、ruction: CLR rs;选择指令寄存器 CLR rw;选择写操作 clr en;使能端初始化 setb en;使能端置 1 nop; nop; clr en; call delay;调用延时子程序 ret; ;延时程序 delay1_5s: push 07h; push 02h; push 03h; MOV r7,#15; del22s: MOV r3,#0; del11s: MOV r2,#0; djnz r2,$; djnz r3,del11s; djnz r7,del22s; pop 03h; pop 02h; pop 07h; ret; delay0_1s: push 02h;
27、 push 03h; MOV r3,#0; del21s: MOV r2,#0; nop;nop; djnz r2,$; djnz r3,del21s; pop 03h; pop 02h; ret; delay: push 07h; push 06h; MOV r7,#10; d1: MOV r6,#248; nop nop djnz r6,$; djnz r7,d1; pop 06h; pop 07h; 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: A SET ; table11: db B OPEN; table2: db SET PASSWORD: ; table3: db INPUT AGAIN! ; table4: db INPUT PASSWROD: ; table5: db PASSWORD ERROR! ; table6: db PASSWORD OK! ; ;end