基于LM35的温度测量系统
- 格式:doc
- 大小:278.50 KB
- 文档页数:14
1 温度检测系统
本文介绍了一种温度传感器选用LM35、单片机选用AT89s52的温度测量系统。该系统的温度测量范围为0~100℃,可以精确到0.1,可适用于工业场合及日常生活中。
关键词:温度测量;范围1~100;精确0.1;
This text introduces a kind of temperature which consists of LM35 and AT89s52. The arrangement of this systerm is about 0~100℃, which can 0.1 . read It is suitable to be used in indurstries and people’s life.
2
目录
一 系统设计
1.1 设计指标
1.1.1 基本部分----------------------------------------------------3
1.1.2 发挥部分---------------------------------------------------3
二 单元电路设计
2.1 系统结构-------------------------------------------------------------4
2.2 温度传感器lm35电路设计------------------------------------4
2.3 lm741信号放大电路设计----------------------------------------5
2.4 A/D0809电路设计-----------------------------------------------6
2.5 单片机系统设计--------------------------------------------------7
三 程序c语言―――――――――――8
四 总结与感想―――――――――13
3
一 系统设计
1.1设计任务
设计一个温度检测装置,系统结构框图如下:
主控器能对温度进行检测和实时显示温度。具体设计制作任务是:
1 设计制作温度检测器
2 设计制作主控器
1.2、设计要求
基本要求
① 检测的温度范围:0℃~99℃
② 检测分辨率0.1℃
③ 温度检测元件不能使用专用的具有数字输出的产品(如DS18B20)。
1.3 发挥部分
① 能够设置上下限温度范围和超限报警功能。
② 提高温度检测器的测温范围和检测精度。
③ 语音播报温度。
④ 特色及创新。
被测温度 检测电路 主控器
显示器 键盘
A/D 4
二 单元电路设计
2.1 系统结构
本测温系统由温度传感器电路、信号放大电路、A/D转换电路、单片机系统、温度显示系统构成。其基本工作原理:温度传感器电路将测量到的温度信号转换成电压信号输出到信号放大电路,与温度值对应的电压信号经放大后输出至A/D转换电路,把电压信号转换成数字量送给单片机系统,单片机系统根据显示需要对数字量进行处理,再送温度显示系统进行显示。
2.2温度传感器电路 5
温度传感器采用的是LM35,他具有很高的工作精度和较宽的线性工作范围,他的输出电压与摄氏温度线性成比例,且无需外部校准或微调,可以提供±1/4℃的常用的室温精度。
LM35的输出电压与摄氏温度的线形关系可用下面公式表示,0℃时输出为0 V,每升高1℃,输出电压增加10 mV。其电源供应模式有单电源与正负双电源两种,其接法如图3与图4所示。正负双电源的供电模式可提供负温度的测量,单电源模式在25℃下电流约为50 mA,非常省电。本系统采用的是单电源模式。
2.3 lm741信号放大电路
由于温度传感器LM35输出的电压范围为0~0.99 V,虽然该电压范围在A/D转换器的输入允许电压范围内,但该电压信号较弱,如果不进行放大直接进行A/D转换则会导致转换成的数字量太小、精度低。系统中选用通用型放大器lm741对LM35输出的电压信号进行幅度放大,还可对其进行阻抗匹配、波形变换、噪声抑制等处理。系统采取同相输入,电压放大倍数为5倍,电路图如图5所示。
6
2.4 A/D0809转换电路
A/D转换电路选用8位AD转换器ADC0809。ADC0809是CMOS单片型逐次逼近式A/D转换器,可处理8路模拟量输入,且有三态输出能力。图5中运算放大器的输出电压V,送入ADC0809的模拟通道IN0。单片机AT89C52控制ADC0809的开始转换、延时等待A/D转换结束以及读出转换好的8位数字量至单片机进行处理。 7
2.5 单片机系统 8
三 程序c语言 9 3.1 系统软件设计以及分析
系统的软件部分用c语言编程,
#include
unsigned char code dispbitcode[]={0xFE,0xFD,0xFB,0XF7};
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char led[4];
unsigned char dispcount=0;
unsigned char getdata;
unsigned int temp;
unsigned char i;
sbit ST=P3^0;
sbit OE=P3^1;
sbit EOC=P3^2;
sbit clk=P3^3;
void main(void)
{
ST=0; //赋初值
OE=0; //赋初值
EA=1;
TMOD=0x12; 10 TH0=0x216;
TL0=0x216;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256; //为高低电平给值
TR1=1;
TR0=1;
ET0=1; //启动定时器0
ET1=1; //启动定时器1
ST=1; //与之前的ST=0形成正脉冲,启动数模转换
ST=0;
while(1)
{
unsigned int j=3000;
while(j--); //延时
if(EOC==1) //转换结束信号输出查询,说明转换结束
{
OE=1; //由低电平变高电平,允许输出数据
getdata=P1;//三态门打开,读出数据
OE=0; //赋初值
temp=getdata*100;
11 temp=temp/51; //temp*(5/255) ,恢复原始电压值
temp=temp*10; //本是*1000,但是由于超出了整形变量的值,所以这样处理
//即分两次乘,防止溢出
temp=temp/3; //原先用模拟的办法在外部放大3倍,所以现在除3
if(temp%10==6) //根据我在显示的统计规律,当第4位的变化规律是0、3、6
{ temp=1645; //当为0、3 时,整数部分显示准确
temp=temp+10; //当为6时,整数部分显示差1,所以我用程序弥补了不足
led[0]=temp/1000; //取千位
led[1]=temp%1000/100; //取百位
led[2]=temp%1000%100/10; //取十位
led[3]=temp%10; //取个位
ST=1; //启动数模转换
ST=0;
for(dispcount=0;dispcount<4;dispcount++)
{
P0=dispcode[led[dispcount]];//他段选赋给P1端口
P2=dispbitcode[dispcount];// 赋P2位选
} 12 }
}
}
}
void t0(void) interrupt 1
{clk=~clk;}
void t1(void) interrupt 3
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
P2=P2|0X0F; //消去余晖
if(dispcount==3)
{
P0=~0x39;
}
dispcount++; //数据自加
if(dispcount==4)
{ 13 dispcount=0; //赋初值
}
}
3.2 单片机内部数据处理模块
系统通过ADC0809转换的数字量是与实际温度成正比的数字量,但系统最后显示的是实际温度值,因此需要对数据进行处理再通过8255输出到LED显示。
设所测温度值为T,A/D转换后的数字量为X,则有:
VOUT=0.01 V/℃×T℃
VOUT为LM35的输出电压,即运放μA741的输入电压,μA741的输出电压用V1表示。因为μA741的放大倍数为5,则有:
V1=5×VOUT=0.05×T
根据系统设置,温度传感器输出电压0~5 V对应于转换后的数字量0~255,则有:
0.05T/5=X/255
可以近似写为: 0.05T/5=X/256
这样除以256可通过把被除数右移8位来实现,编程较简单。由此可以得出X和T的关系: