基于51单片机密码锁—六位密码LCD1602显示

基于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设计资料

        资料获取请关注同名公众号,全部资料包括程序(含注释)、仿真源文件 、设计报告、流程图等。具体内容如下,全网最全! !

 

可以关注下方公众号!

点赞分享一起学习成长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值