免费分享-基于51单片机的密码锁LCD12864显示仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

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<reg51.h>
#include<12864.h>
#include<keypad.h>
#include<24C01.h>

#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^5;
sbit LED2=P1^6;
sbit INIT=P2^2;
sbit SOUND=P1^7;

uchar idata key[6]={0,0,0,0,0,0};
uchar idata iic[6]={0,1,2,3,4,5};

void press(uchar *s)
{
 	   uchar dat;
//**************************************************
       P3=0xf0;								//保存第一位密码 
	   while(P3==0xf0);
       dat=key_scan();
	   if((dat!=0x0a)&&(dat!=0x0b))
         {   *s=dat;
			 Left();
			 star_12864(star,0x05,16);
	     }
	   s++;	 	 
//**************************************************
	   P3=0xf0;							  //保存第二位密码 
	   while(P3==0xf0);						 
       dat=key_scan(); 
	   if((dat!=0x0a)&&(dat!=0x0b))
         {   *s=dat;
			 Left();
			 star_12864(star,0x05,24);
		  }
	   s++;	
//**************************************************
	   P3=0xf0;							  //保存第三位密码 
	   while(P3==0xf0);						 
       dat=key_scan();
	   if((dat!=0x0a)&&(dat!=0x0b))
         {   *s=dat;
			 Left();
			 star_12864(star,0x05,32);
		  }
	   s++;	
//**************************************************
	   P3=0xf0;							  //保存第四位密码 
	   while(P3==0xf0);						 
	   dat=key_scan();
	   if((dat!=0x0a)&&(dat!=0x0b))
         {   *s=dat;
			 Left();
			 star_12864(star,0x05,40);
		  }
	   s++;	
//**************************************************
	   P3=0xf0;							  //保存第五位密码 
	   while(P3==0xf0);						 
       dat=key_scan();
	   if((dat!=0x0a)&&(dat!=0x0b))
         {   *s=dat;
			 Left();
			 star_12864(star,0x05,48);
		  }
	   s++;	
//**************************************************
	   P3=0xf0;							  //保存第六位密码 
	   while(P3==0xf0);						 
       dat=key_scan();
	   if((dat!=0x0a)&&(dat!=0x0b))
         {   *s=dat;
			 Left();
			 star_12864(star,0x05,56);
		  }
//**************************************************
	   do{P3=0xf0;							//键入Enter键盘继续执行下面语句,否则等待 
	      while(P3==0xf0);						 
          dat=key_scan();
	      }while(dat!=0x0b);
}

void Delay10ms(void)	   //延时10ms 
{
	uint i,j,k;
	for(i=5;i>0;i--)
	for(j=4;j>0;j--)
	for(k=248;k>0;k--);

}

void main()
{
      uchar dat;
      uchar i=0,j=0,k;
      uchar x;
	  LED1=1;
	  LED2=1;
	  SOUND=0;
	  INIT=1;
      if(INIT==0)		   //密码初始化 
      {
	     x=SendB(iic,0x50,6);
		 Delay10ms();
      }  	   //首先从IIC器件中读出密码以供下面输入密码进行比较 
      x=ReadB(iic,0x50,6);
      Init_12864();
	  for(i=0;i<150;i++){Delay10ms();}
//**********************************若密码不正确,循环执行do{}while()********************************************
do{
	     LED1=1;
	     System();		  //显示:"请输入密码"字幕  
	     press(key);
		 if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3])&&(key[4]==iic[4])&&(key[5]==iic[5])) //密码比较,若密码正确责进入系统,若密码不正确则显示密码错误,重新输入密码
         {
		    true();
		    do
		    {
		       P3=0xf0;							//键入1或2继续执行下面语句,否则等待 
	           while(P3==0xf0);						 
               dat=key_scan();
	         }while(dat!=0x01&&dat!=0x02);
		    if(dat==1)						       //开锁 
		    {
		        LED1=0;
				unlock();
			    for(i=0;i<100;i++){Delay10ms();}
	            continue;
		     }
		    if(dat==2)							//修改密码 
		   {
		       do{
		              System(); 
			          press(key);
			          again();
			          press(iic);
				      if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3])&&(key[4]==iic[4])&&(key[5]==iic[5]))
				      {
				          succeed();				//修改密码成功 
						  for(i=0;i<100;i++){Delay10ms();}
			              Delay10ms();
	                      x=SendB(iic,0x50,6);
			              Delay10ms();	
                          x=ReadB(iic,0x50,6);break;
				       }
				      else 			    //修改密码不成功,重新修改 
					  {
					      repeat();
						  for(i=0;i<100;i++){Delay10ms();}
					   }
				  }while(1);   
		    }
		 
		 }
		else 									  //密码不正确,重新输入密码 
		{
		    j++;
			if(j==3)
			{
			   for(i=0;i<8;i++)
			   {
			      LED2=0;
				  for(k=0;k<5;k++){Delay10ms();}
				  LED2=1;
				  for(k=0;k<5;k++){Delay10ms();}
				}
				j=0;
			 }
			error();
			for(i=0;i<50;i++){Delay10ms();}
		 }
}while(1);  	
      
	  	  
	   
}

设计文件:

链接:https://pan.baidu.com/s/1QUgIktGXwaEC2Yjw8qbfMA?pwd=8f78

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值