代码改变世界

【51单片机】【protues仿真】基于51单片机密码锁系统 - 详解

2025-09-23 20:07  tlnshuju  阅读(65)  评论(0)    收藏  举报

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

初始普通用户密码 123123 功能:解锁 修改密码
管理员密码 520025 功能:恢复初始密码
信码 520520 功能:恢复管理员和密码使用

1、LCD1602液晶显示
2、矩阵按键​输入
3、密码输入错误3次,关闭管理员和用户密码功能
4、信码启用管理员和用户密码功能
5、修改密码,开锁后输入正确密码按修改密码按键进行修改
6、管理员密码输入后初始化普通用户密码
7、密码输出错蜂鸣器警报提示

二、使用步骤

51单片机密码锁平台采用AT89C51/52或STC89C51/52等51系列单片机作为控制核心,负责密码验证逻辑、外设协调和数据处理。

三、硬件资源

1、51单片机核心模块
2、矩阵按键模块
3、LED灯模块
4、蜂鸣器模块
5、继电器模块
6、LCD1602显示模块

四、软件设计

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar i;

sbit relay = P2^2;
sbit beep = P3^3;

sbit beiguan = P2^3;

uint flag_time;

uint flag_guan;

uchar dis_smg[7]={0};

uchar password[7]={0};
uchar password_bj[7]={0};
uchar code password_r[6] = {1,2,3,1,2,3} ;
uchar code password_gl[6] = {5,2,0,0,2,5} ;
uchar code password_xm[6] = {5,2,0,5,2,0} ;
uchar password_xg[6]; //密码修改
uchar flag_password; //密码正确否
uchar flag_password_cichu1;//密码错误次数

uchar flag_200ms=1; //200毫秒的变量

uchar menu_1,menu_i;

sbit scl = P2^1; //24c02信号引脚
sbit sda = P2^0; //24c02数据引脚


void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}

sbit rs=P2^5; //寄存器选择信号 H:素材寄存器 L:指令寄存器
sbit rw=P2^6; //寄存器选择信号 H:内容寄存器 L:指令寄存器
sbit e =P2^7; //片选信号 下降沿触发
void delay_uint(uint q)
{
while(q--);
}



void write_com(uchar com)
{
rs=0; //写指令
rw=0; //对1602写操作
P0=com; //P0口对1602写指令资料
delay_uint(25);
e=1; //e=1使能信号
delay_uint(100); //延时一下等1602完成操作
e=0;
}


void write_data(uchar dat)
{
rs=1; //写数据
rw=0; //对1602写操控
P0=dat; //P0口对1602写数据
delay_uint(25);
e=1; //e=1使能信号
delay_uint(100); //延时一下等1602结束操作
e=0;
}
void main()
{
uint value;
beep = 0; //蜂鸣器响一声
delay_1ms(150);
P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
scl = 0;
read_24c02_6(password); //读出保存的密码
init_1602(); //lcd1602初始化
beiguan = 0; //打开背光
while(1)
{
if(flag_password_cichu1 < 3) //错误三次 密码不能用了
{
key(); //按键函数
if(key_can < 20)
{
if(beiguan == 0)
{
if(menu_1 == 0)
key_with(); //按键处理函数
xiugai_password(); //修改密码
}
else
beiguan = 0;
flag_time = 0;
if(key_can == 12) //退出键
{
clear_shuzu(password_xg);
clear_shuzu(dis_smg);
write_string(1,0," Password Lock ");
write_string(2,0," Input: ");
lcd1602_guanbiao(1,7+0x40); //开光标
menu_1 = 0;
menu_i = 0;
}

}
}
if(flag_password_cichu1 >= 3) //错误三次密码启动信码按键 输入正确解锁
{
key(); //按键函数
if(key_can < 20)
{
if(beiguan == 0)
{
if(menu_1 == 0)
key_with_xinma(); //信码按键处理函数
xiugai_password(); //修改密码
}
else
beiguan = 0;
flag_time = 0;
if(key_can == 12) //退出键
{
clear_shuzu(password_xg);
clear_shuzu(dis_smg);
write_string(1,0," Password Code ");
write_string(2,0," Input: ");
lcd1602_guanbiao(1,7+0x40); //开光标
menu_1 = 0;
menu_i = 0;
}
}
}
flag_200ms ++;
if(flag_200ms >= 200)
{
flag_200ms = 0;
if(beiguan == 0) //延时关闭锁30秒关闭背光
{
flag_time ++;
if(flag_time >= 5 * 30) //30秒
{
flag_time = 0;
beiguan = 1; //关闭背光
}
}
if(relay == 0) //延时关闭锁
{
flag_guan++;
if(flag_guan >= 5 * 10) //10秒
{
flag_guan = 0;
relay = 1; //关闭密码锁

}
}else
flag_guan = 0;
}
delay_1ms(1);
}
}

五、实验现象

演示视频:

【51单片机-B048】【protues仿真】基于51单片机密码锁仿真