单片机DS18B20(内包括编程思路)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuyuzun/article/details/57419695

特点:

  1. 通信方式:1-Wire单总线通信
  2. 每个DS18B20都有唯一的64为序列号储存在板载ROM(只读存储器)中;
  3. 无需外部器件
  4. 电源范围3.0V~5.5V
  5. 可以测量的范围是-55℃~+125℃(摄氏度);
  6. 在-10~+85℃范围内精确度为±0.5℃;
  7. 温度计分辨率可以(通过编程)设置为9~12位工作模式,12位时分辨率对应为0.0625℃;
    /这里咱们及时一下分辨率:只要器件检测到的温度变化超过0.0625摄氏度(12位工作模式),最小刻度值就会加1,如果设置为0.5摄氏度工作模式
    ,温度每变化0.5℃,最小刻度变化为1
    /
  8. 器件内部内置A/D转换器;
    DS18B20在实际应用中的典型接法:(两种,本博客给大家介绍的是第二种接线的方法)

第一种:
工作在寄生于下的典型接法:DS18B20的GND和Vdd都接地,为了提高DS18B20的工作电流,在单总线上接上一个带场效应管的强上拉电路提供上拉电流,
这里写图片描述
第二种:
外部接法:先对于第一种解法相对于比较简单,可以节省单片机管脚;
这里写图片描述

单总线时序:

  1. DS18B20采用1-wire Bus所有数据都在一条线上传输,因此对时序要求非常严格以确保数据的完整性;
  2. 1-wire信号类型:复位脉冲,写0,写1,存在脉冲,读0,读1;(前三是由主机发出,后三是DS18B20发出,主机采样获取)
  3. 数据的传输总是从最低有效位开始;

重点来了:前面的东西都不看是可以的,毕竟我们拿到一个器件之后虽然了解一些基础设置是必要的,但我们最重要的是知道这个动心该怎么用;
下面将会给大家介绍一下编程的思路,也就是解决问题的办法。下面就是编程思路:
编程总体思路:1.初始化 2.ROM操作指令 3. DS18B20功能指令(读暂存器,写暂存器)
初始化时序(初始化函数):
初始化时序里包含复位DS18B20和接收DS18B20返回的存在信号;
主机和DS18B20在做任何通信之前都需要对其进行初始化。
这里写图片描述
下面,我们将会通过图来写程序:
/单总线初始化时序/
bit Init_DS18B20()
{
bit i;
DS = 1 ;
nop();
DS = 0;
Delay_us(75); //拉低总线499.45us,
DS = 1; //释放总线
Deley_us(4); //延时37.95us,等待读取
i = DS;
Delay_us(20); //141.95us
DS = 1;
nop();
return i;
}
/控制器写0和1/
这里写图片描述
void write_byte(uchar dat) //注意这里传输的是一个字节;
{ //产生一个写时序,至少要将总线拉低1us,数据从低位向高位发送;
uchar i;
for(i=0;i<8;i++)
{
DS = 0;
nop(); //产生写时序
DS = dat & 0x01;
Deley_us(10); //76.95us
DS = 1; //释放总线准备下一次数据写入
nop();
dat >>= 1;
}
}
/读数据/
这里写图片描述
uchar read_byte()
{
uchar dat,i,j;
for(i=0;i<8;i++)
{
DS = 0;
nop(); //产生读时序;
DS = 1;
nop(); //释放总线
j = DS;
Delay_us(10); //76.95us
DS = 1;
nop();
dat = (j<<7)|(dat>>1); //数据从从低位传向高位
}
return dat;
}

/基于C语言的模块化编程,我们通过上面的功能模块,也即是功能函数,下面咱们来写一个主函数,来调用这些功能模块,从而实现逻辑器件的编程/
void main()
{
uint i;
uchar L,M;
while(1)
{
ds_init(); //初始化DS18B20
write_byte(0xcc); //发送忽略ROM指令
write_byte(0x44); //发送温度转换指令
ds_init(); //初始化DS18B20
write_byte(0xcc); //发送忽略ROM指令
write_byte(0xbe); //读取DS18B20暂存器值;
L = read_byte(); //先接收低八位;
M = read_byte(); //再接收高八位;
i = M;
i <<= 8;
i |= L;
i = i0.062510 + 0.5;
Display(i);
}
}
一些重要的命令:

  1. 忽略ROM指令(0xcc):当总线上只有一个DS18B20时,忽略掉对温感的辨别,可以直接对这个温感进行操作,发送指令。倘若总线上有大于一个温感,发送0xcc将会发生数据冲突;
  2. 温度转换指令(0x44):主机告诉温感,将温度的模拟量,转化为数字量保存起来;
  3. 读暂存器指令(0xbe): 主机读取温感暂存器内的数字值。读取从字节0开始,一直进行下去,知道读完暂存器所有字节,如果不想读完所有字节,控制器可以在任何时刻发出复位命令来种植读取;
  4. 写暂存器指令(0x4e):主机向温感暂存器写入数据,开始位置在TH寄存器(暂存器的第2个字节),接下来写入TL寄存器(暂存器的第3个字节),最后写入配置寄存器(暂存器的第4个字节);
  5. 拷贝暂存器指令(0x48):主机将TH,TL和配置寄存器(第2,3,4字节)的内容拷贝到EEPROM中;

没有更多推荐了,返回首页