当前位置:文档之家› 基于单片机的温度控制系统_单片机AT89C52

基于单片机的温度控制系统_单片机AT89C52

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

摘要

本设计是以单片机AT89C52为控制核心,开发了一种全数字式操作器。该控制器操作简便,控制精度高,采用LCD液晶显示,具有RS-485通信接口,并可应用于各种温度控制系统系统中。有效地提高了温度控制系统的可靠性、合理性及其稳定性。

本系统包括硬件和软件两个部分,硬件设计中包括六个部分,分别为主控部分、RS485通讯电路、LCD显示、看门狗和电源部分以及传感器采集放大电路。设计时,考虑到系统的可靠性及其性价比,在未扩展外部存储的情况下,只采用了一片AT89C51完成了整个系统的所有功能。软件部分则以C语言为编程语言,编写相应的软件程序,使本操作器在温度控制中作为控制单元具有液晶显示、按键操作、温度指示、RS-485总线结构等功能。能够方便实现对温度参数的设定和控制。

关键词:控制系统,温度测量,单片机,RS-485,C语言。

The Design of Temperature Control System Based on MCU

ABSTRACT

This design with Micro controller the machine AT89C51 for control core, has developed a kind of total character style manipulator. This manipulator operation is simple, has the higher control precision, uses the LCD liquid crystal display, includes RS-485 communication, and may apply to in kinds of temperature system. Effectively enhanced the transmission control system reliability, the rationality and it’s the stability. This system is consisted of two parts, both the hardware and the software. The hardware design includes six parts, controller, RS485 communication, the LCD demonstration, watchdog and power and amplify (电路). Considered when system reliability and natural price compared to, design, in has not expanded exterior memory in the situation, only used piece of AT89C51 to complete overall system all functions. The new manipulator has LCD display, keyscan operation, automatic parameter memorization, RS-485 bus and etc. At the part of software , the C language has also been presented and makes completely programmer .It can carry out to control the temperature of system and set parameter.

KEY WORDS: microcontroller,temperature,AT89C51, C language, RS-485.

目录

摘要........................................................................................................ 错误!未定义书签。ABSTRACT ............................................................................................. 错误!未定义书签。

1 绪论...................................................................................................... 错误!未定义书签。

1.1 引言............................................................................................ 错误!未定义书签。

1.2 设计分析.................................................................................... 错误!未定义书签。

1.2.1 模拟式.............................................................................. 错误!未定义书签。

1.2.2 模拟式与数字式混合...................................................... 错误!未定义书签。

1.2.3 全数字式.......................................................................... 错误!未定义书签。

2 基础知识.............................................................................................. 错误!未定义书签。

2.1 纸机传动的要求........................................................................ 错误!未定义书签。

2.2 AT89C51单片机简介................................................................ 错误!未定义书签。

2.2.1 MCS-51单片机结构及组成............................................ 错误!未定义书签。

2.2.2 AT89C51引脚功能 .......................................................... 错误!未定义书签。

2.3 键盘及其接口技术.................................................................... 错误!未定义书签。

2.3.1 键盘输入的特点.............................................................. 错误!未定义书签。

2.3.2 按键的确认...................................................................... 错误!未定义书签。

2.3.3 按键开关的抖动问题...................................................... 错误!未定义书签。

2.3.4 键盘与单片机的连接...................................................... 错误!未定义书签。

2.3.5 矩阵式键盘接口技术...................................................... 错误!未定义书签。

2.4 LCD液晶简介............................................................................ 错误!未定义书签。

2.4.1 LCD概述.......................................................................... 错误!未定义书签。

2.4.2 LCD发展史...................................................................... 错误!未定义书签。

2.4.3 点阵式LCD行列驱动芯片RT12232F ......................... 错误!未定义书签。

2.5 现场总线技术简介.................................................................... 错误!未定义书签。

2.5.1 SN137芯片介绍 .............................................................. 错误!未定义书签。

2.5.2 RS-485通信线路 ............................................................. 错误!未定义书签。

3 系统硬件原理设计与分析.................................................................. 错误!未定义书签。

3.1 硬件原理分析............................................................................ 错误!未定义书签。

3.2 硬件系统设计............................................................................ 错误!未定义书签。

3.2.1 系统电路结构原理图...................................................... 错误!未定义书签。

3.2.2 液晶显示部分电路.......................................................... 错误!未定义书签。

3.2.3 按键部分电路.................................................................. 错误!未定义书签。

3.2.4 通信接口部分电路.......................................................... 错误!未定义书签。

3.2.5 看门狗部分电路.............................................................. 错误!未定义书签。

3.2.6 电源模块电路.................................................................. 错误!未定义书签。

3.3 操作器工作原理........................................................................ 错误!未定义书签。

4 全数字操作器软件设计...................................................................... 错误!未定义书签。

4.1 主程序部分................................................................................ 错误!未定义书签。

4.2 初始化部分................................................................................ 错误!未定义书签。

4.2.1 工作原理.......................................................................... 错误!未定义书签。

4.2.2 程序部分.......................................................................... 错误!未定义书签。

4.3 看门狗程序部分........................................................................ 错误!未定义书签。

4.3.1 工作原理.......................................................................... 错误!未定义书签。

4.3.2 程序部分.......................................................................... 错误!未定义书签。

4.4 液晶显示部分............................................................................ 错误!未定义书签。

4.4.1 程序初始化...................................................................... 错误!未定义书签。

4.4.2 简要说明.......................................................................... 错误!未定义书签。

4.5 其他部分子程序........................................................................ 错误!未定义书签。

4.5.1 乘法子程序...................................................................... 错误!未定义书签。

4.5.2 除法子程序...................................................................... 错误!未定义书签。

4.5.3 BCD 二进制转十进制子程序 ........................................ 错误!未定义书签。

4.5.4 DCB 十进制转二进制子程序 ........................................ 错误!未定义书签。参考文献.. (23)

附录 (24)

引言

现今,随着计算机的广泛应用, 单片机的应用正在不断地走向深入。在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及具体应用对象特点的软件结合,以作完善。

在温度控制系统中,温度作为被控量,是表征物体冷热程度的物理量,温度测量则是工农业生产过程中一个很重要而普遍的参数。温度的测量及控制对保证产品质量、提高生产效率、节约能源、生产安全、促进国民经济的发展起到非常重要的作用。由于温度测量的普遍性,温度传感器的数量在各种传感器中居首位。而且随着科学技术和生产的不断发展,温度传感器的种类还是在不断增加丰富来满足生产生活中的需要。

在单片机温度测量系统中,关键是对温度的测量、保持和控制。温度是工业对象中主要的被控参数之一。在单片机温度控制系统中,通过传感器将外界模拟信号进行采集,并通过运放电路进行放大,然后经A/D转换器将模拟量转化为数字量送到单片机然后通过汇编语言或C语言编程进行软件设计,进而控制执行器达到控制温度的目的。在控制系统中,单片机是核心器件,外加按键对系统参数设置,LCD液晶显示用于显示控制系统参数。还有单片机的外围电路,包括看门狗和RS485通讯,用于计算机和单片机之间信息传输。

温度控制在单片机基础上的技术已经完善,在工业领域以及医疗等方面具有广泛的应用。传感器技术和单片机技术等不断发展,为智能温度测控系统精度的提高和稳定性改善等提供了条件。本次的课程设计是一种基于单片机的温度闭环控制装置,通过硬件、软件以及对机内数字PID参数的设置,可以对不同受控对象的不同温度进行高精度控制。

一、系统参数要求:

1.1温度参数:

要求温度控制为(学号+50)℃,在本方案中标准温度为66℃; 1.2外设口地址:

以(学号+30)H 为起始地址,本方案中以66H 为起始地址,同时每增加一个外设,口地址+1。

二、系统方案设计:

2.1 方案一:基于A/D 转换的温度控制系统设计方案: 2.1.1控制系统连接图:

2.1.2控制系统硬件结构图:

2.2 方案二:基于DS18B20的温度控制系统设计方案: 2.1.1控制系统连接图:

2.1.2控制系统硬件结构图:

显示单 片 机

按键

A/D SSR

电 热 壶

放大电路

2.3 控制系统硬件电路图

三、控制算法:

3.1 Bang-Bang算法:

Bang-Bang算法又称为时间最优控制。

在本设计中Bang-Bang算法是指通过控制晶闸管关断的占空比为100%,即就是通过全功率加热来用最短的时间使水的温度升高到接近所需标准值,一般为低于标准值15℃左右。Bang-Bang算法的优点除了可以节约控制时间,提高控制系统的效率,同时也可以使控制系统的性能指标更加良好。

3.2 纯比例算法:

在经过Bang-Bang算法使水温快速升高到50℃左右后,就不能再继续用Bang-Bang算法了,这是为了防止因温度过快超过标准温度,要想实现温度恒定所需要的各种时间就会增多,同时也浪费能源,提高成本。

为了能够更好的控制温度的变化,我们在48℃~53℃这个温度范围内采取纯比例算法,即直接将实际温度和标准温度的差值比例放大后来改变晶闸管的占空比,占空比的大小依据加热装置和外界环境条件而定,需要实际测取数据来进行计算,最后通过改变加热装置的平均加热功率来控制温度升高的速率。

3.3 PID算法:

在温度在53℃~63℃范围内时,我们应采用PID算法。

PID算法为比例,积分,微分同时作用,原因是因为适应性强,鲁棒性强,抗干扰能力强。具体来说,比例的作用是为了快速响应,积分的作用是为了减少稳态误差,微分的作用是为了克服被控对象的滞后,消除高频干扰。

本次设计PID控制为增量式PID 控制公式:

Datau(k) = Kc*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2*e(k-1)+e(k-2)],其中e(k),e(k-1),e(k-2)分别为偏差,Datau(k) 为控制电压。

PID参数的确定,需要根据实际系统不同的元素来决定,具体方法是先整定P参数,实现快速响应,并且稳态误差不是过大,基本满足4:1比例;然后是整定I参数,在保证快速响应的同时使稳态误差尽可能小;最后是D参数,消弱滞后带来的影响,实现即时响应。综合微调各参数使温度变化实现“稳”“准”“快”。

四、软件设计:

软件是整个控制系统的核心,也是决定系统最终能否实现预期指标的重要环节。控制系统由单片机为主,外加一些必要的外围设备。所以软件设计也分单片机延时、键盘扫描、液晶显示、温度控制、传感器等部分子程序构成。

4.1 单片机延时子程序

* 延时程序 *

#ifndef Delay

#define Delay

#define uint unsigned int

#define uchar unsigned char

void delayl(uint n) //长延时n毫秒

{

uint i,j;

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

for(j=114;j>0;j--);

}

void delays(uchar i)//短延时

{

while(i--);

}

#endif

4.2 键盘扫描

* 键盘扫描程序 * #ifndef KeyScan

#define KeyScan

#include

#include"Delay.h"

int SetValue; //定义温度设定值

int keyscan()

{

uchar temp; //定义按键

P1=0xff;

temp=P1;

if(P1!=0xff) //判断键是否被按下

{

delayl(10); //延时,已达到消抖的目的

P1=0xff;

temp=P1;

if(temp!=0xff) //再次判断,确定键被按下

{

temp=P1&0xff;

switch(temp) //按键处理

{

case 0xf7: SetValue += 1; break; //+0.1度

case 0xef: SetValue -= 1; break; //-0.1度

case 0xfe: SetValue += 100; break; //+1度

case 0xfd: SetValue += 10; break; //-1度

case 0xfb: SetValue -= 10; break; //+10度

case 0xdf: SetValue -= 100; break; //-10度

default: ; break;

}

}

}

return SetValue;

}

#endif

4.3 液晶显示

LCD1602驱动程序

#ifndef LCD1602

#define LCD1602

#include"Delay.h"

/*********端口定义*****************/

sbit ledrs=P2^5; //读写控制字,数据/命令,H/L

sbit leden=P2^3; //使能端控制字,高有效

sbit ledrw=P2^4; //读/写,H/L,1=读,0=写,

uchar buffer[3];

void write_com(uchar com)

{

ledrw=0;

ledrs=0;

P0=com;

delays(200);

leden=1;

delays(200);

leden=0;

}

void write_data(uchar date)

{

ledrw=0;

ledrs=1;

P0=date; //准备数据

delays(200);

leden=1; //激活LCD(Enabled)delays(200);

leden=0;

}

void LCD_init() //初始化LCD

{

leden=0;

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

}

void setPosition(uchar x,uchar y)

{

uchar pos;

switch(x%2)

{

case 1:pos=0x80+y;break; //第一行

case 0:pos=0xc0+y;break; //第二行

}

write_com(pos); //写入定位命令

}

void printc(uchar a) //写入一个字符

{

write_data(a);

}

void prints(uchar * str) //写入字符串

{

uchar i = 0;

while(str[i] != '\0')

{

write_data(str[i++]); //写一个字符,指向下一个

}

}

void IntToStr(uint t, uchar *str, uchar n)

{

uchar a[5]; char i, j; //取得整数值到数组

a[0]=t/100; //百位

a[1]=(t/10)%10; //十位

a[2]=t%10; //个位

for(i=0; i<3; i++) //转成ASCII码 +32 {

a[i]=a[i]+'0';

}

for(i=0; a[i]=='0' && i<=3; i++);

for(j=3-n; j

{

*str=' '; str++;

}

for(; i<3; i++)

{

*str=a[i]; str++;

} //加入有效的数字

*str='\0';

}

#endif

4.4 温度控制

/****************************************************************************** ***

* 标题;基于单片机的温度控制实验

*

*

*

* 描述:1.用温度传感器DS18B20测得温度值;

*

* 2.用LCD1602液晶显示器作为人机界面,其可以显示当前温度值,设定温度值等;*

* 3.使用PID控制算法,控制水温,从而达到恒温。

*

*

*

* 目的:1.学会DS18B20的驱动;

*

* 2.学会LCD1602的驱动;

*

* 3.理解PID控制原理;

*

******************************************************************************* **/

#include //包含51单片机头文件

#include //包含数学计算头文件

#include"Delay.h" //包含用户头文件delay.h,作用:延时

#include"LCD1602.h" //包含用户头文件LCD_1602.h,作用:驱动1602液晶显示器显示

#include"DS18B20.h" //包含用户头文件ds18b20.h,作用:驱动温度传感器测量当前温度

#include"KeyScan.h" //包含用户头文件Keyscan.h,作用:键盘扫描,获取按键值

#define uchar unsigned char //用uchar代替unsigned char

#define uint unsigned int //用uint代替unsigned int

sbit kaitong = P3^3; //定义电热杯开通关断引脚

int PrevError = 0; //定义上上一次偏差值

int LastError = 0; //定义上一次偏差值

int Error = 0; //定义当前偏差值

int PError,IError,DError; //中间变量

int LastValue; //上一次的输出值

int NowValue; //本次的输出值

int Full,Part; //加热占空比调节参数

int SetValue=600; //初始化温度值60度

float Proportion = 0.5; //定义比例参数

float Integral = 0.1; //定义积分参数

float Derivative = 5; //定义微分参数

/******************************************************************************

********

*名称: 增量式PID计算函数

*

*

*

*描述: 增量式PID表达式如下

*

* datau(k) = Kc*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2*e(k-1)+e(k-2)] *

* 或datau(k)=Kc*{e(t)-e(k-1)}+Kc*T*e(k)/Ti+Kd*Td*[e(t)-2*e(t-1)+e(t-2)]/T * *

*

*

*说明:e(t)为设定值与实际值之差,

*

* Kc为比例系数

*

* Ki = Kc*T/Ti积分系数

*

* Kd = Kc*Td/T微分系数

*

* T为采样周期

*

* Ti为积分时间

*

* Td为微分时间

*

******************************************************************************* *******/

int PIDCalc(int NextValue) //增量式PID计算部分

{

PrevError = LastError; //将上一次偏差LastError赋给上上一次偏差PrevError

LastError = Error; //将当前偏差Error赋给上一次偏差LastError

Error = keyscan() - NextValue; //将新的偏差赋给当前偏差Error 偏差是绝对值,有错

LastValue = NowValue; //将本次输出值赋给上一次输出值

if(Error >=100)

{

return(20);

}

else if((Error<100)&&(Error>=50))

{

return(14);

}

else if((Error<50)&&(Error>=20))

{

return(10);

}

else if((Error<20)&&(Error>0))

{

PError = Proportion *(Error - LastError);

IError = Integral *Error;

DError = Derivative *(Error - 2 * LastError + PrevError);

NowValue =PError + IError + DError + LastValue;

return NowValue; //计算PID控制值

}

else

{

PError = Proportion *(Error - LastError);

IError = Integral *Error;

DError = Derivative *(Error - 2 * LastError + PrevError);

NowValue =PError + IError + DError + LastValue;

return 0;

}

}

/****************************************************************

* *

* 主函数*

* *

****************************************************************/

void main()

{

uint ccc=100;

LCD_init(); //初始化LCD

setPosition(1,2); //从第1行第2个字符位开始显示“Welcom to”

prints("Welcom to");

setPosition(2,5); //从第1行第2个字符位开始显示“SUST”

prints("SUST");

delayl(1000); //延时,使欢迎界面在屏幕上停留片刻write_com(0x01); //初始化LCD

while(1)

{

if(ccc==0)

{

Part = PIDCalc(readtemp());

ccc=100;

}

for(;ccc>0;ccc--)

{

Full++; //加1,相当于dd = dd + 1

if(Full > 20) //如果dd大于20,则复位为1

{

Full = 1;

}

if(Full <= Part) //判断PID计算值,如果Full小于等于该值,则开通发热管;否则关断

kaitong = 0;

else

kaitong = 1;

/*从第2行第2字符位开始显示设定温度值*/

setPosition(1,0);

IntToStr(keyscan(),buffer,3); //处理温度值,以便显示

prints("S:"); //显示"SET:"

printc(buffer[0]); //显示十位

printc(buffer[1]); //显示个位

printc('.'); //显示小数点

printc(buffer[2]); //显示十分位

printc(0xDF); //显示摄氏度符号右上角的小圆圈

printc('C'); //显示摄氏度符号“C”

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