编号:49
基于51单片机的密码锁
功能描述:
由51单片机最小系统+ 4*4矩阵键盘+LCD1602液晶显示+蜂鸣器+继电器模块
1、采用51单片机为主控芯片
2、通过4*4矩阵键盘实现密码输入、功能键等排列如下
1 2 3 删除
4 5 6 修改密码
7 8 9 重新输入
返回 0 确认 紧急开锁键
3、每按下一次按键蜂鸣器会有‘滴’提示音
4、按任意数字键键,进入密码输入界面 输入正确密码开锁,继电器打开,再次关锁可通过关锁键关锁;输入密码错误三次,系统锁死一分钟后才可再次尝试;
5、按“修改密码”键,进入密码修改界面,首先输入原始密码才可进行修改,输错三次同样锁死一分钟后才可再次修改密码。
6、按“删除”键可删除退格。
7、按“重新输入”键可重新输入。
8、按“紧急开锁”键可直接一键开锁。
Proteus7.8以上版本均可使用
视频演示链接:
49、基于51单片机的密码锁
仿真图:
PCB图:
实物图:
程序源码:
#include "reg52.h"
#include "intrins.h"
#include "lcd1602.h"
#include "key.h"
#include "Password.h"
#include "delay.h"
sbit BEEP = P2^0; //蜂鸣器控制脚定义
sbit JD = P2^1; //继电器控制脚定义
bit Lock_Flag = 1; //键盘可用标志位 1:可用 0:不可用
unsigned char Sec = 60; //60秒 倒计时
void Timer0Init(void) //50毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 0; //失能T0中断
EA = 1; //开总中断
}
void main(void)
{
unsigned char cnt=0;
Lcd1602_Init(); //LCD1602液晶初始化
Timer0Init(); //50毫秒@11.0592MHz
while(1)
{
Lcd1602_String(0,0," Password Lock !");
if(Lock_Flag==1) //键盘可用
{
cnt=KeyScan(); //扫描按键键值 值赋给cnt
if(cnt!=0xff) //如果有按键按下
{
if(cnt>='0'&&cnt<='9') //如果按下了0-9之间的数字键 则直接输入密码开锁
{
Password_Insert(); //输入密码
}
else if(cnt=='B') //如果按下了'B'键 修改密码
{
Beep_Alram(40);
Password_Changed(); //密码修改函数
}
else if(cnt=='D') //如果按下了'D'键 紧急开锁并重置密码
{
Beep_Alram(40);
Password_Open();
Password_Right = 1;
}
else if(cnt=='*') //如果按下了'*'键 关锁键
{
if(JD==0)
{
Beep_Alram(40);
JD = 1; //关继电器
}
}
}
if(Password_Right==1) //输入密码正确?
{
JD = 0; //开继电器
Password_Right = 0; //清除标志
Lcd1602_String(0,0," Openning... ");
delay_ms(1000); //延时一会儿
}
if(Password_Error3 == 1) //密码输错误3次标志位
{
Password_Error3 = 0; //清除标志
Lock_Flag = 0; //锁死键盘不可用
ET0 = 1; //使能中断
}
}
else
{
Lcd1602_Write_Com(0xc0+1); //第二行0xc0开头
Lcd1602_Write_Data(0+0x30);
Lcd1602_Write_Data(0+0x30);
Lcd1602_Write_Data(':');
Lcd1602_Write_Data(Sec/10+0x30);
Lcd1602_Write_Data(Sec%10+0x30);
if(Sec<=0) //达到1分钟 后 键盘恢复
{
Sec = 60;
Lcd1602_String(0,1," ");
Lock_Flag = 1; //键盘恢复可用
}
}
}
}
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1 //50ms中断
{
static unsigned char Cnt = 0;
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值
TF0 = 0;
Cnt++;
if(Cnt>=20) //达到1秒
{
Cnt = 0; //清0
Sec--; //秒--
if(Sec<=0) //达到1分钟 后 键盘恢复
{
ET0 = 0; //关中断
}
}
}
软件免费下载地址:
1、Proteus仿真软件
文件内容:Proteus7.8安装包、Proteus8.6安装包、Proteus.8.10安装包、Proteus Professional 8.11 SP0安装包
链接:https://pan.baidu.com/s/11LNUZ9BJXWvXf1C4dPc3_w
提取码:2756
2、KEIL4 C51软件安装包
链接:https://pan.baidu.com/s/1CTZBqDsPsyIbjCIjI_birA
提取码:sy2a
文件下载:
链接:https://pan.baidu.com/s/1foSHF3RUldPtP8X0UmD03Q?pwd=6s9b
提取码:6s9b