特点: 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 = i*0.0625*10 + 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中;
新闻热点
疑难解答