数字温度计
温度产生误差原因在于信号电压输入端电压值的分辨率不高,采用电压源输入的方式,很难得到精确的温度值。
6.3 电路改进
电路改进的方向就是提高输入电压精度。而电压源是很难满足这一要求的,所以,在这应考虑用恒流源来处理。
假如给恒流源一个I=1MA的电流,然后再用1KΩ的热敏电阻加到恒流源上,这样电压就很好控制了。
V = I*RT.
则,当RT为 KΩ时,其电压值就为 ),最大为1V,这大大提高了分辨率,使得到的温度值更加精确。
7参考文献
ADC0809用户手809.c
#include<reg52.h>
#include <intrins.h>
#include <math.h>
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
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
#include "ADC0808.h"
unsigned long dat_adc0808;
uchar display_buffer[][16]={
{" Current Temp: "},
{" (T) = 00.00C"}
};
void delay50us(uint m)
{
uint n,k;
for(n=m;n>0;n--)
{
float f,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;
return t;
}
void Refresh_show()//刷新显示
{
uint t;
ADC0808将模拟温度信号经过采集,数字处理,放大后输出。ADC0808采用八根数据端进行数据的并行输出,因此在单片机与ADC0808之间需要八根线链接。
3.2数字信号的处理
送入单片机内部的数字信号经过单片机的处理,将数据通过LCD1602显示出来。其处理过程主要由单片机控制程序进行控制。
3.3温度显示电路
4.4.1温敏电阻
热敏电阻器是敏感元件的一类,按照温度系数不同分为正温度系数热敏电阻器(PTC)和负温度系数热敏电阻器(NTC)。热敏电阻器的典型特点是对温度敏感,不同的温度下表现出不同的电阻值。正温度系数热敏电阻器(PTC)在温度越高时电阻值越大,负温度系数热敏电阻器(NTC)在温度越高时电阻值越低,它们同属于半导体器件。这里选择的是负温度系数额热敏电阻。
电子系统
综合设计与仿真
题目:数字温度计的设计
1课程设计目的
通过数字温度计的设计,使对温度传感器的应用有更深的理解,熟练protuse仿真软件的使用。加深对51单片机应用的理解。
2课程设计的内容及要求
2.1数字温度计的设计内容
本设计要求设计一个测温范围为0℃到80℃的数字温度计,要求误差范围在 1℃以内,并用LCD1602进行结果的显示。
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';
4.3显示电路
显示电路用LCD1602液晶进行显示。
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。
#include <intrins.h>
#include <string.h>
#include "LCD1602.h"
#include "ADC0808.h"
//---------------忙检查-------------------//
uchar LCD_Busy_Check()
{
uchar LCD_Status;
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不同温度时的对应压差。
R V
125--0
100--0
0--10
10--20
系统以温敏电阻作为温度敏感器件,经过一个分压电路和ADC0808模数转换芯片,将温度模拟量转化为电压数字量以总线传入单片机。以AT89C51为主芯片,在主芯片对ADC0808传入的温度值进行处理,由单片机程序控制,将处理后的温度由LCD1602显示屏进行显示。开关控制电路的断开与连通。
3.1温度的检测
4.2主控器AT89C51
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
RS = 0;
RW = 1;
E = 1;
delay4us();
LCD_Status = P0;
E = 0;
return LCD_Status;
}
//--------------向LCD写入命令--------------------//
void Write_LCD_Command(uchar cmd)
系统程序采用单片机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
环境温度(℃)
2.各阻值所对应各组数据的每10℃电压值跨度都是中间大,两边小。即是,中间每摄氏度温差变化所对应的电压变化差值比两边大,分辨效果更好。
3.当R2为15KΩ时,T为0~20℃和80~100℃的电压值跨度基本相同,即是电压在这两区间分布均匀,其精度基本相当。而其他几项前后相差较大。电压精度不均匀。
综上,我们选择R2≈15KΩ。
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左右时,对有效值的精度影响较小。
{
while((LCD_Busy_Check()& 0x80)==0x80);//忙等待
RS = 0;
RW = 0;
E = 0;
P0 = cmd;
delay4us();
E = 1;
delay4us();
E = 0;
}
//-----------向LCD写入一个字节的数据函数-----------------*/
}
2.ADC0809.h
#ifndef __ADC0808_H__
#define__ADC0808_H__
#include <reg52.h>