当前位置:文档之家› 恒温箱设计报告

恒温箱设计报告

恒温箱设计报告
恒温箱设计报告

计算机控制系统设计报告

设计名称:恒温箱温度计算机控制系统设计

姓名:陈卫东

学号: 】

班级:自动化0903班

学院:信息工程学院

任课教师:聂诗良

~

基于单片机的恒温箱控制系统设计

【摘要】本课程设计是基于AT89C52单片机的恒温箱控制系统,本设计从实际应用出发选取了体积小、精度相对高的数字式温度传感元件DS18B20作为温度采集器,单片机AT89C52作为主控芯片,1602液晶显示器作为显示输出,独立按键作为键盘设置输入,并用声光报警实现对温度的实时测量与恒定控制。

【关键词】单片机;温度传感器;恒温;声光报警。

一、本课题设计要求

(1)温度采集传感器采用热电阻或热电偶,或一体化数字温度传感器DS18B20。

(2)控制灯泡亮度或发热量,采用继电器开关控制或用可控硅平滑控制。

(3)采用单片机或PLC作为控制器。

(4)采用LED或LCD或PC机的液晶显示器作为显示器,同时显示给定温度和实际温度。

(5)采用自制按键或PC机的键盘作为温度给定值输入。

(6)恒温箱实际温度达到给定值时(误差要求±1℃)需声光提示,声音时延5秒后停止。

`

(7)恒温箱最高温度≤50℃。

二、总体方案设计

系统整体框图如下图:

图1 系统结构框图

1)温度传感器

方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换,此设计方案需要A/D转换电路,增加了硬件成本而且热敏电阻的感温特性曲线并不是严格性的,会产生较大的测量误差。

方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器,而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低了硬件成本,简化系统电路。另外,数字式温度传感器还具有测量精度高,测量范围广等优点。

-

综合以上两种方案,本设计采用第二种方案,利用数字温度计DS18B20作为温度传感器。

2)显示部分

方案一:温度的显示可以用数码管,但数码管只能显示简单的数字,它有电路复杂,占用资源较多,显示信息少等缺点。

方案二:1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。显示字母和数字比较方便,控制简单,成本较低。我们设计的系统需要显示更多的信息,所以考虑显示功能更好的液晶显示,要求能显示更多的数据,增强显示信息的可读性,看起来更方便。

综合以上两种方案,本设计采用方案二,用1602液晶显示器来显示数据。

3)输出控制

方案一:采用继电器,易于控制,且实行比较简单,但强电和弱电不能很好的隔离,抗干扰能力极差。

方案二:采用光电藕合器,控制信号与输出信号可以很好的隔离,增强了系统的安全性和抗干扰能力。

$

综合以上两种方案,本设计采用光电藕合器控制负载工作。

三、硬件电路设计及工作原理

1、系统功能及工作流程介绍

根据恒温箱控制器的功能要求,并结合对51系列单片机的资源分析,即单片机软件编程自由度大,可用编程实现各种控制算法和逻辑控制。所以采用AT89C52作为电路系统的控制核心。恒温箱控制器的总体布局如图1所示。按键将设置好的温度值传给单片机,通过温度显示模块显示出来。初始温度设置好后,单片机开启输出控制模块,使电热器开始加热,同时将从数字温度传感器DS18B20测量到的温度值实时的显示出来,当加热到设定温度值时,单片机控制声光报警模块,发出声光报警,当超过设置温度关闭加热器。当自然冷却到设定温度以下时,单片机再次启动加热器,如此循环反复,以达到恒温控制的目的。系统结构框图如图1所示,系统基本硬件电路图如图2所示。

|

图2 基本硬件电路图

2、系统硬件设计 (1) DS18B20测温电路

DS18B20数字温度计是Dallas 公司生产的1-Wire 器件,即单总线器件。与传统的热敏电阻有所不同,DS18B20可直接将被测温度转化成串行数字信号,以供单片机处理,具有连线简单、微型化、低功耗、高性能、抗干扰能力强、精度高等特点。因此用它来组成一个测温系统,具有电路简单,在一根通信线上可以挂很多这样的数字温度计,十分方便。目前已被众多行业进行广泛的运用(锅炉、温控表粮库、冷库、工业现场温度监控、仪器仪表温度监控、农业大棚温度监控等)。

通过编程,DS18B20可以实现9~12位的温度读数。信息经过单线接口送入DS18B20或从DS18B20送出,因此从微处理器到DS18B20仅需连接一条信号线和地线。读、

写和执行温度变换所需的电源可以由数据线本身提供,而不需要外部

电源。

每片DS18B20在出厂时都设有唯一的产品序列号,因此多个DS18B20可以挂接于同一条单线总线上,这允许在许多不同的地方放置温度传感器,特别适合于构成多点温度测控系统

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。1-Wire总线支持一主多从式结构,硬件上需外接上拉电阻。当一方完成数据通信需要释放总线时,只需将总线置高点平即可;若需要获得总线进行通信时则要监视总线是否空闲,若空闲,则置低电平获得总线控制权。

图3 DS18B20测温电路

(2)输出控制电路

加热电路中采用MOC3023的目的是实现强电与弱电的隔离,其在电路中的工作原理是单片机根据传感器和设定开关输入的控制指令,控制电器的电源通断。BTA16是型小型塑封双向晶闸管,当电源控制电路的输出管脚送出的开关控制指令为高电平,MOC3023截止,BTA16截止,电器被关闭;当电源控制电路送出的开关控制指令为低电平,MOC3023导通,BTA16导通,电器被打开。R4是BTA16的保护电路。

图4 光耦控制输出

(3)显示电路

~

1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。显示电路采用LCD1602液晶显示,如图(7)所示,图中只画出了其相应的接口,3脚用于调节LCD1602的背光,4、5、6为LCD1602的控制口,用于控制其写入或是读出指令,7至14脚为LCD1602的数据口,将数传送到LCD1602中。

图5 LCD1602显示电路

LCD1602的特性:

+5V电压,对比度可调;

内含复位电路;

提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;

有80字节显示数据存储器DDRAM;

@

内建有160个5X7点阵的字型的字符发生器CGROM,8个可由用户自定义的5X7的字符发生器CGRAM;

基本操作时序:

读状态:输入:RS=L,RW=H,E=H;输出:DB0~DB7=状态字;

写指令:输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码;输出:无。

读数据:输入:RS=H,RW=H,E=H;输出:DB0~DB7=数据;

写数据:输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据;输出:无。

LCD1602的各种指令不再一一说明。

(4)温度越线报警电路

)

报警电路如图8所示,该电路采用一个小功率三极管Q1驱动蜂鸣器BELL,当单片机接收到超额温度信号或危险信号时,输出脚BELL输出高点平,Q1导通,致使蜂鸣器BELL得电工作,发出报警声。同时,电路中的发光二极管指示出电路的工作状态。

图5 报警电路

四、系统的应用软件设计

1、软件描述

在软件设计时,必须先弄清恒温控制系统的操作过程和工作过程。停止加热,当温度下降到下限(小于设定值)时再自动启动加热,这样不断的循环,使温度保持在设定范围之内。启动加热以后就不能再设定温加热器开始时处于停止状态,首先设定温度,显示器显示温度,温度设定后则可以启动加热。温度检测系统不

断检测并显示系统中的实时温度,当达到设定值后度,因为温度的设定可以根据实验要求改变。若要改变设定的温度,可以按设置键再重复上述过程。

根据以上对操作和工作过程的分析,程序应分为两个阶段:一是通电或复位后到启动加热,程序主要是按键设定、显示器显示设定温度;二是检测并显示系统的实时温度,并根据检测的结果控制电热器,这时系统不接收键盘的输入。因此,程序可以分为以下几个功能模块:温度设定和启动;显示;温度检测;温度控制以及报警。

(1)键盘管理模块

当通电以后,系统进入键盘管理状态,单片机只接收设定温度和启动。当检测到有键闭合时先去除抖动,这里采用软件延时的方法,延时一段时间后,再确定是否有键闭合,然后将设定好的值送入预置温度数据区,并调用温度合法检测报警程序,当设定温度超过最大值时就会报警,最后当启动键闭合时启动加热。

键盘设定:用于温度设定。共两个按键。

KEY1(): 设置温度“+”。

KEY2(): 设置温度“-”。

(2)显示模块

显示子程序的功能是将缓冲区的二进制数据先转换成3个BCD码,再将其分别存入百位、十位、个位3个显示缓冲区,送往串行口,利用单片机的P0口进行扫描,让数据动态的在1602上显示出来,可显示设置温度和测量温度。

(3)控制模块

温度控制子程序流程如图7所示,将当前温度与设定好的温度比较,当当前温度小于设定温度时,开启电热器;当当前温度大于设定温度时,关闭电热器;当二者相等时,电热器保持这一状态。

~

图6 控制模块程序流程

(4)温度报警模块

根据设计要求,当检测到当前温度值高于设定温度值时报警,报警的同时关闭电热器。为了防止误报,设置了报警允许标志,只有在允许报警的情况下,温度值高于设定温度值时才报警。

(5)主程序和中断服务程序流程

主程序采用中断嵌套方式设计,各功能模块可直接调用。主程序完成系统的初始化,温度预置及其合法性检测,预置温度的显示及定时器0设置。定时器0中断服务子程序是温度控制体系的主体,用于温度检测、控制和报警(包括启动温度转换、读入采样数据、数字滤波、越限温度报警和越限处理、输出控制脉冲等)。

图7 主程序流程图图8 中断服务程序流程图(

五、系统调试与仿真

1、硬件调试时,可先检查印制板及焊接的质量是否符合要求,有无虚焊点及线路间有无短路、断路。然后用万用表检测,检查无误后,可通电检查 LCD 液晶显示器亮度情况,一般情况下取背光电压为 4~ 即可得到满意的效果,再依次检查各部分结构安装是否牢固。

2、软件调试是在proteus编译器下进行,源程序编译及仿真调试应分段或以子程序为单位逐个进行,最后结合硬件实时调试。

子程序调试包括:

1).LCD1602显示程序;

2).延时函数子程序;

3).DS18B20读出温度子程序、温度转换命令子程序、计算温度子程序、显示数据刷新子程序。

六、设计心得

|

这次课程设计是对过去所学的知识的一次回顾与巩固,也是一次特别的实践能力。通过该次课程设计,不但培养了我们实践动手的能力,而且也学到了很多东西。在制作课程设计的这几天当中,我首次体会到了生活的艰辛,也培养了吃苦耐劳的精神,在课程设计当中,整天都与电路和程序打交道,的确是非常无聊和痛苦的,但是最终等到我发泄完后,冷静的想想,如果我现在连这一关都过不了,那么我如何的走上社会,如何的面对社会中各种各样的更加复杂更加繁琐的事情,我必须做好,不仅仅只是为了得到好的分数,也是为了我今后踏入社会打下基础。看到完成的课程设计时,我知道还有一些不足,很多地方需要更进一步的改进,但是我仍然很高兴,因为我尽心尽力的将它全部都完成了,我尽到自己最大的努力。虽然还是有很多不懂之处,但是在同学的帮助下也弄懂了不少。

【参考文献】

【1】郭天祥,新概念51单片机c语言教程,电子工业出版社,2009

【2】陈跃东,DS18B20集成温度传感器原理与应用[J],安徽教育出版社,2002(4)5-23

【3】李广弟,《单片机基础》[M],北京航空航天大学出版社,1994,1-56【4】谭浩强,C程序设计(第二版)[M],清华大学出版社,2003

【5】付家才,单片机控制工程实践技术[M],化学工业出版社,2004

附录一源程序代码

#include<>

#include""

#define uchar unsigned char

#define uint unsigned int

/

uchar i;

long int set; //设置温度

long int num;

long int DeltaValue = 0;

long int Sum = 0;

int nP = 300;

int nI =1;

long int angle = 3000;

{

int flag;

sbit lcdrs=P3^5; //数据命令选择控制

sbit lcden=P3^4; //使能信号

sbit dula=P2^6; //申明U1锁存器的锁存端

sbit wela=P2^7; //申明U2锁存器的锁存端

uchar code t0[]="set: C ";

uchar code t1[]="Act: C ";

uchar code wendu[]="09"; //利用一个温度表解决温度显示乱码

sbit key1=P3^7;

sbit key2=P3^6;

sbit DS=P2^0; //定义温度DS18B20接口,详情见原理图

sbit DEK=P2^1; // 控制脚

sbit LED=P1^0; //光

sbit bell=P2^3; //声

void delay_key(uint aa)

{

~

uint m,n;

for(m=aa;m>0;m--)

for(n=110;n>0;n--);

}

void delay(uchar z)

{

uchar x,y;

for(x=1000;x>1;x--)

!

for(y=z;y>1;y--);

}

void init_timer1()

{

TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

TH1=(65535-angle)/256; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出。

TL1=(65535-angle)%256;

EA=1; //总中断打开

]

ET1=1; //定时器T1允许中断

TR1=1; //定时器T1开始工作

}

void init_wbzd() //外部中断0

{

DEK = 1;

EA=1; //首先开启总中断

EX0=1; //开启外部中断 0

`

IT0=1; //设置成下降沿触发,0为低电平触发

}

void Get_angle(long int Expect,long int Feedback,int Kp,int Ki) {

long int temp_angle;

DeltaValue = Expect - Feedback;

Sum += DeltaValue;

temp_angle = Kp*DeltaValue + Ki*Sum;

)

if(temp_angle <= 2000) temp_angle = 2000;

if(temp_angle >= 8000) temp_angle = 8000;

angle = 10000 - temp_angle;

}

void write_com(uchar com) //写指令

{

lcdrs=0;

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_date(uchar date) //写数据

{

lcdrs=1;

-

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void init_lcd()

{

dula=0;

wela=0;

lcden=0;

//lcdrw=0;

write_com(0x38);

write_com(0x01);

write_com(0x0c);

write_com(0x06);

'

write_com(0x80);

for(i=0;i<16;i++)

{

write_date(t0[i]);

delay(0);

}

write_com(0x80+0x40);

for(i=0;i<16;i++)

{

write_date(t1[i]);

delay(0);

}

}

/*************DS18B20温度读取模块*************/

void tmpDelay(int num)//延时函数

{

while(num--) ;

}

void Init_DS18B20()//初始化ds1820

{

unsigned char x=0;

DS = 1; //DS复位

tmpDelay(8); //稍做延时

DS = 0; //单片机将DS拉低

tmpDelay(80); //精确延时大于 480us

DS = 1; //拉高总线

tmpDelay(14);

x=DS; //稍做延时后如果x=0则初始化成功 x=1则初始化失败tmpDelay(20);

}

unsigned char ReadOneChar()//读一个字节

{

unsigned char i=0;

unsigned char dat = 0;

for (i=8;i>0;i--)

{

DS = 0; // 给脉冲信号

dat>>=1;

DS = 1; // 给脉冲信号

if(DS)

dat|=0x80;

tmpDelay(4);

}

return(dat);

}

void WriteOneChar(unsigned char dat)//写一个字节

{

unsigned char i=0;

!

for (i=8; i>0; i--)

{

DS = 0;

DS = dat&0x01;

tmpDelay(5);

DS = 1;

dat>>=1;

}

"

}

unsigned int Readtemp()//读取温度

{

unsigned char a=0;

unsigned char b=0;

unsigned int t=0;

float tt=0;

Init_DS18B20();

$

WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器

a=ReadOneChar(); //连续读两个字节数据 //读低8位b=ReadOneChar(); //读高8位t=b;

t<<=8;

t=t|a; //两字节合成一个整型变量。

tt=t*; //得到真实十进制温度值,因为DS18B20可以精确到度,所以读回数据的最低位代表的是度

t= tt*10+; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

return(t);

}

/********按键设置********/

void key()

{

if(key1==0)

{

delay_key(2);

if(key1==0)

{

set=set+1;

}

}

if(key2==0)

{

delay_key(2);

if(key2==0)

{

set=set-1;

}

@

}

}

/*******液晶显示*********/

void display()

{

uint shi,ge,xiaoshu,shis,ges,xiaoshus; //这里的num,shi,ge,xiaoshu 必须用uint无符号整数来表示,用uchar字符型则显示错误

num=Readtemp();

shi=num/100;

ge=num/10%10;

xiaoshu=num%10;

shis=set/100;

ges=set/10%10;

xiaoshus=set%10;

write_com(0x80+0x40+5);

write_date(wendu[shi]);

write_com(0x80+0x40+6);

write_date(wendu[ge]);

write_com(0x80+0x40+7);

write_date(0x2e);

write_com(0x80+0x40+8);

write_date(wendu[xiaoshu]);

write_com(0x80+0x40+9);

write_date(0xa1);

write_com(0x80+5);

$

write_date(wendu[shis]);

write_com(0x80+6);

write_date(wendu[ges]);

write_com(0x80+7);

write_date(0x2e);

write_com(0x80+8);

write_date(wendu[xiaoshus]);

write_com(0x80+9);

write_date(0xa1);

}

/*********主函数*********/

void main()

{

init_lcd();

set=300;

bell=1;

(

LED=1;

flag=0;

init_timer1();

init_wbzd();

while(1)

{

display();

if(num>set)

{

flag=1;

DEK =1;

}

else if(num

{

flag=1;

DEK=0;

}

else

{

flag=0;

bell=0;

LED=0;

delay_key(500);

bell=1;

LED=1;

}

Get_angle(set,num,nP,nI);

key();

}

}

void key_scan() interrupt 0 //外部中断 0 0的优先级最高,AT89C52有6个中断{

// DEK = 1;

if(flag==0)

{

TR1 = 1; //定时器T1开

_nop_();

_nop_();

_nop_();

}

}

void Timer1() interrupt 3 using 1

{

TH1=(65535-angle)/256;

TL1=(65535-angle)%256;

DEK = 0;

_nop_();

_nop_();

_nop_();

DEK = 1;

TR1 = 0;

}

相关主题
文本预览
相关文档 最新文档