门禁控制系统设计Word下载.docx
《门禁控制系统设计Word下载.docx》由会员分享,可在线阅读,更多相关《门禁控制系统设计Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
![门禁控制系统设计Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/14cd2742-2f6c-44f6-91d9-56cfec10a14c/14cd2742-2f6c-44f6-91d9-56cfec10a14c1.gif)
门禁系统的总体方案
本系统由51系列单片机AT89S52、按键、蜂鸣器、T7122M-I读卡等模块构成。
实现了存储一张管理卡和多张用户卡的功能;
同时管理人员还可以通过按键更改管理卡,增加用户卡,删除用户卡,清空所有用户卡等。
因为门禁刷卡控制刷卡距离随着补尝电容的改变而改变(补尝电容大约300PF),所以最大的刷卡距离约为5—12CM;
对于非管理卡或用户卡,本门禁控制器不与响应;
每个按键控制器都有相应的提示音进行提示操作。
正常使用时,用户持卡靠近读卡天线,门禁控制器读入卡号,并与存储在内部的卡号比较,如果有相同的卡号,说明此卡合法,门禁机响一长音,提示成功,如果读卡失败,而不响应。
总体系统结构图如图3-1
图3-1门禁系统总体结构框图
3.2门禁系统的各个方案论证
3.2.1单片机控制芯片模块
方案一:
PIC16C84单片机芯片。
它是8位CMOSEEPROM微控制器。
它有高性能的类似于RISC的指令,共有35条单字节的指令,所有的指令除程序分支指令需要两个指令周期外,都只需要一个指令周期。
程序指令的宽度为14位,在芯片内有1K×
14的EEPROM程序存储器。
方案二:
At89s52芯片。
它是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
易失性存储与工业80C51产品指令和引脚完全兼容。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
基于以上所述,根据系统需要及所学知识我选方案二。
3.2.2键盘控制模块
独立式键盘,如图3-2。
它是利用单片机I/O口读取口的电平高低来判断是否有键按下,这种方式的缺点是占用的I/O口数较多。
且对键盘处理的时候涉及到了一个重要的过程,那就是键盘的抖动问题[1]。
图3-2
基于串并转换电路的键盘形式,如图3-3。
7SLS164是串并转化芯片,它把SDA(P10)上的串行数据转化为8为的并行数据,S1/S2/S3/S4/S5/S6/S7/S8作为键盘扫描线,P11为键盘数据回送线。
键盘扫描时,从S1~S7一次输出低电平,然后检测P11(回送线),如果P11(回送线)为高电平则表示无键闭合,如果P11(回送线)等于0,将S1~S7上的数据经过简单处理得到对应的键值。
[5]
如图3-3
方案三:
行列扫描的键盘形式,如图3-4。
列线通过电阻接正电源,并将行线所接的单片机I/O口作为输出端,而列线所接的I/O口则作为输入。
当按键没有按下时,所有列的输出端都是高电平,代表没有键按下。
行线输出时低电平,一旦有键按下时,则输入线就会被拉低,这样通过读入输入线的状态就可以得知是否有键按下了[6]。
图3-4
基于以上所述,根据系统需要我选方案二。
第4章门禁系统的硬件部分
4.1主控芯片部分
1、原理图
图4-1
键盘控制部分
采用串并转换电路的键盘形式
(1)原理图
图4-2串并转换电路的键盘形式
(2)工作原理
7SLS164是串并转化芯片,它把SDA(P27)上的串行数据转化为8为的并行数据,S1/S2/S3/S4/S5/S6/S7/S8作为键盘扫描线,P26为键盘数据回送线。
键盘扫描时,从S1~S7一次输出低电平,然后检测P26(回送线),如果P26(回送线)为高电平则表示无键闭合,如果P26(回送线)等于0,将S1~S7上的数据经过简单处理得到对应的键值。
(3)功能说明
KEY1:
增加用户卡
KEY2:
删除用户卡
KEY3:
删除管理卡
KEY4:
清除所有用户卡
蜂鸣器控制部分
1、蜂鸣器原理图如下所示:
图4-3蜂鸣器原理图
2、工作原理
单片机通过P37来控制蜂鸣器的工作与关闭。
当=1时,PNP三极管关闭,蜂鸣器停止工作[4]。
当=0时,PNP三级管导通,蜂鸣器开始工作[4]。
从而单片机只需要输出0或者1开控制鉴别鸣器即可。
3、功能说明
(1)刷卡时蜂鸣器响一声,说明读到用户卡。
(2)刷卡时蜂鸣器响两块,说明读到管理卡。
(3)相应的按键时给于相应的提示音。
(4)蜂鸣器没有响应,说明没有读到卡。
工业级读卡模块
1、应用电路简图
图4-4
2、数据输出格式
共输出48Bits,即6个字节。
第一字节为ID卡识别码,第二至第五字节为卡号,最后一个字节为前五个字节的校验和。
校验和运算变量类型为BYTE类型,运算过程进位被丢弃。
选择同步串行输出方式时,每个字节中高位先输出;
选择异步串行输出时,每个字节中低位先输出。
输出波特率均为9600Bits/S。
3、数据输出波形
图4-5
4、功能说明
(1)通过读卡天线,刷卡时读取ID卡卡号。
(2)通过SO脚把卡号传到单片机芯片管脚上。
(3)通过CP脚传送低电平说明有卡刷到。
第5章门禁系统的软件部分
程序循环中主要工作为判断是否有刷卡,若有刷卡则断判是什么卡,然后进行相应的处理。
门禁系统的总流程图5-1:
图5-1
管理卡功能子程序流程图如图5-2
图5-2
第6章门禁系统的软、硬件调试
完成了硬件的设计、制作和软件编程之后,要使系统能够按设计正常运行,必须进行硬件调试和软件调试。
硬件调试
硬件调试的主要任务是排除硬件故障,其中包括设计错误和工艺性故障。
(1)脱机检查。
按照电路原理图用万用表逐步检测电路板中所有器件的各引脚,尤其是电源的连接是否正确;
检查各开关按键是否能正常工作;
为了保护芯片,应先对各IC座(尤其是电源端)电位进行检查,确定其无误后再插入芯片检查[3]。
(2)联机调试。
暂时拔掉AT89S52芯片,将仿真器的40芯仿真插头插入AT89S52的芯片插座进行调试,检验键盘电路是否满足设计要求。
可以通过一些简单的测试软件来查看接口工作是否正常。
例如,我们可以设计一个能过按键控制蜂鸣器声响检测键盘电路的好坏。
如果运行测试结果与预期不符,很容易根据故障现象判断故障原因并采取针对性措施排除故障。
6.2.软件调试
软件调试的任务是利用开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现硬件故障。
程序的调试应一个模块一个模块地进行,首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;
最后逐步将各子程序连接起来总调。
联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。
调试的基本步骤如下:
(1)编写蜂鸣程序程序,调试是蜂鸣器是否会响。
(2)编写简单程序调试刷卡时是读卡模块是否有读入。
(3)编写键盘控制程序,调试是否有键按下及其按键值。
(4)编写添加、删除用户卡程序,调试是否能实现。
(5)编写更改管理卡,清除所有用户卡程序,调试是否能实现。
(6)总体调试,看能否实现存储一张管理卡,多张用户卡。
通过按键能否实现添加、删除用户卡,更改管理卡,清除所有用户卡等设计要求。
6.3软、硬件设计注意事项
(1)读卡模块T7122M-I外部电源接触不良或者严重的电磁干扰,则有可能偶然使读卡模块内部软件跑飞。
(2)天线周围如果有金属存在,则工作频率将受影响,读卡距离也受影响,严重时读卡反应迟钝,甚至不能读卡。
避免的方法是所有的金属材料尽量离开天线线圈,特别是天线前面不能有金属封板。
金属封板会屏蔽电磁波,致使读卡完全失效。
天线后面如果有金属封板,则应该离开天线线圈至少3厘米以上。
(3)读卡模块与模板注意是否有共地。
(4)如果使用的电源性能不良,将引起电压不稳,波纹太大,对读卡距离产生影响。
(5)外界的电磁杂波也会对读卡产生干扰。
结论
本门禁控制器用于鉴别刷卡人员,管理人员出入。
功能可实现存储一张管理卡、多张用户卡。
通过按键开关可以进行各种卡管理操作,如更改管理卡、增加单个用户卡、删除单个用户卡、清空所有用户卡等。
附录一:
系统程序
#include<
>
sbitcp=P1^0;
sbitsck=P1^1;
sbitso=P1^2;
sbitbeep=P3^7;
sbitled5=P0^5;
sbitKD_KEY=P2^6;
sbitKEY_SDA=P2^7;
sbitKEY_CLK=P2^5;
unsignedcharchcardno[10][5]={0};
unsignedcharcardok;
unsignedcharj=0;
unsignedcharcount;
unsignedchara;
unsignedcharcardno[5]={0};
unsignedcharkey_value;
unsignedcharb=1;
//---------毫秒延时子程序----------
voiddelay2(unsignedcharms)
{unsignedchari;
while(ms--)
{
for(i=0;
i<
120;
i++);
}
}
//---------蜂鸣器--------------
unsignedcharfeib(void)
{
beep=0;
led5=0;
delay2(250);
beep=1;
led5=1;
voidsend(unsignedchara)
//判断是不是有键按下
unsignedchari;
for(i=0;
8;
i++)
if(_crol_(a,i)&
0x80)
KEY_SDA=1;
else
KEY_SDA=0;
KEY_CLK=0;
KEY_CLK=1;
unsignedcharkey(void)
//判断是第几键按下
unsignedcharbuffer,display_bit,i;
buffer=0xff;
//赋初值为0xff
//延时去抖动
display_bit=0xfe;
//扫描键盘
send(display_bit);
if(!
KD_KEY)//是此键按下吗
{
buffer=display_bit;
//是,则保存其键值
return(i);
break;
//退出
display_bit=_crol_(display_bit,1);
//检测下一键
//------同步串行口接收一字节-------
unsignedcharrx1byte()
chari;
charrxdata;
for(i=9;
--i;
)
rxdata<
<
=1;
while(sck==0)//等待始终上升沿
continue;
if(so==1)//读数据
++rxdata;
while(sck==1)
returnrxdata;
//--------同步串行口接收-------
unsignedcharrx(void)
if(cp==1)//检测CP脚是否出现低电平
return;
EA=0;
//屏蔽中断
for(i=25;
)//保证CP的宽度大于时钟宽度
if(sck==0)
{EA=1;
while(sck==1)//等待时钟线出现低电平
cardno[0]=rx1byte();
//读第一个字节
cardno[1]=rx1byte();
//读第二个字节
cardno[2]=rx1byte();
cardno[3]=rx1byte();
cardno[4]=rx1byte();
cardno[5]=rx1byte();
//读第六个字节
while(cp==0)//等待CP脚恢复高电平
EA=1;
//读卡结束,校验卡号
i=cardno[0]+cardno[1]+cardno[2]+cardno[3]+cardno[4];
if(i=cardno[5])
cardok=1;
//---------------管理卡程序-----------
unsignedcharzjz(void)
chari=0;
while
(1)
{
rx();
P0=0XFF;
if(cardok==1)//判断是否有刷卡
cardok=0;
if(chcardno[0][5]==0)//判断是否有管理卡
{
feib();
feib();
chcardno[0][5]=cardno[5];
//设计为管理卡
}
if(chcardno[0][5]==cardno[5])//判断是否是管理卡
{
feib();
delay2(250);
while
(1)
{
rx();
if(cardok==1)//判断是否有刷卡
cardok=0;
TR0=1;
//起动定时器0
count=0;
break;
}
}
else
{
for(a=1;
a<
=b;
a++)
if(chcardno[a][5]==cardno[5])//判断是否是用户卡
feib();
break;
}
}
}
//----------定时器子程序---------
voidtimer1(void)interrupt3
TH0=(65536-50000)/256;
TL0=(65526-50000)%256;
count++;
key_value=key();
switch(key_value)
case0:
//按键1
chcardno[b][5]=cardno[5];
//添加用户卡
cardno[5]=0;
b++;
break;
case1:
//按键2
for(a=1;
{
if(chcardno[a][5]==cardno[5])
{
chcardno[a][5]=chcardno[b][5];
//删除用户卡
case2:
//按键3
feib();
chcardno[0][5]=0;
//删除管理卡
case3:
//按键4
chcardno[a][5]=0;
//清空所有用户卡
}
if(count==50)//定时5S是否到
TR0=0;
//--------------------主程序--------------
voidmain(void)
TMOD=0x01;
//定时器0
//定时器0初始华
ET0=1;
zjz();