基于51单片机的密码锁仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。

AT89C52的主要特点如下:

内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。

RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。

外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。

通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。

定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0

串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。

低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。

宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。

主程序:

#include <reg52.h>
#include "delay_ms.h"
#include  "矩阵键盘.h"
#include "i2c.h"
#include "1602.h"
#include "delay_ms.h"
#include "mima.h"
#define uchar unsigned char
#define uint unsigned int
#define A 0x0a //输入密码
#define B 0x0b  //修改密码
#define D 0x0d //关锁
#define enter 0x0c //确认
#define backspace 0x0f //退格键
sbit baojing = P3^7; //蜂鸣器接口
sbit lock = P3^3;//锁信号
sbit set = P3^2;
uchar idata mima_5[6] = {1,2,3,4,5,6}; //初始密码
uchar flag_change; 
uchar aa;//存放密码错误的次数,够三次报警
uchar bb;
uchar flag_t0;
void baoj1()//报警函数
{
	int i;
	for(i = 0;i < 5; i++)
	{
		baojing = 1;
		delay_ms(5);
		baojing = 0;
		delay_ms(5);	
	}

}
void baoj()
{
	uchar i;
	for(i = 0; i < 10; i++)
		baoj1();
}
/*密码处理函数*/
void mimachuli() 
{
	uchar key,i;
	uchar idata mima_1[6]={' ',' ',' ',' ',' ',' '};//存放密码缓冲区
	uchar idata mima_2[6]={' ',' ',' ',' ',' ',' '};
	uchar idata mima_3[6]={' ',' ',' ',' ',' ',' '};

	key = step_choose();
	if(key == A)//A被按下,接收输入密码,处理
	{
		read_n_add(mima_1,0x00,6);
		write_com(0x06);//写一个字符后地址指针加 1 
		write_com(0x01);//显示清零,数据指针清零
		write_com(0x0f);//显示光标
		lcd_pos(0,0);
		write_n_char(" press password ");		
	
		if(input_mima(mima_2)) //处理输入密码
		{
			if(mimaduibi(mima_2,mima_1)) //密码正确
			{
				lcd_pos(0,0);
				write_com(0x0c);
	        	write_com(0x06);//写一个字符后地址指针加 1 
	         	write_com(0x01);//显示清零,数据指针清零
				write_n_char(" password right ");
				aa = 0; //清除密码错误次数
				lock = 0; //开锁
				baojing = 1; //响一下
				delay_ms(1000);
				baojing = 0;
				TR0 = 1;
				flag_t0 = 1;
				while(key != D && flag_t0) //D没按下一直开
				{			
					key = keyscan();
				}
				TR0 = 0;
				lock = 1;//D按下了关锁
			}
			else //密码 不正确
			{
				lcd_pos(0,0);
				write_com(0x0c); //关光标
				write_com(0x06);//写一个字符后地址指针加 1 
				write_com(0x01);//显示清零,数据指针清零
				write_n_char(" password wrong");
				delay_ms(1000);
				aa++;
				if(aa == 4)
				{
					aa = 0;
			    	i = 20; //密码不正确报警
					while(i--)
					 baoj();
				}

			}
		}
		else //密码没有输入正确或完成
		{
			lcd_pos(0,0);
			write_com(0x0c); //关光标
	   	write_com(0x06);//写一个字符后地址指针加 1 
		   write_com(0x01);//显示清零,数据指针清零
			write_n_char(" password wrong");
			delay_ms(1000);
			aa++;
			if(aa == 4)
			{
				aa = 0;
		    	i = 20; //密码不正确报警
				while(i--)
				 baoj();
			}

		}
	}

	if(key == B)//B被按下,修改密码
	{
		read_n_add(mima_1,0x00,6);
		write_com(0x06);//写一个字符后地址指针加 1 
		write_com(0x01);//显示清零,数据指针清零
		write_com(0x0f);//显示光标
		lcd_pos(0,0);
		write_n_char(" input password");		
		write_com(0x0f);//显示光标	
		if(input_mima(mima_2)) //处理输入密码
		{
			if(mimaduibi(mima_2,mima_1)) //密码正确
			{
				lcd_pos(0,0);
				write_com(0x0c);
	      	write_com(0x06);//写一个字符后地址指针加 1 
	      	write_com(0x01);//显示清零,数据指针清零
				write_n_char("password right ");
				aa = 0; //清除密码错误次数
				delay_ms(1500);
				flag_change = 1;
				while(flag_change) //下面开始修改密码
				{
					write_com(0x06);//写一个字符后地址指针加 1 
					write_com(0x01);//显示清零,数据指针清零
					write_com(0x0f);//显示光标
					lcd_pos(0,0);
					write_n_char("In new password");
					delay_ms(1500);
					if(input_mima(mima_2)) //处理输入密码
					{

						lcd_pos(0,0);
						write_com(0x0c);
			         write_com(0x06);//写一个字符后地址指针加 1 
			         write_com(0x01);//显示清零,数据指针清零
						write_n_char("Input new pass"); //确定新密码
						lcd_pos(1,0);
						write_n_char("word again");
						delay_ms(2000);
						lcd_pos(0,0);
						write_com(0x0f);//显示光标
			         write_com(0x06);//写一个字符后地址指针加 1 
			         write_com(0x01);//显示清零,数据指针清零
						write_n_char("In new password");						
							if(input_mima(mima_3)) //处理输入密码
							{
								if(mimaduibi(mima_2,mima_3)) //密码正确
								{
									lcd_pos(0,0);
									write_com(0x0c);
						      	write_com(0x06);//写一个字符后地址指针加 1 
						      	write_com(0x01);//显示清零,数据指针清零
									write_n_char("password has");
									lcd_pos(1,0);
									write_n_char("change already");
									write_n_add(mima_3,0x00,6); //把修改的密码存进24C02
									delay_ms(2000);
									flag_change = 0;
								}
								else //密码 不正确
								{
									lcd_pos(0,0);
									write_com(0x0c); //关光标
									write_com(0x06);//写一个字符后地址指针加 1 
									write_com(0x01);//显示清零,数据指针清零
									write_n_char("password wrong");
									delay_ms(1000);
									aa++;
									if(aa == 4)
									{
										aa = 0;
								    	i = 20; //3次输入密码不正确报警
										while(i--)
										 baoj();
									}
									flag_change = 0;
								}
							}
							else //密码没有输入正确或完成
							{
								lcd_pos(0,0);
								write_com(0x0c); //关光标
						   	write_com(0x06);//写一个字符后地址指针加 1 
							   write_com(0x01);//显示清零,数据指针清零
								write_n_char(" password wrong");
								delay_ms(1000);
								aa++;
								if(aa == 4)
								{
									aa = 0;
							    	i = 20; //3次输入密码不正确报警
									while(i--)
									 baoj();
								}
							}
						
					}
					else //密码没有输入正确或完成
					{
						lcd_pos(0,0);
						write_com(0x0c); //关光标
				   	write_com(0x06);//写一个字符后地址指针加 1 
					   write_com(0x01);//显示清零,数据指针清零
						write_n_char("password wrong");
						delay_ms(1000);
						flag_change = 0;
						aa++;
						if(aa == 4)
						{
							aa = 0;
					    	i = 20; //3次输入密码不正确报警
							while(i--)
							 baoj();
						}
					}
									
				}
			}
			else //密码 不正确
			{
				lcd_pos(0,0);
				write_com(0x0c); //关光标
				write_com(0x06);//写一个字符后地址指针加 1 
				write_com(0x01);//显示清零,数据指针清零
				write_n_char("password wrong");
				delay_ms(1000);
				aa++;
				if(aa == 4)
				{
					aa = 0;
			    	i = 20; //3次输入密码不正确报警
					while(i--)
					 baoj();
				}
			}
		}
		else //密码没有输入正确或完成
		{
			lcd_pos(0,0);
			write_com(0x0c); //关光标
	   	write_com(0x06);//写一个字符后地址指针加 1 
		   write_com(0x01);//显示清零,数据指针清零
			write_n_char("password wrong");
			delay_ms(1000);
			aa++;
			if(aa == 4)
			{
				aa = 0;
		    	i = 20; //3次输入密码不正确报警
				while(i--)
				 baoj();
			}
		}		
	}

}
 /*外部中断函数,恢复出厂设置,长按set键恢复*/

void int0() interrupt 0
{
	delay_ms(2000);
	if(!set)
	{
		lcd_pos(0,0);
		write_com(0x0c); //关光标
	   write_com(0x06);//写一个字符后地址指针加 1 
		write_com(0x01);//显示清零,数据指针清零
		i2cinit();//24C02总线初始化
		write_n_add(mima_5,0x00,6);
		write_n_char("password renew");
		lcd_pos(1,0);
		write_n_char("already");
		delay_ms(1000);
		lcd_pos(0,0);
		write_com(0x0c); //关光标
	   write_com(0x06);//写一个字符后地址指针加 1 
		write_com(0x01);//显示清零,数据指针清零
		write_n_char("Input password");
		lcd_pos(1,0);
		write_n_char("Press key A");

	}// 引起了三个警告
}

void timer0() interrupt 1 //定时器0中断,50ms定时
{
	TH0 = 0x4c;//50ms定时
	TL0 = 0x00;
	bb++;
	if(bb == 200)//10秒时间到
	{
		bb = 0;
		flag_t0 = 0;
	}

}
void main()
{
	yjinit();//液晶初始化
	i2cinit();//24C02总线初始化
	baojing = 0;
	lock = 1; //关锁
	TMOD = 0x01;//选择定时器0方式1
	EA = 1;//打开总中断
	ET0 = 1;//打开定时器0中断
	EX0 = 1; //打开外部中断0
	IT0 = 1;//下降沿触发
	TR0 = 0;//关闭定时器
	TH0 = 0x4c;//50ms装初值
	TL0 = 0x00;
	while(1)
	{
	  mimachuli(); 

	}
}




设计文件:
链接:https://pan.baidu.com/s/1waBaqb8k8zn6FNc9tk3VzA?pwd=a9d0

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值