我是靠谱客的博主 高兴茉莉,最近开发中收集的这篇文章主要介绍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)初始化程序

       
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)写操作程序

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)读操作程序

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及其驱动程序编写所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部