单片机课程设计报告.docx
《单片机课程设计报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告.docx(29页珍藏版)》请在冰豆网上搜索。
![单片机课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-11/28/fc2f972f-5fff-4a9b-a63f-d4875e43d175/fc2f972f-5fff-4a9b-a63f-d4875e43d1751.gif)
单片机课程设计报告
课程设计报告
设计题目:
单片机门禁系统的设计
摘要:
门禁系统采用89C52单片机作为控制核心,外围加蜂鸣器控制电路、开门指示灯电路、电控锁控制电路等。
采用射频卡完成刷卡进门,按钮出门功能。
本系统设计简单、性能优良,具有一定的实用性。
关键词:
门禁;电控锁;控制
(一)、系统设计
1.系统方案的比较
(1)选题论证
在现今社会,随着人们对门禁系统各方面要求的不断提高,门禁系统的应用范围越来越广泛,因此,门禁系统的研发已成为现代科技领域的一个热门课题。
目前,门禁系统已成为安全防范系统中极其重要的一部分,在一些发达国家,门禁系统正以远远高于其它类安防产品迅猛发展;门禁系统之所以能在众多安防产品中脱颖而出,根本原因是因为其改变了以往安防产品,如:
闭路监控,防盗报警等被动的安防方式,以主动的控制替代了被动监视的方式,通过对主要通道的控制,大大的防止了罪犯从正常通道的侵入,并且可以在罪案发生时通过对通道门的控制限制罪犯的活动范围,制止犯罪或减少损失。
此外,人们对门禁系统的应用已不局限在单一的出入口控制,而且还要求它不仅可应用于智能大厦或智能社区的门禁控制、考勤管理、安防报警、停车场控制、电梯控制、楼宇自控等,还可与其它系统联动控制等多种控制功能。
(2)方案选择
门禁系统有许多种方案:
主要有联网和不联网型。
联网型:
结构图如图示
联网型门禁系统的优点:
1实时联网
2刷卡后立即把数据传输到主机上;
3便于查询并能生成报表;
缺点:
1计算机要求24小时开机;
2计算机或管理机万一有故障系统瘫痪;
3有问题影响面大。
不联网型门禁系统的优点:
单台刷卡机就能工作,不用布线,操作简单方便。
缺点:
不便于查询。
根据以上分析,我们的课题选择了不联网型。
因为此设计简单,提交作品方便,易操作。
(3)射频卡的选择
目前市面上的卡有很多种类:
条码、磁卡、接触式IC卡,非接触式IC卡等,条码和磁卡,在超市和银行方面应用的比较多,接触式IC卡,以前在公共电话中用的比较多,但接触式IC卡,芯片外露易坏、易折,而非接触式IC卡既射频卡,它把芯片和线圈封装卡片内,不容易损坏、不怕恶劣的环境,现在社会上很流行,可靠性也高。
根据卡的分析,选择目前流行最广,可靠性高,成本低的只读卡,即采用EM4000型的ID卡。
(二)硬件电路的设计
流程图:
(1)门禁系统主要组成:
由CPU、复位电路、电源指示、工作指示、振荡电路、蜂鸣器电路、出门按钮、读卡模块、电机转动模块组成。
(2)门禁系统的工作原理:
首先,按下开始按键,电源指示灯亮起。
当刷卡时,蜂鸣器响一声,读卡权限获得允许,显示灯点开始闪,同时继电器动作使电机转动,延时5秒时间后继电器再次动作使电机停止运转,显示灯熄灭。
当非法卡刷卡时,显示灯将一直闪,并且蜂鸣器将发出报警声。
(三)主电路原理图:
(四)各部分电路原理
1开门电机电路:
•门控锁电路工作原理:
当P2.7口输出高电平时Q2导通,Q3截止,此时继电器的控制线圈为开路,继电器不动作。
门锁接于继电器常闭端,电机不转,门处于锁死状态。
•当P2.7口输出低电平时Q2截止,Q3导通,此时继电器的控制线圈闭合,继电器动作。
继电器常闭端断开,电机开始转动,门处于打开状态。
2蜂鸣器电路:
•工作原理:
•当P3.5输出高电平时,Q1截止,蜂鸣器回路开路,蜂鸣器不响。
•当P3.5输出低电平时,Q1导通,蜂鸣器回路闭合,蜂鸣器发出响声。
3开门按键电路:
(三)非接触式IC卡性能简介(M1)
一、主要指标
●容量为8K位EEPROM
●分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位
●每个扇区有独立的一组密码及访问控制
●每张卡有唯一序列号,为32位
●具有防冲突机制,支持多卡操作
●无电源,自带天线,内含加密控制逻辑和通讯逻辑电路
●数据保存期为10年,可改写10万次,读无限次
●工作温度:
-20℃~50℃(湿度为90%)
●工作频率:
13.56MHZ
●通信速率:
106KBPS
●读写距离:
10cm以内(与读写器有关)
二、存储结构
1、M1卡分为16个扇区,每个扇区由4块(块0、块1、块2、块3)组成,(我们也将16个扇区的64个块按绝对地址编号为0~63,存贮结构如下图所示:
块0
数据块
0
扇区0
块1
数据块
1
块2
数据块
2
块3
密码A存取控制密码B
控制块
3
块0
数据块
4
扇区1
块1
数据块
5
块2
数据块
6
块3
密码A存取控制密码B
控制块
7
∶
∶
∶
0
数据块
60
扇区15
1
数据块
61
2
数据块
62
3
密码A存取控制密码B
控制块
63
2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。
数据块可作两种应用:
★用作一般的数据保存,可以进行读、写操作。
★用作数据值,可以进行初始化值、加值、减值、读值操作。
4、每个扇区的块3为控制块,包括了密码A、存取控制、密码B。
具体结构如下:
A0A1A2A3A4A5FF078069B0B1B2B3B4B5
密码A(6字节)存取控制(4字节)密码B(6字节)
5、每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。
存取控制为4个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的,在存取控制中每个块都有相应的三个控制位,定义如下:
块0:
C10C20C30
块1:
C11C21C31
块2:
C12C22C32
块3:
C13C23C33
三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如
进行减值操作必须验证KEYA,进行加值操作必须验证KEYB,等等)。
三个控制
位在存取控制字节中的位置,以块0为例:
对块0的控制:
bit76543210
字节6
C20_b
C10_b
字节7
C10
C30_b
字节8
C30
C20
字节9
(注:
C10_b表示C10取反)
存取控制(4字节,其中字节9为备用字节)结构如下所示:
bit76543210
字节6
C23_b
C22_b
C21_b
C20_b
C13_b
C12_b
C11_b
C10_b
字节7
C13
C12
C11
C10
C33_b
C32_b
C31_b
C30_b
字节8
C33
C32
C31
C30
C23
C22
C21
C20
字节9
(注:
_b表示取反)
6、数据块(块0、块1、块2)的存取控制如下:
控制位(X=0..2)
访问条件(对数据块0、1、2)
C1X
C2X
C3X
Read
Write
Increment
Decrement,transfer,
Restore
0
0
0
KeyA|B
KeyA|B
KeyA|B
KeyA|B
0
1
0
KeyA|B
Never
Never
Never
1
0
0
KeyA|B
KeyB
Never
Never
1
1
0
KeyA|B
KeyB
KeyB
KeyA|B
0
0
1
KeyA|B
Never
Never
KeyA|B
0
1
1
KeyB
KeyB
Never
Never
1
0
1
KeyB
Never
Never
Never
1
1
1
Never
Never
Never
Never
(KeyA|B表示密码A或密码B,Never表示任何条件下不能实现)
例如:
当块0的存取控制位C10C20C30=100时,验证密码A或密码B正确后可读;
验证密码B正确后可写;不能进行加值、减值操作。
7、控制块块3的存取控制与数据块(块0、1、2)不同,它的存取控制如下:
密码A
存取控制
密码B
C13
C23
C33
Read
Write
Read
Write
Read
Write
0
0
0
Never
KeyA|B
KeyA|B
Never
KeyA|B
KeyA|B
0
1
0
Never
Never
KeyA|B
Never
KeyA|B
Never
1
0
0
Never
KeyB
KeyA|B
Never
Never
KeyB
1
1
0
Never
Never
KeyA|B
Never
Never
Never
0
0
1
Never
KeyA|B
KeyA|B
KeyA|B
KeyA|B
KeyA|B
0
1
1
Never
KeyB
KeyA|B
KeyB
Never
KeyB
1
0
1
Never
Never
KeyA|B
KeyB
Never
Never
1
1
1
Never
Never
KeyA|B
Never
Never
Never
例如:
当块3的存取控制位C13C23C33=100时,表示:
密码A:
不可读,验证KEYA或KEYB正确后,可写(更改)。
存取控制:
验证KEYA或KEYB正确后,可读、可写。
密码B:
验证KEYA或KEYB正确后,可读、可写。
三、工作原理
卡片的电气部分只由一个天线和ASIC组成。
天线:
卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。
ASIC:
卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个
8K位EEPROM组成。
工作原理:
读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
四、M1射频卡与读写器的通讯
复位应答
Request
防冲突机制
AnticollisionLoop
选择卡片
SelectTag
改变扇区
三次相互验证
Authentication
中止
Halt
减值
decrement
加值
increment
写块
Writeblock
读块
Read
不改变扇区
复位应答(Answertorequest)
M1射频卡的通讯协议和通讯波特率是定义好的,当有卡片进入读写器的操作范围时,读写器以特定的协议与它通讯,从而确定该卡是否为M1射频卡,即验证卡片的卡型。
防冲突机制(AnticollisionLoop)
当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号。
选择卡片(SelectTag)
选择被选中的卡的序列号,并同时返回卡的容量代码。
三次互相确认(3PassAuthentication)
选定要处理的卡片之后,读写器就确定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证之后就可以通过加密流进行通讯。
(在选择另一扇区时,则必须进行另一扇区密码校验。
)
对数据块的操作
读(Read):
读一个块;
写(Write):
写一个块;
加(Increment):
对数值块进行加值;
减(Decrement):
对数值块进行减值;
存储(Restore):
将块中的内容存到数据寄存器中;
传输(Transfer):
将数据寄存器中的内容写入块中;
中止(Halt):
将卡置于暂停工作状态;
(四)程序:
#include"reg52.h"
#include
#include"lcd.h"
#include"main.h"
#include"mfrc522.h"
typedefstructRecord{
unsignedcharName[16];
unsignedcharNo[16];
unsignedlongCardID;
}RECORD;
codeRECORDstudent[3]={
"Name:
LingLong","No.:
3080432021",0x501909e0,
"Name:
ZhangSan","No.:
3080432022",0xacebd854,
"Name:
LiSi","No.:
3080432023",0x87654321
};
chargetData(void)
{
charc;
while(!
RI);
c=SBUF;
RI=0;
return(c);
}
//-------------------------------------------------
charsendData(charc)
{
while(!
TI);
TI=0;
return(SBUF=c);
}
//蜂鸣器函数
voidbeep()
{
unsignedchari=0;
EA=0;
for(i=0;i<200;i++)
{
sond=0;
delayuS(20);
sond=1;
delayuS(20);
}
EA=1;
}
unsignedcharidataRevBuffer[1];//调试用
unsignedchardataSerBuffer[1];//调试用
bitCmdValid;//调试用
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
voidInitializeSystem()
{
TMOD=0x20;//mode2autoreload
TL1=0xfd;
TH1=0xfd;//baudRate:
9600
SCON=0x52;//sm0,sm1,sm2,ren,tb,rb8,ti,ri
PCON&=0x7f;//smod=0;
TR1=1;//timer1reset
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
M500PcdConfigISOType('A');
}
#defineIDLE(0)
#defineCARDOK
(1)
#defineIDOK0
(2)
#defineIDOK1(3)
#defineIDOK2(4)
#defineIDERROR0(5)
#defineIDERROR1(6)
#defineIDERROR2(7)
#defineUNLOCK(8)
unsignedcharstate=IDLE;
unsignedcharbuf[4];
//主函数
voidmain()
{
unsignedcharbaud,i,Debug,result,updated;
unsignedlongltmp;
Debug=0;
//打开电源指示灯
Power=0;
//初始化单片机
InitializeSystem();
CARD_LED=0;
beep();
delayms0(200);
CARD_LED=0;
delayms0(200);
CARD_LED=1;
while
(1)
{
switch(state)
{
caseIDLE:
//刷新显示
PcdRequest(0x26,buf);
sendData(buf[0]);
sendData(buf[1]);
delayms0(100);
if(buf[0]!
=0x04)
{
PcdRequest(0x52,buf);
}
delayms0(100);
sendData(buf[0]);
sendData(buf[1]);
if(buf[0]==0x04)
{
delayms0(200);
state=CARDOK;
}
break;
caseCARDOK:
PcdAnticoll(buf);
sendData(0x55);
sendData(buf[0]);
sendData(buf[1]);
sendData(buf[2]);
sendData(buf[3]);
//查找学生记录
ltmp=(((unsignedlong)buf[0])<<24)|(((unsignedlong)buf[1])<<16)|(((unsignedlong)buf[2])<<8)|(((unsignedlong)buf[3]));
result=0;
for(i=0;i<3;i++)
if(student[i].CardID==ltmp)
{
result=1;
break;
}
if(result==1)
{
state=IDOK0;
}
else
{
state=IDERROR0;
}
break;
caseIDOK0:
delayms0(50);
PcdRequest(0x26,buf);
delayms0(50);
if(buf[0]!
=0x04)
{
PcdRequest(0x52,buf);
}
if(buf[0]==0x04)
{
PcdAnticoll(buf);
//查找学生记录
ltmp=(((unsignedlong)buf[0])<<24)|(((unsignedlong)buf[1])<<16)|(((unsignedlong)buf[2])<<8)|(((unsignedlong)buf[3]));
result=0;
for(i=0;i<3;i++)
if(student[i].CardID==ltmp)
{
result=1;
break;
}
if(result==1)
{
beep();
state=IDOK1;
}
else
state=IDLE;
}
break;
caseIDOK1:
state=IDOK2;
break;
caseIDOK2:
CARD_LED=!
CARD_LED;
for(i=0;i<10;i++)
{
delayms0(10);
if((key1==0)||(key2==0))
{
state=UNLOCK;
}
}
break;
caseIDERROR0:
delayms0(50);
PcdRequest(0x26,buf);
delayms0(50);
if(buf[0]!
=0x04)
{
PcdRequest(0x52,buf);
}
if(buf[0]==0x04)
{
PcdAnticoll(buf);
//查找学生记录
ltmp=(((unsignedlong)buf[0])<<24)|(((unsignedlong)buf[1])<<16)|(((unsignedlong)buf[2])<<8)|(((unsignedlong)buf[3]));
result=0;
for(i=0;i<3;i++)
if(student[i].CardID==ltmp)
{
result=1;
break;
}
if(result==1)
{
updated=1;
state=IDLE;
}
else
state=IDERROR1;
}
break;
caseIDERROR1:
state=IDERROR2;
break;
caseIDERROR2:
beep();
CARD_LED=!
CARD_LED;
if((key1==0)||(key2==0))
{
state=IDLE;
updated=1;
CARD_LED=1;
}
break;
caseUNLOCK:
Relay=0;
CARD_LED=0;
delayms0(1500);
CARD_LED=1;
Relay=1;