前述:
QQ:961209458
V X:F9986858
承接毕业设计。
1.概述
(1)本设计采用STC89C52作为主控芯片,专用读卡器模块用来读射频卡的信息,当有卡进入到读卡器读卡的范围内时就会读取到相应的卡序列号,并根据得到的卡序列号做出相应的操作。若正确则开门,若不正确则报警并显示错误信息。
(2)本设计实现了自动、准确的识别卡序列号,对门禁系统起着重要的作用EEPROM采用AT24C04芯片,掉电后可以存储密码,从而保证了系统的安全性。人机交互通道部分采用了4×4矩阵键盘输入以及LCD12864标准字符型液晶显示。针对于用按键输入密码,根据密码的正确与否来进行相应的操作,管理员可以自行设定和修改密码;输出系统部分包括驱动开锁电路和报警电路;其中,在本系统设计中,驱动开锁电路用发光二极管表示,而报警电路则使用蜂鸣器。
2.硬件设计
本次设计的硬件电路是由STC89C52 单片机为控制核心,射频卡信息由MFRC522模块读出,通过MCU在LCD12864上显示,通过按键完成密码验证和修改密码的功能,并根据输入密码的对错,执行相应继电器的动作和蜂鸣器的状态,整个门禁系统框图如图所示。
(1) RFID射频模块电路
a.射频识别识别系统原理
典型RFID系统由应答器(Tag)、读写器(Read and Write Device)以及计算机系统等组成。
读写器由无线收发模块、天线、控制模块及接口电路等组成
应答器也称电子标签,它具有可存储读写信息及对信息进行加密的能力,是射频识别系统主要的核心
计算机系统是以单片机或微处理器为数据处理核心,主要是对读取到电子标签进行相关的信息管理。
在阅读器的感应范围之外,电子标签无源无法工作,只有在阅读器感应范围之内,电子标签才是有源的。应答器工作所需的能量,是通过读写器的耦合单元传输给应答器的。应答器如果是无源系统,即应答器内不含电池,则应答器工作的能量是由读写器发出的射频脉冲提供[8]。应答器如果是有源系统,即应答器内含有电池,则应答器工作能量和工作寿命有电池决定。RFID射频系统结构图如图:
实用RFID系统为无源系统,即射频卡能量由读写器发出的射频脉冲信号提供。无源系统的通信优劣取决于读写器发出的脉冲信号能否被射频卡完整接受。当射频卡进入读卡器接受范围后,如果接收到读卡器发出的射频信号,就能凭借产生的感应电流所获得的能量发送出存储在卡片中的信息,通过读卡器的处理,将信息送至信息管理系统进行有关数据处理。
硬件电路
部分核心代码
#include <reg52.h>
#include <user.h>
#include <stdio.h>
#include <lcd.h>
sbit key1 = P2^0;
sbit key2 = P2^1;
sbit key3 = P2^2;
sbit key4 = P2^3;
sbit beep = P1^0;
sbit lock = P1^1;
#define u16 unsigned int
#define u8 unsigned char
void key();
u8 IC_judge();
void LCD_Display(char *p);
//u8 name ;
u8 IC_val[10][5] ={{0x6d,0xdb,0xaa,0x09,0xc4}, //管理员
{0x0a,0xaa,0xed,0xbd,0x21},//user1
{0xCA,0x76,0xfe,0xbe,0x2d}};//user2
char IC_name;
unsigned long int IC_time;
char i;IC_j;
u8 ZT_ZONG=0;///
bit DEL = 0;
void main()
{
Init_Serialport1();
LcdInit();
LcdWriteCom(0x80);
LCD_Display(" welcome ");
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" In standby ");
while(1)
{
key();
if(ZT_ZONG == 0)
{
if(flag == 1)
{
if(rec_buf[0] == 0x04 && rec_buf[1]==0x0c)
{
if(IC_judge() == 1)
{
if(IC_name == 0)
{
DEL = 1;
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" administrators ");
}
else
{
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" USER: ");
LcdWriteData( IC_name+'0');
LCD_Display(" ");
beep = 0;
lock = 0;
delay(30000);
beep = 1;
}
}
else
{
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" eeror ");
lock = 1;
lock = 1;
delay(30000);
}
}
delay(200);
flag = 0;
IC_time = 0;
}
IC_time++;
if(IC_time >=80000)
{
DEL = 0;
lock = 1;
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" In standby ");
IC_time = 40000;
}
}
if(ZT_ZONG == 1 && DEL == 1)
{
delay(100);
if(flag == 1)
{
if(rec_buf[0] == 0x04 && rec_buf[1]==0x0c)
{
if(IC_judge() == 0)
{
for(i=9;i>=0;i--)//
{
if(IC_val[i][0] == 0x00 && IC_val[i][1] == 0x00)
{ IC_j = i; }
}
for(i=0;i<5;i++)
{
IC_val[IC_j][i] = rec_buf[7+i];
}
LcdWriteCom(0xc0);//lcd下行
LCD_Display("add successfully");
delay(50000);
}
else
{
LcdWriteCom(0xc0);//lcd下行
LCD_Display("The card exists ");//卡已经存在
}
}
}
}
if(ZT_ZONG == 2)
{
if(key3 == 0)
{
while(key3 == 0);
IC_name++;
if(IC_name>9){IC_name = 9;}
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" Select user: ");
LcdWriteData(IC_name + '0');
LcdWriteData(' ');
}
if(key4 == 0)
{
while(key4 == 0);
IC_name--;
if(IC_name<1){IC_name = 1;}
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" Select user: ");
LcdWriteData( IC_name + '0');
LcdWriteData(' ');
}
}
}
}
u8 IC_judge()
{
u8 sign=0;
char j=0;
for(j=0;j<10;j++)
{
if(rec_buf[7]==IC_val[j][0] &&
rec_buf[8]==IC_val[j][1] &&
rec_buf[9]==IC_val[j][2] )
{
if(rec_buf[10]==IC_val[j][3] && rec_buf[11]==IC_val[j][4])
{
sign = 1;
IC_name = j;
}
}
}
return sign;
}
void LCD_Display(char *p)
{
while(*p != '\0')
{
LcdWriteData(*p++);
}
}
void key()
{
if(key1 == 0 && ZT_ZONG==0 && DEL==1)
{
while(key1 == 0);
ZT_ZONG = 1;
LcdWriteCom(0x80);
LCD_Display(" ADD USER ");
LcdWriteCom(0xc0);//lcd下行
LCD_Display("Put in the card ");
}
if(key1 == 0 && ZT_ZONG==1)
{
DEL = 0;
while(key1 == 0);
ZT_ZONG = 0;
LcdWriteCom(0x80);
LCD_Display(" welcome ");
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" In standby ");
}
if(key2 == 0 && ZT_ZONG==0 && DEL==1)
{
while(key2 == 0);
ZT_ZONG = 2;
IC_name = 1;
LcdWriteCom(0x80);
LCD_Display(" Delete ");
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" Select user: ");
LcdWriteData(IC_name + '0');
LcdWriteData(' ');
}
if(key2 == 0 && ZT_ZONG==2)
{
while(key2 == 0);
for(i=0;i<5;i++)
{
IC_val[IC_name][i] = 0x00;
}
ZT_ZONG = 0;
LcdWriteCom(0x80);
LCD_Display(" welcome ");
LcdWriteCom(0xc0);//lcd下行
LCD_Display(" In standby ");
}
}