数字温度计.docx

上传人:b****6 文档编号:16589969 上传时间:2023-07-15 格式:DOCX 页数:16 大小:341.12KB
下载 相关 举报
数字温度计.docx_第1页
第1页 / 共16页
数字温度计.docx_第2页
第2页 / 共16页
数字温度计.docx_第3页
第3页 / 共16页
数字温度计.docx_第4页
第4页 / 共16页
数字温度计.docx_第5页
第5页 / 共16页
数字温度计.docx_第6页
第6页 / 共16页
数字温度计.docx_第7页
第7页 / 共16页
数字温度计.docx_第8页
第8页 / 共16页
数字温度计.docx_第9页
第9页 / 共16页
数字温度计.docx_第10页
第10页 / 共16页
数字温度计.docx_第11页
第11页 / 共16页
数字温度计.docx_第12页
第12页 / 共16页
数字温度计.docx_第13页
第13页 / 共16页
数字温度计.docx_第14页
第14页 / 共16页
数字温度计.docx_第15页
第15页 / 共16页
数字温度计.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数字温度计.docx

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

数字温度计.docx

数字温度计

电子系统

综合设计与仿真

 

题目:

数字温度计的设计

 

1课程设计目的

通过数字温度计的设计,使对温度传感器的应用有更深的理解,熟练protuse仿真软件的使用。

加深对51单片机应用的理解。

2课程设计的内容及要求

2.1数字温度计的设计内容

本设计要求设计一个测温范围为0℃到80℃的数字温度计,要求误差范围在

1℃以内,并用LCD1602进行结果的显示。

2.2数字温度计的设计要求

本次设计要求使用protuse软件进行仿真,画出仿真电路并编写相应的仿真程序。

设计报告书要求格式规范,层次合理,重点突出。

并附上涉及原理图及相应的源程序。

3总体设计方案

本设计以检测温度并较为精确的显示为目的,按照系统设计要求功能的要求,确定由四个模块组成:

主控器,测温电路,显示电路,开关电路。

系统以温敏电阻作为温度敏感器件,经过一个分压电路和ADC0808模数转换芯片,将温度模拟量转化为电压数字量以总线传入单片机。

以AT89C51为主芯片,在主芯片对ADC0808传入的温度值进行处理,由单片机程序控制,将处理后的温度由LCD1602显示屏进行显示。

开关控制电路的断开与连通。

3.1温度的检测

ADC0808将模拟温度信号经过采集,数字处理,放大后输出。

ADC0808采用八根数据端进行数据的并行输出,因此在单片机与ADC0808之间需要八根线链接。

3.2数字信号的处理

送入单片机内部的数字信号经过单片机的处理,将数据通过LCD1602显示出来。

其处理过程主要由单片机控制程序进行控制。

3.3温度显示电路

使用LCD1602液晶显示屏进行显示。

单片机将温度数据经处理后由P0.0~P0.7口输出到LCD。

LCD1602具有微功耗、体积小、显示内容丰富。

超薄轻巧等优点。

4硬件系统设计

4.1总体设计电路

温度计电路设计原理控制器使用单片机AT89C51,温度数据的模数转换芯片采用ADC0808,用LCD1602实现温度的显示。

电路还包括开关和单片机外设电路等。

整个系统的原理图如下:

4.2主控器AT89C51

AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

4.3显示电路

显示电路用LCD1602液晶进行显示。

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

其引脚图如下:

4.4测温电路

测温电路由一个分压电路和模数转换芯片组成。

分压电路由一个标称47K的温敏电阻和一个标称6.2K的分压电阻组成。

模数转换芯片选择的ADC0808。

4.4.1温敏电阻

热敏电阻器是敏感元件的一类,按照温度系数不同分为正温度系数热敏电阻器(PTC)和负温度系数热敏电阻器(NTC)。

热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值。

正温度系数热敏电阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件。

这里选择的是负温度系数额热敏电阻。

4.4.2ADC0808模数转换芯片

ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。

其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0808是ADC0809的简化版本,功能基本相同。

一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。

具体电路图如下:

4.1电阻R2阻值的确定

因为:

,所以,R2的取值对V的精度至关重要。

在R2和温度T不同的情况下对应RT分得的电压值如下表

T

0℃

10℃

20℃

40℃

60℃

80℃

90℃

100℃

125℃

10k

4.67

4.49

4.25

3.59

2.80

2.03

1.70

1.41

0.88

15k

4.52

4.27

3.95

3.15

2.30

1.57

1.29

1.05

0.63

18k

4.43

4.15

3.80

2.94

2.08

1.39

1.12

0.90

0.53

20k

4.38

4.07

3.70

2.81

1.95

1.28

1.03

0.83

0.49

现对上表作如下处理,测得同一R2不同温度时的对应压差。

RV

125--0

100--0

0--10

10--20

20--40

40--60

60--80

80--90

90--100

10K

3.79

3.26

0.18

0.24

0.66

0.79

0.77

0.33

0.29

15K

3.89

3.47

0.25

0.32

0.80

0.85

0.73

0.28

0.24

18K

3.90

3.53

0.28

0.35

0.86

0.86

0.69

0.27

0.22

20K

3.89

3.55

0.31

0.37

0.89

0.87

0.67

0.25

0.20

从上表格很容易得到如下结论:

1、T在0~100℃之间的电压差,在R2温度正值范围内的比例如下:

从T=125℃时表格数据显示,电压跨度在R2≈18KΩ最大。

即,当R2值超过18K后,电压所分布的范围减小,采样精度会降低。

从温度有效值(0~100℃)所占比例来看,R2为15K或18K左右时,对有效值的精度影响较小。

2.各阻值所对应各组数据的每10℃电压值跨度都是中间大,两边小。

即是,中间每摄氏度温差变化所对应的电压变化差值比两边大,分辨效果更好。

3.当R2为15KΩ时,T为0~20℃和80~100℃的电压值跨度基本相同,即是电压在这两区间分布均匀,其精度基本相当。

而其他几项前后相差较大。

电压精度不均匀。

综上,我们选择R2≈15KΩ。

4.2温敏电阻B值的计算

温敏电阻的B值遵循公式RT=R*EXP(B(1/T1-1/T2))。

RT:

温敏电阻在温度T1下的阻值

R:

温敏电阻在T2常温下的标称阻值

T1、T2:

开尔文温度,K度273.15(绝对温度)+摄氏度。

现测得如下数据:

温度

0

5

10

15

20

25

30

35

40

45

电压

4.519

4.405

4.273

4.124

3.956

3.774

3.578

3.371

3.157

2.940

温度

50

55

65

70

75

80

85

90

95

100

电压

2.723

2.509

2.302

2.103

1.915

1.739

1.576

1.426

1.288

1.163

根据表格,借助matlab计算B值为3641.8。

截图如下:

5软件系统设计

系统程序采用单片机C语言编写。

程序简洁,可靠性高,可维护性好。

代码见附录。

主程序流程图:

模数转化流程图

6数据测量与分析

6.1数据测量

环境温度(℃)

0

5

10

15

20

25

30

35

40

45

测得温度(℃)

0.49

4.76

9.97

15.19

19.89

24.74

30.25

34.99

40.04

45.00

环境温度(℃)

50

55

60

65

70

75

80

85

90

95

测得温度(℃)

49.96

55.00

60.19

65.12

69.80

74.78

80.16

84.70

89.64

95.08

6.2数据分析

由上表数据表明,最大误差0.49℃,最小误差0,误差均值0.1695℃。

温度范围内,0~20℃和80~100℃误差大于中间温度误差,这与上面得出的结论是一致的。

温度产生误差原因在于信号电压输入端电压值的分辨率不高,采用电压源输入的方式,很难得到精确的温度值。

6.3电路改进

电路改进的方向就是提高输入电压精度。

而电压源是很难满足这一要求的,所以,在这应考虑用恒流源来处理。

假如给恒流源一个I=1MA的电流,然后再用1KΩ的热敏电阻加到恒流源上,这样电压就很好控制了。

V=I*RT.

则,当RT为

KΩ时,其电压值就为

),最大为1V,这大大提高了分辨率,使得到的温度值更加精确。

7参考文献

ADC0809用户手册

LCD1602用户手册

XX搜索引擎

 

附录:

1ADC0809.c

#include

#include

#include

#include"ADC0808.h"

unsignedlongdat_adc0808;

uchardisplay_buffer[][16]={

{"CurrentTemp:

"},

{"(T)=00.00C"}

};

voiddelay50us(uintm)

{

uintn,k;

for(n=m;n>0;n--)

for(k=25;k>0;k--);

}

uintadc0808_init()//AD初始化

{

START=0;

OE=0;

START=1;

START=0;

while(EOC==0);

OE=1;

dat_adc0808=P1;

OE=0;

returndat_adc0808;

}

//计算温度

floattemperature()

{

floatf,t,V;

V=(dat_adc0808*5.0/255);

f=0.003354016+0.0002745*log(0.32464*V/(5.0-V));

t=1.0/f-273.15;

returnt;

}

voidRefresh_show()//刷新显示

{

uintt;

t=temperature()*100;

display_buffer[1][7]=t/1000+'0';

display_buffer[1][8]=t%1000/100+'0';//整数位

display_buffer[1][10]=t%100/10+'0';//两个小数位

display_buffer[1][11]=t%100%10+'0';

}

2.ADC0809.h

#ifndef__ADC0808_H__

#define__ADC0808_H__

#include

#definedata_portP1

#defineucharunsignedchar

#defineuintunsignedint

sbitSTART=P2^3;

sbitEOC=P2^4;

sbitOE=P2^5;

voiddelay50us(uintm);//延时

uintadc0808_init();//AD初始化

voidRefresh_show();

#endif

3.LCD1602.C

//液晶控制与显示驱动程序

#include

#include

#include

#include"LCD1602.h"

#include"ADC0808.h"

//---------------忙检查-------------------//

ucharLCD_Busy_Check()

{

ucharLCD_Status;

RS=0;

RW=1;

E=1;

delay4us();

LCD_Status=P0;

E=0;

returnLCD_Status;

}

//--------------向LCD写入命令--------------------//

voidWrite_LCD_Command(ucharcmd)

{

while((LCD_Busy_Check()&0x80)==0x80);//忙等待

RS=0;

RW=0;

E=0;

P0=cmd;

delay4us();

E=1;

delay4us();

E=0;

}

//-----------向LCD写入一个字节的数据函数-----------------*/

voidWrite_LCD_Data(uchardat)

{

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

RS=1;

RW=0;

E=0;

P0=dat;

delay4us();

E=1;

delay4us();

E=0;

}

//-----------LCD初始化-----------------*/

voidInitialize_LCD1602()//液晶初始化函数

{

Write_LCD_Command(0x38);delay50us(10);//功能设置,数据长度为8位,双行显示,5×7点阵字体

Write_LCD_Command(0x0C);delay50us(10);//显示开,关光标

Write_LCD_Command(0x06);delay50us(10);//字符进入模式:

屏幕不动,字符后移

Write_LCD_Command(0x01);delay50us(10);//清屏

}

//-----------在LCD上显示字符串-----------------*/

voidLCD_Display(uchar*str)

{

uchari;

for(i=0;i

{

Write_LCD_Data(str[i]);

delay50us(100);

}

}

4.LD1602.h

#ifndef__LCD1602_H__

#define__LCD1602_H__

#include

#definedat_portP0

#defineucharunsignedchar

#defineuintunsignedint

#definedelay4us(){_nop_();_nop_();_nop_();_nop_();}

sbitRS=P2^0;//RS=1数据RS=0命令

sbitRW=P2^1;//RW=1读取RW=0写入

sbitE=P2^2;//E使能信号

ucharLCD_Busy_Check();//忙检查

voidWrite_LCD_Command(ucharcmd);//向LCD写入命令

voidWrite_LCD_Data(uchardat);//向LCD写入一个字节的数据函数

voidInitialize_LCD1602();//液晶初始化函数

voidLCD_Display(uchar*str);//在LCD上显示字符串

#endif

5.Main.c

#include

#include

#include"LCD1602.h"

#include"ADC0808.h"

sbitCLOCK=P2^6;

externuchardisplay_buffer[][16];

voidmain()

{

TMOD=0x02;

TH0=0x14;

TL0=0x00;

IE=0x82;

TR0=1;

Initialize_LCD1602();

delay50us(10);

Write_LCD_Command(0x80);//设置显示的初始位置

LCD_Display(display_buffer[0]);//显示"Thevoltageis:

"

while

(1)

{

adc0808_init();

Refresh_show();

Write_LCD_Command(0xC0);//设置显示的初始位置

LCD_Display(display_buffer[1]);//显示测得的数据

}

}

voidTimer0_INT()interrupt1

{

CLOCK=!

CLOCK;

}

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2