版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学术诚信承诺本人郑重声明:所呈交的论文是我个人在导师指导下进行的研究工作及取得研究成果。尽我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写的研究成果,也不包含为获得大学或其他教育机构的学位或证书所使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中做了明确的说明并表示了谢意。 签名:___________日期:____________关于论文使用授权的说明本人完全了解大学有关保留、使用学位论文的规定,即:学校有权保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存论文。签名:___________导师签名:___________日期:____________第[19]。同时,还需要考虑数据格式的转换、通信速率的匹配、通信中断的处理等问题,以优化通信效率,流程图如图5-3所示。图5-3GSM子程序流程图按键执行程序设计按键消抖子程序的设计,是为了避免机械按键抖动引起的误输入问题,提高系统的响应可靠性。该程序主要包括两个部分:检测和消抖处理。在检测阶段,程序通过读取按键输入状态,判断是否有按键按下。如果检测到有按键按下,则进入消抖处理阶段。在消抖处理阶段,程序启动一个短暂的延时,通常为几毫秒至数十毫秒之间。在此延时期间,程序不响应任何按键输入,以消除机械抖动所带来的影响。延时结束后,程序再次确认按键状态,若仍然为按下状态,则认为这是一次有效的按键输入,执行相应的操作。否则,将按键状态判定为无效输入,直接返回。需要注意的是,消抖处理的时间间隔需要根据具体的应用场景进行调整,以确保既能消除机械抖动的影响,又不会对用户的实际操作造成过大的延迟和不必要的等待。同时,在设计该子程序时,还需要考虑到多键同时按下等情况,以保证程序的可靠性和稳定性。该子程序会被主程序周期性调用,确保所有的按键输入都能得到可靠的处理,流程图如图5-4所示。图5-4按键子程序流程图系统仿真与实物调试系统仿真在完成硬件电路设计和软件程序设计后,需要对整个系统进行仿真与实物调试,以验证系统的各个功能是否正常运行。在制作实物之前先对系统进行仿真,测试方案是否可行。仿真调试步骤如下:(1)检查线路连接,各模块能否正常工作如图6-1所示,运行仿真后,各模块均能正常工作,线路连接正确。图6-1系统仿真图(2)按键功能调试流量传感器由滑动电阻模拟仿真,可以直接通过滑动电阻调节天然气量,不需要设置按键来调节,所以仿真按键用来改变报警值,按下K1可以看到屏幕上显示当前的报警值,如图6-2所示,然后可以通过K2、K3将报警值调整到想要的数值。如图6-3、6-4所示。(3)报警功能以及短信模拟功能调试设置的报警值是10,当天然气剩余量低于10,系统就会蜂鸣器报警,并且发送短信,如图6-5所示。图6-2按键1调试图图6-3按键2调试图(4)用气管理功能调试当天然气剩余量为0时,电磁阀关闭,停止供气,如图6-6所示。图6-4按键3调试图图6-5短信提醒仿真图图6-6用气管理仿真图(5)防拆卸功能调试当有人试图暴力拆卸系统时,单片机接收到信号,然后通过蜂鸣器进行报警,指示灯亮起,提醒用户,如图6-7所示。图6-7防拆卸仿真图该仿真是由proteus软件进行仿真的,由于仿真软件里没有STC12单片机,所以用基本功能相近的51单片机代替进行仿真。由于有些功能无法进行,只是对基本功能与一些可以模拟的功能进行了仿真,部分功能由于无法仿真,选择了仿真相似的功能,所以与实物有一定区别。实物调试仿真系统能正常运行,部分可以通过仿真实现的功能正常,说明方案可行。然后制作实物并且进行实物调试,调试的主要步骤如下:(1)检查硬件电路连接是否正确,各模块是否能够正常供电。系统实物图片如图6-8所示,打开开关各模块能正常供电如图6-9所示,可以判断电路连接正确。(2)数据存储功能调试如图6-9所示,开机后通过显示屏可以看到历史用过的用气记录都在第一行显示,即存储功能正常(3)流量检测功能调试由于现实中不能接到真正的天然气管道检测流量,可以通过往流量计进气口吹气的方法模拟气体通过,可以看到剩余的气量随着从吹气而减少,如图6-10所示。6-8系统实物图图6-9实物供电调试图图6-10流量监测调试图(4)报警功能及短信功能调试到天然气剩余量低于10时就会报警提醒,蜂鸣器报警无法用图片表示,因此设计了黄色小灯,报警时黄灯亮起,如图6-11所示,以及发送短信给指定手机,如图6-12所示。图6-11报警功能调试图图6-12短信模块调试图(5)用气管理功能调试当剩余气量为零时,电磁阀关闭,停止供气。进行充值后再次供气,由于实物无法看到阀门是否关闭,此功能在上面仿真调试中体现。按下K2,可以看到显示屏上出现一个+,此时可以给IC卡充值,如图6-13所示。将IC卡放到感应区即可给IC卡充值,如图6-14所示。图6-13IC卡充值状态图6-14充值卡再次按下按键按关闭IC卡充值,再次将IC卡放置感应区即可给系统充值。由于之前给剩余的气量用完了,是报警状态(黄灯亮),当给系统充值之后,停止报警(黄灯熄灭,绿地亮)如图6-15、6-16所示。图6-15系统充值图6-16充值完成(6)防拆卸功能调试当有人试图暴力拆卸系统时会触动轻触开关。系统会蜂鸣器报警以及亮红灯报警,如图6-17所示。图6-17防拆卸调试(7)电压检测功能调试由于调试使用的电源一直都是稳定的电源,所以不会出现电压低报警的情况,此功能用仿真的形式体现,为了检测到运行时的电压,系统设计了K1,按下即会显示此时的电压,如图6-18所示。图6-18电压检测调试图结论该住宅自动抄表系统设计主要由STC12C5A60S2单片机、电源模块、LCD1602显示模块、RC522射频模块、流量传感器模块、电磁阀模块、报警模块、GSM模块和按键模块组成。该系统具有用气管理、自动供停气、显示、报警、防拆卸、远程发送短信和电池电压检测等功能。实现了对天然气用量的自动抄读和管理,为用户提供了更加安全、方便的燃气使用体验。随着社会经济的快速发展,人们对生活品质的要求也越来越高。在居民生活中,天然气作为一种清洁高效的能源,其使用量不断提升。而传统的手工抄表和管理方式存在诸多问题,如费时费力、数据易丢失、安全隐患大等问题。因此,开展住宅自动抄表系统的研究具有重要的现实意义和广阔的应用前景。值得一提的是,系统还具有较强的扩展性,未来可以进一步增加更多的智能化功能,如远程控制、大数据分析等,以适应未来智能家居的发展趋势。由于时间和能力有限,我的毕业设计还存在一些缺陷和不足之处。在某些模块的设计和实现上还不够完善,在创新性和实用性方面有待加强,在用户体验方面还有待提升致谢此次设计的圆满完成了,我的大学生活即将也要画上句号,在此我要衷心感谢在我毕业设计过程中给予我帮助的人。首先,感谢我的指导老师。正是老师的悉心指导与精神鼓舞,给予了我极大的启迪,让我们对嵌入式系统设计有了全新认识,也树立了锲而不舍钻研的决心。在设计的每一个关键阶段,老师都毫无保留地传授自己的专业知识和科研经验。当我遇到疑惑和困难时,老师总是耐心解答、细心指点,引导我走出迷惑,最终将理论知识付诸实践。正是老师严格的要求和精雕细琢,才让我最终交出了一份令人满意的答卷。其次,感谢我的家人。我的求学路上,他们一直是我坚强的后盾,给予我无尽的关爱和支持,在我遇到困难和挫折时,他们始终在我身后,给予我帮助,让我坚定信心,勇往直前。再次,感谢我的女朋友。在我大学的最后阶段,我想借此机会向你表达我最深切的感谢。你不仅是我的女朋友更是我生命中最重要的伴侣和支持者。你的理解和耐心是我能够专注与毕业设计的支柱,你的陪伴让我的生活充满了快乐和意义。在这个特殊的时刻,我想让你知道,你的付出并没有被忽视,它们是我能够走到今天的重要力量。最后,感谢一下自己,在这四年里,不断学习,拼搏,克服了许多困难,也取得了一定的成绩。面对压力和困惑时,始终保持着积极的心态。参考文献王阳阳,闫淑娟.智能抄表系统的研究及应用[J].世界有色金属,2021(18):231-232.曾乃鸿.当前自动抄表技术的现状和展望[J].华东电力,2001(01):57-59.SanghoonJ,E.KL.ComparisonofAMIandSCADASystemsforLeakDetectionandLocalizationinWaterDistributionNetworks[J].JournalofWaterResourcesPlanningandManagement,2023,149(11):28-39张晓伟.智能电表及集抄系统的运行维护策略[J].现代商贸工业,2016,37(32):196-198.谭志强,黄懿.自动抄表技术的发展[J].电测与仪表,2009,46(01):1-5.张幸.智能远程抄表系统的设计[J].科学技术创新,2020(17):90-91.徐自远,顾德祥,钱颖雪等.单片机技术与技能训练[M].北京.清华大学出版社,2014:06-15孙书鹰,陈志佳,寇超.新一代嵌入式微处理器STM32F103开发与应用[J].微计算机应用,2010,31(12):59-63.柴建民.LUGB涡街流量计的技术特点与应用[J].世界有色金属,2015(05):48-50.苏杰仁.OLED屏显示分析与实现[J].现代信息科技,2023,7(13):53-57.宋凤娟,付侃,薛雅丽.STC12C5A60S2单片机高速A/D转换方法[J].煤矿机械,2010,31(06):219-221.黄钰.智能远程抄表系统软件的设计与实现[D].成都.电子科技大学,2021:28-39张军.燃气远程自动抄表系统的研究与设计[J].工业控制计算机,2019,32(02):39-40.刘兵,陈宗鋆.基于物联网技术的IC卡工业燃气表远程抄表系统的设计与研发[J].仪表技术,2017(1):5-9韩华刚,李迎春,易晓明,等.基于MSP430单片机的新型智能IC卡天然气表设计[J].现代电子技术,2012,35(09):137-140.曹锋.无线智能抄表系统设计[J].信息系统工程,2011(11):117-118.苏杰仁.字符型LCD1602显示分析与实现[J].科技资讯,2022,20(22):9-12RanZ,XiaoLuS,MinWC,etal.Designofelectricpowerremotemeterreadingsystem[J].JournalofPhysics:ConferenceSeries,2021,1802(3):032030.王蓝仪,徐磊,汪向华,等.基于GSM的天然气自动抄表系统设计[J].山西电子技术,2020(04):33-36.杨迪,吕云彤,冀明.电能表远程抄表系统通信方式设计研究[J].波谱学杂志,2023,40(04):481.附录1外文参考文献(原文、译文)电力远程抄表系统的设计RanZhang,XiaoLuSun,WeiMinChen,LiZhongStateGridSichuanElectricPowerCorporationMeteringCenter,ChengduSichuan、610045*Correspondingauthor:ran_zhang2020@摘要:记录用户用电量是电力部门每月的例行工作,往往需要耗费大量的物力和人力。因此,利用新的技术手段,借助远程和本地自动抄表技术,达到自动抄表监控电能表的目的,提高工作效率,真正实现自动化用电管理,远程电能表抄表系统成为电网公司替代抄表问题的解决方案。该系统可满足远程电能表抄表系统在一定范围内对用户电能表的远程数据记录、采集和实时监控功能。1.导言目前,电表的改革正在有条不紊地进行。远程自动抄表技术的发展对用户用电管理水平的提高起到了积极的作用。计算机的主要特点是精度高、速度快。这些特性可用于远程抄表。在系统设计中采用该方法,可以减轻抄表员的工作强度,避免不必要的劳动损失,同时有助于降低允差率和漏失。因此,可以说远程自动抄表系统从根本上解决了人工抄表的所有弊端。根据省公司高、低压用户抄表工作要求,采用闭环运维支持方式支持高、低压用户。日常工作调整在闭环运维系统的WEB端进行,现场日常例行工作通过现场手持电脑进行调整。介绍了远程抄表系统的组成、工作原理、集中器的工作原理及主要模块的功能。2.远程抄表系统组成图1远程抄表系统框图图1显示了远程抄表系统的组成。图中用户载波表的主要功能是加载载波终端。在此之后,它可以使用功率载波通信来记录电压、电量和已用功率。集中器在同一配电变压器上可按设计数据分时记录数据,计算结果应及时保存。主站的计算机也可以在集中期间使用电话网络和其他通信。指令的发出还可以远程实现相关设置的更改。可为集中器全面读取和管理数据。同时还可实现集中器下各表计的断电控制,实现远程抄表。这一发展加强了国家对电网的控制,显著提高了社会经济效益,并在一定程度上降低了用工和成本。为今后电力现代化管理奠定了坚实的基础。3.集中器工作原理集中器在整个远程自动抄表系统中的作用相当于人脑。计算机的核心是CPU。这也是通信抄表设备最关键的部分。用于完成集中器与中央服务器之间的串口连接。通讯功能,借助RS232和RS485两个接口模块,实现采集器与集中器之间的通讯功能。同时存储采集器发送的Flash内存,通过LCD和键盘对采集器进行初始化和参数化。设置。其工作原理如图2所示图2集中器工作原理框图集中器可以根据已编程和设置的不同频带复制仪表控制计划,并对各负荷频段的电表主站进行双向视频数据实时传输。内部电路可以连接到控制系统的无线广播时间总线,并且可以执行自动定时读取仪表的控制命令,存储抄表主站的实时数据,并通过各种无线网络介质与抄表主站进行实时数据交换。集中器的功能是将位于变频区的本地载波射频电能表与车站的本地网络设备相连。实时自动记录车站数据,采集管理终端和车站载波电能表的相关数据。可以实时存储和储存。保存。数据通过移动电话线或移动电话线自动传输或发送到国家电力局计算机数据中心。4.集中器组件数据集中器的主要部件包括RAM、CPU、指示电路、直流电源和接口。主要采用RS232接口和载波接口与外部单片机系统进行通信。以下是主要组成部分:(a).直流电源:电压为5V的直流电源(b).基于LCD的触摸显示电路:主要采用TSC2200RHB芯片。(c).控制模块:控制芯片型号为STM32F103ZET6(d).接台電路:主要有RS485和RS232两个专用接口,这两个接口主要依靠电缆实现计算机与抄表机之间的通信。(e).NANDFLASH存储器模块:NANDFLASH存储器可以存储从收集器传送来的用户数据。(f).仿真器接口:使用ARMJTAG芯片连接计算机进行调试。工作原理,CPU和RAM的工作原理与传统计算机相差不大。本文将介绍该接口的具体工作原理。RS232接口:RS232接口主要包括DB9接口和DB25两种,本文主要采用9针D插座和外部设备进行数据传输。对于TXD和RSD.=-3V~-15v,“o"=+3~+15V,在CTS、RTS、DTR、DSR和DCD的控制线上:信号有效(开,开状态,正电压)=+3V~+15V信号无效(OFF,OFF状态,负电压)=-3v~-15vD型插座所有引脚上的电平信号为EIA电平:“1”=-3V~-15v,“0"=+3~+15V。EIA电平需要通过长达100米的导线传输后,同时,在导线的消耗衰减之后,仍然可以区分“1”或“0”。因此,当数据集中器将信号传输到D型时,当插座连接时,一些其他信号必须转换为D型信号,通过D型插座传输到其他信号需要EIA级别转换为其他级别。电平转换功能是RS232的主要功能,需要保持信号的一致性才能实现完美的通信。RS485主要采用差分信号的负逻辑,+2V~+6V可以用“1”表示,-6V~-2V可以用“0"表示。RS485主要包括两线制和四线制两种接线方式。半双工通信方式主要基于二线制,全双工通信方式主要基于四线制。连接RS-485的通信链路仅通过双胶线连接每个接口的“A”和“B”端。然而,该信号连接方法不连接到信号地。虽然在很多场合都能正常工作,但使用时存在隐患。主要有两个原因:(a).共模干扰问题:RS-485接口采用差模传输信号,不需要对某一参考点进行信号检测。系统只需要检测两条差分线路之间的信号差。然而,人们忽略了一个实际问题,即收发器具有一定范围的共模电压。对于RS-485,收发器的共模电压范围为-7~+12V。只有满足此条件,整个网络才能正常工作。当网络电缆中的共模电压大于上述范围,将影响通信信号的稳定性,甚至损坏接口。(b).EMI问题:驱动器输出信号的共模部分必须通过返回路径传输。如果没有低阻抗的返回路径(通常是信号地),将产生辐射到源端,整个总线将成为巨大的天线发射器辐射电磁波5.STM32F103ZET6芯片测试上一整页电路测试测试STM32F103ZET6芯片是否存在虚焊、元器件焊接、短路、开路等问题。完成所有检查后,需要测试芯片I/O功能和每个引脚功能。您可以使用万用表测试STM32F103ZET6。主要检査点包括相邻引脚之间是否存在短路或引脚与PCB之间是否存在虚焊。如果存在短路,芯片可能会烧毁,如果存在虛焊,可能会影响芯片的正常工作。经逐一测试,STM32F103ZET6无短路、虚焊现象。上电后测量系统电源电压为+-5V,STM32F103ZET6与电源连接的所有引脚均为3.3V,一切正常。5.1.复位引脚、晶体振荡器引脚、串行通信引脚测试复位引脚:电路系统在电源线上上电和断电后,NRST(引脚25)为高电平。按下复位按钮后,NRST(引脚25)变为低电平,因此我们可以准确地确定每个复位引脚电路的正常工作。晶体振荡器引脚:借助示波器观察STM32F103ZET6晶体振荡器引脚。您可以看到与晶体振荡器频率相同的正弦波,振幅约为1V,这证明晶体振荡器电路可以正常工作。串口通讯引脚:用keil编写相应的程序,使某个引脚输出方波信号,同时编译下载到STM32F103ZET6。在示波器的帮助下,在引脚附近可以看到方波信号,这证明电路和串行通信引脚之间的连接是正常的。5.2.I/O端口功能测试程序设计I/O端口是STM32F103ZET6和外部组件之间数据交换的通道。I/O端口有两种工作模式,一种是总线模式,另一种是I/O端口。由于系统外围设备众多,且大多基于位置控制,故采用I/O方式。(a).测试字节输出模式STM32F103ZET6有七组/0口,主要是PA、PB、PC、PD、PE、PF、PG,所谓字节输出方法就是允许STM32F103ZET6的某组I/O口输出一个字节。测试时STM32F103ZET6只有一组I/O口可以按照相应的程序输出一个字节。证明字节输出方法正常。测试后,所有字节的端口输出被证明是正确的。(b).测试位输出模式STM32F103ZET6每组I/O端口共8位,位输出模式是使每组的任意位输出为0或1测试时,只需让STM32F103ZET6每组8位按程序输出0或1,即可说明位输出模式正常。测试完成后,各端口各位输出模式正常。6.结论抄表系统可以说是现代计量技术、信息通信技术、计算机技术的完美结合。能够考虑数据收集和处理、能耗测量等。将城市居民用能信息与综合治理相结合,不仅可以大大提高部门工作效率,而且可以满足当今用户对缴费的新需求。附录2电路原理图附录3系统电路PCB图附录4元器件清单序号名称规格/型号数量1电阻10K12电阻2K13电阻1K54电阻39045电解电容10uf16瓷片电容30p27电解电容470uf18电解电容100uf29二极管IN4007110液晶显示屏LCD1602111发光二极管Gre112发光二极管Yel113发光二极管Red114PNP三极管8550215单片机STC12C5A60S2116三端稳压5VLM7805117三端稳压3.3VAMS1117-3.3118RFID模块RFID-RC552119晶振11.0592120流量计LUGB121继电器ERLAY-SPDT122蜂鸣器BELL123电源开关8*8MM124防拆卸按键KW11125按键6*6*5MM3附录5源程序#include<STC12C5A60S2.h>//头文件#include"main.h"#include"mfrc522.h"#include<intrins.h> #include<string.h>#include<stdio.h>/********************************************************************************************///数值类别typedefsignedcharint8;//有符号8位整型变量typedefunsignedcharuint8;//无符号8位整型变量typedefsignedintint16;//有符号16位整型变量typedefunsignedintuint16;//无符号16位整型变量typedefsignedlongint32;//有符号32位整型变量typedefunsignedlonguint32;//无符号32位整型变量/******************************************************************************///全局变量staticuint8bz=0,UART_dat[4],command;staticuint8ds1=0,ds2=0,ds3=0,mc=0;//定时中断次数staticuint16ds0=0;unsignedcharcodedata1[16]={0xC8,0x00,0x00,0x00,0x37,0xFF,0xFF,0xFF,0xC8,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};//200//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反uint8data2[4]={0x00,0x00,0x00,0x01};//存值减值金额uint8codeDefaultKey[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};//密码uint8TYPE_DATA[2];//类型uint8ID_DATA[4];//ID地址uint8value_DATA[4];//卡里面的值 uint8g_ucTempbuf[20];//uint8tt=0;bitflag_pro;bitflag_sk=0;uint16ad0;uint32tot=0,mon=0,card=0;uint8a=0,b=0,c=0,d=0;//定义特殊寄存器sfrwdt_contr=0xc1; //定义看门狗地址sfrisp_data=0xc2; //定义ISP数据寄存器sfrisp_addrh=0xc3; //定义ISP地址高8位sfrisp_addrl=0xc4; //定义ISP地址低8位sfrisp_cmd=0xc5; //定义ISP命令模式寄存器sfrisp_trig=0xc6; //定义ISP命令触发寄存器sfrisp_contr=0xc7; //定义ISP控制模式寄存器//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%驱动程序开始%%%%%%%%%%%%%%%%%%%%%%%%%%%%///*******************************************************************************函数名称:DelaymS()*功能:1mS延时函数*入口参数:16位整型延时时间(mS)******************************************************************************/voidDelaymS(uint16ms){ uint8a,b,c; while(--ms!=0){for(c=3;c>0;c--)for(b=197;b>0;b--)for(a=2;a>0;a--); }}/******************************************************************************///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@LCM1602模块驱动开始@@@@@@@@@@@@@@@@@@@@@@@@@@@///******************************************************************************///定义LCM1602指令集#define CMD_clear 0x01 //清除屏幕#define CMD_back 0x02 //DDRAM回零位#define CMD_dec1 0x04 //读入后AC(指针)减1,向左写#define CMD_add1 0x06 //读入后AC(指针)加1,向右写#define CMD_dis_gb1 0x0f //开显示_开光标_开光标闪烁#define CMD_dis_gb2 0x0e //开显示_开光标_关光标闪烁#define CMD_dis_gb3 0x0c //开显示_关光标_关光标闪烁#define CMD_OFF_dis 0x08 //关显示_关光标_关光标闪烁#define CMD_set82 0x38 //8位总线_2行显示#define CMD_set81 0x30 //8位总线_1行显示(上边行)#define CMD_set42 0x28 //4位总线_2行显示#define CMD_set41 0x20 //4位总线_1行显示(上边行)#define lin_1 0x80 //4位总线_1行显示(上边行)#define lin_2 0xc0 //4位总线_1行显示(上边行)/******************************************************************************//****************************************************************************[底层协议]*函数名称:LCM1602_TestBusy()*功能:LCM1602测忙,若LCM1602处于忙状态,本函数将继续测忙,直到LCM1602处于非忙状态。*入口参数:无*出口参数:无*******************************************************************************/voidLCM1602_TestBusy(void){LCM1602_DB0_DB7=0xff;//设备读状态LCM1602_RS=0;LCM1602_RW=1;LCM1602_E=1;while(LCM1602_Busy);//等待LCM不忙LCM1602_E=0;//}/****************************************************************************[底层协议]*函数名称:LCM1602_WriteCMD()*功能:向LCM1602写命令*入口参数:LCM1602_command要写入LCM1602的命令字节*出口参数:无********************************************************************************/voidLCM1602_WriteCMD(uint8LCM1602_command){LCM1602_TestBusy();LCM1602_DB0_DB7=LCM1602_command;LCM1602_RS=0;LCM1602_RW=0;LCM1602_E=1;LCM1602_E=0;}/****************************************************************************[底层协议]*函数名称:LCM1602_WriteData()*功能:向LCM1602写数据*入口参数:LCM1602_data要写入LCM1602的数据字节*出口参数:无********************************************************************************/voidLCM1602_WriteData(uint8LCM1602_data){LCM1602_TestBusy();LCM1602_DB0_DB7=LCM1602_data;LCM1602_RS=1;LCM1602_RW=0;LCM1602_E=1;LCM1602_E=0;}/**********************************************************************************函数名称:LCM1602_Init()*功能:LCM1602初始化*入口参数:无*出口参数:无*********************************************************************************/voidLCM1602_Init(void){LCM1602_WriteCMD(CMD_set82);//显示模式设置:显示2行,每个字符为5*7个像素LCM1602_WriteCMD(CMD_clear);//显示清屏LCM1602_WriteCMD(CMD_back);//数据指针指向第1行第1个字符位置LCM1602_WriteCMD(CMD_add1);//显示光标移动设置:文字不动,光标右移LCM1602_WriteCMD(CMD_dis_gb3);//显示开及光标设置:显示开,光标关,闪烁关}/**********************************************************************************函数名称:print()*功能:向LCM发送一个ASIIC字符串,长度48字符之内*入口参数:ASIIC字符串*出口参数:无*********************************************************************************/voidprint(uint8a,uint8*str){ LCM1602_WriteCMD(a); while(*str!='\0'){ LCM1602_WriteData(*str++);} *str=0;}/*********************************************************************************函数名称:print2()*功能:向LCM发送一个数字串,长度48字符之内*入口参数:数字串*出口参数:无********************************************************************************/voidprint2(uint8a,uint8t){//设置写入地址和数据 LCM1602_WriteCMD(a); LCM1602_WriteData(t);}//******************************************************************************///@@@@@@@@@@@@@@@@@@@@@@@@@@@LCM1602模块驱动结束@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@A/D转换程序开始@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@///*********************************************************************************函数名称:ad()*功能:AD转换*入口参数:通道号*出口参数:AD转换值*******************************************************************************/uint16ad(uint8j)////////////////////////////////////端口定义///////////////////////////////////////////////////////////////////////MFRC500sbitMF522_NSS=P1^1;sbitMF522_SCK=P1^2;sbitMF522_SI=P1^3;sbitMF522_SO=P1^4;sbitMF522_RST=P1^5;//显示屏sbitrs =P2^7; sbitrw =P2^6;sbitep =P2^5;sbitkey_bj =P3^4;//开盖检测开关sbitkey_ys =P3^5;//模拟用水按钮sbitkey_cz =P3^6;//模拟充值按钮sbitkey_fw =P3^7;//复位开关sbitled_dcf =P2^2;//电磁阀指示灯——绿色sbitled_yed =P2^1;//余额低指示灯——黄色sbitled_bj =P2^0;//开盖报警指示灯——红色sbitout_dcf =P2^3;//电磁阀sbitout_beep =P1^6;//蜂鸣器//////////////////////////////////////////////////////////////////////函数原型/////////////////////////////////////////////////////////////////////voidInitializeSystem();voidDelaymS(unsignedinttime);voidlcd_wcmd(unsignedcharcmd);voidlcd_pos(unsignedcharpos);voidlcd_init(void);voidLCD1206a(void);voidLCD1206b(void);bitlcd_bz(void);voidpro(void);voidkey(void);voidwritek(void);voidreadk(void);voidinit_k(void);#include<intrins.h>#include"reg52.h"#include"main.h"#include"mfrc522.h"#defineMAXRLEN18///////////////////////////////////////////////////////////////////////功能:寻卡//参数说明:req_code[IN]:寻卡方式//0x52=寻感应区内所有符合14443A标准的卡//0x26=寻未进入休眠状态的卡//pTagType[OUT]:卡片类型代码//0x4400=Mifare_UltraLight//0x0400=Mifare_One(S50)//0x0200=Mifare_One(S70)//0x0800=Mifare_Pro(X)//0x4403=Mifare_DESFire//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdRequest(unsignedcharreq_code,unsignedchar*pTagType){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);ucComMF522Buf[0]=req_code;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);if((status==MI_OK)&&(unLen==0x10)){*pTagType=ucComMF522Buf[0];*(pTagType+1)=ucComMF522Buf[1];}else{status=MI_ERR;}returnstatus;}///////////////////////////////////////////////////////////////////////功能:防冲撞//参数说明:pSnr[OUT]:卡片序列号,4字节//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdAnticoll(unsignedchar*pSnr){charstatus;unsignedchari,snr_check=0;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x00);ClearBitMask(CollReg,0x80);ucComMF522Buf[0]=PICC_ANTICOLL1;ucComMF522Buf[1]=0x20;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if(status==MI_OK){ for(i=0;i<4;i++){*(pSnr+i)=ucComMF522Buf[i];snr_check^=ucComMF522Buf[i];}if(snr_check!=ucComMF522Buf[i]){status=MI_ERR;}}SetBitMask(CollReg,0x80);returnstatus;}///////////////////////////////////////////////////////////////////////功能:选定卡片//参数说明:pSnr[IN]:卡片序列号,4字节//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdSelect(unsignedchar*pSnr)//卡片类型{charstatus;unsignedchari;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_ANTICOLL1;ucComMF522Buf[1]=0x70;ucComMF522Buf[6]=0;for(i=0;i<4;i++){ ucComMF522Buf[i+2]=*(pSnr+i); ucComMF522Buf[6]^=*(pSnr+i);}CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);if((status==MI_OK)&&(unLen==0x18)){status=MI_OK;}else{status=MI_ERR;}returnstatus;} ///////////////////////////////////////////////////////////////////////功能:验证卡片密码//参数说明:auth_mode[IN]:密码验证模式//0x60=验证A密钥//0x61=验证B密钥//addr[IN]:块地址//pKey[IN]:密码//pSnr[IN]:卡片序列号,4字节//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdAuthState(unsignedcharauth_mode,unsignedcharaddr,unsignedchar*pKey,unsignedchar*pSnr){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=auth_mode;ucComMF522Buf[1]=addr;for(i=0;i<6;i++){ucComMF522Buf[i+2]=*(pKey+i);}for(i=0;i<6;i++){ucComMF522Buf[i+8]=*(pSnr+i);}//memcpy(&ucComMF522Buf[2],pKey,6);//memcpy(&ucComMF522Buf[8],pSnr,4);status=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);if((status!=MI_OK)||(!(ReadRawRC(Status2Reg)&0x08))){status=MI_ERR;}returnstatus;}///////////////////////////////////////////////////////////////////////功能:读取M1卡一块数据//参数说明:addr[IN]:块地址//pData[OUT]:读出的数据,16字节//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdRead(unsignedcharaddr,unsignedchar*pData){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_READ;ucComMF522Buf[1]=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if((status==MI_OK)&&(unLen==0x90))//{memcpy(pData,ucComMF522Buf,16);}{for(i=0;i<16;i++){*(pData+i)=ucComMF522Buf[i];}}else{status=MI_ERR;}returnstatus;}///////////////////////////////////////////////////////////////////////功能:写数据到M1卡一块//参数说明:addr[IN]:块地址//pData[IN]:写入的数据,16字节//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdWrite(unsignedcharaddr,unsignedchar*pData){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_WRITE;ucComMF522Buf[1]=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A)){status=MI_ERR;}if(status==MI_OK){//memcpy(ucComMF522Buf,pData,16);for(i=0;i<16;i++){ucComMF522Buf[i]=*(pData+i);}CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen);if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A)){status=MI_ERR;}}returnstatus;} ///////////////////////////////////////////////////////////////////////功能:扣款和充值//参数说明:dd_mode[IN]:命令字//0xC0=扣款//0xC1=充值//addr[IN]:钱包地址//pValue[IN]:4字节增(减)值,低位在前//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdValue(unsignedchardd_mode,unsignedcharaddr,unsignedchar*pValue){charstatus;unsignedintunLen;unsignedchari,ucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=dd_mode;ucComMF522Buf[1]=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A)){status=MI_ERR;}if(status==MI_OK){//memcpy(ucComMF522Buf,pValue,4);for(i=0;i<16;i++){ucComMF522Buf[i]=*(pValue+i);}CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);unLen=0;status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if(status!=MI_ERR){ status=MI_OK; }}if(status==MI_OK){ucComMF522Buf[0]=PICC_TRANSFER;ucComMF522Buf[1]=addr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A)){status=MI_ERR;}}returnstatus;}///////////////////////////////////////////////////////////////////////功能:备份钱包//参数说明:sourceaddr[IN]:源地址//goaladdr[IN]:目标地址//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdBakValue(unsignedcharsourceaddr,unsignedchargoaladdr){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_RESTORE;ucComMF522Buf[1]=sourceaddr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A)){status=MI_ERR;}if(status==MI_OK){ucComMF522Buf[0]=0;ucComMF522Buf[1]=0;ucComMF522Buf[2]=0;ucComMF522Buf[3]=0;CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);if(status!=MI_ERR){status=MI_OK;}}if(status!=MI_OK){returnMI_ERR;}ucComMF522Buf[0]=PICC_TRANSFER;ucComMF522Buf[1]=goaladdr;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);if((status!=MI_OK)||(unLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A)){status=MI_ERR;}returnstatus;} ///////////////////////////////////////////////////////////////////////功能:命令卡片进入休眠状态//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdHalt(void){charstatus;unsignedintunLen;unsignedcharucComMF522Buf[MAXRLEN];ucComMF522Buf[0]=PICC_HALT;ucComMF522Buf[1]=0;CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);status=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen);returnMI_OK;}///////////////////////////////////////////////////////////////////////用MF522计算CRC16函数/////////////////////////////////////////////////////////////////////voidCalulateCRC(unsignedchar*pIndata,unsignedcharlen,unsignedchar*pOutData){unsignedchari,n;ClearBitMask(DivIrqReg,0x04);WriteRawRC(CommandReg,PCD_IDLE);SetBitMask(FIFOLevelReg,0x80);for(i=0;i<len;i++){WriteRawRC(FIFODataReg,*(pIndata+i));}WriteRawRC(CommandReg,PCD_CALCCRC);i=0xFF;do{n=ReadRawRC(DivIrqReg);i--;}while((i!=0)&&!(n&0x04));pOutData[0]=ReadRawRC(CRCResultRegL);pOutData[1]=ReadRawRC(CRCResultRegM);}///////////////////////////////////////////////////////////////////////功能:复位RC522//返回:成功返回MI_OK/////////////////////////////////////////////////////////////////////charPcdReset(void){MF522_RST=1; DelaymS(1);MF522_RST=0;DelaymS(1);MF522_RST=1; DelaymS(1);WriteRawRC(CommandReg,PCD_RESETPHASE); //01,0F DelaymS(1);WriteRawRC(ModeReg,0x3D);//和Mifare卡通讯,CRC初始值0x6363 11WriteRawRC(TReloadRegL,30);//2DWriteRawRC(TReloadRegH,0); //2CWriteRawRC(TModeReg,0x8D); //2AWriteRawRC(TPrescalerReg,0x3E); //2B//WriteRawRC(TxASKReg,0x40);//调试和测试用returnMI_OK;}///////////////////////////////////////////////////////////////////////功能:读RC632寄存器//参数说明:Address[IN]:寄存器地址//返回:读出的值/////////////////////////////////////////////////////////////////////unsignedcharReadRawRC(unsignedcharAddress){unsignedchari,ucAddr;unsignedcharucResult=0;MF522_SCK=0;MF522_NSS=0;ucAddr=((Address<<1)&0x7E)|0x80;for(i=8;i>0;i--){MF522_SI=((ucAddr&0x80)==0x80);MF522_SCK=1;ucAddr<<=1;MF522_SCK=0;}for(i=8;i>0;i--){MF522_SCK=1;ucResult<<=1;ucResult|=(bit)MF522_SO;MF522_SCK=0;}MF522_NSS=1;MF522_SCK=1;returnucResult;}///////////////
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药用植物鉴赏课程设计
- 植物检疫学课程设计
- 英文散文选读课程设计
- 素描班几何图形课程设计
- 火电项目风险与防范
- 自述机械课程设计过程
- 县社会稳定风险评估工作档案资料明细
- 《刑罚的消灭》课件
- 托班吸管创意课程设计
- 互联网业务员用户维护总结
- 金融模拟交易实验报告
- 国家开放大学电大本科《古代小说戏曲专题》2023期末试题及答案(试卷号:1340)
- 加德纳多元智能理论教学课件
- 北师大版数学八年级上册全册教案
- 现代文阅读之散文
- 从业人员在安全生产方面的权利和义务
- 新开模具清单
- 抗菌药物临床应用指导原则(2023年版)
- 2023年军政知识综合题库
- 2023-2024学年福建省福州市小学语文 2023-2024学年六年级语文期末试卷期末评估试卷
- YY 0286.1-2019专用输液器第1部分:一次性使用微孔过滤输液器
评论
0/150
提交评论