基于rfid技术门禁系统的设计_第1页
基于rfid技术门禁系统的设计_第2页
基于rfid技术门禁系统的设计_第3页
基于rfid技术门禁系统的设计_第4页
基于rfid技术门禁系统的设计_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合课程设计说明书题目:基于RFID的门禁系统设计学生姓名:学号:院(系):电气与信息工程学院专业:电子信息科学与技术指导教师:2016年6月16日目录一前言…………1二案例描述……………………3三需求分析……………………43.1实验箱模块的选择………43.2系统语言的选择……………53.3数据交换方式………………63.4应用程序的结构……………73.4.1显示子程序………………73.4.2密码子程序………………83.5存储系统的设计及分析……93.6系统模块的总体设计………113.6.1系统硬件设计…………123.6.2系统软件设计…………12四系统的整体描述和实现……134.1射频识别的简单描述……134.2软件结构的实现…………154.3系统功能的具体实现……174.3.1系统软件调试……………174.3.2系统整体调试…………18五课程设计总结………………22六参考文献……………………23七致谢……………………24八附录……………………25一前言射频识别(RadioFrequencyIdentification,RFID)技术是从20世纪80年代开始走向成熟的一项自动识别技术,是当前最受人们关注的热点之一,该项技术既传统也充满新意和活力。射频识别是无线电识别的简称,即通过无线电波进行识别。它源于无线电通信技术,综合了现代计算机智能控制、智能识别、计算机网络等高新技术,顺应了计算机集成制造系统,电子商务等热点应用的发展需要。射频识别应用电磁场,以非接触、无视觉、高可靠的方式传递特定识别信息,由于大规模集成电路技术的日益成熟,使得射频识别系统的体积大大减少,从而进入了实用化阶段。射频识别技术具有工作距离大、信息收集处理快捷及较好的环境适应性等优点,极大地加速了有关信息的采集和处理,在近年来获得了极为迅速的发展。基于RFID的考勤系统设计是将射频识别技术应用到家庭安防系统中的一次成功尝试。这一系统克服了家庭生活中居住的安全性不能得到保证的弱点,能够有效地提高家庭安防系统的能力,为居家生活提供更好的,更安全的保障。随着通讯计算机技术、元器件制造技术的发展和应用,由此产生的自动识别(AutomaticIdentification)技术在许多领域得到普及。出入口门禁管理是现代化安防系统的重要组成部分,出入口只允许有进出权限者通行。门禁管理系统就是基于这些自动识别技术识别进出人员或车辆的身份权限,通过与系统中信息比较,作出预设反应。常见的自动识别技术有条形码、生物特征识别(指纹、面部特征)、IC卡和射频卡。条形码技术介质存储容量小,不能改写,易污损。生物特征识别相对比较复杂,识别效率、误识率较高。IC卡识别和射频识别是目前较成熟且应用广泛的两种技术,作为数据存储器系统,它们内有CPU,可防更改,识别时间短。IC卡识别系统需要接触识别,存在触点对腐蚀和污染缺乏抵抗能力的缺点。射频识别系统通过非接触式工作模式,基本原理是利用射频信号和空间耦合实现物体的自动识别。射频识别系统支持密码认证和效验,识别工作无须人工干预,它既支持只读工作模式又支持读写工作模式;射频卡可工作在恶劣环境下,识别速度快数据容量大,可以达到数10K,标签数据可以修改,写入时间短,射频卡可以设置密码保护具有更好的安全性。现阶段大多数门禁系统都是基于射频识别技术,同时RFID技术还在飞速的发展,应用越来越广泛。二案例描述门禁系统,又称人口控制系统.在何时允许某些人进出,拒绝某些人进出,什么情况下要发生报警,记录人员的出入状况,是门禁系统最基本的功能.智能的RFID门禁系统是对楼房中的重要通道进行管理。在门口,电梯,等人员来往频繁或重要的地方安装控制装置,例如:读卡器,键盘等,人员想要进入必须有卡才能通过,大大增强的安全性。基于RFID技术的门禁系统作为智能门禁系统的“骨干”,已经成为了一项先进的高科技技术防范和管理手段,在一些经济发达的国家已经广泛的应用于科研,工业,博物馆,酒店,商场,医疗监护,银行,监狱等,已成为安防技术重点研究和开发的对象。1994年RFID技术进入中国,引发了中国RFID技术的应用革命。在我国基于RFID的智能门禁系统的使用仍然处于发展状态,因此对射频识别技术在门禁系统方面的应用理论及实际可行性及实用性研究的重中之重。近几年,关于识别系统的通讯模式,指纹等生物识别设备的集成管理及DVR系统的集成成为现代门禁系统发展的亮点。另外,作为蓬勃发展的生物识别技术,随着其辨别技术的的不断成熟,以及人们对这类产品的进一步了解,若价格因素能保持人们可以接受的范围内,那么,该技术的应用前景将是十分广泛的。射频识别(RFID,即RadioFrequencyIdentification)技术是自动识别技术在无线电技术方面的具体应用与发展,其基本原理是利用射频方式进行非接触双向通信,以达到识别与数据交换的目的[1]。具有高精度、适应环境能力强、抗干扰强、操作快捷等优点,能够实现无线自动识别,主动监控的功能。RFID技术作为一项先进的自动识别和数据采集技术,在实际应用中取得了显著的成效,已经成功应用到生产制造、物流管理、公共安全等各个领域。随着RFID技术的日益成熟和普及,各国政府都意识到RFID技术的研究价值和蕴涵的巨大商机,制定相关政策加大财力、物力投资,积极推动本国RFID技术发展。RFID技术的运用是非接触式IC卡目前的潮流,更快的响应速度和更高的频率是未来的趋势。三需求分析3.1实验箱模块的选择本次实验选择的是实验箱中的高频模块,即HF高频下识别卡不需要绕制线圈,可以通过印刷的方式制作天线。识别卡一般是负载调制的方式工作,也就是通过识别卡的负载电阻的接通和断开促使读写器天线上的电压发生变化,实现远距离识别卡对天线电压进行振幅调制。就频率而言,高频RFID具有以下特性:①工作频率为13.56MHz,该频率的波长大概为22米。②除了金属材料外,该频率的波长可以穿过大多数的材料,但是往往会降低读取距离。识别卡(感应器)需要离开金属一段距离。③该频段在全球都得到认可并没有特殊的限制。④该系统具有防冲撞特性,可以同时读取多个识别卡。⑤可以把某些数据信息写入识别卡中。⑥数据传输速率比低频要快且价格不是很贵。高频RFID主要应用有:◎航空包裹的管理和应用◎瓦斯钢瓶的管理应用◎预收费系统◎酒店门锁的管理和应用◎大型会议人员通道系统◎固定资产的管理系统◎医药物流系统的管理和应用◎智能货架的管理系统运行简要说明:①:上电后,430先通过并口访问7970芯片,在没有读到卡时,程序运行在串口读写模式,并每隔0.5s向串口发送一个“D”,直到有写操作为止。②:当有卡读写时,针对相应的卡,程序进入不同的协议中,并且点亮相应的LED灯。(2)API调用说明①:上电后,配置完内部寄存器,程序进入串口读写程序,可以进行人机交互。②:当读到不同协议的卡时,程序退出串口读写程序,进入相应的协议子程序中(目前支持14443A协议和15693协议)。读完卡后,退出相应的协议子程序,进入串口读写程序。(3)ISO15693第三部分通过读卡器获取指令流,读卡器采用TItrf7970读卡器芯片,开发资料参考协议ISO15693,trf7970datasheet,参考trf7960EVM.pdf实现ISO15693第三部分指令部分,防碰撞实验。高频读写模块中,利用高频卡可以进行识别操作,因此高频读写有以下特性:1.支持近场通讯(NFC)标准NFCIP-1(ISO/IEC18092)和NFCIP-2(ISO/IEC21481)2.用于ISO15693、ISO18000-3、ISO14443A/B、和FeliCa的完全集成的协议处理3.集成编码器、解码器和用于NFC启动程序的数据成帧,对所有3个比特率(106kbps,212kbps,424kbps)的有源和无源目标操作及卡仿真。4.用于NFC无源发射机应答器仿真操作的具有可编程唤醒电平的RF场侦测器。5.用于NFC物理冲突避免的RF场检测器。6.用于ISO14443A防冲突(不完整字节)操作(发射机应答器仿真或者NFC无源目标)的集成状态机。7.输入电压范围:2.7VDC至5.5VDC。8.可编程输出功率:+20dBm(100mW),+23dBm(200mW)。9.可编程I/O电压电平从1.8VDC至5.5VDC。3.2开发语言的选择软件结构框图:系统软件主要包括信号处理和系统管理两个部分,信号处理模块采用C语言编程,系统管理部分软件采用MicrosoftVisualC++编程,VC++是Windos平台上的C++编程环境,学习VC要了解很多Windos平台的特性并且掌握MFC、ATL、COM等的知识,C++的具有就是界面简单,占用资源少,操作方便的特点。其中建立了一个中间数据库,编程简单,开发时间短,能够实现双卡识别功能,控制道阀自动开启和关闭,同时具有报警功能。其软件流程图如下图1所示。基于RFID的门禁系统基于RFID的门禁系统数据采集模块存储模块显示模块门控模块报警模块键盘模块图一软件结构框图3.3数据交换的方式本次设计采用数据库存储用户信息及数据,执行程序之前,首先要设置串口波特率等相关串口参数,然后上位机通过串口向下位机发送命令,并进入串口中断。下位机根据接收SBUF的值做相应的处理。程序流程图如图2所示开始开始上位机发送读卡命令YYNN验证感应卡权限开门,显示正确信息报警,显示错误信息延时后,自动关门结束图2数据采集子程序流程图3.4应用程序的结构3.4.1显示子程序显示子程序的主要功能是对当前的门控状态进行显示,显示函数首先判断是写命令操作还是写数据操作,若是写命令操作,则根据命令进行相应的操作,如清屏、设置显示模式等;若是写数据操作,则在显示器上显示相应数据。程序流程图如图3所示。显示程序显示程序液晶初始化设置第一行显示数据地址显示第一行数据设置第二行显示数据地址显示第二行数据延时后,清屏结束延时图3显示子程序流程图3.4.2密码子程序密码子程序流程图如图4所示,当程序运行时,会一直判断是否有按键被按下,当有按键被按下时,系统会确定键值,关将键值存入到密码数组里,然后将输入的密码与本身的密码做比较,若相同,则执行开门和显示正确信息的操作;若不相同,则执行报警和显示错误信息的操作。密码子程序是整个门禁系统的关键部分,因为在通过密码程序的实施之后,才可以进行数据的访问与访问者的信息匹配,因此,密码系统就好比整个门禁系统的大门,它是连接访问者与数据的关键一环。其中,密码程序的代码如下:P1=0x0f;if(P1!=0x0f)compare(P1);for(n=0;n<10;n++)if(input[n]!=password[n])break;if(n==10){if(m<10)continue;WriteLcdCom(0x01); //清屏WriteLcdCom(0x80); //第一行数据指针地址for(s=0;s<16;s++) WriteLcdDat(str2[s]);LEDG=0;BUZ=0;delay_10ms(20);LEDG=1;BUZ=1;WriteLcdCom(0x01);input[0]="";}elseif((n<10)&&(P1==0xbd)){WriteLcdCom(0x01); //清屏WriteLcdCom(0x80); //第一行数据指针地址for(s=0;s<16;s++)WriteLcdDat(str4[s]);LEDR=0;for(s=0;s<5;s++){BUZ=0;delay_10ms(20);BUZ=1;delay_10ms(20);}LEDR=1;}密码子系统的流程图如下:开始开始去除按键抖动的影响确定键值存入密码数组开门,显示正确信息报警,显示错误信息延时后,自动关门结束YYN图4密码子程序流程图3.5存储系统的设计及分析本设计中数据的存储芯片选用的是AT24C04,该芯片是串行的E2PROM,支持I2C总线数据传送协议。程序流程图如图5所示。存储程序存储程序AT24C04初始化延时N结束图5存储系统程序流程图当我们完成对存储过程的分析之后,我们需要对存储过程加以实施,此时,就需要编写存储程序的代码,存储程序核心的代码如下:voideeprom(){write_byte(0,0x1e);write_byte(1,0xda);write_byte(2,0x62);write_byte(3,0xb6);write_byte(4,0x25);write_byte(5,0xee);write_byte(6,0xde);write_byte(7,0xb6);write_byte(8,0x05);write_byte(9,0xc8);write_byte(10,0x43);write_byte(11,0xb8);write_byte(12,0x3a);write_byte(13,0x04);write_byte(14,0x5d);write_byte(15,0xb6);}bitshout(ucharwrite_data)//从MCU移出数据到AT89C51{uchari;bitack_bit;for(i=0;i<8;i++)//循环移入8个位{SDA1=(bit)(write_data&0x80);_nop_();SCL1=1;delayNOP();SCL1=0;write_data<<=1;}SDA1=1;//读取应答delayNOP();SCL1=1;delayNOP();ack_bit=SDA1;SCL1=0;returnack_bit;//返回AT24C04应答位}voidwrite_byte(ucharaddr,ucharwrite_data){start();shout(OP_WRITE);shout(addr);shout(write_data);stop();delay_10ms(1);}3.6系统模块的总体设计依据上述功能的分析,系统中模块分别为:数据采集模块、数据处理模块、数据存储模块、显示模块、串口发送/接收模块、密码输入模块、报警机制模块。系统功能结构图如图6所示,各功能模块具体功能如下:1. 数据采集模块:当RFID卡进入到读卡器读卡范围时,读卡器读取卡序列号的过程。2. 数据处理模块:针对于采集到的数据处理,从而对得到的数据进行判断其有效性。3. 数据存储模块:用来存储数据。4. 显示模块:用来接收单片机发送的数据,并对数据进行操作从而得到要显示的信息。5. 串口发送/接收模块:主要用来通过串口发送和接收数据。6. 密码输入模块:针对于用按键输入密码,根据密码的正确与否来进行相应的操作。7. 报警机制模块:当出现非法卡或输入的密码不正确时产生报警。综合数据处理模块读卡器处理模块综合数据处理模块读卡器处理模块密码处理模块读卡模块存储模块门控模块报警模块显示模块存储模块门控模块报警模块显示模块图6系统功能结构图3.6.1系统硬件设计系统硬件设计主要由AT89C51主控芯片和ISO/IEC15693读卡器模块构成。硬件电路由八部分构成:微控制器AT89C51、读卡器模块ISO/IEC15693、LCD1602显示、串口通信MAX232、按键电路、AT24C04存储、报警电路、门控电路。微控制器AT89C51负责读卡器模块ISO/IEC15693的初始化,上位机通过串口向ISO/IEC15693发送命令,ISO/IEC15693根据上位机发送的命令做相应的操作,然后将得到的信息传送给微控制器AT89C51,然后微控制器控制其它模块完成显示、报警、判断和门控操作。上位机与下位机之间的连接主要是通过串口进行通信,采用MAX232芯片并将芯片的输入和输出管脚连接到AT89C51的I/O口,在MAX232的引脚上连接10µF的电解电容用来滤波。读卡器模块ISO/IEC15693与微控制器AT89C51之间的通信是通过I2C总线进行的,由于AT89C51单片机本身并没有I2C总线,所以将ISO/IEC15693模块的串行时钟线与数据线接到AT89C51的两个I/O口,然后通过模拟I2C时序来完成AT89C51与ISO/IEC15693之间的通信,为了防止出现三态,在ISO/IEC15693的串行时钟线和数据线上分别上拉10k电阻。而ISO/IEC15693读卡器与RFID卡之间的数据通信主要是通过天线进行的。AT24C04与AT89C51之间的通信也是通过模拟I2C时序进行,同时为了防止出现三态,在时钟线与数据线上分别连接5.1k的上拉电阻。LCD1602与AT89C52之间的通信是通过将LCD1602的3条控制线和8条数据线与AT89C51的I/O口相连。对于按键电路的设计是将3*4按键直接连接到AT89C51的7位I/O口,采用线反转法通过查询方式进行工作。3.6.2系统软件设计软件主要实现数据的采集,数据的分析,模块之间的通信,以及相应的数据处理。1. 数据采集:读卡器ISO/IEC15693通过天线读取RFID卡的数据,然后将数据传送出去。2. 数据分析:AT89C51接收到数据后,将数据传送给AT24C04或上位机,AT24C04或上位机对数据进行分析,从而判断数据的有效性。3. 模块之间的通信:AT89C51与ISO/IEC15693/AT24C04之间的通信都是通过模拟I2C总线进行的,I2C总线的高效性、高实用性、高可靠性数据传输增强了系统的实时性和可靠性。4. 数据处理:针对数据的采集和分析的结果做出相应的处理,例如显示、报警、门控等。四系统的整体描述和实现4.1射频识别的简单描述在本设计中,采用的是射频识别技术。下面对射频识别技术做一下简要介绍:1. 射频识别技术原理通常情况下,RFID的应用系统主要由读写器和RFID卡两部分组成的,见下图7。其中,读写器一般作为计算机终端,用来实现对RFID卡的数据读写和存储,它是由控制单元、高频通讯模块和天线组成。而RFID卡则是一种无源的应答器,主要是由一块集成电路(IC)芯片及其外接天线组成,其中RFID卡芯片通常集成有射频前端、逻辑控制、存储器等电路,有的甚至将天线一起集成在同一芯片上。RFID应用系统的基本工作原理是RFID卡进入读写器的射频场后,由其天线获得的感应电流经升压电路作为芯片的电源,同时将带信息的感应电流通过射频前端电路检得数字信号送入逻辑控制电路进行信息处理,所需回复的信息则从存储器中获取经由逻辑控制电路送回射频前端电路,最后通过天线发回给读写器。可见,RFID卡与读写器实现数据通讯过程中起关键的作用是天线。一方面,无源的RFID卡芯片要启动电路工作需要通过天线在读写器天线产生的电磁场中获得足够的能量;另一方面,天线决定了RFID卡与读写器之间的通讯信道和通讯方式。图7射频识别系统原理图2. 射频识别系统典型结构射频识别系统的典型结构见图8,主要是由两部份组成:读写器和射频卡。读写器同射频卡之间通过无线方式通讯,因此它们都有无线收发模块及天线(或感应线圈)。射频卡中有存储器,内存容量为几个比特到几十千比特。可以存储永久性数据和非永久性数据。永久性数据可以是射频卡序列号,它是用来作为射频卡的唯一身份标识,不能更改;非永久性数据写在E2PROM等可重写的存储器内,用以存储用户数据。射频卡可以根据读写器发出的指令对这些数据进行相应的实时读写操作。控制模块完成接收、译码及执行读写器的命令,控制读写数据,负责数据安全等功能。射频卡分无源卡和有源卡两种,有源卡内置天线和电池,而无源卡只有内置天线没有电池,其能量由读写器提供,由于无源卡无需电池因此其尺寸较小且使用寿命长,应用越来越广泛。读写器内的控制模块往往具有很强的处理功能,除了完成控制射频卡工作的任务,还要实现相互认证、数据加解密、数据纠错、出错报警及与计算机通信等功能。计算机的功能是向读写器发送指令,并与读写器之间进行数据交换。图8RFID系统典型结构图8为RFID系统的工作过程,这是一个无源系统,即射频卡内不含电池,射频卡工作的能量是由射频读写模块发出的射频脉冲提供。(1)射频读写模块在一个区域内发射能量形成电磁场,区域大小取决于发射功率、工作频率和天线尺寸。(2)射频卡进入这个区域时,接收到射频读写模块的射频脉冲,经过桥式整流后给电容充电。电容电压经过稳压后作为工作电压。(3)数据解调部分从接收到的射频脉冲中解调出命令和数据并送到逻辑控制部分。逻辑控制部分接收指令完成存储、发送数据或其它操作。(4)如果需要发送数据,则将数据调制然后从收发模块发送出去。(5)读写模块接收到返回的数据后,解码并进行错误校验来决定数据的有效性,然后进行处理,必要时可以通过RS232或RS422或RS485或RJ45或无线接口将数据传送到计算机。读写器发送的射频信号除提供能量外,通常还提供时钟信号,使数据同步,从而简化了系统的设计。有源系统的工作原理与此大致相同,不同处只是卡的工作电源由电池提供的。4.2软件结构的实现4.2.1系统的整体软件结构系统软件设计是整个系统设计的重要部分,在硬件电路的基础上,加上软件编程才可以实现系统预期的功能。在本系统中,软件的设计主要包括:数据采集模块、存储模块、显示模块、门控模块、报警模块、键盘模块和上位机软件的设计几个方面。本系统的软件结构框图如图9所示。1. 数据采集模块:读卡器ISO/IEC15693通过天线读取RFID卡的数据,然后将数据传送出去。2. 存储模块:AT89C51接收到数据后,将数据传送给AT24C04进行存储。3. 显示模块:AT89C51接收到数据后,将数据与AT24C04里存储的数据进行对比,若两者完全相同,则液晶显示正确的信息;若不相同,则液晶显示错误的信息。4. 门控模块:AT89C51接收到数据后,将数据与AT24C04里存储的数据进行对比,若两者完全相同,则进行开门操作;若不相同,则不开门。5. 报警模块:AT89C51接收到数据后,将数据与AT24C04里存储的数据进行对比,若不相同则报警。6. 键盘模块:通过键盘输入密码,并根据输入密码的有效性做相应的操作。基于RFID的门禁系统数据采集模块基于RFID的门禁系统数据采集模块存储模块显示模块门控模块报警模块键盘模块显示模块结束报警模块图9软件结构框图串口发送/接收部分的调试:将电路板与计算机连接以后,用一段简单的程序进行调试。发现在调试的过程中,串口不能正常通信,经过查证后发现是电容正负极接反了,修正以后,便能正常通信了。注:电容的选择要注意,应选择0.1µF/1µF/10µF的电容。存储部分的调试:将AT24C04与单片机连接好后,编写一段简单的存储程序,将字符存入到24C04里,并取出查看存储数据的正确性。通过调试后,并未发现问题。存储电路调试成功。读卡器部分的调试:将读卡器接口与单片机相连后,用串口调试助手检测读卡器。在用串口助手向读卡器发送读卡命令时,当有卡(MIFIRES50、S70卡)进入读卡器读卡范围内时,会向串口助手返回卡序列号,以此证明读卡器可用。4.3系统功能的具体实现4.3.1系统软件调试在进行软件调试之前要先进行人工检查代码,要仔细认真的检查,在程序中要多添加注释,以便检查方便。在人工检查无误后,才可以进行动态检查,也就是上机调试。通过编译可以得到语法错误的信息,根据提示信息找出程序中出错之处并改正。有时提示的出错信息并不是真正出错的行,这就要求我们善于分析,找出真正的错误,而不要单纯从字面意义上找出错信息,要懂得变通的理解并解决问题。软件调试时,也要模块式进行。调试时可用单步运行和断点运行方式,通过检查系统的CPU现场情况、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求。同时,还可以发现系统中存在的硬件设计错误和软件算法错误。待各个模块调好后再进行系统程序联调。这个阶段若出现故障,可以检查算法上是否有冲突、参数传递是否正确等。在使用WAVE软件时,调试的方法和技巧最为重要,不同的情况采用不同的调试方法,有助于程序的实现。在设计过程中显示运行结果一般用全速调试,调试时主要使用了跟踪调试、断点调试。1.跟踪调试:跟踪应用程序用户能够在运行应用程序时,看到PC指针在应用源代码程序中的确切位置。跟踪型:单步执行一条语句程序,有利于观察变量。但是,如果调用一个函数,则进入函数中,在函数中单步执行每一条语句。跟踪使用热键F7。单步型:单步执行每条语句程序,如果调用一个函数,则不进入函数中。单步使用热键F8。2.断点调试如果已知程序中某块代码实际运行正常的情况下,仍用跟踪调试,将大大浪费时间,而且很枯燥,因此调试中第二个重要工具是在源代码中某一处设置断点,大多数调试程序通过使用断点中止程序执行。在程序调试中用到使用断点调试,即在指定行上设置断点后,全速执行程序,看是否能进行到设置断点所在行。如果用断点调试,由比较容易观察出程序变量的改变及程序运行的结果。设置断点热键Ctrl+F8。3.查看变量WAVE软件可以通Watch窗口进行查看变量。通过添加观察项菜单可以将用户希望观察的变量添加到观察窗口及数据窗口观察。在设计过程中常用观察窗口观察程序中的变量,修改程序中的错误。4.3.2系统整体调试将各个部分的硬件模块合并成一个整体,把软件各个部分程序合并到一个主程序中。通过伟福访真器和伟福调试软件WAVE6000开始整体调试,硬件部分用万用表来测试硬件每部分的接通性。软件部分的测试主要方法是通过设置断点、单步执行等方法来测试程序的正确性。在确定软硬件无问题后,将程序通过烧写器把程序烧到单片机中。将程序烧写到控制芯片AT89C52,打开电源,电源指示灯亮,整个系统启动。运行上位机,向下位机发送读卡命令,下位机接收到读卡命令后,当有RFID卡进入到读卡器的读卡范围内时,若RFID卡为有效卡便会在执行开门操作的同时在液晶上显示正确信息;若不是有效卡则在报警的同时在液晶上显示错误信息。当通过键盘输入密码后,系统会判断密码的有效性,若是有效密码则开门并在液晶上显示正确信息;若无效则报警并显示错误信息。整个系统完成。本系统能在打开电源并运行上位机后,能自动向下位机发送读卡命令,当有RFID卡进入到读卡器的读卡范围内时,则会自动读取卡序列号,并将卡序列号传送给上位机,上位机判断卡的有效性。若该卡是有效卡,系统会执行开门并在液晶上显示正确的信息;若该卡是非法卡,则会报警并显示错误的信息。本系统能够有效、方便、安全地控制重要场所的出入访问,具有可靠性高、保密性强、方便快捷等特点。整个系统中数据传输的过程:发送到SDA线上的每个字节必须为8位。每次传输可以发送的字节数量不受限制,每个字节的后面必须跟一个响应位。首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节。可以使用时钟线SCL保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节释放时钟线SCL后,数据传输继续。在一些情况下,可以用与I2C总线格式不一样的格式(例如兼容CBUS的器件)。甚至在传输一个字节时,用这样的地址起始的报文可以通过产生停止条件来终止,此时不会产生响应。数据传输必须带响应,相应的响应时钟脉冲由主机产生。在响应时钟脉冲期间,发送器释放SDA线(高)。在响应的时钟脉冲期间,接收器必须将SDA线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。当然,必须考虑建立和保持时间。当从机不能响应从机地址时(例如它这在执行一些实时函数不能接收或发送),从机必须使数据保持高电平。主机然后产生一个停止条件终止传输或者产生重复起始条件开始新的传输。如果从机—接收器响应了从机地址但是在传输了一段时间后不能接收更多数据字节,主机必须再一次终止传输。这个情况用从机在第一个字节后没有产生响应来表示。从机使数据线保持高电平,主机产生一个停止或重复起始条件。如果传输中有主机接收器,它必须通过在从机产生时钟的最后一个字节不产生一个响应,向从机—发送器通知数据结束。从机—发送器必须释放数据线,允许主机产生一个停止或重复起始条件。所有的主机在SCL线上产生它们自己的时钟来传输I2C总线上的报文。数据只有在时钟的高电平周期有效。因此,需要一个确定的时钟进行逐位仲裁。同步时钟通过线与连接I2C接口到SCL线来执行。这就是说:SCL线的高到低切换会使器件开始数它们的低电平周期,而且一旦器件的时钟变低电平,它会使SCL线保持这种状态直到到达时钟的高电平。但是,如果另一个时钟仍处于低电平周期。这个时钟的低到高切换不会改变SCL线的状态。因此,SCL线被有最长低电平周期的器件保持低电平。因此,低电平周期短的器件会进入高电平的等待状态。当所有有关的器件数完了它们的低电平周期后,时钟线被释放并变成高电平。之后,器件时钟和SCL线的状态没有差别。而且所有器件会开始数它们的高电平周期。首先完成高电平周期的器件会再次将SCL线拉低。这样,产生的同步SCL时钟的低电平周期由低电平周期长的器件决定,而高电平周期由高电平周期最短的器件决定。最后整个系统的搭建就基本完成,此时本系统具体实现的功能如下:1. 数据采集:读卡器ISO/IEC15693通过天线读取RFID卡的数据,然后将数据传送出去。2. 数据分析:AT89C51接收到数据后,将数据传送给AT24C04或上位机,AT24C04或上位机对数据进行分析,从而判断数据的有效性。3. 模块之间的通信:AT89C51与ISO/IEC15693/AT24C04之间的通信都是通过模拟I2C总线进行的,I2C总线的高效性、高实用性、高可靠性数据传输增强了系统的实时性和可靠性。4. 数据处理:针对数据的采集和分析的结果做出相应的处理,例如显示、报警、门控等。五课程设计总结通过两周的课程设计,我对RFID的工作原理已经有熟悉的认识,掌握的有关RFID应用系统开发的基本步骤并且有了深刻的认识。RFID原理及应用在21世纪知识经济时代有着重要的地位。在以各种智能化为背景的前提下,RFID正的得到蓬勃的发展。本次课程设计就是在这个潮流下进行了高频、低频及相关应用设备的系统开发。起初在看到这个课设的时候我几乎毫无头绪,不过通过前期的关于RFID的的基础实验和不断的在网上和图书馆查阅资料,使我对RFID的基本原理与应用和门禁系统的设计有了一个大体的思路,对其中涉及到的知识也进行了学习和模仿。在一开始,我遇到了一些问题,解决这些问题的办法就是去图书馆查阅有关资料,或上网查阅有关信息,或请教老师,终于按时完成了本次课程设计。这次课设不仅考察了我们对课堂上所学的专业知识的理解程度,也锻炼了我们的动手能力。提高了我独立思考问题,解决问题的能力。从总体看,我觉得这次课设是我自身的知识丰富了不少,但同时也发现了自己的不足之处。例如在动手方面和知识的融合方面,不能很好的与实践相结合。软件操作不够熟练。使我明白了要先学好理论知识才能很好的与实践相结合,才能熟练的运用到生活中。六参考文献1.陈国栋.基于射频识别技术的门禁系统研究与设计[D].中南大学,2005.01.012.黄菊生.基于智能IC卡的网络门禁系统设计与开发[D].湖南大学,2003.10.103.游战清,李苏剑,张益强等.无线射频识别技术(RFID)理论与应用[M].北京:电子工业出版社,20044.安静宇.基于非接触式IC卡门禁系统的设计[D].西安科技大学,20065.康行健.天线原理与设计[M].国防工业出版社,1998.65-736.韩瑜,焦小澄.高效的LCD模块显示程序设计方法.计算机工程与应用.2004,22(1):123-1267.董蕴华,郑先锋.基于RFID技术的无线门禁系统的设计[J].通信技术2009.8.李刚,曾锐利,林凌.基于射频识别技术的智能交通系统[J].信息与控制,2006,35(5):555-5599.贾林.射频识别技术(RFID)及其在物流交通领域的应用[J].交通世界,2005(10):50-53.10.查振元,朱华炳.电子门禁系统组成[J].机电产品开发与创新,2003.11.李朝清.PC机及单片机数据通信技术[M].北京:北京航空航天大学出版社,2000.10-22,33-60附录:(界面显示子程序)//CardRead.cpp:实现文件#include"stdafx.h"#include"HFExample.h"#include"CardRead.h"#include"EmployeeAdd.h"#include"Selector.h"#include<mmsystem.h>//CCardRead对话框IMPLEMENT_DYNAMIC(CCardRead,CPropertyPage)CRITICAL_SECTIONm_cs;CCardRead::CCardRead() :CPropertyPage(CCardRead::IDD) ,m_readeraddr(_T("2")) ,m_modsel(0){}CCardRead::~CCardRead(){}voidCCardRead::DoDataExchange(CDataExchange*pDX){ CPropertyPage::DoDataExchange(pDX); DDX_Text(pDX,IDC_EDIT_READERADDR,m_readeraddr); DDX_Control(pDX,IDC_LIST2,m_listtags); DDX_Radio(pDX,IDC_RADIO1,m_modsel);}BEGIN_MESSAGE_MAP(CCardRead,CPropertyPage) ON_BN_CLICKED(IDC_BTN_CONNECTTOREADER,&CCardRead::OnBnClickedBtnConnecttoreader) ON_BN_CLICKED(IDC_BTN_CARDREAD,&CCardRead::OnBnClickedBtnCardread) ON_NOTIFY(NM_RCLICK,IDC_LIST2,&CCardRead::OnNMRclickList2) ON_COMMAND(ID_32771,&CCardRead::On32771) ON_BN_CLICKED(IDC_BTN_LISTEMPTY,&CCardRead::OnBnClickedBtnListempty)END_MESSAGE_MAP()//CCardRead消息处理程序voidCCardRead::OnBnClickedBtnConnecttoreader(){//TODO:在此添加控件通知处理程序代码 CWaitCursorwc; UpdateData();if(m_readeraddr.IsEmpty()) { AfxMessageBox(TEXT("请输入读写器地址"),MB_ICONINFORMATION,0); return; } LPTSTRp=m_readeraddr.GetBuffer(); charccommno=*p; m_readeraddr.ReleaseBuffer(); CStringt; GetDlgItem(IDC_BTN_CONNECTTOREADER)->GetWindowText(t); if(TEXT("连接")==t) {if(m_modsel!=m_presel) { if(!SetConfigInfo("HFExample",m_modsel)) TRACE("SetHFExampleConfiginfoERR\n"); } DWORDnewcom; newcom=_tcstoul(m_readeraddr,NULL,10); if(newcom!=m_precom) { if(!SetConfigInfo("HFExampleCom",newcom)) TRACE("SetHFExampleComConfiginfoERR\n"); } if(m_modsel==0) //网关模式 { TCHAR_comm[10]={0}; _stprintf_s(_comm,9,TEXT("COM%c"),ccommno); CSelectorseler(_comm); if(!seler.SelHF()) { AfxMessageBox("HF模块未准备好",MB_ICONSTOP,0); return;} } if(!m_preader->ConnectToReader(m_readeraddr)) { AfxMessageBox("连接失败",MB_ICONSTOP,0); return; } GetDlgItem(IDC_BTN_CONNECTTOREADER)->SetWindowText(TEXT("断开")); GetDlgItem(IDC_BTN_CARDREAD)->EnableWindow(TRUE); GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO2)->EnableWindow(FALSE);} else { if(m_preader->DisConnectFromReader()) { GetDlgItem(IDC_BTN_CONNECTTOREADER)->SetWindowText(TEXT("连接")); GetDlgItem(IDC_BTN_CARDREAD)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(); GetDlgItem(IDC_RADIO2)->EnableWindow(); } }}BOOLCCardRead::OnInitDialog(){ CPropertyPage::OnInitDialog();//TODO:在此添加额外的初始化 //TagsList m_listtags.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); m_listtags.InsertColumn(0,TEXT("#")); m_listtags.InsertColumn(1,TEXT("ID")); m_listtags.InsertColumn(2,TEXT("Cnt")); m_listtags.InsertColumn(3,TEXT("姓名")); CRectrect4; m_listtags.GetClientRect(rect4);//获得当前客户区信息 m_listtags.SetColumnWidth(0,rect4.Width()/10);//设置列的宽度。 m_listtags.SetColumnWidth(1,5*rect4.Width()/10); m_listtags.SetColumnWidth(2,rect4.Width()/10); m_listtags.SetColumnWidth(3,3*rect4.Width()/10); m_hsayhelloevent=CreateEvent( NULL,//nosecurityattributes FALSE,//manual-resetevent? FALSE,//initialstateissignaled? NULL);//objectnotnamed if(NULL==m_hsayhelloevent) TRACE("createeventforsayhellofailed\n"); m_hsayhello=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)sayhello,(LPVOID)this,0,NULL); if(NULL==m_hsayhello) TRACE("createthreadforsayhellofailed\n"); GetDlgItem(IDC_EDIT_READERADDR)->SetWindowText(TEXT("COM1")); GetEPCToName(); if(!GetConfigInfo("HFExample",&m_presel)) { TRACE("GetHFExampleiniErr:"); } else { m_modsel=m_presel; } if(!GetConfigInfo("HFExampleCom",&m_precom)) { m_precom=_tcstoul(m_readeraddr,NULL,10); TRACE("GetHFExampleCominiErr:"); } else { m_readeraddr.Format("%d",m_precom); } m_preader=newCHFReader; if(m_preader==NULL) TRACE(TEXT("CreateHFReaderError\n")); UpdateData(FALSE); InitializeCriticalSection(&m_cs); returnTRUE;//returnTRUEunlessyousetthefocustoacontrol //异常:OCX属性页应返回FALSE}voidCCardRead::OnBnClickedBtnCardread(){//TODO:在此添加控件通知处理程序代码 CWaitCursorwc; CStringt; GetDlgItem(IDC_BTN_CARDREAD)->GetWindowText(t); if(TEXT("开始读卡")==t) { m_listtags.DeleteAllItems(); m_epc.clear(); if(!m_preader->BeginInventory(callback1,this)) TRACE("BeginInventoryerror\n"); GetDlgItem(IDC_BTN_CARDREAD)->SetWindowText(TEXT("停止读卡")); } elseif(TEXT("停止读卡")==t) { if(!m_preader->CancelInventory()) TRACE("CancelInventoryerror\n"); GetDlgItem(IDC_BTN_CARDREAD)->SetWindowText(TEXT("开始读卡")); }}BOOLCCardRead::OnSetActive(){//TODO:在此添加专用代码和/或调用基类 GetEPCToName(); returnCPropertyPage::OnSetActive();}voidCCardRead::GetEPCToName(){ EmployeeInfoArray_t; theApp.getDB().GetAllEmployee(_t); m_epctoname.clear(); for(inti=0;i<_t.GetCount();i++) { CEmployeeInfo&aEmployee=_t.GetAt(i); m_epctoname[aEmployee.GetCardNo()]=aEmployee.GetName(); }}voidCCardRead::OnNMRclickList2(NMHDR*pNMHDR,LRESULT*pResult){//TODO:在此添加控件通知处理程序代码 if(m_currentuser->GetPermission()==ADMINISTRATOR) { NM_LISTVIEW*pNMListView=(NM_LISTVIEW*)pNMHDR; m_curNum=pNMListView->iItem;//对应的行 if(-1!=m_curNum&&m_listtags.GetItemText(m_curNum,3)=="") { CMenu menu; menu.LoadMenu(IDR_MENU_CARDNOADD); CPointpoint; GetCursorPos(&point); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); } } *pResult=0;}voidCCardRead::On32771(){//TODO:在此添加命令处理程序代码 CEmployeeAddemployeeadddlg; CStringt; t=m_listtags.GetItemText(m_curNum,1); employeeadddlg.SetEmployeeCardNo(t); if(IDOK==employeeadddlg.DoModal()) { GetEPCToName(); m_listtags.SetItemText(m_curNum,3,employeeadddlg.m_aEmployeeInfo.GetName()); }}voidCCardRead::SetCurrentUser(CUserInfo*t){ m_currentuser=t;}voidCCardRead::On32772(){//TODO:在此添加命令处理程序代码}voidCCardRead::OnBnClickedBtnListempty(){//TODO:在此添加控件通知处理程序代码 m_listtags.DeleteAllItems(); m_epc.clear();}DWORDCCardRead::sayhello(LPVOID_t){CCardRead*cc=(CCardRead*)_t; DWORDret=cc->sayhellofun(); returnret;}DWORDCCardRead::sayhellofun(){ while(1) {if(m_queuename.empty()) {Sleep(100); continue;} EnterCriticalSection(&m_cs); SayThreaParam¶m=m_queuename.front(); CTimetimen=param.ttime; CString_t=param.str; CTimetimea(timen.GetYear(),timen.GetMonth(),timen.GetDay(),8,30,0), timep(timen.GetYear(),timen.GetMonth(),timen.GetDay(),17,30,0); CStringfilepath; if(timen<=timea) filepath="a\\"; elseif(timen>=timep) filepath="p\\"; else filepath="x\\"; CStringfilename=filepath+_t+CString(TEXT(".wav")); LeaveCriticalSection(&m_cs); BOOLbwelldone=PlaySound(filename,NULL,SND_SYNC|SND_FILENAME); EnterCriticalSection(&m_cs); m_queuename.pop(); LeaveCriticalSection(&m_cs);} return0;}voidCCardRead::callback1(std::vector<UINT8>_e1,std::string_e2,void*_t){CCardRead*p=(CCardRead*)_t; p->callbackfun1(_e1,_e2);}DWORDCCardRead::callbackfun1(std::vector<UINT8>_e1,std::stringt){CCardRead*m_test=this; TRACE("id:%s\n",t.c_str()); CTimetimen=CTime::GetCurrentTime(); if(-1==theApp.getDB().AddCardRead(t.c_str())) {TRACE("插入读卡数据失败\n"); Beep(750,1000);} else {CStringname; std::map<CString,CString>::iterator_iter; _iter=m_epctoname.find(t.c_str()); if(_iter!=m_epctoname.end()) {name=m_epctoname[t.c_str()]; EnterCriticalSection(&m_cs); SayThreaParamparam; param.str=name; param.ttime=timen; m_queuename.push(param); LeaveCriticalSection(&m_cs);} TTagEPCnember; std::map<CString,TTagEPC>::iteratoriter; iter=m_epc.find(t.c_str()); if(iter==m_epc.end()) {inti=m_listtags.GetItemCount(); CStringtt; tt.Format(TEXT("%d"),i); nember.idx=i; nember.epcdata=_e1; m_epc.insert(std::map<CString,TTagEPC>::value_type(t.c_str(),nember)); m_listtags.InsertItem(i,tt); m_listtags.SetItemText(i,1,t.c_str()); m_listtags.SetItemText(i,2,TEXT("1")); std::map<CString,CString>::iterator_iter; _iter=m_epctoname.find(t.c_str()); if(_iter!=m_epctoname.end()) {m_listtags.SetItemText(i,3,m_epctoname[t.c_str()]);}} else { CStringtt; inti; nember=iter->second; m_test->m_listtags.GetColumnWidth(1); tt=m_listtags.GetItemText(nember.idx,2); i=(int)_tcstoul(tt,NULL,10); tt.Format(TEXT("%d"),++i); m_listtags.SetItemText(nember.idx,2,tt); } } return0;}目录TOC\o"1-2"\p""\h\z\u第一章总论 11.1项目概况 11.2研究依据及范围 31.3主要技术经济指标 41.4研究结论及建议 4第二章项目建设的背景和必要性 62.1项目建设的背景 62.2项目建设的必要性 8第三章项目服务需求分析 11第四章项目选址与建设条件 13HYPERLINK\l"_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论