51单片机的电子密码锁的设计与仿真
看看效果图
- 简介
(1)CPU使用51单片机。
(2)用4x4矩阵键盘作为操作信息输入。
(3)用LCM1602液晶显示模块作为信息显示。
(4)用蜂鸣器及发光二极管作为错误报警及状态显示。
- 功能
(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; //标志位改成设置密码
}
}
}
需要的可以自己去下载哦!
需要该源码的可以关注公众号:智慧小巷
回复:电子密码锁
即可!