嵌入式系统课程设计温度检测报警系统
基于嵌入式系统的智能故障监测与预警系统设计
基于嵌入式系统的智能故障监测与预警系统设计智能故障监测与预警系统是一种利用嵌入式系统的技术,在各种设备和系统中监测故障,并及时发出预警的系统。
本文将介绍基于嵌入式系统的智能故障监测与预警系统的设计。
一、系统概述智能故障监测与预警系统设计的目标是通过嵌入式系统对设备的状态进行实时监测,并在发现异常时及时发出警报,以提前预防可能的故障发生。
二、系统组成1. 嵌入式硬件平台:嵌入式硬件平台是智能故障监测与预警系统的基础。
选择适当的处理器、存储器和传感器等硬件组件,并进行适当的集成,以实现系统的功能需求。
2. 传感器:传感器是系统的关键组成部分,用于获取设备的运行状态数据。
例如,温度传感器、湿度传感器、压力传感器等。
这些传感器将监测到的数据传输给嵌入式系统进行分析。
3. 通信模块:通信模块用于与外部系统进行数据传输和控制指令的收发。
通过与网络连接,嵌入式系统可以将监测到的数据上传到云服务器进行进一步的处理和分析。
同时,系统也可以接收来自远程操作员的指令,以实现远程控制。
4. 数据处理和分析模块:嵌入式系统需要有一定的数据处理和分析能力,以提取有用的信息并进行故障预测。
通过采用适当的算法与模型,系统可以实现对监测数据的实时处理,并判断设备是否存在潜在的故障风险。
5. 警报模块:当系统检测到设备存在故障风险时,需要及时发出警报以引起操作员的注意。
嵌入式系统可以通过声音、灯光、短信等方式发出警报,并将警报信息传输给远程操作员。
三、系统工作流程智能故障监测与预警系统的工作流程如下:1. 数据采集:传感器采集设备的各种状态数据,例如温度、湿度、电流等。
2. 数据传输:传感器将采集到的数据传输给嵌入式系统。
3. 数据处理与分析:嵌入式系统对传感器采集的数据进行处理和分析,提取有用的信息,并进行故障预测。
4. 故障判断:通过分析得到的信息,嵌入式系统判断设备是否存在故障风险。
5. 警报发出:如果系统判断设备存在故障风险,嵌入式系统将发出警报,并将警报信息传输给远程操作员。
实时温控报警系统
《嵌入式系统二》课程设计报告实时温控报警系统设计日期:2011年07月4日至2010年07月8日设计题目:实时温控报警系统摘要本次课程设计是利用S3C2410A开发板,Z L G7290芯片,L M75A数字温度传感器,键盘,L E D数码管和蜂鸣器设计了一个实时温控报警系统。
本系统可以通过数字键设定需控制的温度,并在L E D上显示。
温度设定完后,系统启动加热器,对水进行加热。
L E D实时显示当前的温度,当超过设定温度值时,系统关闭加热器,并使报警器鸣叫。
运行过程中,若再按下电源键,则系统停止,电源指示灯灭。
本系统功能实用,可用于生产或生活中。
关键词:S3C2410A LM75A按键输入实时温控LE D数码管目录1.绪论 (1)1.1 嵌入式系统简介 (1)1.2 课程设计题目及设计要求 (1)2.硬件设计 (2)2.1 S3C2410A开发板 (3)2.2 ZLG7290键盘输入模块及LED数码管 (4)2.3 传感器模块 (7)2.4 报警器模块 (8)3.软件设计 (8)3.1 系统控制程序概述 (8)3.2 系统控制程序的设计 (10)3.3 设计过程及结果 (10)4.源程序代码 (12)5.课程设计体会 (15)6.参考文献 (16)1.绪论1.1嵌入式系统简介嵌入式系统是指以应用为中心、以计算机技术为基础、软硬件可裁剪的专用计算机系统,是继I T网络技术之后的又一新技术发展方向。
由于具有体积小、功耗低、可靠性高以及面向多行业应用的特征,嵌入式系统目前已被广泛用于国防军事、电子消费、网络通信、工业控制等领域,具有极为广阔的发展前景。
结合I n t e r n e t技术,嵌入式系统目前已普遍应用于智能公路(车辆导航、信息监测等)、植物工厂(无土栽培、智能种子工程等)、虚拟现实(V R)(交通警察、家用机器人等)、信息家电(冰箱、空调网络化、自动抄表、防火/防盗系统等)、先进工业自动化(电网安全等)、P O S网络及电子商务(交通卡、电话卡、自动售货机等)。
嵌入式温度测量系统的设计与实现
嵌入式温度测量系统的设计与实现嵌入式温度测量系统是一种基于嵌入式技术和传感器技术的温度测量系统。
随着科技的发展,嵌入式温度测量系统越来越受到人们的关注。
下面我们就来探讨一下嵌入式温度测量系统的设计与实现。
一、设计嵌入式温度测量系统设计步骤如下:1. 确定系统需求:包括测量温度范围、精度、测量间隔、数据处理方式等参数。
2. 确定选用的传感器类型:根据测量要求,选择相应的温度传感器类型。
如NTC热敏电阻、热电偶、热电阻等。
3. 建立硬件电路:设计合适的硬件电路,将传感器与处理器连接。
准确采集温度数据。
4. 编写软件程序:编写合适的软件程序,将采集到的温度数据处理,并作为输出。
5. 实现数据通信:根据系统的需求,设计合适的通信方式,将数据及时的传输给其他设备。
二、实现嵌入式温度测量系统实现步骤如下:1. 选用适当的芯片:根据自己的需求,选用适当的芯片,比如常用的stm32、arduino、MCU等。
2. 选用合适的传感器:根据需求,选择合适的温度传感器,如DS18B20, TLM9941ISHJ, Thermocouple Type-K等传感器。
3. 搭建硬件电路:利用电路设计软件,设计出嵌入式温度测量系统的硬件电路,并制造出PCB板。
4. 编写相应软件:利用相应的开发工具,编写出嵌入式温度测量系统的软件程序。
5. 调试和测试:将硬件连接好后,通过调试和测试程序,确保嵌入式温度测量系统的功能达到预期。
三、总结嵌入式温度测量系统是一种实用性强且功能高的温度测量系统。
不同的系统设计有不同的实现方法,本文只是简单的介绍了嵌入式温度测量系统的设计与实现步骤。
对于嵌入式技术爱好者来说,希望能够通过学习本文获得一些有价值的内容。
嵌入式系统课程设计(基于ARM的温度采集系统设计)
教师批阅目录一、设计内容............................................................................................................. - 1 -1.1设计目的....................................................................................................... - 3 -1.2设计意义....................................................................................................... - 3 -二、设计方案............................................................................................................. - 5 -2.1设计要求....................................................................................................... - 5 -2.2方案论证....................................................................................................... - 5 -三、硬件设计............................................................................................................. - 6 -3.1设计思路....................................................................................................... - 6 -3.2系统电路设计............................................................................................... - 6 -四、软件设计............................................................................................................. - 8 -4.1设计思路....................................................................................................... - 8 -4.2程序清单..................................................................................................... - 10 -五、心得体会........................................................................................................... - 12 -参考文献................................................................................................................... - 13 -教师批阅基于ARM的温度采集系统摘要:本设计是基于嵌入式技术作为主处理器的温度采集系统,利用S3C44B0xARM微处理器作为主控CPU,辅以单独的数据采集模块采集数据,实现了智能化的温度数据采集、传输、处理与显示等功能,并讨论了如何提高系统的速度、可靠性和可扩展性。
嵌入式系统中的智能火灾监测与预警系统设计
嵌入式系统中的智能火灾监测与预警系统设计随着现代化社会的快速发展,建筑物数量的增加以及人口数量的增长,火灾事故成为一个常见的安全隐患。
为了更好地保护人们的生命和财产安全,嵌入式系统中的智能火灾监测与预警系统日益受到关注。
智能火灾监测与预警系统的设计是为了实时监测火灾的发生,并能及时预警和采取应对措施,使得人们能够更好地应对火灾事故。
在这篇文章中,我们将探讨智能火灾监测与预警系统设计的关键要素和功能。
一、传感器技术传感器技术是智能火灾监测与预警系统设计中的关键要素之一。
通过使用各种传感器,我们能够感知到火焰、烟雾、温度和气体浓度等指标,从而判断火灾的发生和程度。
常用的传感器包括光学传感器、热敏传感器、烟雾传感器和气体传感器等。
这些传感器能够实时监测建筑物内外的环境变化,并将数据传输给嵌入式系统进行分析。
二、数据处理与分析在智能火灾监测与预警系统中,数据处理与分析起着至关重要的作用。
嵌入式系统能够处理和分析传感器所采集到的数据,通过算法判断是否有火灾发生,并评估火灾的规模和严重程度。
同时,系统还能进行数据的存储和管理,便于事后的分析和调查。
对于火灾预警,系统可以通过短信、电话、声音和光信号等多种方式向相关人员发出警报。
三、网络通信与监控智能火灾监测与预警系统的设计也需要考虑到网络通信和监控功能。
通过使用网络通信技术,系统能够与其他安全设备、消防系统和监控中心进行连接,实现全面的火灾监控和管理。
同时,系统还能够与手机、电脑等终端设备进行互联,方便对火灾信息进行远程监控和警报。
四、应急措施的触发与执行智能火灾监测与预警系统设计的另一个重要方面是能够触发和执行相应的应急措施。
一旦系统检测到火灾发生,它应该能够自动触发消防设备的启动,如喷水系统、喷雾系统和排烟系统等。
同时,系统还应该能够控制紧急疏散路径的指示灯以及紧急广播系统等。
这些措施的快速执行能够最大程度地减少火灾对人员和财产的伤害。
五、可靠性和稳定性智能火灾监测与预警系统的设计必须注重可靠性和稳定性。
嵌入式系统课程设计温度检测报警系统解读
嵌入式系统课程设计姓名:班级:学号:目录:一.系统要求二.设计方案三.程序流程图四.软件设计五.课程总结与个人体会一、系统要求使用STM32F103作为主控CPU设计一个温度综合测控系统,具体要求:1、使用热敏电阻或者内部集成的温度传感器检测环境温度,每0.1秒检测一次温度,对检测到的温度进行数字滤波(可以使用平均法)。
记录当前的温度值和时间。
2、使用计算机,通过串行通信获取STM32F103检测到的温度和所对应的时间。
3、使用计算机进行时间的设定。
4、使用计算机进行温度上限值和下限值的设定。
5、若超过上限值或者低于下限值,则STM32进行报警提示。
二、设计方案本次课程设计的要求是使用STM32F103设计一个温度测控系统,这款单片机集成了很多的片上资源,功能十分强大,我使用了以下部分来完成课程设计的要求:1、STM32F103内置了3个12位A/D转换模块,最快转换时间为1us。
本次课程设计要求进行温度测定,于是使用了其中一个ADC对片上温度传感器的内部信号源进行转换。
当有多个通道需要采集信号时,可以把ADC配置为按一定的顺序来对各个通道进行扫描转换,本设计只采集一个通道的信号,所以不使用扫描转换模式。
本设计需要循环采集电压值,所以使用连续转换模式。
2、本次课程设计还使用到了DMA。
DMA是一种高速的数据传输操作,允许在外部设备和储存器之间利用系统总线直接读写数据,不需要微处理器干预。
使能ADC的DMA接口后,DMA控制器把转换值从ADC 数据寄存器(ADC_DR)中转移到变量ADC_ConvertedValue中,当DMA 传输完成后,在main函数中使用的ADC_ConvertedValue的内容就是ADC转换值了。
3、STM32内部的温度传感器和ADCx_IN16输入通道相连接,此通道把传感器输出的电压值转换成数字值。
STM内部的温度传感器支持的温度范围:-40到125摄氏度。
利用下列公式得出温度温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25式中V25是 VSENSE在25摄氏度时的数值(典型值为1.42V)Avg_Slope是温度与VSENSE曲线的平均斜率(典型值为4.3mV/C)利用均值法对转换后的温度进行滤波,将得到的温度通过串口输出。
基于嵌入式系统数字温度的测试系统
基于嵌入式系统数字温度的测试系统随着现代科技的不断发展,嵌入式系统已经广泛应用于各个领域。
基于嵌入式系统数字温度的测试系统是其中的一种应用。
本篇文档将向您介绍这种测试系统的原理、应用场景以及未来发展趋势。
一、原理基于嵌入式系统数字温度的测试系统主要是通过数字温度传感器来测量室内、室外等各种环境的温度,然后将传感器的数据传输到嵌入式系统中进行处理和分析。
一般来说,这种系统包含四个基本模块:传感器模块、数据采集模块、数据处理模块和显示模块。
1.传感器模块传感器模块是基于热敏电阻、热电偶等原理设计的,通过采集物理环境发生的温度变化,将这些变化转化成电信号。
该模块需要具有快速响应、精度高、抗干扰能力强、稳定性好等特点。
2.数据采集模块数据采集模块主要是通过模数转换器将传感器模块产生的负压电信号转化为数字信号,然后将数字信号传输给数据处理模块。
3.数据处理模块数据处理模块通过嵌入式系统的处理器对传感器模块采集到的数据进行处理和分析,常见的处理和分析方法包括数据滤波、数据校准、数据转换、数据存储等。
4.显示模块显示模块的作用是将处理后的数据以图表、数字等形式展现出来,方便用户进行观察分析。
二、应用场景基于嵌入式系统数字温度的测试系统广泛应用于各个领域,具体应用场景如下:1.实验室在实验室中,需要对实验过程的温度、湿度等参数进行实时监测,并及时采取相应的措施来保证实验的顺利进行。
基于嵌入式系统数字温度的测试系统能够满足实验室的需要,可以快速准确地获取环境参数,并且还能够通过报警提示功能实现实时监测和控制。
2.医院医院作为公共场所,需要大量设备进行物流管理、环境监测、药品管理等工作。
基于嵌入式系统数字温度的测试系统可以在医院中实现对温度、湿度等变量的实时监测,并通过数据存储和处理分析来确保医院环境的安全性和稳定性。
3.制造业在制造业生产中,部分工艺需要控制温度,控制湿度等变量才能保证产品的质量。
在这种情况下,通过基于嵌入式系统数字温度的测试系统可以实时监测关键参数并进行相应的调整,有效保证产品的质量。
嵌入式温度监测与报警系统设计设计Word
学号14112200224毕业设计(论文)题目: 嵌入式温度监测与报警系统设计作者易康乐届别 2015届院别信息与通信工程学院专业电子信息指导教师万忠民职称教授完成时间2015年5月10日摘要本设计采用了ARM COTEX—M3 系列芯片STM32F103RCT6为主控芯片,对DS18B20温度传感器进行控制,实现温度采集功能,并在TFTLCD液晶显示屏上显示实时温度。
软件采用μC/OS-Ⅱ嵌入式实时内核与μC/GUI图形界面库来实现多任务管理和UI界面的功能。
利用μC/GUI设计一个具有显示实时温度折线图和控制窗口的UI界面,从而减少按键数量。
同时调用μC/OS-Ⅱ嵌入式实时内核实现多任务管理和利用μC/GUI实现对触摸按键的设置,通过TFTLCD触摸屏上设置的按键进行温度采集的控制。
通过利用软件模拟按键从而简化了系统的软硬件设计,更便于使用人员进行控制操作,同时提高了系统的可维护性和可操作性,达到了节约成本和具有更高效率的目的。
关键词:微控制器;TFTLCD, DS18B20;温度监测;嵌入式AbstractSystem uses ARM COTEX-M3 chips STM32F103RCT6 as main controller that controls the temperature sensor DS18B20 to achieve temperature acquisition function,and displays real-time temperature on the TFT LCD screen. The software uses the μC/OS - Ⅱ embedded real-time kernel and μC/GUI graphical interface library to implement the multiple task management and UI interface functions. Using the μC/GUI design a interface which display a real-time line graph of temperature and control window’s UI to reduce the number of buttons. At the same time, calling the μC/OS - Ⅱsystem manage the multiple task and using μC/GUI implement settings of ing the TFT LCD touch screen buttons control the temperature acquisition. By using simulation keys to simplify the design of system hardware and software,more easier to operator to control the operation.Meanwhile it can improve the maintainability of the system and operability, and achieve the purpose of saving cost and higher efficiency.Keywords:Microcontroller; TFTLCD, DS18B20; Temperature monitoring; Embedded目录摘要 (I)Abstract (II)第1章绪论 (1)1.1 课题设计背景及意义 (1)1.2 行业技术发展概况 (1)1.3 课题设计的主要内容 (2)第2章温度监测与报警系统总体设计 (4)2.1 系统基本框图 (4)2.2 硬系统工作原理图及工作原理 (4)2.2.1 系统工作原理图 (4)2.2.2 系统工作原理 (4)2.3 硬件元件介绍 (5)2.3.1 STM32F103RCT6介绍 (5)2.3.2 DS18B20介绍 (5)2.3.3 TFT-LCD介绍 (6)2.3.4 蜂鸣器介绍 (7)第3章温度监测与报警系统硬件设计 (8)3.1 硬件接口框图 (8)3.2 MCU设计 (8)3.3 JTAG设计 (9)3.4 TFTLCD电路设计 (10)3.5 蜂鸣器电路设计 (11)3.6 DS18B20设计 (12)第4章软件设计 (13)4.1软件简介 (13)4.2主函数分析 (14)4.3 主要任务分析 (15)4.3.1 Task_wave任务 (15)4.3.2 Task_TOUCH任务 (16)4.3.3 TASK_beep任务 (17)4.3.4 Task_DS18B20任务 (17)第5章调试结果及分析 (19)总结 (22)参考文献 (23)致谢 (24)附录一硬件原理图 (25)附录二程序 (26)第1章绪论1.1 课题设计背景及意义当今现代化建设和国民经济发展迅速。
基于嵌入式系统数字温度的测试系统设计
基于嵌入式系统数字温度的测试系统设计基于嵌入式系统数字温度的测试系统设计温度传感器是一类被广泛应用且被最先开发的传感器。
但大多数温度传感器没有对数字信号分析及处理,达到自动化控制的效果。
因此,本设计基于这种情况,利用相关软硬件提高了温度传感器的实用价值。
下面一起来看看吧!2.总体设计2.1系统功能模块设计从需求分析可以看出,该系统的功能模块应包括以下几个部分:实时温度采集与更新模块、自定义温度警报模块、超温报警模块。
DS18B20采用了单总线方式的传输协议,即只需要一根管脚就可以对输入输出进行控制。
此种单总线传输协议在实际应用中有很大优势,使用此种协议的芯片不需要任何外围电路,对硬件设计时的复杂性大大简化了许多。
2.2系统软件设计方案2.2.1嵌入式操作系统选择在本设计当中,硬件平台完全支持Linux、开发便捷迅速、资料众多、内核小、效率高等优点决定了在本设计当中的稳定性等优点,均使得本设计采用了Linux作为开发的操作系统。
2.2.2应用层程序语言选择应用程序使用C语言进行开发,使用Linux标准C语言接口,与驱动层进行交互。
3.硬件设计3.1整体硬件电路设计根据硬件设计方案,在开发中用到的硬件有Tiny6410开发板、DS18B20数字温度传感器、USB转串口数据线。
3.2硬件连接方式将USB转串口线一端接在Tiny6410的串口1上,另一端连接PC 机USB接口。
两个DS18B20传感器的VCC与GND管脚并联起来,与Tiny6410开放的电源与地线接口相连,两个传感器的数据接口一起连接在S3C6410的GPIO的管脚上。
4.软件设计4.1嵌入式系统架构本系统在软件方面主要由Linux内核裁剪和移植、底层驱动程序开发、上层应用程序开发三部分组成。
其中,Linux内核的运行需要有引导程序BootLoader、内核的配置裁剪与编译、根文件系统的编译三个部分支持。
4.2驱动程序设计在本设计当中,对DS18B20数字温度传感器根据其数据手册上的传输协议及参数进行驱动编写,首先要明确其控制参数及流程。
基于嵌入式技术的温度测量系统设计
基于嵌入式技术的温度测量系统设计
1.引言
嵌入式系统是能够运行操作系统的软、硬件综合体,且多数系统的应用软件和操作系统
是紧密结合在一起的。
选配好RTOS(Real-Time Operating System)开发平台,就能合理的实现多任务调度,系统资源利用。
嵌入式系统较一般单片机系统而言,软件资源利用率较高,开发周期短;系统精度较高;实时性也更好。
特别适合于数据处理量较大,有联网、通信等要求的场合。
为了利用嵌入式系统构造一个分布式多点温度测控系统,本文做了一些前期的尝试和开
发工作。
结合可编程单总线数字式温度传感器DS18B20,用嵌入式系统构造了一个具有温
度测量、相关数据处理以及与上位机通信等功能的现场温度测量单元,上位机则主要完成系统监控和人机交互等功能。
2.系统组成及工作原理
温度测量系统总体结构如图1所示。
图1 系统总体结构图
本文中,下位机由嵌入式系统组成。
根据实际需要,其核心采用了低端的LPC2104芯片。
它包含一个支持仿真的ARM7TDMI-S CPU,128K 字节FLASH存储器和64K字节SRAM以及片内总线。
数字式温度传感器DS18B20连到LPC2104的一个GPIO管脚P0.8上。
LPC2104通过该管脚发送命令和接收温度值,并对读到的温度值进行数字滤波、二
—十进制转换等数据处理,还设置了温度超限报警等功能。
下位机还可与上位机实时通信,
一方面接受上位机的各种指令,另一方面,将测得的温度值传送到上位机。
基于嵌入式系统的智能火警报警器设计
基于嵌入式系统的智能火警报警器设计
背景:
火灾在生活中时有发生,及时检测火灾并报警可以帮助人们避免伤亡和财产损失,因此火警报警器被广泛应用于各种场所。
在现代科技的帮助下,基于嵌入式系统的智能火警报警器成为了当今最常用的一种。
设计方案:
该火警报警器采用嵌入式系统设计,包括传感器、控制模块、报警器等部分。
具体实现如下:
1. 传感器部分:采用烟雾传感器和温度传感器,分别检测环境烟雾浓度和温度变化。
2. 控制模块部分:采用单片机控制,根据传感器搜集到的数据进行处理,当检测到烟雾浓度和温度超过设定阈值时,控制模块启动报警器。
3. 报警器部分:采用高亮LED灯和声光报警器,当火警发生时,LED灯和声光报警器同时启动,用高亮的灯光和响亮的声音吸引人们的注意力,让人们能够及时获得警示,从而采取措施,确保人身安全和财产安全。
该智能火警报警器采用嵌入式系统,具有体积小、功耗低、响应快、准确度高等优点,设备安装简单,使用方便,能够为各种场所提供高效、准确的火灾报警保障。
温度检测显示与报警系统课程设计
温度检测显⽰与报警系统课程设计课程设计报告书课设名称:温度检测、显⽰与报警系统年级专业及班级:姓名:学号:指导⽼师:指导⽼师签名:2014年 5⽉4 ⽇摘要温度是⼀种最基本的环境参数,⼈民的⽣活与环境的温度息息相关,在⼯业⽣产过程中需要实时测量温度,在农业⽣产中也离不开温度的测量,因此研究温度的测量⽅法和装置具有重要的意义。
温度是⼀个⼗分重要的物理量,对它的测量与控制有⼗分重要的意义。
随着现代⼯农业技术的发展及⼈们对⽣活环境要求的提⾼,⼈们也迫切需要检测与控制温度:如⼤⽓及空调房中温度的⾼低,直接影响着⼈们的⾝体健康;粮仓温度的检测,防⽌粮⾷发霉,最⼤限度地保持粮⾷原有新鲜品质,达到粮⾷保质保鲜的⽬的;⼯业易燃品的存放。
本次课程设计介绍了以STC89C51单⽚机为核⼼的温度检测报警系统的⼯作原理和设计⽅法。
温度信号由温度传感器芯⽚DS18B20采集,并以数字信号的⽅式传送给单⽚机,单⽚机再控制数码管驱动芯⽚74LS573驱动4位分⽴式数码管显⽰实时温度,当检测到的温度超出了给定的温度范围(默认下限为20℃,默认上限为35℃),系统将输出报警声。
本系统的主要硬件电路包括:温度检测电路,数码管驱动电路,报警电路。
另外本系统的软件部分占了很⼤的⽐重,主要的软件模块包括:温度传感器程序,数码管驱动及显⽰程序,报警程序。
系统的主要功能及⼯作流程总体设计框图:单⽚机STC89C51温度采集(DBS18B20)阈值设定(键盘)报警(蜂鸣器)显⽰主要功能:1、能正确检测温度;2、在数码管上实时显⽰温度;3、当温度超过或低于设定的阈值时,蜂鸣器报警;4、可通过矩阵键盘调整温度报警阈值;5、默认上限报警温度为35℃,默认下限报警温度为20℃。
⼯作流程:系统设计思路为以单⽚机为控制中⼼,通过实时采集温度传感器DBS18B20获得当前的温度值,通过LED显⽰当前温度,同时使⽤键盘设定温度阈值,当测定温度⼤于温度阈值后,利⽤蜂鸣器报警。
基于嵌入式的温度检测报警系统设计与实现
基于嵌入式的温度检测报警系统设计与实现本文设计并实现了一种基于嵌入式系统的温度检测报警系统。
该系统能够检测环境温度,并在温度超过设定阈值时报警。
系统硬件采用了STM32F103C8T6单片机作为主控制器,DS18B20温度传感器作为温度检测模块,继电器控制器作为报警器件。
系统软件采用Keil C编译器进行开发,主要分为温度检测、报警控制、LCD显示三个模块。
温度检测模块利用DS18B20温度传感器检测环境温度,并将温度值通过OneWire接口传输至主控制器。
在Keil C编译器中读取传感器数据,并进行校验和转换,最终得到环境温度值。
为避免出现温度误差,系统采用了多个传感器进行检测,并在软件筛选后进行平均数运算,最终得到一个准确的环境温度值。
报警控制模块利用主控制器控制继电器开关状态,实现对报警器件的控制。
在用户设置温度阈值时,主控制器会对当前温度值进行比较,当温度超过设定阈值时,系统会触发继电器开关,驱动报警器件发出声音和光闪烁,以提醒用户注意环境温度的变化。
LCD显示模块利用主控制器控制LCD屏幕的显示内容,实现对温度、阈值等参数的展示和修改。
用户可以通过按键进行设定,同时屏幕上会显示当前的温度值和设定的阈值。
当温度超过设定阈值时,屏幕上会相应地显示“ALARM”或者“OVERHEAT”等文字提示。
总之,该系统通过简单的硬件和软件设计,实现了对环境温度的准确检测和报警,为用户提供了有效保障。
该系统可以应用于工厂、实验室等对温度要求较高的场合,具有广泛的应用前景。
为了更好地理解和评估基于嵌入式的温度检测报警系统的性能,我们列出了一些相关的数据,并进行了分析。
1. 温度检测精度:系统采用多点传感器同时进行检测,并在软件中进行平均计算,从而减少温度误差,达到了±0.5℃的检测精度。
2. 报警响应速度:当温度超过设定阈值时,系统能够实时触发继电器,驱动报警器件发出声光报警,实现快速响应。
3. 报警器件音量:系统采用继电器控制式蜂鸣器和LED灯作为报警器件,音量较大,且用LED灯进行可视化提醒,可以有效引起用户的注意。
(完整word版)嵌入式系统课程设计(温度检测报警系统).docx
嵌入式系统课程设计姓名:班级:学号:目录:一.系统要求二.设计方案三.程序流程图四.软件设计五.课程总结与个人体会一、系统要求使用 STM32F103 作为主控CPU 设计一个温度综合测控系统,具体要求:1、使用热敏电阻或者内部集成的温度传感器检测环境温度,每0.1 秒检测一次温度,对检测到的温度进行数字滤波(可以使用平均法)。
记录当前的温度值和时间。
2、使用计算机,通过串行通信获取STM32F103 检测到的温度和所对应的时间。
3、使用计算机进行时间的设定。
4、使用计算机进行温度上限值和下限值的设定。
5、若超过上限值或者低于下限值,则STM32 进行报警提示。
二、设计方案本次课程设计的要求是使用STM32F103设计一个温度测控系统,这款单片机集成了很多的片上资源,功能十分强大,我使用了以下部分来完成课程设计的要求:1、STM32F103内置了 3 个 12 位 A/D 转换模块,最快转换时间为1us。
本次课程设计要求进行温度测定,于是使用了其中一个 ADC对片上温度传感器的内部信号源进行转换。
当有多个通道需要采集信号时,可以把 ADC配置为按一定的顺序来对各个通道进行扫描转换,本设计只采集一个通道的信号,所以不使用扫描转换模式。
本设计需要循环采集电压值,所以使用连续转换模式。
2、本次课程设计还使用到了DMA。
DMA是一种高速的数据传输操作,允许在外部设备和储存器之间利用系统总线直接读写数据,不需要微处理器干预。
使能 ADC的 DMA接口后,DMA控制器把转换值从 ADC 数据寄存器 (ADC_DR)中转移到变量 ADC_ConvertedValue 中,当 DMA 传输完成后,在 main 函数中使用的 ADC_ConvertedValue 的内容就是ADC转换值了。
3、STM32内部的温度传感器和ADCx_IN16输入通道相连接,此通道把传感器输出的电压值转换成数字值。
STM内部的温度传感器支持的温度范围: -40 到 125 摄氏度。
嵌入式系统课程设计(基于ARM的温度采集系统设计)
嵌入式系统课程设计(基于ARM的温度采集系统设计)1000
字
嵌入式系统是一种基于微处理器或微控制器、专用硬件和软件的计算机系统,具有小型化、低功耗、实时性强等特点。
本次课程设计旨在设计一种基于ARM的温度采集系统,实现对温度值的实时监测与显示。
首先,需要选用一款适合嵌入式系统的ARM处理器。
考虑到性能和功耗的平衡,本次选用STM32F103C8T6处理器。
其主要特点有:基于ARM Cortex-M3内核,时钟频率为72MHz,具有64KB闪存和20KB SRAM。
接下来,需要选择温度传感器。
考虑到成本和精度等因素,本次选用DS18B20数字温度传感器。
DS18B20具有以下特点:数字接口,
精度为±0.5℃,温度响应快速,封装为TO-92。
然后,需要编写嵌入式软件。
本次采用Keil MDK-ARM开发环境,编写C语言程序。
程序主要包括以下部分:
1. 初始化:包括STM32外设的初始化,如时钟、GPIO、USART等。
2. 温度采集:通过OneWire协议与DS18B20通信,读取温度值,计算并保存到指定变量中。
3. 温度显示:使用USART串口通信,把温度值转换为ASCII码,并通过串口发送到上位机。
上位机可以使用串口调试助手等软件进行数据接收和显示。
最后,进行实验测试。
将DS18B20连接到STM32,把程序烧录到处
理器中,通过串口调试助手连接上位机,即可实时显示温度值。
实验测试表明,该系统温度采集准确可靠,响应速度快,可广泛应用于各种实时温度监测场景。
嵌入式系统课程设计(温度检测报警系统)
嵌入式体系课程设计【1 】姓名:班级:学号:目次:一.体系请求二.设计计划三.程序流程图四.软件设计五.课程总结与小我领会一.体系请求运用STM32F103作为主控CPU设计一个温度分解测控体系,具体请求:1.运用热敏电阻或者内部集成的温度传感器检测情况温度,每0.1秒检测一次温度,对检测到的温度进行数字滤波(可以运用平均法).记载当前的温度值和时光.2.运用盘算机,经由过程串行通讯获取STM32F103检测到的温度和所对应的时光.3.运用盘算机进行时光的设定.4.运用盘算机进行温度上限值和下限值的设定.5.若超出上限值或者低于下限值,则STM32进行报警提醒.二、设计计划本次课程设计的请求是运用STM32F103设计一个温度测控体系,这款单片机集成了许多的片上资本,功效十分壮大,我运用了以下部分来完成课程设计的请求:1、STM32F103内置了3个12位A/D转换模块,最快转换时光为1us.本次课程设计请求进行温度测定,于是运用了个中一个ADC对片上温度传感器的内部旌旗灯号源进行转换.当有多个通道须要收集旌旗灯号时,可以把ADC设置装备摆设为按必定的次序来对各个通道进行扫描转换,本设计只收集一个通道的旌旗灯号,所以不运用扫描转换模式. 本设计须要轮回收集电压值,所以运用持续转换模式.2、本次课程设计还运用到了DMA.DMA是一种高速的数据传输操纵,许可在外部装备和储存器之间运用体系总线直接读写数据,不须要微处理器干涉.使能ADC的DMA接口后,DMA控制器把转换值从ADC 数据存放器(ADC_DR)中转移到变量ADC_ConvertedValue中,当DMA 传输完成后,在main函数中运用的ADC_ConvertedValue的内容就是ADC转换值了.3、STM32内部的温度传感器和ADCx_IN16输入通道相衔接,此通道把传感器输出的电压值转换成数字值.STM内部的温度传感器支撑的温度规模:-40到125摄氏度.运用下列公式得出温度温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25式中V25是 VSENSE在25摄氏度时的数值(典范值为1.42V)Avg_Slope是温度与VSENSE曲线的平均斜率(典范值为4.3mV/C)运用均值法对转换后的温度进行滤波,将得到的温度经由过程串口输出.4、本设计采取了USART1作为串行通讯接口,来进行时光.温度的传输,以及进行时光和温度高低限的设定.5、当温度超出高低限时,开辟板上的灯会响应亮起作为警报,运用了GPIO设置装备摆设引脚.6、时光计时运用了systick时钟,并设置装备摆设个中止,由此进行一秒准时,实现时钟的及时显示.7、时光设定部分参考了一个两位数字读取的函数,在进入主轮回前设定参数,从而防止了在串口中止中输入只能一次性输入所有参数的弊病.三、程序流程图用到的库文件:本身编写的文件:main文件:#include "stm32f10x.h"#include "stdarg.h"#include "stdio.h"#define ADC1_DR_Address ((uint32_t)0x4001244C) extern __IO u16 ADC_ConvertedValue;extern __IO u16 calculated_temp;__IO u16 Current_Temp;unsigned char sec=0,min=0,hour=0;typedef struct{int tm_sec;int tm_min;int tm_hour;}rtc_time;rtc_time systmtime;__IO u16 upper_bound;__IO u16 lower_bound;//static uint8_t USART_Scanf(uint32_t value);void Time_Regulate(rtc_time *tm);unsigned int TimingDelay=0;unsigned int KEY_ON;unsigned int KEY_OFF;void Delay(u32 count){u32 i=0;for(;i<count;i++);}void LED_GPIO_Config(){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // 使能PD端口时钟GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 速度50MHz}void SysTick_Init(){if (SysTick_Config(SystemCoreClock / 1000)){while(1);}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;//封闭滴答准时器//SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//开启滴答准时器}void Delay_ms(__IO u32 nTime){TimingDelay=nTime;SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//打开while(TimingDelay != 0);}void RCC_Config(void)//设置装备摆设时钟{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);//ADC1 and GPIOCRCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);//USARTRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // 使能PD端口时钟 LED}void GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;/***Config PA.01 (ADC1)***/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOC, &GPIO_InitStructure);/***Config LED ***/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO 速度50MHz/***Config USART ***//* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure USART1 Rx (PA.10) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);}void DMA_Config(void){/* DMA channel1 configuration */DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; /*ADC??*/DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 16;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);}void ADC1_Config(void){ ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;ADC_InitStructure.ADC_ScanConvMode = ENABLE ;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel16 configuration */ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_55Cycles5);ADC_TempSensorVrefintCmd(ENABLE);ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_SoftwareStartConvCmd(ADC1, ENABLE);}void USART1_Config(void){USART_InitTypeDef USART_InitStructure;USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b; USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No ;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//吸收使能// USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//发送使能USART_Cmd(USART1,ENABLE); //启动串口}static uint8_t USART_Scanf(uint32_t value)//字符串读取函数{uint32_t index = 0;uint32_t tmp[2] = {0, 0};while (index < 2){/* Loop until RXNE = 1 */while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) ==RESET) {}tmp[index++] = (USART_ReceiveData(USART1));if ((tmp[index - 1] < 0x30) || (tmp[index -1] > 0x39)){printf("\n\r请输入有用数字 0 到 9 -->: ");index--;}}index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10);/* Checks */if (index > value){printf("\n\r请输入有用数字 0 到 %d", value);return 0xFF;}return index;}void Time_Regulate(rtc_time *tm)//时光设定函数{uint32_t Tmp_HH =0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF; uint32_t Tmp_up = 0xff,Tmp_low = 0xff;printf("\r\n 设定温度规模");printf("\r\n 输入温度上限: ");while (Tmp_up == 0xFF){Tmp_up = USART_Scanf(99);}printf("\n\r 温度上限为 %0.2d C\n\r", Tmp_up);upper_bound = Tmp_up;//-------------------printf("\r\n 输入温度下限: ");while (Tmp_low == 0xFF){Tmp_low = USART_Scanf(99);}printf("\n\r 温度下限为 %0.2d C\n\r", Tmp_low);lower_bound = Tmp_low;printf("\r\n 设准时光 ");Tmp_HH = 0xFF;printf("\r\n 设定小时: ");while (Tmp_HH == 0xFF){Tmp_HH = USART_Scanf(23);}printf("\n\r 设定小时为 %d\n\r", Tmp_HH );tm->tm_hour= Tmp_HH;Tmp_MI = 0xFF;printf("\r\n 设定分钟: ");while (Tmp_MI == 0xFF){Tmp_MI = USART_Scanf(59);}printf("\n\r 设定分钟为 %d\n\r", Tmp_MI);tm->tm_min= Tmp_MI;Tmp_SS = 0xFF;printf("\r\n 设定秒: ");while (Tmp_SS == 0xFF){Tmp_SS = USART_Scanf(59);}printf("\n\r 设定秒为 %d\n\r", Tmp_SS);tm->tm_sec= Tmp_SS;}int fputc(int ch, FILE *f)//重定向函数{USART_SendData(USART1, (unsigned char) ch);// while (!(USART1->SR & USART_FLAG_TXE));while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); return (ch);}/*****************************主函数***********************************************/int main(void){#ifdef DEBUG#endifSysTick_Init();LED_GPIO_Config();RCC_Config();GPIO_Config();DMA_Config();ADC1_Config();USART1_Config();Delay(5000);Time_Regulate(&systmtime); GPIO_SetBits(GPIOD, GPIO_Pin_8); GPIO_SetBits(GPIOD, GPIO_Pin_9); GPIO_SetBits(GPIOD, GPIO_Pin_10); GPIO_SetBits(GPIOD, GPIO_Pin_11); sec=systmtime.tm_sec;min=systmtime.tm_min;hour=systmtime.tm_hour;while(1){sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}printf("\r\n 当前时光: %d :%d :%d \r\n", hour,min,sec);printf("\r\n 当前温度: %02d C 温度上限:%02d C 温度下限:%02d C \r\n",Average_Temp,upper_bound,lower_bound);GPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GPIO_Pin_10);GPIO_SetBits(GPIOD, GPIO_Pin_11);if(((int)Current_Temp) > ((int)upper_bound)){GPIO_ResetBits(GPIOD, GPIO_Pin_8);}else if(((int)Current_Temp) < ((int)lower_bound)){GPIO_ResetBits(GPIOD, GPIO_Pin_11);}else{GPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GPIO_Pin_10);GPIO_SetBits(GPIOD, GPIO_Pin_11);}Delay_ms(1000);}}stm32f10x_it.c文件:/* Includes ------------------------------------------------------------------*/#include "stm32f10x_it.h"/* Private functions ---------------------------------------------------------*/void display(void){unsigned char ad_data,ad_value_max,ad_value_min;ad_data=Current_Temp;if(ad_sample_cnt==0){ad_value_max=ad_data;ad_value_min=ad_data;}else if(ad_data<ad_value_min){ad_value_min=ad_data;}else if(ad_data>ad_value_max){ad_value_max=ad_data;}ad_value_sum+=ad_data;ad_sample_cnt++;if(ad_sample_cnt==10){ad_value_sum-=ad_value_min;ad_value_sum-=ad_value_max;ad_value_sum/=8;calculated_temp=ad_value_sum;ad_sample_cnt=0;ad_value_min=0;ad_value_max=0;}}void SysTick_Handler(void){TimingDelay--;ADC_tempValueLocal = ADC_ConvertedValue;//printf("\n %02d \n, ADC_ConvertedValue");Current_Temp=(V25-ADC_tempValueLocal)/Avg_Slope+25;temp_sum+=Current_Temp;temp_cnt++;if(temp_cnt>=10){temp_cnt=0;temp_sum/=10;Average_Temp=temp_sum;temp_sum=0;}//printf("\r\n The current temperature = %02d C\r\n", calculated_temp); }五、课程总结与小我领会嵌入式开辟是主动化专业的重要课程之一,实际生涯中,嵌入式在运用可以说得是无处不在.是以在大学中控制嵌入式的开辟技巧是十分重要的,也是十分须要的.本次运用基于Cortex-M3内核的32位ARM处理器stm32作为主控制器,设计了一种温度测控体系.体系中,运用了ADC.DMA.温度传感器.USART.GPIO.准时器.NVIC 等资本,实践了课上所学的内容,深深领会到了运用的重要性.在课程设计的进程中,为了减小干扰的影响,数据收集后,平均算法进行温度输出.并运用串口设计了简略的交互体系,固然没有运用上位机,但也达到了比较好的后果.经由过程本次课程设计,实在阅历到了许多想象不到的艰苦,本身的一些设法主意也不敷成熟,最后照样参考了他人的解决计划,这让我深深熟悉到在嵌入式开辟这条路上,与他人交换进修是晋升本身的异常有用的方法.在设计串口设准时光的程序时,我最开端的设法主意是经由过程USART的中止进行输入字符的辨认,从而分离设准时光以及温度高低限,可是经由本身的冥思苦想照样想不出来,怎么都实现不了.无奈之下,我只好去近邻卧室的大神那边虚心求教,在参考了他的程序之后我恍然大悟,选择了在轮回之外先按次序读取字符串的办法,顺遂解决了我的问题,让我深深熟悉到了交换的重要性,在本身的设法主意不敷完美时,多多懂得些他人的算法对晋升本身是有很大帮忙的.因为之前没有完全开辟一个有较多功效体系的阅历,在本次做课程设计的进程中,走了许多的弯路,也学到许多教材上没有的常识.运用库开辟Stm32时,异常重视模块化的概念,不但是许多片上资本运用库文件来进行封装,本身在编写一些函数时也应当学会进行封装,个中又涉及到c说话许多之前没太留意到的地方,在开辟进程中实在让我吃了许多苦头,不过荣幸的是同窗的指点下,我一点点解决了那些困惑的地方,加倍深刻了懂得了一个工程的整体构造,对模块化的思惟印象深刻.这对我今后的开辟将起到伟大的感化.总之,本次的嵌入式课程设计让我收成了许多,不但仅进修到了许多教材和教室上学不到的器械,更重要的是进修到了库开辟的思惟,以及领会到了交换的重要性,同时也感激先生这一学期来的卖力讲课,严谨的答疑解惑,让我熟悉到理论常识对开辟潜移默化的感化.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统课程设计姓名:班级:学号:.目录:一.系统要求二.设计方案三.程序流程图四.软件设计五.课程总结与个人体会.一、系统要求使用STM32F103作为主控CPU设计一个温度综合测控系统,具体要求:1、使用热敏电阻或者内部集成的温度传感器检测环境温度,每0.1秒检测一次温度,对检测到的温度进行数字滤波(可以使用平均法)。
记录当前的温度值和时间。
2、使用计算机,通过串行通信获取STM32F103检测到的温度和所对应的时间。
3、使用计算机进行时间的设定。
4、使用计算机进行温度上限值和下限值的设定。
5、若超过上限值或者低于下限值,则STM32进行报警提示。
.二、设计方案本次课程设计的要求是使用STM32F103设计一个温度测控系统,这款单片机集成了很多的片上资源,功能十分强大,我使用了以下部分来完成课程设计的要求:1、STM32F103内置了3个12位A/D转换模块,最快转换时间为1us。
本次课程设计要求进行温度测定,于是使用了其中一个ADC对片上温度传感器的内部信号源进行转换。
当有多个通道需要采集信号时,可以把ADC配置为按一定的顺序来对各个通道进行扫描转换,本设计只采集一个通道的信号,所以不使用扫描转换模式。
本设计需要循环采集电压值,所以使用连续转换模式。
2、本次课程设计还使用到了DMA。
DMA是一种高速的数据传输操作,允许在外部设备和储存器之间利用系统总线直接读写数据,不需要微处理器干预。
使能ADC的DMA接口后,DMA控制器把转换值从ADC数据寄存器(ADC_DR)中转移到变量ADC_ConvertedValue中,当DMA传输完成后,在main函数中使用的ADC_ConvertedValue的内容就是ADC转换值了。
3、STM32内部的温度传感器和ADCx_IN16输入通道相连接,此通道把传感器输出的电压值转换成数字值。
STM内部的温度传感器支持的温度范围:-40到125摄氏度。
利用下列公式得出温度温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25式中V25是 VSENSE在25摄氏度时的数值(典型值为1.42V))曲线的平均斜率(典型值为4.3mV/C是温度与Avg_SlopeVSENSE利用均值法对转换后的温度进行滤波,将得到的温度通过串口输出。
.4、本设计采用了USART1作为串行通信接口,来进行时间、温度的传输,以及进行时间和温度上下限的设定。
5、当温度超过上下限时,开发板上的灯会相应亮起作为警报,使用了GPIO配置引脚。
6、时间计时使用了systick时钟,并配置其中断,由此进行一秒定时,实现时钟的实时显示。
7、时间设定部分参考了一个两位数字读取的函数,在进入主循环前设定参数,从而避免了在串口中断中输入只能一次性输入所有参数的弊端。
.三、程序流程图开始各模块初始化设定温度显示当前时间温度计时一秒是判断当前温度对应警告灯亮是否超过设定范围否警告灯全灭.四、软件设计用到的库文件:stm32f10x_adc.h,stm32f10x_dma.h,stm32f10x_flash.h,stm32f10x_gpio.h,stm32f10x_rcc.h,stm32f10x_usart.h,misc.h 自己编写的文件:main.c,stm32f10x_it.c,stm32f10x_it.hmain文件:#include stm32f10x.h#include stdarg.h#include stdio.h#define ADC1_DR_Address ((uint32_t)0x4001244C)extern __IO u16 ADC_ConvertedValue;extern __IO u16 calculated_temp;__IO u16 Current_Temp;unsigned char sec=0,min=0,hour=0;typedef struct{int tm_sec;int tm_min;int tm_hour;}rtc_time;rtc_time systmtime;__IO u16 upper_bound;.__IO u16 lower_bound;//static uint8_t USART_Scanf(uint32_t value); void Time_Regulate(rtc_time *tm);unsigned int TimingDelay=0;unsigned int KEY_ON;unsigned int KEY_OFF;void Delay(u32 count){u32 i=0;for(;i<count;i++);}void LED_GPIO_Config(){GPIO_InitTypeDef GPIO_InitStructure;// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);使能PD端口时钟=GPIO_InitStructure.GPIO_PinGPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;//LED0-->PD.8端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出//IO 速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;50MHz// 根据设定参数初始化&GPIO_InitStructure); GPIO_Init(GPIOD, GPIOB.5void SysTick_Init(){if (SysTick_Config(SystemCoreClock / 1000)).{while(1);}SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;// 关闭滴答定时器//SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//开启滴答定时器}void Delay_ms(__IO u32 nTime){TimingDelay=nTime;SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//打开while(TimingDelay != 0);}void RCC_Config(void)//配置时钟{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1RCC_APB2Periph_GPIOC, ENABLE);//ADC1 and GPIOC|RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1RCC_APB2Periph_GPIOA, ENABLE);//USARTRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // 使能PD端口时钟LED}void GPIO_Config(void){GPIO_InitTypeDef GPIO_InitStructure;/***Config PA.01 (ADC1)***/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_Init(GPIOC, &GPIO_InitStructure);/***Config LED ***/.GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出速度//IO GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 50MHz//根据设定参数初始化&GPIO_InitStructure); GPIO_Init(GPIOD, GPIOB.5/***Config USART ***//* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure USART1 Rx (PA.10) as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);}void DMA_Config(void){/* DMA channel1 configuration */DMA_InitTypeDef DMA_InitStructure;DMA_DeInit(DMA1_Channel1);DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; /*ADC??*/=DMA_InitStructure.DMA_MemoryBaseAddr(u32)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;DMA_InitStructure.DMA_BufferSize = 16;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; = DMA_InitStructure.DMA_PeripheralDataSize.DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* Enable DMA channel1 */DMA_Cmd(DMA1_Channel1, ENABLE);}void ADC1_Config(void){ ADC_InitTypeDef ADC_InitStructure;ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE ;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; =ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);/* ADC1 regular channel16 configuration */1, ADC_RegularChannelConfig(ADC1, ADC_Channel_16,ADC_SampleTime_55Cycles5);ADC_TempSensorVrefintCmd(ENABLE);ADC_DMACmd(ADC1, ENABLE);ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_SoftwareStartConvCmd(ADC1, ENABLE);.}void USART1_Config(void){USART_InitTypeDef USART_InitStructure;USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b; USART_ART_StopBits = USART_StopBits_1; USART_ART_Parity = USART_Parity_No ;USART_ART_HardwareFlowControl =USART_HardwareFlowControl_None;|USART_Mode_RxUSART_ART_Mode=USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //接收使能// USART_ITConfig(USART1,USART_IT_TXE,ENABLE); 发送使能//USART_Cmd(USART1,ENABLE); //启动串口}字符串读取函数static uint8_t USART_Scanf(uint32_t value)//{uint32_t index = 0;uint32_t tmp[2] = {0, 0};while (index < 2){/* Loop until RXNE = 1 */while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) ==RESET) {}.tmp[index++] = (USART_ReceiveData(USART1));if ((tmp[index - 1] < 0x30) || (tmp[index -1] > 0x39)){printf(\\r请输入有效数字0 到9 -->: );index--;}}index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10); /* Checks */if (index > value){printf(\\r请输入有效数字0 到%d, value);return 0xFF;}return index;}时间设定函数void Time_Regulate(rtc_time *tm)//{Tmp_HH =0xFF, Tmp_MI = 0xFF, Tmp_SS = 0xFF; uint32_t uint32_t Tmp_up = 0xff,Tmp_low = 0xff;); printf(\\n 设定温度范围: ); printf(\\n 输入温度上限while (Tmp_up == 0xFF){Tmp_up = USART_Scanf(99);}%0.2d C\n\r, Tmp_up); 温度上限为printf(\\rupper_bound = Tmp_up;.//-------------------printf(\\n 输入温度下限: );while (Tmp_low == 0xFF)Tmp_low = USART_Scanf(99);}%0.2d C\n\r, Tmp_low); printf(\\r 温度下限为lower_bound = Tmp_low;); printf(\\n 设定时间Tmp_HH = 0xFF;: ); 设定小时printf(\\nwhile (Tmp_HH == 0xFF){Tmp_HH = USART_Scanf(23);%d\n\r, Tmp_HH ); printf(\\r 设定小时为tm->tm_hour= Tmp_HH;Tmp_MI = 0xFF;: ); 设定分钟printf(\\nwhile (Tmp_MI == 0xFF).{Tmp_MI = USART_Scanf(59); }printf(\\r 设定分钟为%d\n\r, Tmp_MI);tm->tm_min= Tmp_MI;Tmp_SS = 0xFF;printf(\\n 设定秒: );while (Tmp_SS == 0xFF){Tmp_SS = USART_Scanf(59);}printf(\\r 设定秒为%d\n\r, Tmp_SS);tm->tm_sec= Tmp_SS;}int fputc(int ch, FILE *f)//重定向函数{USART_SendData(USART1, (unsigned char) ch); // while (!(USART1->SR & USART_FLAG_TXE));while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); return (ch);}/*****************************主函数***********************************************/int main(void){#ifdef DEBUG#endif.SysTick_Init();LED_GPIO_Config();RCC_Config();GPIO_Config();DMA_Config();ADC1_Config();USART1_Config();Delay(5000);Time_Regulate(&systmtime);GPIO_SetBits(GPIOD, GPIO_Pin_8); GPIO_SetBits(GPIOD, GPIO_Pin_9); GPIO_SetBits(GPIOD, GPIO_Pin_10); GPIO_SetBits(GPIOD, GPIO_Pin_11);sec=systmtime.tm_sec;min=systmtime.tm_min;hour=systmtime.tm_hour;while(1){sec++;if(sec==60){ sec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;}}}.printf(\\n 当前时间:%d :%d :%d \r\n, hour,min,sec);printf(\\n 当前温度:d C 温度上限:d C 温度下限:d C \r\n,Average_Temp,upper_bound,lower_bound);GPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GPIO_Pin_10);GPIO_SetBits(GPIOD, GPIO_Pin_11);if(((int)Current_Temp) > ((int)upper_bound)){GPIO_ResetBits(GPIOD, GPIO_Pin_8); }else if(((int)Current_Temp) < ((int)lower_bound)) {GPIO_ResetBits(GPIOD, GPIO_Pin_11);}else{GPIO_SetBits(GPIOD, GPIO_Pin_8);GPIO_SetBits(GPIOD, GPIO_Pin_9);GPIO_SetBits(GPIOD, GPIO_Pin_10);GPIO_SetBits(GPIOD, GPIO_Pin_11);}Delay_ms(1000);}}.stm32f10x_it.c文件:/*Includes------------------------------------------------------------------*/ #include stm32f10x_it.h/* Private functions---------------------------------------------------------*/void display(void){unsigned char ad_data,ad_value_max,ad_value_min;ad_data=Current_Temp;if(ad_sample_cnt==0){ad_value_max=ad_data;ad_value_min=ad_data;}else if(ad_data<ad_value_min){ad_value_min=ad_data;}else if(ad_data>ad_value_max) {ad_value_max=ad_data;}ad_value_sum+=ad_data;ad_sample_cnt++;if(ad_sample_cnt==10){ad_value_sum-=ad_value_min; ad_value_sum-=ad_value_max; ad_value_sum/=8;calculated_temp=ad_value_sum; ad_sample_cnt=0;.ad_value_min=0;ad_value_max=0;}}void SysTick_Handler(void){TimingDelay--;ADC_tempValueLocal = ADC_ConvertedValue;//printf(\d \n, ADC_ConvertedValue);Current_Temp=(V25-ADC_tempValueLocal)/Avg_Slope+25;temp_sum+=Current_Temp;temp_cnt++;if(temp_cnt>=10){temp_cnt=0;temp_sum/=10;Average_Temp=temp_sum;temp_sum=0;}//printf(\\nThecurrenttemperature=dC\r\n,calculated_temp);}.五、课程总结与个人体会嵌入式开发是自动化专业的主要课程之一,现实生活中,嵌入式在应用可以说得是无处不在。