【蓝桥杯单片机03】温度(DS18B20)模块详解(附代码)

下面是一些博主在学习过程中所做的笔记:从原理到onewire.c的各部分代码详解以及相关函数的调用与温度测量


 

0 温度寄存器概述与原理图

(课件来源于【蓝桥杯-单片机】零基础入门省国赛冲刺培训】-DS18B20

 

1 温度寄存器内部储存形式

1.1 说明:内置温度报警(不常用)

 2 具体控制其工作的步骤(3步)

注意:以下三个代码都在官方给的onewire.c中,可以直接复制添加并使用,下面只是通过注释等解释原理

 2.1 初始化DS18B20

//返回一个bit类型数据,即初始化(自检),若成功则返回1
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

2.2 写时序

//延迟1ms的函数(12.000晶振特定)
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

//写入数据,将dat写入DQ
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)//循环8次,写入八个数据
	{
		DQ = 0;//先让总线处于低电平状态
		DQ = dat&0x01;//并上0x01,相当于将二进制数据dat最后一位0/1保留下来,并赋值给DQ
		Delay_OneWire(5);//延迟对应的时间,看看总线是否在该时间内由低电平变为高电平,若变了,此位数据就是“1”
		DQ = 1;//重置为高电平
		dat >>= 1;//右移一位,读取倒数第二个数
	}
	Delay_OneWire(5);
}

 2.3 读时序

//读取DQ中数据,原理同上
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

3 相关指令 

 3.1 ROM指令

3.2 功能指令

4 写的代码

首先需要去官方资源包里面添加onewire.c到自己的文件夹里

注意:必须要自己写一个onewire.h的头文件并进行添加,并且将

#include "onewire.h"
#include <STC15F2K60S2.H>
sbit DQ = P1^4;

写到onewire.c中,否则可能会报错;

onewire.h:

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

float read_t();

#endif

4.1 读取温度函数

》》用到的相关指令上文有介绍:

//读取温度函数
float read_t()
{
    unsigned char low, high;
    init_ds18b20();//初始化,复位 DS18B20 并建立通信连接
    Write_DS18B20(0xcc);//跳过指令,无需先进行 ROM 匹配,适用于总线上只有一个 DS18B20 的情况
    Write_DS18B20(0x44);//启动温度转换命令
    init_ds18b20();//进行初始化,为后续读取温度数据做准备
    Write_DS18B20(0xcc);//跳过指令
    Write_DS18B20(0xbe);//读取温度寄存器命令,DS18B20 接收到该命令后会将温度数据发送到总线上,等待微控制器读取
    
    // 读取温度数据的低字节和高字节
    low = Read_DS18B20();
    high = Read_DS18B20();

    // 将16位整数转换为实际温度值
    return (float)((high << 8) | low) / 16.0;
    
    
}

值得注意的是,在读取低字节和高字节的时候,单片机是按照该原理图自上而下读取:

因此可以得到低字节和高字节(高地的区分在上文)并经过处理合并后转换为实际温度;

4.2 实际使用函数

main函数中我们可以将其逐位读取并显示在数码管上:

void newing(){
    t = read_t();
    
    num_1 = (unsigned int)t/ 10 % 10;
    num_2 = (unsigned int)t%10;
    num_3 = (unsigned int)(t * 10) % 10;//小数部分第一位取出
    
    ShowSMG_bit(num_1,1);
    Delay100ms(10);
    ShowSMG_bit(num_2,2);
    Delay100ms(10);
    ShowSMG_bit(num_3,3);
    
    Delay100ms(10);
    
}

在main函数中调用即可;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值