51单片机密码锁的设计与制作带仿真图
时间: 2023-07-18 21:23:13 浏览: 123
好的,下面是51单片机密码锁的设计与制作步骤及仿真图:
1. 硬件设计
首先,需要准备的硬件器件有:51单片机、LCD液晶显示屏、按键、蜂鸣器、继电器、电源模块等。
将这些器件按照以下原理图进行连接:
![51单片机密码锁原理图](https://img-blog.csdnimg.cn/20211019182353347.png)
其中,P1.0口接继电器模块的控制端,P3.2~P3.5口接4个按键模块,P2.0~P2.7口接LCD液晶显示屏,P0.0口接蜂鸣器,VCC和GND接电源模块。
2. 软件设计
在Keil C51开发环境中,编写以下代码实现密码锁功能:
```c
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
//定义按键端口
sbit key1 = P3^2;
sbit key2 = P3^3;
sbit key3 = P3^4;
sbit key4 = P3^5;
//定义继电器端口
sbit relay = P1^0;
//定义LCD1602端口
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
//定义蜂鸣器端口
sbit beep = P0^0;
//定义全局变量
uchar password[5] = "1234"; //初始密码
uchar input[5] = ""; //输入密码
uchar flag = 0; //开锁标志
//延时函数
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<125;j++);
}
//LCD1602写命令
void lcd_write_command(uchar command)
{
RS = 0;
RW = 0;
P2 = command;
EN = 1;
delay(1);
EN = 0;
}
//LCD1602写数据
void lcd_write_data(uchar data)
{
RS = 1;
RW = 0;
P2 = data;
EN = 1;
delay(1);
EN = 0;
}
//LCD1602初始化
void lcd_init()
{
lcd_write_command(0x38); //设置16x2显示,5x7点阵,8位数据总线
lcd_write_command(0x0c); //开显示,光标不显示
lcd_write_command(0x06); //写入字符后光标加1,整屏不移动
lcd_write_command(0x01); //清屏
}
//LCD1602显示字符串
void lcd_show_string(uchar x,uchar y,uchar *str)
{
uchar i;
if(x<16)
{
if(y==0) lcd_write_command(0x80+x);
else if(y==1) lcd_write_command(0xc0+x);
for(i=0;str[i]!='\0';i++)
{
lcd_write_data(str[i]);
}
}
}
//按键扫描
uchar key_scan()
{
uchar key_val = 0xff;
if(key1 == 0) //第一行第一个按键
{
delay(10);
if(key1 == 0)
{
key_val = '1';
}
}
else if(key2 == 0) //第一行第二个按键
{
delay(10);
if(key2 == 0)
{
key_val = '2';
}
}
else if(key3 == 0) //第二行第一个按键
{
delay(10);
if(key3 == 0)
{
key_val = '3';
}
}
else if(key4 == 0) //第二行第二个按键
{
delay(10);
if(key4 == 0)
{
key_val = '4';
}
}
return key_val;
}
//输入密码
void input_password()
{
uchar i = 0;
while(1)
{
input[i] = key_scan(); //读取按键值
if(input[i] != 0xff)
{
beep = 1; //蜂鸣器响一声
delay(10);
beep = 0;
i++;
lcd_show_string(0,1,input); //显示输入的密码
}
if(i == strlen(password)) //输入完成
{
if(strcmp(password,input) == 0) //比对密码
{
flag = 1; //开锁
lcd_show_string(0,0,"Unlock Success!");
relay = 1; //控制继电器开锁
delay(5000); //保持开锁5秒钟
relay = 0; //控制继电器关锁
lcd_write_command(0x01); //清屏
break;
}
else //密码错误
{
lcd_show_string(0,0,"Unlock Failed!");
delay(2000); //延时2秒钟
lcd_write_command(0x01); //清屏
break;
}
}
delay(10); //延时10毫秒
}
}
//主函数
void main()
{
lcd_init(); //LCD1602初始化
lcd_show_string(0,0,"Password Lock"); //显示密码锁提示
while(1)
{
if(key_scan() == '5') //按下第二行第三个按键
{
input_password(); //输入密码
}
if(flag) //已经开锁
{
flag = 0;
break;
}
}
}
```
3. 软件仿真
使用Proteus仿真软件,将上述硬件电路图和软件代码进行仿真,可以得到以下仿真图:
![51单片机密码锁仿真图](https://img-blog.csdnimg.cn/20211019182353322.png)
其中,左边是电路图,右边是仿真运行界面,可以看到LCD1602显示屏上显示了密码锁提示信息。按下第二行第三个按键进入输入密码状态,输入正确密码后,继电器会控制锁开启,5秒后自动关闭。
阅读全文