单片机课程设计--电子密码锁(源代码+proteus仿真)

目录

器件选择

电路图 

代码 

1、LCD显示功能

1)LCD端口

2)字模的定义

3)提示符的显示

4)输入密码/重置密码时密码行的显示

2、总控制

1)主函数

2)key函数---判断用户想要进行的操作

3)display函数功能---接收用户输入数据并调用相应函数进行操作

4)判断密码正误

5)重置密码

6)in_code函数---将后一个数组内容复制到前一个数组中

程序运行效果

1、启动

2、输入密码时的显示

3、重置密码时的显示

4、其他提示符的显示

1)密码输入正确提示符

 2)密码输入错误提示符

 3)密码错误三次时的提示符


本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。

器件选择

序号

器件编号

Proteus器件名称

器件性质

参数及说明

1

U1

AT89C51

单片机

12MHz

2

D1-D2

LED

发光二极管

red,green

3

R1-R2

RES

电阻

470欧

4

LCD1

LMO16L

液晶显示屏

/

5

K0-K9,KA,KB

BUTTON

按钮开关

置数

电路图 

代码 

1、LCD显示功能

1)LCD端口

/*LCD端口定义*/
sbit RS=P2^0;
sbit RW=P2^1;
sbit  E=P2^2;

2)字模的定义


/*字模的定义*/ 

uchar  code string1[]={"input code"};//输入密码字符显示	

uchar  code string2[]={"INCORRET"};//提示密码错误
uchar  code string3[]={"TRY AGAIN"};//输入密码字符显示

uchar  code string4[]={"CORRET"};//密码正确提示
uchar  code string5[]={"UNLOCK"};

uchar  code string6[]={"ERROR THREE TIMES"};//密码错误三次提示
uchar  code string7[]={"LOCK ---"};//密码正确提示

uchar  code string8[]={"input new code"};//提示输入新密码
uchar  code string9[]={"SUCCESS!"};//提示输入新密码
  
/*坐标*/
uchar data table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};

3)提示符的显示

/*输出提示字符*/

/*input code*/
void ic(uchar m)
{
	for(m=0;m<sizeof(string1);m++)
    	lcd_write(m+3,0,string1[m]);	
}

/*密码正确提示*/
void correct(uchar m)
{ 
	for(m=0;m<sizeof(string4);m++)
    {	lcd_write(m+5,0,string4[m]);
	}
	for(m=0;m<sizeof(string5);m++)
    {	lcd_write(0,m+5,string5[m]);
	}
	delay(1000);
	initialize();
	lcd_wcom(0x01);  //清显示,光标复位到地址00H位置 
						
}

/*密码错误提示*/
void incorrect(uchar m)
{
	for(m=0;m<sizeof(string2);m++)
    {	lcd_write(m+4,0,string2[m]);
	}
	for(m=0;m<sizeof(string3);m++)
    {	lcd_write(0,m+3,string3[m]);
	}	
	delay(500);
	lcd_init();  //清显示,光标复位到地址00H位置
	initialize();         			
}

/*密码错误三次提醒*/
void three(uchar m)
{	
	uint i;	
	for(i=0;i<6;i++)
	{
	for(m=0;m<sizeof(string6);m++)
    {	lcd_write(m,0,string6[m]);
	}
	for(m=0;m<sizeof(string7);m++)
    {	lcd_write(0,m+1,string7[m]);
	}		
	
		delay(500);
		lcd_write(0,10,table[5-i]);
		lcd_write(0,11,'s');
	}
	lcd_init();  //清显示,光标复位到地址00H位置
	initialize();	
	

} 	
/*输入新密码提示*/
void new_code(uchar m)
{
	for(m=0;m<sizeof(string8);m++)
    	lcd_write(m+1,0,string8[m]);		
}

/*成功提示*/
void new_su(uchar m)
{
	for(m=0;m<sizeof(string9);m++)
    	lcd_write(m+5,0,string9[m]);
		
	delay(1000);
	lcd_init();  //清显示,光标复位到地址00H位置
	initialize();			
}
/*输出input code*/
void string_show(uchar choice)
{
	uchar m;
	lcd_init();
	switch(choice)
	{
		case 1:ic(m);break;//输入提示
		case 2:correct(m);break;//正确提示
		case 3:incorrect(m);break;//错误提示
		case 4:three(m);break;//错误三次提示
		case 5:new_code(m);break;//输入新密码提示
		case 6:new_su(m);break;//重置密码成功
		default:break;
	}

}

4)输入密码/重置密码时密码行的显示

/*显示密码初始位及用户进行输入时的状态*/
uchar data nnumin[]={"- - - -"};
uchar code nnum[]={"- - - -"};
uchar code numshow[]={"* * * *"};

/*初始化初始状态显示数组*/
void initialize()
{
	uint i;
	for(i=0;i<sizeof(nnum);i++)
	{	nnumin[i]=nnum[i];
	}
}

/*用户输入密码时的显示*/
void input(uchar num) 
{   
   	uchar n,i;
	for(n=0;n<8;n++)
	{
		if(sizeof(num)!=0)
		{
			if(num!=0)
			{			
				for(i=0;i<num;i++)
				{
					nnumin[2*i]=numshow[2*i];
				}
			}
			else initialize();//输入密码时按下A/B按钮,则重新开始
		}
		lcd_write(0,n+5,nnumin[n]);		
	} 
}

/*用户重置密码时显示*/
void reset_code(uint c,uchar *num)
{
	uchar n,i;
	for(n=0;n<8;n++)
	{
		if(c!=0)
		{
			for(i=0;i<sizeof(num)+1;i++)
			{
				if(num[i]!='-')
				nnumin[2*i]=table[num[i]]; 
					
			}	
		}
		lcd_write(0,n+5,nnumin[n]);
		
	}
}

2、总控制

负责完成实现电子密码锁的重置密码,判断密码正误等功能。

1)主函数

void main()
{ 	
    lcd_init();  //初始化lcd
	lcd_wcom(0x40); //设定CGRAM地址 
	
	LEDR=1;
	LEDG=1;
	while(1)
	{		
		key();//判断用户想要进行的操作(开锁or重置密码)
		if(keyin==1)
		{	
			display();									
		}	
	}
}

2)key函数---判断用户想要进行的操作

bit keyin=0;//输入状态
bit keyre=0;//判断是否为重置密码状态

/*判断按键的内容*/
void key()
{
	num=KeyPro();
	if(num=='A')
	{
		keyin=~keyin;
		LEDR=0;
	}
	if(num=='B') 
	{
		keyre=~keyre;
		//重置密码之前需先解锁
		display();
		reset();
	} 
}

3)display函数功能---接收用户输入数据并调用相应函数进行操作

密码行初始状态为“----”,输入的密码位会显示为“*”,用户完全输入4位密码后会判断密码正误并根据具体情况输出相应提示符,同时亮相应颜色LED灯。

若用户在输入密码中途触发按钮“A”或“B”则之前输入的密码会清空,密码行状态重置为“----”。

uchar data scode[]={0,0,0,0};//设置的密码,初始为0000
uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000
uchar data ncode2[]={9,9,9,9};//储存用户输入的内容

bit keyin=0;//输入状态
bit keyre=0;//判断是否为重置密码状态

uint inc=1;//判断是否出现连续三次的错误

/*输入密码,若判断为正确则解锁,
为错误则跳转界面重新输入*/
void  display()
{
	uint count=1;
	string_show(1);
	input(0);
	while(count<5)//输入四位密码后验证并跳转
	{	num=KeyPro();
		if(num!=0xff)
		{
			if(num>=0&&num<=9)
			{
				ncode2[count-1]=num;	
				input(count);	
				count++;
			}
			else//若在输入途中点击按钮A或B,则清零重新输入
			{
				memset(ncode2,'-',sizeof(ncode2));//ncode2重置
				count=1;
				input(0);
			    
			}
						
		}
			
   }
   //判断后输出提示
   if(confirm())
   {	LEDG=0;
   		string_show(2); 
		if(keyre!=1) 	keyin=0;//LCD停止显示			
		inc=1;
		//红灯亮,绿灯灭
		LEDG=1;
		LEDR=0;
   }
   else 
   {	LEDR=0;
   		if(inc<3)
		{
   			string_show(3);
   			
			inc++; 
		}
		else
		{	//错误三次后设置密码失效,锁定5秒
			in_code(scode,ncode);//将密码初始化为最初状态
			string_show(4);
			inc=1;			
		}
		count=1;	
   }
} 

4)判断密码正误

uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000
uchar data ncode2[]={9,9,9,9};//储存用户输入的内容

bit check;//判断输入密码是否正确

/*验证密码,按钮A功能*/
uchar confirm(void)
{
	uint i,j;

	LEDR=1;
	LEDG=1;
	for(i=0;i<4;i++)
	{
		j=i;
		if(ncode[i]==ncode2[j])
		{
			check=1;
		}
		else
		{	
			check=0;
			break;							    
		}
	}
	memset(ncode2,'-',sizeof(ncode2));
	return check;		
}

5)重置密码

uchar data ncode2[]={9,9,9,9};//储存用户输入的内容

bit keyre=0;//判断是否为重置密码状态

/*重置密码*/
void  reset()
{
	uint count=1,cc;			
	string_show(5);
	reset_code(0,ncode2);	
	while(count<6)
	{	num=KeyPro();
		if(num!=0xff)
		{	
			if(num>=0&&num<=9)
			{
				ncode2[count-1]=num;	
				reset_code(1,ncode2);	
				count++;
				cc=1;
			}
			else//若在输入途中点击按钮A或B,则停止
			{	
				cc=0;
				count=6;  
				break;
			}					
		}
	}
	//若成功输入四位密码,则成功修改密码
	if(cc==1)
	{
		in_code(ncode,ncode2);
	}
	string_show(6);	
	keyre=0;		
}

6)in_code函数---将后一个数组内容复制到前一个数组中

void in_code(uchar *cc,uchar *cc1)
{
	uint i,j;
	for(i=0;i<4;i++)
	{
	 	j=i;
		cc[i]=cc1[i];
	}
}

程序运行效果

1、启动

 2、输入密码时的显示

3、重置密码时的显示

 

4、其他提示符的显示

1)密码输入正确提示符

 2)密码输入错误提示符

 3)密码错误三次时的提示符

版权声明:本文为CSDN博主「赫卡忒与蝙蝠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mylxcg/article/details/120252501

生成海报
点赞 0

赫卡忒与蝙蝠

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

基于8051单片机实现电子时钟+数字秒表设计

概述 电子时钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许

Proteus STM32仿真学习板

一 全球IC爆冷,价格猛涨,ST系列单片机更是一马当先,贵到你怀疑人生。这个时候想学习STM32的基础去购买开发板是很不划算的,而且用完就搁置了,吃灰到永远,