基于单片机的门禁系统(C语言代码+Proteus仿真电路)


在这里插入图片描述

1. 背景与意义

   随着人们生活水平和安全意识的提高,对锁的要求也越来越高,既要安全可靠,又要便捷方便。随着智能化时代的到来,传统锁已不能满足人们的生活需求,于是电子密码锁由此产生。当前密码锁已经盛行,但在电路设计上的成本高昂,因此,我们价格便宜的芯片设计了一个密码锁控制系统。

2. 系统功能

   本系统设计是基于AT89C52单片机开发平台实现的门禁系统。AT89C52具有价格便宜,低电压、高性能 CMOS 8 位微处理器等优势,采用 AT89C52 单片机为控制核心,在相应的软件控制下可以完成要求的功能,主要实现功能包括矩阵按键控制实现密码输入、密码设置和密码初始化功能,8位数码管显示密码输入界面。具体而言,初始界面为密码输入界面,当输入密码正确, LED亮模拟开门,密码错误超过三次,蜂鸣器报警;通过按键将界面调整为密码设置界面,首先,需要输入初始密码,密码正确,界面跳转到输入新密码界面,反之,密码错误三次则蜂鸣器报警,持续3s,密码输入过程可以通过退出键退出,返回密码输入界面;其次,设置完成新密码,通过确认键保存密码,返回密码输入界面。本项目使用Keil5软件来实现程序的编写,编译之后生成hex文件。另外,我们通过Protues软件来模拟仿真我们的设计的系统,将生成的hex文件加载到AT89C52单片机中运行。
   系统主要由六个部分组成,即AT89C52主控芯片、显示模块、蜂鸣器报警模块、LED提示模块、AT24C02存储模块和矩阵按键模块组成。

3. 元件清单

 1)  7SEG-CA (8位共阳数码管)
 2)  AT89C52
 3)  RESPACK-8 (10k)
 4)  有源蜂鸣器
 5)  LED
 6)  CRYSTAL (12MHz)
 7)  电阻 *11(300欧、10k、1k)
 8)  电容 *2(20pf)
 9)  独立按键 *16
 10)  74HC138
 11)  74HC02
 12)  74HC573
 13)  AT24C02

4. 系统设计

   主要由主程序和密码存储模块、按键控制模块、显示模块、报警提示模块等子程序组成,其中主程序的功能是初始化系统的工作参数和循环调用各个功能模块子程序。软件设计构图如下:
在这里插入图片描述

 4.1 密码输入及更改功能

   如图4.1为4×4矩阵键盘的功能界面,正如图中所示,0~9为密码输入值,有密码设置、密码复位、退出和确认按键。图4.2为密码设置流程图,程序执行过程如下:当按下设置密码按键,进入到密码输入界面,密码验证标识符为C。此时,需要验证原始密码,当密码验证成功,进入新密码输入界面,新密码标识符为E,成功输入六位新密码后,按下确认键保存新密码,随即切换到初始密码输入界面,模拟界面如图4.3所示。

图4.1 矩阵键盘功能界面          图4.2 密码设置流程图

在这里插入图片描述

图4.3 密码设置仿真图

 4.2 报警及提示功能

   如图4.4为报警流程图,报警功能存在两个阶段。第一阶段,当在初始密码输入界面,输入密码错误三次,则启动报警,报警持续3秒,报警结束后退回到初始密码输入界面。第二阶段,进入设置界面,需要验证原始密码,输入密码错误三次同第一阶段出错情况一致,报警结束退回到密码验证界面。通过图4.5模拟启动报警。另外,在初始密码输入界面,当输入密码正确,则开门,通过如图4.6的LED变亮模拟。
在这里插入图片描述

图4.4 报警提示流程图


在这里插入图片描述

图4.5 报警模拟图


在这里插入图片描述

图4.6 LED模拟开门图

 4.3 密码保存及复位功能

  图4.7为密码保存流程图,进入密码设置界面,密码验证成功后,输入新密码,按下确认按键,则切换到初始密码输入界面,保存当前输入密码。将密码写入到AT24C02中保存,在下一次启动密码锁时自动读取上次存取密码,如图4.8为AT24C02模拟电路;当忘记设置密码时,可以通过矩阵键盘上的复位键将密码初始化。
在这里插入图片描述

图4.7 密码保存流程图

在这里插入图片描述

图4.8 存储模拟电路

5. 部分主代码

//基于AT89C52门禁系统
#include "include.h"
#include "common.h"
int menu_change=0;
void menu(int change)
 {
	switch(change)
	{
		case 0:dat[0]=dat[1]=11;break;
		case 1:dat[0]=13;dat[1]=10;break;
		case 2:dat[0]=10;dat[1]=12;break;
		default:break;
	}
	Key_disp();
 }
//********显示程序**********//
#include "display.h"
u8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xc6,0x86};
u8 dat[]={10,10,10,10,10,10,10,10};
void Display()
{
 static u8 disps;
	P2=P2&0x1f|0xe0;
	P0=0xff;
	P2&=0x1f;
	P2=P2&0x1f|0xc0;
	P0=1<<disps;
	P2&=0x1f;
	P2=P2&0x1f|0xe0;
	P0=table[dat[disps]];;
	P2&=0x1f;
	if(++disps==8)
		disps=0;	 
}

void menu(int change)
{
switch(change)
{
	case 0:dat[0]=dat[1]=11;break;
	case 1:dat[0]=13;dat[1]=10;break;
	case 2:dat[0]=10;dat[1]=12;break;
	default:break;
}
Key_disp();
}

//********按键功能程序**********//
#include "key.h"
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
u8 key_press,key_re,key_van;
u8 MiMa_init[]={6,5,4,3,2,1};
u8 i,Key,key_bit;
bit Key_R,QR_flag,SZ_flag,init_flag=0;
u8 Keydats[6];
u8 K;
extern int menu_change;
u8 Read_Key()
{
 P1=0xf0;
 if((P14==0)|(P15==0)|(P16==0)|(P17==0))	key_press++;
		 else          key_press=0;
 if(key_press==5)
 {
	 key_press=0;
	 key_re=1;
	 for(i=0;i<4;i++)
	 {
		 P1=0xff;
		 P1&=~(0x01<<i);
		 if(P14==0)         key_van=4*i+4;
		 else if(P15==0)    key_van=4*i+3;
		 else if(P16==0)    key_van=4*i+2;
		 else if(P17==0)    key_van=4*i+1;
	 }				 
 }				 
 P1=0xf0;
 if((key_re==1)&&(P14==1)&&(P15==1)&&(P16==1)&&(P17==1))
  {
	 key_re=0;
	 Key_R=1;
	 return key_van;
  }
 return 0xff;
}
void Key_Deal()
{
 if(Key_flag)
 {
	 Key_flag=0;
	 K=Read_Key();
 }
 switch(K)
 {
	 case 1:Key=0;key_bit++;break;
	 case 2:Key=1;key_bit++;break;
	 case 3:Key=2;key_bit++;break;
	 case 4:Key=3;key_bit++;break;
	 case 5:Key=4;key_bit++;break;
	 case 6:Key=5;key_bit++;break;
	 case 7:Key=6;key_bit++;break;
	 case 8:Key=7;key_bit++;break;
	 case 9:Key=8;key_bit++;break;
	 case 10:Key=9;key_bit++;break;
	 case 11:Key=10;key_bit+=0;break;
	 case 12:Key=11;key_bit+=0;break;
	 case 13:Key=12;key_bit+=0;break;
	 case 14:Key=13;key_bit+=0;break;
	 case 15:Key=14;key_bit+=0;break;
	 case 16:Key=15;key_bit+=0;break;		 
 }
 K=0xff;
}

void Key_Stor()
{
 if((Key_R)&&(Key<10))
 {
		Keydats[key_bit-1]=Key;
 }
 if(key_bit>=6) key_bit=6;
 if(key_bit<0)  key_bit=0;
}

void Key_temp()
{
 if(Key_R)
 {
	 Key_R=0;
	 if((Key==14)&&(key_bit==6)) //确认
	 {
			 QR_flag=1;
	 }
	 if((Key==10)&&(key_bit==0)) // 设置
	 {
			 SZ_flag=1;menu_change=2;
	 }
	 if((Key==15)&&(SZ_flag))  //退出
	 {
			SZ_flag=0;key_bit=0;
			menu_change=0; 
	 }
	 if((Key==11)&&(key_bit==0))//复位
	 {
		 for(i=0;i<6;i++)
			{
			 Write_At24c02(i,MiMa_init[i]);
			 Delay10ms();
			} 
	 }
 }
}

 void main()
 {
	 u8 i;
	 Timer0_init();
	 Buzz=0;LED=0;
	 for(i=0;i<6;i++)
		{
			Write_At24c02(i,MiMa_init[i]);
			Delay10ms();
		}
	 while(1)
	 {			
		Key_Deal();
		Key_Stor();
		Key_temp();		 
		SZ_disp();
		MiMa_Deal();
		NEW_MiMa();
		menu(menu_change);
		Display();
	 }
 }

6. 基于单片机门禁系统C语言程序和仿真自取

  代码自取完整C语言代码文件
  仿真Proteus仿真

7. 相关作品

  请关注专栏:毕业设计作品

🤞🤞🤞

创作不易,请伸出您发财的小手,打赏下博主,谢谢。

🤞🤞🤞

  • 26
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空旅行者 陈俊松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值