✅ 操作成功!

温度测量

发布时间:2023-06-13 作者:admin 来源:文学

温度测量

温度测量

-

2023年3月19日发(作者:顺丰月结管家)

1/19

温度测量系统

1.1系统概要

1.1.1引言

温度是表征物体冷热程度的物理量。温度通过物体随温度变化的某些特性来

间接测量。温度的测量和控制在激光器、光纤光栅的使用及其他的工农业生产和

科学研究中应用广泛。温度检测的传统方法是使用诸如热电偶、热电阻、半导体

PN结之类的模拟温度传感器。信号经取样、放大后通过模数转换,再交自单片

机处理。被测温度信号从温敏元件到单片机,经过众多器件,易受干扰、不易控

制且精度不高。因此,本设计介绍了一种温度传感器选用LM35、单片机选用

MC908GP32的温度测量系统。它能通过与单片机,完成温度采集和数据处理。该

系统的温度测量范围为0~99℃,可以精确到一位小数,可适用于工业场合及日

常生活中[6]。

1.1.2系统结构分析

本测温系统由温度传感器电路、信号放大电路、A/D转换电路、单片机系

统、温度显示系统构成,如图1所示。其基本工作原理:温度传感器电路将测量

到的温度信号转换成电压信号输出到信号放大电路,与温度值对应的电压信号经

放大后输出至A/D转换电路,把电压信号转换成数字量送给单片机系统,单片

机系统根据显示需要对数字量进行处理,再送温度显示系统进行显示。如图2

所示[2]。

1.2硬件电路设计

1.2.1硬件电路图

温度传

感器电路

信号

放大电路

A/D

转换电路

单片机

系统

温度

显示系统

图1测温系统的原理框图

2/19

1.2.2温度传感器电路

温度传感器采用的是NS公司生产的LM35,它具有很高的工作精度和较宽的

线性工作范围,它的输出电压与摄氏温度线性成比例,且无需外部校准或微调,

可以提供±1/4℃的常用的室温精度。LM35的输出电压与摄氏温度的线形关系

可用下面公式表示,0℃时输出为0V,每升高1℃,输出电压增加10mV。其电

源供应模式有单电源与正负双电源两种,其接法如图3与图4所示。正负双电源

的供电模式可提供负温度的测量,单电源模式在25℃下电流约为50mA,非常省

电。本系统采用的是单电源模式。

1.2.3信号放大电路

由于温度传感器LM35输出的电压范围为0~0.99V,虽然该电压范围在A

/D转换器的输入允许电压范围内,但该电压信号较弱,如果不进行放大直接进

行A/D转换则会导致转换成的数字量太小、精度低。系统中选用通用型放大器

μA741对LM35输出的电压信号进行幅度放大,还可对其进行阻抗匹配、波形变

3/19

换、噪声抑制等处理。系统采取同相输入,电压放大倍数为5倍,电路图如图5

所示[5]。

1.2.4A/D转换模块

A/D转换模块(AnalogToDigitalConvertModule),即模数转换,是将电

压信号转换为对应的数字信号。

1.2.4.1进行A/D转换的基本问题:

(1)采样精度数字量变化一个最小量时模拟信号的变化量,即采样位数。

(2)采样速率完成一次A/D采样所要花费的时间。

(3)滤波对采样的数据进行筛选去掉误差较大的毛刺。

(4)物理量回归把A/D采样值与实际物理量对应起来。

1.2.4.2A/D转换模块的基本编程方法

(1)A/D转换初始化对ADCLK写入控制字节,决定时钟输入源是内部总线

还是外部晶振,决定分频系数等。

(2)启动A/D转换对ADSCR写入控制字节,选取要转换的通道、决定转

换结束数据获取的方式、设置是连续转换还是一次转换等。

(3)获A/D转换结果若是中断方式,在A/D中断程序中取得,若是查询方

式,通过ADSCR的第7位(COCO位)取得,当COCO=1时可从ADR中取数。

1.2.4.3A/D芯片TCL2543概述

(1)TLC2543的引脚说明

4/19

图6TLC2543引脚图

(2)TLC2543的编程要点,控制字的格式控制字为从DATAINPUT端串行

输入TLC2543芯片内部的8位数据,它告诉TLC2543要转换的模拟量通道、转换

后的输出数据长度、输出数据的格式。

(3)TLC2543的内部寄存器,输入数据寄存器存放从DATAINPUT端移入

的控制字。输出数据寄存器存放转换好的数据,以供从DATAOUT端移出。转换

过程上电后,片选CS必须从高到低,才能开始一次工作周期,此时EOC为高,

输入数据寄存器被置0,输出数据寄存器内容是随机的。开始时,片选CS为高,I/O

CLOCK、DATAINPUT被禁止,DATAOUT呈高阻态,EOC为高。使CS变低,I/OCLOCK、

DATAINPUT使能,DATAOUT脱离高阻态。12个时钟信号从I/OCLOCK端依次加

入,控制字从DATAINPUT一位一位地在时钟信号的上升沿时被送入TLC2543(高

位先送入),同时上一周期转换的A/D数据,即输出数据寄存器中的数据从DATA

OUT一位一位地移出。TLC2543收到第4个时钟信号后,通道号也已收到,因此,

此时TLC2543开始对选定通道的模拟量进行采样,并保持到第12个时钟的下降

沿。在第12个时钟下降沿,EOC变低,开始对本次采样的模拟量进行A/D转换,

转换时间约需10μs,转换完成EOC变高,转换的数据在输出数据寄存器中,待

下一个工作周期输出。此后,可以进行新的工作周期。

(4)TLC2543与MCU的接口方法,TLC2543与微处理器芯片的接口部分有五

个引脚,分别是:时钟输入(I/OCLOCK)、串行控制字输入(DATAINPUT)、片选输

入(CS)、A/D转换串行数据输出(DATAOUTPUT)、转换结束电平输出(EOC)。经

5/19

分析TLC2543的工作时序,可以通过软件估计转换结束,免去EOC接线。TLC2543

与具有SPI或相同接口能力的MCU可以直接连接,对于没有SPI接口的MCU可以

通过软件编程合成SPI操作。扩展电路设计,SPI模块与TLC2543的接口扩展。

如下图[1]。

1.2.5单片机系统

单片机选用的是Freescale公司的MC908GP32,主要完成对A/D转换电路

的控制、对转换后的数字量的处理以及对显示模块的控制,并且为ADC0809提供

工作时钟。其具体连接电路。如图2所示。

1.2.5.1MC908GP32单片机性能概述

MC908GP32有40脚、42脚、44脚三种封装形式;MC908GP32的主要特点概

述如下:

(1)512B片内RAM;32K片内Flash程序存储器,具有在线编程能力和保

密功能

(2)时钟发生器模块,具有32KHz晶振PLL电路,可产生各种工作频率;

8MHz内部总线频率

图7基于SPI的A/D转换扩展电路

MC908GP32

PTC0

MISO

MOSI

SPSCK

PTC1

TLC2543(第0片)

AIN0

CS

DATA

模拟量输入

TLC2543(第1片)

AIN0

CS

DATA

TLC2543(第2片)

AIN0

CS

DATA

6/19

(3)系统保护特性:计算机工作正常(COP)复位;低电压检测复位,可选

为3V或5V操作;非法指令码检测复位;非法地址检测复位。

(4)优化用于控制应用;优化支持C语言。

(5)33根通用I/O脚,包括26根多功能I/O脚和5或7根专用I/O脚;

PTA、PTC和PTD的输入口有可选择的上拉电阻;PTC0—PTC4有15mA吸流和放流

能力,其他口有10mA吸流和放流能力(总体驱动电流应小于150mA);所有口有

最高5mA输入电流保护功能

(6)增强型串行通讯口SCI;串行外围接口SPI;两个16位双通道定时器

接口模块(TIM1和TIM2),每个通道可选择为输入捕捉、输出比较和PWM,其时

钟可分别选为内部时钟的1、2、4、8、6、32和64的分频值;带时钟预分频的

定时基模块有8种周期性实时中断(1、4、16、256、512、1024、2048和4096Hz),

可在STOP方式时使用外部32KHz晶振周期性唤醒CPU;8位键盘唤醒口。

1.2.5.2MC908GP32结构框图(44Pin)

图8MC908GP32结构图

7/19

1.2.5.3GP32内部有以下主要部分:

存储器定时接口模块定时基模块看门狗模块

断点模块串行通信接口SCI串行外设接口SPI并行I/O接口

A/D转换模块键盘中断模块系统设置模块低电压禁止模块CPU08

时钟发生模块及锁相环电路复位与中断模块监控模块MON

1.2.5.4GP32最小系统

硬件结构,但仅有一个MCU是无法工作的,它必须与以MC908GP32单片机为

原型的HC08系列MCU的其他相应的外围电路一起,才能构成一个最小系统。

MC908GP32芯片(以40脚封装为例)最小系统的外围支撑电路包括电源与滤波电

路、晶振电路和复位电路。

1.2.5.5MC908GP32最小系统电路图

图9MC908GP32最小系统电路图

1.2.5.6MC908GP32CB核心板实物图

8/19

图10MC908GP32CB核心板实物图

1.2.6温度显示系统

该温度显示系统较为简单,由可编程并行输入输出芯片8255A的A,B,C

端口外接3个8段LED显示器来实现。MC908GP32的P2.6为8255提供片选信号,

74LS373的Q7,Q6接8255的A1,A0,可得到8255的A,B,C及控制口的地址

为BF3FH,BF7FH,BFBFH,BFFFH。MC908GP32处理好的温度数据输出至8255,

并由MC908GP32对8255编程控制其A,B,C端口输出高电平或低电平,以便从

8段LED显示器显示实际温度。8段LED显示器选用共阳极,8255的A,B,C端

口与8段LED显示器之间接限流电阻,图2中只画出了PA口,PB,PC口的接法

类似[4]。

1.2.7异步串行通信的格式

SCI通常采用NRZ数据格式,即:standardnon-return-zeromark/space

dataformat,译为:“标准不归零传号/空号数据格式”。“不归零”的最初含

义是:用正、负电平表示二进制值,不使用零电平。“mark/space”即“传号/

空号”分别是表示两种状态的物理名称,逻辑名称记为“1/0”。

1.2.7.1RS-232C总线标准

MON08接口

Core1

Core2

GP32最小系统

Core3

Core4

电源开关

晶振开关

9/19

(1)MCU引脚一般输入/输出使用TTL电平,而TTL电平的“1”和“0”的

特征电压分别为2.4V和0.4V,适用于板内数据传输。为了使信号传输得更远,

美国电子工业协会EIA(ElectronicIndustryAssociation)制订了串行物理

接口标准RS-232C。RS-232C采用负逻辑,-3V~-15V为逻辑“1”,+3V~+15V

为逻辑“0”。RS-232C最大的传输距离是30m,通信速率一般低于20Kbps。

(2)RS-232接口,简称“串口”,它主要用于连接具有同样接口的室内

设备。目前几乎所有计算机上的串行口都是9芯接口。下图给出了9芯串行接口

的排列位置,相应引脚含义见下表[3]

图119芯串行接口排列图

表19芯串行接口引脚含义表

引脚号功能引脚号功能

1

2

3

4

5

接收线信号检测(载波检测DCD)

接收数据线(RXD)

发送数据线(TXD)

数据终端准备就绪(DTR)

信号地(SG)

6

7

8

9

数据通信设备准备就绪(DSR)

请求发送(RTS)

清除发送

振铃指示

1.2.7.2SCI的外围硬件电路

具有SCI接口的MCU,一般具有发送引脚(TxD)与接收引脚(RxD),不同公司

或不同系列的MCU,使用的引脚缩写名可能不一致,但含义相同。SCI的外围硬

件电路,主要目的是将MCU的发送引脚TxD与接收引脚RxD的TTL电平,通过

RS-232电平转换芯片转换为RS-232电平。下图给出一个基本SCI电平转换电路

4

1

2

3

5

6

7

8

9

10/19

图12基本SCI电平转换电路

1.3系统软件设计

系统的软件部分用C语言编程,采用模块化结构,主要由A/D转换模块、

单片机内部数据处理模块、温度显示模块等3部分构成,便于修改和维护。

1.3.1A/D转换模块

根据测量系统要求不同以及单片机的忙闲程度,通常可采用3种软件编程方

式:程序查询方式,延时方式和中断方式。本系统采用延时方式。延时程序实际

上是无条件传送I/O方式,当向A/D转换器发出启动命令后,即进行软件延时,

延时时间稍大于进行一次A/D转换所需要的时间,之后打开A/D转换器的输出

缓冲器读数即为转换好的数字量。A/D转换时间为64个时钟周期,因为系统中

ADC0809的工作时钟为500kHz,故A/D转换时间为128μs,延时时间可大致

选择160μs。程序段如下[1]:

//[ADC.h]A/D转换头文件

------------------------------------------------------

MAX232CPE

1109

1234567

51

232电平

OUTIN

+5V

+5V

TTL电平

OUTIN

TTL电平

转为232电平

1μ×4

11/19

#include"GP32C.h"//GP32MCU映像寄存器名定义

#include"Type.h"//类型别名定义

#defineCOCOBit7

voidADCinit(void);//A/D转换初始化

INT8UADCvalue(INT8Uchannel);//1路A/D转换函数

INT8UADCmid(INT8Uchannel);//1路A/D转换函数(中值滤波)

INT8UADCave(INT8Uchannel,INT8Un);//1路A/D转换函数(均值滤波)

//[ADC.c]A/D转换

-----------------------------------------------------------*

//硬件连接:

//PTB0/AD0接模拟量输入端

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

------*

#include"ADC.h"

//ADCinit:A/D转换初始化

----------------------------------------------------*

//功能:设置A/D转换时钟频率为1MHz

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

------*

voidADCinit(void)

{

ADCLK=0b00110000;

//||||||||_______不用

//||||___________选择内部总线时钟

//|||____________分频系数为2

}

//ADCave:1路A/D转换函数(均值滤

波)------------------------------------------*

//功能:通道channel进行n次中值滤波,求和再作均值,得出均值滤波结果

12/19

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

------*

INT8UADCave(INT8Uchannel,INT8Un)

{

INT8Ui;

INT16Uj;

j=0;

for(i=0;i

j+=ADCmid(channel);

j=j/n;

return(INT8U)j;

}

//ADCmid:1路A/D转换函数(中值滤

波)------------------------------------------*

//功能:获取通道channel中值滤波后的A/D转换结果

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

------*

INT8UADCmid(INT8Uchannel)

{

INT8Ui,j,k,tmp;

//1.取三次A/D转换结果

i=ADCvalue(channel);

j=ADCvalue(channel);

k=ADCvalue(channel);

if(i>j)

{

tmp=i;

i=j;

j=tmp;

13/19

}

if(k>i)

{

if(k>j)

{

tmp=j;

}

else

{

tmp=k;

}

}

else

{

tmp=i;

}

returntmp;

}

//ADCvalue:1路A/D转换函数

--------------------------------------------------*

//功能:获取通道channel的A/D转换结果

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

------*

INT8UADCvalue(INT8Uchannel)

{

INT8Utmp;

//1.选取通道号ADch4-ADch0=00000-00111:AD0引脚~AD7引脚

channel&=0b00011111;//取通道号变量的低五位(实际通道号)

tmp=ADSCR&0b11100000;//取ADSCR的高三位(取上电复位默认值

14/19

000)

ADSCR=tmp|channel;//合并上述8位

//2.取A/D转换结果

while((ADSCR&(1<

returnADR;

}

//总头文件

#include"Includes.h"

//主程序

voidmain(void)

{

DisableMCUint();//禁止总中断

//1.芯片初始化

MCUinit();

//2.模块初始化

SCIinit();//(1)串行口初始化

ADCinit();//(2)A/D转换初始化

while(1)

{

//在通道0做A/D转换,200次中值滤波,串口发送均值滤波结果

SCIsend1(ADCave(0,200));

}

}

注:为了使采样数据更稳定可靠,系统还采用了采样平均值的方法以消除干扰。

1.3.2单片机内部数据处理模块

1.3.2.1内部数据处理

系统通过TLC2543转换的数字量是与实际温度成正比的数字量,但系统最后

显示的是实际温度值,因此需要对数据进行处理再通过8255输出到LED显示。

设所测温度值为T,A/D转换后的数字量为X,则有:

15/19

VOUT=0.01V/℃×T℃

VOUT为LM35的输出电压,即运放μA741的输入电压,μA741的输出电压用V1

表示。因为μA741的放大倍数为5,则有:

V1=5×VOUT=0.05×T

根据系统设置,温度传感器输出电压0~5V对应于转换后的数字量0~255,则

有:0.05T/5=X/255

可以近似写为:0.05T/5=X/256

这样除以256可通过把被除数右移8位来实现。由此可以得出X和T的关系:

T=100×X/256

1.3.2.2串口子程序

//[SCI.h]串行通信头文件--------------------------

#include"GP32C.h"//GP32MCU映像寄存器名定义

#include"Type.h"//类型别名定义

#defineReSendStatusRSCS1//SCI状态寄存器

#defineReTestBit5//接收缓冲区满标志位

#defineSendTestBit7//发送缓冲区空标志位

#defineReSendDataRSCDR//数据寄存器

voidSCIinit(void);//串行口初始化

voidSCIsend1(INT8Uo);//发送1字节

voidSCIsendN(INT8Un,INT8Uch[]);//发送n字节

INT8USCIre1(INT8U*p);//接收1字节

INT8USCIreN(INT8Un,INT8Uch[]);//接收n字节

_____________________________________________

串行通信驱动文件包括SCI初始化、接收1字节、发送1字节、接收n字节和发

送n字节函数。读者可以直接使用这些函数进行MCU的串行通信编程。

//[SCI.c]串行通信

----------------------------------------------------------*

//硬件连接:

//MCU的串口与PC方的串口相连

16/19

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

------*

#include"SCI.h"

//SCIinit:串行口初始化----------------------------------------*

//功能:对串行口进行初始化,默认为允许SCI,正常码输出,8位数*

据,无校验,*

//允许发送器,允许接收器.查询方式收发,波特率为9600(设fBUS*

=2.4576MHz)*

//------------------------------------------------------------*

voidSCIinit(void)

{

//1.总线频率fBUS=2.4576MHz,定义波特率Bt=9600

SCBR=0b00000010;

//2.设置允许SCI,正常码输出,8位数据,无校验

SCC1=0b01000000;

//3.设置允许发送,允许接收,查询方式收发

SCC2=0b00001100;

}

//SCIsend1:串行发送1个字节-----------------------------*

//功能:串行发送1个字节*

//-----------------------------------------------------*

voidSCIsend1(INT8Uo)

{

//判断ReStatusR的第SendTestBit位是否为1,是1可以发送

while(1)

if((ReSendStatusR&(1<

{

ReSendDataR=o;

break;

17/19

}

}

//SCIsendN:串行发送N个字节-----------------------------------*

//功能:发送数组中的N个字节数据*

//-----------------------------------------------------------*

voidSCIsendN(INT8Un,INT8Uch[])

{

inti;

for(i=0;i

SCIsend1(ch[i]);

}

//SCIre1:串行收一个字节数据

------------------------------------------------*

//功能:从串行口接收1个字节的数据

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

------*

INT8USCIre1(INT8U*p)

{

INT16Uk;

INT8Ui;

//ReStatusR第ReTestBit位为1表示可接收数据

for(k=0;k<0xfbbb;k++)

if((ReSendStatusR&(1<

{

i=ReSendDataR;

*p=0x00;

break;

18/19

}

//接受失败

if(k>=0xfbbb)

{

i=0xff;

*p=0x01;

}

returni;

}

//SCIreN:HC08串行接收N个字节

-----------------------------------------*

//功能:接收N个字节数据,并存放在ch数组中

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

*

INT8USCIreN(INT8Un,INT8Uch[])

{

intm;

INT8Ufp;

m=0;

while(m

{

ch[m]=SCIre1(&fp);

if(fp==1)

{

return1;

}

m++;

}

19/19

return0;

}[2]

1.3.3温度显示模块

单片机处理好的温度数据通过8255的3个端口输出到3个LED上显示,8255

的A,B,C口的工作方式均设置为方式0,输出。编程时只需分别从40H,41H,

42H单元取数据送A,B,C口输出即可。

1.4结语

该测温系统经过多次测试,工作稳定可靠,体积小、集成度高、灵敏度高、

响应时间短、抗干扰能力强等特点。此外该系统成本低廉,器件均为常规元件,

有很高的工程价值。如稍加改动,该系统可以很方便地扩展为集温度测量、控

制为一体的产品,具有一定工程应用价值。如对该系统进一步扩展,还可以实

现利用USB协议标准与PC机进行数据通信,能够把监测到的温度值保存到PC

机中。

虽然时间仓促,但此次设计能完成基本的测量温度的功能。在此次设计过程

中,学到了一些新的知识,在此基础上,对MC908GP32单片机又有了进一步的

了解与认识。但毕竟知识与时间有限,这次自己对设计还有未认清与未能完善的

地方,在老师的指导下现在基本上是完成了设计的要求。

参考文献:

【1】王宜怀,刘晓升.嵌入式技术基础与实践.北京:清华大学出版社,2007.

【2】谭浩强.C语言程序设计(第二版).北京:清华大学出版社,2006.

【3】赵晶.Protel99高级应用北京:人民邮电出版社2000

【4】林伸茂.8051单片机彻底研究基础篇.北京:人民邮电出版社2004

【5】范风强等.单片机语言C51应用实战集锦.北京:电子工业出版社2005

【6】万光毅,严义,邢春香.单片机实验与实践教程[M].北京:北京航空航天大

学出版社,2006.4

👁️ 阅读量:0