掘金 后端 ( ) • 2024-05-08 10:16

本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。我们这里实现的是硬件仿真,关于软件仿真可以参考其他人的文章。

单片机课程设计--基于C51电子密码锁

实现任务

电子密码锁在当前市场运用较为广泛,其主要通过对外接密码输入来实现对系统或电路的控制,并进一步控制系统机械开关的操作。相关电子产品通过系统编程控制能够以电子密码锁的形式来实现系统的开关,尤其是对机械产品而言具有较高的安全性与可靠性。本文提出的电子密码锁系统设计主要以AT89C51单片机为基础,通过矩阵式键盘、LCD显示、蜂鸣器以及二极管等部件组成主系统。该系统设计编程方便、操作性强、具有较高的实用性,且耗能较低,在市场具有广阔的应用范围。

实现思路

本设计采用了AT89C51单片机电子锁系统,进行初始化设置,启动密码锁功能,密码输入显示屏幕采用了LCD1602液晶显示屏。系统控制指令通过单片机进行实现,单片机根据实际操作情况分配部件工作内容,程序操作性强、方便简洁。在用户输入密码过程中,单片机将会采用矩阵按键布局模式记录当前输入密码,并将该密码与系统设置密码进行比对,若密码匹配则开启密码锁,若密码错误则需要用户按下删除键重新输入密码。

拓展实现

当用户输入密码错误次数超过3次,电子密码锁将会自动锁定,需要用户切换管理员模式输入管理员密码才可解锁当前状态,并重新输入解锁密码。我们这里先实现基础的功能,其他的会慢慢更新。

准备工作

我们这里需要一个STC89C51单片机,一块LCD1602显示屏,数据线一根,开发板原理图一份。

A2单片机

A2单片机

编辑

我们这里使用的是普中A2单片机,如果你是其他板子,原理都一样,可能管脚不一样,需要自己根据管脚改代码。

​编辑

我们这里使用的是普中自带的LCD1602显示屏,我们这里还需要一个开发板原理图,我们得知道矩阵按键的管脚。

​编辑

原理图

首先是LCD1602的原理图:

然后是矩阵按键的原理图:

代码实现

我们接下来就是开始写代码,矩阵按键一共有16个按键,我们只要用12个按键,用左边的三列,我看网上有些教程是用前12个按键,我感觉好不习惯,还是常见的慢慢键盘舒服一些,类似于这种:

我们把左下角的按键第一位取消,右下角定义为确定。那我们接下来,先写键盘相关的代码。

MatrixKey.C

#include <REGX52.H>
#include "Delay.h"


unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=4;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=7;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=11;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=8;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=10;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=12;}
	
	
	return KeyNumber;
}

我们这里采用的是先逐列扫描,然后是逐行扫描,这里的KeyNumber代表的意思如下(对应于上图的位置):

KeyNumber 代表 KeyNumber 代表 1 1 7 7 2 2 8 8 3 3 9 9 4 4 10 0 5 5 11 取消(*) 6 6 12 确认(#)

KeyNumber.h

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__

unsigned char MatrixKey();

#endif

这里就是函数申明了,就不解释了,我们接下来,先写一个延时函数:

Delay.C

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

这个我更不解释了,如果这个都看不懂,就重新入门吧。

Delay.H

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

我们这里还要用到LCD1602相关的代码,大家可以不用去弄懂这个代码怎么写的,只要会用就行,这个只要是来初始化和显示内容的相关功能代码。

main.c

我们前面铺垫了很多,接下来,我们就可以写我们的主函数了,我们这里实现的是4位密码锁,当数字1~0被按下,执行下面的代码:

if(KeyNum)						//如果有按键按下
		{
			if(KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9||KeyNum==10)
			{
				if (count<4)
				{
				Password*=10;
				Password += KeyNum%10;
				}
				count++;
				
			}
			LCD_ShowNum(2,1,Password,4);	//LCD显示键码

如果我们发下密码按错了,想取消,我们可以加这样的功能:

        if (KeyNum ==11)//取消
				{
					Password =0;
					count =0;
					LCD_ShowNum(2,1,Password,4);	//更新LCD显示键码
				}

我这里设置的初始密码是8888,大家也可以设置其他的,大家还可以根据我的代码实现修改密码的功能,我这里基础的功能是密码正确屏幕显示OK,密码错误显示ERROR:

        if(Password == 8888)
				{
					LCD_ShowString(1,14,"OK");
					Password =0;
					count =0;
					LCD_ShowNum(2,1,Password,4);	//更新LCD显示键码
				}
				else
				{
					LCD_ShowString(1,11,"ERROR");
					Password =0;
					count =0;
					LCD_ShowNum(2,1,Password,4);	//更新LCD显示键码
				}				
			}

到这里,我们的所有功能都完成了,下面是完整的主函数代码:

#include <REGX52.H>
#include "Delay.h"		//包含Delay头文件
#include "LCD1602.h"	//包含LCD1602头文件
#include "MatrixKey.h"	//包含矩阵键盘头文件

unsigned char KeyNum;
unsigned int Password,count;

void main()
{
	LCD_Init();							//LCD初始化
	LCD_ShowString(1,1,"PASSWORD:");	//LCD显示字符串
	while(1)
	{
		KeyNum=MatrixKey();				//获取矩阵键盘键码
		if(KeyNum)						//如果有按键按下
		{
			if(KeyNum==1||KeyNum==2||KeyNum==3||KeyNum==4||KeyNum==5||KeyNum==6||KeyNum==7||KeyNum==8||KeyNum==9||KeyNum==10)
			{
				if (count<4)
				{
				Password*=10;
				Password += KeyNum%10;
				}
				count++;
				
			}
			LCD_ShowNum(2,1,Password,4);	//LCD显示键码
			
			
			if (KeyNum ==12)//确认
			{
				LCD_ShowString(1,11,"     ");
				if(Password == 8888)
				{
					LCD_ShowString(1,14,"OK");
					Password =0;
					count =0;
					LCD_ShowNum(2,1,Password,4);	//更新LCD显示键码
				}
				else
				{
					LCD_ShowString(1,11,"ERROR");
					Password =0;
					count =0;
					LCD_ShowNum(2,1,Password,4);	//更新LCD显示键码
				}				
			}
			if (KeyNum ==11)//取消
				{
					Password =0;
					count =0;
					LCD_ShowNum(2,1,Password,4);	//更新LCD显示键码
				}
		}
	}
}

总结

我们使用的STC89C52单片机,我们用LCD1602作为显示屏,实现了电子密码锁的功能,大家还可以修改密码,或者密码错误三次以上,蜂鸣器发出警报,或者密码正确,蜂鸣器滴一声,LED灯闪烁一下,等等,可以都可以在此基础上升级。希望我的文章对你有帮助。