下面是一些博主在学习过程中所做的笔记:从原理到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函数中调用即可;