小型多路温控采集系统.docx
《小型多路温控采集系统.docx》由会员分享,可在线阅读,更多相关《小型多路温控采集系统.docx(24页珍藏版)》请在冰豆网上搜索。
小型多路温控采集系统
小型多路温控采集系统
目录
第一章设计任务和要求2
1.1设计任务2
1.2.技术要求2
1.2.1基本要求2
1.2.2发挥要求2
第二章设计方案2
2.1整体方案调研2
2.1.1方案一2
2.1.2方案二2
2.1.3方案三2
2.2整体方案论证3
2.2.1方案一3
2.2.2方案二3
2.2.3方案三3
2.3总体设计框图3
第三章系统硬件组成4
3.1DS18B20温度传感器与单片机的接口电路4
3.27段LED数码管电路及原理5
3.3系统整体硬件电路图6
第四章系统软件设计7
4.1主程序流程图7
4.2读出温度子程序7
4.3温度转换命令子程序7
4.4计算温度子程序8
4.5显示数据刷新子程序8
4.6程序代码8
第五章总结与体会15
第六章参考文献15
第一章设计任务和要求
1.1设计任务
设计并制作一个至少2路的温度采集系统。
1.2.技术要求
1.2.1基本要求
(1)测温范围0~100℃;
(2)测温精度±2℃;
(3)LED数码管显示,显示方式为电测与巡测(多点侧);
(4)+5V,±15V外部电源供电。
1.2.2发挥要求
(1)设计报警电路,当温度高于一定的温度时就报警;
(2)测温点与控制显示部分拉长距离,即无线测温。
遥测距离100m。
第二章设计方案
2.1整体方案调研
2.1.1方案一
采用热敏电阻,可满足40摄氏度至90摄氏度测量范围,但热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的。
而且使用热敏电阻,需采用A/D转换电路,要用到十分复杂的算法,一定程度上增加了软件实现的难度。
2.1.2方案二
采用AD590,它的测温范围在-55℃~+150℃之间,而且精度高。
M档在测温范围内非线形误差为±0.3℃。
AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会损坏。
使用可靠。
它只需直流电源就能工作,而且,无需进行线性校正,所以使用也非常方便,借口也很简单。
作为电流输出型传感器的一个特点是,和电压输出型相比,它有很强的抗外界干扰能力。
AD590的测量信号可远传百余米。
2.1.3方案三
采用温度芯片DS18B20测量温度。
该芯片的物理化学性很稳定,它能用做工业测温元件,且此元件线形较好。
在0~100摄氏度时,最大线形偏差小于1摄氏度。
该芯片直接向单片机传输数字信号,便于单片机处理及控制。
最大特点之一就是直接采用温度芯片对温度进行测量,使数据传输和处理简单化。
2.2整体方案论证
2.2.1方案一
此方案采用AT89C51八位单片机实现。
单片机软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制。
但是,AT89C51单片机需要用仿真器来实现软硬件的合成在线调试,较为繁琐,很不简便。
而且AT89C51的地位已经渐渐的被AT89S51所取代。
逐渐成为历史。
事实也证明了AT89S51在工业控制上有着广泛的应用。
2.2.2方案二
采用温度传感器AD590。
AD590具有体积小、质量轻、线形度好、性能稳定等优点。
其测量范围在-50℃~+150℃,满刻度范围误差为±0.3℃,当电源电压在5~10V之间,稳定度好,其各方面特性都满足此系统的设计要求。
此外AD590是温度-电流传感器,对于提高系统抗干扰能力有很大的帮助。
但增加程序的长度,占用大量CPU的时间。
2.2.3方案三
采用温度传感器DS18B20。
它是一种数字式的温度传感器,直接将被测温度转换成串行数字信号,具有微型化,低功耗,高性能,抗干扰能力强等优点。
从微处理器到DS18B20仅需连接一条信号线和地线。
它可以实现9~12位的温度读数,测量范围为-55~+125℃,在-10~+85℃范围内误差为
0.5℃,将12位的温度值转换为数字量所需时间不超过750ms。
读写和执行温度变换所需的电源可以由数据线本身提供,而不需要外部电源。
以上三种方案,第三种方案电路比较简单,软件设计也相对简单,所以采用第三种方案。
2.3总体设计框图
温度计电路设计总体设计方框图如图所示,控制器采用单片机STC89S52,温度传感器采用DS18B20,用4位LED数码管以串口传送数据实现温度显示。
总体设计方框图
第三章系统硬件组成
3.1DS18B20温度传感器与单片机的接口电路
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
(1)独特的单线接口仅需一个端口引脚进行通讯;
(2)简单的多点分布应用;
(3)无需外部器件;
(4)可通过数据线供电;
(5)零待机功耗;
(6)测温范围-55~+125℃,以0.5℃递增;
(7)温度以9位数字量读出;
(8)温度数字量转换时间200ms(典型值);
(9)用户可定义的非易失性温度报警设置;
(10)负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
(11)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
(12)应用包括温度控制、工业系统、消费品、温度计或任何热感测系统。
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图所示。
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
TO-92封装的DS18B20的引脚排列见图示,其引脚功能描述见下:
(1)GND地信号;
(2)DQ数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;
(3)VDD可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
DS18B20的测温原理,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
DS18B20与单片机的接口电路
3.27段LED数码管电路及原理
7段LED数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛。
这类数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。
图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。
还有一种比较常用的是四位数码管,内部的4个数码管共用a~dp这8根数据线,为人们的使用提供了方便,因为里面有4个数码管,所以它有4个公共端,加上a~dp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。
引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为1~12脚,下图中的数字与之一一对应。
3.3系统整体硬件电路图
温度计电路设计原理图如图所示,控制器使用单片机STC89C52,温度传感器使用DS18B20,用4位共阳LED数码管以动态扫描法实现温度显示。
数字温度计电路原理图
第四章系统软件设计
4.1主程序流程图
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图4.1:
4.1主程序流程图4.2读温度流程图4.3温度转换流程图
4.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图4.2所示。
4.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如图4.3所示。
4.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图4.4所示。
4.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图4.5。
4.4计算温度流程图4.5显示温度流程图
4.6程序代码
/******************************************************************
程序名称:
DS18B20温度测量、报警系统
简要说明:
DS18B20温度计,温度测量范围0~99.9摄氏度
可设置上限报警温度、下限报警温度
即高于上限值或者低于下限值时蜂鸣器报警
默认上限报警温度为38℃、默认下限报警温度为5℃
报警值可设置范围:
最低上限报警值等于当前下限报警值
最高下限报警值等于当前上限报警值
将下限报警值调为0时为关闭下限报警功能
******************************************************************/
#include
#include"DS18B20.h"
#defineuintunsignedint
#defineucharunsignedchar//宏定义
#defineSETP3_1//定义调整键
#defineDECP3_2//定义减少键
#defineADDP3_3//定义增加键
#defineBEEPP3_7//定义蜂鸣器
bitshanshuo_st;//闪烁间隔标志
bitbeep_st;//蜂鸣器间隔标志
sbitDIAN=P2^7;//小数点
ucharx=0;//计数器
signedcharm;//温度值全局变量
ucharn;//温度值全局变量
ucharset_st=0;//状态标志
signedcharshangxian=38;//上限报警温度,默认值为38
signedcharxiaxian=5;//下限报警温度,默认值为5
ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器0*****/
voidInitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;//50ms(晶振12M)
}
/*****定时器0中断服务程序*****/
voidtimer0(void)interrupt1
{
TH0=0x3c;
TL0=0xb0;
x++;
}
/*****外部中断0服务程序*****/
voidint0(void)interrupt0
{
EX0=0;//关外部中断0
if(DEC==0&&set_st==1)
{
shangxian--;
if(shangxian}
elseif(DEC==0&&set_st==2)
{
xiaxian--;
if(xiaxian<0)xiaxian=0;
}
}
/*****外部中断1服务程序*****/
voidint1(void)interrupt2
{
EX1=0;//关外部中断1
if(ADD==0&&set_st==1)
{
shangxian++;
if(shangxian>99)shangxian=99;
}
elseif(ADD==0&&set_st==2)
{
xiaxian++;
if(xiaxian>shangxian)xiaxian=shangxian;
}
}
/*****读取温度*****/
voidcheck_wendu(void)
{
uinta,b,c;
c=ReadTemperature()-5;//获取温度值并减去DS18B20的温漂误差
a=c/100;//计算得到十位数字
b=c/10-a*10;//计算得到个位数字
m=c/10;//计算得到整数位
n=c-a*100-b*10;//计算得到小数位
if(m<0){m=0;n=0;}//设置温度显示上限
if(m>99){m=99;n=9;}//设置温度显示上限
}
/*****显示开机初始化等待画面*****/
Disp_init()
{
P2=0xbf;//显示-
P1=0xf7;
Delay(200);
P1=0xfb;
Delay(200);
P1=0xfd;
Delay(200);
P1=0xfe;
Delay(200);
P1=0xff;//关闭显示
}
/*****显示温度子程序*****/
Disp_Temperature()//显示温度
{
P2=0xc6;//显示C
P1=0xf7;
Delay(300);
P2=LEDData[n];//显示个位
P1=0xfb;
Delay(300);
P2=LEDData[m%10];//显示十位
DIAN=0;//显示小数点
P1=0xfd;
Delay(300);
P2=LEDData[m/10];//显示百位
P1=0xfe;
Delay(300);
P1=0xff;//关闭显示
}
/*****显示报警温度子程序*****/
Disp_alarm(ucharbaojing)
{
P2=0xc6;//显示C
P1=0xf7;
Delay(200);
P2=LEDData[baojing%10];//显示十位
P1=0xfb;
Delay(200);
P2=LEDData[baojing/10];//显示百位
P1=0xfd;
Delay(200);
if(set_st==1)P2=0x89;
elseif(set_st==2)P2=0xc7;//上限H、下限L标示
P1=0xfe;
Delay(200);
P1=0xff;//关闭显示
}
/*****报警子程序*****/
voidAlarm()
{
if(x>=10){beep_st=~beep_st;x=0;}
if((m>=shangxian&&beep_st==1)||(melseBEEP=1;
}
/*****主函数*****/
voidmain(void)
{
uintz;
InitTimer();//初始化定时器
EA=1;//全局中断开关
TR0=1;
ET0=1;//开启定时器0
IT0=1;
IT1=1;
check_wendu();
check_wendu();
for(z=0;z<300;z++)
{
Disp_init();
}
while
(1)
{
if(SET==0)
{
Delay(2000);
do{}while(SET==0);
set_st++;x=0;shanshuo_st=1;
if(set_st>2)set_st=0;
}
if(set_st==0)
{
EX0=0;//关闭外部中断0
EX1=0;//关闭外部中断1
check_wendu();
Disp_Temperature();
Alarm();//报警检测
}
elseif(set_st==1)
{
BEEP=1;//关闭蜂鸣器
EX0=1;//开启外部中断0
EX1=1;//开启外部中断1
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st){Disp_alarm(shangxian);}
}
elseif(set_st==2)
{
BEEP=1;//关闭蜂鸣器
EX0=1;//开启外部中断0
EX1=1;//开启外部中断1
if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
if(shanshuo_st){Disp_alarm(xiaxian);}
}
}
}
/*****END*****/
DS18B20.h:
#include
#defineDQP3_6//定义DS18B20总线I/O
/*****延时子程序*****/
voidDelay_DS18B20(intnum)
{
while(num--);
}
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
Delay_DS18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
Delay_DS18B20(80);//精确延时,大于480us
DQ=1;//拉高总线
Delay_DS18B20(14);
x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****/
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay_DS18B20(5);
DQ=1;
dat>>=1;
}
}
/*****读取温度*****/
unsignedintReadTemperature(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=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*0.0625;
t=tt*10+0.5;//放大10倍输出并四舍五入
return(t);
}
/*****END*****/
第五章总结与体会
温度是工业控制中主要的被控参数之一。
随着电子技术和微型计算机的迅速发展,微机测量和控制技术得到了迅速的发展和广泛的应用。
单片机具有处理能强、运行速度快、功耗低等优点,应用在温度测量与控制方面,控制简单方便,测量范围广,精度较高。
DS18B20温度传感器温度的精确度高达0.1度,在许多工业控制中已经足够。
可以满足从-55摄氏度到+125摄氏度测量范围,在一秒内把温度转化成数字,测得的温度值的存储在两个八位的RAM中,单片机直接从中读出数据转换成十进制就是温度,使用方便。
从用途上讲,该单片机类似于温度计,但用途又不仅仅限于温度计,由于蜂鸣器的使用,编写程序后,超过预设温度后,蜂鸣器发出蜂鸣声,为工业控制的安全保驾护航。
在DS18B20测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环。
这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。
由于接触单片机时间不久,所以从选择硬件到程序编写调试我遇到了许多的困难,而且理论和实际有一定的差距。
在操作的过程中,我感到了自己的动手能力上有不足。
更重要的是,在实验中我不抛弃,不放弃,遇到困难从来不灰心,最终享受到了成功的喜悦。
只要抱着这种精神,我相信以后的学习生活会做得更好!
第六章参考文献
1曹巧媛编。
单片机原理及应用(第二版)。
北京:
电子工业出版社,2002。
2何力民编。
单片机高级教程。
北京:
北京航空大学出版社,2000。
3金发庆等编。
传感器技术与应用。
北京:
北京机械工业出版社,2002。
4楼然苗等编。
单片机课程设计指导。
北京:
北京航空航天大学出版社,2007