【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问我

c 复制代码
//#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绘制相应的流程图;五为系统调试,结合软件和硬件设计完成实物的制作,并对其关键功能进行测试,最后总结全文。

相关推荐
可待电子单片机设计定制(论文)5 小时前
【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)
stm32·单片机·嵌入式硬件
不可思议迷宫6 小时前
Verilog编程实现一个分秒计数器
单片机·嵌入式硬件·fpga开发
life_yangzi8 小时前
关于单片机IAP升级的那点事儿|智能设置中断向量表
单片机·嵌入式硬件
了一li10 小时前
STM32实现一个简单电灯
stm32·单片机·嵌入式硬件
可待电子单片机设计定制(论文)12 小时前
【STM32设计】数控直流稳压电源的设计与实现(实物+资料+论文)
stm32·嵌入式硬件·mongodb
march_birds13 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
触角0101000115 小时前
STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步
驱动开发·stm32·单片机·嵌入式硬件·物联网
昊虹AI笔记15 小时前
使用STM32CubeMX和Keil在STM32上创建并运行一个简单的FreeRTOS多任务程序
stm32·单片机·嵌入式硬件
王光环16 小时前
单片机使用printf,不用微库
单片机·嵌入式硬件
西城微科方案开发17 小时前
体重秤PCBA电路方案组成结构
单片机·嵌入式硬件