基于51单片机密码锁设计
(仿真+程序+设计报告)
功能介绍
具体功能:
1.密码为六位数字,有键按下,LCD1602就会显示出字符 “*”;
2.当用户键入正确密码后,再按确认键,便会开锁;
3.数字与数字之间输入的间隔时间为最长30秒;
4.当用户键入错误密码时,系统就会报警,由扬声器发出报警声,连续三次错误就会被锁定;
演示视频:
基于51单片机密码锁—六位密码LCD1602显示
添加图片注释,不超过 140 字(可选)
程序
/*******************************
*
* 液晶字符显示函数
*
********************************************/
#include <AT89X52.h>
#include "液晶.h"
#include "function.h"
#include "fun_char.h"
#define uchar unsigned char
#define uint unsigned int
extern uchar mydata[6];
extern uchar testdata[6];
uchar code errorchar[]="PASSWORDERROR";
uchar code differentchar[]="it'sdifferent";
uchar code againchar[]="INPUTAGAIN!";
uchar code okchar[]="PASSWORDOK!";
uchar code lockchar[]="KEYISLOCK";
uchar code resetchar[]="NEWPASSWORD";
uchar code initchar[]="INPUTPASSWORD";
/*******************************************
*函数名称:delayms( ) 延时函数
*函数作用:
延时时间 t ms
*********************************************/
void delayms(uint t)//
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<110;j++);
}
/*******************************************
*函数名称:init_char( ) 初始化字符显示
*函数作用:
系统启动后,初始化字符显示,并读取密码值
*********************************************/
void init_char() reentrant
{
uchar i;
lcd_wcmd(0x01);//首先要清屏
delayms(10);
for(i=0;i<6;i++)
{
mydata[i]=0;
}
/*
// 非常重要。。。。忘记密码,打开这个地方,系统会重新设置初始密码。。012345
for(i=0;i<6;i++) // 这个部分是向存储器中写密码的,也就是如果你忘记密码了,可以通过这个地方写入新的密码
{
testdata[i]=i;//初始密码为012345
}
delayms(10);
ISendStr(AT24C02,0, &testdata[0],6); //读取 默认密码已经保存了,全为000,000
delayms(10);
for(i=0;i<6;i++)
{
testdata[i]=0;//初始密码为,012345
}
*/
//初始化字符
for(i=0;i<13;i++)
{
if(i<5)
{
lcd_pos(i+2);
}
else
{
lcd_pos(i+3);
}
lcd_wdat(*(initchar+i));
}
//INPUT PASSWORD
delayms(10);
IRcvStr(AT24C02,0, &testdata[0],6); //读取 默认密码已经保存了,全为000,000
delayms(10);
}
/*******************************************
*函数名称:error_char( ) 错误提示字符显示
*函数作用:
当输入的密码与存储器中的密码不一致时,提示报错
********************************************/
void error_char()
{
uchar i=0;
lcd_wcmd(0x01);//首先要清屏
delayms(100);
for(i=0;i<13;i++)
{
if(i<8)
{
lcd_pos(i+1);
}
else
{
lcd_pos(i+2);
}
lcd_wdat(*(errorchar+i));
}
}
/*******************************************
*函数名称:different_char( ) 密码不同提示字符显示
*函数作用:
当设置密码时,如果两次输入的通过,则提示输入
字符不同
*********************************************/
void different_char()
{
uchar i=0;
lcd_wcmd(0x01);//首先要清屏
delayms(100);
for(i=0;i<13;i++)
{
if(i<4)
{
lcd_pos(i+1);
}
else
{
lcd_pos(i+2);
}
lcd_wdat(*(differentchar+i));
}
}
/*******************************************
*函数名称:again_char( ) 再次输入密码
*函数作用:
当设置密码时,第一次输入密码后,提示再次输入密码
*********************************************/
void again_char()
{
uchar i=0;
lcd_wcmd(0x01);//首先要清屏
delayms(100);
for(i=0;i<11;i++)
{
if(i<5)
{
lcd_pos(i+2);
}
else
{
lcd_pos(i+3);
}
lcd_wdat(*(againchar+i));
}
}
/*******************************************
*函数名称:ok_char( ) 输入密码正确提示函数
*函数作用:
输入密码正确,提示PASSWORD OK
*********************************************/
void ok_char()
{
uchar i=0;
lcd_wcmd(0x01);//首先要清屏
delayms(100);
for(i=0;i<11;i++)
{
if(i<8)
{
lcd_pos(i+2);
}
else
{
lcd_pos(i+3);
}
lcd_wdat(*(okchar+i));
}
}
/*******************************************
*函数名称:lock_char( ) 系统锁定提示字符
*函数作用:
当输入密码错误次数达到3次时,开始锁键盘
*********************************************/
void lock_char()
{
uchar i=0;
lcd_wcmd(0x01);//首先要清屏
delayms(100);
for(i=0;i<9;i++)
{
if(i<3)
{
lcd_pos(i+3);
}
else if(i<5)
{
lcd_pos(i+4);
}
else
{
lcd_pos(i+5);
}
lcd_wdat(*(lockchar+i));
}
}
/*******************************************
*函数名称:reset_char( ) 设定新的密码
*函数作用:
当设定新的密码时,提示NEW PASSWORD
*********************************************/
void reset_char()
{
uchar i=0;
lcd_wcmd(0x01);//首先要清屏
delayms(100);
for(i=0;i<11;i++)//这里出现了问题的
{
if(i<3)
{
lcd_pos(i+2);
}
else
{
lcd_pos(i+3);
}
lcd_wdat(*(resetchar+i));
}
}
硬件设计
使用元器件:
单片机:AT89C52;
(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)
添加图片注释,不超过 140 字(可选)
流程图:
设计资料
01仿真图
本设计使用proteus7.8和proteus8.9两个版本设计!具体如图!
添加图片注释,不超过 140 字(可选)
02程序
本设计使用Keil5版本编程设计!具体如图!
添加图片注释,不超过 140 字(可选)
03设计报告
五千字设计报告,具体如下!
添加图片注释,不超过 140 字(可选)
04设计资料
资料获取请关注同名公众号,全部资料包括程序(含注释)、仿真源文件 、设计报告、流程图等。具体内容如下,全网最全! !
可以关注下方公众号!
点赞分享一起学习成长。