【51单片机】基于单片机的智能门禁系统设计



  资料下载:待更新。。。。


1、实现功能


安全性需求:安全性是门禁系统的首要需求。系统应当确保密码识别和IC卡认证的准确性,防止非法进入。
多模式认证需求:系统应当支持多种认证模式,包括密码识别和IC卡认证。用户可以通过预先录入的密码信息或者IC卡来进行快速准确的身份验证,提高系统的灵活性和适用性。
用户管理需求:门禁系统需要提供用户信息管理功能,包括密码信息和IC卡信息的录入、删除和修改。管理员应当有权限对用户信息进行管理,确保系统中的用户信息是准确完整的。
门禁控制需求:系统需要实现对门禁的控制。当身份验证通过时,系统应该能够通过舵机或其他电磁锁设备控制门的打开,确保合法用户可以顺利通过。

可增加的功能:

2、硬件

硬件框图

通过对需求展开分析,本设计基于单片机的门禁系统的架构设计如图2.1所示,本系统为实现基于单片机的智能门禁系统,通过单片机驱动各种输入输出设备,可以实现时间显示功能,读取IC卡和密码输入功能,增加和删除用户IC卡以及通过键盘修改密码,键盘修改时间等功能,其中最小系统为51单片机必带的电路,其中包括了晶振电路和复位电路这两个电路是51单片机运行稳定的保障。其次是4×4矩阵按键,这个作为用户的输入设备。可以用来设置密码,选择录入IC卡或删除IC卡以及修改时间等操作。其次是DS1302时钟电路,它可以精确走时,加上一块3.3V的电池可以实现掉电走时使门禁系统的时间显示准确。门禁电路则负责在输入正确的密码,或者刷添加过的用户IC卡后进行开门模拟的演示,Lcd1602显示电路是负责与用户进行交互的重要工具,可以实时显示系统时间,用户输入的密码,门锁的状态,以及再添加IC卡或删除IC卡时用以提示用户。
在这里插入图片描述

实物

3、代码

   代码采用C语言,软件是keil5,关键代码有中文注释,看不懂可以VX问我

//#include "stdio.h"
#include <reg52.h>
//头文件
#include "LCD1602.h"				//液晶显示
#include "Key_4x4.h"				//矩阵按键
#include "eeprom.h"					//Eeprom 掉电保存数据
#include "rc522.h"					//刷卡驱动程序
#include "DS1302.h"
int key;
u8 open_door_flag=0; 																	//开门标志位
u8 Password[6]={
    
    "000000"}, Password2[6]={
    
    "123456"}; 	//六位用户密码,管理员密码
u8 password_eeror=0,rc522_error;											//错误次数
u8 Input_cnt=0;																				//密码输入计数

sbit Relay=P3^2; 	//继电器
sbit Beep	=P2^4;	//蜂鸣器

unsigned char code Name[] 	 	= {
    
    "===Smart Lock==="};		//显示初始界面信息
unsigned char code Unlock[] 	= {
    
    " Please Unlock  "};		//显示初始界面信息
unsigned char code Input[]   	= {
    
    "input:          "};		//INPUT
unsigned char code Input1[]   = {
    
    "input1:         "};		//INPUT1
unsigned char code Input2[]   = {
    
    "input2:         "};		//INPUT2
unsigned char code DoorOpen[]	= {
    
    "    Door Open   "};		//OPEN
unsigned char code Error[]   	= {
    
    "      Error     "};  	//输入错误
unsigned char code UserShow1[]= {
    
    "  A     B    D  "};		
unsigned char code UserShow2[]= {
    
    "PaWd  RFID  Time"};
unsigned char code Change[]		= {
    
    "InputNewPassWord"};		//修改密码
unsigned char code Success[]	= {
    
    "    Success     "};		//成功
unsigned char code Failed[]		= {
    
    "     Failed     "};		//失败
unsigned char code ID[]				= {
    
    "ID:          		"};		//ID号

/********************************定时器初始化函数**************************************/
void timer1_init() //50ms
{
    
    
	TMOD |= 0X01;	 	//T0    
	TL0 = (65535-50000)%256;                //重装载值低位
	TH0 = (65535-50000)/256;                //重装载值高位
	ET0=1;
	TR0=1;
	EA=1;
}
/*********************************中断服务函数**************************************/
void  time0_int(void) interrupt 1  //50ms*20=1s中断一次
{
    
    
	char cnt=0;
	TL0 = (65535-50000)%256;                //重装载值低位
	TH0 = (65535-50000)/256;                //重装载值高位
	if(cnt++==19)
	{
    
    
		cnt=0;
	}
}


void Init_Show() //初始化显示
{
    
    
//	show_str(0X80,Name);
	show_str(0XC0,Unlock);
}
void beep_work(char n,int time)
{
    
    
	while(n--)
	{
    
    
		Beep=0;
		delay_ms(time);
		Beep=1;
		delay_ms(time);
	}
}
void open_door()  		//开门函数
{
    
    
	if(open_door_flag>0)   //ok,就开门
	{
    
    
		Relay=0;
		show_str(0XC0,DoorOpen);
		delay_ms(100);
		beep_work(1,200);
		delay_ms(1400);
		Relay=1;
		if(open_door_flag==1) //非管理员密码解锁,自动回复原始状态
		{
    
    
			open_door_flag=0;
		}
	}
}


void admin_show()			//用户管理界面显示
{
    
    
	show_str(0X80,UserShow1);
	show_str(0XC0,UserShow2);
}

u8 str1[16];

void time_set()
{
    
    
	char i;
	write_com(0x01);//清屏	
	for(i=0;i<14;i++)
	{
    
    
		str1[i]=' ';
	}
	i=0;
	while(key!='#')  //#退出
	{
    
    
		key=Key_Scan();
		if((key>=0)&&(key<=9)&&(i<14))
		{
    
    
			str1[i++]=key+0x30;
		}
		show_str(0X80,str1);
	}
	for(i=0;i<14;i++)
	{
    
    
		str1[i]=str1[i]-0x30;
	}
	Ds1302_Time_Set(
	str1[2]*10+str1[3],
	str1[4]*10+str1[5],
	str1[6]*10+str1[7],
	str1[8]*10+str1[9],
	str1[10]*10+str1[11],
	str1[12]*10+str1[13]
	);

	
}
     
SYSTEMTIME CurrentTime;          //时间日期类型
void time_show()
{
    
    
	
	GetTime(&CurrentTime);                   //获取时间/日期
//	str1[0]=CurrentTime.Month/10;
//	str1[1]=CurrentTime.Month/10;
//	str1[2]=CurrentTime.Month/10;
//	str1[3]=CurrentTime.Month/10;
//	str1[4]=CurrentTime.Month/10;
//	str1[5]=CurrentTime.Month/10;
//	str1[6]=CurrentTime.Month/10;
//	str1[7]=CurrentTime.Month/10;
//	str1[9]=CurrentTime.Month/10;
//	
//	str1[9]=CurrentTime.Month/10;
//	str1[10]=CurrentTime.Month/10;
//	str1[11]=CurrentTime.Month/10;
//	str1[12]=CurrentTime.Month/10;
//	str1[13]=CurrentTime.Month/10;
//	str1[14]=CurrentTime.Month/10;
	sprintf(str1,"%02d-%02d %02d:%02d:%02d",(int)CurrentTime.Month,(int)CurrentTime.Day, (int)CurrentTime.Hour, (int)CurrentTime.Minute, (int) CurrentTime.Second);
	show_str(0X80,str1);
}
void main()//主函数
{
    
    
	int iii;
	beep_work(1,100);
	lcd1602_init();   															//LCD1602初始化
	timer1_init();																	//定时器1初始化
	Init_Show();																		//初始显示
	read_str(FLASH_PASSWORD_SAVE_ADDR,&Password,6); //读取密码
	read_str(FLASH_ICcard_SAVE_ADDR,&ICCard_Name,IC_Card_Num*4); //读取IC卡
	PcdReset();																			//复位RC522
	PcdAntennaOn();																	//开启天线发射
	Init_DS1302();
	while(1)  //主循环
	{
    
    
		if(Input_cnt==0) //没有输入密码时
		{
    
    
			
			Init_Show();
			card_check();			//刷卡开门
		}
		password_cheak();		//密码开门
		open_door(); 				//开门状态判断
		if(iii++>10)
		{
    
    
			iii=0;
			time_show();
		}
		if(password_eeror>=3)		//密码输错三次锁定180s,并报警
		{
    
    
			show_str(0xc0,"                ");
			key=180;
			while(key--)
			{
    
    
				time_show();
				show_str(0xc3,"Wait:");
				write_date(key/100+0x30);
				write_date(key/10%10+0x30);
				write_date(key%10+0x30);
				beep_work(2,250);
			}
			Init_Show();			//初始显示
			password_eeror=2;
		}
		
		
		while(open_door_flag==2) //密码解锁,进入管理者模式 
		{
    
    
			key=Key_Scan();
			switch (key)
			{
    
    
				case'A' :password_admin();	break;						//密码管理
				case'B' :rc522_admin(); 		break;						//IC卡管理
				case'D' :time_set();   break;									//时间设置
				case'*' :open_door_flag=0;Init_Show();break;	//初始显示
				default :admin_show();		break;							//管理显示界面
			}
		}
	}
}







4、原理图/PCB

  原理图和PCB都使用立创EDA绘制,对新手较为友好。可以导出为AD格式的文件
在这里插入图片描述
在这里插入图片描述

5、论文

一为绪论,对基于单片机的门禁系统的研究背景和现状进行论述;二为总体设计,针对基于单片机的门禁系统的目标功能展开分析,并对相应的核心元件进行选择;三为硬件电路设计,对主控制电路,通信电路,显示电路等分别展开论述并绘制相应的电路图;四为软件设计,对密码检测,FRID识别,时间显示等各个软件模块的程序流程进行分析,并通过Visio绘制相应的流程图;五为系统调试,结合软件和硬件设计完成实物的制作,并对其关键功能进行测试,最后总结全文。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lihuadetongzhuo/article/details/146941509