单片机温度传感器资料.docx
《单片机温度传感器资料.docx》由会员分享,可在线阅读,更多相关《单片机温度传感器资料.docx(16页珍藏版)》请在冰豆网上搜索。
![单片机温度传感器资料.docx](https://file1.bdocx.com/fileroot1/2023-1/6/755da733-9b53-4663-ae69-c255d30c227a/755da733-9b53-4663-ae69-c255d30c227a1.gif)
单片机温度传感器资料
单片机课程设计报告
(南京信息工程大学)
年级专业:
------------------
姓名:
-----------------------
学号:
-----------------------
日期:
-----------------------
一:
系统概述
二:
硬件系统设计
1、温度计整个测温流程图
2、ADC0809时序图
3、ADC0809初始化程序
4、数码管指令
5、温度计整体驱动程序
3、软件系统设计
1、温度计整个测温流程图
2、ADC0809时序图
3、ADC0809初始化程序
4、数码管指令
5、温度计整体驱动程序
四、电路制作与调试
1、电路图
2、焊接电路
3、硬件调试
4、软件调试
一:
系统概述
温度是工业控制中主要的被控参数之一,特别是在冶金、化工、建材、食品、机械、石油等工业中,具有举足重轻的作用。
随着电子技术和微型计算机的迅速发展,微机测量和控制技术得到了迅速的发展和广泛的应用。
采用单片机来对温度进行控制,不仅具有控制方便、组态简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大提高产品的质量和数量51系列单片机具有易于学习、价格低、功耗低等优点,应用在温度测量与控制方面,控制简单方便,测量范围广,精度较高。
温度传感器将温度信息变换为模拟电压信号后,将电压信号放大到单片机可以处理的范围内,经过低通滤波,滤掉干扰信号送入单片机。
温度通过模拟温度传感器(热敏电阻)进行采样并转换为电压信号,经放大器放大后用ADC0809模数转换器进行A/D转换成数字量进入AT89C51单片机,从P3.0、P3.1口输出到八段数码管LED静态显示部分显示其温度。
二:
硬件系统设计
1、AD590介绍
1.1、集成温度传感器实质上是一种半导体集成电路,它是利用晶体管的b-e结压降的不饱和值VBE与热力学温度T和通过发射极电流I的下述关系实现对温度的检测:
式中,K—波尔兹常数;q—电子电荷绝对值。
集成温度传感器具有线性好、精度适中、灵敏度高、体积小、使用方便等优点,得到广泛应用。
集成温度传感器的输出形式分为电压输出和电流输出两种。
电压输出型的灵敏度一般为10mV/K,温度0℃时输出为0,温度25℃时输出2.982V。
电流输出型的灵敏度一般为1mA/K。
1.2、AD590是美国模拟器件公司生产的单片集成两端感温电流源。
它的主要特性如下:
①、流过器件的电流(mA)等于器件所处环境的热力学温度(开尔文)度数,即:
mA/K
式中:
—流过器件(AD590)的电流,单位为mA;
T—热力学温度,单位为K。
②、AD590的测温范围为-55℃~+150℃。
③、AD590的电源电压范围为4V~30V。
电源电压可在4V~6V范围变化,电流变化1mA,相当于温度变化1K。
AD590可以承受44V正向电压和20V反向电压,因而器件反接也不会被损坏。
④、输出电阻为710MW。
1.3、AD590基本应用电路
1.4、AD590测量热力学温度、摄氏温度、两点温度差、多点最低温度、多点平均温度的具体电路,广泛应用于不同的温度控制场合。
由于AD590精度高、价格低、不需辅助电源、线性好,常用于测温和热电偶的冷端补偿。
2、AT89S51介绍
2.1、AT89S51是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89S51具有如下特点:
40个引脚,4kBytesFlash片内程序存储器,128bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。
此外,AT89S51设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。
空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。
同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
2.2、AT89S51引脚及各引脚用途
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3.0RXD(串行输入口) P3.1TXD(串行输出口) P3.2/INT0(外部中断0) P3.3/INT1(外部中断1) P3.4T0(记时器0外部输入) P3.5T1(记时器1外部输入) P3.6/WR(外部数据存储器写选通) P3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。
I/O口作为输入口时有两种工作方式,即所谓的读端口与读引脚。
读端口时实际上并不从外部读入数据,而是把端口锁存器的内容读入到内部总线,经过某种运算或变换后再写回到端口锁存器。
只有读端口时才真正地把外部的数据读入到内部总线。
上面图中的两个三角形表示的就是输入缓冲器CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作。
这是由硬件自动完成的,不需要我们操心,1然后再实行读引脚操作,否则就可能读入出错,为什么看上面的图,如果不对端口置1端口锁存器原来的状态有可能为0Q端为0Q^为1加到场效应管栅极的信号为1,该场效应管就导通对地呈现低阻抗,此时即使引脚上输入的信号为1,也会因端口的低阻抗而使信号变低使得外加的1信号读入后不一定是1。
若先执行置1操作,则可以使场效应管截止引脚信号直接加到三态缓冲器中实现正确的读入,由于在输入操作时还必须附加一个准备动作,所以这类I/O口被称为准双向口。
89C51的P0/P1/P2/P3口作为输入时都是准双向口。
接下来让我们再看另一个问题,从图中可以看出这四个端口还有一个差别,除了P1口外P0P2P3口都还有其他的功能。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3、ADC0809介绍
3.1、ADC0809是8位CMOS逐次逼近式A/D转换器。
内部有8路模拟量输入和8位数字量输出的A/D转换器,它是美国国家半导体公司的产品,是目前国内最广泛的8位通用的A/D转换的芯片。
3.2、ADC0809各管脚功能
①IN0—IN7为8路模拟电压输入线,用于输入被转换的模拟电压。
②ADDA,ADDB,ADDC三位地址输入端。
八路模拟信号转换选择同由A,B,C决定。
A为低位,C为高位。
③CLOCK外部时钟输入端,时钟频率高,A/D转换速度快。
允许范围为10~1280KHZ,典型值为640KHZ,此时,A/D转换时间为10us。
通常由MCS-51型单片机ALE端直接或分频后与其相连。
当MCS-51型单片机无读写外,RAM操作时,ALE信号固定为CPU时钟频率的1/6,若单片机外接的晶振为6MHZ,则1/6为1MHZ,A/D转换时间为64us。
④D0--D7数字量输出端,A/D转换的结果由这几个端口输出。
⑤OEA/D转换结果输出允许控制端,当OE端为高电平时,允许将A/D转换结果从D0~D7端输出。
通常由MCS-51型单片机的端和ADC00809片选端(例如),通过或非门与ADC0809的OE端相连接。
当DPTR为FEFFH,且执行“MOVXA,@DPTR”指令后,和2.0均有效,或非后产生高电平,使ADC0809的OE端有效,ADC0809将A/D转换的结果送入数据总线P0口,CPU在读入中。
⑥ALE地址锁存允许信号。
八路模拟通道地址由A,B,C输入在ADC0809的ALE信号有效时,将该八路地址锁存。
⑦START启动A/D转换信号。
当START端输入一个正脉冲时,立即启动ADC0809进行A/D转换。
START端与ALE端连在一起,由MSC-51型单片机WR和ADC0809片选端(例如)。
通过或非门连接,当DPTR为FEF8H时,执行“MOVX@DPTR,A”指令后,将启动ADC0809模拟通道0的A/D转换。
FEF8H~FEFFH分别为八路模拟输入通道的地址。
执行MOVX写指令,并非真的将A中的内容写进ADC0809中,ADC0809中没有一个寄存器,能容纳的A中的内容。
ADC0809的输入通道是IN0~IN7,输出通道是D0~D7,因此,执行:
“MOVX@DPTR,A”指令与A中内容无关,但DPTR地址应指向当前A/D的通道地址。
⑧DOCA/D转换结果信号。
当ADC0809启动A/D转换后,EOC输出低电平,转换结束后,EOC输出高电平,表示可以读取A/D转换的结果。
该信号取反后若与MCS-51型单片机引脚或连接,可引发CPU中断,在中断服务程序中读A/D转换的数字信号,若与MCS-51型单片机两个中断源已用完,则EOC也可与P1口或P3口的一条端线相连,不采用中断方式,采用查询方式,查得EOC为高电平后,在读入A/D转换的值。
⑨VREF+,VREF-正负基准电压输入端。
正基准电压的典型值为+5V,可与电源电压+5V相连,但电源电压往往有一定的波动,将影响A/D转换的精度。
因此,精度要求较高时,可用高稳定基准电源输入。
当模拟信号电压较低时,基准电压也可取低于5V的数值。
⑩VCC,GND正电源电压端和地端。
4、LM358介绍
4.1、LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适用于双电源工作模式,在推荐的工作条件下,电源电流与电源电压无关。
它的使用范围包括传感放大器、直流增益模块和其他所有可用单电源供电的使用运算放大器的场合。
LM358的封装形式有塑封8引线双列直插式和贴片式。
4.2、LM358特性:
内部频率补偿;直流电压增益高(约100dB);单位增益频带宽(约1MHz);电源电压范围宽:
单电源(3—30V);双电源(±1.5一±15V);低功耗电流,适合于电池供电;低输入偏流;低输入失调电压和失调电流;共模输入电压范围宽,包括接地;差模输入电压范围宽,等于电源电压范围;输出电压摆幅大(0至Vcc-1.5V)
4.3、LM385引脚图
8脚V+,4脚接地,1,7脚输出,2,6脚比较端+,3,5比较端-
5、LED数码管介绍
5.1、在单片机应用系统中,如果需要显示的内容只有数码和某些字母,使用LED数码管是一种较好的选择。
LED数码管显示清晰、成本低廉、配置灵活,与单片机接口简单易行。
5.2、LED数码管是由发光二极管作为显示字段的数码型显示器件。
图4-2a为0.5inLED数码管的外形和引脚图,其中七只发光二极管分别对应a~g笔段构成“日”字形另一只发光二极管Dp作为小数点。
因此这种LED显示器称为七段数码管或八段数数码。
LED数码管按电路中的连接方式可以分为共阴型和共型两大类,如图4-2示b、c所示。
共阳型是将各段发光二极管的正极连在一起,作为公共端COM,公共端COM接高电平,a~g、Dp各笔段通过限流电阻接控制端。
某笔段控制端低电平时,该笔段发光,高电平时不发光。
控制苛几段笔段发光,就能显示出某个数码或字符。
共阴型是将各数码发光二极管的负极连在一起,作为公共端COM接地,某笔段通过限流电阻接高电平时发光。
当LED数码管与单片机相联时,一般将LED数码管的各笔段引脚a、b、…、g、Dp按某一顺序接到MCS-51型单片机某一个并行I/O口D0、D1、…、D7,当该I/O口输出某一特定数据时,就能使LED数码管显示出某个字符。
三、软件系统设计
1、温度计整个测温流程图
2、ADC0809时序图
3、ADC0809初始化程序
MOVR0,#0A0H;数据存储区首地址
MOVR2,#08H;8路计数器
SETBIT1;边沿触发方式
SETBEA;中断允许
SETBEX1;允许外部中断1中断
MOVDPTR,#0FEF8H;D/A转换器地址
LOOP:
MOVX@DPTR,A;启动A/D转换
HERE:
SJMP
HERE;等待中断
中断服务程序:
DJNZR2,ADEND
MOVXA,@DPTR;数据采样
MOVX@R0,A;存数
INCDPTR;指向下一模拟通道
INCR0;指向数据存储器下一单元
MOVX@DPTR,A
ADEND:
RETI
4、数码管指令:
MOVDPTR,#SEGPORT
MOVA,#SEG
MOVXX@DPTR,A
MOVDPTR,#BITPORT
MOVA,#BIT
MOVX@DPTR,A
5、温度计整体驱动程序:
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00};//数码显示代码
sbitled1=P2^3;
sbitled2=P2^2;
sbitled3=P2^1;
sbitled4=P2^0;//位选
sbitP24=P2^4;
sbitP26=P2^6;
sbitP27=P2^7;
sbitswich=P2^5;//定义开关
uintk,l,m;
ucharfuhao,shi,ge,biaoshi,num2,num,f,shu;
voiddelay(uintp)
{
uchari,j;
for(i=p;i>0;i--)
for(j=110;j>0;j--);
}//延时1ms
voiddisplay()//动态显示程序
{
led1=1;
P1=table[fuhao];
delay(5);
led1=0;
led2=1;
P1=table[shi];
delay(5);
led2=0;
led3=1;
P1=table[ge];
delay(5);
led3=0;
led4=1;
P1=table[biaoshi];
delay(5);
led4=0;
}
voidinti()//初始化程序
{
f=0;
led1=0;
led2=0;
led3=0;
led4=0;
TMOD=0x20;
TH1=4;//设置定时器T1
TL1=4;
EA=1;//开启总中断
ET1=1;//开启定时器1中断
TR1=1;//定时器T1工作
P1=0xff;
P27=1;
num=0;
fuhao=17;
shi=17;
ge=17;
biaoshi=17;
P26=0;
}
voidkey()
{
if(swich==0)
{
delay(5);//去抖动
if(swich==0)
{
f=1;//标志位
while(!
swich);
}
}
}
voidmain()
{
inti();
while
(1)
{
key();
if(f==1)
{
P26=1;
for(k=20;k>0;k--);
P26=0;
for(k=20;k>0;k--);
P26=1;
delay
(1);
P0=0xff;
EX1=1;//开启外部中
delay
(1);
f=0;
}
display();
}
}
voidt1()interrupt3
{
P24=~P24;
}
voidex1()interrupt2
{
f=0;
EX1=0;
P26=1;
for(k=20;k>0;k--);//数据传输时间
num=P0;
num2=0;
for(l=0;l<8;l++)//首尾交换
{
shu=num;
shu=shu&0x01;
for(m=0;m<7-l;m++)
{
shu=shu*2;
}
num2=num2+shu;
num=num>>1;
}//首尾转换
for(k=10;k>0;k--);
num=num2;
if(num<55)
{
fuhao=16;
shi=(55-num)/10;
ge=(55-num)%10;
biaoshi=12;
}
else
{
fuhao=(num-55)/100;
if(fuhao==0)
fuhao=17;
shi=(num-55)%100/10;