首页 > 其他分享 >STC89C52+DS18B20实现环境温度检测(数码管显示温度)

STC89C52+DS18B20实现环境温度检测(数码管显示温度)

时间:2023-07-05 13:33:58浏览次数:35  
标签:DS18B20 STC89C52 void Delay 数码管 温度 DQ

一、项目介绍

温度检测是工业自动化、生产线等众多领域中常见的应用场景之一,能及时准确地监测温度对于保障生产安全和提高生产效率有着非常重要的作用。而在现代的电子制造行业中,使用单片机和传感器等电子元器件进行温度检测已经成为了一个比较成熟的技术方案。

本项目选择STC89C52单片机和DS18B20数字温度传感器,通过读取传感器输出的温度值,经过计算和处理后,并将结果显示在数码管上,实现环境温度的实时监测和显示。其中,STC89C52单片机为主控芯片,负责接收和处理数字温度传感器的数据,并通过数码管将温度值进行显示。

STC89C52+DS18B20实现环境温度检测(数码管显示温度)_数码管

STC89C52+DS18B20实现环境温度检测(数码管显示温度)_串口_02

二、整体设计

【1】设计思路

使用 STC89C52 单片机和 DS18B20 数字温度传感器,通过 I/O 口进行连接,读取传感器输出的温度值。通过计算和处理后,将温度值在数码管上进行显示。其中,STC89C52 单片机为主控芯片,负责接收和处理数字温度传感器的数据,并通过数码管将温度值进行显示。

【2】硬件连接

硬件方面,需要使用 STC89C52 单片机和 DS18B20 数字温度传感器。其中,STC89C52 单片机通过 P1 口连接4位数码管的动态扫描信号线,并与 DS18B20 传感器的 DQ 线相连。DS18B20需要使用一个2.2K欧姆上拉电阻和一个10K欧姆下拉电阻。

【3】软件设计

在软件方面,主要进行以下操作:

(1)初始化函数

初始化串行总线,设置为推挽输出,并将数码管段选端口初始化为高电平输出,数码管位选端口初始化为低电平输出。

(2)读取温度值函数

通过发送读取命令,从 DS18B20 数字温度传感器中读取温度值。

(3)温度值计算函数

根据 DS18B20 数字温度传感器的温度值计算方法,将读取到的数值进行转换,得到实际温度值。

(4)数码管显示函数

将温度值分离出整数和小数部分,然后经过数码管驱动程序,通过数码管进行显示。

三、具体代码实现

【1】DS18B20温度读取

DS18B20 是一种数字温度传感器,采用单总线接口进行通讯。它可以在较长的距离内实现温度值的准确测量,并且不需要调零或校准,被广泛应用于各种计算机控制系统、电子设备和温度控制应用中。其分辨率为 12 位,温度范围为 -55 度 Celsius 到 +125 度 Celsius。

下面代码实现的功能是:读取DS18B20温度再通过串口打印出来。

#include <reg51.h>
 
 #define uchar unsigned char
 #define uint unsigned int
 
 sbit DQ = P1^0;  // DS18B20 数字温度传感器数据线连接到 P1.0 引脚
 
 // DS18B20 数据传输函数
 void DS18B20_WriteByte(uchar dat);
 uchar DS18B20_ReadByte();
 void DS18B20_Start();
 void DS18B20_End();
 void DS18B20_Delay(uint i);
 
 // 初始化函数
 void init();
 
 // 串口初始化函数
 void uart_init();
 
 // 串口发送函数
 void send_string(char *s);
 
 void main() 
 {
     uchar temp_h, temp_l;
     uint temp;
 
     init();
     uart_init(); // 串口初始化
 
     while(1)
     {
         DS18B20_Start(); // 启动传输
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0x44); // 发送温度转换指令
         DS18B20_End(); // 结束传输
 
         DS18B20_Start(); // 启动传输
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 发送读取指令
 
         // 读取温度值
         temp_l = DS18B20_ReadByte(); // 读取低位温度值
         temp_h = DS18B20_ReadByte(); // 读取高位温度值
 
         // 计算温度值
         temp = (temp_h << 8) + temp_l;
         temp = (float)temp / 16;
         send_string("The temperature is: ");
         send_string(temp);
         send_string("\r\n");
 
         DS18B20_End(); // 结束传输
     }
 }
 
 // DS18B20 数据传输函数
 void DS18B20_WriteByte(uchar dat)
 {
     uchar i;
 
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 写时序开始
         DQ = dat & 0x01; // 写数据
         DS18B20_Delay(1); // 延时 1us
         DQ = 1; // 写时序结束
         dat >>= 1;
     }
 }
 
 uchar DS18B20_ReadByte()
 {
     uchar i, dat = 0;
 
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 读时序开始
         DS18B20_Delay(1); // 延时 1us
         dat >>= 1;
         if(DQ) 
             dat |= 0x80;
         DS18B20_Delay(5); // 延时 5us
         DQ = 1; // 读时序结束
     }
     return dat;
 }
 
 void DS18B20_Start()
 {
     DQ = 1;
     DS18B20_Delay(1);
     DQ = 0;
     DS18B20_Delay(480);
     DQ = 1;
     DS18B20_Delay(60);
 }
 
 void DS18B20_End()
 {
     DQ = 1;
     DS18B20_Delay(1);
 }
 
 void DS18B20_Delay(uint i)
 {
     while(i--);
 }
 
 // 初始化函数
 void init()
 {
     TMOD |= 0x20; // 定时器 1 工作在模式 2
     TH1 = 0xfd; // 设置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 启动定时器
 }
 
 // 串口初始化函数
 void uart_init()
 {
     SCON = 0x50; // 8 位数据,可变波特率,允许接收
     ES = 1; // 允许串口中断
     EA = 1; // 允许总中断
 }
 
 // 串口发送函数
 void send_string(char *s)
 {
     while(*s)
     {
         SBUF = *s;
         while(!TI);
         TI = 0;
         s++;
     }
 }

【2】读取温度数码管显示

数码管是一种数码显示装置,通常由一个数码管的阵列组成,可以用来显示数字、字母和一些特殊符号。广泛应用于各种电子装置中,如计算器、时钟、温度计、电压表、档位指示器等。数码管通常可分为共阳极和共阴极两种类型,其中共阳极的数码管是将阳极连接在一起,通过控制对应的阴极接口以实现显示数字,而共阴极则是将阴极连接在一起,通过控制对应的阳极接口以实现显示。

数码管的显示原理是通过不同的电信号按照一定的逻辑在数码管内部的小灯泡上点亮不同的线段,从而形成所需的数字、字母或符号。要实现数码管的显示控制,需要使用微控制器或其他数字电路实现对数码管各个位的控制,在采集到数据后将其转换为可显示的信息,并将其显示在相应的数码管上。

下面是通过DS18B20 温度传感器读取温度再通过数码管显示温度:

#include <reg51.h>
 
 #define uchar unsigned char
 #define uint unsigned int
 
 sbit DQ = P1^0; // DS18B20 数字温度传感器数据线连接到 P1.0 引脚
 sbit DIO = P2^0;  // 数码管数据总线 DIO 连接到 P2.0 引脚
 sbit RCLK = P2^1; // 数码管存储总线 RCLK 连接到 P2.1 引脚
 sbit SRCLK = P2^2; // 数码管移位总线 SRCLK 连接到 P2.2 引脚
 
 // DS18B20 数据传输函数
 void DS18B20_WriteByte(uchar dat);
 uchar DS18B20_ReadByte();
 void DS18B20_Start();
 void DS18B20_End();
 void DS18B20_Delay(uint i);
 
 // 初始化函数
 void init();
 
 // 串口初始化函数
 void uart_init();
 
 // 串口发送函数
 void send_string(char *s);
 
 // 数码管显示函数
 void display(uchar num);
 
 void main() 
 {
     uchar temp_h, temp_l;
     uint temp;
 
     init();
     uart_init(); // 串口初始化
 
     while(1)
     {
         DS18B20_Start(); // 启动传输
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0x44); // 发送温度转换指令
         DS18B20_End(); // 结束传输
 
         DS18B20_Start(); // 启动传输
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 发送读取指令
 
         // 读取温度值
         temp_l = DS18B20_ReadByte(); // 读取低位温度值
         temp_h = DS18B20_ReadByte(); // 读取高位温度值
 
         // 计算温度值
         temp = (temp_h << 8) + temp_l;
         temp = (float)temp / 16;
 
         // 数码管显示温度
         display(temp);
 
         send_string("The temperature is: ");
         send_string(temp);
         send_string("\r\n");
 
         DS18B20_End(); // 结束传输
     }
 }
 
 // DS18B20 数据传输函数
 void DS18B20_WriteByte(uchar dat)
 {
     uchar i;
 
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 写时序开始
         DQ = dat & 0x01; // 写数据
         DS18B20_Delay(1); // 延时 1us
         DQ = 1; // 写时序结束
         dat >>= 1;
     }
 }
 
 uchar DS18B20_ReadByte()
 {
     uchar i, dat = 0;
 
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 读时序开始
         DS18B20_Delay(1); // 延时 1us
         dat >>= 1;
         if(DQ) 
             dat |= 0x80;
         DS18B20_Delay(5); // 延时 5us
         DQ = 1; // 读时序结束
     }
     return dat;
 }
 
 void DS18B20_Start()
 {
     DQ = 1;
     DS18B20_Delay(1);
     DQ = 0;
     DS18B20_Delay(480);
     DQ = 1;
     DS18B20_Delay(60);
 }
 
 void DS18B20_End()
 {
     DQ = 1;
     DS18B20_Delay(1);
 }
 
 void DS18B20_Delay(uint i)
 {
     while(i--);
 }
 
 // 初始化函数
 void init()
 {
     TMOD |= 0x20; // 定时器 1 工作在模式 2
     TH1 = 0xfd; // 设置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 启动定时器
 }
 
 // 串口初始化函数
 void uart_init()
 {
     SCON = 0x50; // 8 位数据,可变波特率,允许接收
     ES = 1; // 允许串口中断
     EA = 1; // 允许总中断
 }
 
 // 串口发送函数
 void send_string(char *s)
 {
     while(*s)
     {
         SBUF = *s;
         while(!TI);
         TI = 0;
         s++;
     }
 }
 
 // 数码管显示函数
 void display(uchar num)
 {
     uchar code table[] = { 
         0x3f, // '0'
         0x06, // '1'
         0x5b, // '2'
         0x4f, // '3'
         0x66, // '4'
         0x6d, // '5'
         0x7d, // '6'
         0x07, // '7'
         0x7f, // '8'
         0x6f, // '9'
     };
     uchar i;
 
     for (i = 0; i < 8; i++)
     {
         RCLK = 0;
         DS = table[num % 10]; // 取出个位数码
         num /= 10; // 取下一位数
         SRCLK = 1;
         SRCLK = 0;
     }
 
     RCLK = 1;
     RCLK = 0;
 }


标签:DS18B20,STC89C52,void,Delay,数码管,温度,DQ
From: https://blog.51cto.com/u_11822586/6631204

相关文章

  • 21-数码管静态显示
    1.数码管静态显示数码管是一种半导体发光器件,其基本单元是发光二极管常见的数码管有七段数码管和八段数码管(相差一个小数点),还有米字管,十六段管等八段发光数码管每一段对应a,b,c,d,e,f,g,dp(小数点)八段数码管有十个管教,八段+两个公共端com,与数码管内部是导通的八段......
  • 03-定时器与数码管
    目录一.定时器基础概念一.定时器基础概念时钟周期时钟周期T是时序中最小的时间单位,具体计算的方法就是1/时钟源频率,例如C51时钟周期=1/11059200秒机器周期指单片机完成一个操作的最短时间.机器周期主要针对汇编语言而言,每条语句都是机器周期的整数倍.一......
  • DS18B20中文数据手册 pdf
    DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水......
  • 51矩阵键盘数码管动态显示
    一、实验目的1、了解矩阵键盘扫描方法。2、了解数码管动态显示方法。二、实验内容1、完成读取矩阵键盘并静态显示。2、完成完成读取矩阵键盘并动态显示。三、实验原理四、实验电路与程序1、软件实验一:完成读取矩阵键盘并静态显示。1)实验要求:单片机完成读取矩阵键盘并通过八段......
  • 51静态数码管实验
    一、实验目的1、了解数码管共阴极和共阳极接法。2、了解数码管的段选和位选方式。3、了解定时器初始化设置的方法。二、实验内容1、完成数码管显示数字每秒加一,八个数码管全亮;完成数码管八段全亮,八个数码管全亮。1)实验要求:完成数码管八段全亮,八个数码管全亮,以此检验数码管是......
  • 89C51实现单个指定按键消抖后计数(使用共阴极数码管7SEG-MPX8-CC-BLUE)
     位选关键锁存器按键(消抖)区小灯泡D1用于指示SW1是否被检测到按下(计数器设置为1次就溢出,在中断中计数num+1的同时对小灯泡连接的端口取反用于指示)。#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintun......
  • arduino esp32 ds18b20 实例代码
    #include<OneWire.h>#include<DallasTemperature.h>//引脚定义#defineONE_WIRE_BUS15//库引用实例OneWireoneWire(ONE_WIRE_BUS);DallasTemperaturesensors(&oneWire);voidsetup(void){Serial.begin(9600);sensors.begin();}voidloop(vo......
  • 四位阳数码管显示 stm32
      #ifndef__LED595_H#define__LED595_H#include"main.h"#defineSDI_595PCout(8)/*1bit数据*/#defineSCLK_595PCout(9)/*将串行数据锁存到并口驱动LED,一个高低电平变化*/#defineLOAD_595PCout(10)/*将串行数据锁存到并口驱动LED,一个高低电平变化*/void......
  • 一位共阴数码管实验
    光控LED一位共阴数码管实验实验目的数码管依次显示0-9理论按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应......
  • 成都电路板定做:已验证!温度传感器DS18B20的电路和读正负温度的程序
    本文介绍温度传感器DS18B20的电路和能读取正负温度数值的程序(或说明)。日积月累,越来越进步,本文的分享来自查阅与实践,基本已验证成功。1、什么是DS18B20DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。2、DS18B20有什么用温......