版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[20]。所以选择了方案二。采用了STM32F103C8T6单片机。该系列产品基于超低功耗的ARMCortex-M0处理器内核,整合增强的技术和功能,瞄准超低成本预算的应用。该系列微控制器缩短了采用8位和16位微控制器的设备与采用32位微控制器的设备之间的性能差距,能够在经济型用户终端产品上实现先进且复杂的功能。STM32F103C8T6是一款全系列省电方案的设计和实现。包括12位模数转换器、定时器、PWM定时器、标准和高级通讯接口。其引脚图及实物图如下。图2-2STM32F103C8T6引脚图图2-3STM32F103C8T6实物图第3章系统硬件部分设计3.1系统总体设计本系统的设计主要为高海拔人体环境监测与预警系统设计,而整个系统设计主要包括了大气压感应器、氧气传感器、温度传感器、OLED显示屏、蜂鸣器以及单片机,而硬件系统设计则需完成以下的各模块设计部分。图3-1总体原理图3.2系统主要功能模块设计高海拔人体生存环境检测预警系统设计主要是由大气压传感器模块、温度传感器模块、氧气传感器模块、显示屏、蜂鸣器以及单片机最小系统设计。3.2.1大气压传感器功能模块设计大气压传感器是高海拔人体生存环境检测预警系统中非常重要的组成部分,因为大气压是高海拔环境中的另一个重要参数REF_Ref7469\r\h[21]。选择合适的传感器类型非常重要。在高海拔环境中,因为空气稀薄,压强很小,因此需要选择高灵敏度的BMP180大气压传感器。根据手册提供公式,可以根据气压计算出海拔高度,但此式过于复杂。在3000米范围内,每升高12米,大气压减小1mmHg,大约133Pa。海拔高度为0的大气压强大约是101325pa,所以据此可以进行简单近似的计算:公式(1)图3-2大气压传感器原理图3.2.2温度传感器功能模块设计温度传感器是高海拔人体生存环境检测预警系统中非常重要的组成部分,因为高海拔环境中温度变化较大,可能对人体产生负面影响。选择合适的传感器类型非常重要。需要选择高精度的传感器,以便更准确地测量温度变化REF_Ref7492\r\h[22],因此选择使用DS18B20温度传感器。DS18B20温度传感器同时达到了9-Bit和12-Bit的高摄氏温度测量精度,并且拥有了一个用户可编程的非易失性和同时具有高速和低触发报警的特性。该传感器的温度测量范围为零下55摄氏度至125摄氏度,并且在温度范围超过了零下10度至85度之外时就达到了正负0.5摄氏度的误差。此外,DS18B20还可以直接使用数据线供电而不使用外置电源供电。 图3-3温度传感器原理图3.2.3氧气传感器功能模块设计氧气传感器是高海拔人体生存环境检测预警系统中非常重要的组成部分,因为高海拔环境中氧气浓度变化较大,可能对人体产生负面影响。MQ-135空气质量传感器,其特点是具有电源指示灯和TTL信号输出指示灯,对检测气体具有较高的灵敏度和良好的选择性,具有长期的使用寿命和可靠的稳定性以及其具有快速的响应回复特性等REF_Ref7515\r\h[23]。如果气体浓度超过空气中的阈值限制,则数字输出引脚变为高电平。模拟输出电压是从传感器的模拟引脚获得的,它给出了空气中存在的气体浓度的近似值。图3-4氧气传感器原理图3.2.4显示屏功能模块设计在高海拔人体生存环境检测预警系统中,显示屏是一个非常重要的硬件部件,它可以实时显示系统检测到的环境参数,提供实时监测和预警功能。OLED是一种低光自发光物质,虽然没有背光电源等,但其视野较广、成像效果均匀、反应快、也较容易彩化,而且感光效率高,具有较好的光学特性、生产成本低、易于制造和提高了生产经济性,所以适用于轻薄短小的产品理念,目前主要应用为中小尺寸面板。它的分辨率为128*64,具有主动发光、宽视角、反应快、画面质量稳定、高亮度、多种色彩和超高图像分辨率等的优点。另外,OLED屏幕还可以在很低的机械压力下正常运行,而且耗电量也很低。所以选用了0.96寸的OLED显示屏。图3-5OLED原理图3.2.5蓝牙模块设计本系统应用了HC-05蓝牙串口通信模块,EDR蓝牙协议数传模块运用的基础是BluetoothSpecificationV2.0,它的最大支持频段是2.4GHzISM,调制方案则是GFSK。它的无线信号发射功率特别高,并且的灵敏性也非常高,不过如果采用PCB天线,一般也需要3米到5米的近距离的距离就可以实现的。采用BC417芯片,这种芯片灵活性较好,不仅能支持AT指令,还能改变主模式、串口位频以及设备名,具有双工兼容性的优点作模式,一种是自动连接工作模式,另一种是蓝牙扫描工作模式。安卓手机的蓝牙作为主机板,打开手机只要可以扫描到HC-05蓝牙模块,便可以进行连接。 图3-6蓝牙模块原理图3.2.6蜂鸣器模块设计蜂鸣器是一种比较常见的电声元件,结构简单,小巧,重量轻,制造费用便宜,声音频率范围通常在几赫兹至十几赫兹之间,在各种的电子设备上广泛应用。通用无源蜂鸣器的电阻是16欧,驱动方式则与普通放音器相同。无源蜂鸣器的意思是,需要加音频驱动信号才能使其发出的声音,其原理图如下。图3-7蜂鸣器模块原理图3.3本章小结基于STM32F103C8T6单片机的高海拔人体生存环境检测预警系统分析,根据现有的技术和经济条件系统功能均可实现。同时还设计出一套完整的系统,并将全系统分为两个功能模块,分析其实现过程和过程分析能够得到较精确的数据,同时也有利于后续的工作。
第4章软件系统设计4.1软件主流程图主程序首先将单片机初始化以使相应的I/O脚和中断存取器置于正确位置,以便于继续实施后续的工作。 图4-1系统软件主流程图 4.2大气压传感器程序的设计在高海拔人体生存环境检测预警系统中,大气压传感器的软件设计需要实现数据采集、处理和传输等功能。下面是大气压传感器的软件设计方法:如果需要专门开发测量传感器信息的软件,也可以通过微型控制机的模拟输入端口,或是通过数字输入接口实现信息测量。收集到的数据必须经过精度校正,从而保证数据的精度。必须根据收集到的数据加以处理,如数据换算、数据过滤等。在高海拔环境下,大气压传感器数据可能存在较大的噪声,需要进行滤波处理,以提高数据精度。需要将处理后的数据传输给其他硬件部件或者上位机,以便实现数据显示、存储、分析等功能。可以使用串口、I2C、SPI等通信协议进行数据传输。大气压传感器采集程序流程如图。图4-2大气压传感器流程图4.3温度传感器程序的设计由于温度传感器数据受到环境因素的影响,需要对系统进行定期校准,以确保数据的准确性和可靠性。可以使用校准板或者其他精度更高的传感器进行系统校准。在高海拔环境中,温度可能发生剧烈变化,需要编写稳定性较高的程序,以确保系统的可靠性和稳定性。程序需要考虑到高海拔环境中的气压、湿度、温度等因素,进行适当的控制和调整。总之,温度传感器的软件设计需要考虑到数据采集、处理、传输等功能,以确保系统正常运行。同时,需要注意系统校准、稳定性等问题,以提高系统的可靠性和精度。温湿度传感器流程图如图。图4-3温湿度传感器流程图4.4氧气传感器程序的设计氧气传感器的软件设计需要考虑到数据采集、处理、传输等功能,以确保系统正常运行。同时,需要注意系统校准、稳定性、报警等问题,以提高系统的可靠性和精度。氧气传感器流程图如图。图4-4氧气传感器流程图4.5OLED显示屏程序的设计显示屏的软件设计需要考虑到数据显示、界面交互、报警功能、数据存储和系统维护等方面。需要充分考虑用户需求和系统稳定性,以实现一个功能齐全、易用性强的高海拔人体生存环境检测预警系统。显示屏流程图如图。图4-5OLED显示屏流程图 4.6蓝牙模块程序的设计首先,了解所使用的蓝牙无线通信模块的硬件接口,包括引脚定义、通信协议等。根据模块的规格和文档,连接蓝牙模块与主控设备单片机。在程序设计中,需要实现蓝牙设备的连接管理,包括扫描周围的设备、建立和断开连接等操作。可以使用协议栈提供的API来实现这些功能。蓝牙通信可以用于传输数据。需要确定应用场景和需求,然后设计相应的数据传输方案。在程序设计中,需要考虑各种错误和异常情况的处理。可以使用协议栈提供的错误处理机制,以及适当的异常处理代码来应对这些情况。在完成程序设计后,进行充分的测试和调试是非常重要的。可以使用调试工具、日志记录和模拟测试等方法来确保你的程序在各种情况下都能正常工作。需要注意的是,蓝牙通信的软件程序设计可能因具体的应用需求而有所不同。图4-6蓝牙流程图 4.7本章小结对软件系统的系统功能进行分析,阐述对各个模块的需求,并对其进行流程设计,可以让软件系统更加完备,实现相应的功能,同时可方便后期开发,使之更加方便快捷。第5章系统测试5.1系统实物图图5-1系统完整实物图5.2测试目的检测是用来识别系统中可能出现的问题,有的用户觉得在检测阶段中出现的问题越少愈好,但实际并不是这样的,只有在测试阶段出现较多的情况才可以保证应用的安全性和系统的安全性。检测是一种破坏性的行为,其目的是要尽量多的找到软件或者硬件上的问题。5.3测试原则测试指在依法规定的环境下对程序和硬件进行操作,从而发现程序问题,进而判断软件和硬件的质量和安全性,并且对其是否能够满足设计条件等因素作出评价的过程。测试的基本原则有助于测试人员进行高质量的测试,以便于尽早尽可能多的发现问题,并负责及时跟踪和分析软件和硬件上的问题,对存在的问题和不足及时指出问题和处理方法,以便于进一步改进测试过程。5.4功能测试(1)设备和手机连接将设备通上电,打开手机端APP,搜索到蓝牙后进行配对,然后就会显示连接成功,手机上也会实时显示系统上采集到的温度、海拔高度、氧气浓度等数据。且在手机端也可以设置阈值。图5-2蓝牙模块连接测试图温度传感器模块的功能性测试如图上位机设置的温度阈值为0-32℃,系统可以采集到环境中的温度信息,并且将信息通过显示屏进行显示。如图5-2,温度为32.1,超出了设置阈值,蜂鸣器就会报警,直至温度回复正常阈值之内才会停止报警。图5-3温度模块功能测试图(3)大气压模块的功能性测试上位机设置的最低阈值为50,最高阈值为220。系统可以采集当前的海拔高度,并且将信息通过显示屏进行显示。如图现在海拔为243.735,海拔超出设定阈值,蜂鸣器将会报警。图5-4大气压模块功能测试图(4)氧气模块的功能性测试系统可以采集当前的氧气浓度,并且将信息通过显示屏进行显示。如图所示,氧气浓度为21.0。最低阈值为21,最高阈值为260,当超出该阈值就会报警。图5-5氧气模块的功能性测试图APP端测试上位机不仅可以显示海拔高度、温度、氧气浓度信息,并且可以设置阈值大小,通过蓝牙将数据实时写入到系统。该高海拔人体生存环境检测预警系统不仅可以采集海拔高度信息,还可以采集温度信息和氧气浓度信息,当采集到的信息超过阈值,蜂鸣器会进行报警。图5-6上位机端的功能性测试图5.5本章小结在该章中,对系统的功能模块进行测试,对其获得的测试进行详细的记录,并且进行分析,可以使得系统具有正常运行的特性,在模块控制中,通过正常的使用,可以符合要求,使得该系统通过测试。第6章总结与展望本章主要从系统开发工程的初始选题到最后完成项目的全部过程进行了总结,最后对系统开发过程及项目实施中的一些经验进行了总结叙述,并以自己的经历为总结归纳。6.1总结高海拔人体生存环境检测预警系统是一种关键性的安全系统,它可以实时监测高海拔环境的温度、大气压力和氧气浓度等参数,并通过报警功能向用户提示危险情况,以保证人体在高海拔环境下的安全性。该系统主要由温度传感器、大气压传感器、氧气传感器、显示屏、蜂鸣器等硬件部件以及数据采集、处理、报警等软件部件组成。在硬件设计方面,需要考虑传感器的精度和稳定性、屏幕的清晰度和可靠性等因素。在软件设计方面,需要考虑数据采集、处理、报警、界面交互、数据存储和系统维护等方面,以实现一个功能齐全、易用性强的系统。总之,高海拔人体生存环境检测预警系统的设计和实现是一项复杂的工程,需要多学科的综合知识和技能。同时,该系统的应用还需要严格遵循安全标准和规范,以确保其可靠性和安全性。6.2展望随着人们对高海拔地区的探索和开发的不断深入,高海拔人体生存环境检测预警系统的需求也将逐渐增加。未来,该系统可能会朝着以下方向进行改进和发展:1.更精准、更智能的传感器技术:传感器技术是高海拔人体生存环境检测预警系统的核心。未来,随着科技的发展,可能会涌现出更为精准、灵敏、智能的传感器技术,如基于微纳米技术的传感器和人工智能算法辅助的传感器等。2.更便携、更轻量化的硬件设计:随着人们对高海拔地区的探索和开发的不断深入,可能会出现更多需要携带高海拔人体生存环境检测预警系统的情形。因此,未来的硬件设计可能会更加便携、轻量化,以适应更多场景的需求。3.更完善、更智能的软件功能:未来,随着人们对高海拔环境认知的深入,高海拔人体生存环境检测预警系统可能会涌现出更为完善、智能的软件功能,如对数据的更深入分析和处理、对环境变化的更为准确的预测、更为智能的报警机制等。4.更广泛的应用场景:高海拔人体生存环境检测预警系统不仅可以应用于登山、探险等户外活动,也可以应用于氧疗、航空航天、高海拔地区的建设和生产等领域。未来,该系统的应用场景可能会更加广泛。参考文献李玉株;肖江.基于无线传感器网络的野生动物生存环境监测节点硬件设计[P].江苏农业科学.2021.王俊彩;王福平;侯瑞峰;王成.基于BMP085的一种便携式海拔高度测量系统设计[J],传感器与微系统.2021.王华伟.基于红外热成像的温度场测量关键技术研究[J],中国科学院研究生院.2021.辛静.基于牧区生存环境的监测与评价指标体系研究.内蒙古农业大学,2021.王刚.USB红外抄表器设计[P].东南大学,2018.王环宇.生物监测及其在环境监测中的应用[C].环境与发展,2020.王宗礼;曹辉辉;肖永明;何建华;张山佳.青藏高原东北部沙隆卡遗址史前人群活动和生存环境基础[J].第四纪研究,2019.朱云;乔鲜果;姚轶锋;王宇飞.华北泥河湾盆地植被、气候与早期人类生存环境研究进展[P].植物学报,2022.雷晓静;丁金华;丁明亮;李明颖;吕思远.海拔高度测量仪设计[J].工业仪表与自动化装置.2018.曹金绪.城镇化迷思与城市生存环境预警[M].中国地质大学.2020.田苹,李绍云,李耀宁,崔智慧.气候变化对人类生存环境的影响分析[J].环境保护与循环经济,2009.王莹,康万利,辛士刚,徐鹏.不同地区人发中微量元素的测定与生存环境的比较研究[J].光谱学与光谱分析,2007.赵宗辽.探析影响人体健康的因素[J].中医药管理杂志,2015.庆易微.浅析大气污染对人体健康的影响[J].青海师专学报,2009.蒲小燕.医学地理视角下高海拔环境对机体肺损伤机制的研究[D].青海师范大学,2021.且华吉,刘江涛,文艺,黄竹,孙红玉,汤礼军.高原高海拔环境暴露对大鼠肝脏功能的影响及其机制[J].解放军医学杂志,2022.马海林,党鹏,苏瑞,李昊.高海拔暴露时间对工作记忆的影响——一项追踪研究[J].高原科学研究,2022.谭烨,欧阳银,陈丽,李永宁,李强,柯尊友,杨绍星,韩玉,窦增娥,巴迎莹,星海霞,马嘉蓉,唐万云,祁耀宇,张春霞,姚惠青,赵永祥.高海拔环境慢性阻塞性肺疾病急性加重期降维标实主证的现况研究[J].中国中医急症,2021.BoWangShengshengGONG;HaichaoXIE;FahuCHEN.SpatiotemporalchangesofepidemicsandtheirrelationshipwithhumanlivingenvironmentsinChinaoverthepast2200years.[P].2022OtakiJojiM.Fukushima'slessonsfromthebluebutterfly:Ariskassessmentofthehumanlivingenvironmentinthepost-Fukushimaera.2021. Anonymous.DesignandImplementationofanIndustrialIntelligentInfraredRemoteController.2021HajimeOgi;KazuyaYokoyama.PlatformSystemforConformityEvaluationinProductsandLivingEnvironmentwithHumanPostureandMovement[P].2020GersteinHertzelC;WaltmanLaura.Whydon'tpigsgetdiabetes?Explanationsforvariationsindiabetessusceptibilityinhumanpopulationslivinginadiabetogenicenvironment.[C]2019. 附录A总原理图附录B程序#include"delay.h"#include"sys.h"#include"oled.h"#include"bmp.h"#include"key.h"#include"usart.h"#include"usart2.h"#include"led.h"#include"adc.h"#include"ds18b20.h"#include"bmp180.h"#include"stmflash.h"#include"usmart.h"shorttemperature; u8tem[15];u8temperaturedyu=30; u8temperaturehyu=32; u8temgyu[3];u8temdyu[3];u8saveyu[20];u8newsaveyu[20];u16o2;u8o2s[15];unsignedinto2yu=200;u8o2yus[3];longhb;u8hbs[15];unsignedinthbdyu=0;u8hbdyus[3];unsignedinthbgyu=100;u8hbgyus[3];u16ya;u8yas[15];u8yayus[15];intfragment=0;u8send[30];u16feng;u8fengs[15];unsignedintfengyu=3;u8fengyus[15];u16ya;u8yas[15];u16cc;u8ccs[15];intbeepnum=0;intbiaozhi=0;intbiaozhi1=0;intbiaozhi2=0;intbiaozhi3=0;intbiaozhi4=0;intbiaozhi5=0;#defineTEMPD_SIZEsizeof(saveyu) //数组长度#defineFLASH_SAVE_ADDR_TEMPD0X08010300 //设置FLASH保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)]voidUSART2_Puts(char*str){while(*str){USART2->DR=*str++;while((USART2->SR&0X40)==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);}}intmain(void){ inti,j; u8ID=0; delay_init(); NVIC_Configuration(); delay_ms(1000); OLED_Init(); OLED_ColorTurn(0);//0正常显示,1反色显示OLED_DisplayTurn(0);//0正常显示1屏幕翻转显示 OLED_Refresh(); OLED_Clear(); KEY_Init(); LED_Init(); beep_Init(); beep=0; Adc_Init(); //ADC初始化 uart_init(9600); usart2_init(9600); BMP_Init(); BMP_ReadCalibrationData(); 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,48,4,16);//系 OLED_ShowChinese(18,48,5,16);//统 OLED_ShowString(36,48,":",16); OLED_Refresh();usmart_dev.init(72); //初始化USMART STMFLASH_Read(FLASH_SAVE_ADDR_TEMPD,(u16*)saveyu,TEMPD_SIZE); while(DS18B20_Init()) //DHT11初始化 { delay_ms(200);} KEY_Init(); temperaturedyu=(saveyu[0]-'0')*10+(saveyu[1]-'0'); temperaturehyu=(saveyu[2]-'0')*10+(saveyu[3]-'0');hbdyu=(saveyu[4]-'0')*100+(saveyu[5]-'0')*10+(saveyu[6]-'0'); hbgyu=(saveyu[7]-'0')*100+(saveyu[8]-'0')*10+(saveyu[9]-'0'); o2yu=(saveyu[10]-'0')*100+(saveyu[11]-'0')*10+(saveyu[12]-'0'); temdyu[0]=temperaturedyu/10+'0'; temdyu[1]=temperaturedyu%10+'0'; temdyu[2]=0; OLED_ShowString(80,0,temdyu,16); temgyu[0]=temperaturehyu/10+'0'; temgyu[1]=temperaturehyu%10+'0'; temgyu[2]=0; OLED_ShowString(100,0,temgyu,16); hbdyus[0]=hbdyu/100+'0'; hbdyus[1]=hbdyu%100/10+'0'; hbdyus[2]=hbdyu%10+'0'; OLED_ShowString(0,32,hbdyus,16); hbgyus[0]=hbgyu/100+'0'; hbgyus[1]=hbgyu%100/10+'0'; hbgyus[2]=hbgyu%10+'0'; OLED_ShowString(64,32,hbgyus,16); o2yus[0]=o2yu/100+'0'; o2yus[1]=o2yu%100/10+'0'; o2yus[2]=o2yu%10+'0'; OLED_ShowString(90,48,o2yus,16); OLED_Refresh(); while(1) { if(USART2_RX_STA==1){ USART2_RX_STA=0; if(USART2_RX_BUF[0]=='w'){ if(USART2_RX_BUF[1]=='1'){ temperaturedyu=(USART2_RX_BUF[2]-'0')*10+USART2_RX_BUF[3]-'0'; temperaturehyu=(USART2_RX_BUF[4]-'0')*10+USART2_RX_BUF[5]-'0'; hbdyu=(USART2_RX_BUF[6]-'0')*100+(USART2_RX_BUF[7]-'0')*10+USART2_RX_BUF[8]-'0'; hbgyu=(USART2_RX_BUF[9]-'0')*100+(USART2_RX_BUF[10]-'0')*10+USART2_RX_BUF[11]-'0'; o2yu=(USART2_RX_BUF[12]-'0')*100+(USART2_RX_BUF[13]-'0')*10+USART2_RX_BUF[14]-'0'; temdyu[0]=temperaturedyu/10+'0'; temdyu[1]=temperaturedyu%10+'0'; temdyu[2]=0; OLED_ShowString(80,0,temdyu,16); temgyu[0]=temperaturehyu/10+'0'; temgyu[1]=temperaturehyu%10+'0'; temgyu[2]=0; OLED_ShowString(100,0,temgyu,16); hbdyus[0]=hbdyu/100+'0'; hbdyus[1]=hbdyu%100/10+'0'; hbdyus[2]=hbdyu%10+'0'; OLED_ShowString(0,32,hbdyus,16); hbgyus[0]=hbgyu/100+'0'; hbgyus[1]=hbgyu%100/10+'0'; hbgyus[2]=hbgyu%10+'0'; OLED_ShowString(64,32,hbgyus,16); o2yus[0]=o2yu/100+'0'; o2yus[1]=o2yu%100/10+'0'; o2yus[2]=o2yu%10+'0'; OLED_ShowString(90,48,o2yus,16); OLED_Refresh(); newsaveyu[0]=USART2_RX_BUF[2]; newsaveyu[1]=USART2_RX_BUF[3]; newsaveyu[2]=USART2_RX_BUF[4]; newsaveyu[3]=USART2_RX_BUF[5]; newsaveyu[4]=USART2_RX_BUF[6]; newsaveyu[5]=USART2_RX_BUF[7]; newsaveyu[6]=USART2_RX_BUF[8]; newsaveyu[7]=USART2_RX_BUF[9]; newsaveyu[8]=USART2_RX_BUF[10]; newsaveyu[9]=USART2_RX_BUF[11]; newsaveyu[10]=USART2_RX_BUF[12]; newsaveyu[11]=USART2_RX_BUF[13]; newsaveyu[12]=USART2_RX_BUF[14]; newsaveyu[13]=0; STMFLASH_Write(FLASH_SAVE_ADDR_TEMPD,(u16*)newsaveyu,TEMPD_SIZE); delay_ms(200); } } } ID=BMP_ReadOneByte(0xd0); BMP_UncompemstatedToTrue(); temperature=DS18B20_Get_Temp(); o2=((Get_Adc_Average(ADC_Channel_0,10)-50)/409)+210; o2s[0]=o2%1000/100+'0'; o2s[1]=o2%100/10+'0'; o2s[2]='.'; o2s[3]=o2%10+'0'; o2s[4]=0; tem[0]=temperature/100+'0'; tem[1]=temperature%100/10+'0'; tem[2]='.'; tem[3]=temperature%10+'0'; tem[4]=0; OLED_ShowString(45,0,tem,16); OLED_ShowString(54,48,o2s,16); if(bmp180.altitude>0){ hb=bmp180.altitude*1000; hbs[0]='+'; hbs[1]=hb%10000000/1000000+'0'; hbs[2]=hb%1000000/100000+'0'; hbs[3]=hb%100000/10000+'0'; hbs[4]=hb%10000/1000+'0'; hbs[5]='.'; hbs[6]=hb%1000/100+'0'; hbs[7]=hb%100/10+'0'; hbs[8]=hb%10+'0';hbs[9]='m'; hbs[10]=0; OLED_ShowString(40,16,hbs,16); }else{ hb=(-bmp180.altitude)*1000; hbs[0]='-'; hbs[1]=hb%10000000/1000000+'0'; hbs[2]=hb%1000000/100000+'0'; hbs[3]=hb%100000/10000+'0'; hbs[4]=hb%10000/1000+'0'; hbs[5]='.'; hbs[6]=hb%1000/100+'0'; hbs[7]=hb%100/10+'0'; hbs[8]=hb%10+'0';hbs[9]='m'; hbs[10]=0; OLED_ShowString(40,16,hbs,16); } OLED_Refresh(); if(temperature<temperaturedyu*10){ biaozhi1=1; }else{ biaozhi1=0; } if(temperature>temperaturehyu*10){ biaozhi2=1; }else{ biaozhi2=0; } if(bmp180.altitude<hbdyu){ biaozhi3=1; }else{ biaozhi3=0; } if(bmp180.altitude>hbgyu){ biaozhi4=1; }else{ biaozhi4=0; } if(o2>o2yu){ biaozhi5=1; }else{ biaozhi5=0; } if(biaozhi1==1||biaozhi2==1||biaozhi3==1||biaozhi4==1||biaozhi5==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]=o2%1000/100+'0'; send[7]=o2%100/10+'0'; send[8]='.'; send[9]=o2%10+'0'; send[10]=hbs[0]; send[11]=hbs[1]; send[12]=hbs[2]; send[13]=hbs[3]; send[14]=hbs[4]; send[15]=hbs[5]; send[16]=hbs[6]; send[17]=hbs[7]; send[18]=hbs[8]; send[19]=hbs[9]; send[20]='z'; send[21]=0; USART2_Puts(send); if(KEY2==1){} }}stm32f10x_it.c#include"stm32f10x_it.h"voidNMI_Handler(void){}voidHardFault_Handler(void){/*GotoinfiniteloopwhenHardFaultexceptionoccurs*/while(1){}}voidMemManage_Handler(void){/*GotoinfiniteloopwhenMemoryManageexceptionoccurs*/while(1){}}voidBusFault_Handler(void){/*GotoinfiniteloopwhenBusFaultexceptionoccurs*/while(1){}}voidUsageFault_Handler(void){/*GotoinfiniteloopwhenUsageFaultexceptionoccurs*/while(1){}}voidSVC_Handler(void){}voidDebugMon_Handler(void){}voidPendSV_Handler(void){}voidSysTick_Handler(void){}#include"stm32f10x.h"#ifdefined(STM32F10X_LD_VL)||(definedSTM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)#defineSYSCLK_FREQ_24MHz24000000#else#defineSYSCLK_FREQ_72MHz72000000#endif#ifdefined(STM32F10X_HD)||(definedSTM32F10X_XL)||(definedSTM32F10X_HD_VL)#endif#defineVECT_TAB_OFFSET0x0#ifdefSYSCLK_FREQ_HSEuint32_tSystemCoreClock=SYSCLK_FREQ_HSE;/*!<SystemClockFrequency(CoreClock)*/#elifdefinedSYSCLK_FREQ_24MHzuint32_tSystemCoreClock=SYSCLK_FREQ_24MHz;/*!<SystemClockFrequency(CoreClock)*/#elifdefinedSYSCLK_FREQ_36MHzuint32_tSystemCoreClock=SYSCLK_FREQ_36MHz;/*!<SystemClockFrequency(CoreClock)*/#elifdefinedSYSCLK_FREQ_48MHzuint32_tSystemCoreClock=SYSCLK_FREQ_48MHz;/*!<SystemClockFrequency(CoreClock)*/#elifdefinedSYSCLK_FREQ_56MHzuint32_tSystemCoreClock=SYSCLK_FREQ_56MHz;/*!<SystemClockFrequency(CoreClock)*/#elifdefinedSYSCLK_FREQ_72MHzuint32_tSystemCoreClock=SYSCLK_FREQ_72MHz;/*!<SystemClockFrequency(CoreClock)*/#else/*!<HSISelectedasSystemClocksource*/uint32_tSystemCoreClock=HSI_VALUE;/*!<SystemClockFrequency(CoreClock)*/#endif__Iuint8_tAHBPrescTable[16]={0,0,0,0,0,0,0,0,1,2,3,4,6,7,8,9};staticvoidSetSysClock(void);#ifdefSYSCLK_FREQ_HSEstaticvoidSetSysClockToHSE(void);#elifdefinedSYSCLK_FREQ_24MHzstaticvoidSetSysClockTo24(void);#elifdefinedSYSCLK_FREQ_36MHzstaticvoidSetSysClockTo36(void);#elifdefinedSYSCLK_FREQ_48MHzstaticvoidSetSysClockTo48(void);#elifdefinedSYSCLK_FREQ_56MHzstaticvoidSetSysClockTo56(void);#elifdefinedSYSCLK_FREQ_72MHzstaticvoidSetSysClockTo72(void);#endif#ifdefDATA_IN_ExtSRAMstaticvoidSystemInit_ExtMemCtl(void);#endif/*DATA_IN_ExtSRAM*/voidSystemInit(void){/*ResettheRCCclockconfigurationtothedefaultresetstate(fordebugpurpose)*//*SetHSIONbit*/RCC->CR|=(uint32_t)0x00000001;/*ResetSW,HPRE,PPRE1,PPRE2,ADCPREandMCObits*/#ifndefSTM32F10X_CLRCC->CFGR&=(uint32_t)0xF8FF0000;#elseRCC->CFGR&=(uint32_t)0xF0FF0000;#endif/*STM32F10X_CL*//*ResetHSEON,CSSONandPLLONbits*/RCC->CR&=(uint32_t)0xFEF6FFFF;/*ResetHSEBYPbit*/RCC->CR&=(uint32_t)0xFFFBFFFF;/*ResetPLLSRC,PLLXTPRE,PLLMULandUSBPRE/OTGFSPREbits*/RCC->CFGR&=(uint32_t)0xFF80FFFF;#ifdefSTM32F10X_CL/*ResetPLL2ONandPLL3ONbits*/RCC->CR&=(uint32_t)0xEBFFFFFF;/*Disableallinterruptsandclearpendingbits*/RCC->CIR=0x00FF0000;/*ResetCFGR2register*/RCC->CFGR2=0x00000000;#elifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)/*Disableallinterruptsandclearpendingbits*/RCC->CIR=0x009F0000;/*ResetCFGR2register*/RCC->CFGR2=0x00000000;#else/*Disableallinterruptsandclearpendingbits*/RCC->CIR=0x009F0000;#endif/*STM32F10X_CL*/#ifdefined(STM32F10X_HD)||(definedSTM32F10X_XL)||(definedSTM32F10X_HD_VL)#ifdefDATA_IN_ExtSRAMSystemInit_ExtMemCtl();#endif/*DATA_IN_ExtSRAM*/#endif/*ConfiguretheSystemclockfrequency,HCLK,PCLK2andPCLK1prescalers*//*ConfiguretheFlashLatencycyclesandenableprefetchbuffer*/SetSysClock();#ifdefVECT_TAB_SRAMSCB->VTOR=SRAM_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalSRAM.*/#elseSCB->VTOR=FLASH_BASE|VECT_TAB_OFFSET;/*VectorTableRelocationinInternalFLASH.*/#endif}voidSystemCoreClockUpdate(void){uint32_ttmp=0,pllmull=0,pllsource=0;#ifdefSTM32F10X_CLuint32_tprediv1source=0,prediv1factor=0,prediv2factor=0,pll2mull=0;#endif/*STM32F10X_CL*/#ifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)uint32_tprediv1factor=0;#endif/*STM32F10X_LD_VLorSTM32F10X_MD_VLorSTM32F10X_HD_VL*//*GetSYSCLKsource*/tmp=RCC->CFGR&RCC_CFGR_SWS;switch(tmp){case0x00:/*HSIusedassystemclock*/SystemCoreClock=HSI_VALUE;break;case0x04:/*HSEusedassystemclock*/SystemCoreClock=HSE_VALUE;break;case0x08:/*PLLusedassystemclock*//*GetPLLclocksourceandmultiplicationfactor*/pllmull=RCC->CFGR&RCC_CFGR_PLLMULL;pllsource=RCC->CFGR&RCC_CFGR_PLLSRC;#ifndefSTM32F10X_CLpllmull=(pllmull>>18)+2;if(pllsource==0x00){/*HSIoscillatorclockdividedby2selectedasPLLclockentry*/SystemCoreClock=(HSI_VALUE>>1)*pllmull;}else{#ifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||(definedSTM32F10X_HD_VL)prediv1factor=(RCC->CFGR2&RCC_CFGR2_PREDIV1)+1;/*HSEoscillatorclockselectedasPREDIV1clockentry*/SystemCoreClock=(HSE_VALUE/prediv1factor)*pllmull;#else/*HSEselectedasPLLclockentry*/if((RCC->CFGR&RCC_CFGR_PLLXTPRE)!=(uint32_t)RESET){/*HSEoscillatorclockdividedby2*/SystemCoreClock=(HSE_VALUE>>1)*pllmull;}else{SystemCoreClock=HSE_VALUE*pllmull;}#endif}#elsepllmull=pllmull>>18;if(pllmull!=0x0D){pllmull+=2;}else{/*PLLmultiplicationfactor=PLLinputclock*6.5*/pllmull=13/2;}if(pllsource==0x00){/*HSIoscillatorclockdividedby2selectedasPLLclockentry*/SystemCoreClock=(HSI_VALUE>>1)*pllmull;}else{/*PREDIV1selectedasPLLclockentry*//*GetPREDIV1clocksourceanddivisionfactor*/prediv1source=RCC->CFGR2&RCC_CFGR2_PREDIV1SRC;prediv1factor=(RCC->CFGR2&RCC_CFGR2_PREDIV1)+1;if(prediv1source==0){/*HSEoscillatorclockselectedasPREDIV1clockentry*/SystemCoreClock=(HSE_VALUE/prediv1factor)*pllmull;}else{/*PLL2clockselectedasPREDIV1clockentry*//*GetPREDIV2divisionfactorandPLL2multiplicationfactor*/prediv2factor=((RCC->CFGR2&RCC_CFGR2_PREDIV2)>>4)+1;pll2mull=((RCC->CFGR2&RCC_CFGR2_PLL2MUL)>>8)+2;SystemCoreClock=(((HSE_VALUE/prediv2factor)*pll2mull)/prediv1factor)*pllmull;}}#endif/*STM32F10X_CL*/break;default:SystemCoreClock=HSI_VALUE;break;}/*ComputeHCLKclockfrequency*//*GetHCLKprescaler*/tmp=AHBPrescTable[((RCC->CFGR&RCC_CFGR_HPRE)>>4)];/*HCLKclockfrequency*/SystemCoreClock>>=tmp;}staticvoidSetSysClock(void){#ifdefSYSCLK_FREQ_HSESetSysClockToHSE();#elifdefinedSYSCLK_FREQ_24MHzSetSysClockTo24();#elifdefinedSYSCLK_FREQ_36MHzSetSysClockTo36();#elifdefinedSYSCLK_FREQ_48MHzSetSysClockTo48();#elifdefinedSYSCLK_FREQ_56MHzSetSysClockTo56();#elifdefinedSYSCLK_FREQ_72MHzSetSysClockTo72();#endif}#ifdefDATA_IN_ExtSRAMvoidSystemInit_ExtMemCtl(void){RCC->AHBENR=0x00000114;/*EnableGPIOD,GPIOE,GPIOFandGPIOGclocks*/RCC->APB2ENR=0x000001E0;GPIOD->CRL=0x44BB44BB;GPIOD->CRH=0xBBBBBBBB;GPIOE->CRL=0xB44444BB;GPIOE->CRH=0xBBBBBBBB;GPIOF->CRL=0x44BBBBBB;GPIOF->CRH=0xBBBB4444;GPIOG->CRL=0x44BBBBBB;GPIOG->CRH=0x44444B44;/*FSMCConfiguration*//*EnableFSMCBank1_SRAMBank*/FSMC_Bank1->BTCR[4]=0x00001011;FSMC_Bank1->BTCR[5]=0x00000200;}#endif/*DATA_IN_ExtSRAM*/#ifdefSYSCLK_FREQ_HSEstaticvoidSetSysClockToHSE(void){__IOuint32_tStartUpCounter=0,HSEStatus=0;/*SYSCLK,HCLK,PCLK2andPCLK1configuration*//*EnableHSE*/RCC->CR|=((uint32_t)RCC_CR_HSEON);/*WaittillHSEisreadyandifTimeoutisreachedexit*/do{HSEStatus=RCC->CR&RCC_CR_HSERDY;StartUpCounter++;}while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT));if((RCC->CR&RCC_CR_HSERDY)!=RESET){HSEStatus=(uint32_t)0x01;}else{HSEStatus=(uint32_t)0x00;}if(HSEStatus==(uint32_t)0x01){#if!definedSTM32F10X_LD_VL&&!definedSTM32F10X_MD_VL&&!definedSTM32F10X_HD_VL/*EnablePrefetchBuffer*/FLASH->ACR|=FLASH_ACR_PRFTBE;/*Flash0waitstate*/FLASH->ACR&=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY);#ifndefSTM32F10X_CLFLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_0;#elseif(HSE_VALUE<=24000000) {FLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_0; } else {FLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_1; }#endif/*STM32F10X_CL*/#endif/*HCLK=SYSCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_HPRE_DIV1;/*PCLK2=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE2_DIV1;/*PCLK1=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV1;/*SelectHSEassystemclocksource*/RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_SW));RCC->CFGR|=(uint32_t)RCC_CFGR_SW_HSE;/*WaittillHSEisusedassystemclocksource*/while((RCC->CFGR&(uint32_t)RCC_CFGR_SWS)!=(uint32_t)0x04){}}else{/*IfHSEfailstostart-up,theapplicationwillhavewrongclockconfiguration.Usercanaddheresomecodetodealwiththiserror*/}}#elifdefinedSYSCLK_FREQ_24MHzstaticvoidSetSysClockTo24(void){__IOuint32_tStartUpCounter=0,HSEStatus=0;/*SYSCLK,HCLK,PCLK2andPCLK1configuration*//*EnableHSE*/RCC->CR|=((uint32_t)RCC_CR_HSEON);/*WaittillHSEisreadyandifTimeoutisreachedexit*/do{HSEStatus=RCC->CR&RCC_CR_HSERDY;StartUpCounter++;}while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEOUT));if((RCC->CR&RCC_CR_HSERDY)!=RESET){HSEStatus=(uint32_t)0x01;}else{HSEStatus=(uint32_t)0x00;}if(HSEStatus==(uint32_t)0x01){#if!definedSTM32F10X_LD_VL&&!definedSTM32F10X_MD_VL&&!definedSTM32F10X_HD_VL/*EnablePrefetchBuffer*/FLASH->ACR|=FLASH_ACR_PRFTBE;/*Flash0waitstate*/FLASH->ACR&=(uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR|=(uint32_t)FLASH_ACR_LATENCY_0;#endif/*HCLK=SYSCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_HPRE_DIV1;/*PCLK2=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE2_DIV1;/*PCLK1=HCLK*/RCC->CFGR|=(uint32_t)RCC_CFGR_PPRE1_DIV1;#ifdefSTM32F10X_CL/*ConfigurePLLs*//*PLLconfiguration:PLLCLK=PREDIV1*6=24MHz*/RCC->CFGR&=(uint32_t)~(RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLSRC|RCC_CFGR_PLLMULL);RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1|RCC_CFGR_PLLSRC_PREDIV1|RCC_CFGR_PLLMULL6);/*PLL2configuration:PLL2CLK=(HSE/5)*8=40MHz*//*PREDIV1configuration:PREDIV1CLK=PLL2/10=4MHz*/RCC->CFGR2&=(uint32_t)~(RCC_CFGR2_PREDIV2|RCC_CFGR2_PLL2MUL|RCC_CFGR2_PREDIV1|RCC_CFGR2_PREDIV1SRC);RCC->CFGR2|=(uint32_t)(RCC_CFGR2_PREDIV2_DIV5|RCC_CFGR2_PLL2MUL8|RCC_CFGR2_PREDIV1SRC_PLL2|RCC_CFGR2_PREDIV1_DIV10);/*EnablePLL2*/RCC->CR|=RCC_CR_PLL2ON;/*WaittillPLL2isready*/while((RCC->CR&RCC_CR_PLL2RDY)==0){}#elifdefined(STM32F10X_LD_VL)||defined(STM32F10X_MD_VL)||defined(STM32F10X_HD_VL)/*PLLconfiguration:=(HSE/2)*6=24MHz*/RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLMULL));RCC->CFGR|=(uint32_t)(RCC_CFGR_PLLSRC_PREDIV1|RCC_CFGR_PLLXTPRE_PREDIV1_Div2|RCC_CFGR_PLLMULL6);#else/*PLLconfiguration:=(HSE/2)*6=24MHz*/RCC->CFGR&=(uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC|RCC_CFGR_PLLXTPRE|RCC_CFGR_PLLMULL));RCC->CFGR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026天津音乐学院第一批招聘博士岗位人员5人笔试备考题库及答案解析
- 2026四川内江市城市规划中心考核招聘事业单位工作人员2人笔试备考题库及答案解析
- 2026浙江海洋大学招聘1人(第一批)笔试备考试题及答案解析
- 2026江西吉安井冈山风景旅游集团有限公司面向社会招聘临聘人员7人笔试备考试题及答案解析
- 2026福建厦门火炬高技术产业开发区管理委员会招聘厦门火炬大学堂有限公司副总经理招聘1人笔试备考题库及答案解析
- 2026河南省濮阳市第三小学招聘教师笔试备考试题及答案解析
- 北方工业大学国际学院管理岗位招聘1人笔试备考试题及答案解析
- 2026江西鹰潭市中心城区总医院中医院院区招聘1人笔试备考试题及答案解析
- 2026河北省老干部活动中心招聘2人笔试备考试题及答案解析
- 2026湖北武汉市公立职高招聘政治老师1人笔试备考试题及答案解析
- 云南省昆明市2026届高三三诊一模摸底诊断测试政治试卷(含答案)
- 高电位子午流注课件
- 奥拉丁项目讲解
- 制造企业员工岗位责任制细则
- 2025年苏州市中考物理试卷真题(含答案解析)
- 20G361预制混凝土方桩
- 劳动合同法全文(2024年版)
- 人教板七年级至九年级英语单词表
- 锅炉安装改造维修质量保证体系文件(手册+程序文件+表格+工艺文件汇编)-符合TSG 07-2019特种设备质量保证管理体系
- 中国茶文化发展简史
- 神木-安平煤层气管道工程(陕西-山西段)环境影响报告书
评论
0/150
提交评论