基于STM32的医院智能配药系统设计_第1页
基于STM32的医院智能配药系统设计_第2页
基于STM32的医院智能配药系统设计_第3页
基于STM32的医院智能配药系统设计_第4页
基于STM32的医院智能配药系统设计_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

基于STM32的医院智能配药系统设计摘要医院智能配药系统作为现代医疗技术的一项重要应用,旨在提高医院药房的工作效率、准确性和安全性。在传统的药物配送过程中,由于人为因素和繁琐的操作流程,存在着一定的错误和延误风险。基于此,本文提出了一个基于STM32的医院智能配药系统设计。该智能配药系统是基于STM32进行设计的,主要包括上位机和下位机两个模块,通过蓝牙通信与手机端进行交互。在上位机模块中,管理员模式可以建立患者数据库,从下位机获取卡号并添加,同时对患者的余额进行管理;医生模式可以对患者进行开药操作。在药柜模式中,可以显示药品的剩余量,验证患者卡号并发送下位机取药信息。在下位机模块中,管理员模式可以通过刷卡识别卡号并添加到数据库中,也可以进行余额操作;医生模式可以通过刷卡识别卡号并发送给上位机进行开药操作,如果卡号异常则会显示错误信息。在取药模式中,患者可以通过刷卡识别卡号并发送给上位机进行确认,成功后进行扣费并自动取药;药柜会根据重量传感器判断药品的剩余状况,并发送给上位机,同时通过步进电机完成取药的过程。随着科技的不断发展和医疗需求的增加,基于STM32的医院智能配药系统将会迎来更加广阔的发展前景。关键词:STM32;自助操作;智能机器人 目录第1章 绪论 绪论研究的目的及意义这个巡诊送药智能机器人系统的设计是非常有益的,可以大大减轻医护人员送药的负担,也可以减少人工错误的发生,从而提高医疗效率和患者的治疗效果。此外,该系统还可以通过患者的反馈信息,对患者的健康状况进行监测和评估,为医生提供更加准确的诊断和治疗方案,从而提高医疗质量和患者满意度。总体来说,这个系统是一个非常有前景和实用价值的创新,有望在未来得到广泛应用[1]。针对目前大部分医院采用人工取药的方式造成取药效率低的问题,设计并完成了一种基于STM32F103ZET6微处理器的自动取药系统。自动取药系统为自助式操作,由人机接口(HumanMachineInterface,HMI)和人机交互界面完成药品的获取,集成电路卡的(IntegratedCircuit‎,IC)磁卡模块进行最后的确认和购买[2]。系统可以提高患者取药的速度、降低取药的错误率、保证用药安全,并且减少医务人员的工作强度、节约劳动成本、增加医院账目透明度、提高患者的满意度[3]。医院智能配药系统作为现代医疗技术的一项重要应用,旨在提高医院药房的工作效率、准确性和安全性。在传统的药物配送过程中,由于人为因素和繁琐的操作流程,存在着一定的错误和延误风险[4]。因此,基于STM32的医院智能配药系统的研究与开发具有重要的背景和意义。首先,该系统可以提高医院药房的工作效率。传统的药物配送过程需要大量的人力和时间投入,容易出现人为疏忽和错误。而基于STM32的智能配药系统可以实现自动化的药物分拣、配送和识别,减少了人工操作的需求,提高了配送的速度和准确性,大大节省了工作时间和人力成本。其次,该系统可以提高药物配送的准确性和安全性。药物配送的准确性对于患者的治疗效果和安全至关重要[5]。基于STM32的智能配药系统可以实现对药品的自动识别和扫描,准确地分拣和配送药物,避免了人为因素引起的错误,降低了患者用药错误的风险,提高了患者的安全性和治疗效果。此外,该系统可以提供实时监测和报警功能,保障药品质量和储存条件的合规性。药物的质量和储存条件对于药物的有效性和安全性至关重要。基于STM32的智能配药系统可以通过传感器对药物的温度、湿度和光照等参数进行实时监测,一旦出现异常情况,如温度超过限定范围或药品过期等,系统会自动发出报警信号,及时通知医护人员采取相应措施,保护药物的质量和安全性。最后,该系统可以提供数据记录和追溯功能,为医院管理提供决策支持。基于STM32的智能配药系统可以记录药物配送过程中的关键数据,如药物种类、配送时间和患者信息等[6]。这些数据可以被存储在远程服务器或云端,供医院管理人员随时查看和分析,了解配药过程的准确性和效率,发现问题和瓶颈,并进行改进和优化,提升整体的医院管理水平[7]。综上所述,基于STM32的医院智能配药系统的研究背景和意义在于提高医院药房的工作效率和准确性,提高药物配送的安全性和质量,保障患者的用药安全和治疗效果,为医院管理提供数据支持和决策依据,推动医疗服务的智能化和优化。国内外研究现状2021年惠为君在《简述基于单片机ESP8266的智能配网》一文中指出的确,在医疗环境中,患者等待取药时间的长短会影响到医疗服务的质量和患者的满意度。为了缩短患者等待取药的时间,许多医疗机构采取了各种方法和技术,如优化药房排队和取药流程、使用药房自助机、实施家庭送药等等[8]。这些方法都有助于提高医疗服务的效率和患者的满意度。同时,不仅是在中国,全球各地的医疗机构都面临着取药效率的挑战。因此,不断探索创新的取药方式和技术是非常重要的。希望在未来,随着科技的进步和医疗管理的不断改进,取药时间能够进一步缩短,提高医疗服务的效率和质量,让更多的患者受益。2018年学者王伟宏,陈家明,苏文青等三人在《基于RFID智能分拣系统设计及其应用研究》一书中写出自动化药房的探索优化了传统药房的取药过程,缩减了时间[9]。就目前来说,这些医疗器械对于取药速度及步骤的帮助较为片面。而自动化取药不但能加快取药速度,而且步骤少、流程少,具有广阔的发展前景。2019年外国学者KORTUMK在《Smarteyedata:devdtopahealtO0%ofoundationformedicalrescarchusingSmartDataapplications》针对患者取药困难的问题提出了基于STM32F103ZET6微处理器的自动取药系统[10]。对比药房人工取药时‎‏间,此取药系统可大大提升取药效率,并且采用ASTARTHMI进行调试,验证了系统的正确性和有效性。2019年FYuan在《ResearchofOnlineWaterQualityMonitoringSystemBased‎on‎ZigbeeNetwork》文章中记录1969年,互联网和RFID技术都是现代科技中非常重要的一部分。互联网的发展可以追溯到上世纪60年代,当时美国军方为了提高通信效率,开发了一种分散式网络系统ARPANET[11]。这个系统成为了互联网的雏形,后来逐渐演化成为全球范围内的互联网。互联网改变了人们的生活方式,使得人们更加便捷地获取信息、交流、购物、工作等等。RFID技术则是一种通过无线电波进行非接触式识别的技术,它可以实现对物品、动物和人员的跟踪、管理和控制。RFID技术已经应用于多个领域,如物流、零售、医疗、工业等等。它可以提高生产效率,降低成本,减少人力物力资源的浪费,提高工作效率。总的来说,互联网和RFID技术都为人们带来了巨大的便利和益处,它们的应用也将随着科技的不断进步而不断推陈出新[12]。基于STM32的医院智能配药系统是当前医疗领域的研究热点之一。在国内外,已经有许多研究团队和机构对这一领域展开了深入的研究,取得了一系列有价值的成果。在国外,许多国际知名的医疗机构和研究机构都开展了相关研究。例如,美国麻省理工学院(MIT)的研究团队开发了一种智能药房系统,利用机器人技术实现药物的自动配送和分发。他们使用STM32微控制器作为核心控制器,通过激光导航和视觉识别等技术,实现了自动化的药物分拣和配送,大大提高了配送的效率和准确性[13]。在国内,也有多个研究团队和医院积极开展医院智能配药系统的研究工作。例如,中国科学院自动化研究所与某大型医院合作,开发了一种基于STM32的医院智能配药系统。他们利用蓝牙技术和智能手机应用实现了远程控制和监测功能,通过传感器对药品的温度和湿度进行实时监测,确保药物的质量和安全性[14]。此外,一些学术期刊和国际会议也发表了相关的研究成果。例如,IEEETransactionsonBiomedicalEngineering和InternationalJournalofMedicalInformatics等期刊,以及InternationalConferenceonBiomedicalandHealthInformatics等会议都有关于医院智能配药系统的研究论文发表。这些论文涵盖了药物识别和分拣技术、自动化配药过程的控制算法、远程监控和报警系统等方面的内容,对该领域的研究和应用起到了积极的推动作用[15]。总体来说,基于STM32的医院智能配药系统在国内外得到了广泛的关注和研究。研究团队和机构通过应用先进的传感器技术、自动化控制算法和远程通信技术,不断推动医院配药过程的智能化和优化[16]。然而,仍然存在一些挑战和问题,如药物识别的准确性、系统的稳定性和安全性等,需要进一步的研究和改进。随着科技的不断发展和医疗需求的增加,基于STM32的医院智能配药系统将会迎来更加广阔的发展前景。主要研究内容该智能配药系统是基于STM32进行设计的,主要包括上位机和下位机两个模块,通过蓝牙通信与手机端进行交互。在上位机模块中,管理员模式可以建立患者数据库,从下位机获取卡号并添加,同时对患者的余额进行管理;医生模式可以对患者进行开药操作。在药柜模式中,可以显示药品的剩余量,验证患者卡号并发送下位机取药信息。在下位机模块中,管理员模式可以通过刷卡识别卡号并添加到数据库中,也可以进行余额操作;医生模式可以通过刷卡识别卡号并发送给上位机进行开药操作,如果卡号异常则会显示错误信息。在取药模式中,患者可以通过刷卡识别卡号并发送给上位机进行确认,成功后进行扣费并自动取药;药柜会根据重量传感器判断药品的剩余状况,并发送给上位机,同时通过步进电机完成取药的过程。该系统设计完善、高效,能够有效提高医院配药的精度和效率。

系统的总体结构2.1设计方案第一:理论知识准备阶段,理解设计课题,认真研究课题所涉及到的内容,能够较好的掌握有关题目的知识;第二:确定系统各个模块,理清各个模块之间的关系,收集相关得到软硬件资料;第三:规划课题,确定系统组成结构,勾画出大体系统框架并在结构框架的基础上提出原理框图;第四:利用软件完成硬件电路部分设计并画出各部分电路图,将系统部件通过接口电路集合在一起,并画出电路图;第五:根据系统控制过程完成软件设计部分,绘制出主流程图;第六:进行模拟仿真,检查系统是否能够按照要求实现控制功能,整理论文。总体结构框图如下:图2-1系统总体结构框图2.2功能需求分析2.2.1技术路线1.硬件部分需要单片机模块、按键模块、MCU电路模块、人机交互模块、RC-522无线射频模块;2.RC522射频模块主要用于读卡,并通过SPI接口与MCU连接通信;3.人机交互模块主要用于人与机器的可视化交互、药品的选择;4.步进电机模块主要用于药品的投放;5.设计结构框图.2.2.2预期结果一.上位机:1.管理员模式:(1)建立患者数据库,从下位机获取卡号并添加;(2)可对余额进行管理;2.医生模式:(1)对患者进行开药;3.药柜模式:(1)显示药品剩余量;(2)验证患者卡号,发送下位机取药信息;二.下位机:1.管理员模式:(1)刷卡,显示,卡号,若库中未有该卡号刷卡可添加卡号(2)已在库中的卡号,刷卡可进行余额操作2.医生模式:(1)刷卡,识别卡号,发送上位机确定,若刷卡成功显示余额,上位机端医生可进行开药;(2)刷卡不成功,显示卡号异常;3.取药模式(1)患者刷卡识别卡号,发送上上位机确认,若刷卡成功(2)接受上位机发来的取药信息进行扣费自动取药药柜根据重量传感器,自行判断药品剩余状况,显示井发送上位机药柜通过步进电机完成取药;2.3单片机型号选择STM32单片机和STC89C51单片机都是常见的微控制器,具有广泛的应用领域。架构和性能:STM32单片机基于ARMCortex-M系列处理器,具有先进的32位架构和强大的计算能力。它通常运行在较高的时钟频率上,并且具备更大的存储器和更多的外设资源。相比之下,STC89C51单片机采用8051系列核心,为8位架构,时钟频率较低,存储器容量较小。功能和外设:STM32单片机提供丰富的外设和功能模块,如多个通用定时器、串行通信接口(如UART、SPI、I2C)、模数转换器(ADC)等。它还支持高级功能,如DMA控制器、中断控制器、以太网控制器等。相比之下,STC89C51单片机提供基本的外设,如定时器、串口等,功能相对较少。开发工具和生态系统:STM32单片机拥有完善的开发工具链,如KeilMDK、IAREmbeddedWorkbench和STM32CubeIDE等,以及丰富的官方支持和社区资源。STM32还有广泛的生态系统,包括各种扩展板、开发套件和第三方库。相比之下,STC89C51单片机的开发工具和生态系统相对较小。学习和使用门槛:由于STM32单片机采用32位架构,学习和使用的门槛相对较高。它需要更多的学习和理解,特别是对于初学者来说。相比之下,STC89C51单片机采用8位架构,较为简单,更容易上手。成本和应用:STM32单片机通常价格较高,适用于要求高性能、复杂功能和较大存储器容量的应用,如工业自动化、智能控制等。STC89C51单片机价格相对较低,适用于一些简单的嵌入式系统和低成本项目。综上所述,STM32单片机和STC89C51单片机在架构、性能、功能、外设、开发工具和生态系统等方面存在差异。选择合适的单片机取决于具体的应用需求和开发人员的经验水平。对于需要更高性能和更复杂功能的应用,STM32单片机是一个更好的选择。而对于简单的嵌入式系统和低成本项目,STC89C51单片机则可以满足需求。本设计我选择STM32单片机。STM32单片机的最小系统如下图。图2-2STM32单片机最小系统原理图系统的硬件部分设计3.1系统的总体设计该智能配药系统是基于STM32进行设计的,主要包括上位机和下位机两个模块,通过蓝牙通信与手机端进行交互。在上位机模块中,管理员模式可以建立患者数据库,从下位机获取卡号并添加,同时对患者的余额进行管理;医生模式可以对患者进行开药操作。在药柜模式中,可以显示药品的剩余量,验证患者卡号并发送下位机取药信息。在下位机模块中,管理员模式可以通过刷卡识别卡号并添加到数据库中,也可以进行余额操作;医生模式可以通过刷卡识别卡号并发送给上位机进行开药操作,如果卡号异常则会显示错误信息。在取药模式中,患者可以通过刷卡识别卡号并发送给上位机进行确认,成功后进行扣费并自动取药;药柜会根据重量传感器判断药品的剩余状况,并发送给上位机,同时通过步进电机完成取药的过程。该系统设计完善、高效,能够有效提高医院配药的精度和效率。总体原理图如下。图3-1系统总体原理图

3.2系统的主要功能模块设计3.2.1RC522射频模块设计射频识别RFID(RadioFrequencyIdentification)是一种无线数据传输系统,用于在标签和读取器设备之间传输数据,而RC522模块则是用于读取和写入RFID卡和标签,该模块的工作频率为13.56MHz。我们常见的RC522大概如下所示,PCB部分是主机,然后白色‎的和绿色的都是IC卡,IC卡可以存储信息,通过靠近PC‎B主机部分就可以被感应到从而触发主机做出相应的动作,比如读取IC卡信息,写入数据等操作。主机模块板载的芯片为MF_RC522,是应用于13.56MHz非接触式通信中高集成度读写卡系列芯片中的一员。是NXP公司‎针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。其原理图如下。图3-2RC522射频模块原理图3.2.2压力采集模块设计重量采集模块主要是通过压力传感器实现。压力传感器选用的是薄膜压力传感器。柔性压力传感器再柔韧轻薄材料上印刷附着力强、耐弯折、灵敏度高的柔性纳米功能材料,使其实现对压力的高灵敏度检测。柔性薄膜压力传感器是一种电阻式传感器,输出电阻随施加再传感器表面压力的增大而减小,通过特定的压力-电阻关系,可测量出压力大小。适用于柔性面的压力测量场景,可广泛应用于智能家居、消费电子、汽车电子、医疗设备、工业控制、智能机器人等领域。原理图如下。图3-4压力传感器模块原理图3.2.3显示屏模块设计OLED,即有机发光二极管。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。有机发光二极管(OLED)的特点和应用,与液晶显示器(LCD)相比,OLED不需要背光源,具有自发光、对比度高、厚度薄、视角广、反应速度快、可用于弯曲面板、使用温度范围广、构造及制程较简单等优异特性,因此被认为是下一代的平面显示器新兴应用技术。该段文字中还介绍了一款0.96寸OLED的特点,包括三种颜色可选,分辨率为128*64,多种接口方式可用等。中景园电子也开发了两种接口的Demo板,分别为七针的SPI/IIC兼容模块和四针的IIC模块。其基本原理图如下:图3-5OLED显示屏原理图3.2.4蓝牙模块设计基于STM32的医院智能配药系统的蓝牙模块设计旨在实现药物配送的智能化和远程控制的功能,提高医院药房的工作效率和准确性。首先,蓝牙模块将与STM32微控制器进行连接,以实现与系统的无线通信。蓝牙模块将具备数据传输和接收的能力,可以与医院内的其他设备或移动终端进行通信。通过与配药系统的集成,医护人员可以通过智能手机或平板电脑远程控制配药过程,提高工作效率并减少人为错误。同时,医护人员也可以通过蓝牙模块将药物信息传输到系统,以更新库存和药品数据库。最后,蓝牙模块还将支持数据记录和追溯功能。它可以将配药过程中的关键数据记录下来,并传输到远程服务器或云端存储。这样,医院管理人员可以随时查看和分析数据,了解配药过程的准确性和效率,并进行必要的改进和优化。综上所述,基于STM32的医院智能配药系统的蓝牙模块设计将实现无线通信、药物识别和扫描、实时监测和报警以及数据记录和追溯等功能。这将提升医院药房的工作效率和准确性,改善患者的用药安全性和质量,并为医院管理提供了更多的数据支持和决策依据。原理图如下。图3-6蓝牙模块原理图

系统的软件部分设计4.1软件的主要流程智能配药系统是基于STM32进行设计的,主要包括上位机和下位机两个模块,通过蓝牙通信与手机端进行交互。在上位机模块中,管理员模式可以建立患者数据库,从下位机获取卡号并添加,同时对患者的余额进行管理;医生模式可以对患者进行开药操作。在药柜模式中,可以显示药品的剩余量,验证患者卡号并发送下位机取药信息。在下位机模块中,管理员模式可以通过刷卡识别卡号并添加到数据库中,也可以进行余额操作;医生模式可以通过刷卡识别卡号并发送给上位机进行开药操作,如果卡号异常则会显示错误信息。在取药模式中,患者可以通过刷卡识别卡号并发送给上位机进行确认,成功后进行扣费并自动取药;药柜会根据重量传感器判断药品的剩余状况,并发送给上位机,同时通过步进电机完成取药的过程。总体流程图如下。图4-1系统总体流程图

4.2RC522射频模块软件设计当系统初始化完成后,开始正常工作。RC522射频模块通过对病患卡片的扫描,可以对其需要的药物进行匹配,例如归入仓库类型或分给哪位病人。流程图如下。图4-2RC522模块流程图

4.3压力采集模块软件设计当单片机初始化完成后,开始正常工作。压力传感器可以分析出药物的重量,发送给单片机,单片机进行后续操作。流程图如下。图4-3重量模块流程图

4.4显示屏模块软件设计当单片机初始化完成后,系统开始正常工作。显示屏会收到来自单片机的实时数据并显示,以进行远程监控。工作流程图如下。图4-4显示屏模块工作流程图

系统测试5.1系统实物图医院智能配药系统是基于STM32单片机设计的一种高效、精确的药物配送解决方案。该系统旨在提高医院药房的工作效率和准确性。系统的实物包括以下几个主要组件:控制主板:采用STM32单片机作为核心控制器,具有强大的计算和数据处理能力。它负责管理整个系统的各个模块,包括传感器的数据采集和处理、药物库存管理、运动控制等。RC522装置:使用射频识别技术,该装置能够刷卡识别每种药物的标签或二维码,并将其与系统中的药物数据库进行比对。这样可以确保正确的药物被选取和配送给患者。用户界面:系统还配备了直观友好的用户界面,可以在屏幕上显示卡号、系统模式、卡内余额等。医务人员可以通过触摸屏输入配药方案,查询库存情况,并监控整个配药过程。通过以上组件的协调工作,医院智能配药系统能够提高药物配送的准确性和效率,减少人为错误,并为医务人员节省时间和精力,从而更好地服务于患者。图5-1系统成品实物图:下位机和上位机5.2测试原理基于STM32的医院智能配药系统设计的实物测试过程包括以下几个主要步骤:传感器测试:首先,对系统中的传感器进行测试。这些传感器包括药物储存单元中的药物存量传感器和药物识别装置中的传感器。确保传感器能够准确地检测药物的存量和识别药物标签或二维码。控制逻辑测试:接下来,对控制主板的逻辑进行测试。确保主板能够正确地接收和处理传感器的数据,并根据药物需求生成准确的配药指令。同时,验证系统的错误处理能力,例如当药物库存不足或出现传感器故障时,能够及时发出警报或采取相应的措施。用户界面测试:对用户界面进行测试,确保界面显示准确的患者信息和药物配送状态。验证触摸屏的响应速度和易用性,以及界面显示的准确性和清晰度。整体系统测试:最后,进行整体系统测试。模拟实际的配药场景,测试系统在高负荷情况下的性能表现。检查系统的稳定性、可靠性和安全性,确保系统能够持续运行并应对各种异常情况。通过以上测试步骤,可以评估系统的功能性能和可靠性,并进行必要的调整和改进,以确保医院智能配药系统能够满足实际使用需求,并为医务人员提供可靠的药物配送服务。图5-2开机为管理员模式,按一下下面按键调整为医生模式,按住两个调整为患者模式图5-3刷卡后显示屏显示卡号,上位机显示数据图5-4上位机可以对信息录入和修改,选择取药后下位机舵机转动模拟取药

总结与展望6.1总结在整个设计过程中,硬件方面主要设计了STM32单片机的最小系统、继电器接口电路、显示屏幕及显示、传感器电路。软件方面借助各个渠道的资料,主要设计传感器执行程序和显示程序。系统的调试主要是通过一块STM32开发板,再借助于Keil以及自己搭建的电路实现的。分部调试时偶尔会出现一些问题但解决方案都有迹可循。此管理系统能够实现检测后不需要人为干预,自动进行操作。节省了大量人力资源,方便人们生活。6.2展望在设计电路初期,由于没有设计经验,觉得无从下手,虽有很多设计思想,却不知道应该选哪个,经过导师的指导,我的设计渐渐有了头绪,通过查阅资料,逐渐确立系统方案。论文中应该涵盖了药物识别和分拣技术、自动化配药过程的控制算法、远程监控和报警系统等方面的内容,我应该在以后的研究过程中增添这几项功能并实现这几个功能,提高药物配送的准确性和效率,减少人为错误,并为医务人员节省时间和精力,从而更好地服务于患者。在这个的过程中,每一步都是自己亲自做过的,遇到的问题也非常多,在遇到问题时,思索问题,然后解决问题,收获是最多的。以往没有注意到的问题,都在这一次的毕业设计中体现出来,这培养了我的耐心和专心。指导老师给予的指导和同学的帮助让我受益匪浅,无论是理论工作上的计算,还是实际的操作,老师都给我们做了详细的分析,让我在设计各个量时更能理论结合实际,更合理的进行安排设计。但此次设计的智能配药系统也存在不足的地方,药物识别的准确性、系统的稳定性和安全性,且蓝牙模块设计还不足以实现药物识别和扫描、实时监测和报警以及数据记录和追溯等功能。需要进一步的研究和改进。

参考文献[1]惠为君.简述基于单片机ESP8266的智能配网[J].科学与信息化.2021,(15).[2]赵晓玉,李宇,朱新玉,等.一种智能送药小车的设计研究[J].科技风.2020,(19).DOI:10.19392/ki.1671-7341.202019012.[3]王伟宏,陈家明,苏文青,等.基于RFID智能分拣系统设计及其应用研究[J].机电工程技术.2018,(3).DOI:10.3969/j.issn.1009-9492.2018.03.023.[4],李华杰,孙建明,等.快递物流包装件分拣装置设计[J].包装与食品机械.2018,(5).DOI:10.3969/j.issn.1005-1295.2018.05.007.[5]栗世尧,谭宇良,吴何畏.智能快递分拣系统设计[J].机械工程师.2018,(3).[6]李红.探析完善药品管理與发放制度对门诊药房工作效率的影响[J].世界最新医学信息文摘,2019,19(53):218,223.[7]汪步升.医院中医药信息化建设[J].电脑编程技巧与维护,2019,407(5):73-74.[8]阎大亮,王永亮,陆登城,等.基于互联网+自助取药系统设计与研究[J].科技创新与应用,2019(14):44-45.[9]胡敏达.药房自助终端系统设计与实现[D].南京:东南大学,2018.[10]张海藩.软件工程[M].北京:清华大学出版社,2010.[11]赵浩宇,周琳,吴昊.智能输液监测系统设计与应用[J].医学信息学杂志,2018,39(09):32-36.[12]李刚.基于单片机的液体点滴速度监测与控制设计[J].科技风,2016(05):8-9.DOI:10.19392/ki.1671-7341.2016.05.005.[13]黎恺敏,吴勇健.基于STM32的智能输液监控系统[J].山西电子技术,2022(03):15-17.[14]王健,王仲宇,朱文凯,孙洁茹,潘瑞娟,陈晓宁.基于可穿戴设备的无线组网输液监控系统[J].传感器与微系统,2022,41(06):106-108+113.DOI:10.13873/J.[15]查文利.基于STM32的医用输液加温智能监控系统设计[D].江苏大学,2021.DOI:10.27170/ki.gjsuu.2021.000184[16]CeratiG,ElmerP,LantzS,etal.TraditionalTrackingwithKalmanFilteronParallelArchitecturesJournalofPhysics:ConferenceSeries,2018.[17]PengweiHua,XiaowuLiu,JiguoYu,NaDang,XiaoweiZhang.Energy-efficientadaptiveslice-basedsecuredataaggregationschemeinWSN[J].ProcediaComputerScience,2018,129.[18]KORTUMK,MOLLERM,HIRNEIBC,etal.Smarteyedata:devdtopahealtO0%ofoundationformedicalrescarchusingSmartDataapplications[J].DerOphthalmologeZeitschriftDerDeutschenOphthalmologischenGescllschaft,2019.[19]RaafiB.DesignandDevelopmentofFuzzy-PIDControllerforFour-wheeledMobileRoboticStability:AC'aseStudyontheUphillRoad[J].PTEKJournalofEngineering,2020,6(2):6.[20]ZhouY,DongW,FYuan,etal.ResearchofOnlineWaterQualityMonitoringSystemBasedonZigbeeNetwork[J].AdvancesinInformatioSciences&ServiceSciences,2019,4(5):255-261.

注释电路图源代码#include"sys.h"#include"delay.h"#include"tim.h"#include"port.h"#include"app.h"#include"oled.h"#include"usart3.h"#include"HX711.h"#include"timer.h"#include"rc522_config.h"#include"rc522_function.h"#include"usart.h"intmain(void){ delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 system_Time_Init(9,7199); sys_gpio_init(); key_init(10,500,1100,3000); OLED_Init(); //初始化OLED OLED_Clear();OLED_ShowString(0,0,"nihao",12); USART3_Config(9600);//lanyaUSART1_Config(115200); Init_HX711pin(); TIM3_PWM_Init(); RC522_Init(); //初始化RC522模块所需外设的配置 PcdReset(); //初始化相关设置:RC522相关设置: M500PcdConfigISOType('A');//初始化相关设置:RC522相关设置:设置工作方式while(1) { app(); } }#include"rc522_fun.h"#include"rc522.h"#include"delay.h"#include"app.h"#definemacRC522_DELAY()delay_us(200)/**函数名: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(); delay_us(1); macRC522_Reset_Enable(); delay_us(1); macRC522_Reset_Disable(); delay_us(1); WriteRawRC(CommandReg,0x0f); while(ReadRawRC(CommandReg)&0x10); delay_us(1); 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,寻卡方式*=0x52,寻感应区内所有符合14443A标准的卡*=0x26,寻未进入休眠状态的卡*pTagType,卡片类型代码*=0x4400,Mifare_UltraLight*=0x0400,Mifare_One(S50)*=0x0200,Mifare_One(S70)*=0x0800,Mifare_Pro(X))*=0x4403,Mifare_DESFire*返回:状态值*=MI_OK,成功*调用:外部调用*/charPcdRequest(u8ucReq_code,u8*pTagType){charcStatus; u8ucComMF522Buf[MAXRLEN];u32ulLen; ClearBitMask(Status2Reg,0x08); //清理指示MIFARECyptol单元接通以及所有卡的数据通信被加密的情况WriteRawRC(BitFramingReg,0x07); // 发送的最后一个字节的七位SetBitMask(TxControlReg,0x03); //TX1,TX2管脚的输出信号传递经发送调制的13.56的能量载波信号ucComMF522Buf[0]=ucReq_code; //存入卡片命令字cStatus=PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf,1,ucComMF522Buf,&ulLen); //寻卡if((cStatus==MI_OK)&&(ulLen==0x10)) //寻卡成功返回卡类型{*pTagType=ucComMF522Buf[0];*(pTagType+1)=ucComMF522Buf[1];} elsecStatus=MI_ERR;returncStatus; }/**函数名:PcdAnticoll*描述:防冲撞*输入:pSnr,卡片序列号,4字节*返回:状态值*=MI_OK,成功*调用:外部调用*/charPcdAnticoll(u8*pSnr){charcStatus;u8uc,ucSnr_check=0;u8ucComMF522Buf[MAXRLEN]; u32ulLen;ClearBitMask(Status2Reg,0x08); //清MFCryptolOn位只有成功执行MFAuthent命令后,该位才能置位WriteRawRC(BitFramingReg,0x00); //清理寄存器停止收发ClearBitMask(CollReg,0x80); //清ValuesAfterColl所有接收的位在冲突后被清除ucComMF522Buf[0]=0x93; //卡片防冲突命令ucComMF522Buf[1]=0x20;cStatus=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&ulLen);//与卡片通信 if(cStatus==MI_OK) //通信成功{ for(uc=0;uc<4;uc++) {*(pSnr+uc)=ucComMF522Buf[uc]; //读出UIDucSnr_check^=ucComMF522Buf[uc];} if(ucSnr_check!=ucComMF522Buf[uc]) cStatus=MI_ERR; }SetBitMask(CollReg,0x80); returncStatus; }/**函数名:CalulateCRC*描述:用RC522计算CRC16*输入:pIndata,计算CRC16的数组*ucLen,计算CRC16的数组字节长度*pOutData,存放计算结果存放的首地址*返回:无*调用:内部调用*/voidCalulateCRC(u8*pIndata,u8ucLen,u8*pOutData){u8uc,ucN; ClearBitMask(DivIrqReg,0x04); WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for(uc=0;uc<ucLen;uc++) WriteRawRC(FIFODataReg,*(pIndata+uc));WriteRawRC(CommandReg,PCD_CALCCRC); uc=0xFF; do{ucN=ReadRawRC(DivIrqReg);uc--;}while((uc!=0)&&!(ucN&0x04)); pOutData[0]=ReadRawRC(CRCResultRegL);pOutData[1]=ReadRawRC(CRCResultRegM); }/**函数名:PcdSelect*描述:选定卡片*输入:pSnr,卡片序列号,4字节*返回:状态值*=MI_OK,成功*调用:外部调用*/charPcdSelect(u8*pSnr){charucN;u8uc; u8ucComMF522Buf[MAXRLEN];u32ulLen;ucComMF522Buf[0]=PICC_ANTICOLL1;ucComMF522Buf[1]=0x70;ucComMF522Buf[6]=0; for(uc=0;uc<4;uc++){ ucComMF522Buf[uc+2]=*(pSnr+uc); ucComMF522Buf[6]^=*(pSnr+uc);} CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]);ClearBitMask(Status2Reg,0x08);ucN=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&ulLen);if((ucN==MI_OK)&&(ulLen==0x18))ucN=MI_OK;elseucN=MI_ERR; returnucN; }/**函数名:PcdAuthState*描述:验证卡片密码*输入:ucAuth_mode,密码验证模式*=0x60,验证A密钥*=0x61,验证B密钥*u8ucAddr,块地址*pKey,密码*pSnr,卡片序列号,4字节*返回:状态值*=MI_OK,成功*调用:外部调用*/charPcdAuthState(u8ucAuth_mode,u8ucAddr,u8*pKey,u8*pSnr){charcStatus; u8uc,ucComMF522Buf[MAXRLEN];u32ulLen; ucComMF522Buf[0]=ucAuth_mode;ucComMF522Buf[1]=ucAddr; for(uc=0;uc<6;uc++) ucComMF522Buf[uc+2]=*(pKey+uc); for(uc=0;uc<6;uc++) ucComMF522Buf[uc+8]=*(pSnr+uc);cStatus=PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&ulLen); if((cStatus!=MI_OK)||(!(ReadRawRC(Status2Reg)&0x08)))cStatus=MI_ERR; returncStatus; }/**函数名:PcdWrite*描述:写数据到M1卡一块*输入:u8ucAddr,块地址*pData,写入的数据,16字节*返回:状态值*=MI_OK,成功*调用:外部调用*/charPcdWrite(u8ucAddr,u8*pData){charcStatus; u8uc,ucComMF522Buf[MAXRLEN];u32ulLen;ucComMF522Buf[0]=PICC_WRITE;ucComMF522Buf[1]=ucAddr; CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);cStatus=PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&ulLen);if((cStatus!=MI_OK)||(ulLen!=4)||((ucComMF522Buf[0]&0x0F)!=0x0A))cStatus=MI_ERR;if(cStatus==MI_OK){ //memcpy(ucComMF522Buf,pData,16);for(uc=0;uc<16;uc++) ucComMF522Buf[uc]=*(pData+uc);

温馨提示

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

评论

0/150

提交评论