【学习笔记】单片机的40个经典实验之33:四位数数字温度计
一、温度传感器 AD590 基本知识
AD590 产生的电流与绝对温度成正比,它可接收的工作电压为 4V-30V,检测的温度范围为-55℃-+150℃,它有非常好的线性输出性能,温度每增加1℃,其电流增加 1uA。AD590 温度与电流的关系如下表所示
二、实验任务
利用 AD590 温度传感器完成温度的测量,把转换的温度值的模拟量送入ADC0809 的其中一个通道进行 A/D 转换,将转换的结果进行温度值变换之后送入数码管显示。
三、电路原理图
图 4.30.1
四、系统板上硬件连线
(1). 把“单片机系统”区域中的 P1.0-P1.7 与“动态数码显示”区域中的 ABCDEFGH 端口用 8 芯排线连接。
(2). 把“单片机系统”区域中的 P2.0-P2.7 与“动态数码显示”区域中的 S1S2S3S4S5S6S7S8 端口用 8 芯排线连接。
(3). 把“单片机系统”区域中的 P3.0 与“模数转换模块”区域中的 ST端子用导线相连接。
(4). 把“单片机系统”区域中的 P3.1 与“模数转换模块”区域中的 OE端子用导线相连接。
(5). 把“单片机系统”区域中的 P3.2 与“模数转换模块”区域中的 EOC端子用导线相连接。
(6). 把“单片机系统”区域中的 P3.3 与“模数转换模块”区域中的 CLK端子用导线相连接。
(7). 把“模数转换模块”区域中的 A2A1A0 端子用导线连接到“电源模块”区域中的 GND 端子上。
(8). 把“模数转换模块”区域中的 IN0 端子用导线连接到自制的 AD590电路上。
(9). 把“单片机系统”区域中的 P0.0-P0.7 用 8 芯排线连接到“模数转换模块”区域中的 D0D1D2D3D4D5D6D7 端子上。
五、程序设计内容
(1). ADC0809 的 CLK 信号由单片机的 P3.3 管脚提供
(2). 由于 AD590 的温度变化范围在-55℃-+150℃之间,经过 10KΩ之后采样到的电压变化在 2.182V-4.232V 之间,不超过 5V 电压所表示的范围,因此参考电压取电源电压 VCC,(实测 VCC=4.70V)。由此可计算出经过 A/D 转换之后的摄氏温度显示的数据为:如果(D*2350/128)<2732,则显示的温度值为-(2732-(D*2350/128))如果(D*2350/128)≥2732,则显示的温度值为+((D*2350/128)-2732)
六、C 语言源程序
#include <AT89X52.H>
#include <ctype.h>
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsigned char dispbuf[8]={10,10,10,10,10,10,0,0};
unsigned char dispcount;
unsigned char getdata;
unsigned long temp;
unsigned char i;
bit sflag;
sbit ST=P3^0;
sbit
sbit
sbit
sbit
sbit
sbit
OE=P3^1;
EOC=P3^2;
CLK=P3^3;
LED1=P3^6;
LED2=P3^7;
SPK=P3^5;
void main(void)
{
ST=0;
OE=0;
TMOD=0x12;
TH0=0x216;
TL0=0x216;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;
ST=1;
ST=0;
getdata=148;
while(1)
{
;
}
}
void t0(void) interrupt 1 using 0
{
CLK=~CLK;
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
if(EOC==1)
{
OE=1;
getdata=P0;
OE=0;
temp=(getdata*2350);
temp=temp/128;
if(temp<2732)
{
temp=2732-temp;
sflag=1;
}
else
{
temp=temp-2732;
sflag=0;
}
i=3;
dispbuf[0]=10;
dispbuf[1]=10;
dispbuf[2]=10;
if(sflag==1)
{
dispbuf[7]=11;
}
else
{
dispbuf[7]=10;
}
dispbuf[3]=0;
dispbuf[4]=0;
dispbuf[5]=0;
dispbuf[6]=0;
while(temp/10)
{
dispbuf[i]=temp%10;
temp=temp/10;
i++;
}
dispbuf[i]=temp;
ST=1;
ST=0;
}
P1=dispcode[dispbuf[dispcount]];
P2=dispbitcode[dispcount];
dispcount++;
if(dispcount==8)
{
dispcount=0;
}
}
阅读本文用了:
分
秒,转发只需1秒
❀转载是一种智慧❀分享是一种美德❀