51单片机的电子密码锁的设计与仿真

51单片机的电子密码锁的设计与仿真

看看效果图
51单片机的电子密码锁的设计与仿真_第1张图片

  1. 简介

(1)CPU使用51单片机。
(2)用4x4矩阵键盘作为操作信息输入。
(3)用LCM1602液晶显示模块作为信息显示。
(4)用蜂鸣器及发光二极管作为错误报警及状态显示。

  1. 功能
    (1)输入密码功能。
    输入密码时,用“★”号或“-”代替真实的密码以防密码泄露。在
    输入密码时,具有清除前一位/或多位的密码功能(用清除键)。
    密码输入完毕,按(确认/开锁键)确认并生效。
    (2)上锁功能。
    在锁开状态下,通过上锁键上锁。
    (3)在锁合的状态下,通过输入密码开锁功能。
    开锁时,先按确认/开锁键后,再在键盘上输入六位密码,然后按
    确认/开锁键,如果密码正确,进入锁开状态。
    (4)在锁开状态下,设置新密码功能。
    按设置新密码键,在键盘上输入六位新的密码,按(确认/开锁)
    键确认,代替旧密码。
    (5)在开锁时,如果输入密码三次错误,产生声、光报警功能。
    每错误一次,告警一次, 若连续三次错误,则系统屏蔽输入功能,
    直到系统复位后重新开始。
    程序设计

定义LCD管脚以及led灯以及蜂鸣器管脚

51单片机的电子密码锁的设计与仿真_第2张图片
定义LCD显示的字符串以及初始化变量
51单片机的电子密码锁的设计与仿真_第3张图片
矩阵键盘扫描

/*
 * @description	: 矩阵键盘扫描
 * @param 		:无
 * @return 		: 无
 */
void KeyDown(void)
{
	GPIO_KEY=0x0f;
	if(GPIO_KEY!=0x0f)//读取按键是否按下
	{	 	
		delay(3);//延时10ms进行消抖
		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
		{	 //TR1=0;
			//测试列
			 //LED=~LED;
			GPIO_KEY=0X0F;
			switch(GPIO_KEY)
			{
				case(0X07):	KeyValue=0;break;
				case(0X0b):	KeyValue=1;break;
				case(0X0d): KeyValue=2;break;
				case(0X0e):	KeyValue=3;break;
			}
			//测试行
			GPIO_KEY=0XF0;
			switch(GPIO_KEY)
			{
				case(0X70):	KeyValue=KeyValue;break;
				case(0Xb0):	KeyValue=KeyValue+4;break;
				case(0Xd0): KeyValue=KeyValue+8;break;
				case(0Xe0):	KeyValue=KeyValue+12;break;
			}
			while(GPIO_KEY!=0xf0);	 //检测按键松手检测
			return ;
		}
	}
	KeyValue = 0xff;
}
```扫描按键
```c
/*
 * @description	: 按键扫描 并且执行相应的操作
 * @param 		:无
 * @return 		: 无
 */
void Input_Key()
{
		//刷新按键的值若没有按键按下则返回0xff
		KeyDown();
		if(KeyValue == 0xff||pw_errnum>=3)return;//检测是否有按键按下,或者是否有
		//当1-9按下时
		if(KeyValue>=0&&KeyValue<=9)
		{		
				if((flag == 0 || flag ==2)&&pw_count<6)
				{
						pw_count++;//密码下标
						temp_pw[pw_count] = KeyValue;//保存按键值
						show_pw(pw_count);	//屏幕显示*
				}
		}
		else if(KeyValue == 12)//上锁键
		{
				if(flag == 1) //如果设备在开锁时按下
				{
						flag = 0;
						show_Status(&input_pw);//显示请输入密码
				}
		}
		else if(KeyValue == 13)//按下了清除键
		{
						if(pw_count>0)pw_count--;//下标左移
						show_pw(pw_count);	//刷新屏幕密码
		}
		else if(KeyValue == 14)//按下了确定键
		{
				if(pw_count == 6)  //判断数量是否有6位
				{
							if(flag == 0) //锁关闭状态
							{
										if(temp_pw[0] == pw[0]&&temp_pw[1] == pw[1]&&temp_pw[2] == pw[2]&&temp_pw[3] == pw[3]&&temp_pw[4] == pw[4]&&temp_pw[5] == pw[5])//校验密码
										{
												show_Status(&welcome);//显示欢迎您
												flag = 1;							//切换状态
												pw_count = 0;					//密码清0
												pw_errnum = 0;				//错误密码次数清0
												show_pw(pw_count);	//刷新屏幕密码
												open();							//执行开门时的回调函数
											
										}
										else{
											
												pw_errnum++;			//错误次数+1
												pw_count = 0;			//密码清0
												show_pw(pw_count);	//刷新屏幕密码
												show_Status(&pw_error); //显示密码错误
												alarm();								//发出警告
												if(pw_errnum>=3)				//当密码错误达到3次时
												{
														show_Status(&Lock);  //显示设备锁了
														Lock_Device();      //报警 轰炸模式
												}
										}
										
							}
							else if(flag == 1)//锁打开状态,按下确定键无反应
							{
									
										
							}
							else if(flag == 2)//设置密码状态  保存新密码
							{
								//保存密码
								pw[0] = temp_pw[0];
								pw[1] = temp_pw[1];
								pw[2] = temp_pw[2];
								pw[3] = temp_pw[3];
								pw[4] = temp_pw[4];
								pw[5] = temp_pw[5];
								show_Status(&welcome); //显示欢迎你
								flag = 1;              //标志位置位
								pw_count = 0;         //密码清0
								show_pw(pw_count);	//刷新屏幕密码
								
							}
				}else{//密码未到6位不能操作
//						LED = 0;
				}
					
		}
		else if(KeyValue == 15)//按下了设置密码键
		{
				if(flag == 1) //判断锁是否已经打开,打开才能设置密码
				{
							show_Status(set_pw);//显示新的标题
							flag = 2;         //标志位改成设置密码
				}
		}
}

需要的可以自己去下载哦!
需要该源码的可以关注公众号:智慧小巷
回复:电子密码锁
即可!
在这里插入图片描述

你可能感兴趣的:(单片机)