【Proteus仿真】【51单片机】基于51单片机密码锁

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

1、LCD1602液晶显示

2、矩阵按键​

3、掉电存储保护,修改密码,两种用户模式

4、密码输出错误提示,超过次数警报

5、密码输出正确,指示灯点亮

二、使用步骤

  • 按下开机键启动系统,LCD显示屏提示"输入密码"并显示光标闪烁‌
  • 通过4×4矩阵键盘输入数字密码(输入时以"*"号显示保密)‌
  • 按"#"键确认输入,系统验证密码‌

三、硬件资源

1、51单片机核心模块

2、按键模块

3、24C02存储模块

4、蜂鸣器模块

5、继电器模块

6、LCD1602显示模块

四、软件设计

#include <reg52.h> //调用单片机头文件

#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255

#define uint unsigned int //无符号整型 宏定义 变量范围0~65535

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 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数据引脚

/***********************1ms延时函数*****************************/

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; //片选信号 下降沿触发

/********************************************************************

* 名称 : delay_uint()

* 功能 : 小延时。

* 输入 : 无

* 输出 : 无

***********************************************************************/

void delay_uint(uint q)

{

while(q--);

}

/********************************************************************

* 名称 : write_com(uchar com)

* 功能 : 1602指令函数

* 输入 : 输入的指令值

* 输出 : 无

***********************************************************************/

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;

}

/********************************************************************

* 名称 : write_data(uchar dat)

* 功能 : 1602写数据函数

* 输入 : 需要写入1602的数据

* 输出 : 无

***********************************************************************/

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 lcd1602_guanbiao(uchar open_off,uchar add)

{

if(open_off == 1) //开光标

{

write_com(0x80+add); //将光标移动到秒个位

write_com(0x0f); //显示光标并且闪烁

}

else

{

write_com(0x0c); //关光标

}

}

/***********************lcd1602上显示两位十进制数************************/

void write_lcd2(uchar hang,uchar add,uchar date)

{

if(hang==1)

write_com(0x80+add); //1602写第一行的地址

else

write_com(0x80+0x40+add); //1602写第二行的地址

write_data(0x30+date/10%10); //显示十位数

write_data(0x30+date%10); //显示个位数

}

/***********************lcd1602上显示这字符函数************************/

void write_string(uchar hang,uchar add,uchar *p)

{

if(hang==1)

write_com(0x80+add); //1602写第一行的地址

else

write_com(0x80+0x40+add); //1602写第二行的地址

while(1)

{

if(*p == '\0') break; //\0字符串的结尾标志 break结束while循环 结束写字符

write_data(*p); //写数据

p++; //指针地址加1

}

}

五、实验现象

演示视频:

相关推荐
XINVRY-FPGA9 小时前
EPM240T100I5N Altera FPGA MAX II CPLD
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发·射频工程·fpga
mit6.82411 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
曙曙学编程14 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
Kisorge14 小时前
【电机参数】电压、电流、转速标幺化推算过程
stm32
第二层皮-合肥15 小时前
FPGA实现ETH接口
单片机·嵌入式硬件·fpga开发
anghost15015 小时前
基于单片机的智能声控窗帘
单片机·嵌入式硬件·mongodb
脚后跟15 小时前
51单片机拼接板(开发板积木)
51单片机
yiqiqukanhaiba17 小时前
STM32学习笔记13-通信协议I2C&MPU6050&I2C软件控制
笔记·stm32·学习
璞致电子18 小时前
【PZ-ZU47DR-KFB】璞致FPGA ZYNQ UltraScalePlus RFSOC QSPI Flash 固化常见问题说明
嵌入式硬件·fpga开发·fpga·软件无线电·sdr