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

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

看看效果图
在这里插入图片描述

  1. 简介

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

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

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

在这里插入图片描述
定义LCD显示的字符串以及初始化变量
在这里插入图片描述
矩阵键盘扫描

/*
 * @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;         //标志位改成设置密码
				}
		}
}

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

基于8051单片机的密码锁的c语言代码 #include <reg51.h> typedef unsigned char uchar; typedef unsigned int uint; //¼üÅÌ×Ó³ÌÐòÏà¹Ø˵Ã÷ #define BLANKCHAR 10 //¶¨Òå¿Õ°×³£Á¿ #define PCHAR 11 //¶¨Òå×Ö·û P ³£Á¿(µÈ´ýÓû§ÊäÈëÃÜÂë) #define OPENCHAR 12 //¶¨Ò忪Ëø×Ö·û |¡ª ³£Á¿ #define ALARMCHAR 13 //¶¨Òå×Ö·û A ³£Á¿£¨ÃÜÂë¶à´Î´íÎ󾯸棩 #define LINECHAR 14 //¶¨Òå×Ö·û - ³£Á¿ #define BACKKEY 0X0D //¶¨ÒåÍ˸ñ°´¼ü³£Á¿ #define ENTERKEY 0X0F //¶¨ÒåÈ·Èϼü³£Á¿ #define LOCKKEY 0X0E //¶¨Òå±ÕËø¼ü³£Á¿ #define NO_KEY 20 //¶¨ÒåÎÞ°´¼ü·µ»ØÖµ //¶¨Òå°´¼üɨÃèÂë±í£¬°´¼üɨÃèʱ£¬4λÁÐÏߺÍ4λÐÐÏß×é³É×Ö½ÚÊý¾Ý±í uchar code KEYCODE[] = {0XEE,0XDE,0XBE,0X7E, // 0 1 2 3 0XED,0XDD,0XBD,0X7D, // 4 5 6 7 0XEB,0XDB,0XBB,0X7B, // 8 9 0XE7,0XD7,0XB7,0X77};// back lockkey enter uchar KeyPre; //±£´æÉÏ´ÎɨÃè°´¼üµÄ¼üÖµ uchar KeyUp;//ÓÃÓÚ¿ØÖÆ°´¼üÈ¥¶¶¶¯²Ù×÷¡£1£ºÉ¨ÃèʱÏû¶¶ 2£ºµÈ´ýÊÍ·Å 3£ºÊÍ·ÅʱÏû¶¶ #define LEDPORT P0 //¶¨ÒåÏÔʾÆ÷¶ÎÂëÊä³ö¶Ë¿Ú #define LEDCON P1 //¶¨ÒåÏÔʾÆ÷λ¿ØÖÆ¶Ë¿Ú #define KEYPORT P2 //¶¨Òå¼üÅÌ¶Ë¿Ú sbit ALARMCON = P3^3; //¶¨Ò屨¾¯¿ØÖÆÒý½Å sbit LOCKCON = P3^5; //¶¨Òåµç×ÓËø¿ØÖÆÒý½Å uchar code SEGCODE[] = {0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//0...9µÄ¹²Ñô¼«¶ÎÂë 0XFF,//²»ÏÔʾ 0X8C,//ÏÔʾ×Ö·ûP(µÈ´ýÓû§ÊäÈëÃÜÂë) 0X8F,//|-µÄ¹²Ñô¼«¶ÎÂ루¿ªËø£© 0X88,//×Ö·ûA 0XBF,//×Ö·û- 0X9f,//·µ»Ø×Ö·û };
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值