数字温度计.docx

上传人:b****8 文档编号:9992181 上传时间:2023-02-07 格式:DOCX 页数:25 大小:138.97KB
下载 相关 举报
数字温度计.docx_第1页
第1页 / 共25页
数字温度计.docx_第2页
第2页 / 共25页
数字温度计.docx_第3页
第3页 / 共25页
数字温度计.docx_第4页
第4页 / 共25页
数字温度计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数字温度计.docx

《数字温度计.docx》由会员分享,可在线阅读,更多相关《数字温度计.docx(25页珍藏版)》请在冰豆网上搜索。

数字温度计.docx

数字温度计

电子技术综合设计

总结报告

 

设计题目:

数字温度计

数字温度计

设计任务与要求

1、基本范围-20℃——125℃

2、精度误差小于0.5℃,并且还可以通过需要来调整分辨率

3、LED数码直读显示

4、可以任意设定温度的上下限报警功能.

方案比较与选择

单片机芯片的选取:

方案一.

采用89C51芯片作为硬件核心,利用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

方案二:

采用AT89C51单片机与MCS-51系列单片机相比有两大优势:

第一,片内程序存储器采用闪存,使程序的写入更加方便;第二,提供了更小尺寸的芯片,使整个硬件电路的体积更小,且管脚数目为20个,与MCS-51相比减少一倍,使理解更容易。

综上所述:

本课设中单片机芯片采用AT89C51。

温度传感器的选取:

方案一:

采用热敏电阻传感器。

利用热敏电阻随温度变化而显著变化,能直接将温度的变化转换为能量的变化,进而制成温度计。

但是其测温传感器比较复杂,而且不易通过编制程序来控制测温精度,增大系统设计的难度。

方案二

直接使用数字温度传感器来测温,可以使用“一线总线”数字化温度传感器DS18B20。

此传感器可以直接读取被测温度值,只需进行简单转换,就可以得到所测环境的温度值。

显示电路采用串口移位静态显示方式,采用串入并出移位芯片74LS164和数码管来实现温度的显示。

方案三:

采用DS18B20温度传感器。

DS18B20的内部3脚(或8脚)封装;使用特有的温度测量技术,将被测温度转换成数值信号;3.0~5.5V的电源供电方式和寄生电源供电方式;ROM由64位二进制数字组成,共分为8个字节;RAM由9个字节的高速暂存器和非易失性电擦写ROM组成。

综上所述:

温度传感器选取智能测温器件DS18B20。

本设计显示电路采用1602液晶显示模块芯片。

3系统最终设计方案:

综上各方案所述,对此次课设的方案选定:

采用AT89C51作为主控制系统;1602液晶显示模块芯片作为温度数据显示装置;而智能温度传感器DS18B20器件作为测温电路主要组成部分。

至此,系统最终方案确定。

电路设计

温度计电路设计总体设计方框图如图所示,控制器采用单片机AT89C51,温度传感器采用DS18B20,用1602液晶显示屏以串口传送数据实现温度显示。

1硬件电路框图:

图 总体设计方框图

2硬件电路概述:

系统由单片机最小系统、显示电路、按键、温度传感器等组成。

本电路是由AT89C2051单片机为控制核心,具有与MCS-51系列单片机完全兼容,程序加密等功能,带2KB字节可编程闪存,工作电压范围为2.7~6V,全静态工作频率为0~24MHZ;显示电路由1602液晶显示模块芯片,可以进行多行显示;温度报警按键设为五个,可以显示华氏温度,调节高低报警温度;温度传感器电路主要由DS18B20测温器件构成,该器件主要功能有:

采用单总线技术;每只DS18B20具有一个独立的不可修改的64位序列号;低压供电,电源范围为3~5V;测温范围为-20℃~+125℃,误差为±0.5℃;复位电路是10K电阻构成的上电自动复位。

3.主控电路

AT89C51

晶振电路

复位电路

4显示电路

本设计显示电路采用1602液晶显示模块芯片,该芯片可现实16x2个字符,比以前的七段数码管LED显示器在显示字符的数量上要多得多。

另外,由于1602芯片编程比较简单,界面直观,因此更加易于使用者的操作和观测。

1602A芯片的接口信号说明如下表:

1602A芯片的接口信号说明

液晶显示电路

5报警温度调节电路

本系统一共设置了五个按键,k1键只是显示华氏温度,k4键按下不松开显示高低报警温度,松开后恢复显示正常温度,k2键和k3键是分别用来调节高低报警温度,k键控制调节时的上调或下调。

具体调节如将高温报警温度调高,第一步将k4键按下不松,k键升起位置,调节k2键,则高温报警温度向上增加,反之亦然。

低温报警同理。

图报警点调节电路

6温度传感器及DS18B20测温原理

DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9-12位的数字值读数方式。

DS18B20的性能特点如下:

(1)独特的单线接口仅需要一个端口引脚进行通信,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

(2)DS18B20支持多点组网功能,多个DS18B20可以并联在惟一的三线上,实现多点组网测温;

(3)无须外部器件,全部传感元件及转换电路集成在形如一只三极管的集成电路内;

(4)可通过数据线供电,电压范围为3.0-5.5V;

(5)零待机功耗;

(6)温度以9或12位数字,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温;

(7)用户可定义报警设置;

(8)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;

(9)负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;

(10)测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力

DS18B20采用3脚PR35封装或8脚SOIC封装,其引脚排列及内部结构框图如图及测温原理图如下所示:

图引脚排列

图内部结构框图

 

图DS18B20测温原理图

64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。

温度报警触发器TH和TL,可通过软件写入户报警上下限。

DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。

高速暂存RAM的结构为8字节的存储器,结构如图4所示。

头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。

第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。

DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。

该字节各位的定义如图5所示。

低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户不要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。

温度LSB

温度MSB

TH用户字节1

TL用户字节2

配置寄存器

保留

保留

保留

CRC

TM

R1

R0

1

1

1

1

1

图5DS18B20的字节定义

DS18B20的分辨率定义如表1所示

表1分辨率设置表

R0

R1

分辨率

最大温度转移时间

0

0

9位

96.75ms

0

1

10位

187.5ms

1

0

11位

375ms

1

1

12位

750ms

由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。

因此,在实际应用中要将分辨率和转换时间权衡考虑。

主机控制DS18B20完成温度转换过程是:

每一次读写之前都要对DS18B20进行复位,即将数据总线下拉500us,然后释放,DS18B20收到信号后等待16-60us左右,之后发出60-240us的存在低脉冲,主CPU收到此此信号表示复位成功;复位成功后发送一条ROM指令,然后发送RAM指令,这样才能对DS18B20进行预订的读写操作。

表2ROM指令集

指令

约定代码

功能

读ROM

33H

读DS18B20中的编码

符合ROM

55H

发出此命令后,接着发出64位ROM编码,访问单线总线上与该编辑相对应的DS18B20使之做出响应,为下一步对该DS18B20的读写作准备

搜索ROM

0F0H

用于确定挂接在同一总线上的DS18B20个数和识别64位ROM地址,为操作各器件作准备

跳过ROM

0CCH

忽略64位ROM地址,直接向DS18B20发送温度变换指令

告警搜索命令

0ECH

执行后,只有温度跳过设定值上限或下限的片子才能做出反应

表3RAM指令集

指令

约定代码

功能

温度转换

44H

启动DS18B20进行温度转换

读暂存器

0BEH

读暂存器9个字节内容

写暂存器

4EH

将数据写入暂存器的TH、TL字节

复制暂存器

48H

把暂存器的TH、TL字节写到E2RAM中

重调E2RAM

0B8H

把E2RAM中的TH、TL字节写到暂存器TH、TL字节

读供电方式

0B4H

启动DS18B20发送电源供电方式的信号给主CPU

DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。

器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。

计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将最低温所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在最低温所对应的一个基数值。

减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。

其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。

测温电路

6.系统总原理图

 

程序设计

#include

#include//shiyongyanshi

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P3^3;

sbitRS=P2^0;

sbitRW=P2^1;

sbitEN=P2^2;

sbitk=P1^0;

sbitk1=P1^4;

sbitk2=P1^5;

sbitk3=P1^6;

sbitk4=P1^7;

sbitled_red=P2^5;

sbitled_blue=P2^6;

sbitBEEP=P3^7;

ucharbz=1;

//BEEP=0;

ucharng=0;//fuhaobiaoshiwei

ucharTempBuffer[]={"TEMP:

"};

inttemp_value;//温度值

ucharcodedis_title[]={"--currenttemp--"};

voidxianshi_huashi();

uchargw=40;

chardw=10;

ucharxianshi_title[]={"TEMPALARM"};

ucharxianshi_baojing[]={"HI:

LO:

"};//34510``12

//----------------延时--------------------------------

voiddelayxus(uintx)

{

uchari;

while(x--)for(i=0;i<200;i++);

}

//*********************LCD控制********************

//读lcd状态

ucharread_lcd_state()

{

ucharstate;

RS=0;RW=1;EN=1;delayxus

(1);state=P0;EN=0;delayxus

(1);

returnstate;

}

//忙等待

voidlcd_busy_wait()

{

while((read_lcd_state()&0x80)==0x80);

delayxus(5);

}

//向LCD写数据

voidwrite_lcd_data(uchardat)

{

lcd_busy_wait();

RS=1;RW=0;EN=0;P0=dat;EN=1;delayxus

(1);EN=0;

}

//向LCD写指令

voidwrite_lcd_cmd(ucharcmd)

{lcd_busy_wait();

RS=0;RW=0;EN=0;P0=cmd;EN=1;delayxus

(1);EN=0;

}

//-----------------------------------------------------------------------------------------------------

//LCD初始化

voidinit_lcd()

{

write_lcd_cmd(0x38);delayxus

(1);

write_lcd_cmd(0x01);delayxus

(1);

write_lcd_cmd(0x06);delayxus

(1);

write_lcd_cmd(0x0C);delayxus

(1);

}

//-----------------------------------------------

//设置液晶显示位置

voidset_lcd_pos(ucharp)

{

write_lcd_cmd(p|0x80);

}

//---------------------------------------

//在LCD上显示字符串

voiddis_lcd_string(ucharp,uchar*s)//位置,字符指针

{

uchari;

set_lcd_pos(p);

for(i=0;i<16;i++)//16*2

{

write_lcd_data(s[i]);

delayxus

(1);

}

}

//-------------------------------------------------------------------

voiddelay_18B20(unsignedinti)

{

while(i--);

}

//--------------------蜂鸣器---------------------------

voidbeep()

{

uchari;

for(i=0;i<100;i++)

{

delayxus

(1);

BEEP=~BEEP;

}

BEEP=1;

}

//延时2

voiddelay2(uintx)

{

while(--x);

}

//==================================================

//初始化DS!

*

/**********ds18b20初始化函数**********************/

voidInit_DS18B20(void)

{

unsignedcharx=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);

}

/***********ds18b20读一个字节**************/

ucharReadOneChar(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);

}

/*************ds18b20写一个字节****************/

voidWriteOneChar(uchardat)

{

unsignedchari=0;

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

{

DQ=0;

DQ=dat&0x01;

delay_18B20(5);

DQ=1;

dat>>=1;

}

}

/**************读取ds18b20当前温度************/

voidReadTemp(void)

{

unsignedchara=0;

unsignedcharb=0;

unsignedchart=0;

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0x44);//启动温度转换

delay_18B20(100);//thismessageisweryimportant

Init_DS18B20();

WriteOneChar(0xCC);//跳过读序号列号的操作

WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度

delay_18B20(100);

a=ReadOneChar();//读取温度值低位aaaaaaaaaaaaaaaaaaaa

b=ReadOneChar();//读取温度值高位bbbbbbbbbbb.a

temp_value=b<<4;

temp_value+=(a&0xf0)>>4;

}

voidtemp_to_str()//温度数据转换成液晶字符显示

{

if((temp_value&0xE0)==0xE0)

{

temp_value=~temp_value+1;

ng=1;

}

else

ng=0;

if(k1==0){//while(k1==0);

bz=(bz+1)%2;}

if(bz==0)

{

temp_value=(int)(temp_value)*(9.0/5.0)+32;

}

if(ng==1)

{

TempBuffer[9]=temp_value/100+'0';

if(TempBuffer[9]='')

TempBuffer[9]='-';

TempBuffer[10]=temp_value%100/10+'0';//十位

TempBuffer[11]=temp_value%10+'0';//个位

TempBuffer[12]=0xdf;//温度符号

TempBuffer[13]='C';

TempBuffer[14]='\0';

//TempBuffer[1]=ng%10+'\0';

}

if(ng==0)

{

TempBuffer[9]=temp_value/100+'0';

if(temp_value/100==0)TempBuffer[9]='';

TempBuffer[10]=temp_value%100/10+'0';//十位

if(temp_value%100/10==0)TempBuffer[10]='';

TempBuffer[11]=temp_value%10+'0';//个位

//if(temp_value%10==0)TempBuffer[11]='';

TempBuffer[13]='C';//温度符号

if(bz==0)TempBuffer[13]='F';

TempBuffer[14]='\0';

//TempBuffer[1]=ng%10+'\0';

}

}

voidDelay1ms(unsignedintcount)

{

unsignedinti,j;

for(i=0;i

for(j=0;j<120;j++);

}

/*延时子程序*/

voidmdelay(uintdelay)

{uinti;

for(;delay>0;delay--)

{

for(i=0;i<62;i++);//1ms延时.

}

}

voidshow_time()//液晶显示程序

{

ReadTemp();

//开启温度采集程序

temp_to_str();//温度数据转换成液晶字符

dis_lcd_string(0x40,TempBuffer);//显示温度

dis_lcd_string(0x00,dis_title);//

Delay1ms(400);//扫描延时

}

voidxianshi_dw()

{

if(dw>=0)

{xianshi_baojing[3]=gw/100+'0';

xianshi_baojing[4]=gw%100/10+'0';

xianshi_baojing[5]=gw%10+'0';

xianshi_baojing[10]=dw/100+'0';

xianshi_baojing[11]=dw%100/10+'0';

xianshi_baojing[12]=dw%10+'0';

dis_lcd_string(0x00,xianshi_title);

dis_lcd_string(0x40,xianshi_baojing);

}

else

if(dw<0)

{

xianshi_baojing[3]=gw/100+'0';

xianshi_baojing[4]=gw%100/10+'0';

xianshi_baojing[5]=gw%10+'0';

xianshi_baojing[10]='-';

xianshi_baojing[11]=abs(dw)%100/10+'0';

xianshi_baojing[12]=abs(dw)%10+'0';

dis_lcd_string(0x00,xianshi_ti

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1