数字温度的设计与实现.docx
- 文档编号:15222065
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:19
- 大小:466.32KB
数字温度的设计与实现.docx
《数字温度的设计与实现.docx》由会员分享,可在线阅读,更多相关《数字温度的设计与实现.docx(19页珍藏版)》请在冰点文库上搜索。
数字温度的设计与实现
数字温度测量电路的设计及实现
(作者:
JYQ)
[摘要]本文提出了采用单总线数字式温度传感器DS18B20和单片机组成的数字温度测量电路的设计。
介绍了温度传感器DS18B20的结构、特点和工作原理,其灵敏度高,精度高,硬件电路简单,可以直接与单片机相连。
其次,设计了DS18B20和AT89C52单片机的温度测量系统硬件电路和软件编程,主要包括温度采集、温度显示及报警控制等功能。
整个系统具有结构简单,测量精度高,传输距离远,抗干扰能力强,温度读取方便和造价低等一系列优点,适用于生产生活及科学研究中对温度的测量,应用前景十分广阔。
[关键词]温度测量;单片机;DS18B20温度传感器;LCD显示
DigitalTemperatureMeasurementCircuitDesignandImplementation
Author:
JYQ
Abstract:
Thearticleproposesasingle-busdigitaltemperaturesensorDS18B20andthedesignofmicrocontrollercomponentsdigitaltemperaturemeasurementcircuit.Thearticledescribesthestructure,characteristicsandandworkingprincipleoftemperaturesensorDS18B20,itshighsensitivity,highprecision,andsimplehardwarecircuit,canbedirectlyconnectedwiththemicrocontroller.Secondly,wedesignedthemicrocontrollerDS18B20,AT89C52temperaturemeasurementhardwarecircuitryandsoftwareprogramming,includingtemperatureacquisition,temperaturedisplayandalarmcontrolandotherfunctions.Thewholesystemhasadvantagessuchasthesimplestructure,highaccuracy,transmissiondistance,anti-interferenceability,lowcostandeasytoreadtemperature,itcanapplyfortheproductionoflifeandscientificresearchinthemeasurementoftemperature,andithasawideprospectsofapplication.
Keywords:
Temperaturemeasurement;microcontroller;DS18B20temperaturesensor;LCDdisplay
0引言
温度是一个基本物理量,也是一个与人们的生活环境、生产活动密切相关的重要物理量。
温度检测系统也已广泛应用于诸多领域。
单片机具有体积小,价格便宜,通用性和灵活性强的特点,利用单片机设计温度测量系统,既可以满足功能要求,又经济实惠。
数字温度测量传感器DS18B20是单一总线的高精度测量器件,它克服了以前模拟式传感器与微机接口时需要的A/D转换器及其他复杂外围电路的缺点。
本文就是运用单片机及其接口和集成单总线温度传感器DS18B20构建一个数字温度测量和显示系统,并且通过开关进行温度上下限的设置,如果温度超过设定值就会报警或进行相应的控制命令。
设计的电路简单,易于实现,而且还具有一定的扩展功能,可以扩展成多点采集和更复杂的功能。
1系统方案论证
方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,感温电路比较麻烦。
方案二
用温度传感器DS18B20,此传感器可以很容易直接读取被测温度值,进行转换,易满足设计要求。
比较以上两方案,采用方案二,电路简单,软件设计也简单。
2系统硬件设计
整个系统主要由主控中心(单片机)、温度传感器DS18B20、及数码管显示等功能模块组成。
可以通过调节DS18B20报警温度的上下限,既可以使上下限增加,也可以使上下限减小,这样就可以用于不同场合,系统的框图如图2.1所示。
图2.1系统硬件框图
2.1温度传感器DS18B20
DS18B20是美国Dallas半导体公司生产的数字式温度传感器,提供9位温度读数,指示温度。
温度信息通过单线接口送入DS18B20或者从DS18B20送出,所以从处理器到DS18B20仅需连接一条线。
读、写和完成温度变换所需的电源可以由数据本身提供,而不需要外部电源。
这使得DS18B20与单片机接口变得很简单,克服了模拟式传感器与微机接口时需要的A/D转换及其他复杂外围电路的缺点,而且它具有结构简单、成本低、体积小、抗干扰能力强、使用简单等优点。
最重要的是DS18B20的ROM中存有其芯片的惟一标识码,即任意两个DS18B20的标识码是不同的,特别适合与微处理芯片构成多点温度测量控制系统。
DS18B20是DS1820的改进型,分辨率为9~12位可编程控制,由其寄存器R0,R1的两位状态决定。
测量范围从-55~+125℃,在-10~85℃范围内误差为±0.5℃。
DS18B20在内部以时钟周期个数计数来测量温度,并且提供0.5℃的分辨率。
温度读数以16位、符号扩展的二进制补码读数形式提供。
需要注意的是在DS18B20中温度以1/2℃LSB(最低有效位)形式表示时,产生以下9位格式:
2.1.1DS18B20初始化时序图
主机首先发出一个480-960us的低电平脉冲,然后释放总线变为高电平,并在随后的480us时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答,若无低电平出现一直都是高电平说明总线上无器件应答。
作为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960us的低电平出现,如果有,在总线转为高电平后等待15-60us后将总线电平拉低60-240us做出响应存在脉冲,告诉主机该器件已做好准备,若没有检测到就一直在检测等待。
图2.2初始化时序图
2.1.2DS18B20写数据时序图
写周期最少为60us,最长不超过120us,写周期一开始作为主机先把总线拉低1us表示写周期开始,随后若主机想写0,则继续拉低电平最少60us直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线电平1us后就释放总线为高电平,一直到写周期结束。
而作为从机的DS18B20则在检测到总线被拉低后等待15us然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。
图2.3写数据时序图
2.1.3DS18B20读数据时序图
对于读数据操作时序也分为读0时序和读1时序两个过程,读时序是从主机把单总线拉低之后,在1us之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。
DS18B20在检测到总线被拉低1us后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若要送出1则释放总线为高电平。
主机在一开始拉低总线1us后释放总线,然后在包括前面的拉低总线电平1us在内的15us时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0,采样期内总线为高电平则确认为1,完成一个读时序过程,至少需要60us才能完成。
图2.4读数据时序图
2.2温度和报警系统
系统主要采用的是1602LCD液晶显示测量的温度值,由发光二极管和蜂鸣器进行报警。
如果测的温度值高于设定值1℃,报警系统就会报警(发光二极管点亮,蜂鸣器鸣响)。
这样可以从声音和视觉上收到系统的警报。
2.3显示电路
显示电路采用1602LCD液晶显示,P0口作为液晶显示器的数据端口,读写端口,使能端分别连接单片机P2.5,P2.6,P2.7口,如图2.5所示:
图2.5显示电路
3系统软件设计
系统开始工作时,首先进行I/O口初始化、报警值初始化,由单片机控制软件发出温度读取指令,通过数字温度传感器DS18B20采集当前温度值,转换后经过单总线传输给单片机,单片机经过处理由1602LCD显示,如果超出设置的报警值1℃,系统就会报警(发光二极管点亮、蜂鸣器鸣响)。
系统的软件部分主要是由读写DB18B20程序、显示程序和报警系统三部分组成,主程序流程图如图3.1所示。
图3.1主程序流程图
3.1读温度程序流程
读出温度子程序的主要功能是读出RAM的2字节,读出温度的低八位和高八位,在读出时需进行CRC校验,校验有错时不进行温度数据的改写,其程序流程图如图3.2所示:
图3.2读温度程序图
3.2写时序子程序流程
图3.3写时序子程序流程图
4系统联调与仿真结果
高于70℃报警电路仿真如下图:
图4.1高于70℃报警电路仿真图
低于-10℃报警电路仿真如下图:
图4.2低于20℃报警电路仿真图
正常温度显示电路图:
图4.3无报警时仿真图
5结论与展望
在深入分析了数字温度测量电路原理的基础上,完成了该系统的设计任务,该设计以单总线为基本结构,采用AT89C51单片机实现与DS18B20的总线接口,并提供具体电路设计。
软件编程采用模块化、结构化思想,便于修改和维护,而且系统结构简单,成本低廉。
但由于时间和精力有限,对于该电路的设计还应在应用软件方面逐步完善。
DS18B20还可以在远距离多点测温控制方面进行应用开发,具有很好的发展前景。
6设计体会
通过这次对数字温度计的设计,让我了解了设计电路的程序,也让我了解了关于数字温度计的原理与设计理念,要设计一个完整的电路总要经过多次的失败才能成功,在设计中,也遇到了许多匪夷所思的问题,我深刻认识到,在以后的学习中,要理论联系实际,把所学的理论知识用到实际中,学习单片机更是如此,程序只有在经常的写与读的过程中才能提高。
这次学年论文设计是我的又一次全新的尝试,也是一个小小的成功,更是一次很好的锻炼,让我有了全方位的提高和进步。
参考文献
[1]于永,戴佳等.51单片机实例精讲.电子工业出版社.
[2]薛庆军,张秀娟等.单片机原理实验教程.北京航天航空大学出版社.
[3]马忠梅,张凯等.单片机C语言应用程序设计(第四版).北京航天航空大学出版社.
[4]何立民.单片机应用技术选编[M].北京:
北京航空航天大学出版社,2004.
[5]李业德.单片机和DS18B20组成的多点温度测控系统[N].山东理工大学学报,2001,(12).
附录:
程序如下:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^7;
sbitbeep=P1^5;
sbitRS=P2^6;
sbitRW=P2^5;
sbitEN=P2^7;
sbitled=P1^6;
uintT,negativeflag;
chartempH=70,tempL=10;//设置上下限温度,以便上下限温度(-10°C~120°C)可调
ucharnum[16];
ucharcodenum1[]="0123456789";
ucharcodetable[]="temperature:
";
voidFeng_led(uintt,uintn);//声明函数
voidDelayms(uintms)
{
uchari;
while(ms--)
{
for(i=0;i<120;i++);
}
}
voiddelay_18B20(uinti)//晶振12MHz
{
while(i--);
}
voidInit_DS18B20(void)//初始化函数
{
ucharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}
//读一个字节
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
voidWriteOneChar(uchardat)//写一个字节
{
uchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
uintReadTemperature(void)//读取温度并转换
{
uchara=0;
ucharb=0;
uintt=0,temp,result;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay_18B20(100);
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
temp=b;
temp=(temp<<8)+a;
negativeflag=(b&0xf8);//检查负标志
if(negativeflag==0)
{
num[0]=0x20;//“+”位不显示
result=temp*0.625;
}
else
{
num[0]=0x2d;//负号显示位
temp=~temp+1;
result=temp*0.625+0.5;
}
return(result);
}
/*****************LCD显示器的是否忙判定**********************/
ucharBusy_Check()
{
ucharLCD_Status;
P0=0x00;
RS=0;
RW=1;
EN=1;
Delayms
(1);
LCD_Status=P0;//rs=0,rw=1,db7=fb=1表示LCD忙碌无法接收数据或指令
EN=0;
returnLCD_Status;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
/*****************LCD显示器写指令**********************/
voidWrite_LCD_Command(ucharcmd)
{
while((Busy_Check()&0x80)==0x80);
RS=0;
RW=0;
EN=0;
P0=cmd;
EN=1;
Delayms
(1);
EN=0;
}
/*****************LCD显示器的初始化**********************/
voidInitialize_LCD()
{
Write_LCD_Command(0x38);/*db4=dl=1设置总线数位为8,否则为4位;db3=n=1显示两行,否则1行;db2=f=0=5*7点阵/每字符,1=5*10点阵/每字符*/
Delayms
(1);
Write_LCD_Command(0x01);//清屏
Delayms
(1);
Write_LCD_Command(0x06);/*db1=I/D=1写入新数据后光标右移,db0=s=0写
入新数据后显示屏不移动。
否则整体右移一个字*/Delayms
(1);
Write_LCD_Command(0x0c);/*db2=d=1显示功能开;db1=c=0无光标;db0=b=0光标闪烁*/
Delayms
(1);
}
/*****************LCD显示器的初始化写指令**********************/
voidWrite_LCD_Data(uchardat)
{
while((Busy_Check()&0x80)==0x80);
RS=1;//0输入指令,1输入数据
RW=0;//0向LCD写入指令或数据,1从LCD模块读取信息
EN=0;//使能信号,1读取信息,1转至0(下降沿)执行指令
P0=dat;//数据写入
EN=1;
Delayms
(1);
EN=0;
}
/*****LCD显示****/
voidShowString(ucharx,uchar*p)
{
uchari;
if(x==0)
{
Write_LCD_Command(0x80);
for(i=0;i<12;i++)
Write_LCD_Data(*p++);
}
if(x==1)
{
Write_LCD_Command(0xc0);
for(i=0;i<8;i++)
Write_LCD_Data(*p++);
}
}
//温度数据处理
voiddate_pro(inttemp)
{
num[1]=num1[temp/1000];//百位位
num[2]=num1[(temp%1000)/100];//十位位
num[3]=num1[((temp%1000)%100)/10];//小数位
num[4]=0x2e;//小数点
num[5]=num1[((temp%1000)%100)%10];//个位
num[6]=0xdf;//摄氏度符号
num[7]=0x43;
if(num[1]==0x30)
{num[1]=0x20;
if(num[2]==0x30){num[2]=0x20;}
}
}
/****************蜂鸣器及LED报警**************************/
voidFeng_led(uintt,uintn)
{
if((t>(tempH*10))&&(n==0))
{
led=0;
beep=0;
Delayms(100);
led=~led;
beep=1;
Delayms(10);
date_pro(t);
ShowString(0,table);
ShowString(1,num);
}
elseif((t>(tempL*10))&&(n!
=0))
{
beep=0;
Delayms(100);
led=~led;
beep=1;
Delayms(10);
date_pro(t);
ShowString(0,table);
ShowString(1,num);
}
else{led=0;beep=0;}
}
/*****************主函数**************************************/
voidmain(void)
{
beep=0;
Initialize_LCD();
while
(1)
{T=ReadTemperature();
date_pro(T);
ShowString(0,table);
ShowString(1,num);
Feng_led(ReadTemperature(),negativeflag);
Delayms(100);
//Write_LCD_Command(0x01);
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度 设计 实现