版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEii基于STM32F429单片机的环境检测数据采集与传输系统设计摘要:在当今这个科技新时代中,人们对生活环境质量的要求越来越高,市面上可以调节室内环境的加湿器,空气净化器等设备层出不穷。于是我认为非常有必要设计和研究一款可以检测空气中温湿度,大气压强,pm2.5等环境数据的仪器,可以配合调节室内环境的设备使用。将这些数据使用WIFI模块传输给手机等无线设备,并且外加七寸电容触摸屏反映采集到的数据。通过真实的数值情况,使调节室内环境的设备可以发挥更大作用,提高设备的使用效率。本次课题所研究的环境检测设备是由单片机控制部分、数据监测部分、数值传输和交互部分组成。单片机控制部分是使用STM32F429单片机作为主控设备,测量是使用DHT11温湿度传感器、BMP180大气压强传感器、GP2Y1014AUPM2.5传感器作为测量工具。传输和交互部分主要通过USART协议使用USB转串口设备和七寸电容触摸屏完成工作。在进行研究的过程中遇到了一些问题,例如:GP2Y1014AU传感器无法调通、温湿度传感器和大气压强传感器中断干扰、手机和单片机无法利用MQTT进行连接等等。同时也解决了一些问题,例如:温湿度和大气压传感器之间的调用冲突、电容触摸屏使用时分辨率出错。最后通过编译以及调试,整个设备包括主控部分、测量部分、传输和交互部分可以正常工作,测量出的数据数值基本可靠,可以满足课题提出的要求。关键词: STM32单片机;DHT11;BMP180;GP2Y1014;数据采集;数据传输;目录TOC\o"2-3"\h\z\t"标题1,1,次标题,1"1 绪论 11.1 课题研究的目的和背景 11.1.1 研究目的 11.1.2 研究背景和意义 11.2 本次课题国内外研究现状 22 分析和总体设计 52.1 课题需求分析 52.1.1 项目功能要求 52.2 总体方案设计 52.2.1 项目总体方案 52.2.2 项目器材选型方案 63 具体设计实现和调试 123.1 编程环境介绍 123.2数据监测部分软件的设计与实现 133.2.1 DHT11温度传感器的调试 133.2.2 BMP180大气压强传感器的调试 173.2.3 GP2Y1014AU粉尘传感器的调试 203.3 采集数据传输的设计 233.3.1 利用USART协议实现与PC数据传输 243.3.2 使用触摸屏反映数据 263.4 总体设备的实现和调试 314 结论和期望 364.1 研究结论和总结 364.2 对项目和相关领域的期望 36参考文献 39附录 40绪论此次课题研究是根据在校外实习单位进行实习工作时,工程师给予了我研究本课题的一些建议。下面根据我个人的理解大概的来谈一谈对于本此课题不论是环境监测层面,实用性上以及现如今嵌入式在此方面应用的背景和意义。并且大概谈一谈环境监测以及本次课题的一些研究现状。课题研究的目的和背景本次课题研究不光从科学研究方面出发还考虑到当今中国在环境数据监测方面的现状。下面就让我来介绍一下本次课题的研究目的和研究的背景。研究目的此次研究这个课题的原因主要是本人在一家制造臭氧杀菌消毒设备的公司实习。他们公司制造使用陶瓷片高压电里空气中的氧气生成臭氧,这种设备虽然起到了杀菌消毒的作用,但是根据使用的场景和环境的不同,还应该对使用环境进行一些常规数值的检测。在实习的过程中,我们见过和维修过很多报废的产生臭氧的机器。它们有的是陶瓷片打火致使线路烧焦,也有不少是因为所使用的环境问题所造成的机器故障,例如:使用环境周边的温度过高或者过低;环境太过于潮湿等等的问题。他们公司的设备应用于很多不同的行业地区,像食品厂车间的环境消毒;用于对家禽家畜养殖厂和屠宰场的消毒;水产养殖厂的杀菌消毒;实验室和研究车间的消毒等等。这些场景中也有很多由于地区位置还有行业特性的原因造成臭氧设备应用于一些特别甚至于极端的环境中。在设备产生臭氧的同时,监测周围环境的基本数值对用户来说也是更加人性化的体现。综上所述,研究和制作一款对环境数值监测的设备,我认为是十分有必要的。研究背景和意义课题研究背景在科技飞速发展的今天,人们十分注重生产和生活的杀菌消毒和生活环境的污染问题。随着新中国工业和制造业的发展,所带来的环境问题逐渐引起百姓们的重视。最近几年映入人们眼帘的词汇如:雾霾,PM2.5,温室效应等等。也有什么:夏天高温突破多少度,南方寒潮等等的消息在新闻中报道。不止是我国,世界环境问题也不容小觑。新时代科技飞速发展人们也开始追求更高水平的生活质量,许多人对家居生活的环境问题也越来越关心。现在购物网站上热销的家庭空气净化器,家用空气加湿器就是非常好的例子。这都离不开集成电路和嵌入式系统技术的不断成熟,在这些科学技术的不断推陈出新下,环境数值监测不断改进方法,使得当今的环境数值监测手段越来越方便、越来越新颖。这些新颖由快捷的监测方式广泛的应用于农业温室控制、畜牧业以及渔业的养殖、工业制造车间和实验室还有千千万万普通人的家庭生活当中。例如:在温室大棚中环境的温湿度以及大棚每天光照的时长,采集到这些数据,就可以用计算机模拟农作物生长的环境,从而制定针对某个农作物在具体环境下的培育办法。这样就可以尽量避免不利于它的成长因素,达到保证生产的作用。在我们普通的日常生活来说,室内适宜的温湿度可以让人感到身心舒畅。家中的装修和一些家具中也含有一些有害物质,如果室内的温湿度过高,可能会导致这些有害物质散发出来对我们人体的健康产生危害。所以针对室内环境温湿度、大气压以及PM2.5的监测至关重要。国家为此也颁布了《室内空气质量标准》GB/T18883-2002,其中规定:室内空气质量指标包含温度、相对湿度、二氧化碳、一氧化碳、甲醛、苯和可吸入颗粒物等参数。这些参数给我们进行环境数据监测提供了参考依据,根据我们所采集到的环境数值开发相应的改善室内环境的设备是保护普通人身体健康最有效最直接的途径。环境监测并且采集数据的意义对于生产环境来说,监测环境中的有毒有害物质以及工作环境的温湿度、大压强等数值,也十分重要。工作环境中的危害因素和其浓度强度还有分布情况都需要进行监测。对于工作人员的安全来说,这些在工作环境中的危险因素在空间和时间上的分布程度,以及呼吸系统和皮肤暴露在这样的环境下会造成什么样的后果,都需要针对监测的结果进行分析。然后才能制定工作和劳动计划,并且对这些危险因素进行定期监测和计划妥善的应对措施。在这个环境中从事生产和工作的员工,他们也能够以此为依据来保护自己合法的劳动权益。通过此次研究,也可以解决实习公司臭氧消毒机对周围环境基本情况的监测和判断的问题,达到对机器的一个辅助作用。同时也可以让用户获得监测到的温湿度大气压和PM2.5数值,达到完善机器智能化的目的。本次课题国内外研究现状对于环境监测方面来说,我国在相关技术方面不断的完善与进步,现在已经初步建立起了较为完善的环境监测系统。虽然我国对于环境监测方面不断重视,要求越来越严格,但是在这样一个相对健全的环境监测体系下仍然在技术方面我们仍然有很多不足。这些不足主要体现在:我国环境监测体系的建立,将世界各个国家与我国相比,我国确实起步算是比较晚的了,在环境监测和数据的分析上还存在很多问题,数据采集手段不能满足要求等等。环境监测在预警方面和智能化方面还有很长一段路要走,这也与我国自动化和集成电路还有嵌入式技术的发展有密不可分的联系。(3)监测人员数量和监测人员的工作素质不足,造成环境监测队伍和人才无法满足我国环境监测相关工作的需要和要求。本次课题我是应用STM32F429单片机来研究对环境数据的采集和监测,那接下来就谈谈当今电子技术,主要是集成电路和嵌入式技术对于环境监测的影响和研究现状。集成电路产业作为信息技术产业的核心,是支撑经济社会发展和保障国家安全的战略性、基础性和先导性产业,是培育发展战略性新兴产业、推动信息化和工业化深度融合的基础,是保障国家信息安全的重要支撑,其产业能力决定了各应用领域的发展水平,并已成为衡量一个国家产业竞争力和综合国力的重要标志之一。2018年两会的《政府工作报告》论述中,把推动集成电路产业发展放在实体经济发展的首位强调,凸显出在中国制造大投入、大发展、大跨越的趋势下集成电路产业的重要性和先导性。近年来,在国家政策扶持以及市场应用带动下,中国集成电路产业规模持续扩大。据中国半导体行业协会的统计,2019年中国集成电路产业销售收入为7562.3亿元,同比增长15.80%,其中集成电路设计业销售收入为3063.5亿元,同比增长21.6%,占总值40.5%;晶圆制造业销售收入为2149.1亿元,同比增长18.20%,占总值的28.40%;封测业销售收入为2349.7亿元,同比增长7.10%,占总值的31.1%。国内芯片产业链逐渐从低端向高端延伸,产业结构更趋于合理。今年一季度中国集成电路产业保持增长态势,产业销售收入达到1472.7亿元,同比增长15.6%。中商产业研究院预测,2020年中国集成电路产业销售收入有望突破9000亿元。为了满足人们对于科技和智能化的需要,ARM嵌入式系统开始应用于生活中的各个方面,技术也不断走向成熟。对于日新月异的今天,在世界各地应用于不同行业领域的各式各样的ARM芯片被创造出来。现在可提供ARM芯片的欧美著名半导体公司有:Inter、德洲仪器、飞利浦半导体、意法半导体、高通公司、Intersil、Altera、CirrusLogic、Linkup、Parthus、LSILogic、Micronas、SiliconWave、Virata、Portalplayerinc.等等。日本出名的半导体公司有:松下半导体、东芝、三菱半导体等公司,由于它们购买arm版权较晚,现在还没有可以销售的ARM芯片。其他一些公司像AKM、OAK、Rohm、Sharp、Sanyo、Sony等日本半导体公司已经生产了ARM芯片。我国台湾主要由华帮电子、台联电、台积电等公司生产和销售ARM芯片。嵌入式电子技术在当今这个科技时代里,应用的领域也越来越广泛。不论是智能家居,未来城市云端的建设还有很多我们生活中的领域通过这些逐步发展的电子技术改造的更加智能化一体化。现如今将嵌入式电子技术和环境监测结合以来也并不是一件多么令人惊讶的事,在国内外一直有很多人在不断的尝试。比如;利用嵌入式技术监测温室大棚的环境,利用嵌入式技术对药品仓库、档案馆等特殊场景进行温湿度和气压的监测并对该环境做出调整等等。也有很多像我一样的在校学生用自己手上的单片机,为自己的无人机设备做温湿度和大气压强的测量。并且室内空气监测系统一直是高校的研究热题,国内学者通过不懈的研究和不断的尝试,在监测设备的小型化、便携化和功能多样化方面,做出了卓越的贡献。2013年,安艳萍、钱平、陈超群三人使用双重网络无线传感技术,设计了一套能够对室内甲醛、一氧化碳、PM2.5浓度进行实时远程监控的管理系统,该系统耗电量低、通用性好。2015年,针对当前监测设备通讯功能差、监测功能单一的缺点,周红波等人使用嵌入式开发技术以及Linux操作系统,设计了室内甲醛、温度监测系统。2015年,针对市场上室内空气质量监测产品便携性差、测量周期长、有时需要专业人员进行操作的情况,杨威风等人使用STM32单片机,设计了一款具有较高性价比的室内空气质量监测系统,提高了人们的生活质量。从上述的研究现状结合调查研究可以发现,虽然嵌入式技术广泛应用于环境测量领域,但是所测量的数据还存在不方便让人们更直观的了解室内环境质量、所测量的数据应该怎么处理,是否应该把这些数据上传到PC以及移动端等等不足。分析和总体设计通过在绪论中对于环境测量以及应用嵌入式电子技术在此领域的目的和意义结合当下中外应用嵌入式技术对环境数据监测和采集的研究现状,我们需要明确对于本次课题研究的需求并且进行分析。初步确定此次课题研究要测量哪些内容要达到什么样的效果,根据需求来确定具体的实验计划和实现方案。课题需求分析本次研究课题是本人在实习公司与工程师交流所确定的。经过交流和讨论,所在实习公司工程师建议我可以挑选一款STM32单片机进行研究。根据实习公司产品的发展和应用,工程师希望我能够利用单片机结合传感器完成对室内环境例如:温湿度大气压强和PM2.5浓度进行数据采集。并且希望我能用电容触摸屏将采集到的数据结果结果呈现出来,可以应用到他们生产的仪器上。项目功能要求所研究和制作的环境监测设备可以监测出周边环境的温湿度、大气压强、PM2.5浓度。将所监测出来的数据通过一块七寸的触摸屏体现出来,并实现基本的人机交互。将所监测到的环境数值使用单片机的USART协议利用USB转串口设备电传输到PC端,利用串口调试助手打印和观察数据。这就是本次课题研究的一个初步设想,下面根据设想进行过程分析并且确定研究方案。下面要对所采集的环境数据分析所要用到的实验器材,完成硬件方面的选材和整体系统构成的分析工作。总体方案设计在开始进行项目研究之前,我认为有必要做一份结构框图,理清楚主控部分与各个模块间的关系,并且要有一份可以明确关系的导图。通过这两幅图明确实验研究的具体任务,并且可以对具体要采集的数值挑选合适的传感器以及挑选合适的主控设备。项目总体方案图1.1任务关系图图1.2模块结构图项目器材选型方案温湿度测量的选材要完成对室内温湿度数据的采集工作,在翻阅了很多文献文章并且浏览很多相关内容的论坛之后,我选择使用DHT11温湿度传感器。DHT11温湿度传感器是一款复合传感器,并且可以将采集到的数据进行数字校准之后再进行输出。为了保证产品可以具有较高的可靠性和长期稳定性,所以它使用了温湿度传感技术和数字模块采集技术。DHT11这款温湿度传感器为了测量温湿度所以内部包含了NTC测温元件用来测量温度、还有一个电阻式的感湿元件用来测量湿度,而且还将两个元件和一个8位单片机相连接。正因为这样,在使用过程中它可以很好的抗干扰并且反应迅速,对于指令的响应也十分迅捷。为了保证精确度,传感器在制造时经过了非常精准的温湿度的校准,并且把校准的系数以程序的形式存在OTP内存中。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。图1.3DHT11原理图图1.4DHT11外观图DHT11引脚说明图1.5引脚说明图传感器特性说明图1.6特性说明图大气压强测量的选材对于监测大气压强我本来选择的是BMP280传感器,但是BMP280驱动文件不能直接使用。在经过反复多次的调试以及修改后,依然存在冲突问题,编译时不能生成.O文件,无法进行程序的烧录。经过反复考虑之后,我还是决定使用BMP180大气压强传感器。BMP180大气压强传感器不仅可以实时的测量大气压力,还能测量实时温度。同时它还具有IIC总线的接口,便于单片机进行访问。另外它的使用也很方便,不需要太多的操作就可读取到气压及测量数据。它的工作电压为1.8v~3.6v,典型工作电压为2.5v。其与单片机相连的典型电路如图图1.7BMP180接线图BMP180内包含有电阻式压力传感器、AD转换器和控制单元,其中控制单元包括了EEPROM和IIC接口。读取BMP180时会直接传送没有经过补偿的温度值和压力值。而在EEPROM中则储存了176位单独的校准数据,这些数据将对读取的温度压力值进行补偿。176位的EEPROM被划分为11个字,每个字16位,这样就包含有11个校准系数。每个器件模块都有自己单独的校准系数,在每一次计算温度压力数据之前,单片机就应该先读出EEPROM中这些校准数据,然后再开始采集数据温度和压力数据。和所有的IIC总线器件一样,BMP180也有一个器件的固定地址,根据其数据手册,出厂时默认BMP180的从机地址为0xEE(写入方向),或0xEF(读出方向)。温度数据UT和压力数据UP都存储在寄存器的第0到15位之中,压力数据UP的精度还可扩展至16~19位。读取气压大致流程为:开始→读取EEPROM校准值→读取温度值→读取气压值→校准。还可以根据所测量出的大气压强计算出海拔高度,公式如下:PM2.5测量选材测量空气中PM2.5浓度一直是我最没有头绪的一项。在查阅资料之后我明白了,PM2.5属于粉尘颗粒物,可以用传感器监测空气中粉尘浓度,这里就可以使用夏普的GP2Y1014AU粉尘传感器。但是需要进行数模转换,因为GP2Y1014AU粉尘传感器缺少数字校准,所以对于测量的精确度可能会有影响。我了解到的夏普GP2Y1014AU传感器,是日本夏普公司所研究生产的的一种利用光学来检测空气中灰尘浓度的传感器。它的内部结构是由对脚分布的红外发光管和光电晶体管构成,利用光敏原理进行工作。依靠输出脉冲的高度来判断颗粒浓度。该传感器具有高精准度、内部结构紧凑,可以一次性检测室内灰尘的特点。该传感器的工作属性:输出:模拟电压工作电源电压:4.5V至5.5V;检测浓度(TYP。):0-600(µg/m3);灵敏度:0.5±0.075V/(0.1mg/m3)精度±15%原理图和接线图如下:图1.8GP2Y1014AU原理图和外观图1.9GP2Y1014AU接线图主控单片机选材为了可以完整的实现每个部分的测量工作,主控部分的协调是至关重要的。单片机种类丰富多样,每种单片机产品下又有各种各样的型号。我为什么要选择STM32F429单片机呢?根据我的了解STM32单片机它是使用用途非常广泛的。它的开发工具,比较齐全,开发资料也比较丰富。STM32单片机可选择的型号非常多,基本上都不需要外部的硬件扩展。它在功耗方面控制得比较好,还有就是实时性比较强。对各种流行的嵌入式操作系统,支持比较好,各大嵌入式操作系统网站,基本上都会提供支持,他的相应的代码。我使用的这款野火STM32F429开发板上功能多样,上面集成了以太网,音频,CAN,485,232,USB转串口,蜂鸣器,LED,电容按键等外设资源,可以充分的学习429这个芯片。在板子上面,还可以跑系统ucosiii,学习图形界面emwin。下面对它的基本参数做下介绍:CPU:STM32F429IGT6,LQPF144封装。存储:SDRAM8MB,FMC接口。陀螺仪:MPU6050,I2C接口。无线通信:WIFI:美满W8782,SDIO接口。STM32F429核心板原理图见附录。STM32F429核心板PCB图如下:图2.0STM32F429核心板PCB图具体设计实现和调试根据上述分析的项目需求,包括项目要完成的功能和项目试验的选材,接下来要对具体功能的实现和对设备与程序的调试进行详细的介绍。STM32F429单片机需要外接DHT11、BMP180、GP2Y1014AU和一块7寸触摸屏来完成项目需求。编程环境介绍初次使用STM32系列单片机,我对于它的性能和指令方面还不是很熟悉,但是之前有过学习和使用51单片机的经历,它们都是可以用Keil软件进行编程,所以对于编程环境并不陌生。在这里我简略的介绍一下STM32系列单片机的编程环境KeilMDK。想要STM32单片机根据指令完成相应的操作,就一定要使用到编程环境。KeilMDK-ARM是美国Keil软件公司(现已被ARM公司收购)出品的支持ARM微控制器的一款IDE(集成开发环境)。MDK-ARM包含了工业标准的KeilC编译器、宏汇编器、调试器、实时内核等组件。具有业行领先的ARMC/C++编译工具链,完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件,包含世界上品牌的芯片。比如:ST、Atmel、Freescale、NXP、TI等众多大公司微控制器芯片。KeilMDK-ARM作为现如今应用最广泛的STM32单片机编程环境,它有很多优势,包括:软件界面简洁、易操作、便于初学者快速使用、可以快速导入下载相应单片机型号的芯片包还有内核、集编程,编译,烧录为一体,这些优点让它备受广大开发者欢迎。在这里对于KeilMDK-ARM的下载安装以及STM32F429芯片包的导入过程我就不做过多的叙述。下图是KeilMDK5的操作界面,左边.c.h文件和目录路径清晰可见,右边是编程界面,可以完成程序的编写,图是编译结果输出窗口,在编译和烧录过程中有什么问题和错误可以显示出来。如图是程序进行编译和烧录程序的任务栏。这里也可以进行对单片机烧录器选择、控制生成.hex文件、配置和单片机相对应的flash空间等操作。图2.1KeilMDK操作界面图2.2编译和烧录任务栏图2.3输出和报错信息窗口数据监测部分软件的设计与实现对于这次所研究的课题的数据监测部分是利用三个传感器通过各自不同的方式去采集数据。那么对于刚接触STM32F429单片机的我来说,认为应当首先把三个传感器分别调试成功。DHT11温度传感器的调试拿到手DHT11温度传感器之后,因为我所使用的这个传感器是一个模块化的,它不仅仅包括了DHT11传感器,还配备了一个红色的电源指示灯,外加一块小板PCB,在数据端口还配备了上拉电阻。模块的三个引脚分别代表了电源正极;数据输出;电源接地。所以我在模块上接了三根杜邦线出来,分别接到开发板所对应的引脚上。电源正极接到开发板DHT11接口部分的3.3v接口,数据输出接到PE2接口,电源接地端接到GND接口。关键代码:/*初始化USART,配置模式为1152008-N-1*/Debug_USART_Config(); /*系统定时器初始化*/ SysTick_Init(); /*DHT11初始化*/ DHT11_GPIO_Config();while(1) { /*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/ if(Read_DHT11(&DHT11_Data)==SUCCESS) { printf("\r\n读取DHT11成功!\r\n\r\n湿度为%d.%d%RH,温度为%d.%d℃\r\n",\ DHT11_Data.humi_int,DHT11_Data.humi_deci,DHT11_Data.temp_int,DHT11_Data.temp_deci); } else { printf("ReadDHT11ERROR!\r\n"); }Delay_ms(1000); }上面是主函数的代码,主要完成对USART的配置还有定时器和DHT11传感器的初始化。并且对DHT11进行调用。这是对于引脚的使用定义:#defineDHT11_CLKRCC_AHB1Periph_GPIOE#defineDHT11_PINGPIO_Pin_2#defineDHT11_PORTGPIOE这是从DHT11读一个字节的流程,MSB先行:staticuint8_tRead_Byte(void){ uint8_ti,temp=0; for(i=0;i<8;i++) { while(DHT11_DATA_IN()==Bit_RESET); /*DHT11以26~28us的高电平表示“0”,以70us高电平表示“1”, Delay_us(40); if(DHT11_DATA_IN()==Bit_SET)/*xus后仍为高电平表示数据“1”*/ { /*等待数据1的高电平结束*/ while(DHT11_DATA_IN()==Bit_SET); temp|=(uint8_t)(0x01<<(7-i));//把第7-i位置1,MSB先行 } else //xus后为低电平表示数据“0” { temp&=(uint8_t)~(0x01<<(7-i));//把第7-i位置0,MSB先行 } } returntemp;}下面是一次完整的数据传输流程,高位先出。数据传输为40bit,是由8bit湿度整数+8bit湿度小数+8bit温度整数+8bit温度小数+8bit校验和组成。uint8_tRead_DHT11(DHT11_Data_TypeDef*DHT11_Data){uint16_tcount; /*输出模式*/ DHT11_Mode_Out_PP(); /*主机拉低*/ DHT11_DATA_OUT(DHT11_LOW); /*延时18ms*/ Delay_us(20000); /*总线拉高主机延时30us*/ DHT11_DATA_OUT(DHT11_HIGH); Delay_us(30);//延时30us /*主机设为输入判断从机响应信号*/ DHT11_Mode_IPU(); /*判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行*/ if(DHT11_DATA_IN()==Bit_RESET) {count=0; /*轮询直到从机发出的80us低电平响应信号结束*/ while(DHT11_DATA_IN()==Bit_RESET){count++;if(count>1000)return0;Delay_us(10);}count=0; /*轮询直到从机发出的80us高电平标置信号结束*/ while(DHT11_DATA_IN()==Bit_SET){count++;if(count>1000)return0;Delay_us(10);} /*开始接收数据*/ DHT11_Data->humi_int=Read_Byte(); DHT11_Data->humi_deci=Read_Byte(); DHT11_Data->temp_int=Read_Byte(); DHT11_Data->temp_deci=Read_Byte(); DHT11_Data->check_sum=Read_Byte(); /*读取结束,引脚改为输出模式*/ DHT11_Mode_Out_PP(); /*主机拉高*/ DHT11_DATA_OUT(DHT11_HIGH);上述是DHT11的编程的核心部分,经过编译。程序可以完美运行,读出相应的测量数据。、图2.4STM32F429底板温湿度传感器接口图2.5DHT11接线实物图1图2.6DHT11接线实物图2图2.7串口调试助手显示温湿度数据BMP180大气压强传感器的调试我所使用的BMP180模块有四个引脚,VCC、SCL、SDA、GND。这个传感器模块使用的是IIC通信协议。IIC通信协议就是两根信号线:SCL与SDA,他们是双向的开路结构。就BMP180模块来说,其中SCL是时钟线,它在上升沿的时候可以将数据输入到每个EEPROM中,在下降沿的时候输出数据。它可以接到开发板上IIC模块的SCL引脚。另一根SDA则是数据线,双向传输,是OD门,可以接到开发板IIC模块上的SDA引脚处。剩下两个引脚分别为VCC和GND,分别可以接到IIC模块的3.3v和GND处。所对应的接线图如下图图2.8单片机底板I2C接口图2.9BMP180接线实物图主要代码实现如下:主函数中对于测量数据函数的指针的定义:SENSOR_DATA_T tempVal={NULL,NULL,NULL,NULL};//温度数据SENSOR_DATA_T presVal ={NULL,NULL,NULL,NULL};//气压数据SENSOR_DATA_T altiVal ={NULL,NULL,NULL,NULL};//海拔数据SENSOR_FUNCTION_T tempFunc = {emptyFunc,emptyFunc,emptyFunc,emptyFunc}; //温度函数指针SENSOR_FUNCTION_T presFunc = {emptyFunc,emptyFunc,emptyFunc,emptyFunc}; //气压函数指针SENSOR_FUNCTION_T altiFunc = {emptyFunc,emptyFunc,emptyFunc,emptyFunc}; //海拔函数指针对应了驱动文件中定义通过指针调用的函数:/* 通过指针给上层API调用的函数 */staticvoidbmp180Init(void);staticvoidbmp180AltiUpdate(SENSOR_DATA_T*altiData);staticvoidbmp180GetAltiInfo(SENSOR_DATA_T*AltiData);staticvoidbmp180GetAltitude(SENSOR_DATA_T*altiData);三类函数分别代表求取温度信息,气压信息和高度信息: TFunc->fInit=PFunc->fInit=AFunc->fInit=bmp180Init;//初始化函数 TFunc->fGetQuantity=bmp180GetTemperature; //传感器数据获取 PFunc->fGetQuantity=bmp180GetPressure; AFunc->fGetQuantity=bmp180GetAltitude; 下面最关键的是对于真实压力数值的计算。把由bmp180GetUp函数所获得的原始的压力数值通过datasheet公式计算出真实的压力数值:staticvoidbmp180CalPressure(void){int32_tpressure,x1,x2,x3,b3,b6;uint32_tb4,b7; /* 根据公式计算参数 */b6=bmp180Val.paramB5-4000;//*****calculateB3************x1=(b6*b6)>>12;x1*=calParam.b2;x1>>=11;x2=(calParam.ac2*b6);x2>>=11;x3=x1+x2;b3=(((((int32_t)calParam.ac1)*4+x3)<<OSS)+2)>>2;//*****calculateB4************x1=(calParam.ac3*b6)>>13;x2=(calParam.b1*((b6*b6)>>12))>>16;x3=((x1+x2)+2)>>2;b4=(calParam.ac4*(uint32_t)(x3+32768))>>15;b7=((uint32_t)(bmp180Val.up-b3)*(50000>>OSS));if(b7<0x80000000) { pressure=(b7<<1)/b4;} else { pressure=(b7/b4)<<1;}x1=pressure>>8;x1*=x1;x1=(x1*SMD500_PARAM_MG)>>16;x2=(pressure*SMD500_PARAM_MH)>>16; /* 计算真实压力值 */pressure+=(x1+x2+SMD500_PARAM_MI)>>4;//压力值单位:Pa bmp180Val.pressure=pressure; //计算完才赋值,减少错误地把中间数据交给上层的概率(上层使用get函数获取数据)}最后在主函数上直接调用所计算好的真实的压力数值,并且打印出来: if(presVal.isNew==0) //气压数据 { presFunc.fGetQuantity(&presVal); tempVal.isNew=1; printf("\r\npresVal:%s,%f%s",presV,presVal.quantity,presVal.unit); }上述是BMP180完成大气压测量代码的精华部分,经过编译。程序可以完美运行,可以读出相应的测量数据。图3.0串口调试助手显示大气压数据GP2Y1014AU粉尘传感器的调试夏普的GP2Y1014传感器使用起来就相对比较麻烦了。刚入手这款传感器的时候,包装袋里还附带着一个150ohm的电阻和一个220uF的电容。并且传感器自带的线没有接口,需要自行焊接到板子上。于是我选择了用一小块万能板把电容和电阻焊接到上面然后再把传感器的线焊接到引脚上,并用杜邦线连接,便于在开发板上进行插拔操作。接线图如下图。这里解释一下为什么要外接一个150ohm的电阻和220uF的电容。由下图可以看出1和2脚分别代表VLED和GND,他们是负责给传感器内部的红外发光二极管进行供电,所以不能够直接接5V电源需要串联一个150ohm的电阻进行限流操作。而在供电给红外发光二极管的征集和腹肌之间并联一个220uF的电容则是为了稳定供电。图3.1GP2Y1014接线图图3.2GP2Y1014接线实物图GP2Y1014AU主要程序代码:在GP2Y1014AU的驱动程序中 //配置PA6引脚为模拟信号模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; //第6个引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;//模拟信号模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz; //引脚的工作速度,速度越快,功耗越高 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要上下拉电阻 GPIO_Init(GPIOA,&GPIO_InitStructure);//配置端口上面单片机的PA6引脚连接的是传感器的3号脚。将PA6引脚设置成为模拟信号模式,可以为传感器提供输入信号//配置PC3为输出模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//第9个引脚GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//输出模式,才可以输出电流//GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//[可选]推挽输出模式,增加输出电流,但是也会增加功耗GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//引脚的工作速度,速度越快,功耗越高GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不需要上下拉电阻GPIO_Init(GPIOC3,&GPIO_InitStructure);//配置端口F这里PC3引脚连接的是将传感器的5号脚,作为单片机ADC的模拟输入脚将它设为输出模式。空气质量数据通过电压模拟信号进行输出。对高低电平的定义:#defineGP2Y_HighGPIO_SetBits(GPIOF,GPIO_Pin_9);#defineGP2Y_LowGPIO_ResetBits(GPIOF,GPIO_Pin_9);对于GP2Y1014AU比较重要的是,对于所测得的电压值要进行模数转换,通过公式进行AD值和电压值之间的计算。最后可以得到空气中污染物浓度,代码如下:uint32_tadc_val=0; //初始化 gp2y_init(); //启动ADC1开始转换 ADC_SoftwareStartConv(ADC1); //等待转换完毕 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); ADC_ClearFlag(ADC1,ADC_FLAG_EOC); GP2Y_Low; delay_us(280); //获取转换结果值 adc_val=ADC_GetConversionValue(ADC1); delay_us(40); GP2Y_High; delay_us(9680); *PM=0.17*adc_val-0.1; delay_ms(1000);上述的转换公式是依据该传感器使用手册中已知的曲线图得出的,曲线图如下:图3.3AD值和电压值关系曲线图图3.4串口调试助手显示PM2.5数据采集数据传输的设计将采集到的数据通过USART协议,用MINIUSB线将开发版与电脑连接。就可以把采集到的数据进行单片机和电脑之间的传输工作,用串口调试助手可以观察到这些数据。最后再将7寸触摸屏用条带与核心板上的RGB888接口相连,对触摸屏进行配置和调试,包括分辨率,字模导入,使得数据可以在触摸屏上呈现。利用USART协议实现与PC数据传输本次使用的STM32F429单片机有多个USART外设接口可以进行串口通讯,USART是UniversalSynchronousAsynchronousReceiverandTransmitter的缩写,表明通用同步异步收发器可以灵活地与外部设备进行全双工数据交换,是全双工通信。USART在STM32的使用中经常用来传输和打印程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑。我们可以将调试信息和所获得的数据数值传输到电脑端,并且我们可以打印到串口调试助手的窗口上,从而了解程序运行是否正确、指出运行出错位置等等。对于STM23单片机来说所使用的USART输出的是TTL电平信号。为了实现单片机和PC之间的传输,我是用的是MINIUSB线将单片机与电脑连接,这里就需要接到开发板上USB转串口的IC,我们选择CH340G芯片来实现这个功能,CH340G是一个USB总线的转接芯片,可以实现USB转USART、USB转IrDA红外或者USB转打印机接口,我们使用其USB转USART功能。该IC的电路原理图如下图3.5USB转串口原理图这里是将CH340G的TXD引脚与USART1的RX引脚连接,CH340G的RXD引脚与USART1的TX引脚连接。CH340G芯片集成在开发板上,其地线(GND)已与控制器的GND连通。TX代表发送数据输出引脚。RX代表接收数据输入引脚。RTS代表请求以发送(RequestToSend)。CTS代表清除以发送(ClearToSend),USART初始化结构体代码如下:typedefstruct{uint32_tUSART_BaudRate;//波特率uint16_tUSART_WordLength;//字长uint16_tUSART_StopBits;//停止位uint16_tUSART_Parity;//校验位uint16_tUSART_Mode;//USART模式uint16_tUSART_HardwareFlowControl;//硬件流控制}USART_InitTypeDef;USART_BaudRate代表波特率设置。一般设置为2400、9600、19200、115200。USART_WordLength代表数据帧字长,可选8位或9位。它设定USART_CR1寄存器的M位的值。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位。USART_StopBits代表停止位设置,可选0.5个、1个、1.5个和2个停止位,它设定USART_CR2寄存器的STOP[1:0]位的值,一般我们选择1个停止位。USART_Parity代表奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶校验)以及USART_Parity_Odd(奇校验),它设定了USART_CR1寄存器的PCE位和PS位的值。USART_Parity代表奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶校验)以及USART_Parity_Odd(奇校验),它设USART_CR1寄存器的PCE位和PS位的值。USART_HardwareFlowControl代表硬件流控制选择,只有在硬件流控制模式才有效。想要将数据才串口调试助手打印出来就打需要重定向c库函数printf到串口DEBUG_USART,重定向后可以使用printf函数,代码如下:intfputc(intch,FILE*f){ /*发送一个字节数据到串口DEBUG_USART*/ USART_SendData(DEBUG_USART,(uint8_t)ch); /*等待发送完毕*/ while(USART_GetFlagStatus(DEBUG_USART,USART_FLAG_TXE)==RESET); return(ch);}对串DEBUG_USART模式进行配置:USART_InitStructure.USART_BaudRate=DEBUG_USART_BAUDRATE;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(DEBUG_USART,&USART_InitStructure);USART_Cmd(DEBUG_USART,ENABLE);}定义串口波特率为115200://串口波特率#defineDEBUG_USART_BAUDRATE115200打开串口调试助手如下图,根据配置选择正确的端口号。这里可以查看电脑设备管理器查看MINIUSB线接入后的端口号,并且选择波特率为115200,校验位为N,数据位为8,停止位为1。此时打开串口就可以获得想要打印的信息。图3.6串口调试助手使用触摸屏反映数据我是用的是玫瑰科技的七寸电容触摸屏,分辨率为1024*600,是一块电容式触摸屏。然而玫瑰科技的电容式触摸屏的引脚和STM32F429核心板上RGB888的引脚排序不一样如图所示。这也是在进行研究过程中遇到的一个小麻烦之一,为了解决问题我外接了一块小的转接板如下图。图3.7野火核心板液晶接口引脚图图3.8玫瑰科技七寸屏接口引脚图图3.9通过转接板连接单片机和七寸屏下面开始进行对七寸电容触摸屏的调通工作。另外在这里可以说明一下,当时选择STM32F429这款单片机也是因为它自带有lcd控制器,可以直接驱动七寸触摸屏。而STM32另外一些低端系列不能直接驱动,要用模组屏。这里讲一下PPI也就是PixelsPerInch缩写,意思是所在屏幕上每英寸对脚线拥有的像素数目即为像素密度。它是有一个计算公式的。所计算出来的数值越高就代表着显示屏可以显示越高密度的图像,所展示出来的细节也越多、画面也就越清晰。通过计算所得到的PPI的数值也用来判断STM32F429单片机板载片内FLASH大小能不能带起来整块屏幕。因为整块屏幕除了要亮起来还要进行操作,要导入图像颜色还要有字模。不仅仅是静态的。当屏幕中的图像在动的时候,所占用片内FLASH的大小也在变化。如果板载的片内FLASH不够用的话就会不能显示一整块完整的屏幕图像,这时就需要外插SD卡,使用SDRAM来完成任务了。我使用的是分辨率为1024*600的七寸屏,则PPI=((1024*1024+600*600)^0.5)/7=169.547778。FLASH占用计算1024*600*2=1200K。而我使用的STM32F429片内FLASH只有1M。我的手上暂时没有SD卡,所以我将手中的七寸屏调低了分辨率。代码如下:/*LCDSize(WidthandHeight)*/#defineLCD_PIXEL_WIDTH((uint16_t)800)#defineLCD_PIXEL_HEIGHT((uint16_t)480)#defineLCD_FRAME_BUFFER((uint32_t)0xD0000000)#defineBUFFER_OFFSET((uint32_t)800*480*2)//sdram为16位的,液晶RGB888#defineLCD_PIXCELS((uint32_t)800*480)调整之后再进行计算800*480*2=750K此时屏幕可以正确显示例程中的文字和图像。这里大概介绍一下什么是字模:比如“正”字,它使用的是16×16点阵。点阵中黄色的点是高亮的,对应于二进制编码中的1,绿色的低亮对应于二进制编码中的0。如第一行二进制编码应该是0000000000001000刚好用两个字节表示就是0x0,0x08,这样,16总共需要用32个字节来表示,这32个字节就是“正”的字模。在单片机程序中,将字模发送给液晶显示模块,就能够显示出响应的汉字或字符。制作字模有专门的软件,这里我就不过多叙述了。我直接使用这款软件将字模制作好了,下面用点阵展示“当”这个汉字,举例说明。代码如下:/*"当"字符的字模*/ unsignedcharcharater_matrix[]={0x00,0x80,0x10,0x90,0x08,0x98,0x0C,0x90,0x08,0xA0,0x00,0x80,0x3F,0xFC,0x00,0x04,0x00,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x04,0x3F,0xFC,0x00,0x04,0x00,0x00};图4.0串口调试助手显示字模下面要将一个字符显示到七寸屏上,程序中的Xpos:代表字符要显示到的液晶行地址。Ypos代表字符要显示到的液晶列地址。c代表指针,指向要显示字符的字模数据的地址。并且显示背景颜色和字体颜色然后显示到下一个字符以及进行换行操作。代码如下: /*xpos表示当前行的显存偏移位置*/xpos=Xpos*LCD_PIXEL_WIDTH*3; /*Xaddress表示液晶像素点所在液晶屏的列位置*/Xaddress+=Ypos; /*index用于行计数*/for(index=0;index<LCD_Currentfonts->Height;index++){ /*counter用于行内像素点的位置计数*/for(counter=0;counter<LCD_Currentfonts->Width;counter++){ /*根据字模数据判断是有色像素还是无色像素*/ if((((c[index]&((0x80<<((LCD_Currentfonts->Width/12)*8))>>counter))==0x00)&&(LCD_Currentfonts->Width<=12))||(((c[index]&(0x1<<counter))==0x00)&&(LCD_Currentfonts->Width>12))){ /*显示背景色*/*(__IOuint16_t*)(CurrentFrameBuffer+(3*Xaddress)+xpos)=(0x00FFFF&CurrentBackColor);//GB*(__IOuint8_t*)(CurrentFrameBuffer+(3*Xaddress)+xpos+2)=(0xFF0000&CurrentBackColor)>>16;//R}else{ /*显示字体颜色*/*(__IOuint16_t*)(CurrentFrameBuffer+(3*Xaddress)+xpos)=(0x00FFFF&CurrentTextColor);//GB*(__IOuint8_t*)(CurrentFrameBuffer+(3*Xaddress)+xpos+2)=(0xFF0000&CurrentTextColor)>>16;//R} /*指向当前行的下一个点*/ Xaddress++; } /*显示完一行*/ /*指向字符显示矩阵下一行的第一个像素点*/Xaddress+=(LCD_PIXEL_WIDTH-LCD_Currentfonts->Width);}为了判断显示位置是否超出了液晶屏的边界,要是超出宽度了就不进行自动换行。代码如下:voidLCD_DisplayStringLine(uint16_tLine,uint8_t*ptr){uint16_trefcolumn=0;/*判断显示位置不能超出液晶的边界*/while((refcolumn<LCD_PIXEL_WIDTH)&&((*ptr!=0)&(((refcolumn+LCD_Currentfonts->Width)&0xFFFF)>=LCD_Currentfonts->Width))){/*使用LCD显示一个字符*/LCD_DisplayChar(Line,refcolumn,*ptr);/*根据字体地址偏移显示的位置*/refcolumn+=LCD_Currentfonts->Width;/*指向字符串中的下一个字符*/ptr++;}}如果要进行自动换行则需要:if((Column+LCD_Currentfonts->Width)>LCD_PIXEL_WIDTH) { Column=0; Line+=LCD_Currentfonts->Height; }if((Line+LCD_Currentfonts->Height)>LCD_PIXEL_HEIGHT) { Column=0; Line=0; } 在主函数中直接对触摸屏初始化,然后进行刷背景、字体、前景层颜色,设置刷新函数一系列操作之后就可以知接调用LCD显示字符串了。例如: LCD_DisplayStringLine_EN_CH(LINE(8),(uint8_t*)dispBuff); sprintf(dispBuff,"温度为%d.%d℃",\ DHT11_Data.temp_int,DHT11_Data.temp_deci); 直接调用LCD显示温度信息。经过调试触摸屏可以正常运行并且显示例程中要打印出的中英文字符以及变化的图案。总体设备的实现和调试经过上面的步骤,我分别调试并且成功编译三个传感器,USB传串口通信以及触摸屏。接下来我要做的就是要把他们组合起来并且进行编程和调试,实现本次课题研究任务。因为我并没有使用操作系统,是直接将程序裸跑在STM32F429上。其实单个传感器调通不是很难困难,但是当将他们组合在一起的时候就会出现一系列的问题。比如输入输出信号的引脚之间相互冲突,时序中断方面定义出现矛盾,导致不能同时读出数据还有数据不动态刷新这样的问题出现。刚把BMP180与DHT11组合在一起的时候就出现过中断设置方面的问题,造成只动态显示BMP180的数值,而DHT11数值则不随着温度的变化进行实时刷新。重新设置了delay函数中断之后,解决了这个问题。代码如下所示:voidSysTick_Init(void){ /*SystemFrequency/10001ms中断一次 *SystemFrequency/100000 10us中断一次 *SystemFrequency/10000001us中断一次 */ if(SysTick_Config(SystemCoreClock/1000000)) { /*Captureerror*/ while(1); }}voidDelay_ns(__IOu32nTime){ TimingDelay=nTime; while(TimingDelay!=0);}因为我没用操作系统,将传感器整合到一起之后主函数是单线程按顺序调用的传感器,所以我将温湿度的测量写进了调用BMP280循环结构体中。代码如下: if(bmp180Detect(&tempFunc,&presFunc,&altiFunc)==0) { LCD_DisplayStringLine_EN_CH(LINE(3),(uint8_t*)"检测到BMP180传感器"); tempFunc.fInit(); //初始化传感器 tempFunc.fGetInfo(&tempVal); presFunc.fGetInfo(&presVal); while(1) { if(Task_Delay[0]==0) { tempFunc.fUpdate(&tempVal); //传感器数据更新 presFunc.fUpdate(&presVal); if(tempVal.isNew==0) //温度数据 { tempFunc.fGetQuantity(&tempVal); tempVal.isNew=1; sprintf(dispBuff,"温度:%s,%f%s",tempV,tempVal.quantity,tempVal.unit); LCD_ClearLine(LINE(4)); /*然后显示该字符串即可,其它变量也是这样处理*/ LCD_DisplayStringLine_EN_CH(LINE(4),(uint8_t*)dispBuff); } if(presVal.isNew==0) //气压数据 { presFunc.fGetQuantity(&presVal); tempVal.isNew=1;sprintf(dispBuff,"大气压强:%s,%f%s",presV,presVal.quantity,presVal.unit); LCD_ClearLine(LINE(5)); /*然后显示该字符串即可,其它变量也是这样处理*/ LCD_DisplayStringLine_EN_CH(LINE(5),(uint8_t*)dispBuff); } if(Read_DHT11(&DHT11_Data)==SUCCESS){ LCD_DisplayStringLine_EN_CH(LINE(7),(uint8_t*)"读取DHT11成功!"); sprintf(dispBuff,"湿度为%d.%d%RH",\ DHT11_Data.humi_int,DHT11_Data.humi_deci); LCD_ClearLine(LINE(8)); LCD_DisplayStringLine_EN_CH(LINE(8),(uint8_t*)dispBuff); sprintf(dispBuff,"温度为%d.%d℃",\ DHT11_Data.temp_int,DHT11_Data.temp_deci); LCD_Cle
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医学检验一季度三基试题附答案
- 医院三基考试模考模拟试题附完整答案详解
- 《中级个人理财》-中级银行从业试题预测试卷附答案详解
- 高中休育面试题及答案大全
- 仓库出库题库及答案模板
- 中小学教师资格证《综合素质》试题及答案
- 史无前例考试试题及答案
- 基金从业资格考试基金法规与职业道德相关真题试卷含答案
- 2025年事业单位卫生类专业知识试卷(护理学)试题(附答案)
- 管理心理学AB卷及答案(全文)
- 2026贵州省黔晟国有资产经营有限责任公司面向社会招聘中层管理人员2人备考考试试题及答案解析
- 2026中国电信四川公用信息产业有限责任公司社会成熟人才招聘备考题库及答案详解一套
- 消费者权益保护与投诉处理手册(标准版)
- 南京航空航天大学飞行器制造工程考试试题及答案
- 2023-2024学年江西省赣州市章贡区文清实验学校数学六年级第一学期期末经典模拟试题含答案
- DB36-T 1158-2019 风化壳离子吸附型稀土矿产地质勘查规范
- 城市道路照明路灯工程施工组织方案资料
- 雷达液位计参考课件
- 手术标本管理护理质量控制考核标准
- GB 30981-2020 工业防护涂料中有害物质限量
- 钢结构厂房布置及设备
评论
0/150
提交评论