基于STM32的猫咪健康管理监护系统设计_第1页
基于STM32的猫咪健康管理监护系统设计_第2页
基于STM32的猫咪健康管理监护系统设计_第3页
基于STM32的猫咪健康管理监护系统设计_第4页
基于STM32的猫咪健康管理监护系统设计_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

基于STM32的猫咪健康管理监护系统设计[18]。现如今现代科学技术的发展和智能技术的不断进步,猫咪健康监护系统越来越智能化,功能也越来越多样化,监测精度也越来越高。不断提高猫咪健康监测参数控制的精度,有助于监护猫咪的健康状态,从而更好的帮助猫咪的健康成长。1.4主要研究内容本系统主要设计个猫咪健康管理监护系统。基于STM32单片机通过温度传感器、心率血氧传感器、加速度传感器、蓝牙模块、GPS模块对猫咪进行检测,完成具有能检测体温、心率血氧、定位等信息以及数据上传至手机APP控制,显示屏模块显示监测数据,数据异常时蜂鸣器进行报警等功能的设计,实现的成果为实物,并通过测试并运行。图1-1内容框架第2章系统的总体结构2.1设计方案本系统主要是开发一款基于STM32的猫咪健康管理监护系统设计。本系统首先对情感这一理论进行了细致的分析,然后对猫咪的监测需求进行深入的分析并发放相关问卷调查,总结宠物在监测过程中的相关需求;其次通过研究,结合当前已有的技术,对于猫咪健康管理监护系统的设计有了更进一步的了解,将调研到的相关需求与前期的理论分析进行融合,根据相关的设计要素与设计原则来进行实践,总结出猫咪在监测过程中存在的问题,从而完成最终的设计方案。2.2预期结果通过对系统的布设和完善,最终完成的基于STM32的猫咪健康管理监护系统设计预期有如下成果:1.体温检测,温度过高时进行警告;2.心率检测,防止猫咪心率过快或异常跳动;3.通过加速度传感器,当速度过快时发出示警信号;4.GPS模块,实时监控猫咪的位置信息,并发送到移动端;5.监控一次猫咪的心率血氧、体温等参数,设定其阈值并实时上传至移动端;6.系统可实时监控猫咪的心率血氧、体温,当猫咪的心率血氧、体温与所规定的值差距过大,蜂鸣器示警;7.系统将统计好的参数上传至移动端,手机APP进行远程控制,显示屏显示各项参数。2.3单片机型号选择方案一:51单片机是一种基于Intel8051架构的8位微控制器芯片,但由于其处理能力和存储能力较低,运算能力有限,再加上51单片机的外设接口和协议相对较少。方案二:STM32系列单片机是一系列高性能、功能强大的微控制器。它们常被广泛应用于嵌入式应用程序,特别适用于那些对成本、性能和功耗要求较低的场景。这些单片机在功耗和集成度方面表现出色,并且结合了便捷的开发工具和简洁的结构,因此在业界非常受欢迎。经比较选择方案二。本实验采用的主控制芯片是STM32F103C8T6,它是一款基于STM32系列ARMCortex-M内核的32位微控制器,由意法半导体集团开发。该芯片具有64KB的程序存储器。在工作时,它需要2V至3.6V的电压,并且能够在-40°C至85°C的环境温度下正常运行。它集成了丰富的功能,可满足实验的需求。无论是在低成本、高性能还是低功耗方面,STM32F103C8T6都能够提供出色的性能。因此,它是进行该实验的理想选择。通过选择STM32F103C8T6作为主控制芯片,本实验能够充分发挥其先进的特性和可靠性,实现所需的功能。无论是在嵌入式应用程序开发、性能优化还是电源管理方面,STM32F103C8T6都能够满足要求,并为实验提供可靠的基础。图2-1STM32芯片图2.4显示模块选择方案一:LED显示屏是一种平板显示器,由一个个小的LED模块面板组成。LED面板里面存在一个发光层,它是利用液晶层的分子偏转来显示不同的图像。LED显示屏是一种通过控制半导体发光二极管的显示方式,通过灯亮灭的结果显示字符。其本身不发光,需要背光源。方案二:OLED显示屏是有机发光二极管,是不需要背光源,OLED是不需要发光层的,它的每一个像素点都可以通过电流驱动有机薄膜来进行发光的。因为其轻薄、省电等特性,广泛应用于数码产品中。OLED屏与LED屏相比,OLED屏显示图像的细腻度会更高,柔和度也会高一些,对比度会更高,特别就是在播放视屏还有一些数据信息的时候,有着明显的差异。OLED屏节能省电,因为OLED显示屏的功耗是相当低的,因为OLED屏是自发光的,不需要背光源,所以在节能方面更胜一筹,更加的环保。如果是长时间开机运行使用,OLED屏也会更加的省电,也是选择的理由之一。图2-2OLED显示屏2.5通讯模块选择蓝牙和Zigbee是现代无线通信技术的代表,它们被广泛应用于各种场景,包括智能家居、物联网和无线传感器网络等。在选择这两种技术中,我认为蓝牙是更好的选择。以下是详细的介绍。方案一:蓝牙技术是一种短距离无线通信技术,它使用2.4GHz频段进行无线通信。这种技术的最大特点是低功耗、低成本,所以被广泛应用于智能家居、智能手表和智能手机等场景。蓝牙技术具有高传输速度、广泛的设备兼容性以及简单易用的特点,成为市场上最受欢迎的无线通信技术之一。方案二:Zigbee技术是一种低功耗、低速率和低成本的短距离无线通信技术,它通常用于物联网或无线传感器网络中。与蓝牙不同,Zigbee使用不同的频谱频段进行无线通信,通常使用2.4GHz或低频段。Zigbee技术具有一些优点,比如支持更长的传输距离、更低的功耗和更高的网络容量。但是,Zigbee的设备兼容性较差,使用起来比较复杂REF_Ref22201\r\h[7]。对比后蓝牙技术是更好的选择。虽然蓝牙和Zigbee在某些方面有着相似之处,但在多数方面,蓝牙技术是更好的选择。首先,蓝牙具有更高的数据传输速率,可以满足更高的带宽需求。其次,蓝牙设备更加普及,市面上各种类型的设备都支持蓝牙,这对设备应用的广泛性和兼容性非常重要。此外,蓝牙技术还具有更简单、更易于使用的特点。据我们了解,对于多数应用场景而言,蓝牙是更优秀的选择。在智能家居、智能手表、智能手机等场景中,使用蓝牙可以满足快速的数据传输和设备之间的通信。相比之下,Zigbee所适用的物联网和无线传感器网络等应用场景中的设备对数据传输速率和带宽要求较低,且其中涉及的设备兼容性较差,使用起来更加繁琐。总之,在现代通讯技术中,蓝牙和Zigbee都是非常重要的无线通信技术,它们具有各自的优点和应用场景。但是,我们选择蓝牙作为本文推荐的通信技术,是因为蓝牙具有更广泛的应用领域、更高的数据传输速率和更多的设备兼容性。对于大多数用户而言,使用蓝牙能够提供更好的用户体验,这也是我们选择蓝牙的原因。本设计采用HC05蓝牙模块BH-HC05是秉火科技推出的蓝牙串口模块,它采用蓝牙2.0协议,可与任何版本的蓝牙兼容通讯,包括与具有蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP等终端配对,可实现串口透传功能。驱动HC05模块时只需要使用TTL电平标准的串口即可(5V/3.3V电压均可),支持的波特率范围为4800~1382400,非常适合用于单片机系统扩展蓝牙特性。图2-3蓝牙模块

第3章系统的硬件设计3.1系统总体设计采用温度传感器,可以完成对猫咪的体温监测,当猫咪体温出现异常,可以发出相应的指示;通过血氧心率传感器测量猫咪的心率血氧情况,如果心率血氧偏离正常范围,那么会发出警报;通过加速度传感器测量猫咪的速度情况,了解猫咪的运动状态。经过这些传感器的监测,可以及时的了解当前猫咪的健康状况,对于猫咪的监护起到重要作用,可以避免猫咪因为某些问题而死亡。接着对宠物的监测盖求进行深入的分析并发放相关问卷调查,总结出宠物在监测过程中的相关需求;其次通过研究,结合当前已有的技术,对于猫咪健康管理监护系统的设计有更进一步的了解,将调研到的相关需求与前期的理论分析相融合,根据相关的设计要素与设计原则进行实践,总结出猫咪监测过程中存在的问题。3.2系统的主要功能模块设计3.2.1OLED显示屏模块设计OLED显示屏是利用有机电自发光制成的显示屏。由于同时具备自发光有机电激发光二极管,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制成较简单等优异之特性。有机发光技术由非常薄的有机材料涂层和玻璃基板构成。当有电荷通过时这些有机材料就会发光。OLED发光的颜色取决于有机发光层的材料,故厂商可由改变发光层的材料而得到所需之颜色。有源阵列有机发光显示屏具有内置的电子电路系统,因此每个像素都由一个对应的电路独立驱动。OLED具备有构造简单、自发光不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广等优点,技术提供了浏览照片和视频的最佳方式而且对相机的设计造成的限制较少。图3-1显示屏模块设计3.2.2蜂鸣器模块设计蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H或“HA(旧标准用“FM”“ZZG”“LB”、“JD”等)表示。单片机对蜂鸣器的驱动方式,系统有两个他激蜂鸣器,频率都为100HZ,一个由I/O口进行控制,另一个由PWM输出口进行控制,系统还有两个按键,一个按键为PORT按键,I/O口控制的蜂鸣器不鸣叫时按次按键I/O口控制的蜂鸣器鸣叫,再按一次停止鸣叫,另一个按键为PWM按键,PWM口控制的蜂鸣器不鸣叫时按一次按键PWM输出口控制的蜂鸣器鸣叫,再按一次停止鸣叫蜂鸣器是不能用做矿石收音机的,因为,蜂鸣器内部有一个振荡电路,通上电源后就会驱动内部的一个微型喇叭发出蜂鸣声。蜂鸣器可不是一个单纯的小喇叭。另外,蜂鸣器有两种。一种是,内部自带振荡器的;一种是,需要外接一个振荡器的,也就是一个普通的微型喇叭。对于不带振荡器的那种,也是不能用的,因为它的电阻一般为32欧姆左右,也有8欧或16欧的。这些都属于低阻抗的,所以不能用。图3-2蜂鸣器模块原理图3.2.3蓝牙模块设计蓝牙模块,是一种集成蓝牙功能的PCBA板,用于短距离无线通讯,按功能分为蓝牙数据模块和蓝牙语音模块。蓝牙模块是指集成蓝牙功能的芯片基本电路集合,用于无线网络通讯,大致可分为三大类型:模块、蓝牙音频模块、蓝牙音频+数据二合一模块等。一般模块具有半成品的属性,是在芯片的基础上进行过加工,以使后续应用更为简单。蓝牙设备采用无线电波‌连接手‌机和计‌算机‎‌‏。蓝牙产品含有一块儿小小蓝牙模块及其支撑联接的蓝牙无线电和软件。当两个蓝牙设备要想互相沟通时,他们需要进行配对。蓝牙设备相互间的通信在短程(被称作微微网,指设备采用蓝牙技术联接而成的网络)的临时性网络中进行。这类网络可容下两至8台设备进行联接。当网络环境创建完成,1台设备作为主设备,而很多其他设备作为从设备。强禾科技在蓝牙设备添加和离去无线电短程传感时动态、自动创建。伴随近些年蓝牙技术的飞速发展,在功耗不断的降低的现状下,蓝牙的传输速率也不断得到了提升,使蓝牙的运用范围更为普遍。但若要设计构思一种完整的蓝牙系统,就一定要全面熟练掌握蓝牙的有关技术专业知识。蓝牙模块可以进行串口(SPI、IIC)和MCU控制设备进行数据传输。蓝牙模块可以作为主机和从机。主机便是可以搜索其他蓝牙模块并自动创建联接,从机则不可以自动创建联接,只可以等其他人联接自身。图3-3蓝牙模块原理图3.2.4GPS模块设计ATGM336H-5N是一款高精度的GPS模块。该模块由一家知名的电子技术公司设计和制造,具有卓越的性能和可靠性REF_Ref22677\r\h[11]。ATGM336H-5N采用了先进的导航芯片和接收器技术,为用户提供准确的定位和导航功能。该GPS模块采用了高灵敏度的接收器,能够快速且可靠地接收全球定位系统(GPS)卫星信号。它支持多种导航系统,包括美国的GPS、俄罗斯的GLONASS、中国的北斗卫星导航系统等,从而增强了定位的可靠性和准确性。ATGM336H-5N具有出色的定位精度,能够在室内和城市峡谷等信号受阻的环境下提供稳定的定位性能。它还支持高达10Hz的定位更新频率,使得用户可以获得实时的位置信息。该GPS模块具有低功耗设计,能够有效延长设备的电池寿命。它还采用了小尺寸的封装,方便集成到各种应用中。同时,它还提供了丰富的接口和通信协议,如UART、SPI和I2C,以便于与主控制器或其他外部设备进行连接和通信。ATGM336H-5N还支持多种导航功能和服务,如导航状态指示、速度测量、航向计算等。它可以广泛应用于汽车导航、航空航天、船舶定位、无人机导航、移动设备导航等领域。此外,ATGM336H-5N还具有良好的抗干扰性能和高可靠性。它采用了先进的抗干扰技术,能够有效抵御电磁干扰和多路径效应,提供稳定可靠的定位结果。总之,ATGM336H-5N是一款高精度、可靠性强的GPS模块,具有出色的定位精度、低功耗设计和多种导航功能。它适用于各种应用场景,为用户提供准确可靠的定位和导航服务。无论是在消费电子产品还是工业领域,ATGM336H-5N都能够为用户的应用提供卓越的性能和便利的使用体验。图3-4GPS模块电路图3.2.5温度传感器模块设计我们采用DS18B20温度传感器,DS18B20有三只引脚,VCC,DQ和VDD。而HJ-2G板子上,采用了外部供电的链接方式,而总线必须链接上拉电阻。这一目的告诉我们,一线总线在空置状态时,都是一直处于高电平。DS18B20的内部有64位的ROM单元,和9字节的暂存器单元。图3-5DS18B20温度传感器模块电路图3.2.6加速度传感器模块设计采用加速度传感器不间断的记录动物的行为数据,在一段时间内的速度变化,实时监测猫咪的行为情况,通过蓝牙连接上位机实时数据传输充分有效了解猫咪的行为状态。图3-6加速度传感器电路图3.2.7心率血氧传感器模块设计MAX30100是一种能够监测心率、血氧的传感器,是一种通过IIC进行通信的通信方式。它工作原理是通过红外LED灯进行照射,从而得到心率的ADC值。该传感器其中包含两个LED、一个光电探测器、经过优化的光学器件和低噪声模拟信号处理器。测量用到的方法为光容积法。需注意的是SCL和SDA接4.7K上拉电阻到VCC,这样可使的总线在空闲时处于高电平,数据传输准确REF_Ref22429\r\h[8]。图3-7心率血氧传感器模块电路图第4章系统的软件设计4.1软件的主要流程本系统主要是开发一款基于STM32的猫咪健康管理监护系统设计。本系统采用温度传感器,可以完成对猫咪的体温监测,当猫咪体温出现异常,可以发出相应的指示;通过心率血氧传感器测量猫咪的情况,如果阈值偏离正常范围,那么会发出警报;通过加速度传感器测量猫咪的速度情况,了解猫咪的运动状态。经过这些传感器的监测,可以及时的了解当前猫咪的健康状况,对于猫咪的监护起到重要作用,可以避免猫咪因为某些问题而死亡。接着对猫咪的监测需求进行深入的分析并发放相关问卷调查,总结出猫咪在监测过程中的相关需求;其次通过研究,结合当前已有的技术,对于猫咪健康管理监护系统的设计有了更进一步的了解,将调研到的相关需求与前期的理论分析进行相融合,并根据相关的设计要素与设计原则来指导设计实践,总结出猫咪监测过程中存在的问题。图4-1主系统流程图4.2OLED显示屏软件设计首先系统进行初始化,初始化完成后,单片机进行设定的程序运行,传感器进行数据的采集,采集的数据将会从我们的OLED显示屏上显示出来。图4-2OLED显示屏软件设计4.3蜂鸣器模块软件设计首先系统进行初始化,初始化完成后,单片机进行设定的的程序运行,传感器进行数据的采集,采集的数据将会从我们的OLED显示屏上显示出来。与上位机之间可以通过蓝牙模块进行连接,采集的数据也可以从上位机上进行显示,也可以从上位机上进行数据的设定,出现异常情况时,系统将会进行报警提示。图4-3蜂鸣器模块软件设计4.4蓝牙模块软件设计首先系统进行初始化,初始化完成后,单片机进行设定的程序运行,传感器进行数据的采集,采集的数据将会从我们的OLED显示屏上显示出来。与上位机之间可以通过蓝牙模块进行连接,采集的数据也可以从上位机上进行显示,也可以从上位机上进行数据的设定。图4-4蓝牙模块软件设计4.5GPS模块软件设计首先系统进行初始化,初始化完成后,单片机进行设定的程序运行,GPS定位模块进行数据的采集,采集的数据将会从我们的OLED显示屏和上位机上显示出来。图4.5GPS模块软件设计4.6温度传感器模块软件设计首先系统进行初始化,初始化完成后,单片机进行设定的程序运行,温度传感器传感器进行数据的采集,采集的数据将会从我们的OLED显示屏和上位机上显示出来。图4-6DS18B20温度传感器软件设计4.7加速度传感器模块软件设计首先系统进行初始化,初始化完成后,单片机进行设定的程序运行,加速度传感器进行数据的采集,采集的数据将会从我们的OLED显示屏和上位机中显示出来。图4-7加速度传感器软件设计4.8心率血氧传感器模块软件设计首先系统进行初始化,初始化完成后,单片机进行设定的程序运行,心率血氧传感器进行数据的采集,采集的数据将会从我们的OLED显示屏和上位机中显示出来。图4-8心率血氧传感器软件设计第5章系统测试5.1系统实物测试第一步:接通实物电源,按下显示屏开关按钮,初始化信息,各模块进入初始阶段;首先从手机APP上注册账号,注册成功后,登录账号。进入界面再点击右上角,连接蓝牙,使实物和上位机联系在一起。手机APP上会显示时间和GPS定位经纬度信息。第二步:设置体温、心率血氧、速度的阈值,根据猫咪的生理情况,猫咪的体温正常为38℃~39℃,心率为120~180次,所以体温设定为39℃,心率设定值为180,速度设定值为40。设置我们的各项阈值,然后就可以从我们的显示屏上看到我们设置的阈值。图5-1手机APP第三步:测试体温,用手捏住温度传感器,温度传感器通过单片机传输到显示屏,上位机通过蓝牙传输接受数据记录数值,当体温超过阈值后,蜂鸣器会进行报警。图5-2体温测试第四步:测试速度,用手晃动加速度传感器,当超过阈值后蜂鸣器进行报警,手机APP记录数值。图5-3速度测试最后是测试心率血氧,用手捏住心率血氧传感器,按压第一个按钮,开始监测心率血氧,大约20s后显示屏上的数据会发生改变,手机APP记录数值测试完成。图5-4心率血氧测试在整个测试过程中,我们首先在手机APP上进行设置,然后通过实际操作来模拟不同传感器的工作情况。我们可以通过观察显示屏上的数据和听取蜂鸣器的报警声来确认传感器是否正常工作。这种测试方法的优势在于,我们可以通过模拟操作来快速检测传感器的功能。通过上位机的设置,我们能够方便地调整阈值,以适应不同的测试需求。同时,蜂鸣器的报警功能能够直观地告知用户传感器是否正常工作或者是否超过了设定的阈值。通过以上测试,我们能够验证体温传感器、加速度传感器和心率血氧传感器的功能和准确性。这些传感器在医疗监测、运动设备和健康管理等领域中具有重要的应用价值。通过对它们的测试,我们可以确保它们能够正常工作,并为用户提供准确可靠的数据。

第6章总结与展望6.1总结猫咪是众人喜爱的宠物,但是随着人们对于健康生活的追求和对于宠物健康的重视,对于猫咪的健康检测也变得越来越重要了。针对这种需求,我们设计了一款基于STM32的猫咪健康管理监护系统,在设计开始之前,首先要明确目标,我们需要实现以下几个功能:对猫咪的体温、心率血氧、速度运动状态等生理参数进行测量和记录。将上述数据通过蓝牙与手机连接,并通过APP实现实时监测和管理。在确定目标之后,开始着手设计,考虑到猫咪日常生活中的常规活动,设计了一款传感器,通过该传感器可以获取猫咪的在其上部活动的情况,上还配备了体温传感器、心率血氧传感器、加速度传感器等传感器来获取猫咪生理参数。传感器采用STM32作为核心处理器,并配置蓝牙模块用于数据传输。在这个设计调试的过程中,遇到了一些挑战和问题。虽然经历了一些坎坷,但在指导老师的帮助下,我们成功地发现了问题的根源,并及时进行了修正。这些问题主要涉及焊接和调试,在测试过程中也遇到了一些自己难以察觉的错误。然而,通过老师的指导和纠正,我们顺利解决了这些困难。首先,焊接方面存在一些技术不足的问题。由于缺乏经验和技巧,我们的焊接效果并不理想,需要多次尝试和修复。焊接是整个设计中至关重要的一环,良好的焊接质量直接影响设备的可靠性和性能。在老师的指导下,我们学到了正确的焊接方法和技巧,逐渐改善了焊接质量,并最终得到了满意的结果。此外,在调试过程中也遇到了一些问题。由于设计中的复杂性和各种元件的互相影响,一些错误可能不易被察觉和发现。然而,通过老师的指正和专业知识的支持,我们能够发现并解决这些问题。老师提供了宝贵的经验和建议,帮助我们理清了思路,并指导我们进行逐步排查和修复。通过这个过程,我们学到了很多调试技巧和方法,提高了自己的问题解决能力。这个设计调试过程中所遇到的困难和错误并没有阻碍我们的进展,相反,它们成为我们成长和学习的机会。在指导老师的帮助下,学会了如何面对问题、分析问题,并提出解决方案。也认识到了自身的不足,并通过不断的努力和实践来改善和提高。总结起来,设计调试的过程充满了挑战和学习。在焊接和调试过程中遇到的问题是正常的,但通过老师的指导和支持,我们得以发现并解决这些问题。这个过程不仅提高了我们的技术水平,也培养了我们的问题解决能力和团队合作精神。通过克服困难和错误,我们成功地完成了设计调试,并为以后的工作积累了宝贵的经验和知识。通过本次设计,我们成功实现了一款基于STM32的猫咪健康管理监护系统,该系统可以实时监测和管理猫咪的生理参数,并对猫咪的日常活动进行监测和记录,数据传输距离短,但具有较高的实时性。我们相信该系统可以为猫咪荣誉为主人提供较好的监护服务。6.2展望展望未来,我们认为该猫咪健康管理监护系统具有广阔的发展前景。一方面,我们可以将产品连接到物联网平台,实现云端的控制和监测。这将为用户提供更便捷的操作和远程监控功能,使猫主人能够随时关注和照顾自己的宠物。另一方面,我们可以进一步完善系统的功能和性能,例如增加更多的传感器来监测猫咪的健康指标,从而实现更全面的健康管理。除了在猫咪健康管理领域的应用,我们也可以将所学到的知识和经验应用于其他领域。比如,我们可以借鉴这个系统的设计思路和方法,开发其他宠物或动物的健康管理监护系统。此外,我们也可以将所学到的电路设计、嵌入式系统开发等技术应用于其他物联网设备或嵌入式系统的设计中,为人们的生活提供更多便利和创新。总之,通过这个研究项目,我们不仅成功设计了一款猫咪健康管理监护系统,还获得了宝贵的知识和经验。我们了解到了焊接的重要性、电路设计的关键因素以及良好的软件编程实践。未来,我们将继续努力改进和扩展该系统,并将所学到的技术应用于更广泛的领域,为人们的生活带来更多的创新和便利。

参考文献杜文涛,彭吁军.宠物健康监测穿戴环设计[J].明日风尚,2021.吴超.可穿戴的心率监测设备设计[J].物联网技术,2021,11(7):4.郑春弟,李刚,陈荟慧,等.二次谐波加权重构的77GHzFMCW雷达心率监测方法[J],西安电子科技大学学报,2020.陶毅阳.穿戴式体温监测设备的服务设计研究[J/OL].包装工程,2021.姜艳茹,孟令军.可穿戴式体温监测预警系统设计[P].电子测量技术,2021.李佳,李万军,顾俊杰,等.基于蓝牙低功耗技术的体温监测系统的设计[C].北华航天工业学院学报,2020.杨琳琳.基于ZigBee技术的体温监测系统的设计[J].河南师范大学,2021.吴超.可穿戴的心率监测设备设计[C].物联网技术,2022.沈健.多功能身体健康监测仪设计[P].长春大学学报,2018.高鹏彪.人体生物信息的检测与健康监测系统的应用[M].吉林大学,2019.汤致远,沈亮,等.基于北斗的智能定物防丢器设计[J].物联网技术,2020.(11).%E5%8F%B2%E5%AE%8F%E9%91%AB""史宏鑫,刘超,等.基于蓝牙无线控制的智能宠物穿戴设备设计[J].轻工科技,2018,(1).76-77,111.葛泽勋,曹秒,安志勇.基于距离补偿的红外测温系统设计[J].长春理工大学学报(自然科学版),2019,42(2):57-60,64.刘笑平,曾文芳.基于STM32的身份验证与体温监测一体化系统[J].湖北理工学院学报,2022,38(06):11-14.赵光晶,赵鸣,张友浩,等.基于STC89C52单片机的心率检测系统设计与实现[J].智能计算机与应用,2021,11(5):4.DOI:10.3969/j.issn.2095-2163.2021.05.018.SaeediMohammad;Rashidy-PourAli.MarsIncorporated;PatentIssuedforPetHealthMonitorWithCollarAttachmentAndCharger(USPTO10,420,401).[P].2021.MarsIncorporated;PatentIssuedforPetHealthMonitorWithCollarAttachmentAndCharger(USPTO10,420,401)[J].JournalofEngineering,2019.MarsIncorporated;ResearchersSubmitPatentApplication,"PetHealthMonitorWithCollarAttachmentAndCharger",forApproval(USPTO20200000183)[J].Politics&GovernmentWeek,2020.JournalofEngineering.PetWireless,Inc.;PatentIssuedforSystems,MethodsandComputerProgramProductsforMonitoringtheBehavior,Health,And/OrCharacteristicsofanAnimal[P].2022.VeterinaryWeek.PetPaceLtd.;"AcousticallyEnhancedPetAnimalCollarforHealth&VitalSignsMonitoring,AlertandDiagnosis"inPatentApplicationApprovalProcess.[C]2021.附录A电路图

附录B源代码#include"delay.h"#include"sys.h"#include"oled.h"#include"bmp.h"#include"key.h"#include"usart.h"#include"usart2.h"#include"usart3.h"#include"led.h"#include"adc.h"#include"ds18b20.h"#include"bsp_i2c_gpio.h"#include"stm32f10x_i2c.h"#include<stdio.h>#include<math.h>#include"my_adxl345.h"#defineSAMPLE_50//如果定义此宏就是50采样率否则是100#defineUSR_I2C_USEDI2C1shorttemperature; u8tem[8];u8temperaturedyu=30; u8temperaturehyu=32; u8temgyu[8];u8temdyu[8];u16qingxieyu=40; u8qingxieyus[15];u16co;u8coshu[8];unsignedintcoyu=200;u8coyus[8];unsignedintyayu=150;u16ya;u8yas[8];u8yayus[8];intfragment=0;u8send[40];unsignedintxlyu=120;u16xl;u8xls[8];u8xlyus[8];unsignedintxyyu=90;u16xy;u8xys[8];u8xyyus[8];intjiaodu=0;u8jd[15];intbeepnum=0;intbiaozhi=0;intbiaozhi1=0;intbiaozhi2=0;intbiaozhi3=0;intbiaozhi4=0;intbiaozhi5=0;u16temp_num=0;u16fifo_word_buff[15][2];u16Heart_Rate=0;//心率u16s1_max_index=0;u16s2_max_index=0;u16yuzhi=100;floatsp02_num=0;voidUSART1_Puts(char*str){while(*str){USART1->DR=*str++;while((USART1->SR&0X40)==0);}}voidUSART3_Puts(char*str){while(*str){USART3->DR=*str++;while((USART3->SR&0X40)==0);}}voidUSART2_Puts(char*str){while(*str){USART2->DR=*str++;while((USART2->SR&0X40)==0);}}#if0voidI2C1_Configuration(void){ I2C_InitTypeDefI2C_InitStructure; GPIO_InitTypeDefGPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /*PB6,7SCLandSDA*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD; GPIO_Init(GPIOB,&GPIO_InitStructure); I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1=0x30;I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed=100000;//100K速度 I2C_Cmd(I2C1,ENABLE); I2C_Init(I2C1,&I2C_InitStructure); /*允许1字节1应答模式*/ I2C_AcknowledgeConfig(I2C1,ENABLE);printf("I2C1_Configuration\n\r");}voidI2C1_GPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure;//GPIO结构体定义 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能I2C的IO口 /*使能与I2C1有关的时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); /*PB6-I2C1_SCL、PB7-I2C1_SDA*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //PIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;//开漏输出 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化结构体配置}/*I2C工作模式配置*/voidI2C1_Mode_config(void){ /*定义I2C结构体*/ I2C_InitTypeDefI2C_InitStructure; /*配置为I2C模式*/ I2C_InitStructure.I2C_Mode=I2C_Mode_I2C; /*该参数只有在I2C工作在快速模式(时钟工作频率高于100KHz)下才有意义。*/ I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2; /*设置第一个设备自身地址*/ I2C_InitStructure.I2C_OwnAddress1=0x30; /*使能应答*/ I2C_InitStructure.I2C_Ack=I2C_Ack_Enable; /*AT24C02地址为7位所以设置7位就行了*/ I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;/*时钟速率,以HZ为单位的,最高为400khz*/ I2C_InitStructure.I2C_ClockSpeed=20000; /*使能I2C1*/ I2C_Cmd(I2C1,ENABLE); /*I2C1初始化*/ I2C_Init(I2C1,&I2C_InitStructure); }voidI2C2_Configuration(void){ I2C_InitTypeDefI2C_InitStructure; GPIO_InitTypeDefGPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /*PB10,11SCLandSDA*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD; GPIO_Init(GPIOB,&GPIO_InitStructure); I2C_DeInit(I2C2);I2C_InitStructure.I2C_Mode=I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1=0x30;I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed=100000;//100K速度 I2C_Cmd(I2C2,ENABLE); I2C_Init(I2C2,&I2C_InitStructure); /*允许1字节1应答模式*/ I2C_AcknowledgeConfig(I2C2,ENABLE);printf("I2C2_Configuration\n\r");}voidI2C2_GPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure;//GPIO结构体定义 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能I2C的IO口 /*使能与I2C1有关的时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE); /*PB10-I2C2_SCL、PB11-I2C2_SDA*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //PIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;//开漏输出 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化结构体配置}/*I2C工作模式配置*/voidI2C2_Mode_config(void){ /*定义I2C结构体*/ I2C_InitTypeDefI2C_InitStructure; /*配置为I2C模式*/ I2C_InitStructure.I2C_Mode=I2C_Mode_I2C; /*该参数只有在I2C工作在快速模式(时钟工作频率高于100KHz)下才有意义。*/ I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2; /*设置第一个设备自身地址*/ I2C_InitStructure.I2C_OwnAddress1=0x30; /*使能应答*/ I2C_InitStructure.I2C_Ack=I2C_Ack_Enable; /*AT24C02地址为7位所以设置7位就行了*/ I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;/*时钟速率,以HZ为单位的,最高为400khz*/ I2C_InitStructure.I2C_ClockSpeed=100000; /*使能I2C1*/ I2C_Cmd(I2C2,ENABLE); /*I2C1初始化*/ I2C_Init(I2C2,&I2C_InitStructure); }#endifexternvoidtest_max30100_fun(void);//max30100测试函数externu8max10300_Bus_Read(u8Register_Address);//max30100读取数据函数externvoidmax10300_init(void);//max30100初始化函数u8weidu[15];u8jingdu[15];externfloataccel_X,accel_Y,accel_Z;voiddata_pros()//数据处理{shortxang,yang,zang;u8key;ADXL345_Read_Average(10);//读取3个方向的加速度10次xang=ADXL345_Get_Angle(accel_X,accel_Y,accel_Z,1); jiaodu=(int)accel_X/10; if(jiaodu>1000)jiaodu=0; jd[0]=jiaodu%1000/100+'0'; jd[1]=jiaodu%100/10+'0'; jd[2]=jiaodu%10+'0'; jd[3]=0; OLED_ShowString(50,32,jd,16); OLED_Refresh(); if(jiaodu>qingxieyu){ biaozhi3=1; }else{ biaozhi3=0; } }intmain(void){ inti,j; delay_init(); NVIC_Configuration(); OLED_Init(); OLED_ColorTurn(0);//0正常显示,1反色显示OLED_DisplayTurn(0);//0正常显示1屏幕翻转显示 OLED_Refresh(); OLED_Clear(); beep_Init(); beep=0; Adc_Init(); //ADC初始化 usart2_init(9600);usart3_init(9600);uart_init(9600); bsp_InitI2C();//max30100驱动初始化 max10300_init();//max30100初始化 OLED_ShowChinese(0,0,0,16);//系 OLED_ShowChinese(18,0,1,16);//统 OLED_ShowString(36,0,":",16);OLED_ShowChinese(0,16,2,16);//系 OLED_ShowChinese(18,16,3,16);//统 OLED_ShowString(36,16,":",16);OLED_ShowChinese(0,32,4,16);//系 OLED_ShowChinese(18,32,5,16);//统 OLED_ShowString(36,32,":",16); OLED_Refresh();LED1=0;LED2=0;LED3=0; while(DS18B20_Init()) //DHT11初始化 { delay_ms(200);} while(ADXL345_Init()){ delay_ms(200); } weidu[0]='3'; weidu[1]='4'; weidu[2]='.'; weidu[3]='3'; weidu[4]='8'; weidu[5]='1'; weidu[6]='7'; weidu[7]='6'; weidu[8]='6'; weidu[9]=0; jingdu[0]='1'; jingdu[1]='2'; jingdu[2]='2'; jingdu[3]='.'; jingdu[4]='2'; jingdu[5]='4'; jingdu[6]='5'; jingdu[7]='0'; jingdu[8]='1'; jingdu[9]='6'; jingdu[10]=0; KEY_Init(); temdyu[0]=temperaturedyu/10+'0'; temdyu[1]=temperaturedyu%10+'0'; OLED_ShowString(95,0,temdyu,16); xlyus[0]=xlyu/100+'0'; xlyus[1]=xlyu%100/10+'0'; xlyus[2]=xlyu%10+'0'; xlyus[3]=0; OLED_ShowString(95,16,xlyus,16); qingxieyus[0]=qingxieyu/100+'0'; qingxieyus[1]=qingxieyu%100/10+'0'; qingxieyus[2]=qingxieyu%10+'0'; OLED_ShowString(90,32,qingxieyus,16); OLED_ShowString(0,48,weidu,12); OLED_ShowString(55,48,jingdu,12); OLED_Refresh(); while(1) { ya=Get_Adc_Average(ADC_Channel_0,10)/10; temperature=DS18B20_Get_Temp(); tem[0]=temperature/100+'0'; tem[1]=temperature%100/10+'0'; tem[2]='.'; tem[3]=temperature%10+'0'; tem[4]=0; data_pros(); OLED_ShowString(54,0,tem,16); OLED_Refresh(); if(USART3_RX_STA==1) //确定是否收到"GNRMC"这一帧数据 { USART3_RX_STA=0; if(USART3_RX_BUF[1]=='G'&&USART3_RX_BUF[2]=='N'&&USART3_RX_BUF[3]=='R'&&USART3_RX_BUF[4]=='M'&&USART3_RX_BUF[5]=='C'){ if(USART3_RX_BUF[30]=='N'){ weidu[0]=USART2_RX_BUF[20]; weidu[1]=USART2_RX_BUF[21]; weidu[2]='.'; weidu[3]=USART2_RX_BUF[22]; weidu[4]=USART2_RX_BUF[23]; weidu[5]=USART2_RX_BUF[25]; weidu[6]=USART2_RX_BUF[26]; weidu[7]=USART2_RX_BUF[27]; weidu[8]=USART2_RX_BUF[28]; weidu[9]=0; jingdu[0]=USART2_RX_BUF[32]; jingdu[1]=USART2_RX_BUF[33]; jingdu[2]=USART2_RX_BUF[34]; jingdu[3]=USART2_RX_BUF[37]; jingdu[4]=USART2_RX_BUF[35]; jingdu[5]=USART2_RX_BUF[36]; jingdu[6]=USART2_RX_BUF[38]; jingdu[7]=USART2_RX_BUF[39]; jingdu[8]=USART2_RX_BUF[40]; jingdu[9]=USART2_RX_BUF[41]; jingdu[10]=0; } } } if(USART2_RX_STA==1){ USART2_RX_STA=0; if(USART2_TX_BUF[1]=='1'){ temperaturedyu=(USART2_TX_BUF[2]-'0')*10+USART2_TX_BUF[3]-'0'; xlyu=(USART2_TX_BUF[4]-'0')*100+(USART2_TX_BUF[5]-'0')*10+USART2_TX_BUF[6]-'0'; qingxieyu=(USART2_TX_BUF[7]-'0')*100+(USART2_TX_BUF[8]-'0')*10+USART2_TX_BUF[9]-'0'; temdyu[0]=temperaturedyu/10+'0'; temdyu[1]=temperaturedyu%10+'0'; OLED_ShowString(95,0,temdyu,16); xlyus[0]=xlyu/100+'0'; xlyus[1]=xlyu%100/10+'0'; xlyus[2]=xlyu%10+'0'; xlyus[3]=0; OLED_ShowString(95,16,xlyus,16); qingxieyus[0]=qingxieyu/100+'0'; qingxieyus[1]=qingxieyu%100/10+'0'; qingxieyus[2]=qingxieyu%10+'0'; OLED_ShowString(90,32,qingxieyus,16); OLED_ShowString(0,48,weidu,12); OLED_ShowString(55,48,jingdu,12); OLED_Refresh(); } } if(KEY0==1) { test_max30100_fun(); } if(temperature>temperaturedyu*10){ biaozhi1=1; }else{ biaozhi1=0; } if(biaozhi1==1||biaozhi2==1||biaozhi3==1){ beep=1; delay_ms(500); }else{ delay_ms(500); beep=0; } send[0]='w';send[1]='1'; send[2]=temperature/100+'0'; send[3]=temperature%100/10+'0'; send[4]='.'; send[5]=temperature%10+'0'; send[6]=xl%1000/100+'0'; send[7]=xl%100/10+'0'; send[8]=xl%10+'0'; send[9]=jiaodu%1000/100+'0'; send[10]=jiaodu%100/10+'0'; send[11]=jiaodu%10+'0'; send[12]=weidu[0]; send[13]=weidu[1]; send[14]=weidu[2]; send[15]=weidu[3]; send[16]=weidu[4]; send[17]=weidu[5]; send[18]=weidu[6]; send[19]=weidu[7]; send[20]=weidu[8]; send[21]=jingdu[0]; send[22]=jingdu[1]; send[23]=jingdu[2]; send[24]=jingdu[3]; send[25]=jingdu[4]; send[26]=jingdu[5]; send[27]=jingdu[6]; send[28]=jingdu[7]; send[29]=jingdu[8]; send[30]=jingdu[9]; send[31]=biaozhi1%10+'0'; send[32]=biaozhi2%10+'0'; send[33]=biaozhi3%10+'0'; send[34]='z'; send[35]=0; USART2_Puts(send); }}#definemax10300_WR_address0xAE//max30100芯片地址/**function:max10300_Bus_Write(u8Register_Address,u8Word_Data)*成功返回1,失败返回0*/u8max10300_Bus_Write(u8Register_Address,u8Word_Data)//向max30100的Register_Address写一个Word_Data数据{ /*第1步:发起I2C总线启动信号*/ i2c_Start(); /*第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读*/ i2c_SendByte(max10300_WR_address|I2C_WR); /*此处是写指令*/ /*第3步:发送ACK*/ if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第4步:发送字节地址*/ i2c_SendByte(Register_Address); if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第5步:开始写入数据*/ i2c_SendByte(Word_Data); /*第6步:发送ACK*/ if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*发送I2C总线停止信号*/ i2c_Stop(); return1; /*执行成功*/ cmd_fail:/*命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备*/ /*发送I2C总线停止信号*/ i2c_Stop(); return0;}/**function:max10300_Bus_Read(u8Register_Address)*成功返回1,失败返回0*/u8max10300_Bus_Read(u8Register_Address)//向max30100的Register_Address处读取数据{ u8data; /*第1步:发起I2C总线启动信号*/ i2c_Start(); /*第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读*/ i2c_SendByte(max10300_WR_address|I2C_WR); /*此处是写指令*/ /*第3步:发送ACK*/ if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第4步:发送字节地址,*/ i2c_SendByte((uint8_t)Register_Address); if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第6步:重新启动I2C总线。下面开始读取数据*/ i2c_Start(); /*第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读*/ i2c_SendByte(max10300_WR_address|I2C_RD); /*此处是读指令*/ /*第8步:发送ACK*/ if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第9步:读取数据*/ { data=i2c_ReadByte(); /*读1个字节*/ i2c_NAck(); /*最后1个字节读完后,CPU产生NACK信号(驱动SDA=1)*/ } /*发送I2C总线停止信号*/ i2c_Stop(); returndata; /*执行成功返回data值*/ cmd_fail:/*命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备*/ /*发送I2C总线停止信号*/ i2c_Stop(); return0;}staticvoidi2c_Delay(void)//iic的延时函数{ uint8_ti; /* CPU主频168MHz时,在内部Flash运行,MDK工程不优化。用台式示波器观测波形。 循环次数为5时,SCL频率=1.78MHz(读耗时:92ms,读写正常,但是用示波器探头碰上就读写失败。时序接近临界) 循环次数为10时,SCL频率=1.1MHz(读耗时:138ms,读速度:118724B/s) 循环次数为30时,SCL频率=440KHz,SCL高电平时间1.0us,SCL低电平时间1.2us 上拉电阻选择2.2K欧时,SCL上升沿时间约0.5us,如果选4.7K欧,则上升沿约1us 实际应用选择400KHz左右的速率即可 */ for(i=0;i<30;i++);}#if1voidmax10300_FIFO_Read(u8Register_Address,u16Word_Data[][2],u8count)//读取max30100已经转换好的心率,血氧,温度的数据{ u8i=0; u8no=count; u8data1,data2; /*第1步:发起I2C总线启动信号*/ i2c_Start(); /*第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读*/ i2c_SendByte(max10300_WR_address|I2C_WR); /*此处是写指令*/ /*第3步:发送ACK*/ if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第4步:发送字节地址,*/ i2c_SendByte((uint8_t)Register_Address); if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第6步:重新启动I2C总线。下面开始读取数据*/ i2c_Start(); /*第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读*/ i2c_SendByte(max10300_WR_address|I2C_RD); /*此处是读指令*/ /*第8步:发送ACK*/ if(i2c_WaitAck()!=0) { gotocmd_fail; /*EEPROM器件无应答*/ } /*第9步:读取数据*/ while(no) { data1=i2c_ReadByte(); i2c_Ack(); data2=i2c_ReadByte(); i2c_Ack(); Word_Data[i][0]=(((u16)data1<<8)|data2);// data1=i2c_ReadByte(); i2c_Ack(); data2=i2c_ReadByte(); if(1==no) i2c_NAck(); /*最后1个字节读完后,CPU产生NACK信号(驱动SDA=1)*/ else i2c_Ack(); Word_Data[i][1]=(((u16)data1<<8)|data2); no--; i++; } /*发送I2C总线停止信号*/ i2c_Stop();cmd_fail:/*命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备*/ /*发送I2C总线停止信号*/ i2c_Stop();}#else/*固件库函数操作--读取max30100已经转换好的心率,血氧,温度的数据*/voidmax10300_FIFO_Read(u8Register_Address,u16Word_Data[][2],u8count){ u8i=0; u8no=count; u8data1,data2; while(I2C_GetFlagStatus(USR_I2C_USED,I2C_FLAG_BUSY)) ;//调用库函数检测I2C器件是否处于BUSY状态 I2C_AcknowledgeConfig(USR_I2C_USED,ENABLE);/*允许1字节1应答模式*/ I2C_GenerateSTART(USR_I2C_USED,ENABLE); while(!I2C_CheckEvent(USR_I2C_USED,I2C_EVENT_MASTER_MODE_SELECT)) ;//清除EV5 I2C_Send7bitAddress(USR_I2C_USED,max10300_WR_address,I2C_Direction_Transmitter); while(!I2C_CheckEvent(USR_I2C_USED,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) ;//ADDR=1,清除EV6 I2C_SendData(USR_I2C_USED,Register_Address); while(!I2C_CheckEvent(USR_I2C_USED,I2C_EVENT_MASTER_BYTE_TRANSMITTED)) ;//移位寄存器非空,数据寄存器已经空,产生EV8,发送数据到DR既可清除

温馨提示

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

评论

0/150

提交评论