基于S08的恒温水箱控制系统设计.docx
《基于S08的恒温水箱控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于S08的恒温水箱控制系统设计.docx(22页珍藏版)》请在冰点文库上搜索。
基于S08的恒温水箱控制系统设计
微控制器系统原理
设计报告
题目:
基于S08的恒温水箱控制系统设计
专业班级:
自动化
姓名:
学号:
********
*******
1概述
1.1设计任务
温度是工业生活中最常见的被控参数,恒温控制系统被广泛应用于加热炉、反应炉、浴霸、微波炉、电热水器、烘干箱等,工业和生活设施中。
本设计意在完成一个以微控制器S08AW60为核心部件,带键盘设定温度范围,能够显示实时温度和具有越限报警功能的恒温水箱控制系统。
1.2基本功能
本系统设计本着简单、经济、实用的思想,尽量简化电路设计,用最简单的电路布线和选用经济实用的器件来达到设计要求。
恒温水箱控制系统能够实现的基本功能:
(1)能够利用按键设定温度上限和温度下限;
(2)测温范围为0-100摄氏度;
(3)能够显示设定温度值;
(4)能对恒温水箱系统的温度进行实时显示;
(3)当温度超越设定的温度范围时,能够实现声光报警。
2方案设计
2.1系统框图
根据设计方案要求:
初始时,能够通过键盘设定温度范围,并能够显示设定值;数值输入完毕后,按下启动键,显示电路要能够显示恒温水箱系统的实时温度;温度超越设定的温度范围时,能够实现声光报警提醒温度超限;把本设计初步分为以下几个模块,系统框图如图2-1所示:
图2-1系统框图
2.2方案选取
由上述系统框图可知,恒温水箱控制系统由:
温度检测模块、核心控制模块、键盘模块、显示模块、升温模块、降温模块报警等几部分构成。
以下将对各模块做具体分析、设计。
2.2.1温度传感器的选择
方案
(一):
采用热敏电阻,可满足40~90℃的测量范围,但热敏电阻精度、重复性、可靠性都比较差,其测量温度范围相对较小,稳定性较差,不能满足本系统温度控制的范围要求。
方案
(二):
采用温度传感器铂电阻Pt1000。
铂热电阻的物理化学性能在高温和氧化性介质中很稳定,它能用作工业测温元件,且此元件线性较好。
在0—100摄氏度时,最大非线性偏差小于0.5摄氏度。
铂热电阻与温度关系是,Rt=R0(1+At+Bt*t);其中Rt是温度为t摄氏度时的电阻;R0是温度为0摄氏度时的电阻;t为任意温度值,A,B为温度系数。
方案(三):
采用模拟温度传感器AD590K,AD590K具有较高精度和重复性(重复性优于0.1℃),其良好的非线性可以保证优于±0.1℃的测量精度。
但其测量的值需要经过运算放大、模数转换再传给单片机,硬件电路较复杂,调试也会相对困难,所以本系统不宜采用此法。
方案(四):
采用数字温度传感器DS18B20,DS18B20提供九位温度读数,测量范围-55℃~125℃,采用独特1-WIRE总线协议,只需一根口线即实现与MCU的双向通讯,具有连接简单,高精度,高可靠性等特点。
并且,DS18B20支持一主多从,若想实现多点测温,可方便扩展。
综合以上四种方案,本设计采用方案(四),利用数字温度计DS18B20作为温度传感器。
2.2.2键盘模块
方案
(一):
利用独立按键控制,设定温度预定值范围,控制系统启停。
方案
(二):
利用矩阵键盘控制,设定温度预定值范围,控制系统启停。
由于本设计需要设定温度范围和控制系统启停,所需要的按键较多,若采用方案一所占单片机I/O资源较多,而矩阵键盘按键多,占用I/O口少很好的满足了设计与需求。
所以选定方案
(二)使用4x4的矩阵键盘。
2.2.3显示模块
方案
(一):
利用LCD显示屏显示温度设定值和恒温水箱系统的实时温度。
方案
(二):
利用七段数码管显示温度设定值和恒温水箱系统的实时温度。
考虑到设计需要显示的信息量小,亮度要求高,而LCD虽然可显示内容信息量大,但是可视偏转角度过小、亮度和对比度低、而且容易“坏点”寿命有限等;数码管显示无闪烁,亮度高,软件控制比较容易,功耗小耐冲击,长寿命等优点。
最终选用方案
(二)数码管作为显示工具。
2.2.4其它模块
此外,在考虑到价格低廉、使用方便、电路简单等要求,温度超限报警选用蜂鸣器和发光二极管;升温模块采用继电器驱动电炉丝工作;降温模块采用继电器驱动电风扇对水箱吹气散热;控制模块选用S08AW60作为恒温水箱控制系统的控制核心。
2.3总体方案设计
通过上述讨论我们可以看出,本设计恒温水箱控制系统能够很好的满足设计要求。
方案总体构架如图2-2所示:
图2-2恒温水箱控制系统结构框图
3主要电路设计
3.1温度测量模块
根据DS18B20中文资料典型测温电路,设计电路如下:
图3-1温度测量模块电路
(1)GND为电源地;
(2)DQ为数字信号输入/输出端;
(3)VDD为外接供电电源输入端;
DS18B20与AT89C51通信分析:
当程序运行时,首先将DS18B20初始化,设置好要求的初始值,再调用温度读取子程序读取温度测量值,当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。
第九个字节是冗余检验字节。
DS18B20暂存寄存器分布寄存器内容字节地址温度值低位0温度值高位1高温限值TH2低温限值TL3配置寄存器4保留5保留6保留7CRC检验8
根据ROM指令表指令约定代码功能读ROM33H读DS1820ROM中的编码(即64位地址)符合ROM55H发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS1820使之作出响应,为下一步对该DS1820的读写作准备。
搜索ROM0F0H用于确定挂接在同一总线上DS1820的个数和识别64位ROM地址。
为操作各器件作好准备。
跳过ROM0CCH忽略64位ROM地址,直接向DS1820发温度变换命令。
适用于单片工作。
告警搜索命令0ECH执行后只有温度超过设定值上限或下限的片子才做出响应。
根据RAM指令表指令约定代码功能温度变换44H启动DS1820进行温度转换,转换时最长为500ms(典型为200ms)。
结果存入内部9字节RAM中。
读暂存器0BEH内部RAM中9字节的内容写暂存器4EH发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,是传送两字节的数据。
复制暂存器48H将RAM中第3、4字节的内容复制到EEPROM中。
重调EEPROM0B8H将EEPROM中内容恢复到RAM中的第3、4字节。
读供电方式0B4H读DS1820的供电模式。
寄生供电时DS1820发送“0”,外接电源供电DS1820发送“1”。
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。
根据上述工作编写相关子程序:
1.读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
2温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
3计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。
将以上子程序或单独调用或加入初始化中优化程序布局。
温度数据的计算处理方法:
从DS18B20读取出的二进制值必须先转换成十进制值,才能用于字符的显示。
因为DS18B20的转换精度为9~12位可选项的,为了提高精度采用12位。
在采用12位转换精度时,温度寄存器里的值是以0.0625为步进的,即温度值为温度寄存器里的二进制值乘以0.625,就是实际的二进制温度值。
一个十进制值和二进制值之间有很明显的关系,就是把二进制的高字节的低半字节和低字节的低半字节化成十进制后,就是温度值的小数部分。
小数部分因为是半个字节,所以二进制值范围是0~F,转换成十进制小数值就是0。
0625的倍数(0~15)。
采用1位显示小数,可以精确到0.1℃。
3.2显示模块
本设计采用LED数码管进行显示是因为LED数码管具有以下几个优点:
(1)能在低电压、小电流条件下驱动发光,能与CMOS、ITL电路兼容。
(2)发光响应时间极短(<0.1μs),高频特性好,单色性好,亮度高。
(3)体积小,重量轻,抗冲击性能好。
数码管有共阴极和共阳极两种类型,为位选端主要进行位控制,断选端则是进行字符控制,数码管有静态显示和动态显示两种方法,说明如下:
(1)静态显示驱动:
静态驱动也称直流驱动。
静态驱动是指每个数码管的每一个段码都由一个单片机的I/O进行驱动,或者使用如BCD码二—十进位器进行驱动。
静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O多,如驱动5个数码管静态显示则需要5×8=40根I/O来驱动。
故实际应用时必须增加驱动器进行驱动,增加了硬体电路的复杂性。
(2)动态显示驱动:
数码管动态显示是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a、b、c、d、e、f、g、dp"的同名端连在一起,另外为每个数码管的公共极COM增加位元选通控制电路,位元选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位元选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位元就显示出字形,没有选通的数码管就不会亮。
透过分时轮流控制各个LED数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位元数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极体的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示资料,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O口,而且功耗更低。
由本设计测温范围0-100摄氏度,我们采用3位共阴极数码管作为显示部件。
数码管显示部分电路图3-2所示:
图3-2数码管显示电路
3.3键盘电路
由于本设计需要设定温度范围还要控制恒温水箱系统启停,所需要的按键较多,若采用方案一所占单片机I/O资源较多,而矩阵键盘按键多,占用I/O口少很好的满足了设计与需求。
矩阵键盘在系统中原理图如图所示:
图3-3阵键盘原理图
3.4升温、降温控制电路
利用电磁继电器控制电炉丝加热和风扇吹风散热。
图3-4电磁继电器控制电路
3.5源电路
S08AW60控制的恒温水箱控制系统,正常工作需要5V电压供电,因此我们设计了电源电路为单片机工作供电。
如下图3-5电源的电路。
在这个电路中采用了三端集成稳压芯片7805,来为单片机提供稳定的5V的直流电压。
图3-5电源电路图
4软件设计
系统软件设计主要包括温度检测程序、数码管显示程序,键盘扫描程序。
4.1键盘扫描程序设计
矩阵键盘工作是利用键盘扫描,依次检测按键是否按下。
首先对某一行赋低电平,其余行赋值高电平,然后分别扫描各列是否出现低电平,若无退出扫描,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
断闭合键所在的位置是通过读键盘行取列值,与预设值比对确定的。
键盘扫描流程如图4-1示:
图4-1盘扫描流程图
4.2数码管显示程序设计
本设计数码管采用动态扫描方式,通过单片机引脚分别送出相应位选码,选通相应数码管,再用单片机输出相应段选码,,点亮选中的数码管,并延时1ms;以此为原理第二个、第三个数码管依次被点亮,再循环此过程。
数码管显示流程如图4-2所示:
图4-2数码管显示流程图
4.3温度检测程序设计
图4-3温度检测程序流程图
4.5系统总体程序设计
图4-54软件设计总流程图
附录A系统原理图
附录B源程序清单
**MCU:
MC9S08AW60
**调试环境:
CodeWarrior6.1
**程序员:
#include
#include"derivative.h"
//定义全局变量
unsignedchari=0,temp=0,num=0;
unsignedchara=0,b=0,c=0,d=0,e=0,f=0;
unsignedchart1=0,t2=0;
unsignedcharT;//DS18B20返回温度值
//存放显示段码
constunsignedcharDisp_Value[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//延时程序
voiddelay(unsignedcharcount)
{
for(i=0;i{
__RESET_WATCHDOG();
}
}
//键盘扫描函数
unsignedcharkeyscan()
{
//检测第一行是否有键按下
PTDD=0xfe;
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(10);
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=PTDD;
switch(temp)
{
case0xee:
num=1;
break;
case0xde:
num=2;
break;
case0xbe:
num=3;
break;
case0x7e:
num=4;
break;
}
while(temp!
=0xf0)//松手检测
{
temp=PTDD;
temp=temp&0xf0;
}
}
}
//检测第二行是否有键按下
PTDD=0xfd;
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(10);
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=PTDD;
switch(temp)
{
case0xed:
num=5;
break;
case0xdd:
num=6;
break;
case0xbd:
num=7;
break;
case0x7d:
num=8;
break;
}
while(temp!
=0xf0)
{
temp=PTDD;
temp=temp&0xf0;
}
}
}
//检测第三行是否有键按下
PTDD=0xfb;
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(10);
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=PTDD;
switch(temp)
{
case0xeb:
num=9;
break;
case0xdb:
num=10;
break;
case0xbb:
num=11;
break;
case0x7b:
num=12;
break;
}
while(temp!
=0xf0)
{
temp=PTDD;
temp=temp&0xf0;
}
}
}
//检测第四行是否有键按下
PTDD=0xf7;
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(10);
temp=PTDD;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=PTDD;
switch(temp)
{
case0xe7:
num=13;
break;
case0xd7:
num=14;
break;
case0xb7:
num=15;
break;
case0x77:
num=16;
break;
}
while(temp!
=0xf0)
{
temp=PTDD;
temp=temp&0xf0;
}
}
}
returnnum;
}
//数码管显示函数
display(unsignedcharbai,unsignedcharshi,unsignedcharge)
{
//显示最高位
PTAD=DispValue[bai];
PTBD=0xfe;
delay(10);
//显示第二位
PTAD=DispValue[shi];
PTBD=0xfd;
delay(10);
//显示第三位
PTAD=DispValue[ge];
PTBD=0xfb;
delay(10);
}
unsignedcharDS18B20()//DS18B20程序由于不是自己编写在此省略
//主函数
voidmain(void)
{
//初始化
PTADD=0xFF;/*PTA口设置为输出*/
PTBDD=0xFF;/*PTB口设置为输出*/
PTCDD=0xF0;/*PTC口高四位设置为输出,低四位设置为输入*/
PTCPE=0x0F;/*PTC设置为内部上拉*/
PTEDD=0xEF;/*PTE口低四位设置为输出,第五位设置为输入*/
//设定温度上、下限
num=keyscan();
while(num!
=16)num=keyscan();//等待设定温度下限开始按键按下
//设定温度下限
a=keyscan();
b=keyscan();
c=keyscan();
display(a,b,c);//显示设定值
t1=a*100+b*10+c;
num=keyscan();
while(num!
=15)num=keyscan();////等待设定温度上限开始按键按下
//设定温度下限
d=keyscan();
e=keyscan();
f=keyscan();
display(d,e,f);//显示设定值
t2=d*100+e*10+f;
while
(1)
{
T=DS18B20();//水箱当前温度测量
display(T/100,T/10-10*T/100,T%10);//水箱当前温度显示
if(T{
PTE0=0;//发光二极管亮
PTE1=1;//蜂鸣器报警
PTE2=1;//继电器吸合,电炉丝工作对水箱加热
}
elseif(T>t2)
{
PTE0=0;//发光二极管亮
PTE1=1;//蜂鸣器报警
PTE3=1;//继电器吸合,电风扇工作对水箱吹风制冷
}
__RESET_WATCHDOG();
}
}