基于STC89C52单片机的温度控制电路设计.doc
《基于STC89C52单片机的温度控制电路设计.doc》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的温度控制电路设计.doc(23页珍藏版)》请在冰点文库上搜索。
德州学院物理与电子信息学院2011级电子信息科学与技术电子系统设计考查报告
基于温度传感器的单片机温控电路设计
一、设计分析
在各行业中广泛应用的温度控制器及仪器仪表主要具有如下的特点:
一是在复杂的温度控制系统中能够适应于大惯性、大滞后的控制;二是在受控系统数学模型难以建立的情况下,得到控制;三是在受控系统中,能够被控制过程很复杂且参数时变的温度控制系统控制;五是温度控制系统普遍具有参数自检功能,借助计算机技术,能控制对象和参数,并且具有特性进行自动调整的功能等特点[1]。
本次电子工艺实训旨在练习实用单片机系统的设计与安装,掌握典型51系列单片机最小系统及外围电路设计、常用电子元器件的识别、万用板焊接电路的方法、巩固常用电子仪表测量与调试电路参数的方法,培养创新实践动手能力,为下学期单片机、电子系统设计等课程奠定理论和实践基础。
具体要求如下:
1.自行设计以STC89C52RC40单片机为控制核心的实用单片机控制系统的硬件电路,实现至少一个环境参量信息采集、数值显示、报警功能。
2.根据设计,利用万用板焊接硬件电路,并做简单调试。
3.要求模块化设计,单片机最小系统模块、显示模块、信息采集报警模块、键盘模块,主要贵重器件用排座插接,电阻、电容、按键等元器件要求布局合理、排列整齐,无虚焊。
二、设计方案
本文设计是以单片机为核心,实现温度实时测控和显示。
确定电路中的一些主要参数,了解温度控制电路的结构,工作原理,对该控制电路性能进行测试。
具体设计方案:
(1)本设计是用来测控温度的,可以利用热敏电阻的感温效应,将被测温度变化的模拟信号,电压或电流的采集过来,首先进行放大和滤波后,再通过A/D转换,将得到的数字量送往单片机中去处理,用数码管将被测得的温度值显示出来。
但是这种电路的设计需要用到放大滤波电路,A/D转换电路,感温电路等一系列模拟电路,设计起来较麻烦[2]。
(2)本设计采用单片机做处理器,可以考虑使用温度传感器,采用由达拉斯公司研制的DS18B20型温度传感器,此传感器可以将被测的温度直接读取出来,并进行转换,这样就很容易满足设计要求。
从上面的两种方案,可以很容易看出来,虽然方案
(2)软件部分设计复杂点,但是电路比较简单且精度高,故采用方案
(2)。
单
片
机
最
小
系
统
显示模块
设置模块
采集模块
图1.总体方框图
三、系统硬件设计
据设计的需求,分析单片机的工作原理,可以大体得出来温度控制电路设计的总体方框图,主处理器采用单片机STC89C52RC40,温度采集部分采用温度传感器,用4位LED显示数码管作为显示部分,用来将温度显示出来。
系统硬件电路部分由四大模块组成:
温度采集模块、温度显示模块、报警模块、键盘模块和单片机最小系统模块[3]。
(一)单片机最小系统模块
在课题设计的温度控制系统设计中,控制核心是STC89C52单片机,该单片机为51系列增强型8位单片机,它有32个I/O口,片内含4KFLASH工艺的程序存储器,便于用电的方式瞬间擦除和改写,而且价格便宜,其外部晶振为12MHz,一个指令周期为1μS。
使用该单片机完全可以完成设计任务,其最小系统主要包括:
复位电路、震荡电路以及存储器选择模式(EA脚的高低电平选择),电路如下图3.1所示:
图2.最小系统
本课题设计的温度控制系统主控制芯片选型为STC89C52单片机,其特点如下:
STC89C52单片机的40个引脚中有2个专用于主电源引脚,2个外接晶振的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。
下面按引脚功能分为4个部分叙述个引脚的功能。
(1)电源引脚Vcc和VssVcc(40脚):
接+5V电源正端Vss(20脚):
接+5V电源正端。
(2)外接晶振引脚XTAL1和XTAL2
XTAL1(19脚):
接外部石英晶体的一端。
在单片机内部,它是一个反相放大器的输入端,这个放大器构成采用外部时钟时,对于HMOS单片机,该引脚接地;对于CHOMS单片机,该引脚作为外部振荡信号的输入端。
XTAL2(18脚):
接外部晶体的另一端。
在单片机内部,接至片内振荡器的反相放大器的输出端。
当采用外部时钟时,对于HMOS单片机,该引脚作为外部振荡信号的输入端。
对于CHMOS芯片,该引脚悬空不接。
(3)控制信号或与其它电源复用引脚
控制信号或与其它电源复用引脚有RST/VPD、ALE/P、PSEN和EA/VPP等4种形式。
(A).RST/VPD(9脚):
RST即为RESET,VPD为备用电源,所以该引脚为单片机的上电复位或掉电保护端。
当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机复位到初始状态。
当VCC发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为内部RAM供电,以保证RAM中的数据不丢失。
(B).ALE/P(30脚):
当访问外部存储器时,ALE(允许地址锁存信号)以每机器周期两次的信号输出,用于锁存出现在P0口的低
(C).PSEN(29脚):
片外程序存储器读选通输出端,低电平有效。
当从外部程序存储器读取指令或常数期间,每个机器周期PESN两次有效,以通过数据总线口读回指令或常数。
当访问外部数据存储器期间,PESN信号将不出现。
(D).EA/Vpp(31脚):
EA为访问外部程序储器控制信号,低电平有效。
当EA端保持高电平时,单片机访问片内程序存储器4KB(MS—52子系列为8KB)。
若超出该范围时,自动转去执行外部程序存储器的程序。
当EA端保持低电平时,无论片内有无程序存储器,均只访问外部程序存储器。
对于片内含有EPROM的单片机,在EPROM编程期间,该引脚用于接21V的编程电源Vpp。
(4)输入/输出(I/O)引脚P0口、P1口、P2口及P3口
(A).P0口(39脚~22脚):
P0.0~P0.7统称为P0口。
当不接外部存储器与不扩展I/O接口时,它可作为准双向8位输入/输出接口。
当接有外部程序存储器或扩展I/O口时,P0口为地址/数据分时复用口。
它分时提供8位双向数据总线。
对于片内含有EPROM的单片机,当EPROM编程时,从P0口输入指令字节,而当检验程序时,则输出指令字节。
(B).P1口(1脚~8脚):
P1.0~P1.7统称为P1口,可作为准双向I/O接口使用。
对于MCS—52子系列单片机,P1.0和P1.1还有第2功能:
P1.0口用作定时器/计数器2的计数脉冲输入端T2;P1.1用作定时器/计数器2的外部控制端T2EX。
对于EPROM编程和进行程序校验时,P0口接收输入的低8位地址。
(C).P2口(21脚~28脚):
P2.0~P2.7统称为P2口,一般可作为准双向I/O接口。
当接有外部程序存储器或扩展I/O接口且寻址范围超过256个字节时,P2口用于高8位地址总线送出高8位地址。
对于EPROM编程和进行程序校验时,P2口接收输入的8位地址。
(D).P3口(10脚~17脚):
P3.0~P3.7统称为P3口。
它为双功能口,可以作为一般的准双向I/O接口,也可以将每1位用于第2功能,而且P3口的每一条引脚均可独立定义为第1功能的输入输出或第2功能。
P3口的第2功能见下表:
引脚
第2功能
P3.0
RXD(串行口输入端0)
P3.1
TXD(串行口输出端)
P3.2
INT0(部中断0请求输入端,低电平有效)
P3.3
INT1(中断1请求输入端,低电平有效)
P3.4
T0(时器/计数器0计数脉冲端)
P3.5
T1(时器/计数器1数脉冲端)
P3.6
WR(部数据存储器写选通信号输出端,低电平有效)
P3.7
RD(部数据存储器读选通信号输出端,低电平有效)
表1单片机P3.0管脚含义
(二)温度采集模块
DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。
该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。
本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:
(1)系统的特性:
测温范围为-55℃~+125℃,测温精度为士0.5℃;温度转换精度9~12位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。
(2)系统成本:
由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。
(3)系统复杂度:
由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。
(4)系统的调试和维护:
由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。
同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。
DS18B20温度传感器只有三根外引线:
单线数据传输总线端口DQ,外供电源线VDD,共用地线GND。
DS18B20有两种供电方式:
一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。
这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。
另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。
(三)报警模块
设计中的报警装置电路用到了发光二级管、三极管、10K的电阻。
将发光二级管的一端接地,另一端接三极管的发射极,三极管的基极通过电阻接在三极管上,三极管的集电极电源。
图5.报警器
(四)键盘模块
键盘实际是就是很多案件的一种组合,按键的按下与否形成一个高低电平,主控芯片CPU通过高低电平来识别所需信号,进而使程序进行下一步的操作。
键盘操作的软硬件的设计有以下几个方面的问题:
对于此设计来说我们要准确的显示我们所要对应的信息,每按一次按键要显示所要显示的信息。
这按键是主要用来控制温度而设计的。
这样比键盘操作方便,也比较实惠。
按键电路采用中断模式。
图6.键盘输入
(五)显示、指示模块
本模块用的是0.56英寸2位数码管红色共阳数码管5261BS,一般正向压降的都是1.5~2V,额定电流为10mA,通过最大的电流为40mA。
根据各种不同管接线的方式,可将数码管分成共阴极型和共阳极型。
图7.数码管
(六)系统总电路图
系统整体硬件电路包括,传感器数据采集电路,温度显示电路,单片机主控电路等,通过AltiumDesigner可画出如图所示的电路图[4][5][6]
图8.系统总电路图
四、系统硬件制作
(一)硬件电路制作方法
1.按照电路图插接面包板,连接线路。
2.电路焊接,将各元件焊接到面包板上。
(二)硬件电路制作过程
1.准备好各类器件以及工具。
2.按电路图插接好面包板,先焊接小器件及简单电路.
3.用电线连接距离较远的器件,进行焊接.
4.焊接完成后用万用表进行电路测试,确保没有短路。
五、系统软件设计
(一)软件设计思路及流程图
主控制程序的主要是用来实时控制当前所要测控的环境温度,并读出由DS18B20测量的经过处理的当前环境的温度值,同时检查温度是否在限度之内,否则报警,同时调整温度值。
其主控制程序流程图如9所示。
开始
STC89C52初始化
DS18B20初始化
温度是否到达设定限度
温度显示
结束
红灯亮
温度在显示范围内
Y
N
Y
N
Y
发温度转换命令
发DS18B20复位命令
发跳过读序列号命令
读取操作,CRC校验
9字节完?
CRC校验正?
确?
移入温度暂存器
结束
N
N
Y
图9主程序流程图图10读温度流程图
1.读温度子程序
读温度子程序的功能主要是用来将随机存储器中的9个字节读出,在读出字节时侯,需要进行冗余码校验。
在校验到有错误的时侯,所测得的温度数据就会不进行改写。
其读温度子程序流程图如10所示。
2.温度转换子程序
温度转换命令子程序的功能主要是用来发送温度开始转换命令,让温度转换自动进行,其温度转换命令子程序流程图如11所示。
发DS18B20复位命令
发跳过读序列号命令
发温度转换开始命令
结束
图11温度转换流程图
3.计算温度子程序
计算温度子程序的功能主要将随机存储器中的温度数值读取出来,将取得的温度数值的每一位经过计算分别取出来,放入指定的字节中,并进行温度值数正负的判定。
计算温度子程序流程图如12所示。
开始
温度零下?
温度值取补码置“—”标志
取出小数位的温度值
取出整数位的温度值
结束
置“+”标志
N
Y
图12.计算温度流程图
图3-4计算温度流程图
4.温度显示子程序
温度显示子程序的功能主要是对显示数据寄存器中的数据反复进行刷新操作。
如果最高位显示是0时的时候,就将符号显示位立即移入下一位字节中。
温度显示子程序流程图如13所示。
温度数据移入显示寄存器
十位数0?
百位数0?
十位数显示符号百位数不显示
百位数显示数据(不显示符号)
结束
N
N
Y
Y
图13.温度显示数据刷新流程图
(二)程序源代码
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitp34=P2^4;
sbitp35=P2^5;
sbitp36=P2^6;
sbitdp=P0^7;
sbitp37=P2^7;
sbitDQ=P2^2;//定义DS18B20总线I/O
sbitSET=P3^1;//定义选择报调整警温度上限和下限(1为上限,0为下限)
sbitLING=P2^0;//定义闪烁
signedcharm;//温度值全局变量
bitsign=0;//外部中断状态标志
signedcharshangxian=38;//上限报警温度,默认值为38
signedcharxiaxian=5;//下限报警温度,默认值为5
ucharcodeLEDData[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
/*****延时子程序*****/
voidDelay(uinti)
{
while(i--);
}
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;
Delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
Delay(80);//精确延时,大于480us
DQ=1;//拉高总线
Delay(14);
x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay(20);
}
/*****读一个字节*****/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
voidTmpchange(void)//发送温度转换命令
{
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
}
/*****读取温度*****/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Tmpchange();
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器
a=ReadOneChar();//读低8位
b=ReadOneChar();//读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*100+0.5;//放大100倍输出并四舍五入
return(t);
}
/*****显示开机初始化等待画面*****/
Disp_init()
{
P0=0x80;//显示-
p34=1;p35=0;p36=0;p37=0;
Delay(200);
P0=0x80;
p34=0;p35=1;p36=0;p37=0;
Delay(200);
P0=0x80;
p34=0;p35=0;p36=1;p37=0;
Delay(200);
P0=0x80;
p34=0;p35=0;p36=0;p37=1;
Delay(200);
P0=0x80;
}
/*****显示温度子程序*****/
Disp_Temperature()//显示温度
{
uinta,b,c,d,e;
e=ReadTemperature();//获取温度值
a=e/1000;//计算得到十位数字
b=e/100-a*10;//计算得到个位数字
d=e%10;//计算得到小数点后两位
c=(e%100)/10;//计算得到小数点后一位
m=e/100;
if(m>shangxian||melseLING=0;
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[d];//显示小数点后两位
p34=1;p35=0;p36=0;p37=0;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[c];//显示小数点后一位
p34=0;p35=1;p36=0;p37=0;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[b];//显示个位
dp=0;
p34=0;p35=0;p36=1;p37=0;
Delay(300);
p34=0;p35=0;p36=0;p37=0;
P0=LEDData[a];//显示十位
p34=0;p35=0;p36=0;p37=1;
Delay(300);
p34=0;p35=0;p36=0;p37=0;//关闭显示
}
disptiaozheng()
{
ucharf,g,j,k;
f=shangxian/10;
g=shangxian%10;
j=xiaxian/10;
k=xiaxian%10;
p34=0;p35=0;p36=0;p37=0;
P0=0xc0;//显示0
p34=1;p35=0;p36=0;p37=0;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
P0=0xc0;//显示0
p34=0;p35=1;p36=0;p37=0;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
if(SET==1)
{
P0=LEDData[g];
dp=0;//显示上限温度个位
}
else
{
P0=LEDData[k];
dp=0;
}
p34=0;p35=0;p36=1;p37=0;
Delay(200);
p34=0;p35=0;p36=0;p37=0;
if(SET==1)P0=LEDData[f];//显示上限温度十位
else
{
if(f==0)P0=0x00;//不显示下限温度十位
elseP0=LEDData[j];//显示下限温度十位
}
p34=0;p35=0;p36=0;p37=1;
Delay(200);
p34=0;p35=0;p36=0;p37=0;//关闭显示
Delay(20);
}
/*****外部中断0服务程序*****/
voidint0(void)interrupt0
{
EX0=0;//关外部中断0
sig