【《基于STM32的智能家居门禁系统设计》13000字(论文)】_第1页
【《基于STM32的智能家居门禁系统设计》13000字(论文)】_第2页
【《基于STM32的智能家居门禁系统设计》13000字(论文)】_第3页
【《基于STM32的智能家居门禁系统设计》13000字(论文)】_第4页
【《基于STM32的智能家居门禁系统设计》13000字(论文)】_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

[25](4)安全性安全的重点为防止盗窃,在IC卡出厂时,IC卡会有一个唯一的卡号,因卡号是唯一的,无法进行更改,如发生更改就必须要破坏卡的本体,将芯片从卡里取出后进行更改卡号。且读写前,射频IC卡与读卡器之间会有3次的应答认证,这可以有效的防止各种破解和篡改卡号的行为。这就保证了卡的安全性。二系统方案2.1方案论证当今社会,人们对门禁系统的要去在不断的提高,门禁系统的应用也越来越广泛,从以前的插卡登记到普通的磁卡再到现在的智能IC卡,以至于现在最新的门牌,卡牌在越做越小,这也是为了保证便携性的同时,增大安全性,通过这个科学技术,我们可以大大防止罪犯从光明正大的途径侵入,制止了犯罪的产生,正是因为访问门禁控制系统具有很强的实用性并被广泛使用。所以此次便选择这个门禁系统作为研究的课程题目,并实现了非接触式IC卡的读写,从而使RC522读卡器成为能准确读取IC卡的序列号,REF_Ref29901\r[27]并控制电磁阀进行解锁。2.2方案选择访问门禁控制系统有两种主要方案,即网络类型和非网络类型。射击频率IC卡使用MIFARE1s50非接触式智能IC卡。通信协议符合ISO/IEC14443A通信层(即MIFARERF接口),它还能符合ISO/IEC14443A标准的第二部分和第三部分。2.3工具简介系统单片机代码使用C语言进行编写,Proteus做为仿真环境,AD10(AltiumDesigner10.0)作为原理图的画图工具软件。2.3.1C语言C语言是一种通用的编程语言,它是面向计算机的编程语,C语言的优点为比汇编语言迅速,工作量较小、可读取的性能较强,易调试、修改,适用范围广,可以在DOS、UNIX上运行,但是C语言也存在一些弊端,列如数据封装的安全性不好。2.3.2Proteus仿真环境单片机的学习中,我们不能全程使用真的单片机进行试验,这样会消耗大量的资金,所以我们使用Proteus的仿真来对单片机试验进行模拟操作,我们可以从组件库里调用元器件,在操作界面上进行仿真连线。Proteus的优点即可以随时修改。2.3.3AltiumDesigner10AltiumDesigner10.0(下文简称AD10)10.0(以下简称AD10)是专业的电路板软设计软件该软件集成了板级和FPGA系统设计,基于FPGA的离散处理嵌入式软件开发和PCB布局设计,设备的编辑和制造。同时,该软件可编译原理图设计,电路仿真和PCB图。逻辑,拓扑逻辑自动路由,信号完整性分析和设计输出等技术已完美集成。REF_Ref30342\r[29]REF_Ref30346\r[30]三基础电路设计3.1STM32单片机单片机是我们经常说的小型电子计算机,常常用于某些控制领域,是微电子以及微型计算机中最主要的一部分。单片机主要由单片集成电路组成。单片机包含CPU处理芯片,即中央处理单元,IO接口和存储器。我们只需要用对应的编译器和烧写程序即可以实现内外的数据传输,即将计算机中写入的代码烧写至单片机中。对单片机的选型设计是以STM32F103C8T6单片机。此单片机为核心板,有40个可用引脚进行输出,另外还有程序的下载口以及单片机的独立供电电源口,此次设计中采用的核心贴片版本的单片机和51系列相比多了一些功能,它的运行速度不仅比51单片机快,而且还带有2个AD转换模块。STM32微控制器是一种低电压,高性能微处理器,具有可快速擦除的字节。它非常简单,方便并且易于使用。它广泛应用于医疗机构和工业生产中的实时控制,停车场,计算机外围设备和通信设备等各个领域。且STM32具有强大的通信和控制功能。这是51个单片机无法比拟的。51MCU只有一个进行通信的串行端口,与此相对,通信有五个串行端口,而一些在通信中需要串行端口的模块不需要使用CD4052等双串行端口模块进行转换,因此在市场上很广泛由于32MCU可以在各种时钟模块上工作,因此具有高功耗要求的产品存在空间。以下为STM32单片机的参数及特点:(1) STM32C8T6系列的起振晶部分采用了RTC,低负载的方式,而没有像传统的比较廉价的圆柱晶振。(2)引脚个数48个。(3) 工作频率72MHZ。(4) 单片机具有3个普通定时器以及1个高级定时器。(5) 单片机具有2个2位/16通道的ADC模数转换器。(6) 单片机使用的3.3V稳压芯片,可以保证最大输出电流为300mA。(7) 支持ST-LINK和JTAG调试下载。(8) 存储资源为64kbbyteFLASH和20byteSram。图2STM32实物图(9)电源指示灯LED(PWR通常为红色):如果电源指示灯亮起,则表示微控制器正在正常运行。如果它是黑暗或闪烁,则表示微控制器可能有故障。(10)用户LED(PC13):这个功能的使用大大的方便了我们进行一些比较简单的功能测试,如单片机的运行状态等,方便初学者进行更好的测试。(11)单片机上采用了跳帽的方式,我们可以对stm32进行3种编程方式。如用户的SARM、闪存和系统的存储器。(12)RESRT为单片机的复位按钮。(13)8M晶振:主要是用于设置单片机系统的频率为72MHZ。(14)32.768KHz晶振:可供内置RTC使用,避免了需要专门的时钟芯片进行定时器处理等。该STM32在AD10中所呈现的管脚图为图3STM32F103引脚图3.21602字型LED本设计中采用HJ1602A工业字符型的液晶,能够同时显示16x2即32个字符。(16列2行)。在单片机系统中应用晶液显示器作为输出器件有以下几个优点REF_Ref184\r[30]:由于液晶显示器的每一个点在收到信号后就会一直保持那种色彩和亮度,一直发光发亮,而不像阴极射线管显示器(CRT)那样需要不断刷新新的亮点。因此,液晶显示器的画质高而且不会闪烁REF_Ref709\r[31]REF_Ref892\r[32]。由于液晶显示器都是数字显示器,因此与微控制器系统的接口更简单,更可靠,操作更方便。液晶显示器通过控制显示屏上电极上的液晶分子的状态来达到显示的目的,并且其重量比具有相同显示面积的传统显示器轻得多。相对而言,液晶显示器的功耗主要消耗在其内部电极和驱动IC上,因此其功耗要比其他显示器少得多。字符型液晶显示模块是一种点阵LCD,专门用于显示字母,数字,符号等。目前,通常使用16*1,16*2,20*2和40*2线的模块。一般,1602LCD有带背光和不带背光的两种,而带背光的比不带背光的要厚,具体LCD尺寸的如图所示:图4LCD尺寸图显示容量芯片工作电压工作电流模块最佳工作电压字符尺寸16*2个字符4.5-5.5V2.0mA(5.0V)5.0V2.95*4.35(WXH)mm表1LCD主要技术参数1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表所示:编号符号引脚说明编号符号引脚说明1VSS电源地9D2DataI/O2VDD电源正极10D3DataI/O3VL液晶显示偏压信号11D4DataI/O4RS数据/命令选择端(H/L)12D5DataI/O5R/W读/写选择端(H/L)13D6DataI/O6E使能信号14D7DataI/O7D0DataI/O15BLA背光源正极8D1DataI/O16BLK背光源负极表2LCD各引脚说明3.38050蜂鸣器图58050蜂鸣器结构图因此设计是stm32单片机,单片机上电后引脚是高组态,所以我们不可以使用8550,由于8550在低电平时导通,而8050在高电平时导通,因此当我们希望蜂鸣器报警时,我们给晶体管一个高电平来实现蜂鸣器报警REF_Ref3057\r[34]。三极管本身具有的作用是放大电流(放大200倍)加1k电阻是为了进行限流。因为声音的频率范围基本上是十赫兹到几千赫兹,所以该程序可用于控制单片机某个端口的“高”或“低”电平。警报电路是使用蜂鸣器的警报电路,类似于家用电器喇叭中的使用方法。通常情况下,工作电流比较大,电路上的TTL电平基本上不能驱动蜂鸣器,因此需要增加一个电流放大电路,因为该引脚很难驱动蜂鸣器发出声音,因此为了使蜂鸣器通过以增加电流,将添加一个三极管。蜂鸣器正极性的一端与5V电源连接,另一端与三重体的集电极连接。三极管的一极由通过与门相连。引脚低时,“与”门输出高电平,三重奏开启,让蜂鸣器电流形成环路并发出声音。当引脚为高电平时,与门输出低电平,晶体管停止,并且蜂鸣器不发声。3.4RC522硬件介绍基于RC522的读卡器主要由MFRC522,微处理器,天线和相应的外围电路组成。读卡器通过天线发射能量以形成电磁场。电磁场用于识别卡内的线圈和芯片。形成的磁场是可以由射频卡识别的可读和可写区域REF_Ref5291\r[10]。所以因为这样,我们所使用的天线必须能在尽可能大的范围里产生我们所要的电磁场。由于MFRC522的工作频率为13.56MHz,13.56MHz属于短波段,因此我们使用环形天线。对于匝数为M,半径为R,电流强度为I的圆形天线,距中心x处的磁场强度可以表示为。四软件的设计有了硬件,但是必须在有软件的基础上才能成功运行,程序也是遵循着模块化的原则,明确任务后,一级一级的逐级分化下去,我们只需要制定出分步的计划,最后将其综合,即可得到基本的总程序。所以,制定出基础的主程序流程图,如图所示。图6主程序流图当点击开始键时,首先会检测注册按键是否按下,如果按下,进入注册卡的模式,如有空白卡进行注册,则正常录入,如未检测到注册键按下,则进入下一步;第二步会检测删除卡按键是否按下,如果按下,进入删卡模式,如有卡放在RC522附近,则删除该卡内的数据,如未检测到RC522附近有卡,则进入下一步;第三步进入门禁系统,当进入门禁系统时,RC522检测是否有卡进行刷卡操作,如有卡,进行检测该卡是否合法,如没有卡或者卡显示为非法卡,蜂鸣器工作;第四步,当检测到卡为合法卡后,电磁阀进行模拟开门。等待数秒后返回开始步。等待下一次操作。五各部分流程图5.11602LED流程图LCD1602在3.5V〜5V的工作电压下工作,其内部复位电路旨在移动光标并清除屏幕。显示屏的亮度可以通过外部连接的电位计进行调节。内部存储器可以存储数据。它可以直接与单片机连接,并且可以通过单片机程序控制LCD的显示。LCD1602有16个引脚,其中RS和RW的值控制对单片机的读写:RSRW操作命令00写入指令寄存器(清清屏等)01读busy(DB7),以及读取位址计数器(DB0—DB6)的值10写入数据寄存器(显示各字符等)11从数据寄存器读取数据表3LCD工作状态介绍LCD1602液晶在执行程序指令之前显示模块标志位的忙信号。只有当其标志位为低时,它才表明该指令可以执行。图7LCD流程图LCD的流程图如图所示,第一步从入口进入,初始化LCD1602,进行延时操作,检测是否有忙信号,检测后进行判断,如不检测忙信号,则会获得现实的RAM地址;如要进行检测忙信号,则返回检测忙信号操作。获得现实RAM地址后,进入延时系统,写出数据,最后返回,回到初始状态,等待下一次操作。5.2RC522流程图图8RC522流程图RC522检测为:当进入子程序后,LM1117降压供电进行工作,RFID接收器进行数据采集,采集到数据后,将数据传入单片机后,单片机进行计算,计算后存储数据,之后将存储的数据与原数据进行对比,之后控制门禁电磁阀是否打卡,最后完成此次操作,等待进行下一次操作。5.3蜂鸣器报警流程图图9蜂鸣器报警流程图蜂鸣器检测为:当进入报警程序入口后,判断是否符合触发报警的条件,如符合,则向单片机输出低电平,使得蜂鸣器报警;如不符合报警条件,则回到报警程序入口。当单片机输出低电平触发蜂鸣器报警后,报警后完成此次操作,等待进行下一次操作。5.4按键的流程图图10按键流程示意图按键的流程为:当进入按键部分子程序后,检测是否按下按键,如果未按下按键,重新进入检测是否按下按键步骤,如果按下进入按键设置函数,单片机调用按键设置的图像在LCD1602上显示,最后返回源程序,等待下一次操作。六系统分析与调试6.1电路板件的焊接通常情况下,如果单片机无法正常运行,基本上除去软件问题(即编程错误)就只剩下硬件问题了,而造成硬件错误的原因首先我们就会考虑到焊接的问题,也就是说焊接的好和焊接的不好直接影响到了是否能正常运行。而造成焊接质量问题的原因又主要分为:(1)焊料量太大,形成的焊点太大;焊料量太小,无法覆盖焊点。(2)冷焊,当烙铁的温度不足以融化焊丝或者市加热温度不足时。焊锡丝未熔化,导致焊锡表面不光滑,而且会有细小的裂纹或者是焊接表面不光滑。(3)松香用于焊接,因为在焊接时,在原始焊料和电路板之间混合了一层松香,导致电路无法正常连接。如果使用加热不充分的松香进行焊接,则焊点下方将出现黄褐色的松香膜。如果加热,会在焊点上产生碳化的松香膜。如果发生上述情况,则需要使用焊接设备清除杂质。物体被吸走,然后再次进行焊接。(4)焊锡连桥,当使用焊锡的量过多时或时电烙铁表面残存有大量的焊锡时,会使得需要精细焊接的部分出现元器件焊点之间的短路,这在焊接较小电路时尤为需要注意。(5)助焊剂用量过多时,如果使用过多的松香,烙铁头上会残留少量的松香。此时,我们需要使用烙铁再次加热松香以使松香挥发,或使用无水酒精。用棉球擦拭以去除多余的松香和助焊剂。6.2电路板的调试最小系统如若无法工作,应当优先考虑电源电压是否正常,电源电源正常状态应为5V左右。第二就是测量复位引脚电压,EA引脚电压正常状态下也为5V左右。如果维修电源后最小系统仍然无法正常工作,则STM32单片机可能出现故障。因为我们选择的STM32F103是一款贴片型单片机,所以有必要整体上取代最小的系统。如果它是STM32单片机,但不能根据所需功能执行功能,则也可以选择更换单片机以完成调试,但在此之前,请确认是否是焊接问题。七结论及总结经过近3个月的努力,在老师和同学们的讨论和帮助下,我完成了此次的设计任务,通过此次设计,我认识到了自学的重要性还有学以致用的道理。老师在课堂上讲解的课程需要反复消化,最终变成自己的。本设计是采用STM32F103单片机为核心,制造一个门禁系统,虽然现在门禁系统已经普及到了每个小区,甚至每栋楼层都安装上了门禁系统,所以我认为此课题也应该进入大众视野,作为本专业的学生,我们也应该学会该门禁系统中所包含的程序。本设计主要分为硬件部分和软件部分,硬件部分我们尽可能的考虑硬件的简单性,简化硬件的电路,节约成本,以达到硬件成本的最低化。软件部分采用C语言编程,采用模块化设计,一步一步的联调,实现设计要求,当有卡放到识别区域时,我们会通过读卡器读取到卡的序列码,而厂家设计的序列码也是世界上唯一的,拥有唯一性。读到的序列码如已经注册,则会正常的控制电磁阀达到开门的效果,若序列码不正确,门禁会显示卡的序列码,判别卡号错误。通过试验证明了,该设计的符合设计要求,能实现对门禁的控制,功能性较强,具有实践意义,会运用到许多场合。本次毕业设计也让我学会了许多,对于收集资料,确定方案的过程中,我也学会了许多新的知识,正所谓学海无涯,也是通过此次设计,我对以前的一些不懂的地方也进行了重新学习,让我所学的知识得到了升华,这也对我未来的发展起到了重要的作用。参考文献陈国栋.基于射频识别技术的门禁系统研究与设计[D].硕士论文长沙:中南大学,2005:15-36.黄菊生.基于智能IC卡的网络门禁系统设计与开发[D].硕士论文长沙:湖南大学,2003:69-95.游战清,李苏剑,张益强等.无线射频识别技术(RFID)理论与应用[M].北京:电子工业出版社,2004:95-121.安静宇.基于非接触式IC卡门禁系统的设计[D].西安科技大学,2006:12-45.韩瑜,焦小澄.高效的LCD模块显示程序设计方法[J].计算机工程与应用.2004,22(1):123-126.汤竞南,沈国琴.51单片机C语言开发与实例[M].北京:人民邮电出版社,2008:1-4,89-95.赵妍妮.I2C总线的单片机C语言实现及应用[J].微机发展,2001,12(4):172-174.李科让.一种实用的非接触式IC卡读写器的设计[J].微型机与应用,2001年9期:15~16荆晓莉,郭生骁.基于MFRC500的门禁控制系统设计信息技术[J].信息技术,2014年10期:206~210吴刚.非接触式IC卡读卡器的设计与开发[D].硕士学位论文.北京:北京化工大学,2003严雄武.基于Mifare非接触式IC卡的射频识别系统研究与实现[D].武汉:武汉理工大学,2006汪国海.非接触式IC卡读卡器的设计[D].硕士学位论文.四川:电子科技大学,2005王爱英.智能卡系统(第四版)[M].北京:清华大学出版社,2015:208~284PhilipsSemiconductors,MIFAREStandardCardICMF1ICS50FunctionalSpecification张凤涛.基于单片机技术的非接触式IC卡考勤机设计研究[J].河南科技,2013年1期:1王文强.便携式非接触式IC卡读写器的设计[J].现代电子技术,2009年18期:17~19、24马晓颖.射频ICMFRC522在智能仪表中的应用[J].国外电子元器件,2008年5期:57~60沈宇超,沈树群,樊荣.射频识别系统中通信协议的模块化设计[J].通信学报,2001年2期:54~58周立功.MFRC522中文资料_百度文库[EB/OL].(2007.01)./view/4d5b2ceb680203d8cf2f241b.html文治洪,胡文东,李晓京等.基于PL2303的USB接口设计[J].电子设计工程.2010年1期:32~34长沙太阳人电子有限公司[CHANGSHASUNMANELECTRONICSCO.,LTD].SMC1602ALCM使用说明书基于RC522的非接触式IC卡读卡器设计(含程序)-《互联网文档资源()》基于RC522的非接触式IC卡读卡器设计(含程序)解析-豆丁网-《互联网文档资源(/p%2D1923800464.html)》-基于RC522的非接触式IC卡读卡器设计(含程序)-豆丁网-《互联网文档资源(/p-1959896064.html)》-基于RC522非接触式IC卡读卡器设计含程序-豆丁网-《互联网文档资源/c?m=9f65cb4a8c8507ed4fece763105392230e54f73561868b4968d4e419ce3b4603506695bb26291a07d0c57c6600b84大学生论文联合库何苗-《大学生论文联合库》-2017大学生论文联合库杨子健-《大学生论文联合库》-2017大学生论文联合库庞海艳-《大学生论文联合库》-2017大学生论文联合库sun-《大学生论文联合库》-2017大学生论文联合库456-《大学生论文联合库》-2017实现集成化制造的多功能机床辅助控制器的系统设计焦楠楠-《吉林大学硕士论文》-2005大学生论文联合库七七-《大学生论文联合库》-2017汽车超速报警系统设计-豆丁网null-《网页》附录附录1硬件框图RFID射频通信RFID门禁卡门禁卡读卡器模块RC522模块液晶(显示卡号和刷卡状态)EEPROM(存储门禁卡号)设置模式按键(注册门禁卡)MCUSTM32作为主控制器门锁控制电路(继电器)报警控制电路(蜂鸣器)+5V主供电(USB供电)RFID射频通信RFID门禁卡门禁卡读卡器模块RC522模块液晶(显示卡号和刷卡状态)EEPROM(存储门禁卡号)设置模式按键(注册门禁卡)MCUSTM32作为主控制器门锁控制电路(继电器)报警控制电路(蜂鸣器)+5V主供电(USB供电)附录2程序清单附2-1main主程序清单#include<stdio.h>#include"GPIO.h"#include"LCD1602.h"#include"delay.h"#include"sys.h"#include"stdio.h"#include"usart.h"#include"timer.h"#include"string.h"#include"stmflash.h"#include"rc522_config.h"#include"rc522_function.h"typedefunsignedcharuchar;#defineFLASH_SAVE_ADDR0X0801F000 //设置FLASH保存地址(必须为偶数)#defineSIZE10#defineMAX_PEOPLE10//最大存储10张IC卡u8RC522_SCAN(u8*BUF);u8ADD_ID_MODE(void);u8DEL_ID_MODE(void);u8COMPER_ID_MODE(void);voidCHECK_NEW_MCU(void);//检查是否是新的单片机,是的话清空存储区,否则保留voidCLEAR_ALL_MES(void);voidWRITE_DATA_TO_FLASH(u8*ID_Buffer,u8space);voidREAD_DATA_FOR_FLASH(u8*ID_TEMP_Buffer,u8space);u8ID_BUF[8],ID_TEMP_Buffer[10];//ID_TEMP_Buffer注册过的卡号u8ucArray_ID[4];//存放IC卡号u8RELAY_TIME;u8KEY_Scan(void){ u8res=0,time_count=0; if((KEY1==0||KEY2==0||KEY3==0)) { delay_ms(10);//去抖动 if((KEY1==0||KEY2==0||KEY3==0)) { if(KEY1==0)res=1; elseif(KEY2==0)res=2; elseres=3; if(res==3) { while(!KEY3&&time_count<=200) { time_count++; delay_ms(10); } if(time_count>=200)res=4; } while(((KEY1==0||KEY2==0||KEY3==0))); } } returnres;}intmain(void){ u8stauts=1,key; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//把B3,B4,A15配置成普通IO口 delay_init(); //延时函数初始化 KEY_GPIO_Init();//按键初始化 RELAY_INIT(); BEEP_DISENABLE(); delay_ms(100);//上电瞬间加入一定延时在初始化 LCD_Init();//屏幕初始化 LCD_Write_String(0,0,"PleaseBushCard");CHECK_NEW_MCU(); TIM2_Init(1000-1,719);//以100Hz计数720000/72=10000us=10ms //Tout=((arr+1)*(psc+1))/Tclk; //Tclk:定时器输入频率(单位MHZ) //Tout:定时器溢出时间(单位us) UART1_INIT((u32)9600);RC522_Init(); PcdReset();//复位RC522 M500PcdConfigISOType('A');//设置工作方式 while(1) { if(key==1)stauts=!stauts;//状态切换 if(stauts)//在正常界面下 key=COMPER_ID_MODE();//正常待机刷卡函数 else//在设置界面下 { key=2; while(key!=1) { switch(key) { case2:key=ADD_ID_MODE();break;//添加卡 case3:key=DEL_ID_MODE();break;//删除卡 case4:CLEAR_ALL_MES();key=2;break;//清空存储卡号 default:break; } } } }}voidCHECK_NEW_MCU(void)//检查是否是新的单片机,是的话清空存储区,否则保留{ u8comper_str[6],i=0; u8clear_str[10]={0}; memset(clear_str,'0',sizeof(clear_str));//把clear_str这个数组全部清‘0’ STMFLASH_Read(FLASH_SAVE_ADDR+0x10*MAX_PEOPLE,(u16*)comper_str,5);//从0X0801F0A0这个地址读出数据 comper_str[5]='\0'; if(strstr(comper_str,"FDYDZ")==NULL)//新的单片机 { for(i=0;i<MAX_PEOPLE;i++)//把存卡内部缓存全部清零 { WRITE_DATA_TO_FLASH(clear_str,i); } STMFLASH_Write(FLASH_SAVE_ADDR+0x10*MAX_PEOPLE,(u16*)"FDYDZ",5);//写入“FDYDZ”,方便下次校验 }}voidWRITE_DATA_TO_FLASH(u8*ID_Buffer,u8space)//数据写入STM32内部FLASH{ STMFLASH_Write(FLASH_SAVE_ADDR+0x10*space,(u16*)ID_Buffer,SIZE);delay_ms(100);//内部FLASH寿命不长,防止误操作反复擦鞋}voidREAD_DATA_FOR_FLASH(u8*ID_TEMP_Buffer,u8space)//从STM32内部FLASH读出数据{ STMFLASH_Read(FLASH_SAVE_ADDR+0x10*space,(u16*)ID_TEMP_Buffer,SIZE); //printf("%s",datatemp);}u8RC522_SCAN(u8*BUF){ staticu8i=0; switch(i) { case0:LCD_Write_String(0,1,"()");break; case1:LCD_Write_String(0,1,"(())");break; case2:LCD_Write_String(0,1,"((()))");break; case3:LCD_Write_String(0,1,"(((())))");break; case4:LCD_Write_String(0,1,"((((()))))");break; case5:LCD_Write_String(0,1,"");break; default:i=0;break; } i++; if((GET_PID(ucArray_ID)==MI_OK))//获取RC522卡号 { sprintf(BUF,"%02X%02X%02X%02X",ucArray_ID[0],ucArray_ID[1],ucArray_ID[2],ucArray_ID[3]);//把IC卡号以字符串的形式拷贝到BUF中 return1; } return0;}voidCLEAR_ALL_MES(void)//清空存储卡号{ u8i=0; LCD_Clear(); LCD_Write_String(0,0,"Clearing");//显示清空信息 sprintf(ID_TEMP_Buffer,"%02X%02X%02X%02X%d",0,0,0,0,0);//ID_TEMP_Buffer缓存全部写入0 for(i=0;i<MAX_PEOPLE;i++) { WRITE_DATA_TO_FLASH(ID_TEMP_Buffer,i); }}u8COMPER_ID_MODE(void)//正常待机刷卡函数{u8key; LCD_Write_String(0,0,"ComperICMODE");while(1) { key=KEY_Scan();//获取按键值 if(RC522_SCAN(ID_BUF))//检测到有卡刷入 { u8i=0; LCD_Write_String(0,1,"IC:"); LCD_Write_String(4,1,ID_BUF);//显示卡号 BEEP_ENABLE();//蜂鸣器响 delay_ms(500);BEEP_DISENABLE(); for(i=0;i<MAX_PEOPLE;i++)//从10张IC卡中扫描 { READ_DATA_FOR_FLASH(ID_TEMP_Buffer,i);//读取STM32内部FLASH存储的卡号 if(strstr(ID_TEMP_Buffer,ID_BUF)!=NULL)//查找匹配正确 {RELAY_TIME=3;//继电器开启时间赋值3秒LCD_Write_String(0,1,"dooropen");//显示开门delay_ms(1000); break; } } } if(key)returnkey;} return0;}u8ADD_ID_MODE(void)//注册IC函数{ u8key; LCD_Write_String(0,0,"AddICMODE");while(1) { key=KEY_Scan();//获取按键值 if(RC522_SCAN(ID_BUF))//检测到有卡刷入 { u8i=0; LCD_Write_String(0,1,"IC:"); LCD_Write_String(4,1,ID_BUF);//显示卡号 BEEP_ENABLE(); delay_ms(500);BEEP_DISENABLE(); for(i=0;i<MAX_PEOPLE;i++)//从10张IC卡中扫描 { READ_DATA_FOR_FLASH(ID_TEMP_Buffer,i);//读取STM32内部FLASH存储的卡号 if(strstr(ID_TEMP_Buffer,ID_BUF)!=NULL)//检测到相同ID break; if(ID_TEMP_Buffer[8]=='0')//ID_TEMP_Buffer第8位是0,说明是没有存储过的XXXXXXXXD break; } delay_ms(1000); if(i==10)LCD_Write_String(0,1,"memeryfull");//IC卡号最多存10张,如果等于10,说明之前存过10张卡了。则不能继续注册IC else { sprintf(ID_TEMP_Buffer,"%s%d",ID_BUF,1);//把IC卡号拷贝到ID_TEMP_Buffer中,第8位存储1,说明卡号被存储 WRITE_DATA_TO_FLASH(ID_TEMP_Buffer,i);//存储到STM32内部FLASH LCD_Write_String(0,1,"saveok!");//显示存储成功 } delay_ms(1000); } if(key)returnkey; } return0;}u8DEL_ID_MODE(void)//删除IC卡函数{ u8key; LCD_Write_String(0,0,"DeleteICMODE");while(1) { key=KEY_Scan();//获取按键值 if(RC522_SCAN(ID_BUF))//检测到有卡刷入 { u8i=0; LCD_Write_String(0,1,"IC:"); LCD_Write_String(4,1,ID_BUF);//显示卡号 BEEP_ENABLE();//蜂鸣器响 delay_ms(500);BEEP_DISENABLE(); for(i=0;i<MAX_PEOPLE;i++)//从10张IC卡中扫描 { READ_DATA_FOR_FLASH(ID_TEMP_Buffer,i);//读取STM32内部FLASH存储的卡号 if(strstr(ID_TEMP_Buffer,ID_BUF)!=NULL)//找到IC卡号 break; } delay_ms(1000); if(i==10)LCD_Write_String(0,1,"findfail");//扫描10次都没有扫描到要删除的卡号 else { sprintf(ID_TEMP_Buffer,"%02X%02X%02X%02X%d",0,0,0,0,0);//ID_TEMP_Buffer缓存全部写入0 WRITE_DATA_TO_FLASH(ID_TEMP_Buffer,i);//存储到STM32内部FLASH LCD_Write_String(0,1,"Deleteok!");//显示清除成功 } delay_ms(1000); LCD_Write_String(0,0,"DeleteICMODE"); } if(key)returnkey; } return0;}附2-21602显示器程序清单#include"LCD1602.h"#include"delay.h"#include"sys.h"u8Dao_xu(u8data)//数据倒序{u8i=0,temp=0;; for(i=0;i<8;i++) { temp+=(((data>>i)&0x01)<<(7-i)); } returntemp;}/*写入命令函数*/voidLCD_Write_Com(unsignedcharcom){LCD1602_RS=0; //命令 delay_ms(1);LCD1602_RW=0;delay_ms(1); LCD1602_EN=1; delay_ms(1);GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(com));//在不影响A8-A15引脚前提下,把数据写到A0-A7引脚 delay_ms(1);LCD1602_EN=0;}/*写入数据函数*/voidLCD_Write_Data(unsignedcharData){LCD1602_RS=1;//数据 delay_ms(1);LCD1602_RW=0;delay_ms(1); LCD1602_EN=1; delay_ms(1);GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(Data)); delay_ms(1);LCD1602_EN=0;}/*写入字符串函数*/voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s){if(y==0) { LCD_Write_Com(0x80+x);//第一行 }else { LCD_Write_Com(0xC0+x);//第二行 } while(*s)//判断是否检测到结尾符 { LCD_Write_Data(*s);//显示数据 s++;//指针加1 }}/*写入字符函数*/voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData){if(y==0) { LCD_Write_Com(0x80+x);//第一行 }else { LCD_Write_Com(0xC0+x);//第二行 }LCD_Write_Data(Data);//显示数据}/*清屏函数*/voidLCD_Clear(void){LCD_Write_Com(0x01);delay_ms(5);}/**/voidLCD_Init(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOAGPIOBGPIOC时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度50MHZGPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10;//LCD1602RS-RW-EN?GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//输出速度50MHZGPIO_Init(GPIOB,&GPIO_InitStructure);//GPIOC LCD_Write_Com(0x38);delay_ms(5);LCD_Write_Com(0x08);/*显示关闭*/delay_ms(5); LCD_Write_Com(0x01);/*显示清屏*/delay_ms(5); LCD_Write_Com(0x06);/*显示光标移动设置*/ delay_ms(5);LCD_Write_Com(0x0C);/*显示开及光标设置*/ delay_ms(5);}附2-3RC522程序清单#include"rc522_config.h"#include"sys.h"staticvoidRC522_SPI_Config(void);voidRC522_Init(void){ RC522_SPI_Config(); macRC522_Reset_Disable(); macRC522_CS_Disable();}staticvoidRC522_SPI_Config(void){/*SPI_InitTypeDefSPI_InitStructure*/GPIO_InitTypeDefGPIO_InitStructure; /*!<ConfigureSPI_RC522_SPIpins:CS*/ macRC522_GPIO_CS_CLK_FUN(macRC522_GPIO_CS_CLK,ENABLE);GPIO_InitStructure.GPIO_Pin=macRC522_GPIO_CS_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=macRC522_GPIO_CS_Mode;GPIO_Init(macRC522_GPIO_CS_PORT,&GPIO_InitStructure); /*!<ConfigureSPI_RC522_SPIpins:SCK*/ macRC522_GPIO_SCK_CLK_FUN(macRC522_GPIO_SCK_CLK,ENABLE);GPIO_InitStructure.GPIO_Pin=macRC522_GPIO_SCK_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=macRC522_GPIO_SCK_Mode;GPIO_Init(macRC522_GPIO_SCK_PORT,&GPIO_InitStructure); /*!<ConfigureSPI_RC522_SPIpins:MOSI*/ macRC522_GPIO_MOSI_CLK_FUN(macRC522_GPIO_MOSI_CLK,ENABLE);GPIO_InitStructure.GPIO_Pin=macRC522_GPIO_MOSI_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=macRC522_GPIO_MOSI_Mode;GPIO_Init(macRC522_GPIO_MOSI_PORT,&GPIO_InitStructure);/*!<ConfigureSPI_RC522_SPIpins:MISO*/ macRC522_GPIO_MISO_CLK_FUN(macRC522_GPIO_MISO_CLK,ENABLE);GPIO_InitStructure.GPIO_Pin=macRC522_GPIO_MISO_PIN;GPIO_InitStructure.GPIO_Mode=macRC522_GPIO_MISO_Mode;GPIO_Init(macRC522_GPIO_MISO_PORT,&GPIO_InitStructure); /*!<ConfigureSPI_RC522_SPIpins:RST*/ macRC522_GPIO_RST_CLK_FUN(macRC522_GPIO_RST_CLK,ENABLE);GPIO_InitStructure.GPIO_Pin=macRC522_GPIO_RST_PIN;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=macRC522_GPIO_RST_Mode;GPIO_Init(macRC522_GPIO_RST_PORT,&GPIO_InitStructure); }#include"rc522_function.h"#include"rc522_config.h"#include"delay.h"#include"stdio.h"#include"sys.h"#definemacRC522_DELAY()delay_us(2)inti=0;charcStr[30];externu8ucArray_ID[4];//先后存放IC卡的类型和UID(IC卡序列号)u8ucStatusReturn;//返回状态u8KEY_A[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//4C4452464A484C4452464A484C444F50454Eu8RC522rechive[16]={0};/**函数名:SPI_RC522_SendByte*描述:向RC522发送1Byte数据*输入:byte,要发送的数据*返回:RC522返回的数据*调用:内部调用*/voidSPI_RC522_SendByte(u8byte){u8counter; for(counter=0;counter<8;counter++){ if(byte&0x80) macRC522_MOSI_1(); else macRC522_MOSI_0();// Delay_us(3); macRC522_DELAY(); macRC522_SCK_0();// Delay_us(1);// Delay_us(3); macRC522_DELAY(); macRC522_SCK_1();// Delay_us(3); macRC522_DELAY(); byte<<=1; } }/**函数名:SPI_RC522_ReadByte*描述:从RC522发送1Byte数据*输入:无*返回:RC522返回的数据*调用:内部调用*/u8SPI_RC522_ReadByte(void){ u8counter; u8SPI_Data; for(counter=0;counter<8;counter++) { SPI_Data<<=1; macRC522_SCK_0();// Delay_us(3); macRC522_DELAY(); if(macRC522_MISO_GET()==1) SPI_Data|=0x01;// Delay_us(2);// Delay_us(3); macRC522_DELAY(); macRC522_SCK_1(); // Delay_us(3); macRC522_DELAY(); } returnSPI_Data; }/**函数名:ReadRawRC*描述:读RC522寄存器*输入:ucAddress,寄存器地址*返回:寄存器的当前值*调用:内部调用*/u8ReadRawRC(u8ucAddress){ u8ucAddr,ucReturn; ucAddr=((ucAddress<<1)&0x7E)|0x80; macRC522_CS_Enable(); SPI_RC522_SendByte(ucAddr); ucReturn=SPI_RC522_ReadByte(); macRC522_CS_Disable(); returnucReturn; }/**函数名:WriteRawRC*描述:写RC522寄存器*输入:ucAddress,寄存器地址*ucValue,写入寄存器的值*返回:无*调用:内部调用*/voidWriteRawRC(u8ucAddress,u8ucValue){ u8ucAddr; ucAddr=(ucAddress<<1)&0x7E; macRC522_CS_Enable(); SPI_RC522_SendByte(ucAddr); SPI_RC522_SendByte(ucValue); macRC522_CS_Disable(); }/**函数名:SetBitMask*描述:对RC522寄存器置位*输入:ucReg,寄存器地址*ucMask,置位值*返回:无*调用:内部调用*/voidSetBitMask(u8ucReg,u8ucMask){u8ucTemp; ucTemp=ReadRawRC(ucReg); WriteRawRC(ucReg,ucTemp|ucMask);//setbitmask }/**函数名:ClearBitMask*描述:对RC522寄存器清位*输入:ucReg,寄存器地址*ucMask,清位值*返回:无*调用:内部调用*/voidClearBitMask(u8ucReg,u8ucMask){u8ucTemp; ucTemp=ReadRawRC(ucReg); WriteRawRC(ucReg,ucTemp&(~ucMask));//clearbitmask }/**函数名:PcdAntennaOn*描述:开启天线*输入:无*返回:无*调用:内部调用*/voidPcdAntennaOn(void){u8uc; uc=ReadRawRC(TxControlReg); if(!(uc&0x03)) SetBitMask(TxControlReg,0x03); }/**函数名:PcdAntennaOff*描述:开启天线*输入:无*返回:无*调用:内部调用*/voidPcdAntennaOff(void){ClearBitMask(TxControlReg,0x03); }/**函数名:PcdRese*描述:复位RC522*输入:无*返回:无*调用:外部调用*/voidPcdReset(void){ macRC522_Reset_Disable(); macRC522_DELAY(); macRC522_Reset_Enable(); macRC522_DELAY(); macRC522_Reset_Disable(); macRC522_DELAY(); WriteRawRC(CommandReg,0x0f); while(ReadRawRC(CommandReg)&0x10); macRC522_DELAY(); WriteRawRC(ModeReg,0x3D);//定义发送和接收常用模式和Mifare卡通讯,CRC初始值0x6363 WriteRawRC(TReloadRegL,30);//16位定时器低位 WriteRawRC(TReloadRegH,0); //16位定时器高位 WriteRawRC(TModeReg,0x8D); //定义内部定时器的设置 WriteRawRC(TPrescalerReg,0x3E); //设置定时器分频系数 WriteRawRC(TxAutoReg,0x40); //调制发送信号为100%ASK }/**函数名:M500PcdConfigISOType*描述:设置RC522的工作方式*输入:ucType,工作方式*返回:无*调用:外部调用*/voidM500PcdConfigISOType(u8ucType){ if(ucType=='A')//ISO14443_A{ ClearBitMask(Status2Reg,0x08); WriteRawRC(ModeReg,0x3D);//3F WriteRawRC(RxSelReg,0x86);//84 WriteRawRC(RFCfgReg,0x7F);//4F WriteRawRC(TReloadRegL,30);//tmoLength);//TReloadVal='h6a=tmoLength(dec) WriteRawRC(TReloadRegH,0); WriteRawRC(TModeReg,0x8D); WriteRawRC(TPrescalerReg,0x3E); delay_us(2); PcdAntennaOn();//开天线 } }/**函数名:PcdComMF522*描述:通过RC522和ISO14443卡通讯*输入:ucCommand,RC522命令字*pInData,通过RC522发送到卡片的数据*ucInLenByte,发送数据的字节长度*pOutData,接收到的卡片返回数据*pOutLenBit,返回数据的位长度*返回:状态值*=MI_OK,成功*调用:内部调用*/charPcdComMF522(u8ucCommand,u8*pInData,u8ucInLenByte,u8*pOutData,u32*pOutLenBit) {charcStatus=MI_ERR;u8ucIrqEn=0x00;u8ucWaitFor=0x00;u8ucLastBits;u8ucN;u32ul; switch(ucCommand){casePCD_AUTHENT: //Mifare认证ucIrqEn=0x12; //允许错误中断请求ErrIEn允许空闲中断IdleIEnucWaitFor=0x10; //认证寻卡等待时候查询空闲中断标志位break; casePCD_TRANSCEIVE: //接收发送发送接收ucIrqEn=0x77; //允许TxIEnRxIEnIdleIEnLoAlertIEnErrIEnTimerIEnucWaitFor=0x30; //寻卡等待时候查询接收中断标志位与空闲中断标志位break; default:break; }WriteRawRC(ComIEnReg,ucIrqEn|0x80); //IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反ClearBitMask(ComIrqReg,0x80); //Set1该位清零时,CommIRqReg的屏蔽位清零WriteRawRC(CommandReg,PCD_IDLE); //写空闲命令SetBitMask(FIFOLevelReg,0x80); //置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除for(ul=0;ul<ucInLenByte;ul++) WriteRawRC(FIFODataReg,pInData[ul]); //写数据进FIFOdata WriteRawRC(CommandReg,ucCommand); //写命令if(ucCommand==PCD_TRANSCEIVE) SetBitMask(BitFramingReg,0x80); //StartSend置位启动数据发送该位与收发命令使用时才有效ul=1000;//根据时钟频率调整,操作M1卡最大等待时间25ms do //认证与寻卡等待时间 {ucN=ReadRawRC(ComIrqReg); //查询事件中断ul--;}while((ul!=0)&&(!(ucN&0x01))&&(!(ucN&ucWaitFor))); //退出条件i=0,定时器中断,与写空闲命令 ClearBitMask(BitFramingReg,0x80); //清理允许StartSend位 if(ul!=0){ if(!(ReadRawRC(ErrorReg)&0x1B)) //读错误标志寄存器BufferOfICollErrParityErrProtocolErr { cStatus=MI_OK; if(ucN&ucIrqEn&0x01) //是否发生定时器中断 cStatus=MI_NOTAGERR; if(ucCommand==PCD_TRANSCEIVE) { ucN=ReadRawRC(FIFOLevelReg); //读FIFO中保存的字节数 ucLastBits=ReadRawRC(ControlReg)&0x07; //最后接收到得字节的有效位数 if(ucLastBits) *pOutLenBit=(ucN-1)*8+ucLastBits; //N个字节数减去1(最后一个字节)+最后一位的位数读取到的数据总位数 else *pOutLenBit=ucN*8; //最后接收到的字节整个字节有效 if(ucN==0) ucN=1; if(ucN>MAXRLEN) ucN=MAXRLEN; for(ul=0;ul<ucN;ul++) pOutData[ul]=ReadRawRC(FIFODataReg); } } else cStatus=MI_ERR; }SetBitMask(ControlReg,0x80);//stoptimernowWriteRawRC(CommandReg,PCD_IDLE); returncStatus; }/**函数名:PcdRequest*描述:寻卡*输入:ucReq_code,寻卡方式*

温馨提示

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

最新文档

评论

0/150

提交评论