恒温箱自动控制系统设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
恒温箱自动控制系统设计
组员:
院系:
指导教师:
【摘要】
本组设计的恒温箱自动控制系统主要由中央处理器、温度传感器、半导体制冷器、键盘、显示、声光报警等部分组成。处理器采用AVR Mega128单片机,温度传感器采用DS18B20,利用半导体制冷片一面制冷一面发热的工作特性进行升降温,用LCD12864作为显示输出。温度传感器检测到温度数据传送给单片机,单片机再将温度数据与给定值进行比较,从而发出对半导体制冷器的控制信号,使温度维系在给定值附近(偏差小于±2℃),同时单片机将数据送与显示器。
【关键字】
单片机温度传感器半导体制冷器控制
一、设计方案比较
1.1总体设计方案
这里利用DS18B20芯片作为恒温箱的温度检测元件。DS18B20芯片可以直接把测量的温度值变换成单片机可以读取的标准电压信号。单片机从外部的两位十进制拨码键盘进行给定值设定,读入的数据与给定值进行比较,根据偏差的大小,采用闭环控制的方法使控制量更加精准。控制结果通过液晶显示器LCD12864予以显示。
系统整体框图如图一所示:
图一、系统整体框图
1)温度检测元件的选择:
方案一:这里所设计的是测温电路,因此可以采用热敏电阻之类的器件利用其感温效应,检测并采集出随温度变化而产生的电压或电流,进行A/D转换后送给单片机进行数据处理,从而发出控制信号。此方案需要另外设计A/D转换电路,使得温测电路比较麻烦。
方案二:上网查得温度传感器DS18B20能直接读出被测温度,并可根据实际要求通过简单的编程实现9~12位的数字值读取方式,它内部有一个结构为8字节的高速暂存RAM存储器。DS18B20芯片可以直接把测量的温度值变换成单片机可以读取的标准电压信号。与方案一比较更加简单实用,因此我们选择方案二。
2)显示方案选择:
方案一:温度的显示可以用数码管,但数码管只能显示简单的数字,它有电路复杂,占用资源较多,显示信息少等缺点。
方案二:LCD12864汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字,128个字符及64×256点阵显示RAM。可显示内容:128列×64行,多种软件功能:光标显示、画面移位、自定义字符、睡眠模式等。我们设计的系统需要显示更多的信息,所以考虑显示功能更好的液晶显示,要求能显示更多的数据,增强显示信息的可读性,看起来更方便。所以选择方案二。
LCD12864接线方法如图二所示:
图二、LCD12864接线图
3)声光报警系统
采用蜂鸣器及三色LED组成声光报警系统。制冷时LED为红色,温度达到控制要求且上下浮动在1℃以内时为绿色,升温时为黄色。温度到达给定值的同时,蜂鸣器发出报警提示音。
二、理论分析与计算
实现温度的实时显示是由计算温度子程序将 RAM 中读取值进行 BCD 码的转换运算,并进行温度值正负的判定,从DS18B20读取出的二进制值必须先转换成十进制值,才能用于字符显示。因为 DS18B20 的转换精度为 9-12 位可选的,为了提高精度采用12位。在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为温度寄存器里的二进制值乘以 0.0625,就是实际的十进制温度值。
计算温度子程序流程图如图三:
图三、温度子程序流程
三、系统硬件电路设计
首先确定系统总体结构,再逐个设计所需电路。
10×10(mm)恒温室,为是室内温度与外界隔绝好,我们采用厚泡沫板做箱体,温度传感器嵌入箱内并固定在箱内中间位置;
单片机主控电路模块;
单片机最小系统接线如图四:
图四、单片机最小系统接线图
电源电路模块,设计有5V,6V,9V,12V等不同输出电压以满足各部分电压需求;
控制制冷片工作的继电器模块;
键盘输入模块,可输入二位十进制数,输入范围为5~35,超出范围时会给出错误提示;
输出显示模块;
声光报警系统,
蜂鸣器接线图如图五:
图五、蜂鸣器接线图
程序下载电路如图六示:
图六、下载电路
四、系统软件程序设计
4.1主程序
系统主程序首先对系统进行初始化,包括设置定时器、端口;开机画面显示系统程序不断循环执行显示效果:
#include
#include
#include"12864.h"
#include"delay.h"
#include"18B20.h"
#include"AVR_128.h"
#include"key_scan.h"
#define WATERON PORTE|=0x01;
#define WATEROFF PORTE&=~0x01;
#define WIND_FREEZEON PORTE|=0x02;
#define WIND_FREEZEOFF PORTE&=~0x02;
#define HEETON PORTE|=0x04;
#define HEETOFF PORTE&=~0x04;
void main()
{
uint wendu;
uchar aa,bb,a1=0,a2=0,b1=0,b2=0,b3=0,m1=0,n1=0,a,b,c;
DDRA=0xf0;
PORTA=0xff;
DDRG=0xff;
PORTG=0xff;
DDRE=0xff;
PORTE=0xf0;
PORT_Init(); //端口初始化
Lcd_Init(); //初始化LCD
Clear_All();
TCCR1B=0X05; //1024分频
TCNT1H=0Xc2; //设定初值,定时一分钟
TCNT1L=0Xf6;
TIMSK|=BIT(2);
Write_LCD(0,1,"当前温度:");