目录
资料下载:待更新。。。。
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绘制相应的流程图;五为系统调试,结合软件和硬件设计完成实物的制作,并对其关键功能进行测试,最后总结全文。