我是靠谱客的博主 高兴茉莉,这篇文章主要介绍1-Wire总线-DS18B20及其驱动程序编写,现在分享给大家,希望可以做个参考。

1、 1-Wire总线-DS18B20

        DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小,抗干扰能力强,精度高的特点。             

       DS18B20具有唯一的序列号,在一根通信线,可以挂很多这样的数字温度计,十分方便。


2、 DS18B20共有三种形态的存储器资源
       

    1、ROM只读存储器,用于存放DS18B20的ID编码,其前8位是单线系列编码(DS18B20的是28H),后面48位是芯片唯一的序列号,最后8位是以上56位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。

    2、RAM数据暂存器,用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值(温度寄存器),第3、4个字节是用户EEPROM(温度报警值TH、TL储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像(配置寄存器)。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。

    3、EEPROM非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。


3、单片机与DS18B20接口电路

4、DS18B20的工作时序       

       DS18B20的一线工作协议流程是:

       初始化>ROM操作指令>存储器操作指令>数据传输。

       其工作时序包括:

       初始化时序
       写时序
       读时序
 1)初始化程序

       
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bit Init_DS18B20(void) { bit flag; //检测DS18B20是否存在的标志,flag=0,存在;flag=1,不存在 DQ = 1; //先将数据线拉高 for(time=0;time<2;time++); //略微延时约6微秒 DQ = 0; for(time=0;time<200;time++) ; //向DS18B20发出一持续480~960us的低电平复位脉冲 DQ = 1; //释放数据线(将数据线拉高) for(time=0;time<10;time++) ; //延时约30us(释放总线后需等待15~60us让DS18B20 输出存在脉冲) flag=DQ; //让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time++) ; //延时足够长时间,等待存在脉冲输出完毕 return (flag); //返回检测成功标志 }
2)写操作程序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=0; i<8; i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0; //将数据线从高拉低时即启动写时序 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++); //延时约30us,DS18B20在拉低后的约15~45us期间从数据线上采样 DQ=1; //释放数据线 for(time=0;time<1;time++); //延时3us,两个写时序间至少需要1us的恢复期 dat>>=1; //将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间,两个字节之间 }


3)读操作程序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat; //储存读出的一个字节数据 for (i=0;i<8;i++) { DQ =1; // 先将数据线拉高 _nop_(); //等待一个机器周期 DQ = 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 _nop_(); //等待一个机器周期 DQ = 1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ; //延时约6us,使主机在15us内采样 dat>>=1; if(DQ==1) dat|=0x80; //如果读到的数据是1,则将1存入dat else dat|=0x00; //如果读到的数据是0,则将0存入dat for(time=0;time<8;time++); //延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat); //返回读出的十六进制数据 }


最后

以上就是高兴茉莉最近收集整理的关于1-Wire总线-DS18B20及其驱动程序编写的全部内容,更多相关1-Wire总线-DS18B20及其驱动程序编写内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部