收藏和点赞,您的关注是我创造的动力
概要
时代每时每刻都在飞速地变化着,科学技术每分每秒也在不断发展,这是你我都有目共睹的。现代社会许多专业的机器都正在或多或少地向高精尖的技术靠近,变得更加数字化、智能化。那么想要达到更加智能化的控制,对于不管是现代科技化的农业,还是更加复杂化的工业,这些与生产相关的产业来说,对于温度的调整、测量和控制都是至关重要的。另一方面,在生活水平不断提高的今天,服务业更需要运用大量的数字智能化技术从而满足人们对高质量生活的追求。高级的电子技术的运用不仅使人们的生活变得更加的便利,而且在一定程度上减少了资源、能源消耗。
从前使用的非常传统的温度测量系统,基本原理和测量方法相较于现在都是稍落后的测量技术,可想而知这其中产生的误差肯定会比现在的更加精细准确的电子测量技术要多的多,这其中一点点误差产生的蝴蝶效应会导致整个系统或设备的性能大幅降低。传统的测量技术往往产生较大的由多点测量产生的切换误差,信号调节电路产生的误差,读取误差等等。由此本论文设计出一种数字测控的智能温度测控报警系统,由DS18B20作为温度传感器,LCD液晶数码管进行显示,搭配软件编程进行调试的报警系统。这种设计运用到的传感器发展方向是更加小型化,集成化和数字化。放眼现实生活,我想到做一种带有温度测控报警系统的保温杯服务于人们。
我们这次用的单片机是STM32型号的,用到的温度传感器是DS18B20型号的,用到的温度显示装置是1602版本的LCD液晶输出装置,最后用到的报警器是蜂鸣器。用到这些装置设计出来的保温杯不仅方便读取杯中液体的温度,最重要的是可以设置温度的范围,当温度不在设定范围内时进行报警。满足了人们对水温适宜把控的要求,尤其是很好地照顾到了婴幼儿。并且操作简单,体积微小,还可以使用一条总线和两个以上的功能元件进行连接,这样更能节省电压、能源。就算是在环境比较恶劣的情况下也可进行检测,非常耐用。
一、系统总体设计
1电路总体设计
我们用到检测温度的装置是DS18B20温度传感器,一般情况下,单片机的设计电路中都是用到传感器。DS18B20温度传感器有许多优点,它既可以快速又方便地检测出温度,还可以把检测的温度转换成电信号,完全达到了我们要求的标准。
图2.1是这种保温杯的温度测控系统的电路总设计方框图。把单片机STM32当作控制装置,DS18B20当作温度检测装置,然后用LCD1602液晶显示管来显示测量后的温度值。LCD1602显示电路、DB18B20温度传感器、单片机的接口电路、振荡电路、复位电路、电源电路和警报电路组成了硬件部分的电路。
2电路总原理图
原理图如下:
图2-2保温杯温度自动控制系统电路设计总体设计方框图
在图2.2,有三个独立的键用于调整保温杯温度自动测控系统的上限和下限报警设置。图里面的蜂鸣报警电路的作用是当温度没有在设定范围内的时候发出报警。主程序在这个时候发送指令使得LED数码管就不会显示出测量的温度值。这样是对警报装置的触发范围设置一个界限值。当温度没在测定范围内时,数码管上不出现测量值,这样报警装置就被限定了触发范围。
我们还设计了一个复位电路,目的是增加手动复位,变得更容易操作了。当我们要进行程序运行调试,只需要按一下按钮就可以了,不需要重启电源键。
二、主程序流程图
软件部分设计的整个系统除了主控程序之外还有三个模块,包括温度检测模块,信息转换传递模块和输出模块。
DS18B20具有强大的温度测量能力,并且所需要的时间非常短暂,每一秒钟可以进行一次测量包括信号转换、传输结果共用的时间。图数据处理程序结束后转到主程序的流程是可以一直显示温度在数码管上,这样可以在一开始使用的阶段知道要不要对上下限做出调整。流程图如下:
图4-1键盘显示系统电路图
数码管可以将当前环境中的用户规定的温度上限和下限值输出,当检测的温度超过了规定的上限值时,会触发警报,此时D4会闪亮,然后程序下达散热器打开的指令进行降温,当温度下降直至温度值低于设置的下限温度值,报警器也会响起,此时D3灯亮,系统下达指令打开加热器进行升温。本系统可以达到智能化测控温度。
仿真电路图
如图5.1所示。
图5-1仿真电路图
三、 主要代码
主程序:
源代码:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include <intrins.h>
sbit dq = P1^5; //18b20 IO口的定义
sbit fengshan = P1^4; //风扇IO口定义
uint temperature ; //
bit flag_300ms ;
bit flag_lj_en; //按键连加使能
bit flag_lj_3_en; //按键连3次连加后使能 加的数就越大了
uchar key_time,key_value; //用做连加的中间变量
bit key_500ms ;
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P1^2; //片选信号 下降沿触发
uchar menu_1; //菜单设计的变量
uint t_high = 350,t_low = 100;
sbit relay1 = P1^6; //温度报警继电器IO口定义
sbit relay2 = P1^3; //湿度报警继电器IO口定义
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/********************************************************************
* 名称 : delay_uint()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay_uint(uint q)
{
while(q--);
}
/********************************************************************
* 名称 : write_com(uchar com)
* 功能 : 1602命令函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(25);
e=1;
delay_uint(100);
e=0;
}
/********************************************************************
* 名称 : write_data(uchar dat)
* 功能 : 1602写数据函数
* 输入 : 需要写入1602的数据
* 输出 : 无
***********************************************************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(25);
e=1;
delay_uint(100