基于51单片机的简易智能密码锁设计
目录
一、设计任务与要求
1.设计任务:
2.设计要求:
二、方案设计与论证
总体方案设计:
各硬件电路方案设计及论证:
1.单片机内部软件资源分配
2.单片机外围晶振和复位电路
3.按键阵列扫描电路
4.数码管显示电路
5.报警提示和开锁电路
三、总原理图及元器件清单
四、程序流程图
五、性能测试与分析
六、设计作品图片
七、结论与心得
八、程序代码
一、设计任务与要求
1.设计任务:
利用STC89C52单片机搭配合理的外围电路,在各方面参数合理的情况下,制作一个简易的智能密码锁,该智能密码锁能够进行仿真模拟密码的输入、报警提示和锁打开及关闭。同时,装置还具有密码显示和系统锁定的功能,在搭建继电器等相关装置之后,具有实物的锁定功能。
2.设计要求:
- 对于单片机的按键输入密码的有效位数为6位;
- 单片机中的密码与当前单片机定时器系统时间相关,每隔1分钟,密码自动更新;
- 如果密码正确,蜂鸣器响0.5秒,开锁继电器吸合,5秒后开锁继电器关;
- 密码尝试5次出错,则停止尝试1分钟。
二、方案设计与论证
总体方案设计:
本作品设计的简易智能密码锁是一种应用于安全领域的电子设备,广泛应用于家庭、办公场所、酒店、银行等各种场合。它通过电子技术和密码算法,取代了传统的机械锁,提供更高的安全性和便捷性。
本简易智能密码锁在设计之初,采用两种设计方案,在综合实际的代码编写、焊接、材料成本之后,采用了第二种设计方案。
方案一:在界面信息显示界面,用一个LCD1602显示屏幕来完成相关输入密码信息和开锁提示信息的显示,可以用于输入字符和数字信息;操作按键采用16位矩阵按键装置,采用动态扫描的方式来完成输入;在单片机外部设定一个DS1302的实时时钟芯片,用于每隔1分钟,密码自动更新;报警、提醒和开锁电路采用扬声器、LED灯泡和继电器装置来完成。
方案二:在界面信息显示界面,用一个较为普通的6段共阴极数码管来显示密码,应用动态扫描完成信息显示;操作按键共设12个,除0~9这10个数字键外,还有随机数显示按键和密码输入按键;在单片机内部设定定时器运行,用于与单片机自身的系统时钟保持同步,并在每隔1分钟,密码自动更新;报警、提醒和开锁电路采用扬声器、LED灯泡和继电器完成。
选择方案二的原因:对比上面两种方案,采用方案二的性价比会更高。首先,由于本装置只需要完成0~9数字和相关特定字符的显示,采用一个较为普通的6段共阴极数码管便可以完成需求,不用使用较为昂贵的LCD显示屏。此外,本装置只需要使用12个按键,利用矩阵按键会造成资源的浪费,虽然12个按键会使用较多的IO口,但是本实验可以满足设计的要求。最后,可以直接使用单片机内部的定时器时钟来完成随机数的更新,由于系统是属于独立工作的状态,不需要实时显示时间,因此可以舍弃DS1302实时时钟芯片,便可以满足要求。由此,综合上面的分析和比较,选择方案二是最佳的,因此舍弃方案一。
各硬件电路方案设计及论证:
1.单片机内部软件资源分配
装置的整体控制器采用STC89C52单片机,它有着以下的众多优点,高性能:STC89C52单片机采用了高速的8051内核,最高主频可达33MHz,具有快速的运算能力和响应速度。 低功耗:STC89C52单片机采用了低功耗设计,工作电流仅为1-10mA,具有较低的功耗和较长的电池寿命。
其中,包含按键阵列扫描函数、数码管扫描显示函数、随机数产生函数(采用单片机内部定时器和随机数算法)、输入密码比对函数、报警提示和开锁函数、正确密码生成函数、主函数。其中,主函数连接各个函数,实现简易智能密码锁。方案条理清晰,设计依照上述的流程进行,方案设计合理。
2.单片机外围晶振和复位电路
在STC89C52单片机中,首先需要搭建外围电路,在XTAL1、XTAL2两个端口,连接12MHz的晶振和两个电容值在30pF以下的瓷片电容。同时,在单片机的RST端口连接单片机的复位电路,采用一个10k欧姆的电阻和10uF的极性电容构成。其他的端口分别设置为IO口,分配给各工作电路进行使用。
对于此连接方式,采用官方给出的数据手册进行连接,保证了单片机的正常工作,设计方案合理。
3.按键阵列扫描电路
由于单片机端口数量足够,键盘电路直接使用查询式按键扫描电路。其中,小按键开关的一端接单片机端口,另一端接地,当按下按键时,通过单片机查询来确定哪个端口键按下了,然后执行相应的控制程序。其中,2个为功能键,10个为0~9数字键,每个按键均接上拉电阻,用于防止外部干扰的扰动。端口P1.0~P1.7分别对应数字键0~7,端口P3.0、P3.1分别对应数字键8、9;端口P3.2、P3.3分别对应随机数显示和输入密码界面。在开锁时先按一下随机数显示按键,查看此时的随机数显示的情况,根据自带的密码计算算法(在本系统采用后两位数字与前两位数字更换),计算出此时的正确密码。然后再按下输入密码操作键,输人6位的数字密码,当6位密码输入完毕时,系统会自动将新密码存入存储器,用于比对密码正确性。
在本方案中,各个按键分开独立工作,并无影响,将输入的按键信号传入单片机,方案设计合理。
图示为操作按键连接电路图:
4.数码管显示电路
数码管显示采用共阴极四位一体的显示器7SEG-MPX4-CA-RED,输入6位密码,共有两个数码管。其中,P0口负责输出显示数码管的段码,端口接上拉电阻;P2口为数码管的位控扫描控制口,对每个数码管进行约1ms的轮流正电压供电,共使用6个端口来进行控制。两个数码管的左边的8个引脚分别对应段码输出最低位至最高位,DP为小数点位,而两个数码管的右边的4条引脚分别为4位数码管的阴极供电端,用于控制数码管的位控输出。
在数码管的显示控制中,分别使用单片机的P0口、P2口来完成数码管的扫描输出,合理调节扫描时间,可以正确显示数字的情况,方案设计合理。
图为数码管引脚情况和显示电路:
5.报警提示和开锁电路
蜂鸣器驱动电路:端口P3.5对应蜂鸣器驱动,起到信息警示,作为密码输入正确或错误的声音提示,密码正确时响一下声音,且时间较长;密码输入错误时响短暂声音,后可再次输入密码,但总共只有5次机会,5次密码错误后,系统自动锁死,60s之后便可以重新输入密码。其中,在每一次随机数进行更新时,与P3.6连接的二极管会闪烁一下,用于提示。
继电器开锁电路:端口P3.4对应继电器(使用发光二极管代替)开锁,起到开锁的作用。在本系统中,连接灯泡,用于锁开启提示,亮时表示开启成功,实际应用时可接电磁开锁线圈驱动电路,开启5s之后,灯泡闪烁,继电器关闭。
本方案在连接蜂鸣器和继电器时,要合理的参照器件特性,按照下图进行连接,方案设计合理。图示为蜂鸣器与红色发光二极管提示电路:
三、总原理图及元器件清单
1.总原理图(软件proteus)
2.元件选择耗材及价格清单
| 元件序号 | 型号 | 主要参数 | 数量 | 单价 | 备注 |
| R1~R14 | RES40 | 10k欧姆 | 12 | 0.05元 | 无 |
| R15~R17 | RES40 | 1k欧姆 | 3 | 0.05元 | 无 |
| C1~C2 | CAP10 | 47pF | 2 | 0.1元 | 无 |
| C3 | CAP10 | 10uF | 1 | 0.1元 | 无 |
| Button1~12 | Button | 4脚 | 12 | 0.1元 | 无 |
| CRYSTAL | CRYSTAL | 12MHZ | 1 | 0.3元 | 无 |
| 7SEG-MPX4--CC | S4041AS | 4位共阴极 | 2 | 0.5元 | 无 |
| AT89C52 | STC89C52RC.X90C | 单片机 | 1 | 2元 | 无 |
| LED | LED | Led灯 | 4 | 0.3元 | 无 |
| BUZZER | TMB 12A03 | 蜂鸣器 | 1 | 1.5元 | 无 |
| 2N5551 | S 9014 C331 | 三极管 | 1 | 0.3元 | 无 |
| RESPACK-8 | RESPACK | 排阻 | 1 | 0.2元 | 无 |
| 单面绿油板 | 单面绿油板 | 15*20cm | 1 | 5元 | 无 |
| 导线、锡丝 | 导线、锡丝 | 导线、锡丝 | 若干 | 若干 | 无 |
三、总原理图及元器件清单
四、
四、程序流程图
五、性能测试与分析
指标1:对于单片机的按键输入密码的有效位数为6位;在下面的界面显示中,具有6位密码界面输入和显示。达到此性能指标。
指标2:单片机中的密码与当前单片机定时器系统时间相关,每隔1分钟,密码自动更新。
当前显示的随机数为361524,此时的正确密码是241536。在间隔1分钟之后,密码更新,此时的随机数显示为375892,此时的正确密码是925837。达到此性能指标。
指标3:如果密码正确,蜂鸣器响0.5秒,开锁继电器吸合,5秒后开锁继电器关闭。在下面的显示中,当输入密码正确时,代表开锁继电器的灯泡会亮起,5秒之后,灯泡熄灭。达到此性能指标。
指标4:密码尝试5次出错,则停止尝试1分钟。达到此性能指标。
其他性能指标:
在基于指标3中,在输入密码正确的情况下,加入了更加人性化的界面信息,ONONON表示此时开锁,同时,在关闭继电器时,灯泡和蜂鸣器均会闪烁,提醒使用者。
在基于指标4中,当输入密码错误时,显示ERRERR,,表示此时输入密码错误,同时,在5次输入密码错误时,系统锁定,界面显示倒计时信息,60s倒计时结束之后,可再次输入密码。
总体来说,提高部分的指标加强了本装置的人机交互的能力,将人性化的思想得到很大程度的体现。
六、设计作品图片
七、结论与心得
问题1:焊接单片机的晶振和复位电路。单片机不能够进行程序烧录。
解决方法:了解到此问题之后,我在网上查阅相关的资料。资料显示单片机不能正常工作,与外围的晶振和复位电路有很大的关系。同时,在咨询老师的意见之后,我对单片机的晶振和复位电路进行了详细的检查。其中两个瓷片电容应该焊接在晶振的后面,同时晶振应该离单片机的引脚非常接近,否则电容不起振,晶振也无法正常工作,同时电容所采取的电容值应该按照说明书文档上所标注的33pF以下。
问题2:数码管电路焊接。共阴极,共阳极没有区分,同时数码管的亮度非常低。
解决方法:针对于此现象的产生,在网上查询相关的数码管使用方法,掌握了数码管共阴极,共阳极的测量方法。共阴极数码管的测量方法应该是:用电源的负极夹住数码管的位控端,同时用1V左右的电源正极依次触碰数码管的八个段码口,如果数码管此时各段正常亮起,则说明数码管是共阴极数码管,反之是共阳极数码管。在正确焊接到单片机电路板上的时候,应该检查数码管是否正常,在我使用的数码管中有一个损坏,经过多次检查才发现。同时单片机IO口输出的电流非常小,需要采取通过电流较小的数码管来进行显示,此处我采用型号为数码管S4041AS来实现以上电路。
问题3:单片机重要程序编写。在本次项目设计中,程序编写难度最大的部分,我认为应该在于数码管随机数的产生、显示以及按键密码的比对函数。
解决方法:参照网上现有的资料,我认真学习单片机定时器的相关使用,同时针对于随机数的产生,我也认真的学习了相关的算法,在反复编译文件中得到此次问题的解决。同时,在密码比对函数中我创造性的提出了利用多维数组来进行密码比对,分别设置存储密码和比对的新密码,同时设定标志位,并在外围运用多次循环用于控制密码错误的次数,进而形成一个按键输入比对的函数,可以很好的被单片机来进行调用。
课题改进:我觉得可以将数码管显示电路替换为LCD屏幕进行多信息、多维度的展示,让人机交互界面更加的人性化。同时基于实验室现有器材可以将灯泡更换为继电器,真正让智能密码锁具有继电器开锁的相关功能。
课题背景:该项目具有广大的背景,因为在现在的生活中,安全性成为一个不可忽视的问题。生活中许多多的物品需要用“锁”来锁住。智能密码锁提供了一个很好的解决方案,它具有高效、便捷、不易被破解等相关功能,本次课题设计为这种方案的实现提供了一个很好的参考,在以后的实际应用中,更换更加坚固可靠的材料,可以将此产品真正的走向实用化。
八、程序代码
#include
#include //rand()函数导入,产生随机数
#include
sbit P10 = P1 ^ 0; // 数字0 // 按键定义
sbit P11 = P1 ^ 1; // 数字1
sbit P12 = P1 ^ 2; // 数字2
sbit P13 = P1 ^ 3; // 数字3
sbit P14 = P1 ^ 4; // 数字4
sbit P15 = P1 ^ 5; // 数字5
sbit P16 = P1 ^ 6; // 数字6
sbit P17 = P1 ^ 7; // 数字7
sbit P30 = P3 ^ 0; // 数字8
sbit P31 = P3 ^ 1; // 数字9
sbit P32 = P3 ^ 2; // 随机数显示界面
sbit P33 = P3 ^ 3; // 密码输入界面
sbit P34 = P3 ^ 4; // 继电器驱动
sbit P35 = P3 ^ 5; // 蜂鸣器驱动
sbit P36 = P3 ^ 6; //定时器更新时,灯闪一下
sbit P37 = P3 ^ 7; //预留口--暂时未使用
sbit P00 = P0 ^ 0; // 数码管段码
sbit P01 = P0 ^ 1;
sbit P02 = P0 ^ 2;
sbit P03 = P0 ^ 3;
sbit P04 = P0 ^ 4;
sbit P05 = P0 ^ 5;
sbit P06 = P0 ^ 6;
sbit P07 = P0 ^ 7;
sbit P20 = P2 ^ 0; // 数码管位码 工作电压值
sbit P21 = P2 ^ 1;
sbit P22 = P2 ^ 2;
sbit P23 = P2 ^ 3;
sbit P24 = P2 ^ 4;
sbit P25 = P2 ^ 5;
sbit P26 = P2 ^ 6;
sbit P27 = P2 ^ 7;
// 共阴显示段码表: 0 1 2 3 4 5 6 7 8 9 - n 不亮 三 E r f
char code dis_7[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9
0x40, 0xb7, 0xff, 0x49, 0x79, 0x70,0x71};
// 控制七段数码管的工作电压,0x01表示最左端数码显示 从左往右显示顺序
char code scan_con[6] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf};
// 储存显示于数码管上面的值,最开始显示“888888”,顺便检验数码管有没有损坏的现象
unsigned char dia[6] = {8, 8, 8, 8, 8, 8};
// 用于储存密码和算法输入密码的数值情况,data1[0][]为算法设定的密码,data1[1][]为输入的密码
unsigned char dat1[2][6] = {0, 0, 0, 0, 0, 0};
unsigned char dat2[6]; // 显示缓存
bit flag = 0, flag1 = 0; // 标志位
int c = 0;
int count; //随机数生成--定时器
int count1;
int count2; // 定时器计数标志位 初始化
int a1 ; //倒计时总时间
int n; //延时for循环
void delay(int t) // 延时程序
{
int i, j;
for (i = 0; i 











