六、Proteus817实现51单片机和DS18B20采集温度

前言

本章讲解了51单片机中用DS18B20采集温度,然后通过串口输出显示,只讲使用,不讲原理,快速上手。

一、绘制仿真

1、新建仿真和添加器件

(1)引脚连接

DS18B20

VCC----VCC

DQ------P37

GND---GND

(2)添加器件

主要就是DS18B20

(3)添加串口

(4)绘制完成

注意DS18B20加上上拉电阻,在实际实物中这个电阻必不可少!

(5)设置时钟频率

双击芯片,修改时钟频率,如果没有正确设置,串口会出错

二、编写代码

1、暴力测试版

在keil里新建工程后,将代码直接复制进main.c可以直接编译使用。

(1)main.c

c 复制代码
#include "reg52.h"
#include "intrins.h"
#include "stdio.h"
sbit DQ0 = P3^7;//单总线接口
//单总线延时函数
static void Delay_OneWire(unsigned int t) 
{
	//t = t * 12;	// STC15f
	while (t--)
		;
}

//通过单总线向DS18B20写一个字节
static void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for (i = 0; i < 8; i++)
	{
		DQ0  = 0;
		DQ0  = dat & 0x01;
		Delay_OneWire(5);
		DQ0  = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
static unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;

	for (i = 0; i < 8; i++)
	{
		DQ0  = 0;
		dat >>= 1;
		DQ0  = 1;
		if (DQ0 )
		{
			dat |= 0x80;
		}
		Delay_OneWire(5);
	}
	return dat;
}

// DS18B20设备初始化
static bit init_ds18b20(void)
{
	bit initflag = 0;

	DQ0  = 1;
	Delay_OneWire(12);
	DQ0  = 0;
	Delay_OneWire(80);
	DQ0  = 1;
	Delay_OneWire(10);
	initflag = DQ0 ;
	Delay_OneWire(5);

	return initflag;
}
//读取温度,已经是转换后的,如值为25.6
float Get_Current_T0(void)
{
	unsigned int temp;
	float temperature;
	unsigned char low, high;

	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0x44);
	Delay_OneWire(200);

	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0xBE);

	low = Read_DS18B20();
	high = Read_DS18B20();
	temp = high;
	temp <<= 8;
	temp |= low;
	temperature = temp * 0.0625;

	return temperature;
}

// ---- 串口初始化 (9600, 11.0592MHz 晶振) ----
void UART_Init()
{
    SCON = 0x50;    // 模式1, 8位数据, 可变波特率
    TMOD &= 0x0F;
    TMOD |= 0x20;   // 定时器1, 模式2
    TH1 = 0xFD;     // 9600bps @ 11.0592MHz
    TL1 = 0xFD;
    TR1 = 1;
    TI = 1;
    EA = 1;
}

// ---- 基础串口发送 ----
void UART_SendChar(unsigned char c)
{
    SBUF = c;
    while(!TI);
  
  TI = 0;
}
void UART_SendString(char *s)
{
    while(*s) UART_SendChar(*s++);
}


void Delay1000ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void main()
{
	float temp = 25;
	char send[20];
	UART_Init();
	while(1)
	{
		Delay1000ms();
		temp = Get_Current_T0();//读取温度
		sprintf(send,"temp:%.1f \r\n",temp);//拼接字符串
		UART_SendString(send);//串口发送温度
	}
}

记得勾选输出文件

(2)功能测试

前面编译成功后,我们在仿真里找到我们编译后产生的文件,双击芯片进行导入。

然后我们点击左下角的三角形运行仿真。

这里通过串口我们可以看到数据一致。

我们接着调整温度值,点击温度传感器中的上下箭头,可以看到温度的变化。

(3)串口界面消失

2、封装版

(1)新建c文件和h文件

串口的uart文件可以从前几章的文件复制到文件夹再添加,也可以去本栏第一章学习添加--一键传送


(2)代码文件

将代码复制进相应的地方。

DS18B20.c

c 复制代码
#include "reg52.h"
#include "DS18B20.h"

sbit DQ0 = P3^7;//单总线接口
//单总线延时函数
static void Delay_OneWire(unsigned int t) 
{
	//t = t * 12;	// STC15f
	while (t--)
		;
}

//通过单总线向DS18B20写一个字节
static void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for (i = 0; i < 8; i++)
	{
		DQ0  = 0;
		DQ0  = dat & 0x01;
		Delay_OneWire(5);
		DQ0  = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节
static unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;

	for (i = 0; i < 8; i++)
	{
		DQ0  = 0;
		dat >>= 1;
		DQ0  = 1;
		if (DQ0 )
		{
			dat |= 0x80;
		}
		Delay_OneWire(5);
	}
	return dat;
}

// DS18B20设备初始化
static bit init_ds18b20(void)
{
	bit initflag = 0;

	DQ0  = 1;
	Delay_OneWire(12);
	DQ0  = 0;
	Delay_OneWire(80);
	DQ0  = 1;
	Delay_OneWire(10);
	initflag = DQ0 ;
	Delay_OneWire(5);

	return initflag;
}
//读取温度,已经是转换后的,如值为25.6
float Get_Current_T0(void)
{
	unsigned int temp;
	float temperature;
	unsigned char low, high;

	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0x44);
	Delay_OneWire(200);

	init_ds18b20();
	Write_DS18B20(0xCC);
	Write_DS18B20(0xBE);

	low = Read_DS18B20();
	high = Read_DS18B20();
	temp = high;
	temp <<= 8;
	temp |= low;
	temperature = temp * 0.0625;

	return temperature;
}

DS18B20.h

c 复制代码
#ifndef _DS18B20_H
#define _DS18B20_H

float Get_Current_T0(void);

#endif

main.c

c 复制代码
#include "reg52.h"
#include "intrins.h"
#include "stdio.h"
#include "DS18B20.h"
#include "uart.h"


void Delay1000ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}



void main()
{
	float temp = 25;
	char send[20];
	UART_Init(9600);
	while(1)
	{
		Delay1000ms();
		temp = Get_Current_T0();//读取温度
		sprintf(send,"temp:%.1f \r\n",temp);//拼接字符串
		UART_SendString(send);//串口发送温度
	}
}

(3)功能测试

同暴力测试版

三、总结

本文章讲解了DS18B20温度读取的代码,下一章讲解一个单片机挂载多个DS18B20设备读取温度。

相关推荐
深圳市九鼎创展科技13 分钟前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计17 分钟前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报2 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业2 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能2 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn2 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响2 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592753 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉82183 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
国科安芯3 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试