闽江学院
欧阳光明(2021.03.07)
本科毕业论文(设计)
题目基于51单片机的电子密码锁 学生姓名王颖丹 学号3111101215 系别计算机科学系 年级级 专业嵌入式应用 指导教师郑明 职称副教授 完
成
日
期
*欧阳光明*创编 2021.03.07
526
*欧阳光明*创编 2021.03.07
诚信承诺书
本人郑重声明:
兹提交的毕业论文(设计)《基于51单片机的电子密码锁》,是本人在指导老师郑明的指导下研究、撰写的成果;论文(设计)未剽窃、抄袭他人的学术观点、思想和成果,未篡改研究数据,论文(设计)中所引用的文字、研究成果均已在论文(设计)中以明确的方式标明;在毕业论文(设计)工作过程中,本人恪守学术规范,遵守学校有关规定,依法享有和承担由此论文(设计)产生的权利和责任。
声明人(签名):王颖丹
3
月
1
日
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
摘要
本次毕业设计我选择的是基于51单片机的电子密码锁,所选芯片为ATC51。这个电子密码锁包括了5*4矩阵键盘模块,24C02存储模块,报警模块,1602液晶屏显示模块。使用的编程工具是keil C51,画图工具是Protell 99 SE,烧写工具是STC479。在本次毕业设计的制作过程中,我经过不断的调试,更改程序,来提高锁的使用性能,最后的调试结果,我还是比较满意的。因为它基本实现了开题报告中所提到的功能:报警功能、开锁功能、掉电存储密码功能、显示功能、键盘输入功能等。但是还是有一些遗留问题的,比如显示屏老是花屏,按键不够灵敏等。
关键词:单片机ATC52;密码锁;5*4矩阵键盘;1602液晶屏
Abstract
This graduation design I choose is based on the 51 singlechip electronic code lock, the selected chip ATC51.the electronic password lock comprises a 5 * 4 matrix keyboard module, 24C02 memory module, alarm module, LCD display module. Using the programming tool is KEIL C51, drawing tools is protell 99 SE, the programming tool is STC479. In the making process of the graduation design, I through continuous debugging and change procedures, to improve the use performance of the lock and the debug result. I was satisfied, because it basically achieved mentioned in the proposal that the function: alarm function, lock function, electric storage password function, display function, keyboard input function. But there are still some problems left, such as the display is always flower screen, buttons and other key is not sensitive.
Key words:SCM ATC52; password lock; 5 * 4 matrix keyboard; 1602 LCD screen; safety performance。
目录
1.概述
1.1 引言 ..................................................................................................................................................... 3 1.2 电子密码锁的背景 ............................................................................................................................. 4
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
1.3 电子密码锁设计的意义和的特点 ..................................................................................................... 4
2. 系统设计
2.1系统总设计结构图 ............................................................................................................................. 5 2.1.1 功能设计 ...................................................................................................................................... 7 2.2 芯片的选择 ......................................................................................................................................... 7 2.3 主控芯片ATC52单片机的简介 .................................................................................................... 8 2.3.1主要特性 ...................................................................................................................................... 8 2.4 编程工具 ............................................................................................................................................. 9
3. 系统硬件设计
3.1 总框图 ............................................................................................................................................... 10 3.2 键盘图 ............................................................................................................................................... 10 3.3 显示模块 ........................................................................................................................................... 11 3.4 蜂鸣器模块 ....................................................................................................................................... 11 3.5 LED流水灯模块 ................................................................................................................................ 12 3.6 密码掉电保护24C02存储模块....................................................................................................... 12 3.7 晶振时钟电路 ................................................................................................................................... 13 3.8 复位电路设计 ................................................................................................................................... 13 3.9 串口引脚功能介绍 ........................................................................................................................... 14 3.10 硬件成品 ......................................................................................................................................... 15
4.软件设计
4.1 系统软件设计流程图: ................................................................................................................... 16 4.2 系统软件设计流程 ........................................................................................................................... 17
5.程序调试
5.1 程序调试用到的软件及工具 ........................................................................................................... 19 5.2 调试过程 ........................................................................................................................................... 19
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
5.2.1 显示模块测试: ........................................................................................................................ 19 5.2.2 键盘模块测试: ........................................................................................................................ 19 5.2.3 蜂鸣器模块测试: .................................................................................................................... 20 5.2.4复位模块测试: ........................................................................................................................ 20 5.2.5 24C02存储模块测试: ............................................................................................................ 20 5.3遗留问题........................................................................................................................................... 21
6. 设计总结21 参考文献22 致谢23
附录错误!未定义书签。
基于51单片机的电子密码锁
1.概述
1.1 引言
大家都知道,由古至今,人们的财产安全大多都是通过锁来完成的。在现代这个社会锁对于每个人,每个家庭来说都是不可或缺的生活保障。伴随着这个社会历史的发展和人类文明的进步,人们对自己生命安全的保障意识和财产安全的保障意识都得到了很大幅度的提升。而锁的花样也越来越多,由一开始的机械式锁,到现在各式各样的电子锁。显而易见的,电子锁的功能也更加的完善了,安全性能也更高了。随着社会的发展,城市规模的扩大,及各个大城市中外来人口的引入,是本来复杂的城市越来越难管理。尤其是近来,针对小区及住房入室盗窃和抢劫的事时有发生,是人们的生活受到的很大的影响。对于这些盗窃屡有发生,主要原因为:人们对于安全防范设施的不完善,个人安全防范的意识也不够高,小区物业管理不够完善。而现在,电子锁的成本越来越低,功能越来越强,使它被广泛的用于小区楼道德安全管理中,这种成本相对较低的安全措施,却为小区及住宅提供了不小的安全作用。这种电子密码锁,是一种可以通过从键盘输入密码,然后来完成一个开锁的过程。而人们最开始深究这种电子密码锁的目的,便是为了提高使用锁的安全性。
从古代到今天,我们可以看到各种类型的锁出现在我们的眼前。有国内的,也
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
有国外的,但是事实上这些锁都不具有真正的完善的防盗功能。在一些真正的惯偷面前,只需要一些钢线或者一些简单的开锁的工具就能打开这些锁。曾经有一些惯偷就说过:“没有我打不开的锁。”而事实上呢,也并不是他们的偷盗手法有多么的高明。正真的原因就是一般的锁具原理都不够复杂,很是简单。而对于这样的一个社会现状,人们对锁提出了极其迫切的改进要求。
1.2 电子密码锁的背景
在当今的社会,我们可以看到各类样式繁杂的锁具,有可以按指纹的,也有数码的,还有电子的。甚至还有类似于IC卡的锁。但是最常见的还是按键的锁。随着这个社会的进步和人类科学的发展。锁具也发展成了电子锁,门锁,还有激光锁等。包括了不同的声音、不同的磁域、还有不同的声波、不同光束光波、以及很多不同的图像。来控制锁的开启。从而大大提高了防盗锁,使犯罪分子不能开始,人们将能够有更多的保护自己的财产。在今天这个社会,信息安全系统也应用的越来越广泛,尤其是在保护机密上起主要作用。维护人们的隐私和保护人们的财产,是电子密码锁的安全系统的一个组成部分。因此电子密码锁的研究具有很大的现实意义。
1.3 电子密码锁设计的意义和的特点
单片机也被称为微机或单片机。这是一个(CPU)处理单元,一个随机存取存储器(RAM),一个只读存储器(ROM),输入/输出(I / 0)等电脑部件。它的主要功能基本都集成在了一块集成的电路芯片上。计算机的发展迅速,加剧了人们改造这个世界的步伐。但是它的体积毕竟过于庞大。MCU(单片机)是出生在这种情况下。这是我们要改变的吗?在我们生活的各个领域,从导航装置来控制导弹,航空仪表,通信和计算机网络在工业自动化和过程的实时控制和数据传输,数据处理。并且能够广泛的应用于我们的生活中,比如在各种智能IC卡,电子宠物中。这些是离不开单片机的。如果没有以前的单片机。这些东西虽然可以做,但是它们却只能用复杂的模拟电路。而且,这样做出来的成品不仅体积大,成本还很高。同时也会由于长期使用,使得它的部件老化,控制精度达不到标准值。 SCM,我们将成为这些事情的智能控制者。因为我们只需要一个简单的单片机外围接口电路。但是该方案的核心是由人们自己编写代码来,烧写程序来完成的。该产品具有体积小,成本低的优势,长期使用也无需担心是否准确,并且它还易于升级。
在日常生活中的办公区和住宅区,单位的文件档案,财务报表,和一些个人信息中。都可以使用电子锁来完成。很大幅度提升了主材料的安全性,基本可以
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
取代老旧的防盗机械锁。目前,许多类型的锁的使用,独特的。是适用于住宅区、办公区的锁,更是一个值得推广的产品。
(1)我设计的这个电子密码锁的系统可以设置8位的密码,密码可以通过键盘输入。如果输入的密码正确,则可以将锁打开,led等会闪一下并伴有两下的滴滴声。如果输入的不正确的话,电子密码锁就会发出滴滴滴滴滴的报警声。
(2)密码可以由用户自己设置。在已经将锁打开的状态下,用户也可以自己修改密码。
(3)而且我的这个电子密码锁也具备自动报警功能。自动报警为蜂鸣器报警。
(4)这种情况下可报警:一是密码输入错误,则报警。当电子密码锁进入工作状态时,用户可以通过按键输入8位的密码。然后单片机将用户所输入密码与用户所设定密码进行比较。如果两个密码比较后,密码相同则正确。那么发出开锁信号,则LED指示灯会亮一下,蜂鸣器响两声,将门打开,系统不报警。如果两个密码比较后,密码不一致则不正确。蜂鸣器发出滴滴滴滴滴的报警声,并要求重新输入密码。如果用户输入的密码累积起来一共错了3次的话,那么电子密码锁就会被锁定了。而且,锁定之后必须断电重启后才能再次输入密码。
(5)掉电存储密码功能,如果用户修改完密码之后,断电重新启动密码锁,输入的密码是用户之前修改的密码。
2.系统设计
2.1系统总设计结构图
如下图2.1:
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
报警电路部分 单片机 显示 部分 密码存储部分 系统总设计结构图2.1
键盘输入部分 本设计的主控芯片是ATC52。单片机是用来负责控制电子密码锁整个系统电路的执行过程。其中:
单片机:单片机这个部分的话,它的功能包括了写入数据和读取数据,以及各种命令的控制和数据的处理。与此同时呢,还需要对各执行单元分别进行控制。单片机是本系统的控制中心和数据处理中心。
键盘部分:这个部分是由用户自己输入各个数据信息并传送至单片机中进行数据分析和处理。
显示部分:这个模块完成的是用户所输入的数据信息的显示以及系统信息的提示显示。
密码存储部分:这个模块完成的是原始密码的存储和用户所更改数据的存储。
报警电路部分:这个模块的的主要功能是增加系统的安全性能和实用性。报警电路的主要功能就是在用户进行错误的操作后进行一个报警提示。
还有就是其他的一些部分,它们主要是:电源电路、复位模块、晶振模块、开锁电路。电源模块的话,它的主要的功能是为单片机提供工作电源,于此同时也为整个电路提供工作电源。复位模块它的功能是使系统在出现故障或死机时进行复位。开锁电路就是在用户输入正确的密码的时候,把电子密码锁给打开。
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
2.1.1 功能设计
此电子密码锁的组成部分为:51单片机最小系统,矩阵键盘部分,电源电路部分,报警电路部分以及复位电路部分。P3口接的是矩阵键盘电路。XTAL1和XTAL2接晶振电路。p2.0口接的是报警电路。RST接的是复位电路。每个电路都由单片机控制,来实现电子密码锁功能。 此电子密码锁组成部分:
密码锁显示:当我们输入密码的时候,每按下一个按键,液晶屏welcome下面中就会显示一个*号。如果我们输入密码正确,那么LED灯亮,并且伴有滴滴的声音,1602液晶屏屏幕上就会显示Right open。如果我们输入的密码错误,则蜂鸣器会报警并且发出滴滴滴滴滴的声音,1602液晶屏也会显示wrong retry。我的这个单片机本来是5*4的矩阵键盘,但是我的这个毕业设计只用到了上面三排。我设置的是可以输入8位数的密码,通过键盘来输入密码。如果密码输入正确,则可以打开锁。密码由用户自己设置,如果用户忘记了密码,则可以用万能密码打开。
而我设计的报警电路:含有蜂鸣器和一个发光二极管组成。如果输入的密码正确,那么二极管会亮一下,并且蜂鸣器也会发出两下滴滴的声音。如果用户输入的密码错误,那么蜂鸣器就会发出滴滴滴滴滴的声音,即报警。 主要实现功能为:
一、解锁:输入密码>如果正确,1602液晶屏显示Right open,如果错误,显示wrong retry。
二、修改密码:按修改按键>输入密码>确定按键>再次输入密码>确定按键>1602液晶屏显示change success。
三、万能密码锁,密码忘记或被锁定时输入,打开电子锁。 四、如果输入密码错误超过3次,则会停止,需开机重启再试。
五、掉电存储密码:当关闭电源后,用户所修改的密码会存储到EEPROM里面,再次开启电子密码锁时,密码是用户之前所修改的密码。
2.2 芯片的选择
在本次设计中,我所选择的是ATC52的芯片,ATC52芯片是最常见的单片机芯片。
ATC52 密码正确 开锁驱动电路 电磁阀 *欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
电子密码锁工作图 2.2
2.3 主控芯片ATC52单片机的简介
ATC52是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。单片机的EEPROM擦除可重复1000次。ATC052是它的一种精简版本。外形及引脚排列如图所示。 2.3.1主要特性
兼容MCS51指令系统
8kB可反复擦写(大于1000次)Flash ROM; 32个双向I/O口; 256x8bit内部RAM; 时钟频率024MHz; 管脚说明 VCC:供电电压。 GND:接地。
还包含了P0、P1、P2、P3口的基本功能。我就不在这里做出详细的介绍了。下面我们主要来说说P3口的其他功能。
P3口也可作为ATC52的一些特殊功能口。如下表所示: P3口管脚备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断0) P3.3 /INT1(外部中断1) P3.4 T0(计时器0外部输入) P3.5 T1(计时器1外部输入) P3.6 WR(外部数据存储器写) P3.7 RD(外部数据存储器读) RST:复位输入。 振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。 SCON 串行口控制寄存器。它的各个位的具体定义如下: SM0 SM1 SM2 REN TB8 RB8 TI RI
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
而且SMO、SM1可以对应四种模式的设置。串行口工作模式设置。 SM0 SM1 模式功能 波特率 0 0 0 同步移位寄存器 fosc/12 0 1 1 8位UART 可变
1 0 2 9位UART fosc/32 或fosc/ 1 1 3 9位UART 可变 下面是ATC52芯片:
ATC52引脚图及芯片图 2.3
2.4 编程工具
在本次毕业设计中,我所使用的编程工具是KEIL C51 。 Keil C51 简介:
KEIL C51软件是KeilSoftware有限公司的产品,是产于美国的C语言。[1]不同的结构功能是51系列单片机C语言软件开发的兼容的系统。与汇编语言相比更有优势。Keil C51的优势主要在于它的可读性,可维护性和易于使用。另一个重要的一点,则是看看是否可以编译生成的汇编代码。多数语句生成的代码生成的汇编会比较紧凑,易于理解。在大型软件的开发中,可以更好地反映真正的高层次的语言。
我们要完成编辑,编译,连接,调试和仿真的发展过程。在C51的工具包中包含了uVision和IShell的是Windows和DOS C51集成开发环境(IDE)。
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
开发人员可以使用IDE或其他编辑器编辑C源文件或程序集。 C51和A51,其中的目标文件(.OBJ)分别编译。然后您创建的目标文件是建设置于连接在一起生成绝对目标文件和库files.Abs通孔库LIB51 L51文件。调试器源代码级调试一个标准的文件OH51 ABS或16进制文件dscope51 tscope51。可以通过模拟器调试目标板直接使用,可以在程序存储器直接写,如EEPROM。
3. 系统硬件设计 3.1 总框图
总框图里面包括了我单片机中所用到的所有电路,下面会逐个画出来。如图3.1
硬件设计总原理图3.1
3.2 键盘图
我的单片机是5*4的矩阵键盘,但是因为在本次毕业设计中我只用到上面那三排的按键,所以我就只画了一个4*4的按键原理图。它一共用到了7个引脚,分别是P3.0、P3.1、CSDA(P3.2)、LCDEN(P3.4)、RS(P3.5)、WR(P3.6)、RD(P3.7),如图3.2
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
按键模块原理图3.2
3.3 显示模块
下面是1602显示屏的原理图模块,如图3.3
1602显示模块原理图3.3
3.4 蜂鸣器模块
单片机的FM口接两个电阻及一个PNP元件,再接一个FM接地,形成蜂鸣器电路。如图3.4
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
蜂鸣器模块原理图3.4
3.5 LED流水灯模块
八个LED灯与P2相接。74HC573锁存器的19引脚分别与单片机的DB1DB8相连,引脚11与单片机ATC52DIOLA引脚相连。这样形成一个led流水灯模块。如图3.5
LED流水灯模块原理图3.5
3.6 密码掉电保护24C02存储模块
24C02的SDA、SCL分别接1个10K的电阻。SCL是时钟信号引脚,它是在上升沿送入eeprom,下降沿把数据读出来的。SDA是数据的输入、输出引脚。A0A2这三个引脚是24C02硬件连接的器件地址输入引脚。而且A2、A1
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
和A0的内部都是必须连接着的。[2]
24C02存储模块原理图3.6
3.7 晶振时钟电路
单片机的XIAL1引脚和XIAL2引脚都分别接一个30PF的电容,然后再在中间并1个12MHZ的晶振。这样就形成ATC52单片机的晶振电路。如图3.7
晶振时钟电路原理图3.7
3.8 复位电路设计
在这里,我用的是电平,而不是脉冲方式。电平复位时通过RST端经电阻与电源VCC接通而实现的。如图3.8。J13代表的是ATC52芯片。
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
复位电路设计原理图3.8
3.9 串口引脚功能介绍
单片机的P3口外接1602显示屏,用来当做密码输入时显示的显示器。ATC52的INT0引脚外接蜂鸣器。同时,如果INT0引脚被设置成0的时候,蜂鸣器会发出报警的声音。P1口外接发光二极管用来当做系统工作状态提示。
本电路绘制是使用PROTEL 99 SE绘制的。 PROTEL 99 SE简介:
Protel99SE是Protel公司近10年在Windows平台上所开发出来的最新成果。可以从设计到输出物理生产数据电器概念实现,而所有的分析,验证和设计数据管理。。但工具的系统中,覆盖印刷电路板的整个物理设计的核心。该软件Protel的最新版本可以毫无障碍地阅读的OrCAD,加速度(PCAD)等知名EDA公司设计文件,使用户顺利过渡到新平台的EDA。
PROTEL99 SE可以分为五个模块,其中包括原理图设计,PCB设计,包括信号完整性分析,自动路由设备,混合信号仿真,PLD设计原理图。下面是一些用Protel99SE的新功能的大部分的: 该电连接可以产生30种网络表的格式。 强大的全局编辑功能。
同时操作原理图和PCB图,再开放搜索组件之间的原理图和PCB地图,允许双向交叉。
可以转发注释组件标记(从示意图到PCB),也可以反向注解(由PCB至示意图)。电气原理图和PCB的设计,都可以保持一致性。易于使用的数字模式的混合仿真(兼容3F5)。
支持中国大学的语言和PLD,杰德生成标准的下载文件的原理图设计。 还包含了放置汉字的功能。
检验的传输线路特性和仿真验证了准确的计算算法,信号完整性分析直接开始
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
从印刷电路板。
反射和串扰仿真波形显示效果和便捷的测量工具组合。 3.10 硬件成品
这是一整块的单片机板。如图3.10
单片机板成品图3.10
下面是1602显示屏,如图3.11
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
1602显示屏图3.11
4.软件设计 4.1 系统软件设计流程图: 流程图: 系统返回 是 输入新密码 否 修改密码 开始 系统唤醒上电 系统等待密码输入 输入错误,蜂鸣器报警,要求重新输入密码。 从键盘输入8位数密码,确定 比较输入的密码与EEPROM密码是否相同 密码错误 密码正确 错误次数累加,若错误3次,系统锁定。 LED灯亮,蜂鸣器响两声,开门 断电重启 *欧阳光明再次输入密码*创编 2021.03.07 密码保存后系统返回 *欧阳光明*创编 2021.03.07
判断两次输入的密码是否一致 否 蜂鸣器报警提示密码错误 是 系统软件设计流程图4.1 4.2 系统软件设计流程
本设计的软件程序设计主要有: (1) 初始化程序
这段程序主要做的就是1602的显示。我们先设置的是1602液晶屏显示的模式。然后显示开关,及清屏。还有就是1602显示屏的显示光标的移动。 (2)按键功能实现
密码输入按键:按键功能的是实现是用户先输入8位密码,然后按确定键。此时,系统会自动判断用户输入的密码是否与EEPROM里面所存储的密码是不是一样的。如果用户输入的密码,和eeprom里面存储的密码是一样的。那么1602显示屏就会提示RIGHT,OPEN。那么相反的,如果用户输入的密码,和eeprom里面存储的密码是不一样的。那么1602显示屏就会提示
wrong,retry。要是用户输入的密码,错误的次数累计超过了3次。那么程序会被锁定,需要断电重启才能再从键盘输入密码。
密码修改按键:用户选择修改密码,然后用户需要先输入旧密码。此时,由系统判断用户输入的密码是否与EEPROM里面所存储的密码是一样的。如果用户输入的密码,和eeprom里面存储的密码是一样的。那么1602显示屏就会提示RIGHT,OPEN。如果不是一样的,即用户输入的密码,和eeprom里面存储的密码是不一样的。那么1602显示屏就会提示wrong,retry。要是用户输入的密码的错误累计次数超过了3次。那么程序会被锁定,需要断电重启才能再从键盘输入密码。 (3)密码修改程序
按修改密码按键 输入想要修改的密码 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07
第二次输入密码 输入密码不一致 比较两次输入的密码 修改失败 输入修改成功 密码一致 密码修改程序流程图5.2.3 返回主程序 (4)报警程序 比较输入密码与存储密码是否一致 输入密码 N Y 蜂鸣器响两声 蜂鸣器报警5声 密码正确,密码锁打开 密码错误 输入错误,蜂鸣器报警,要求重新输入密码。 返回 报警程序流程图5.2.4 错误次数累加,若错误3次,系统锁定。 断电重启系统 (5)显示模块程序 系统上电唤醒 清屏 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07
液晶屏亮显示welcome iInput password 显示模块程序流程图4.2.5 返回 5.程序调试
第一,把你已经编写好的C语言程序代码下载到你的软件调试工具里面。其次,汇编后就查看所编写完成的代码是否有错误。然后再查看编译时的错误提示,分析提示,把这个程序进行修改。修改无误后再进行单片机生成机器代码hex文件。如果程序可以进行编译,并且没有提示错误。那么就使用STC479将之前完成的51单片机的代码烧录至开发板。再根据实际情况,如果有未实现的功能,则再次将代码进行修改,直到完成所需要的功能为止。
5.1 程序调试用到的软件及工具
我的这个毕业设计的调试软件主要是有用到KEIL C51,以及51开发板一块和与其配套的下载烧录软件STC479。
5.2 调试过程
首先我们先打开KEIL C51软件,然后新建工程时选择ATMEL、C52并且保存,新建文本框写入代码后再点击保存,并添加到组中。然后开始检查是不是有语法错误,经过检查后确认没有错误,则生成51单片机可执行的HEX文件。然后用51开发板相匹配的烧录STC479软件把HEX文件烧写进单片机内,烧写成功后,测试程序是否可以在单片机上运行,并且查看所编写的功能是否有实现。 5.2.1 显示模块测试:
第一,我要先测试的是屏幕是否能显示,测试过程中,刚开始是不能显示的。于是我想通过修改程序来改变它的状态,但是改完代码发现还是不能显示。在最后,我选择查看自己的硬件是否出了问题,最后发现是在1602液晶屏与单片机相接时。引脚插反了,所插的引脚和我代码所写的引脚是相反的。
第二,测试能显示之后还要测试显示的是否是正常状态,要求显示的内容必须正确。在测试过程中,我发现屏幕老是会出现花屏,但是它的内容显示的是正确的。于是我就这个问题作了修改,将屏幕的延时作了修改,改完之后,会好一些。但是还是会出现花屏。 5.2.2 键盘模块测试:
第一,我首先要测的也是键盘按键按下之后,按键传输至ATC52中,
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
再从ATC52中传送至显示屏。然后通过查看显示屏是否会有反应来确定键盘是否正常。
第二,确定正常之后再给键盘定义我所需要它输出来的数字和功能分别是哪些,是否都能实现,最后测试完毕后发现基本都是正常的,只是有时候按键会不够灵敏。
5.2.3 蜂鸣器模块测试:
第一,我首先要先用代码确定蜂鸣器是否可用,确定可用之后,调试发出声音的次数和我代码写的次数是否一致,测试之后发现是对的。
第二,再测发出声音的频率是否正确,然后再将完整的代码烧入进去测试,发现密码输入错误是会报警,那么蜂鸣器的测试结果正常。 5.2.4复位模块测试:
首先要确定测试复位按钮可用,将代码烧写进去之后,若出现显示屏花屏现象时,我们可以选择按复位键必须回到初始状态,而不用像我之前一样,断电重启才行。最后的测试结果正常。 5.2.5 24C02存储模块测试:
第一,我们要先测试24C02这个芯片是否能正常使用,使用数码管测试。先将测试程序即测试开机次数代码,烧录至单片机板内。然后反复开关机,查看数码管的状态,次数是否会增加。测试结果是24C02芯片是可用的。
第二,我再将已经改写完成的掉电存储密码的程序烧录至单片机板内,选择修改密码,修改完成后断电。使用新密码登陆,看能否登陆。能登陆即代码改写成功,否则不成功。测试的结果是不成功的。在经过多次更改和反复测试后,一直都不成功。于是,我向同学求助。同学看过之后发现我代码的写入和读出有问题。在同学的帮助下,我修改了代码。使得电子密码锁掉电之后终于能够记住掉电前所修改的密码了。
第三,就是测试整个电子密码锁功能是否正常,在修改的过程中是否有影响到其他功能的使用。于是,我将电子密码锁所有的功能都进行了一次测试,发现又出现了一个新的问题,那便是密码输入错误后提示再次输入,按按键没有反应,即密码出错一次就不能再输入密码了,只能断电重启。于是我就重新查看代码是否哪里有误,最后发现,我所定义的数据写入的参数与按键输入密码的参数相同。最后我将定义的参数改了一下就可以正常使用了。
所以,24C02的最后测试结果是正常的。
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
5.3遗留问题
在最后,还要说一下在本次毕业设计中的遗留问题。在设计过程中我遇到了很多的问题,有的解决了,有的还未解决。下面就是我遗留下来的问题: 1.再输入密码的过程中,我的显示屏老是会出现中间跳空了某一个数字。我也修改了代码,延迟数据接收的速率,但是效果并不是很明显。
2.在按键按动的过程中,经常性的出现花屏现象。我先选择用延时来解决,修改完延时后,这个问题有所改善,但并没有完全解决。我想可能还需要去抖,还有就是我在想也许我的硬件也存在一些接触问题。但由于现在时间紧迫,只能先将这个问题留在这里了。我觉得解决这个问题的大致的一个方案,就是选择延时,然后去抖或者硬件方面做出的修改。
3.最后还有一个就是按键不是很灵敏 。很多时候按一下,它会跳出两个数字,要不然就是没有反应。我想可能还是和键盘模块的代码有关系。还需要修改按键的接收字节的速率。
4.还有一个比较严重的问题就是,用户不需要先输入密码就能选择修改密码。虽然说用户不需要进入电子密码锁就能修改密码比较奇怪。但是由于时间的问题,我还不能够将它改正。但我的解决方案大概就是在用户按修改密码之前,要先判断用户是否进入电子密码锁成功。如果用户还没有进入电子密码锁,则提示请开锁。如果已经进入电子密码锁,那么久、用户就可以自行进行密码的修改。
6. 设计总结
在本次毕业设计中,我看到了自己很多的不足之处,首先,对于自己要做的这个设计,没有做到完善功能。其次,有些问题还是没有改正,比如说屏幕去斗。很经常出现屏幕变花,但是我多次修改,还是没有将它改正。在调试过程中也出现了很多的问题,比如总是出现重复定义,或者没有定义的情况。最最困难的一件事情就是点点后密码的存储问题。经过多我自己的多次修改,还是没有办法将它改正,应此我不得不向同学们求解。在不断的求解过程中,我发现自己的能力还是很不足的。至少在实践上还是与理论上有很大差的。 从本次毕业设计中,告诉了我,要不断的努力,不断的去复习,去学习。不管是做什么事,我们都要用尽全力去做去拼。完成毕业设计的过程中,我的导师郑明老师,他给了我很大的鼓励,让我不断的完善自己,不断的去学习,去做的更好,将毕业设计完成得更加的完善。
但是,由于我的能力有限,还是遗留了很多问题的。而且因为时间关系,所以
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
只能等到日后我自行去解决。如今,电子密码锁在社会上是越来越广泛了,随着科技的发展,我相信电子密码锁会变得更加的完善,成为保护人们财产安全的一大助手。
在我们现在生活的社会,哪里都要用到密码。所以我相信,电子密码锁一定会是一个很成功的存在。不管什么时候,都不会过时,而我们现在最需要做的就是不断的去完善它,加强它的功能和安全性。让人们今后在使用它时,尽量少的出现问题。能够放心的去使用。
最后,我想说的是,虽然在设计这个电子密码锁的时候。会出现很多的难处,很多不理解和不能完成的地方,但是我还是坚持下来了。这件事情让我明白了一个道理,遇到事情不能随随便便就放弃。如果你选择了做一件事,就不要随随便便放手。因为你永远不知道,你什么时候会成功,但是你如果放弃,却马上可以知道你一定会失败。
参考文献
[1]江春来.《电梯曳引机扭振测试新方法的研究》重庆:机械电子工程, [2] 康华光.电子技术基础(模拟部分)[M].北京:高等教育出版社,
[3] 余发山,王福忠.单片机原理及应用技术[M].徐州:中国矿业大学出版社, [4] 潘永雄.新编单片机原理及应用[M].西安:西安电子科技大学出版社, [5] 康华光.电子技术基础(数字部分)[M].北京:高等教育出版社,
[6] .存储芯片24C02中文资料
[7]张毅刚.MCS51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社, [8] 李广第等.单片机基础[M].北京:北京航空航天大学出版社,.
[9] 彭为.单片机典型系统设计实例精讲[M].北京:电子工业出版社,.
[10]余发山,王福忠.单片机原理及应用技术[M].徐州:中国矿业大学出版社, [11] 刘和平.刘跃.单片机原理及应用.重庆.重庆大学出版社,
[12] 陈明荧.C51单片机课程设计实训教材.北京.清华大学出版社, [13]刘瑞新.单片机原理及应用教程.北京.机械工业出版社,
[14] 李朝青.单片机原理及接口技术.北京.北京航空航天大学出版社, [15] 张立科.单片机典型外围器件及应用实例.北京.人民邮电出版社,
[16]王忠飞.胥芳 MCS51单片机原理及嵌入式系统应用.西安电大出版社,
*欧阳光明*创编 2021.03.07
*欧阳光明*创编 2021.03.07
致谢
首先,在我的本次论文设计过程中,郑明老师给予了我很大的帮助。郑明导师从选题构思到最后定稿的各个环节都给予了我细心指引与教导。在此我表示衷心的感谢。郑明老师是一个很负责任的老师,从我第一天上他的课开始,我就发现了。他严谨的教学态度,是最值得我学习的地方。在我的论文出现比较多问题的时候,他都很认真的指导我。教导我怎么做,怎么去修改才能做得更好。还有就是要感谢我的同学们,在我遇到不懂的问题时,他们都给了我很多的帮助,尤其是在写代码的方面。最后,我要感谢各科老师和同学们这些年来的帮助和陪伴,因为有他们在,使我的大学生涯变得这么的多姿多彩。
在毕业答辩之前,我还要感谢各位评委老师在这么忙碌的时间里,还要抽出时间来帮我审批毕业论文。并且参与我论文答辩的评议。在此我还要感谢各位老师的耐心指导。感谢各位老师在我学习生涯中给与的鼓励和帮助,在今后的生活中,我会不断的改正自己,提升自己,使得自己能够将每件事都做的更好。
最后,还要感谢我的学校闽江学院,它给了我一个难忘的回忆,一个有关我青春故事的回忆。在这个学校里,我收获了很多东西,有知识,有友情。还有很多很多我们忘不掉的回忆。我的大学生活虽然在这里停步了,但我相信,我的未来不会停下。
附录
Main.c /*
名称:液晶显示密码锁 论坛:www.doflye.net 编写:wangyd 日期:.3 修改:无 内容: */
//#include *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 #include\"1602.h\" #include\"delay.h\" #include\"keyboard.h\" #include\"spk.h\" #include sbit SDA=P2^0; //将串行数据总线SDA位定义在为P3.5引脚 sbit SCL=P2^1; #define 0001B #define 0000B unsigned int password[8]={1,2,3,4,5,6,7,8};//可以更改此密码做多组测试 unsigned char Admpassword[8]={8,8,8,8,8,8,8,8};//可以更改此密码做多组测试 //定义密码,实际上密码需要存在eeprom中,可以通过程序更改。请用户自行添加 /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒 ***************************************************/ void delay1ms() { unsigned char i,j; } /***************************************************** 函数功能:延时若干毫秒 入口参数:n ***************************************************/ *欧阳光明*创编 2021.03.07 for(i=0;i<10;i++) for(j=0;j<33;j++) ; OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1即为1010 OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 *欧阳光明*创编 2021.03.07 void delaynms(unsigned char n) { unsigned char i; } /******************************************************************************* /******************************************************************************* 以下是对AT24C02的读写操作程序 ********************************************************************************/ /*************************************************** 函数功能:开始数据传送 ***************************************************/ void start() // 开始位 { SDA = 1; //SDA初始化为高电平“1” SCL = 1; //开始数据传送时,要求SCL为高电平“1” _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SDA = 0; //SDA的下降沿被认为是开始信号 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的for(i=0;i /*************************************************** 函数功能:结束数据传送 ***************************************************/ void stop() *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 // 停止位 { } /*************************************************** 函数功能:从AT24Cxx读取数据 出口参数:x ***************************************************/ unsigned char ReadData() // 从AT24Cxx移入数据到MCU { unsigned char i; unsigned char x; //储存从AT24Cxx中读出的数据 for(i = 0; i < 8; i++) { SCL = 1; //SCL置为高电平 x<<=1; //将x中的各二进位向左移一位 x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存SDA = 0; //SDA初始化为低电平“0” _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL = 1; //结束数据传送时,要求SCL为高电平“1” _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SDA = 1; //SDA的上升沿被认为是结束信号 入x中 } /*************************************************** *欧阳光明*创编 2021.03.07 } return(x); //将读取的数据返回 SCL = 0; //在SCL的下降沿读出数据 *欧阳光明*创编 2021.03.07 函数功能:向AT24Cxx的当前地址写入数据 入口参数:y (储存待写入的数据) ***************************************************/ //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0 bit WriteCurrent(unsigned char y) { unsigned char i; bit ack_bit; //储存应答位 for(i = 0; i < 8; i++) { SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S //因为传送时高位在前,低位在后 _nop_(); //等待一个机器周期 // 循环移入8个位 SCL = 1; //在SCL的上升沿将数据写入AT24Cxx _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL = 0; //将SCL重新置为低电平,以在SCL线形成传 送数据所需的8个脉冲 } SDA = 1; // 发送设备(主机)应在时钟脉冲的高电 y <<= 1; //将y中的各二进位向左移一位 平期间(SCL=1)释放SDA线, //以让SDA线转由接收设备(AT24Cxx)控制 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL = 1; //根据上述规定,SCL应为高电平 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接 收到一个字节 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 //若送高电平,表示没有接收到,传送异常 SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的 数据传递) } /*************************************************** 函数功能:向AT24Cxx中的指定地址写入数据 入口参数:add (储存指定的地址);dat(储存待写入的数据) ***************************************************/ void WriteSet(unsigned char add, unsigned char dat) // 在指定地址addr处写入数据WriteCurrent { start(); //开始数据传递 WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要return ack_bit; // 返回AT24Cxx应答位 对其写入数据 } /*************************************************** 函数功能:从AT24Cxx中的当前地址读取数据 出口参数:x (储存读出的数据) ***************************************************/ unsigned char ReadCurrent() { unsigned char x; start(); //开始数据传递 WriteCurrent(OP_READ); //选择要操作的AT24Cxx芯片,并告知要WriteCurrent(add); //写入指定地址 WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据 stop(); //停止数据传递 delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上 读其数据 x=ReadData(); //将读取的数据存入x stop(); //停止数据传递 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 } /*************************************************** 函数功能:从AT24Cxx中的指定地址读取数据 入口参数:set_add 出口参数:x ***************************************************/ unsigned char ReadSet(unsigned char set_add) // 在指定地址读取 { start(); //开始数据传递 WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知return x; //返回读取的数据 要对其写入数据 } /* 主程序 */ main() { unsigned char num,i=0,j,k; unsigned char passwordtemp[10]; //最大输入16个 unsigned char passwordChange[10]; //最大输入16个 unsigned char inputtimes; //密码输入错误次数 unsigned char passwordlength,PLEN; //输入密码长度,实际密码长度 unsigned char ChangeSecFlag = 0; bit Flag; bit ChangeFlag = 0; PLEN=sizeof(password)/sizeof(password[0]);//用于计算出实际密码长度 LCD_Init(); //初始化液晶屏 DelayMs(100); //延时用于稳定,可以去掉 *欧阳光明*创编 2021.03.07 WriteCurrent(set_add); //写入指定地址 return(ReadCurrent()); //从指定地址读出数据并返回 *欧阳光明*创编 2021.03.07 LCD_Clear(); //清屏 LCD_Write_String(0,0,\" Welcome! \"); //写入第一行信息,主循环中不再更改此信息,所以在while之前写入 LCD_Write_String(0,1,\"Input password!\"); //写入第二行信息,提示输入密码 while (1) //主循环 { 代替 DelayMs(1000); //延时用于稳定,可以去掉 num=KeyPro(); //扫描键盘 if(num!=0xff) //如果扫描是按键有效值则进行处理 { if(i==0) //输入是第一个字符的时候需要把改行清空,方便观看密码 LCD_Write_String(0,1,\" \");//清除该行 if(i<8) { if((ChangeFlag == 0) || (ChangeSecFlag == 0)) { } else { if(ChangeSecFlag == 1) { } else { } LCD_Write_Char(i,1,num + '0');//输入的密码用\"*\" passwordChange[i]=num; passwordtemp[i]=num; passwordtemp[i]=num; LCD_Write_Char(i,1,'*');//输入的密码用\"*\"代替 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 } i++; //输入数值累加 if((10==num)/*|| (i==9)*/)//输入按键值15或者密码输入到最大值 } LCD_Write_Char(i,1,'*');//输入的密码用\"*\"代替 16,表示输入结束,需要进行比对 { passwordlength=i1; //计算输入密码长度 i=0; //计数器复位 /*if(10 != num) { }*/ if(ChangeFlag == 0) { // 数据读出eeprom for(k=0; k< 8; k++) { } if(passwordlength == PLEN)//长度相等则比较,否 password[k] = ReadSet(0x00 + 2*k); passwordlength += 1; 则直接输出错误 { Flag=1;//先把比较位置1 for(j=0;j Flag=Flag&&(passwordtemp[j]==password[j]);//比较输入值和已有密码 if(!Flag) { Flag = 1; *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 j = 0; for(j=0;j LCD_Write_String(0,1,\"Right } if(Flag)//如果比较全部相同,标志位置1 { LCD_Write_String(0,1,\" \");//清除} Flag=Flag&&(passwordtemp[j]==Admpassword[j]);//比较输入值和已有 Open!>>>>\");//密码正确显示的信息 P1=0xfe; DelayMs(200); DelayMs(200); PasswordSpk1(); P1=0xff; 计数 该行 LCD_Write_String(0,1,\"Wrong! Retry!\");//密 } else { LCD_Write_String(0,1,\" \");//清除Flag=0; //清除正确标志 inputtimes=0;//输入正确则次数清零,重新 码错误,提示重新输入 ChangeFlag = 0; ChangeSecFlag = 0; inputtimes++;//连续输入错误,则次数累加 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 PasswordSpk(); if(inputtimes==3) { LCD_Write_String(0,1,\" \");//清除该行 LCD_Write_String(0,1,\"Wrong 3 times!\");//密码错误,提示重新输入 while(1);//停止该位置,重启电源后 才能输入,实际实用中则需要等到一定时间后才能再次输入。 } else { if(ChangeSecFlag == 0) { if(passwordlength == PLEN)//长度相等则比 } } 较,否则直接输出错误 { Flag=1;//先把比较位置1 for(j=0;j Flag=Flag&&(passwordtemp[j]==password[j]);//比较输入值和已有密码 if(!Flag) { Flag = 1; j = 0; for(j=0;j Flag=Flag&&(passwordtemp[j]==Admpassword[j]);//比较输入值和已有 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 密码 } if(Flag)//如果比较全部相同,标志位置1 { ChangeSecFlag = 1; LCD_Write_String(0,0,\" } \");//清除该行 LCD_Write_String(0,1,\" \");//清除该行 LCD_Write_String(0,0,\"Change Password!\");//密码正确显示的信息 LCD_Write_String(0,1,\"New password!\"); //写入第二行信息,提示输入密码 inputtimes=0;//输入正确则次数清 零,重新计数 } else { LCD_Write_String(0,1,\" Flag=0; //清除正确标志 \");//清除该行 LCD_Write_String(0,1,\"Wrong! Retry!\");//密码错误,提示重新输入 inputtimes++;//连续输入错误,则次 数累加 PasswordSpk(); if(inputtimes==3) { LCD_Write_String(0,1,\" \");//清除该行 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 LCD_Write_String(0,1,\"Wrong 3 times!\");//密码错误,提示重新输入 while(1);//停止该位置,重启 电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。 该行 该行 LCD_Write_String(0,0,\"Change LCD_Write_String(0,1,\" \");//清除 } else if(ChangeSecFlag == 1) { ChangeSecFlag = 2; LCD_Write_String(0,0,\" \");//清除 } } Password!\");//密码正确显示的信息 LCD_Write_String(0,1,\"Again password!\"); //写入第二行信息,提示输入密码 } else if(ChangeSecFlag == 2) { Flag=1;//先把比较位置1 for(j=0;j Flag=Flag&&(passwordtemp[j]==passwordChange[j]);//比较输入值和 已有密码 if(Flag)//如果比较全部相同,标志位置1 { for(j=0;j { password[j]=passwordtemp[j]; *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 } // 数据写入eeprom for(k=0; k< 8;k++) { WriteSet(0x00 + 2*k ,password[k]); } LCD_Write_String(0,1,\" \");//清除该行 LCD_Write_String(0,1,\"Change Success!>>>>\");//密码正确显示的信息 DelayMs(2000); ChangeFlag = 0; ChangeSecFlag = 0; inputtimes=0;//输入正确则次数清 零,重新计数 } else { LCD_Write_String(0,1,\" \");//清 Flag=0; //清除正确标志 除该行 LCD_Write_String(0,1,\"Change Fail!>>>>\");//密码正确显示的信息 DelayMs(2000); ChangeFlag = 0; ChangeSecFlag = 0; inputtimes=0;//输入正确则次数清 零,重新计数 } DelayMs(2000); //延时用于稳定,可以 Flag=0; //清除正确标志 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 去掉 LCD_Clear(); //清屏 LCD_Write_String(0,0,\" Welcome! \"); //写 入第一行信息,主循环中不再更改此信息,所以在while之前写入 LCD_Write_String(0,1,\"Input password!\"); //写入第二行信息,提示输入密码 } if(11 == num) { LCD_Write_String(0,0,\" \");//清除该行 LCD_Write_String(0,1,\" \");//清除该行 LCD_Write_String(0,0,\"Change Password!\");//密码正确 } } 显示的信息 LCD_Write_String(0,1,\"Input Old!\"); //写入第二行信 息,提示输入密码 } } 1602.C /* 名称:LCD1602 论坛:www.doflye.net 编写:wangyd 日期:.3 修改:无 内容: *欧阳光明*创编 2021.03.07 } } ChangeFlag = 1; ChangeSecFlag = 0; i = 0; *欧阳光明*创编 2021.03.07 引脚定义如下:1VSS 2VDD 3V0 5RS 6R/W 4E 714 DB0DB7 15BLA 16BLK */ #include \"1602.h\" #include \"delay.h\" #define CHECK_BUSY sbit RS = P3^5; //定义端口 sbit RW = P3^6; sbit EN = P3^4; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 /* 判忙函数 */ bit LCD_Check_Busy(void) { #ifdef CHECK_BUSY DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); #else return 0; #endif } *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 /* 写入命令函数 */ void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } /* 写入数据函数 */ void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } /* 清屏函数 */ void LCD_Clear(void) { LCD_Write_Com(0x01); *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 DelayMs(10); } /* 写入字符串函数 */ void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { while (*s) { LCD_Write_Char(x,y,*s); s ++; x++; } /* 写入字符函数 */ void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) else { LCD_Write_Com(0xC0 + x); } { LCD_Write_Com(0x80 + x); } } LCD_Write_Data( Data); } /* 初始化函数 */ void LCD_Init(void) *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(100); LCD_Write_Com(0x38); DelayMs(100); LCD_Write_Com(0x38); DelayMs(100); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(100); LCD_Write_Com(0x0C); /*显示开及光标设置*/ } Delay.c #include \"delay.h\" /* uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS */ void DelayUs2x(unsigned char t) { while(t); } /* mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 */ void DelayMs(unsigned char t) *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 { while(t) { //大致延时1mS DelayUs2x(245); } Keyboard.c /* 名称:矩阵键盘 论坛:www.doflye.net 编写:wangyd 日期:.3 修改:无 内容: */ #include 按键扫描函数,返回扫描键值 */ unsigned char KeyScan(void) //键盘扫描函数,使用行列反转扫描法 { unsigned char cord_h,cord_l;//行列值中间变量 KeyPort=0x0f; //行线输出全为0 cord_h=KeyPort&0x0f; //读入列线值 if(cord_h!=0x0f) //先检测有无按键按下 { DelayMs(10); //去抖 *欧阳光明*创编 2021.03.07 DelayUs2x(245); *欧阳光明*创编 2021.03.07 if((KeyPort&0x0f)!=0x0f) { cord_h=KeyPort&0x0f; //读入列线值 KeyPort=cord_h|0xf0; //输出当前列线值 cord_l=KeyPort&0xf0; //读入行线值 while((KeyPort&0xf0)!=0xf0);//等待松开并输出 return(cord_h+cord_l);//键盘最后组合码值 } }return(0xff); //返回该值 } /* 按键值处理函数,返回扫键值 */ unsigned char KeyPro(void) { switch(KeyScan()) { /*case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值 case 0x7d:return 1;break;//1 case 0x7b:return 2;break;//2 case 0x77:return 3;break;//3 case 0xbe:return 4;break;//4 case 0xbd:return 5;break;//5 case 0xbb:return 6;break;//6 case 0xb7:return 7;break;//7 case 0xde:return 8;break;//8 case 0xdd:return 9;break;//9 case 0xdb:return 10;break;//a case 0xd7:return 11;break;//b case 0xee:return 12;break;//c case 0xed:return 13;break;//d case 0xeb:return 14;break;//e *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 case 0xe7:return 15;break;//f*/ case 0x7e:return 3;break;//3 按下相应的键显示相对应的码值 case 0x7d:return 7;break;//7 case 0x7b:return 11;break;//11 //case 0x77:return 15;break;//3 case 0xbe:return 2;break;//4 case 0xbd:return 6;break;//5 case 0xbb:return 10;break;//6 // case 0xb7:return 14;break;//7 case 0xde:return 1;break;//8 case 0xdd:return 5;break;//9 case 0xdb:return 9;break;//a // case 0xd7:return 13;break;//b case 0xee:return 0;break;//c case 0xed:return 4;break;//d case 0xeb:return 8;break;//e //case 0xe7:return 12;break;//f default:return 0xff;break; } Spk.c /* 名称:喇叭 论坛:www.doflye.net 编写:wangyd 日期:.3 修改:无 内容:模拟报警声,如闹钟 滴 滴 滴 滴 */ //#include #include *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 #include\"delay.h\" sbit SPK=P2^3; //定义喇叭端口 void PasswordSpk(void) { unsigned int i; for(i=0;i<10;i++) { DelayMs(200); SPK = !SPK; } //TR0=0; //SPK=0;//防止一直给喇叭通电造成损坏 //DelayMs(5000); SPK=1; } void PasswordSpk1(void) { unsigned int i; for(i=0;i<4;i++) { DelayMs(200); SPK = !SPK; } //TR0=0; //SPK=0;//防止一直给喇叭通电造成损坏 //DelayMs(5000); SPK=1; } *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 附件3 闽江学院本科毕业论文(设计)题目审批表 系别: 年级 学生姓名 指导教师 题目来源 所选题目 选题 理由 指导教师 意见 指导教师(签名): 年月日 专业 学号 职称 题目类型 主管教学系领导审批意见 系主任(签名): 年月日 备注 题目来源(**项目、自选),题目类型(文献综述、理论探讨、试验研究、工程设计、系统开发、其他)。 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 附件4 闽江学院 毕业论文(设计)任务书 论文题目_______________________ 系别_______________________ 年级_______________________ 专业_______________________ 学生姓名_______________________ 学号_______________________ 指导教师_______________________ 职称_______________________ 系主任_______________________ 论文时间_______________________ 年月日 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 一、论文(设计)主要内容 二、论文(设计)的基本要求 三、论文(设计)进度安排 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 阶段 1 2 3 4 5 6 7 8 备注: 论文(设计)各阶段名称 起止日期 四、应收集的资料及主要参考文献(指导教师指定) 说明:此任务书由指导教师填写,一式三份,一份发给学生使用,一份给指导教师留存,一份存档。 附件5 闽江学院毕业论文(设计)开题报告 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 系级专业班 学生姓名 指导教师 论文题目 开题报告内容 一、选题的准备、背景、意义、基本思路、方法和主要观点 学号 论文方向 二、选题的需要性、创新性、科学性和可行性论证 三、研究方法和手段、论证方法及其特点 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 四、写作提纲 五、计划进度(以周为单位) 六、主要参考文献 指导教师意见 指导教师(签名):年月日 系主任意见 系主任签名:年月日 注:本表一式三份,指导教师和学生各一份,系存档一份 附件6 闽江学院毕业论文(设计)中期检查表 系别: 年级 专业 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 学生姓名 指导教师 论文题目 计划完成 时间 论文(设计) 的进度计划 已经完成 的内容 指导教师 意见 备注 附件7 闽江学院毕业论文(设计)成绩指导教师评定表 系级专业班 学生姓名学号 毕业论文(设计)题目 一、成绩评定 论文质量 评分 项目 工作创新性 态度 分析问设计题解决选题 方案 问题能力 10 20 20 指导教师(签名): 年月日 学号 职称 实现 情况 论文质量 其它 合计 分值 10 10 10 20 100 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 评定 分数 二、指导教师评语 指导教师(签名): 年月日 附件8 闽江学院毕业论文(设计)成绩评阅教师评定表 系级专业班 学生姓名学号 毕业论文(设计)题目 一、成绩评定 论文质量 评分 项目 创新性 选题 10 10 设计方案 20 分析能力 20 实现情况 10 论文质量 30 其它 合计 分值 评定 分数 100 二、评阅教师评语 评阅教师(签名): 年月日 附件9 闽江学院毕业论文(设计)答辩记录表 系级专业班组共人 学生姓名 答辩时间 答辩小组成员 学号 答辩地点 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 论文题目 提问及回答情况记录 附件10 闽江学院毕业论文答辩成绩评定表 系级专业班 学生姓名学号 毕业论文(设计)题目 一、成绩评定 序号 1 2 3 4 评分项目 评分 组长:记录人: 年月日 答辩态度(10分)创新性(5分) 论文质量(15分) 口头报告(20分) 回答问题的正确情况(50分) 总分 二、答辩小组评语 组长(签名): 年月日 附件11 闽江学院毕业论文(设计)系答辩委员会决议书 系级专业班 学生姓名 论文题目 学号 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 指导教师 评定成绩 评阅教师 评定分数 答辩小组 评分 毕业论文 最终成绩 毕业论文 评定等级 系答辩 委员会 评语 系答辩委员会主任(签名): 年月日 注::1、毕业论文最终成绩=指导教师评定成绩*40%+评阅教师评定分数 *20%+答辩小组评分*40%; 2、毕业论文等级分为优、良、中、及格和不及格等五个等级。 附件12 闽江学院毕业论文(设计)成绩汇总表 系级专业班年月日 毕业论文 (设计)题目 成绩 指导教师 职称 总分 等级 学号 姓名 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 备注:本班实有学生人数人,毕业论文实有篇数篇。 其中,论文成绩评为优秀的篇,占% 论文成绩评为良好的篇,占% 论文成绩评为中等的篇,占% 论文成绩评为及格的篇,占% 论文成绩评为不及格的篇,占% 附件13 闽江学院毕业生到校外进行毕业论文(设计)申请表 院系 学号 校外指导教师姓 专业 联系电话 职称 姓名 电子邮箱 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 名 联系电话 所在单位名称 校内指导教师姓名 电子邮箱 单位地址 职称 申请校外做毕业原因: 论文(设计)的承诺按照学校要求做好开题、中期检查、答辩以及上传论文等环原因(交换生或节的工作,如不按要求做而影响毕业,责任自负。 国际学院的学生学生签名:家长签名: 请注明) 校外指导单位意见 满足学生毕业论文(设计)所需条件、同意接收该生在本单位完(或提供单位邀成毕业论文(设计),并在此期间负责管理学生。 请函或接收函单位负责人签字(单位公章):年月日 等) 校外指导教师简介 毕业论文(设计)题目及内容简介 指导教师意见(签字): 年月日 校外指导教师意见(签院(系)主任审核意见(签字): 字盖章): 年月日 年月日 注:本表审核后,由学生本人各存留一份。 附件14 闽江学院毕业论文(设计)选题变更申请表 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 姓名 院(系) 专业班级 指导教师 改变选题方向原因 指导教师 年月日 院(系)意见 负责人 年月日 教务处意见 负责人 年月日 本表打印、签字盖章后,装入资料袋存档。 附件15 闽江学院毕业论文答辩成绩评定表 *欧阳光明*创编 2021.03.07 *欧阳光明*创编 2021.03.07 学生姓名学号 毕业论文(设计)题目 一、成绩评定 序号 评分项目 评分 答辩态度(10 1 分)创新性(5分) 2 论文质量(15 分) 3 口头报告(20 分) 4 回答问题的正确 情况(50分) 总分 *欧阳光明*创编 2021.03.07
因篇幅问题不能全部显示,请点此查看更多更全内容