目 录
摘 要 Ⅰ
Abstract Ⅱ
引 言 1
1 系统总体设计 3
1.1 系统设计要求 3
1.2 系统设计思路 3
2 系统硬件设计 5
2.1 设计原理 5
2.2 主控模块 5
2.3 芯片模块 8
2.4 矩阵键盘模块 9
2.5 液晶显示模块 10
2.6 继电器驱动模块 12
2.7 蜂鸣器模块 13
2.8 蓝牙模块 14
3 系统软件设计 16
3.1 软件设计开发环境 16
3.2 编程语言选择 16
3.3 程序流程图 17
4 系统调试 20
4.1 硬件调试 20
4.2 软件调试 20
4.3 问题及解决方法 21
结 论 23
参考文献 24
附录1 硬件原理图 26
附录2 源程序清单 27
致 谢 34
摘 要
在我们的生活当中,处处都能看到锁的身影,小到家门上的锁,大到银行保险柜上的锁。当人们想要保护贵重物品时,锁往往会被广泛使用。随着时代的不断发展与进步,人们对锁的安全性越来越重视。传统机械锁,由于其内部结构简单,使用安全性低,所以慢慢的淡出了人们的视野。具有蓝牙功能的电子密码锁渐渐受到了大家的喜爱。和传统机械锁相比,运用蓝牙技术的密码锁,能够成功地保障用户的安全信息,可以极大程度的解决旧锁具的不足,满足了人们对于锁的安全性的要求。
在基于单片机的蓝牙无线密码锁设计中,将蓝牙技术作为本次设计的核心内容,通过运用STC89C52单片机,加上LCD液晶显示器模块,以及多种类的相关零件,可以提供多种较为便利的设定,成功帮助用户解决开锁以及闭锁等诸多方面的内容,且将整个过程科学合理化,最大程度地保障人们的安全。
经实验验证,相比于传统机械锁,蓝牙无线密码锁具有安全便捷成本低等优点,可普遍应用于家庭、宾馆、办公大楼、银行等地方。这样安全便捷的开锁方式给人们的日常生活和工作提供了保障,保护了人员和财产的安全,大大提高了安全系数。
关键词:单片机;蓝牙模块;LCD1602;密码锁
Abstract
In our life, everywhere can see the figure of the lock, small to the door on the lock, big to the bank safe on the lock. Locks are often widely used when people want to protect valuables. With the continuous development and progress of The Times, people pay more and more attention to the security of locks. Because of its simple internal structure and low safety, traditional mechanical locks gradually fade out of people’s sight. The electronic password lock with bluetooth wireless function has gradually become popular. Compared with the traditional mechanical lock, the password lock of bluetooth technology can successfully guarantee the user’s security information, and can greatly solve the shortage of the old lock, meeting people’s requirements for the security of the lock.
In bluetooth wireless combination lock design based on single chip microcomputer, the bluetooth technology as the core content of this design, using STC89C52 single-chip computer, and LCD liquid crystal display template, and a variety of related parts, under the author’s personal test, it can provide a variety of more convenient setting, success to help users solve the lock and closure of many aspects, such as content, and the whole process will be scientific and rational, to guarantee the safety of the people.
Verified by the experiment, compared with the traditional mechanical locks, bluetooth wireless combination lock has convenient safe low cost advantages, can be widely used in home, hotel, office buildings, Banks and other places, so safe and convenient way to open the lock has provided the safeguard for People’s Daily life and work, to protect the safety of persons and property, has greatly increased the safety coefficient.
Keywords: single chip microcomputer; bluetooth module; LCD1602; combination lock
引 言
在很久以前,锁就被广泛使用,人们大多数用它来防盗。因此,锁对人们来说很重要。人们的追求一直是锁匠的目标,最大程度上迎合人们的追求也是锁匠的心愿。人们对锁的要求越高,对大小、形状、安全性就越苛刻,锁已经随着人们的需求而变化。
随着技术的飞速发展,人们对安全越来越重视,蓝牙密码锁越来越受欢迎。它弥补了传统密码锁的安全性低、体积大、设置密码复杂等缺点。使用单片机控制的蓝牙无线密码锁[1],不但在功能上远胜于传统密码锁,而且具有更高的灵活性和稳定性,并且蓝牙无线密码锁可以实现密码掉电保存的功能。随着我国蓝牙技术的不断提升,蓝牙无线密码锁将越来越受到人们的喜爱。
在当今的网络时代,每个人在互联网进行相关浏览时,都会设定大量的密码,比如QQ账户的密码以及微信账户的密码等等,然而许多用户在使用完密码之后都会将其遗忘,亦或是被不法分子冒用,因此传统的安全密码依然不能够满足目前时代的需求。如今在生活之中,钥匙分布在各个领域之中,例如汽车的钥匙以及大门的钥匙,随着科学技术的不断发展这些原有的锁具并不能提供足够的安全性,然而我们的生活又不能离开这些锁具,这是我们必须要直面的问题。当今时代要求我们越来越重视深化和权威化,在这个信息时代之下,对于信息的保存也变得越来越重要。为了解决这个存在已久的难题,在近些年来,有不少专家学者将视线瞄向了新兴的蓝牙技术。该技术能够运用数据交换的方式来帮助用户实现信息以及设备的转移,并且通过加密算法来处理数据,极大的提高了安全性[2]。
在20世纪70年代之后,由于大规模集成电路出现,使得电子密码锁在体积上大大减小,重量减轻很多,但价格变得越来越高,这使得大多数人都不能接受,因此它使用的范围非常有限,难以普及。此时电子密码锁的研究处于停滞不前的状态,技术一直没有进步。到20世纪90年代后,由于一些发达国家的电子技术和蓝牙技术的不断发展,人们开始进一步研究电子密码锁,使得电子密码锁的技术进步了很多,这也为蓝牙密码锁的出现提供了技术上的支持。如今,随着蓝牙技术的应用不断扩大,蓝牙技术已相当成熟,蓝牙功能的密码锁越来越多。
智能电子密码锁已经发展到很高的水平,近年来单片机的应用也取得了全面的发展。它在国外很早就发展起来,因此也被广泛使用,它主要用于昂贵的房屋,银行和保险箱。在国内这方面发展也很迅速,无论是自行开发还是引入外来,它在重要的地方都很常见,因为价格比普通的锁贵,所以在早期仅仅拥有着较少的用户能够担负起高额的费用,然而目前随着科学技术的普及,越来越多的人群开始接受这一设计。蓝牙技术的飞速发展得益于低成本设备的推出及其快速发展,以及可靠加密算法的研究与开发[3]。另一方面,蓝牙技术与许多其他技术一样,也正从私有技术转变为公共技术,逐渐成为尖端高科技产品之一,现在它已成为各种高科技产品的标志。
跟传统密码锁相比,蓝牙无线密码锁组合量大,不易被破译,而且在密码不具有安全性的情况下还可以更换密码,比传统密码锁应用要灵活的多,而且还伴随报警机制,在密码连续输入错误3次的情况下可以发出报警声音。
本篇文章共分为四个章节,具体内容如下:
第一章着重于系统总体设计,主要阐述了系统设计要求和思路,并根据设计目的选择合适的主控系统。
第二章介绍了系统的硬件设计,其中包括每个模块的设计原理,并根据系统的设计要求选取单片机型号,选择最适合要求的蓝牙模块和液晶显示屏。
第三章讲述了系统的软件设计,简要介绍了系统的开发环境以及编程语言选择和系统流程图。
第四章是系统的调试部分,包括系统的硬件测试以及软件测试,并对设计中出现的问题进行了简单的讨论和解决。
1 系统总体设计
为了实现远程开锁,保护人们财产和信息安全,本文设计了一个具有报警、远程控制、修改密码、虚假密码等功能于一体的基于单片机的蓝牙无线密码锁系统,以此来对锁的安全性进行改善。
1.1 系统设计要求
(1)采用AT24C02芯片,用于储存设置的密码,并具有掉电之后保存密码功能;
(2)用户可以自行设定对应的密码,想要更换成新密码,必须要重新输入原有密码两次才可以通过系统的审核;
(3)密码输入错误3次,蜂鸣器响,报警锁死,屏幕显示ERROR;
(4)输入正确的密码继电器吸合,开锁指示灯亮,屏幕显示OPEN;
(5) 4×4矩阵键盘包括0~9的数字键和A~D的功能键以及*、#按键;
(6)液晶屏幕采用了新型的光学感应系统,能够成功地对应天气进行相应的屏幕转变,从而最大程度的节约电能;
(7)可以使用虚假密码,开锁时可以随意输入虚假密码掩人耳目,防止他人窃取密码;
(8)采用蓝牙模块,可以实现远程开锁。
1.2 系统设计思路
在总体方案的选定上,最初考虑了两种方案,一种是利用数字电路来实现密码锁的功能,配合其他主控芯片,结合蓝牙模块来实现预期的功能,另一种是使用单片机作为主控芯片[4],利用其可编程性,来实现密码锁功能,同时兼顾了蓝牙模块的使用。
方案一:用数字电路控制系统
运用触发器构成的数字逻辑电路作为密码锁的核心控制,当用户想要避免自己的信息泄露时,只需要按下对应的干扰按键,就能够成功的终止当前的密码输入行为,而且如果该用户在进行密码输入时,使用了过长的时间那么系统会判定此次输入无效并发出警报,通过这种方式能够使整个系统的操作较为便捷,易操作,缺点就是灵活性太差,容易给用户带来不必要的麻烦,并且在加入蓝牙模块时,还要额外加入主控芯片,实行起来复杂且成本高,使用效果也不是很好。因此,这种方案没有得到实际的应用。
方案二:用单片机控制系统
运用单片机作为主要控制系统,单片机是一种虽然小但很完整的芯片,应用在集成电路中,也可以称之为微型计算机系统。它很稳定并且能够对接收的数据进行实时反应,常运用在工业环境中。再外接液晶显示器、蓝牙模块、矩阵键盘、存储芯片等器件,单片机通过I/O口控制外接设备。用户可以有两种方式输入密码,可以使用矩阵键盘输入密码也可以使用蓝牙APP输入密码。如果成功的输入正确的密码,继电器就会吸合,开锁指示灯亮,屏幕会显示为打开状态。如果并没有输入正确的密码,那么蜂鸣器会发出对应的警报。如果输入三次错误内容,那么蜂器将会一直保持警报状态,整个体统进入锁死状态。
通过两种方案相比较,方案二比较好。其最大的优点就是灵活度高、性能高、价格低廉,所以本设计采用单片机控制系统的方案。
2 系统硬件设计
2.1 设计原理
本设计的主要硬件由单片机[5]、显示模块、驱动模块等硬件组成。在整个系统运转时,单片机会依照用户实际输入的对应内容,在此过程中,单片机判断用户输入密码的正确性。如果成功的输入正确的密码,继电器就会吸合,开锁指示灯亮,屏幕会显示为打开状态。如果并没有输入正确的密码,那么蜂鸣器会发出对应的警报。如果多次回答错误内容,系统会根据这一情况,判定为他人盗用,整个体统进入锁死状态。蓝牙无线密码锁硬件原理框图如图2.1所示。
图2.1 蓝牙无线密码锁硬件原理框图
2.2 主控模块
单片机在本次毕业设计中起到了至关重要的角色,它是整个设计方案的核心。本项目拟采用单片机作为主要控制系统,拟采用STC89C52单片机和STM32单片机,两种单片机对比如下所示。
方案一:STC89C52单片机
STC89C52单片机拥有着诸多方面的优点,例如运转速度极快,而且对能源的需求不高,可以有效抵抗外部的干扰等诸多方面,而且其指令代码能够与传统的五一单片机进行很好的衔接。STC89C52单片机内部存在完整操作处理器,处理的对象单位并非字或者字节,而是位。采用51Core内核,拥有64KB空间。同时由于自带的双地址区间,使得STC89C52单片机使用方式更加多样化。
方案二:STM32单片机
STM32单片机主要服务于Cortex-M内核,含有1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI等等,但由于性能优异,使用起来比STC89C52单片机复杂的多,因此本次设计不准备使用STM32单片机。
通过两种方案相比较,方案一比较好。其要求低、功能齐全,在较小的范围内可以实现全方面的功能,所以本设计选择STC89C52单片机作为主控芯片。
STC89C52单片机在进入工作后能够一直保持稳定的工作状态,对于电压的需求需要在5.5V到2.0V之间,进入工作状态后,它的工作频率始终保持在48Hz以下,对于STC89C52单片机而言,它拥有以下几个特征:首先它拥有着把给自己的内部程序储存空间,其次它拥有着三个定时器帮助其工作,最后它拥有着较强的抗干扰性,能够成功地显示当前的工作状态。STC89C52单片机原理图如图2.2所示。
图2.2 STC89C52单片机原理图
本设计运用最少的零部件组成的单片机可以工作的系统,可以被称为最小系统[6]。对于STC89C52单片机而言,最小系统必须要拥有单片机、晶振电路、复位电路。晶振电路和复位电路是单片机运行的必要条件,并且能使单片机一直处于正常工作状态。通常情况下,最小系统往往是整个系统中最重要的部分。通过对其进行相应的操作以及改善,能够帮助我们完成许多复杂的工作。单片机最小系统原理图如图2.3所示。
图2.3 单片机最小系统原理图
(1)晶振电路
晶振电路是晶体振荡器的简写,它能够在实际的系统工作之中提供信号,单片机可以依赖该信号发出对应的指令,从而进行恰当的命令。晶振在整个系统之中拥有着极为重要的意义,它能够成功的保证单片机能够正常工作,振荡频率范围通常在1.2~12MHz之间。晶振电路原理图如图2.4所示。
图2.4 STC89C52晶振电路原理图
(2)复位电路
复位电路能够成功地帮助单片机进行复位工作,它对于单片机的作用,就像计算机的重启按键。一旦单片机陷入了混乱之中,没有办法进入下一步的工作流程,那么在此时我们可以选择开启复位电路,从而帮助单片机恢复到原有的设定之中,从而重新开始程序的设定。本次单片机的复位工作必须要在第9引脚接高电平持续2μs才可以实现。复位电路原理图如图2.5所示。
图2.5 STC89C52复位电路原理图
2.3 芯片模块
AT24C02芯片是一个2K位的串行CMOS EEPROM存储设备,对比于传统的芯片,它拥有较大存储空间,目前使用的是I2C技术,拥有较高的可使用性。现今我们使用的CMOS技术,可以最大成度的减少能源的耗损,AT24C02芯片具有16字节的页写缓冲器,并且于I2C接口处进行工作,可以提供极强的保护能力[7]。AT24C02芯片已经在许多实验中出现过,它的主要功能是存储一些断电后需要保存的数据,上一次运行中保存的数据可以在下一次运行中调出。AT24C02芯片管脚描述和可靠参数见表2.1和表2.2。
表2.1 AT24C02芯片管脚描述
管脚名称 功能
A0、A1、A2 器件地址选择
SDA 串行数据/地址
SCL 串行时钟
WP 写保护
Vcc +1.8V~6.0V工作电压
Vss 地
表2.2 AT24C02芯片可靠参数
符号 参数 最小 单位 参考测试模式
NEND 耐久性 1,000,000 周期/字节 MIL-STD-883,测试方法1033
TDR 数据保存时间 100 年 MIL-STD-883,测试方法1008
VZAP ESD 2000 V MIL-STD-883,测试方法3015
ILTH 上拉电流 100 mA JEDEC标准17
通常情况下,芯片用来传输信号的零件是通过发送器的方式,与之相结合的所有设备都可以成功通过这种方式来接收其发送的对应信号,而整个信号传输的工作都可以在总设备上进行相应的控制,从而最大程度的解决问题,可以在主设备上对开关信号进行相应的控制,并且在主设备以及辅助设备上都能够进行对应的操作工作。AT24C02芯片原理图如图2.6所示。
图2.6 AT24C02芯片原理图
2.4 矩阵键盘模块
接入数字键盘作用是用来输入数字密码和进行基本操作,本作品采用的是矩阵键盘模块。因为要实现数字密码的输入,所以在按键的设计上,首先要有0~9这十个数字按键,其次为了控制继电器的闭合和流程中确认的操作,还要有*和#两个按键,而且因为蓝牙模块的加入,与之对应的操作也随之变多,所以还要有ABCD四个按键,AB键备用,C键删除密码,D键重置密码。
矩阵键盘作为本次试验中的重要硬件,它本身是由两条行线以及两条列线共同组成的键盘。在两条线的彼此交接处都拥有对应的按钮,因此在整个系统之中的中按钮为4×4个,这样的排列方式能够很好地将端口的利用率达到最高水准,因此能够在实际的设计之中将端口的数量降低为最小值,一般情况下我们都可以将按钮排列成一定的形状。在矩阵键盘中,每条线并不是绝对会用垂直的方法互相连接,而是通过一个按钮进行相应的连接。单片机共拥有着8个端口,在这种情况下能形成16个按钮,这比上面提到的,要整整多出一倍,而多出的按钮也使得它的功能更为强大。如果添加额外的行,则可以形成20个按键的键盘,但是独立按键连接只能再有一个按键。可以看出,当所需按键的数量相对较大时,使用矩阵方法连接键盘是非常合理的[8]。矩阵键盘原理图如图2.7所示。
图2.7 矩阵键盘原理图
2.5 液晶显示模块
显示模块主要功能是显示英文以及特殊符号,显示模块能够在实际工作中同时显示两行字符,针对显示模块我拟设计了两种方案,对比如下。
方案一:LED数码管
LED数码管侧重于对数字的显示,当采用动态扫描法与单片机连接时,虽然占用的单片机口线少,电路简单,性价比较高。但由于本设计显示数据较多,采用数码管不能完全实现显示功能,故未采纳本方案。
方案二:LCD1602液晶显示器
LCD1602液晶显示器可由单片机驱动,它可以显示英文以及特殊符号等信息,整体结构美观,同时LCD1602液晶显示器的编写程序简单,价格便宜,重量较轻而且体积也偏小,能够成功地降低能源的耗损。
经比较发现,LCD1602液晶显示器成本低、易开发且能大量显示字符,符合本设计要求,故选用方案二。LCD1602液晶显示器实物图如图2.8所示。
图2.8 LCD1602液晶显示器实物图
液晶显示的原理是运用了液晶这一物质在其受到对应电压之后,各粒子之间会产生对应的工作,从而显示对应的图形,这种图形只有在液晶被通电之后,才可以被显现,相较于传统的显示器,液晶显示器普遍拥有着较薄的厚度,而且还拥有着较为丰富的图案显示,目前已被运用于各个领域之中,例如家庭电视以及超薄计算机。在市场上拥有着诸多类型的液晶显示器,我们可以通过其显示方法将它分为许多种类,尤其类型的判断还可以根据色彩显示以及灰度等方面进行甄别。LCD1602液晶显示器原理图如图2.9所示。
图2.9 LCD1602液晶显示器原理图
液晶显示屏上显示字符通常都拥有着极为复杂的情况,因为字符之间是由不同的矩阵共同排列进行组成,因此在实际工作之中,我们需要对字节进行相应的确认,将并不显示的字节设定为零,将可以显示的,直接显示为1,那么我们就可以在实际工作中对直接是否能够显示进行实际的检查,如果对应区域出现了问题,我们可以按照排列号和实际列数来对其直接进行相应的查找[9]。LCD1602引脚接口说明和控制命令见表2.3和表2.4。
表2.3 引脚接口说明表
编号 符号 引脚说明 编号 符号 引脚说明
1 VSS 电源地 9 D2 数据
2 VDD 电源正极 10 D3 数据
3 VL 液晶显示偏压 11 D4 数据
4 RS 数据/命令选择 12 D5 数据
5 R/W 读/写选择 13 D6 数据
6 E 使能信号 14 D7 数据
7 D0 数据 15 BLA 背光源正极
8 D1 数据 16 BLK 背光源负极
表2.4 控制命令表
序号 指令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0
1 清显示 0 0 0 0 0 0 0 0 0 1
2 光标返回 0 0 0 0 0 0 0 0 1 *
3 置输入模式 0 0 0 0 0 0 0 1 I/D S
4 显示开/关控制 0 0 0 0 0 0 1 D C B
5 光标或字符移位 0 0 0 0 0 1 S/C R/L * *
6 置功能 0 0 0 0 1 DL N F * *
7 置字符发生存贮器地址 0 0 0 1 字符发生存贮器地址
8 置数据存贮器地址 0 0 1 显示数据存贮器地址
9 读忙标志或地址 0 1 BF 计数器地址
10 写数到CGRAM或DDRAM 1 0 要写的数据内容
11 从CGRAM或DDRAM读数 1 1 读出的数据内容
2.6 继电器驱动模块
在本次系统设计里,我们采用了继电器来帮助我们成功的认知锁的开关状态。为了更加明确具体的开关信息,本次设计还另外增加了电磁锁。继电器通常情况下由铁芯以及线圈等硬件共同组成。当我们在线圈的对应位置施加相应的电压,在电流通过线圈之后,能够成功地产生电磁效应,从而帮助整个继电器成功地进入到工作状态,电磁锁就会打开。一旦我们将电源关闭,那么对应的电磁效应会随之消失,与此同时整个继电器就会停止目前的工作,电磁锁就会关闭[10]。
单片机在实际工作中的电平状态并不是不变的,随着电平状态的变化,在对继电器进行通电之后,继电器能够成功的进行工作,此时继电器充当驱动负载的开关。继电器的线圈和端子是分开且互补的,其触点就相当于开关。当我们对线圈进行通电时,那么就会产生对应的触点,来帮助继电器进入到工作状态。继电器往往存在两种工作状态,一种是高压状态,一种是低压状态,高压状态下继电器能够在高压下工作,低压状态下继电器能够在低压下工作。继电器原理图如图2.10所示。
图2.10 继电器原理图
2.7 蜂鸣器模块
在本次设计中接入声音报警器是为了在输入密码时可以得到按键声音的反馈,从而实现人机交互,同时还用于实现连续三次密码输入错误系统报警功能,当连续三次密码输入错误时,声音报警器将始终发出短促的警报声[11]。针对报警器我拟设计了两种方案,对比如下。
方案一:ISD4004集成芯片
ISD4004是一种语音集成芯片,它需要扩充喇叭驱动电路且其本身控制比较繁琐、电路比较复杂,稳定性差。基于以上考虑,所以放弃了此方案。
方案二:蜂鸣器
蜂鸣器具有电路简单,性能可靠、稳定等优点,最重要的是成本较低,效果较好。
通过两种方案相比较,方案二比较好。其成本低廉、操作便捷,所以本设计选择蜂鸣器作为报警器。
目前国际上大多数的蜂鸣器都采用了驱动的方式来进行工作,如果蜂鸣器成功地接收到震荡源,那么,此时蜂鸣器就会进入工作之中,如果并没有收到对应的震荡源,那么将不会发出对应的命令信息,因此想要蜂鸣器进入工作,必须要提供对应的方波来促进帮助其进入工作。通常情况下,拥有震荡源的蜂鸣器往往比没有震荡源的蜂鸣机价格更为昂贵,因为拥有震荡源的蜂鸣器能够减少整个工作的流程,从而帮助程序的控制以及设计进行更加便捷的操作。
由于蜂鸣器的工作电流通常较大,因此在实际工作之中必须要运用放大电路的方式来帮助其进入正常的工作之中,在一般情况下我们都会选择三极管来辅助工作,在整个设计的运作流程之中,三极管对于蜂鸣器的重要性不言而喻。蜂鸣器原理图如图2.11所示。
图2.11 蜂鸣器原理图
2.8 蓝牙模块
蓝牙模块的主要功能是实现远程开锁,运用蓝牙模块能够成功的帮助设备进行无线连接,而且能够很好的与单片机系统兼容,从而帮助系统编写。针对蓝牙模块我拟设计了两种方案,对比如下。
方案一:HC-05蓝牙模块
HC-05蓝牙模块是高性能的蓝牙串行端口模块[12],主从可指令切换,指令丰富齐全,蓝牙模块的名字和密码可以进行更改。
方案二:HC-06蓝牙模块
HC-06蓝牙模块是高性能的蓝牙串行端口模块,主从可指令切换,指令较少且不全,蓝牙模块的名字和密码不可以进行更改。
经比较发现,HC-05蓝牙模块和HC-06蓝牙模块都具有高性能、灵活的优点,但HC-06蓝牙模块指令少且不能修改,不符合本设计要求,故选择方案一。
HC-05蓝牙模块目前主要有两种工作类型。首先是自动工作类型,当模块处于运行的时候,能够采取自动方式进行对应的工作,并不需要人为进行干涉就可以发布命令。而另一种模式则是命令响应工作类型,在该类型下模块将可以受到用户的指令控制,如果并未受到控制命令,那么模块将并不会进入工作。
蓝牙模块主要由芯片以及外围零件共同组成,不同的构成零件也会导致各个蓝牙模块的功能各不相同,对应的管角设计也不尽相同,将蓝牙模块与单片机进行连接时,必须先要将对应的连接插口接入到单片机的对应位置,最后再将VCC和GND管脚连接上。HC-05蓝牙模块与手机连接时,需要打开手机上的蓝牙密码锁APP,利用蓝牙密码锁APP查询HC-05蓝牙模块地址并进行连接,首次连接时会出现输入密码界面,输入密码1234点击确定,此时蓝牙模块上的小红灯慢闪,则说明连接成功[13]。蓝牙模块原理图如图2.12所示。
图2.12 蓝牙模块原理图
3 系统软件设计
3.1 软件设计开发环境
本次软件设计的开发环境是Keil μVision4。它包含功能强大的开发工具,可用于所有开发过程,例如编译、连接、调试和仿真。Keil μVision4于它的上一代在系统编程中又添加了许多的新内容,这些内容包括了以下等诸多方面:首先可以为程序员提供较为便捷的管理系统,帮助使用者能够调试和还原视图,其次,能够将工作区的内容进行简化,最后他拥有着极强的编辑功能,涵盖了整个系统编程的诸多方面,在前者的基础上,进行了全方位的完善[14]。
Keil C51软件是ARM公司在20世纪末于美国开发的五一单片机下的附属系统,与传统的汇编语言相比,该系统在可靠性以及科学性和便携性方面都拥有着较大的提升,从而能够为使用者提供相应的便捷性,在实际开发之中拥有着很强的完整性与实用性,包括了系统编写的各方面内容。Keil μVision 4开发环境如图3.1所示。
图3.1 Keil μVision4开发环境
3.2 编程语言选择
由于整个程序的复杂性,针对预期实现的主要功能与本次设计的对应需求,我们选择运用C语言作为本次程序的编写语言,C语言作为国际上较为通用的编程语言,能够成功的帮助使用者对软件以及系统进行相应的控制,而且本身拥有着高效性和全面性[15]。除了以上优点,C语言能够成功的帮助软件进行改写,从实际的操作之中发现问题,并且可以通过将文件进行编写而得到改善,提高系统的全面性和合理性。
3.3 程序流程图
本次设计的总体软件较为简单,主要分为主程序和子程序以及对密码进行相关设定的程序。首先,初始化每个模块,检测是否有按键按下,如果按下,确定哪个按键被按下,然后判断是否调用相应的子程序。主程序流程图如图3.2所示。
图3.2 主程序流程图
整个设计分为许多不同的模块,每个模块都有一个对应的子程序。子程序不仅可以使编程归零,简化复杂的过程,而且易于阅读和修改。本次设计运用的是矩阵键盘,它由多种不同的线条共同组成[16]。在系统工作的时候,单片机能够成功的对其进行控制,并寻找到键盘的对应位置,确定是否在键盘上按了键,消除了反跳,并确定闭合键是否被释放。键盘扫描子程序流程图如图3.3所示。
图3.3 键盘扫描子程序流程图
正确输入密码后,可以按重设密码按钮重设密码,设置完成的密码将会发送到AT24C02芯片进行存储,当设置完密码后,进入到开始输入密码界面,调用新设置的密码[17]。AT24C02芯片有掉电保存的功能,此时如果关机再重新开机,你之前新设置的密码也会保存下来。密码设置子程序流程图如图3.4所示。
图3.4 密码设置子程序流程图
4 系统调试
4.1 硬件调试
将整个硬件搭建完成之后,第一时间并不能对其进行通电处理,首先需要查看整个系统是否已经就绪,其焊接点是否完善,并且根据对应的电路图进行相应的排查,运用电压表来对电压进行实时的检测,在确定整个系统已经达到完善之后,进行相应的调试[18]。
单片机与蓝牙的调试需要分成两部分,运用单片机开发装备来对单片机进行相应的调试,而蓝牙需要通过蓝牙模块来进行对应的调试。将蓝牙模块连接至电脑端口,运用对应的频率以及指令来对相应的内容进行测试,在蓝牙成功匹配之后,可以输入对应的命令,在输入命令之后液晶显示器会成功的发亮,并能够返回对应的数值,完成以上步骤之后说明该系统的蓝牙模块调试,没有出现问题。
在对整个程序进行相关测试之前,需要正确的设计好报警参数,如果在实验中并没有输入正确的密码,那么报警器会根据错误的输入行为发出对应的警告[19],如果连续三次都没有输入正确的密码,对应的操作系统将会被成功关闭,从而防止信息泄露,当出现这种情况时,必须要及时的按下回位键。蓝牙无线密码锁实物图如图4.1所示。
图4.1 蓝牙无线密码锁实物图
4.2 软件调试
(1)使用Keil μVision4软件创建项目,单击菜单栏上的“工程”,输入并保存新项目名称“基于单片机的蓝牙无线密码锁设计”,并且在对应内容中选择“STC89C52”作为设计主体。
(2)选择新建文本框,并将整个系统的程序进行对应的编写,并将此份文件保存至新建文件夹。
(3)对这个程序进行相应的调试,在编辑选项中可以对信息进行相应的处理,如果整个系统运行有对应的错误,可以根据其错误进行相应的修正,直至系统能够正常运行[20]。Keil μVision4软件开发流程图如图4.2所示。
图4.2 Keil μVision4软件开发流程图
4.3 问题及解决方法
在进入环境以后,遇到了很多问题,总结如下:
(1)提示无asm文件。编译时候提示:F:…\XX.asm File has been changed outside the editor,reload ?解决方法:重新生成项目,产生examl1.asm即可。
(2)输入程序时存在中文标点符号,用keil编译时出现错误。解决方法:程序里有带中文标点,可用英文重输入一遍。
(3)程序汇编时出现字母数字的混杂,解决方法:字母“O”和数字 “0”。汇编时一定要注意细节。
(4)焊接短路:就是在焊接的过程中,有很多多余的融化锡液滴到了电路板的其他位置,致使锡液与其他电路连接,造成短路。这种失误是最为严重的,如果操作不当可能会使整个电路系统烧毁,解决方法:把控好焊锡的量,在焊接过程中尽量做到仔细,不能有差错。
(5)冷焊:冷焊就是在焊锡在接触线路板时温度过低,使得焊锡与接线板的粘合度降低,可能致使电路连接不稳定。致接线板与零件的结合点较为疏松,会造成接触不良。解决方法:待焊锡丝完全融化后再进行焊接。
(6)零件规格选择错误:就是在焊接过程中选错了零件的参数和规格,例如,误把规格为100PF的电容焊接到需要1000PF的焊接点,会造成系统的部分功能无法使用。解决方法:在选择零件参数时要认真审查零件的规格。最终实现了预期的性能要求和功能表现。
结 论
本次设计用单片机STC89C52作为主控芯片,再外接液晶显示器LCD1602、蓝牙模块、矩阵键盘、存储芯片AT24C02等器件,研制了一款具有蓝牙无线功能的电子密码锁。在单片机的选择上,本次设计选择了STC89C52单片机,相较于其他的单片机来说该单片机具有高性能、低功耗、超强抗干扰等优点,使系统的安全性更强,可在长期的使用中减少成本,提高推广性。
对设备进行相关的调试之后,最终实现了蓝牙无线远程开锁的功能。蓝牙无线密码锁的出现,为人们的日常生活提供了便捷和安全的保障,让越来越多的现代人感到技术的重要性。任何新技术或新产品的推出都不是一步之遥,只有不断的技术进步和改进,才能以完美的形式向全世界展示。蓝牙无线密码锁是继电子产品和家用产品在技术上相结合之后产生的密码锁行业的一项科技成就。
本次设计将预期功能进行了完美实现,能够成功地解决生活中传统锁具安全性不足的问题,可以成功地帮助用户进行信息保护,且该设计的可靠性较强,操作也较为简单,本身成本不高,可以运用在各种场合之中,有极高的实用性和很好的推广前景。随着科技的不断发展,相信在不久的将来蓝牙无线密码锁将会完全取代传统机械锁。
参考文献
[1] 徐万明. 基于单片机的多功能电子密码锁设计[J]. 信息通信, 2018, 184(4) :119-125
[2] 先锋工作室编著. 单片机程序设计实例[M]. 北京: 清华大学出版社, 2003.1:20-25
[3] 房小翠, 王金凤. 单片机实用系统设计技术[M]. 北京: 国防工业出版社, 1999.6:53-60
[4] 潘新民, 王燕芳. 微型计算机控制技术[M]. 北京: 电子工业出版社, 2006.1:123-130
[5] 李朝清. PC机及单片机数据通信技术[M]. 北京: 北京航空航天大学出版社, 1999.5:56-62
[6] 路而红. 专用集成电路设计与电子设计自动化[M]. 北京: 清华大学出版社, 2004.8:32-33
[7] 王为青, 程国钢. 单片机Keil Cx51应用开发技术[M]. 北京: 人民邮电出版社, 2007.2:15-16
[8] 范风强, 兰婵丽. 单片机语言C51应用实战集锦[M]. 北京: 电子工业出版社, 2003.3:35-38
[9]龚运新. 单片机C语言开发技术[M]. 北京: 清华大学出版社, 2006.10:45-50
[10] 何立民. 单片机应用系统设计[M]. 北京: 航天航空大学出版社, 2009.8:46-50
[11] 金珍珍, 徐锋, 林海波. 基于单片机STC89C52的串联型移位步进控制器的设计[J]. 电气自动化, 2018, 23(1) :95-97
[12] 张群, 杨絮, 张正言, 等. 蓝牙模块串口通信的设计与实现[J]. 实验室研究与探索, 2012, 31(3) :79-82
[13] 侯卫周, 蒋俊华. 基于单片机系统的手机蓝牙智能锁设计[J]. 测控技术, 2016, 35(6) :132-136
[14] 乔之勇, 彭仁明. 单片机应用系统设计项目化教程[M]. 北京:电子工业出版社, 2014:16-45
[15] 闫石, 李庆亮. C语言程序设计实用教程[M]. 北京: 机械工业出版社, 2005.3:26-27
[16] 陈朝大, 韩剑. 单片机原理与应用:实验实训和课程设计[M]. 武汉:华中科技大学出版社, 2014:2-15
[17] 王涛. 基于单片机系统的密码锁电路设计[J]. 机械设计与制造, 2012, 08(2) :40-42
[18] 赵德安. 单片机原理与应用[M]. 北京: 机械工业出版社, 2004.10:98-126
[19] Smith S W. Digital signal processing[M]. California: California Technical Publishing, 1994.11: 22-24
[20] Steven J. Johnston, Philip J. Basford, Colin S. Perkins, Herry Herry, Fung Po Tso, Dimitrios Pezaros, Robert D. Mullins, Eiko Yoneki, Simon J. Cox, Jeremy Singer. Commodity single board computer clusters and their applications[J]. Future Generation Computer Systems, 2018, 89(4):48-52
附录1硬件原理图
附录2 源程序清单
//包含头文件
#include <REG52.h>
#include<intrins.h>
//宏定义
#define LCM_Data P0 //将P0口定义为LCM_Data
#define uchar unsigned char
#define uint unsigned int
#define w 6 //定义密码位数
//1602的控制脚
sbit lcd1602_rs=P2^5;
sbit lcd1602_rw=P2^6;
sbit lcd1602_en=P2^7;
sbit Scl=P3^4; //24C02串行时钟
sbit Sda=P3^5; //24C02串行数据
sbit ALAM = P2^1; //报警
sbit KEY = P3^6; //开锁
bit operation=0; //操作标志位
bit pass=0; //密码正确标志
bit ReInputEn=0; //重置输入允许标志
bit s3_keydown=0; //3秒按键标志位
bit key_disable=0; //锁定键盘标志
bit flag_REC =0; //串口接受标志位
unsigned char buff[5]=0;
unsigned char countt0,second; //t0中断计数器,秒计数器
void Delay5Ms(void); //声明延时函数
unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盘扫描控制表
//液晶显示数据数组
unsigned char code start_line[] = {"password: “};
unsigned char code name[] = { “=Coded Lock=”}; //显示名称
unsigned char code Correct[] = {” correct “}; //输入正确
unsigned char code Error[] = {” error “}; //输入错误
unsigned char code codepass[] = {” pass “};
unsigned char code LockOpen[] = {” open "}; //OPEN
unsigned char code SetNew[] = {“SetNewWordEnable”};
unsigned char code Input[] = {"input: "}; //INPUT
unsigned char code ResetOK[] = {"ResetPasswordOK "};
unsigned char code initword[] = {“Init password…”};
unsigned char code Er_try[] = {“error,try again!”};
unsigned char code again[] = {"input again "};
unsigned char InputData[16]; //输入密码暂存区
unsigned char CurrentPassword[16]={1,3,1,4,2,0}; //管理员密码(只可在程序中修改)
unsigned char TempPassword[16];
unsigned char N=0,M=0,flag=0; //密码输入位数记数
unsigned char ErrorCont; //错误次数计数
unsigned char CorrectCont; //正确输入计数
unsigned char ReInputCont; //重新输入计数
unsigned char code initpassword[16]={0,0,0,0,0,0}; //输入管理员密码后将密码初始为000000
unsigned char MM[2]={0,0};
//=5ms延时==========
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc–);
}
//=400ms延时============
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA–)
{
TempCycB=7269;
while(TempCycB–);
}
}
//主函数=
void main(void)
{
unsigned char KEY,NUM;
unsigned char i,j;
P1=0xFF; //P1口复位
TMOD=0x12; //定义工作方式
TH0=0xB0;
TL0=0x3C; //定时器赋初值
EA=1; //打开中断总开关
ET0=1; //打开中断允许开关
TR0=0; //打开定时器开关
TH1=0Xfd;
TL1=0Xfd; //9600
TR1=1; // 定时器1启动
SM0=1; // 设置串口的工作模式
SM1=1; //方式1
REN=1; // 允许串口接收数据
ES=1; // 串口中断应许
Delay400Ms(); //启动等待,等LCM讲入工作状态
lcd_init(); //LCD初始化
write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
for(i=0;i<16;i++)
{
write_1602dat(name[i]);//向液晶屏写开机画面
}
write_1602com(er);
for(i=0;i<16;i++)
{
write_1602dat(start_line[i]);//写输入密码等待界面
}
write_1602com(er+9); //设置光标位置
write_1602com(0x0f); //设置光标为闪烁
Delay5Ms(); //延时片刻(可不要)
N=0; //初始化数据输入位数
RdFromROM(MM,17,1);
M=MM[0];
if(M==0||M>16)
{
M=6;
MM[0]=6;
WrToROM(MM,17,1);
}
while(1) //进入循环
{
if(key_disable==1) //锁定键盘标志为1时
Alam_KeyUnable(); //报警键盘锁
else
ALAM=1; //关报警
KEY=keynum(); //读按键的位置码
if(KEY!=0) //当有按键按下时
{
if(key_disable==1) //锁定键盘标志为1时
{
second=0; //秒清零
}
else //没有锁定键盘时
{
NUM=coding(KEY); //根据按键的位置将其编码,编码值赋值给NUM
{
switch(NUM) //判断按键值
{
case ('A'): ; break;
case ('B'): ; break;
case ('C'):
write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
for(i=0;i<16;i++)
{
write_1602dat(name[i]);//向液晶屏写开机画面
}
if(N>=1) N--; OneAlam(); //按键提示音
//DisplayOneChar(6+N,1,'*');
for(j=N;j<16;j++)
{
write_1602com(er+j);
write_1602dat(' ');
}
for(j=0;j<N;j++)
{
write_1602com(er+j); //显示位数随输入增加而增加
write_1602dat('*'); //但不显示实际数字,用*代替
}
InputData[N]=N+6;
break; //ABC是无定义按键
case ('D'): ResetPassword(); break; //重新设置密码
case ('*'): Cancel(); break; //取消当前输入
case ('#'): Ensure(); break; //确认键,
default: //如果不是功能键按下时,就是数字键按下
{
//DisplayListChar(0,1,Input);
write_1602com(yi);
for(i=0;i<16;i++)
{
write_1602dat(Input[i]); //显示输入画面
}
operation=0; //操作标志清零
if(N<16) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
{
OneAlam(); //按键提示音
//DisplayOneChar(6+N,1,'*');
for(j=0;j<16;j++)
{
if(j>N)
{
write_1602com(er+j);
write_1602dat(' ');
}
if(j<=N)
{
write_1602com(er+j); //显示位数随输入增加而增加
write_1602dat('*'); //但不显示实际数字,用*代替
}
}
InputData[N]=NUM; //将数字键的码赋值给InputData[]数组暂存
N++; //密码位数加
}
else //输入数据位数大于6后,忽略输入
{
N=16; //密码输入大于6位时,不接受输入
break;
}
write_1602com(er+N);
if(ReInputEn==1&&ReInputCont==0)
M=N;
}
}
}
}
}
}
}
//中断服务函数***********
void time0_int(void) interrupt 1 //定时器T0
{
TH0=0xB0;
TL0=0x3C; //定时器重新赋初值
//TR0=1;
countt0++; //计时变量加,加1次时50ms
if(countt020) //加到20次就是1s
{
countt0=0; //变量清零
second++; //秒加
if(pass1) //开锁状态时
{
if(second==1) //秒加到1s时
{
TR0=0; //关定时器
TH0=0xB0;
TL0=0x3C; //再次赋初值
second=0; //秒清零
}
}
else //不在开锁状态时
{
if(second==3) //秒加到3时
{
TR0=0; //关闭定时器
second=0; //秒清零
key_disable=0; //锁定键盘清零
s3_keydown=0;
TH0=0xB0;
TL0=0x3C; //重新赋初值
}
else
TR0=1; //打开定时器
}
}
}
// 通讯中断接收程序 中断函数无返回值
void uart_rx(void) interrupt 4 using 3 //放在这里 和放在main()里面是一样的
{
unsigned char i;
unsigned char flag;
unsigned char dat;
if(RI) //是否接收中断
{
RI=0;
dat=SBUF;
if(dat=='O'&&(i==0)) //接收数据第一帧
{
buff[i]=dat;
flag=1; //开始接收数据
}
else
if(flag==1)
{
i++;
buff[i]=dat;
if(i>=2)
{
i=0;
flag=0;
flag_REC=1 ;
} // 停止接收
}
}
}
致 谢
本论文是在沈洪洋和台闯老师的精心指导下完成的。从数据收集、计划论证、总体调试以及毕业论文的撰写,沈洪洋老师和台闯老师都给出了非常仔细的指导。两位老师以敏锐的洞察力、深厚的知识、严谨的学术态度、卓越的工作作风以及对科学的奉献精神给我留下了难忘的印象,这些使我受益匪浅,并将成为我未来的工作榜样。在本文即将完成之际,我要对我的指导老师沈洪洋老师和台闯老师表示由衷的感谢和崇高的敬意!
在大学生活中,我掌握了大量的理论知识,实践能力也有了大幅度的提升,使我能够将所学知识灵活运用到工作当中。我要感谢智能工程学院的所有老师,这些老师为我提供了所有方面的知识,扩大了我的知识,培养了我的技能,并为完成本文做出了贡献。我还要感谢与我度过了大学生涯的每个同学,正是因为你们的帮助和支持,我才能一一克服困难和疑虑,最后成就了我今天取得的成绩。
最后,衷心感谢母校沈阳城市学院。母校给了我一个宽阔的学习平台,让我不断吸取新知,充实自己。从走进校门那天开始,三位一体的育人模式给了我家一样的温暖,对我的思想、学业、生活都做到了无微不至的关怀,受“三自教育”的鼓舞我变得更加独立,优秀。作为一名“绿岛”学子,无论走到哪里我都会记住一句话那就是“我行”,“我能”。