技术热线: 4007-888-234

单片机开发:如何用8051单片机做一个温度计

更新时间: 2021-10-19
阅读量:3259

温度传感器广泛用于电子设备中,用来显示实时温度,比如我们经常看到一些数字时钟便带有温度计,这是由于其中嵌入了温度传感器。在这个项目中,将展示如何设计数字温度传感器电路。在这个过程中,使用的是8051单片机。

温度值是模拟的,因此它需要使用模数转换器(ADC)转换为数字值,然后显示出来。

一、数字温度传感器电路原理

该电路的主要原理是将模拟温度值转换为数字值,并在LCD显示屏上显示数字温度值。这里使用了8051单片机AT89C51,它没有内置ADC。因此,需要将外部ADC芯片ADC0804与8051单片机连接起来,以将模拟温度值转换为数字值。

二、使用8051的数字温度传感器电路

1.所需组件

AT89C51(8051单片机);
11.0592MHz晶振;
2X33pF电容器;
10μF/16V电容;
3X10KΩ电阻器;
1KΩx8电阻包;
10KΩ电位器;
16X2液晶显示器;
ADC0804;
LM35;
150pF电容;
330Ω电阻;
电源;
连接电线。

2.电路设计

ADCIC的数字输出引脚连接到8051的PORT3引脚。PORT0引脚使用1KΩ电阻包上拉,它们连接到16×2LCD的数据引脚。8051的P2.0和P2.1接LCD的RS和E。

LM35连接到ADC0804的模拟输入引脚VIN+(引脚6)。此处不解释振荡器、复位等基本组件。

完成所有连接并将代码烧录到8051单片机后,打开电源。LM35温度传感器向ADC0804提供模拟温度数据,ADC0804将其转换为数字值并发送到8051。

接收到数字值后,8051单片机执行一个小的计算,然后在LCD上显示温度。详细代码如下:


#include<reg51.h>
#define lcd P0
#define dat P3
sbit rs=P2^0;
sbit e=P2^1;


void delay (int);
void display (unsigned char);
void cmd (unsigned char);
void init (void);
void string (char *);
void intro (void);
unsigned char degree[8]={0x0e,0x0a,0x0e,0x00,0x00,0x00,0x00,0x00};
char i=0;

void delay (int d)
{
    unsigned char i=0;
    for(;d>0;d--)
    {
        for(i=250;i>0;i--);
        for(i=248;i>0;i--);
    }
}
void cmd (unsigned char c)
{
    lcd=c;
    rs=0;
    e=1;
    delay(10);
    e=0;
}
void display (unsigned char c)
{
    lcd=c;
    rs=1;
    e=1;
    delay(10);
    e=0;
}
void string (char *c)
{
    while(*c)
    {
        display(*c++);
    }
}
void init (void)
{
    cmd(0x38);
    cmd(0x01);
  cmd(0x0c);
    cmd(0x80);
}
void intro (void)
{
    string("  Electronics  ");
    cmd(0xc0);
    string("      Hub      ");
    delay(1000);
    cmd(0x01);
    string("    Digital    ");
    cmd(0xc0);
    string("  Thermometer  ");
    delay(1000);
    cmd(0x01);
        cmd(0x40);
        for(i=0;i<8;i++)
        display(degree[i]);
      i=0;
     cmd(0x80);
}

void main()
{
    unsigned int val=0;
    unsigned int temp=0;
    init();
    intro();
    dat=0xff;
    while(1)
    {
        if(i==0)
        {
            string("Temp: ");
            i++;
        }
        val=dat*1.953;
        cmd(0x86);
        
        
        temp=(((val/10)%10)+48);
        display(temp);
        
        temp=((val%10)+48);
        display(temp);
    if(i==1)
        {
        display(0);
        string("C");
            i++;
        }
        delay(300);
    }
    while(1);
}


以上就是英锐恩单片机开发工程师分享的单片机知识,英锐恩专注单片机应用方案设计与开发,提供8位单片机、16位单片机、32位单片机。