基于51单片机的温度控制系统说明书课程设计说明书.docx
《基于51单片机的温度控制系统说明书课程设计说明书.docx》由会员分享,可在线阅读,更多相关《基于51单片机的温度控制系统说明书课程设计说明书.docx(23页珍藏版)》请在冰豆网上搜索。
基于51单片机的温度控制系统说明书课程设计说明书
中北大学
课程设计说明书
学生姓名:
学号:
学院:
机械与动力工程学院
专业:
机械电子工程
题目:
基于51单片机的温度控制系统设计
指导教师:
职称:
讲师
2015年1月19日
目录
第1章绪论2
1.1题目背景2
1.2题目简介2
第2章系统总体设计及方案3
2.1单片机的介绍3
2.2系统功能的确定3
2.3温度传感器DS18B20的介绍3
2.3.1DS18B20的内部结构4
2.3.2DS18B20的引脚介绍6
2.4人机交互与串口通信6
第3章硬件设计8
3.1系统结构框图8
3.2人机交互与串口通信单元设计9
3.2.1键盘输入电路9
3.2.2串口通信电路9
3.2.3LED七段数码动态显示电路10
3.2.4控制执行单元设计11
第4章软件设计12
4.1设计思路、程序代码12
结束语26
参考文献26
第1章绪论
1.1题目背景
不论是对于工业生产还是对于人们的日常生活,温度的变化都会对其产生一定程度的影响。
所以,适时和恰当的温度控制对生产生活具有非常重要的作用。
在过去,对温度的控制总是采用常规的模拟调节器,然而,这种调节器存在的缺点是控制精度低,具有滞后、非线性等特点。
-本文将采用微电子技术来提高温度控制的精度,因为微电子技术的电路设计简单,控制效果好,具有很强的实用性。
众所周知,在现代工业以及家用电器测控领域中,单片机系统的开发和运用给其带来了全新的技术创新和变革。
而且,自动化和智能化程度的高低均依赖于是否使用单片机。
试想:
将单片机的温度控制方法如果能够运用到温度控制系统中的话,那么,就可以在一定程度上缓减和克服温度控制系统中存在的滞后现象,同时在很大程度的上,单片机的使用可以提高温度的控制效果以及控制精度。
在工业自动化控制中,温度的控制一直都占有非常特殊的地位。
在本文中作者针对电烤箱的温控系统利用单片机进行设计,从而达到精确控制电烤箱温度目的。
1.2题目简介
课题名称:
基于51单片机的温度控制系统设计
主要任务:
(1)电烤箱由1kW电炉加热,最高温度为120℃;
(2)电烤箱温度可设置,电烤过程恒温控制,温度控制误差≤±2℃;
(3)实时显示温度和设置温度,显示精确为1℃;
(4)温度超出设置温度±5℃时发出超限报警,对升温和降温过程不作要求。
开发环境:
本环境温度控制系统的软件部分是通过KEIL进行编译,并由Proteus7Professional进行仿真测试。
技术指标:
(1)以AT89C51系列单片机为核心部件
(2)以数字电路和模拟电路为硬件基础
(3)以C语言为软件实现语言
功能概述:
在该温度控制系统中,单片机作为核心部件进行检测控制。
在该环境温度控制系统中温度检测采用DS18B20温度传感器将实时温度传送至单片机,并加以显示。
再通过按键来设定温度,并实时显示。
按下确定键后将实际温度与设定温度进行比较,如果实际温度大于设定温度,则进行降温过程,反之,则进行升温过程,实现温度控制和报警等目的,按复位键后,从新开始。
第2章系统总体设计及方案
2.1单片机的介绍
随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时/计数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,因此单片机早期的含义称为单片微型计算机,直译为单片机。
单片机具有以下特点:
1.具有优异的性能价格比
2.集成度高、体积小、可靠性高
3.控制功能强
4.低电压、低功耗
2.2系统功能的确定
一个控制系统是否能被大众所接受,在于该控制系统是否拥有人性化的操作功能。
为了使本次设计的环境温度控制系统具有操作简单、灵活及高可靠性等特点,确定了该系统功能:
1.独立键盘输入。
2.单总线温度传感器DS18B20进行温度采集。
3.温度显示。
4.温度控制执行,温度超限进行报警。
5.温度测量范围为-55-125度,温度有效范围为2-98度,允许误差为1度。
2.3温度传感器DS18B20的介绍
DS18B20温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,在一根通信线,可以挂很多这样的温度传感器,十分方便。
DS18B20具有以下的的特点:
1.只要求一个端口即可实现通信。
2.在DS18B20中的每个器件上都有独一无二的序列号。
3.实际应用中不需要外部任何元器件即可实现测温。
4.测量温度范围-55到+125。
5.数字温度计的分辨率用户可以从9位到12位选择。
6.内部有温度上、下限告警设置。
2.3.1DS18B20的内部结构
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2.1所示。
图2.1DS18B20内部结构框图
64位ROM的位结构如图2.2所示。
开始8位是产品类型的编号;接着是每个器件的唯一的序号,共有48位;最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用单线进行通信的原因。
非易失性温度报警触发器TH和TL,可通过软件写入用户报警上下限数据。
图2.264位ROM的位结构图
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的E2PROM。
高速暂存RAM的结构为9字节的存储器,结构如图2.3所示。
前2字节包含测得的温度信息。
第3和第4字节是TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5字节为配置寄存器,其内容用于确定温度值的数字转换分辨率,DS18B20工作时按此寄存器中的分辨率将温度转换为相应精度的数值。
该字节各位的定义如图2.4所示,其中,低5位一直为1;TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式,在DS18B20出厂时,该位被设置为0,用户不要去改动;R1和R0决定温度转换的精度位数,即用来设置分辨率,其定义方法见表2.1。
温度LSB
温度MSB
TH用户字节1
TL用户字节2
配置寄存器
保留
保留
保留
CRC
图2.3高速暂存RAM结构图
表2.1DS18B20分辨率的定义和规定
R1
R0
分辨率/位
温度最大
转换时间/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
图2.4配置寄存器位定义
由表可见,DS18B20温度转换的时间比较长,而且设置的分辨率越高,所需要的温度数据转换时间就越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节是前面8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存RAM的第1、2字节中。
单片机可以通过单线接口读出该数据。
读数据时,低位在先,高位在后,数据格式以0.0625°C/LSB形式表示。
温度值格式如图2.5所示:
低字节
23
22
21
20
2-1
2-2
2-3
2-4
高字节
S
S
S
S
S
26
25
24
图2.5温度数值格式
2.3.2DS18B20的引脚介绍
TO-92封装的DS18B20的引脚排列见图2.6,其引脚功能描述见表2.2。
图2.6(底视图)
表2.2DS18B20详细引脚功能描述
序号
名称
引脚功能描述
1
GND
地信号
2
DQ
数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源。
3
VDD
可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
2.4人机交互与串口通信
该热炉温度控制系统由温度采集、独立键盘输入、温度显示、温度控制执行等四大模块组成。
1.温度采集:
由温度传感器DS18B20完成,并通过串口通信技术与单片机进行数据传输,使用单片机P2.2端口。
2.独立键盘输入:
将键盘扫描程序设置在主函数中while循环函数的第一条语句,不断刷新获得
设定温度,按下确定键后执行温度比较和温度控制。
使用单片机的P2.1,P2.3,P2.4,P2.5端口。
3.温度显示:
通过8个7段LED数码显示管显示当前温度值和设定的温度值,及时反应当前温度的
变化与设置温度的关系,使用单片机P0.0--P0.7端口。
4.温度控制执行:
系统根据当前温度与设置的温度自动进行相应的升温或降温的操作,在系统自
动进行升温或降温处理的同时显示相应的指示灯,在本文的设计中,考虑到加入升温降温设备也不会使得DS18B20传感器有所感应,故而没有添加升降温设备。
只是通过两个升温降温指示灯来表示升降温过程,同样能让使用者知道系统正在进行的操作,使更加简洁。
但是,在实际的生产中升降温度设备是必须添加的。
两个指示灯使用单片机P1.4,P1.5端口。
5.超限报警:
在任务书要求中,当温度超出设置温度±5℃时发出超限报警,但是由于作者能力所限,未能达到要求的±5℃,我选择了比较设置温度和实际温度的十位数据的方法,将误差控制在了±10℃以内,在仿真过程中影响是很小的。
第3章硬件设计
3.1系统结构框图
AT89C51
显示模块
键盘模块
温控执行模块
传感器模块
报警模块
图3.1系统硬件总体框图
该系统由核心部件AT89C51来处理从键盘输入电路和温度采集电路送入的数据,并通过温度显示电路进行温度显示,由温度控制电路来进行相应的升温或降温的操作。
如果超出温度限制则激发报警模块。
图3.2系统硬件原理图
3.2人机交互与串口通信单元设计
在该系统中,人机交互技术主要应用在恒定温度的设置,以及当前温度与设置温度的显示;串口通信技术应用在对温度的采集。
3.2.1键盘输入电路
在本系统中,键盘输入主要采用四个独立按键来实现温度的设定。
如图3.3所示,当按下“加一”键时,恒定温度从0开始加一,按下“减一”键,设定温度从现有值减一。
按下“清零”键,设置温度清零。
按“确定”键,保存设置并退出键盘输入,进入温度控制状态。
只有按下“确定”后才开始执行温度控制和超限报警。
图3.3键盘输入原理图
3.2.2串口通信电路
为了使测得的温度更准确,在本系统中采用了温度传感器DS18B20来获取当前温度,而DS18B20是采用I²C总线进行通信的,如图3.4所示,单片机使用P2.2端口与DS18B20的数据通讯端口相连接,并通过软件实现P2.2控制DS18B20的读和写。
图3.4温度传感器原理图
3.2.3LED七段数码动态显示电路
在本系统中采用了LED七段数码动态显示电路来显示温度值,设定温度显示范围在0-99之间,实时温度显示范围在-55--120之间。
该电路由显示、位选锁存器、段选锁存器三部分组成。
显示部分:
由两个四位的LED七段共阴数码管构成,用来显示当前温度和设置温度,如图3.5所示。
图3.5LED七段共阴数码管
位选和段选部分:
如图3.6所示,由两片74HC573锁存器构成,单片机的P2.6和P2.7分别
输出段选和位选信号,然后再将P0口信号传递到锁存器,并完成段选。
进行译码后输出到LED七段数码管显示。
图3.6位选段选锁存器
符号
编码
符号
编码
0
0x3f
8
0x7f
1
0x06
9
0x6f
2
0x5b
A
0x77
3
0x4f
B
0x7c
4
0x66
C
0x39
5
0x6d
D
0x5e
6
0x7d
E
0x79
7
0x07
F
0x71
表3.7共阴极数码管编码
3.2.4控制执行单元设计
该电路的主要任务是完成单片机所发出的升温或降温操作,来控制外部的升温或降温设备。
在本文的设计中使用红、绿两色发光二极管代替。
在程序中,先将P1.4和P1.5端口初始为低电平,当需要升温或降温时,将相应端口置为高电平,使得二极管发光。
提醒使用者正在进行的温度操做。
例如:
当设置温度高于实时温度时,单片机向温控执行部分发送升温指令,将P1.5置为高电平,使得升温指示灯亮。
3.2.5温度超限报警
当实时温度和设定温度十位数值不同时发出警报,由于在Proteus中选用的发声元件为SPEAKER,此元件与计算机音频输出设备相连,因此,当触发报警部分的时候,计算机会发出蜂鸣。
第4章软件设计
4.1设计思路、程序代码
根据所学知识,实现本系统的软件部分将使用汇编语言,要配合硬件部分实现输入一个需要恒定的温度,与从温度传感器所获取的当前实际温度相比较,并向温度控制执行电路发出升温或降温的命令,以及温度超限报警命令。
在这一过程中将随时显示当前温度值和设置的温度值。
其主要实现的部分包括:
键盘输入、温度采集、数据转换、动态显示、温度控制,超限报警等。
程序如下。
键盘扫描程序:
/*
功能描述:
用数码管的前两位显示一个十进制数,变化范围是0~120,开始时显示0,每次按下K1:
数值加一,每次按下
K2:
数值减一。
每次按下K3:
数值归零。
每次按下OK:
执行温度比较,显示升温或降温过程,以及蜂鸣器的开闭。
theend:
successful
*/
#include"delay.h"
#include"inden_key.h"
voidkeyscan(void)
{
unsignedcharcount;
if(!
key1)
{
DelayMs(10);
if(!
key1)
{
count++;
if(count>=120)count=0;
while(!
key1);
}
}
if(!
key2)
{
DelayMs(10);
if(!
key2)
{
if(count==0)count=0;
count--;
while(!
key2);
}
}
if(!
key3)
{
DelayMs(10);
if(!
key3)
{
count=0;
while(!
key3);
}
}
}
主函数:
/*-----------------------------------------------
名称:
基于51单片机的温控系统设计
编写:
叶瑞夺
日期:
2015.1.25
内容:
对电烤箱进行温度控制。
1.8位数码管的1~2位(左边数起)显示设定的温度值(只有在确定键按下之后才会显示)
2.8位数码管的3~8位(左边数起)显示温度传感器采集到的实时温度值
3.当设定温度值小于实时温度时,绿灯亮(表示降温)。
4.当设定温度值大于或等于实时温度时,红灯亮(表示升温)。
5.蜂鸣器的误差为+-10,当设定温度值与实时温度值误差超过10度时蜂鸣器会响。
(按下确定键才会进行比较)
6.k1键:
加一K2键:
减一K3:
归零OK键:
确定键(跟蜂鸣器和红绿灯显示有关)
------------------------------------------------*/
#include//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"18b20.h"
#include"delay.h"
#defineDataPortP0//定义数据端口程序中遇到DataPort则用P0替换
#defineWaringValue17//定义报警值
sbitled_green=P1^4;//设定温度比实际温度低
sbitled_red=P1^5;//设定温度比实际温度高
sbitled=P1^7;
sbitBEEP=P2^0;
sbitOK=P2^1;
sbitkey1=P2^3;
sbitkey2=P2^4;
sbitkey3=P2^5;
sbitLATCH1=P2^6;//定义锁存使能端口段锁存
sbitLATCH2=P2^7;//位锁存
bitReadTempFlag;//定义读时间标志
bitButton_flag;//确认按下的标志位
unsignedcharcount;
//---------thepartofnewadd----------------------
//ucharcodedu_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
////describtion:
itisaarrayfrom0toF,thetypeofnixietubeiscommoncathode
//ucharcodewe_table[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
////description:
itisaarraytorealizethelocationisselected,thewe_table[0]'sfuntionistocosealldispaly
//-------------------------------
unsignedcharcodedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0~9
unsignedcharcodedofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码
unsignedcharTempData[8];//存储显示值的全局变量
voidDisplay(unsignedcharFirstBit,unsignedcharNum);//数码管显示函数
voidInit_Timer0(void);//定时器初始化
voidkeyscan(void)
{
if(!
key1)
{
DelayUs2x(20);
if(!
key1)
{
count++;
if(count>=120)count=0;
while(!
key1);
}
}
if(!
key2)
{
DelayUs2x(20);
if(!
key2)
{
if(count==0)count=0;
elsecount--;
while(!
key2);
}
}
if(!
key3)
{
DelayUs2x(20);
if(!
key3)
{
count=0;
while(!
key3);
}
}
if(!
OK)
{
DelayUs2x(20);
if(!
OK)
{
Button_flag=1;
while(!
OK);
}
}
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain(void)
{
unsignedintTempH,TempL,temp;
Init_Timer0();
led_red=0;
led_green=0;
while
(1)//主循环
{
keyscan();
if(Button_flag)
{
//--------thepartofbeep.belowistherealtimerangeoftempeture--------------------
if(count/10==(TempH%100)/10)
BEEP=1;
else
BEEP=0;
//----------------------------
Button_flag=0;
if(TempData[2]==0x40)
{
led_red=1;
led_green=0;
}
else
if(TempData[3]!
=0)
{
led_red=0;
led_green=1;
}
else
if(count/10>(TempH%100)/10)
{
led_red=1;
led_green=0;
}
else
if(count/10<(TempH%100)/10)
{
led_red=0;
led_green=1;
}
else
if(count/10==(TempH%100)/10)
{
if(count%10>=(TempH%100)%10)
{
led_red=1;
led_green=0;
}
else
{
led_red=0;
led_green=1;
}
}
}
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=ReadTemperature();
TempData[0]=dofly_DuanMa[count/10];
TempData[1]=dofly_DuanMa[count%10];
if(temp&0x8000)
{
TempData[2]=0x40;//负号标志
temp=~temp;//取反加1
temp+=1;
}
else
TempData[2]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小数近似处理
if(TempH/100==0)
TempData[3]=0;
else
TempData[