您的当前位置:首页正文

数字式密码电子锁电路设计

2021-06-09 来源:客趣旅游网
武汉理工大学《数字电子技术基础》课程设计说明书

课程设计任务书

学生姓名: 专业班级: 指导教师: 工作单位: 题 目: 数字式密码电子锁电路设计 初始条件:

本设计既可以使用集成电路和必要的元器件等。本设计也

可以使用单片机系统构建数字密码电子锁。自行设计所需工作电源。电路组成原理框图见图1,数字密码锁的实际锁体一般由电磁线圈、锁栓、弹簧和锁柜构成。当线圈有电流时,产生磁力,吸动锁栓,即可开锁。反之则不开锁。

图1 数字式电子锁电路原理框图

要求完成的主要任务: (包括课程设计工作量及技术要求,以及说明书撰写等具体要求)

1、课程设计工作量:1周。 2、技术要求:

①课程设计中,锁体用LED代替(如“绿灯亮”表示开锁,“红灯亮”表示闭锁)。 ②其密码为方4位(或8位)二进制代码(代码自设定)。

③开锁指令为串行输入码,当开锁密码与存储密码一致时,锁被打开。当开锁密码与存储密码不一致时,可重复进行,若连续三次未将锁打开,电路则报警并实现自锁。(报警动作为响1分钟,停10秒)

④选择电路方案,完成对确定方案电路的设计。计算电路元件参数与元件选择、并画出总体电路原理图,阐述基本原理。安装调试设计电路。

3、查阅至少5篇参考文献。按《武汉理工大学课程设计工作规范》要求撰写设计报告书。全文用A4纸打印,图纸应符合绘图规范。

时间安排:

1、 2010 年 6 月 28 日集中,作课设具体实施计划与课程设计报告格式的要求说明。 2、 2010 年 6 月 28 日,查阅相关资料,学习电路的工作原理。

2、 2010 年 6 月 29 日 至 2007 年 6 月 30 日,方案选择和电路设计。

2、 2010 年 7 月 1 日 至 2007 年 7 月 3 日,电路调试和设计说明书撰写。 3、 2010 年 7 月 4 日上交课程设计成果及报告,同时进行答辩。 课设答疑地点:鉴主13楼电子科学与技术实验室。

指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日

1

武汉理工大学《数字电子技术基础》课程设计说明书

摘要

本系统以STC89C52单片机最小系统为核心,结合矩阵键盘、1602LCD和报警系统组成。系统能完成锁闭状态显示、密码输入错误超次(大于三次)异常,系统锁定声光告警、初始化设置用户密码等基本的密码锁的功能。除上述基本的密码锁功能外,依据实际的情况还可以添加通过超级密码重置密码、键盘背光与通过背光显示密码、系统产生随机密码等扩展空间。

关键词:电子密码锁,STC89C52,液晶显示,异常告警

Abstract

The system STC89C52 microcomputer as the core, combined with matrix keyboards, 1602LCD and alarm system components. System can complete the lock status display, the password input error and Ultra (more than three times) abnormal sound and light alarm system lock, initialized to set user passwords, and other basic lock function. In addition to the basic lock function, based on the actual situation can also be added through super password reset your password, keyboard backlight and password through the backlit display, the system generates random passwords for expansion.

Keywords: electronic code lock, STC89C52, liquid crystal display, exception alerts

quid crystal display, exception alerts

2

武汉理工大学《数字电子技术基础》课程设计说明书

目录

1.绪论 ........................................................................................................................................... 4 2.设计内容及要求 ....................................................................................................................... 4 2.1 设计的初始条件及主要任务 ............................................... 4 2.2 设计思路 ............................................................... 4 3.模块硬件电路设计 ................................................................................................................... 5 3.1 单片机最小系统 ......................................................... 5 3.2 矩阵键盘 ............................................................... 6 3.3 1602液晶显示 .......................................................... 6 3.4 声光显示 ............................................................... 7 4.模块软件程序设计 ................................................................................................................... 7 4.1 矩阵键盘键值读取 ....................................................... 7 4.2 1602液晶显示模块 ...................................................... 7 4.3 延时模块 ............................................................... 8 4.4 密码读取模块 ........................................................... 8 4.5 密码设置模块 ........................................................... 8 4.6 密码比较模块 ........................................................... 9 4.7 声光状态模块 ........................................................... 9 5.模块组合调试 ........................................................................................................................... 9 5.1 硬件电路排查 ........................................................... 9 5.2 软件代码排查 .......................................................... 10 5.3 综合逻辑功能检测 ...................................................... 10 6.心得体会 ................................................................................................................................. 11 参考文献 ....................................................................................................................................... 12 附录1.整体设计器件清单 .......................................................................................................... 13 附录2.数字式密码电子锁电路设计原理图 .............................................................................. 14 附录3.数字式密码电子锁程序源代码 ...................................................................................... 15

3

武汉理工大学《数字电子技术基础》课程设计说明书

1.绪论

随着电子技术的发展,利用电子设备制作改进相关生活用品,得到价格更低、质量更好、可靠性的更高的产品,掀起了一次生活变革的浪潮。结合数字电路严密的逻辑功能的特点,与当今数字逻辑电路发展的现状,利用数字电路控制锁具而研发电子密码锁成为了时代的必然。

本次课程设计就是利用所学的数字电路知识,忽略复杂的实物锁体器件的驱动,简单模拟实现数字密码锁原理功能,从而复习相关知识,达到理论与实践相结合的目的。

2.设计内容及要求

2.1 设计的初始条件及主要任务

课程设计中,锁体用LED代替(如“绿灯亮”表示开锁,“红灯亮”表示闭锁)。 其密码为方4位(或8位)二进制代码(代码自设定)。

开锁指令为串行输入码,当开锁密码与存储密码一致时,锁被打开。当开锁密码与存储密码不一致时,可重复进行,若连续三次未将锁打开,电路则报警并实现自锁。(报警动作为响1分钟,停10秒)

选择电路方案,完成对确定方案电路的设计。计算电路元件参数与元件选择、并画出总体电路原理图,阐述基本原理。安装调试设计电路。

2.2 设计思路

本次的设计任务,运用集成逻辑器件组成的门电路1也可以完成,但是考虑到输入信号的数量、逻辑判断的复杂度可以预知其数字逻辑电路会是相当复杂的。而运用具有可以写入程序,按程序完成相关逻辑判断、电平控制的单片机芯片则会大大降低系统的复杂度,因此基于单片机来完成此次设计成为了总体设计方案的首选。

采用以单片机为核心的控制方案由于单片机种类繁多,各种型号都有其一定的应用环境,因此在选用时要多加比较,合理选择,以期获得最佳的性价比。一般来说在选取单片机时从下面几个方面考虑:性能、存储器、运行速度、I/O口、定时/计数器、串行接口、

4

武汉理工大学《数字电子技术基础》课程设计说明书

模拟电路功能、工作电压、功耗、封装形式、抗干扰性、保密性,除了以上的一些的还有一些最基本的比如:中断源的数量和优先级、工作温度范围、有没有低电压检测功能、单片机内有无时钟振荡器、有无上电复位功能等。基于以上因素,结合本次设计任务的特点,本设计选用单片机STC89C52作为本设计的核心元件,利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁信号判断、状态保存、电平控制的功能。2

设计从总体可以分为硬件与软件两个部分。在硬件部分中,由单片机最小系统、矩阵键盘、1602液晶显示、声光显示这几个部分,其相关控制关系如图2-2-1.;在软件部分中,由矩阵键盘键值读取、1602液

晶显示函数、延时模块、密码读取模块、密1602液晶显示模块 码设置模块、密码比较模块、声光状态模块,等几部分组成,

图2-2-1 硬件模块关系

矩阵键盘 单片机最小系统 声光显示模块 3.模块硬件电路设计

3.1 单片机最小系统

此为一个单片机最小系统,其有P0~P3 四组I/O口,可以进行相关的电平状态读取与控制操作。开关SW_RST为复位开关,当其接通,单片机RST9复位端至于高电位,满足一定时长后,单片机会进行复位操作,重新开始工作。Y1、C1.2、C1.3组成了单片机的振荡电路,为单片机系统提供稳定可靠地时钟信

号,协助单片机完成相关操作。Header9为一组排阻,图3.1.2MAX232串口程序下载电路 座位上拉电阻。图3-3-2为单片机的程序烧录串口电路。由于STC89C52使用串口方式下载程序,因此需要使用MAX232完成程序下载的处理工作。3

5

武汉理工大学《数字电子技术基础》课程设计说明书

图3.1.1单片机最小系统

3.2 矩阵键盘

本设计准备使用4×4键盘,对应的电路如图3.2.1

0~9输入相应的数字;在输入密码是L\\R分

别实现输入位置的左右移动,B为退格键,C为清除键,清楚当前

所有的输入字符, S为功能扩展键,暂时未定义,E为确认键

由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完

图3.3.1 1602液晶显示

1 4 7 L

2 5 8 0

3 6 9 R

C B S E

图3.2.1 4×4矩阵键盘

成,与独立式按键键盘相比,要节省很多I/O口。

3.3 1602液晶显示

图3.3.1为1602液晶的引脚分布。1,2为液晶显示供电,3接滑动变阻器改变3的相对

6

武汉理工大学《数字电子技术基础》课程设计说明书

电位,调节显示对比度。4,5,6为液晶的控制端,调节工作状态。7~14为液晶的数据输入端,15、16为液晶背光的电源接口。17,18可以悬空不接。

3.4 声光显示

光显示有红绿两种颜色的发光二极管组成,负极接单片机引脚,正极结一个限流电阻后接地。当单片机输出高电平,其不亮,当单片机输出低电平,二极管点亮。(图略)

声信号告警有长鸣蜂鸣器与一个三极管、电阻组成,三极管在单片机的控制下驱动蜂鸣器正常工作。长鸣蜂鸣器,在给予有效电平时可以不间断的以一定的频率发出蜂鸣。如图3.4.1。

图3.4.1 蜂鸣器工作电路

4.模块软件程序设计

4.1 矩阵键盘键值读取

矩阵键盘接P1口,行接低4位,列接高4为。先让行为高,列为低,若有键按下,则所在行为低,得到按键的所在行数,之后令P1口,行为低,列为高,运用相似的方法得到所按键的所在列数,及确定按键位置,返回键值。由于机械键盘会出现信号抖动的情况,固在发现有按键后延时5毫秒再次确定,若让有按键,证明按键稳定,否则认为接收到的是抖动信号,不予处理。

4.2 1602液晶显示模块

1602具有三个工作状态控制端,调节他们的高低变化配合数据口的信息,可以显示2×16的字母或者数字,通过子函数可以实现检测初始化LCD、写指令到LCD、LCD状态、LCD清屏、输入一个字节数据到LCD、LCD光标定位到x处、LCD光标归位、输入一个字符到LCD、输入一个字符串到LCD等功能。4

7

武汉理工大学《数字电子技术基础》课程设计说明书

4.3 延时模块

一个程序会有许多地方需要进行延时操作,例如矩阵键盘的消抖延时。一般延时可以通过空循环与中断响应两种方法进行。由于本程序对于时间精度要求不高,故使用相对简单的空循环的方法进行延时。进过实验,单片机每空循环110次耗时1ms。故用两次循环,里面一次空循环110,外面的一次由输入决定循环次数,这样就会进行输入数值时长的延时。4

4.4 密码读取模块

首先预读入密码的字符数组清零,显示位置清空,然后读取键值。先判断此时是否是在第九个键值输入了数字键值,如果是不响应重新读入,这样可以防止读入字符串溢出,造成密码读取错误。然后通过switch语句5处理键值(字母键值),并将读取位置、显示位置进行相关调整;如果输入的是数字有效键值,存入当前指向的字符数组空间,其后将键值变量清零准备读取下一个键值。进行循环读取,直到成功读取8位密码或者因为输入了确定键提前完成读取工作。

4.5 密码设置模块

在系统进行初始化时,要求设置密码。整体思路是要求读取一组密码,保存在临时空间,然后再次读取密码,如果相同,证明设置成功,将新密码覆盖进标准密码数组里,如果两次的密码不同,显示错误信息,要求重新输入。

第一次读入密码 第二次读入密码 不相同 判断两次密码 相同 保存密码,提示成功 图4.5.1密码设置模块

8

武汉理工大学《数字电子技术基础》课程设计说明书

4.6 密码比较模块

该模块将输入密码字符串与设定密码字符串比较。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。逻辑框图如图4.6.1。

发出报警 系统锁死 密码正确 模块启动 验证密码 密码错误 判断错误 次数 连续错误次数小于三次 连续错误次数小于三次 发出报警 系统锁死 图4.6.1密码比较模块

显示错误信息并返回 4.7 声光状态模块

本模块通过读取相关控制变量,控制声光部件的状态。当闭锁状态点亮红灯,开锁状态点亮绿灯;当需要进行异常告警时,利用延时函数周期性的变换蜂鸣器的响静。鸣响状态下,响250ms,停250ms;鸣响状态保持50s后,静止10s,后继续进入鸣响状态,如此反复。

5.模块组合调试

按照前述模块进行设计,制作实物电路、编写软件程序代码,然后进行相关调试。

5.1 硬件电路排查

由于本次设计的线路相对较多,易发生焊接错误,故应该先进行硬件电路的排查。首先检查相关器件引脚连接是否正确可靠;其次检测各导线间是否有错误的相邻短路;然后检查所有开关是否正常控制电路闭合,最后给声光部件有效电平观察其是否能正常工作。

经过检测,发现几处线路短路错误,已处理修正。

9

武汉理工大学《数字电子技术基础》课程设计说明书

5.2 软件代码排查

检测函数中是否有错误的函数调用,变量错误使用,是否存在控制错误造成相关模块的衔接问题。其后利用Proteus然见软件进行模拟进一步需找错误并改成。

经过排查,修改程序中的已发现错误。

5.3 综合逻辑功能检测

将程序代码烧录进硬件系统中进行总体综合测试。相关流程如下: 序号 测试内容 系统初始化, 1 LCD显示 滑动变阻器,调节LCD 显示对比度 进行有序的按键操作,观察2 验证键盘按键 LCD显示器状态,确认键盘是否正常 密码读入、设置密码3 模块、密码比较模块检测 验证密码模块与声光4 模块的配合 先进行正确密码输入,然后多次进行多次错误密码输入 现错误。 系统的密码模块可5 测试密码模块可靠性 多次输入密码,随机性的决定密码的正误,看系统响应状态 靠,在且只在连续三次错误时进行异常告警。 通过以上的排查调试工作,成功修正了已发现的硬件软件错误。上面的测试项目基本覆盖了系统的所有可能操作,表明系统的可靠性相对较高,但不排除让存在极端情况下的系统漏洞,然而这种情况很少出现,此时可以忽略不计。

衔接操作正确,未发行错误设置,后进行正确设置 进行正确处理 系统的函数间调度、进行两次密码设置操作,先进正确的对相应数组状态 LCD显示正常 可以通过矩阵键盘完成正确的键值输入 密码操作模块可以具体操作 系统上电,调节显示部分的 状态 正确进入密码设置 10

武汉理工大学《数字电子技术基础》课程设计说明书

6.心得体会

本次课程设计不仅仅是对于一学期数字电子技术课程学习的一个简单考核,更是是我们在数电方向、电子方向继续学习深造的一个无尽动力。在完成课程设计的过程中,遇到了许多当初设想不同的难题,例如对于键盘的扫描,密码的储存调用修改等等。有许多问题都是有许多中解法,但是要从大局出发,有一个系统的思想,合理的安排布局,恰当的使用硬件、软件资源,尽量减少不必要的部件,降低系统的复杂度;同时又要尽量全面的考虑系统的各种情况,避免系统功能设计或者是使用者错误操作所引起的系统错误;更重要的是要把设计与实际应用相结合,在现有水平可以达到的前提,尽力将设计贴近实际需要,实现用户所需要的功能。这些都是这次课程设计给我带来的收获,也是我今后学习、工作的宝贵经验。

11

武汉理工大学《数字电子技术基础》课程设计说明书

参考文献

[1] 伍时和等.数字电子技术基础.北京:清华大学出版社,2009.4. [2] 张天凡等.51单片机C语言开发详解.北京:电子工业出版社,2008.6. [3] 马忠梅等.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,

2007.1.

[4] 梅丽凤等. 单片机原理及接口技术. 北京: 清华大学出版社;北京交通大学出

版社,2004.2

[5] 谭浩强.C程序设计(第三版).北京:清华大学出版社,2005.7.

12

武汉理工大学《数字电子技术基础》课程设计说明书

附录1.整体设计器件清单

名称 单片机芯片 通讯芯片 串行接口 石英晶振 瓷片电容 电解电容 电位器 电阻 型号 STC89C52 MAX232 DB9 12M 33 105 4.7uf 10K 1K 10K 10K排阻 红色 绿色 8550 1062 数量 1 1 1 1 2 4 1 1 4 1 1 2 1 1 1 1 17 1 若干 若干 1 1套 备注 LED 长鸣蜂鸣器 三极管 LCD显示模块 按键开关 自锁开关 排针 导线 万用表 电工工具 13

武汉理工大学《数字电子技术基础》课程设计说明书

附录2.数字式密码电子锁电路设计原理图

14

武汉理工大学《数字电子技术基础》课程设计说明书

附录3. 数字式密码电子锁程序源代码

#include\"reg51.h\" #include \"string.h\"

#define LCD_DATA P0 //输入方式设置

#define LCD_AC_AUTO_INCREMENT 0x06

#define LCD_AC_AUTO_DECREASE 0x04 #define LCD_MOVE_ENABLE 0x05 #define LCD_MOVE_DISENABLE 0x04

//设置显示、光标及闪烁开、关

#define LCD_DISPLAY_ON 0x0C #define LCD_DISPLAY_OFF 0x08 #define LCD_CURSOR_ON 0x0A #define LCD_CURSOR_OFF 0x08 #define LCD_CURSOR_BLINK_ON 0x09 #define LCD_CURSOR_BLINK_OFF 0x08

//光标、画面移动,不影响DDRAM

#define LCD_LEFT_MOVE 0x18 #define LCD_RIGHT_MOVE 0x1C #define LCD_CURSOR_LEFT_MOVE 0x10 #define LCD_CURSOR_RIGHT_MOVE 0x14

//工作方式设置

#define LCD_DISPLAY_DOUBLE_LINE 0x38 #define LCD_DISPLAY_SINGLE_LINE 0x30

unsigned char code tab[4][4]={ {'1','2','3','C'}, {'4','5','6','B'}, {'7','8','9','S'}, {'L','0','R','E'}};

unsigned char input_password[9]={0,0,0,0,0,0,0,0,'\\0'}; unsigned char normal_password[9]={\"12345678\ unsigned char temp_normal_password[9]={\"12345678\ unsigned char lock=0,miss=0,key=0; 错误次数、读入键值 sbit beep=P3^2; sbit LEDR=P3^4;

15

//LCD的数据口

//数据读、写操作后,AC自动增一 //数据读、写操作后,AC自动减一 //数据读、写操作,画面平移 //数据读、写操作,画面不动

//显示开 //显示关 //光标显示 //光标不显示 //光标闪烁 //光标不闪烁

//LCD显示左移一位 //LCD显示右移一位 //光标左移一位 //光标右移一位

//两行显示 //单行显示

//键盘键值表

//临时读入密码数组 //密码存储数组 //临时设定密码数组 //系统环境变量 分别为锁状态、连续//蜂鸣器控制变量 //开锁指示灯控制变量

武汉理工大学《数字电子技术基础》课程设计说明书

sbit LEDE=P3^6; sbit LCD_BUSY=LCD_DATA^7; sbit LCD_RW=P2^0; sbit LCD_RS=P2^1; sbit LCD_EN=P2^2;

void LCD_cls(void);

void LCD_write_data(unsigned char); void LCD_initial(void);

void LCD_set_position(unsigned char); void LCD_prints(unsigned char *); void LCD_printc(unsigned char); void didi(); void verify_password (); void Load(); void First(); void read_password (); void Set_password(); void delay(unsigned char a); unsigned char kbscan();

void LCD_check_busy(void)

{

while(1) {

LCD_EN=0; LCD_RS=0; LCD_RW=1;

LCD_DATA=0xff; LCD_EN=1;

if(!LCD_BUSY)break; }

LCD_EN=0; }

void LCD_cls(void) {

LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=1; LCD_EN=1; LCD_EN=0; }

//闭锁指示灯控制变量 //LCD忙信号位 //LCD读写控制 //LCD寄存器选择 //LCD使能信号*/

//蜂鸣报警模块函数 //开锁判断模块函数 //初始化函数 //读入密码模块函数 //设定密码模块函数 //毫秒延时模块函数 //键盘扫描模块函数

//检测LCD状态

//LCD清屏

16

武汉理工大学《数字电子技术基础》课程设计说明书

void LCD_write_instruction(unsigned char LCD_instruction) //写指令到LCD

{

LCD_check_busy(); LCD_RS=0; LCD_RW=0;

LCD_DATA=LCD_instruction; LCD_EN=1; LCD_EN=0; }

void LCD_write_data(unsigned char LCD_data) {

LCD_check_busy(); LCD_RS=1; LCD_RW=0;

LCD_DATA=LCD_data; LCD_EN=1; LCD_EN=0; }

void LCD_set_position(unsigned char x) {

LCD_write_instruction(0x80+x); } /*

void LCD_go_home(void) {

LCD_write_instruction(LCD_GO_HOME); } */

void LCD_printc(unsigned char lcd_data) {

LCD_write_data(lcd_data); }

void LCD_prints(unsigned char *lcd_string) {

unsigned char i=0;

while(lcd_string[i]!=0x00) {

//输出一个字节数据到LCD

//LCD光标定位到x处

//LCD光标归位

//输出一个字符到LCD

//输出一个字符串到LCD

17

武汉理工大学《数字电子技术基础》课程设计说明书

LCD_write_data(lcd_string[i]); i++; } }

void LCD_initial(void) //初始化LCD {

LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); LCD_cls(); }

/*********************************************************************** * Function: delay(unsigned char t) * Input Variables: t<256 * Return Variables: None * Usage: 通过读入的时间值进行延时 * Notes: None

***********************************************************************/ void delay(unsigned char a) { unsigned char i; while(a--) for(i=110;i>0;i--) ; }

/*********************************************************************** * Function: kbscan() * Input Variables: None * Return Variables: key * Usage: 将读出的按键保存在全局变量key,并将其当做函数值返回 * Notes: None

***********************************************************************/ unsigned char code kbscan() //键盘扫描模块函数 { unsigned char hang,lie; if(P1!=0x0f) delay(5); //软件消抖 if(P1!=0x0f) //判断是否有按键 { switch(P1&0x0f)

18

武汉理工大学《数字电子技术基础》课程设计说明书

{ case 0x0e:hang=0;break; case 0x0d:hang=1;break; case 0x0b:hang=2;break; case 7:hang=3;break; //扫描行 } P1=0xf0; P1=0xf0; switch(P1&0xf0) { case 0xe0:lie=0;break; case 0xd0:lie=1;break; case 0xb0:lie=2;break; case 0x70:lie=3;break; //扫描列 } P1=0x0f; while(P1!=0x0f); key=tab[hang][lie]; //确定按键键值 } else key=0; //无按键 return (key); }

/*********************************************************************** * Function: Load() * Input Variables: None * Return Variables: None * Usage: 系统初始化 * Notes: None

***********************************************************************/ void Load() //初始化函数 { unsigned char i; beep=1; LEDR=0; LEDE=1; key=0; P1=0xf0; P0=0xff; for(i=0;i<9;i++) {input_password[i]='\\0';} //系统变量数组清零 normal_password[9]='\\0'; LCD_initial();

19

武汉理工大学《数字电子技术基础》课程设计说明书

LCD_set_position(1); LCD_prints(\"Why's Electron\"); LCD_set_position(0x40); LCD_prints(\" Cipher Lock\"); //提示信息LCD显示 while(kbscan()==0); //按任意值返回 return; }

/*********************************************************************** * Function: first() * Input Variables: None * Return Variables: None * Usage: 等待清屏函数 * Notes: None

***********************************************************************/ void first() { while(kbscan()==0); LCD_cls(); return; }

/*********************************************************************** * Function: read_password() * Input Variables: None * Return Variables: None * Usage: 读入通过键盘输入的密码 * Notes: None

***********************************************************************/ void read_password() //读入密码模块函数 { unsigned char i=0; LCD_set_position(0x40); LCD_prints(\" \"); for(i=0;i<9;i++) {input_password[i]='\\0';} //读入密码数组初始化 for (i=0;i<9;) { while(kbscan()==0); if(i==8 &&(key>='0'&&key<='9')) continue; //判断是否输入最长密码 switch(key) //判断按键种类 { case 'L': if(i>0)i--;

20

武汉理工大学《数字电子技术基础》课程设计说明书

break; //读入位置左移 case 'R': if(i<7)i++; break; //读入位置右移 case 'E': return; case 'C': LCD_set_position(0x40); LCD_prints(\" \"); for(i=9;i>0;i--) input_password[i]='\\0'; input_password[i]='\\0'; break; //清空读入内容 case 'B': if(i>0) { i--;input_password[i]=0; LCD_set_position(0x44+i); LCD_printc(' '); } //进行退格操作 break; case 'S': break; //功能键处理 default : input_password[i]=key; //有效数字密码保存 LCD_set_position(0x44+i); LCD_printc(input_password[i++]); } key=0; //键值清零 } }

/*********************************************************************** * Function: void Set_password() * Input Variables: None * Return Variables: None * Usage: 设置密码锁系统的密码 * Notes: None

***********************************************************************/ void Set_password() //设定密码模块函数 { unsigned char i,j; //局部循环、判断变量 while(1) { LCD_cls();

21

} }

武汉理工大学《数字电子技术基础》课程设计说明书

LCD_set_position(1);

LCD_prints(\"Set Password\"); LCD_set_position(0x40);

LCD_prints(\" \"); //提起信息显示 read_password(); //读入密码

strncpy(temp_normal_password,input_password,9); //读入密码保存在临时设定密码数组 for(i=0;i<9;i++) {input_password[i]='\\0';} //读入密码数组初始化 LCD_set_position(0x44); while(kbscan()==0); LCD_cls();

LCD_set_position(1);

LCD_prints(\"Input again\"); read_password(); //进行设定密码确认 j=strcmp(input_password,temp_normal_password)==0;//判断两次密码是否相同 for(i=0;i<9;i++) {input_password[i]='\\0';} if(j) { LCD_cls(); LCD_set_position(2); LCD_prints(\"Set Password\"); LCD_set_position(0x42); LCD_prints(\"Successfully\"); strncpy(normal_password,temp_normal_password,9); for(i=0;i<9;i++) {temp_normal_password[i]='\\0';} while(kbscan()==0); break; //如果相同保存密码进行提示 } else { LCD_cls(); LCD_set_position(1); for(i=0;i<9;i++) {temp_normal_password[i]='\\0';} LCD_prints(\"Passwords is\"); LCD_set_position(0x43); LCD_prints(\"difference\"); while(kbscan()==0); continue; //如果不同放弃密码并返回重新设定 }

22

武汉理工大学《数字电子技术基础》课程设计说明书

/*********************************************************************** * Function: verify_password () * Input Variables: None * Return Variables: None * Usage: 验证密码,控制锁和声光显示部件的状态 * Notes: None

***********************************************************************/ void verify_password () { unsigned char i; lock=(strcmp(input_password,normal_password)==0); if(lock==1) { LCD_cls(); LCD_set_position(5); LCD_prints(\"Unlock\"); LCD_set_position(0x42); LCD_prints(\"Successfully\"); LEDR=1;LEDE=0; miss=0; while(kbscan()==0); LCD_cls(); LCD_set_position(1); LCD_prints(\"Press any key\"); LCD_set_position(0x43); LCD_prints(\"to lock up\"); while(kbscan()==0); lock=0; LEDR=0;LEDE=1; } else { miss=miss+1; if(miss<3); else { LCD_cls(); LCD_set_position(3); LCD_prints(\"Warning!!!\"); didi(); } LCD_cls(); LCD_set_position(1); LCD_prints(\"Password Error\"); while(kbscan()==0);

23

//开锁判断模块函数 //判断是否开锁 //判断是否进行异常告警 //异常告警 武汉理工大学《数字电子技术基础》课程设计说明书

LCD_cls(); LCD_set_position(4); LCD_prints(\"Input the\"); LCD_set_position(0x40); LCD_prints(\"password again\"); //提示密码错误并返回 while(kbscan()==0); } for(i=0;i<9;i++) {input_password[i]='\\0';} //输入密码数组初始化 return; }

/*********************************************************************** * Function: didi () * Input Variables: None * Return Variables: None * Usage: 进行蜂鸣报警 * Notes: None

***********************************************************************/ void didi() //蜂鸣报警模块函数 { unsigned int a=60; while(1) { a=55; //蜂鸣50s while(a--) { beep=0; //响250ms delay(250); beep=1; //静250ms delay(250); beep=0; delay(250); beep=1; delay(250); } a=40; //停响10s while(a--) { delay(250); } } return;

24

武汉理工大学《数字电子技术基础》课程设计说明书

}

/*********************************************************************** * Function: main() * Input Variables: None * Return Variables: None * Usage: 系统主函数,控制系统流程 * Notes: None

***********************************************************************/ void main() //系统主函数 { Load(); //系统初始化 first(); Set_password(); //设定系统密码 while(1) { Load(); //系统初始化 first(); LCD_set_position(1); LCD_prints(\"Input password\"); LCD_set_position(0x40); LCD_prints(\"\"); read_password(); //读入密码 verify_password(); //进行判断 } //返回循环 }

25

武汉理工大学《数字电子技术基础》课程设计说明书

本科生课程设计成绩评定表

姓 名 专业、班级 性 别 课程设计题目: 数字式密码电子锁电路设计 课程设计答辩或质疑记录: 成绩评定依据: 最终评定成绩(以优、良、中、及格、不及格评定) 指导教师签字:

年 月 日

26

因篇幅问题不能全部显示,请点此查看更多更全内容