精华内容
下载资源
问答
  • DS18B20驱动流程图

    2013-04-01 18:43:45
    采用windows visio画图工具详细介绍了,DS18B20传感器复位函数,写字节函数,读字节函数,读取温度函数的流程图
  • DS18B20数字温度传感器的详细介绍,以及程序流程图和程序源代码。
  • 为帮助大家更好的学习DS18B20本人截取了四段图片,包括,获取温度DS18B20读写程序段及操作流程,其中的delay函数为while(i--);希望对大家有所帮助,三段程序经本人测试完全正确!
  • DS18B20检测温度程序

    2017-08-07 11:11:42
    DS18b20检测温度,并在数码管实时显示
  • DS18B20

    千次阅读 2018-06-26 00:07:21
     DS18B20硬件设计DS18B20供电的范围为3.0V~5.0V,也可以通过数据线供电;其分辨率可以被使用者选择为9~12位,分辨率越高,转换需要时间越长。根据供电方式不同,DS18B20有两种典型的硬件电路接法,分别为寄生电源...

    DS18B20

    1.     DS18B20硬件设计

    DS18B20供电的范围为3.0V~5.0V,也可以通过数据线供电;其分辨率可以被使用者选择为9~12位,分辨率越高,转换需要时间越长。

    根据供电方式不同,DS18B20有两种典型的硬件电路接法,分别为寄生电源模式和外部电源供电模式。寄生电源的控制回路中,当总线为高电平时,电源由单总线通过VDD引脚,部分能量存储在寄生电源储能电容C内,当数据总线处于低电平时释放能量以提供给器件能量。但是,当DS18B20正在执行温度转换或从高速暂存器向EEPROM传送数据时,工作电流可能达到1.5Ma;该电流可能会引起连接单总线的弱上拉电路的不可能接受的压降,这需要更大的电流,而此时储能电容无法提供。为了保存此时DS18B20有足够的供电,当进行温度转换或者拷贝数据到EEPROM操作时,必须给单总线提供一个强上拉。


    图1 寄生电源供电模式


    图2 外部电源供电模式

    每个DS18B20都有一个独特的64为序列号,从而允许多只DS18B20同时链接在一根单线总线上,因此可以用一个微控制器覆盖在一大片区域的DS18B20。

    2.      DS18B20时序

    DS18B20工作协议流程一般为:初始化àROM操作指令à存储器操作指令à数据传输;其工作时序包括:初始化时序、写时序和读时序。

    1)      初始化时序

    微控制器首先发出一个480~960us的低电平脉冲,然后释放总线变为高电平,并在随后的480us时间内对总线进行监测,如果有低电平出现说明总线上有器件已经做出应答,如无低电平出现一直都是高电平说明总线上无期间应答。

    而作为器件的DS18B20在一上电后就一直在监测总线上是否有480~960us的低电平出现,如果有,在总线转为高电平后等待15~60us将总线点平拉低60~240us做出响应存在脉冲,高度主机本器件已经做好准备,否则就一直检测等待。


    图3 复位时序

    void DS18B20_Reset(void)

    {

           DS18B20_IO_OUT();//输出

           DS18B20_DQ_Low;

           delay_us(480);//延时480微妙   

           DS18B20_DQ_High;

           delay_us(480);//延时480微妙   

    }

    2)      写时序

    写周期最少为60us,最长不超过120us,写周期一开始作为主机先将总线拉低15us表示写周期开始,随后若干主机想写0,则继续拉低低电平最少60us直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线点平1us后就释放总线为高电平,一直到写周期结束。

    而作为从机的DS18B20则在检测到总线被拉低后等待15us然后从15us到45us开始对总线采样,在采样期间内总线为高电平则为1,若采样期间总线为低电平则为0。


    图4 写时序

    void DS18B20_Write_Byte(u8 dat)

    {

           u8 i=0;

           DS18B20_IO_OUT();//输出

           for(i=0;i<8;i++)

           {

                  DS18B20_DQ_Low;       //拉低

                  delay_us(15);//延时15微妙

                  if((dat&0x01)==1)

                  {

                         DS18B20_DQ_High;

                  }

                  else

                  {

                         DS18B20_DQ_Low;

                  }

                  delay_us(60);//延时60微妙

                  DS18B20_DQ_High;

                 

                  dat>>=1;//准备下一位数据的发送   

           }

    }

    3)      读时序

    对于读数据操作时序也可分为读0和读1时序两个过程,读时序是从主机把单总线拉低之后,在1us之后就得释放单总线为高电平,以让DS18B20将数据传输到单总线上。DS18B20在检测到总线被拉低1us后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若是送出1则释放总线为高电平。

    主机在一开始拉低总线1us后释放总线,然后在包括前面的拉低总线点平1us在内的15us时间内完成对总线进行采样检测,采样期内为低电平在确认为0,采样期间总线为高电平则确认为1,完成一个读时序,至少需要60us才能完成。


    图5 读时序

    u8 DS18B20_Read_Byte(void)

    {

           u8i=0,TempData=0;

           for(i=0;i<8;i++)

           {

                  TempData>>=1;

                  DS18B20_IO_OUT();//输出

                  DS18B20_DQ_Low;       //拉低

                  delay_us(4);//延时4微妙

                  DS18B20_DQ_High;

                  delay_us(10);//延时10微妙

                  DS18B20_IO_IN();

                  if(GPIO_ReadInputDataBit(GPIO_DS18B20,IO_DS18B20)==1)

                  {

                     TempData|=0x80;//读数据 从低位开始

                  }

                  delay_us(45);//延时45微妙

           }

           returnTempData;

    }

    3.      DS18B20的操作方法

    DS18B20单线通信功能是通过分时完成的,有严格的时序概念。系统对于DS18B20的各种操作必须按照协议进行,根据DS18B20的协议规定,微控制器控制DS18B20完成温度转换必须要经过如下四个步骤:

    1)      每次读写前对DS18B20进行复位初始化;

    2)      发送一条ROM指令;

    3)      发送存储器指令;

    一般程序中对单个DS18B20进行温度转换和温度读取的流程如下:

    1)      主机复位;

    2)      主机写跳过ROM操作命令(CCH);

    3)      主机写转换温度的操作指令,然后释放总线至少1s,让DS18B20完成转换操作。再此,需要注意的是每个命令字节在写的时候都是低字节先写。

    4)      主机发送复位操作并接受DS18B20的应答脉冲;

    5)      主机写跳过ROM操作命令(CCH);

    6)      主机发出读取RAM的命令(BEH),随后依次读取DS18B20发出的从第0到第8共9个字节。如果只想读取温度数据,可以在读取前两个数据后不再理会后面DS18B20发出的数据即可,同样读取的数据也是地位在前。


    图6 DS18B20存储器图,上电状态取决于该EEPROM中的参数值

    double DS18B20_Get_wd(void)

    {

           u8TL=0,TH=0;

           u16temp=0;

           doublewd=0;

     

           DS18B20_Reset();//复位

           DS18B20_Write_Byte(0xCC);//跳过ROM命令

           DS18B20_Write_Byte(0x44);//温度转换命令

           delay_ms(800);//延时800毫秒

           DS18B20_Reset();//复位

           DS18B20_Write_Byte(0xCC);//跳过ROM命令

           DS18B20_Write_Byte(0xBE);//读温度命令

     

           TL=DS18B20_Read_Byte();//LSB

           TH=DS18B20_Read_Byte();//MSB

     

           temp=TH;

           temp=(temp<<8)+TL;

     

           if((temp&0xF800)==0xF800)//负温度判断

           {

                  temp=~temp;

                  temp=temp+1;

                  wd=temp*(-0.0625);

           }

           else

           {

                  wd=temp*0.0625;

           }

           return wd;

    }

    4.      高低温报警和测量精度的读取

    void DS18B20_return_TH_TL_CONF( void ) 

        chardata,data_TH,data_TL,CONF; 

        DS18B20_Reset(); 

        DS18B20_write_byte(0xcc);       //忽略rom指令 

        DS18B20_write_byte(0xbe);   //读取温度转换值 

        data = DS18B20_read_byte(); 

        data = DS18B20_read_byte(); 

        data_TH = DS18B20_read_byte(); 

        data_TL = DS18B20_read_byte(); 

        CONF =DS18B20_read_byte(); 

       printf("过温报警的温度为:%d℃\r\n",data_TH); 

       printf("低温报警的温度为:%d℃\r\n",-(data_TL-128)); 

        CONF&=0x60 ; 

        CONF=CONF>>5; 

        switch(CONF) { 

            case0: 

               printf("DS18B20的测量精度为9位,精度为0.5℃\r\n"); 

               break; 

            case1: 

               printf("DS18B20的测量精度为10位,精度为0.25℃\r\n"); 

               break; 

            case2: 

               printf("DS18B20的测量精度为11位,精度为0.125℃\r\n"); 

               break; 

            case3: 

               printf("DS18B20的测量精度为12位,精度为0.0625℃\r\n"); 

               break; 

           default: 

               printf("error!!\r\n"); 

               break; 

        } 

    void DS18B20_write_TH_TL_CONF(u8 TH,u8 TL,u8mode) 

        u8 dat; 

        switch(mode){ 

            case0: 

               dat=31; 

               break; 

            case1: 

               dat=63; 

               break; 

            case2: 

               dat=95; 

               break; 

            case3: 

               dat=127; 

               break; 

           default: 

                printf("mode error!!\r\n"); 

               dat=127; 

               break; 

        } 

       TL=TL+128; 

        DS18B20_Reset(); 

        DS18B20_write_byte(0xcc);       //忽略rom指令 

        DS18B20_write_byte(0x4e);   //写入暂存寄存器 ,过温和低温报警值 

        DS18B20_write_byte(TH);//写入20°为过温报警值 

        DS18B20_write_byte(TL);//写入-20°为低温报警值 

        DS18B20_write_byte(dat);    //写入精度 

        DS18B20_Reset(); 

        DS18B20_write_byte(0xcc);       //忽略rom指令 

        DS18B20_write_byte(0x48);   //将写入的暂存寄存器拷入EEPROM 


    展开全文
  • DS18B20温度传感器-51单片机控制程序

    千次阅读 多人点赞 2019-12-11 21:47:20
    DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信,采集数据的...
    一.概述

    DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信,采集数据的精度为12bit。
    该传感器的温度检测范围为-55℃至+125℃,并且在温度范围超过-10℃至85℃之外时还具有±0.5℃的精度。此外,DS18B20可以直接由数据线供电而不需要外部电源供电。
    在这里插入图片描述

    二.电气参数
    1.特点
    • 供电电压:3.0V-5.5V。
    • 测量温度范围:-55~+125℃
    • 精度:±0.5℃
    • 数据传输:“一线总线”的数字方式传输
    • 采集精度:可以由用户自定义为9-Bits至12-Bits。
    2.引脚说明

    在这里插入图片描述

    3.参考电路图

    在这里插入图片描述
    DS18B20供电一般采用外部供电方式,并且在数据线上并联一个4.7k的上拉电阻,以增强数据的抗干扰能力。

    三.控制时序
    1.初始化时序

    与DS18B20所有的通信都是由初始化时序开始的,该时序包括从主设备发出的复位脉冲及从DS18B20响应的存在脉冲组成。如图所示。
    在这里插入图片描述
    当DS18B20响应复位信号的存在脉冲后,则其向主设备表明其在该总线上,并且已经做好操作命令。

    /*******************************************************************************
    * 函 数 名         : Ds18b20Init
    * 函数功能		   : 初始化
    * 输    入         : 无
    * 输    出         : 初始化成功返回1,失败返回0
    *******************************************************************************/
    uchar Ds18b20Init()
    {
    	unsigned char x=0;
      DSPORT = 1;         //DQ复位
      Delay_DS18B20(8);    //稍做延时
      DSPORT = 0;         //单片机将DQ拉低
      Delay_DS18B20(80);   //精确延时,大于480us
      DSPORT = 1;         //拉高总线
      Delay_DS18B20(14);
      x = DSPORT;           //稍做
    return x;//初始化成功
    }
    
    2.读时序

    写时段有两种情况:“写1”时段和“写0”时段。主设备通过写1时段来向DS18B20中写入逻辑1以及通过写0时段来向DS18B20中写入逻辑0。每个写时段最小必须有60us的持续时间且独立的写时段间至少有1us的恢复时间。两个写时段都是由主设备通过将1-Wire总线拉低来进行初始化,如图。
    在这里插入图片描述
    根据以上读0及1的时序,便可实现读取一个完整字节的函数,如下:

    /*******************************************************************************
    * 函 数 名         : Ds18b20ReadByte
    * 函数功能		   : 读取一个字节
    * 输    入         : 无
    * 输    出         : dat
    *******************************************************************************/
    uchar Ds18b20ReadByte()
    {
    	unsigned char i=0;
      unsigned char dat = 0;
      for (i=8;i>0;i--)
      {
        DSPORT = 0;     // 给脉冲信号
        dat>>=1;
        DSPORT = 1;     // 给脉冲信号
        if(DSPORT)
        dat|=0x80;
        Delay_DS18B20(4);
      }
      return(dat);
    }
    
    3.写时序

    仅在读时段期间DS18B20才能向主设备传送数据。因此,主设备在执行完读暂存寄存器[BEh]或读取供电模式[B4h]后,必须及时地生成读时段,这样DS18B20才能提供所需的数据。此外,主设备可以在执行完转换温度[指令:44h]或拷贝EEPROM[指令:B8h]命令后生成读时段,以便获得在“DS18B20功能命令”表中提到的操作信息。时序如图:
    在这里插入图片描述
    根据以上写0及1的时序,便可实现写入一个完整字节的函数,如下:

    /*******************************************************************************
    * 函 数 名         : Ds18b20WriteByte
    * 函数功能		   : 向18B20写入一个字节
    * 输    入         : com
    * 输    出         : 无
    *******************************************************************************/
    void Ds18b20WriteByte(uchar dat)
    {
      unsigned char i=0;
      for (i=8; i>0; i--)
      {
        DSPORT = 0;
        DSPORT = dat&0x01;
        Delay_DS18B20(5);
        DSPORT = 1;
        dat>>=1;
      }
    }
    
    四.控制程序
    1.读取温度流程

    要读取一个完整的温度值,需要根据以上流程进行操作。先对DS18B20进行复位操作,再发送开始转换指令(指令值:0x44),再发送复位操作,等待DS18B20应答后,发送读取温度指令,最后就可以读取16位的数据(有限位最大为12位)。
    在这里插入图片描述

    2.读取温度程序
    /*******************************************************************************
    * 函 数 名         : Ds18b20ChangTemp
    * 函数功能		   : 让18b20开始转换温度
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void  Ds18b20ChangTemp()
    {
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
    	Ds18b20WriteByte(0x44);	    //温度转换命令
    //	Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
    }
    /*******************************************************************************
    * 函 数 名         : Ds18b20ReadTempCom
    * 函数功能		   : 发送读取温度命令
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    void  Ds18b20ReadTempCom()
    {	
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
    	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
    }
    /*******************************************************************************
    * 函 数 名         : Ds18b20ReadTemp
    * 函数功能		   : 读取温度
    * 输    入         : 无
    * 输    出         : 温度值
    *******************************************************************************/
    
    int Ds18b20ReadTemp()
    {
    	int temp = 0;
    	uchar tmh, tml;
    
    	Ds18b20ChangTemp();			 	//先写入转换命令
    	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
    	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
    	tmh = Ds18b20ReadByte();		//再读高字节
    	temp = tmh;
    	temp <<= 8;
    	temp |= tml;
    	return temp;
    }
    /*******************************************************************************
    * 函 数 名         : GetTemp
    * 函数功能		   : 串口输出温度值
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    Void GetTemp(void)
    {
    	int temp;
    	float tp; 
    	ET0 = 0;
    	temp = Ds18b20ReadTemp();
    	ET0 = 1;
    	if(temp<= 0)				    //当温度值为负数
        {
    //		temp=temp-1;
    //		temp=~temp;
    //		tp=temp;
    //		temp=tp*0.0625*100+0.5;	
            Uart_SendString("Overrate!\r\n");    //超过量程
        }
     	else
    	{			
    		tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
    		//如果温度是正的那么,那么正数的原码就是补码它本身
    		temp=tp*0.0625*100+0.5;	
    		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
    		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
    		//算加上0.5,还是在小数点后面。
    	}
    	Uart_SendString("The Current Temperature is: ");
    	Uart_SendByte((temp% 10000 / 1000) + 0x30);
    	Uart_SendByte((temp% 1000 / 100) + 0x30);
    	Uart_SendByte('.');
    	Uart_SendByte((temp% 100 / 10) + 0x30);
    	Uart_SendByte((temp% 10) + 0x30);
    	Uart_SendString("℃\r\n"); 
    }
    

    如需DS18B20相关资料及例程, 请关注公众号,首页回复DS18B20获取资料
    在这里插入图片描述

    展开全文
  • 以单片机作为核心控制器件,选取DS18B20温度传感器作为数字温度计,实时测量并反应实际温度,编写程序,采集实时温度并通过数码管显示当前温度,通过按键设置的温度上、下限,将其与实际温度的比较结果,作为控制...

    【智能温控风扇】

    一、设计任务

    1. 设计内容
      以单片机作为核心控制器件,选取DS18B20温度传感器作为数字温度计,实时测量并反应实际温度,编写程序,采集实时温度并通过数码管显示当前温度,通过按键设置的温度上、下限,将其与实际温度的比较结果,作为控制风扇的开关及档位的依据:
      当实际温度低于所设温度下限时,风扇关闭,为0档;
      当实际温度高于温度下限,低于温度上限时,风扇转速一般,为1档;
      当温度高于温度上限时,风扇转速最快,为2档;
    2. 设计目的
      完成基于单片机的温控风扇的课程设计作品,通过课程设计中对原理图、PCB图、PTOTEUS仿真等的实际操作,熟悉相关开发软件,了解设计流程,加深对单片机、DS18B20的了解;此外,熟悉焊接流程,学会调试,加强动手能力。

    二、硬件介绍

    1. 硬件组成
      电路板、STC89C52单片机、DS18B20、12M晶振、六角自锁开关、三极管若干、电容若干、电阻若干、开关若干、导线若干、风扇等

    2. 主要功能描述
      1)STC89C52单片机
      核心控制器件,执行程序代码,接收从DS18B20传回的实时温度,并输出信号控制数码管的显示,根据扫描按键的通断情况执行相应的设置温度上限、设置温度下限的功能切换,根据接收到的实际温度与设置温度上、下限的比较结果,输出信号控制风扇的档位
      2)DS18B20温度传感器
      实时测量实际温度,并通过相关协议,将测量到的实际温度反映给单片机
      3)六角自锁开关
      是整个电路的电源总开关
      4)三极管
      E、B、C三脚分别与电源、与单片机I/O口(经电阻)、与数码管位选或风扇正极相连,相当于电力开关,使电路得以依据单片机I/O口输出信号的高低实现三极管的通断,从而控制数码管显示的选位及风扇档位的调节
      5)电容及12M晶振
      瓷片电容与晶振构成单片机的外部振荡信号,是单片机实际应用中最小系统的组成部分;电解电容接在电源与地之间,起滤波的作用
      6)电阻
      起保护电阻的作用,控制单片机输出端口上的电流大小,防止因电流过大对电路造成损坏、控制数码管段选中的电流大小,防止因电流变化等问题影响电路及数码管的显示亮度;此外,在PROTEUS仿真中,需要在位选出接入电阻,方可进行正常仿真,但实际设计中不需要这里的电阻

    3. DS18B20简介
      在这里插入图片描述
      DS18B20内部结构图
      DS18B20特性:
      1)独特的单线接口 只需 1 个接口引脚即可通信
      2)多点 multidrop 能力使分布式温度检测应用得以简化
      3)不需要外部元件
      4)可用数据线供电
      5)不需备份电源
      6)测量范围从-55 至+125 增量值为 0.5 等效的华氏温度范围是-67 F至257 F
      7)增量值为 0.9 F
      8)以 9 位数字值方式读出温度
      9)在1秒(典型值)内把温度变换为数字
      10)用户可定义的非易失性的温度告警设置
      11)告警搜索命令识别和寻址温度在编定的极限之外的器件 温度告警情况
      12)应用范围包括恒温控制 工业系统 消费类产品 温度计或任何热敏系统
      DS1820数字温度计以9位数字量的形式反映器件的温度值,独特的单线接口 只需 1 个接口引脚即可通信,信息经过单线接口送入 DS1820 或从 DS1820 送出 因此从中央处理器到 DS1820 仅需连接一条线(和地)。DSl820 的测量范围从-55 到+125 增量值为 0.5 可在 l s(典型值)内把温度变换成数字。读、写和完成温度变换所需的电源可以由数据线本身提供,而不需要外部电源。
      在单线端口条件下,必须先建立 ROM 操作协议,才能进行存储器和控制操作。因此,控制器必须首先提供下面 5 个 ROM 操作命令之一:
      1)读 ROM,2)匹配 ROM,3)搜索 ROM,4)跳过 ROM,5)报警搜索。

    三、系统原理

    1. 原理图、PROTEUS仿真图、PCB图、3D立体图及实际电路连接图
      在这里插入图片描述
      温控风扇原理图
      在这里插入图片描述
      PROTEUS仿真图
      在这里插入图片描述
      PCB图
      在这里插入图片描述
      实际电路连接图
    2. 程序设计
      1)主程序
      在进行主程序的初始化之后,获取当前温度,而后进入while循环,调用自动温控程序;自动温控函数里,先调用显示子程序,显示实际温度,随后扫描按键,若无按键按下,则直接比较实际温度与温度上、下限的大小,调节电机档位,也就是风扇的转速。
      在这里插入图片描述
      2)温度获取子程序
      对DS18B20进行初始化,将采集得到的温度信息写入寄存器,而后启动温度转换,调用相关子程序,读取温度寄存器数据,并经由公式转换,求得实际温度,传入单片机,作为调节风扇档位的依据。
      在这里插入图片描述
      3)显示子程序
      根据信号依次做出位选与段选操作,并调用延时子程序,方便用户观察数据。
      在这里插入图片描述
      4)按键扫描子程序
      根据各端口的电平高低,判断按键是否按下,并进入相应的子程序,调节温度的上限或下限,对温度上、下限进行加、减设置。
      在这里插入图片描述
      5)程序代码
    #include<reg51.h>
    #include<intrins.h>    //包含头文件
    #define uchar unsigned char
    #define uint unsigned int   //宏定义
    
    sbit dj=P2^3;//电机控制端接口
    sbit DQ=P2^4;//温度传感器接口
    //按键接口/
    sbit key1=P2^0;//设置温度
    sbit key2=P2^1;//温度加
    sbit key3=P2^2;//温度减
    //
    sbit w1=P3^7;
    sbit w2=P3^6;
    sbit w3=P3^5;
    sbit w4=P3^4;     //数码管的四个位
    /共阴数码管段选//
    uchar table[22]=
    {0xD7,0x11,0xCD,0x5D,0x1B,
    0x5E,0xDE,0x15,0xDF,0x5F,
    0x9F,0xDA,0xC6,0xD9,0xCE,0x8E, 
    0x08,0xC2,0x9B,0x00,0xFF,0x97};
    uint wen_du;      //温度变量  
    uint shang,xia; //对比温度暂存变量
    uchar dang;//档位显示
    uchar flag;
    uchar d1,d2,d3;//显示数据暂存变量
    void delay(uint ms)  //延时函数,大约延时25x12us
    {
    uchar x;
    for(ms;ms>0;ms--)
      for(x=120;x>0;x--);
    }
    /***********ds18b20延迟子函数(晶振12MHz )*******/ 
    void delay_18B20(uint i)
    {
    while(i--);
    }
    /**********ds18b20初始化函数**********************/
    void Init_DS18B20() 
    {
      uchar x=0;
      DQ=1;          //DQ复位
      delay_18B20(8);  //稍做延时
      DQ=0;          //单片机将DQ拉低
      delay_18B20(80); //精确延时 大于 480us
      DQ=1;          //拉高总线
      delay_18B20(14);
      x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
      delay_18B20(20);
    }
    /***********ds18b20读一个字节**************/  
    uchar ReadOneChar()
    {
    uchar i=0;
    uchar dat=0;
    for (i=8;i>0;i--)
      {
        DQ=0; // 给脉冲信号
        dat>>=1;
        DQ=1; // 给脉冲信号
        if(DQ)
        dat|=0x80;
        delay_18B20(4);
      }
      return(dat);
    }
    /*************ds18b20写一个字节****************/  
    void WriteOneChar(uchar dat)
    {
      uchar i=0;
      for (i=8;i>0;i--)
      {
        DQ=0;
       DQ=dat&0x01;
         delay_18B20(5);
       DQ=1;
         dat>>=1;
    }
    }
    /**************读取ds18b20当前温度************/
    void ReadTemperature()
    {
    uchar a=0;
    uchar b=0;
    uchar t=0;
    Init_DS18B20();
    WriteOneChar(0xCC);     // 跳过读序号列号的操作
    WriteOneChar(0x44);  // 启动温度转换
    delay_18B20(100);       // this message is very important
    Init_DS18B20();
    WriteOneChar(0xCC);  //跳过读序号列号的操作
    WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
    delay_18B20(100);
    a=ReadOneChar();     //读取温度值低位
    b=ReadOneChar();     //读取温度值高位
    wen_du=((b*256+a)>>4);    //当前采集温度值除16得实际温度值
    }
    void display()//显示温度
    {
    w1=0;P1=~table[d1];delay(10); //第1位
    P1=~0x00;w1=1;delay(1);
      
    w2=0;P1=~table[16];delay(10);//第2位
    P1=~0x00;w2=1;delay(1);
    
    w3=0;P1=~table[d2]; delay(10);//第3位
    P1=~0x00;w3=1;delay(1);
    
    w4=0;P1=~table[d3];delay(10);//第4位
    P1=~0x00;w4=1;delay(1);
    }
    void zi_keyscan()//自动模式按键扫描函数
    {
    if(key1==0)         //设置键按下
    {
      delay(10);        //延时去抖
      if(key1==0)flag=1;      //再次判断按键,按下的话进入设置状态
      while(key1==0);//松手检测    //按键释放
    }
    while(flag==1)        //进入设置上限状态
    {
      d1=18;d2=shang/10;d3=shang%10;   //显示字母H 和上限温度值
      display();        //调用显示函数
      if(key1==0)        //判断设置键是否按下
      {
       delay(10);       //延时去抖
       if(key1==0)flag=2;     //按键按下,进入设置下限模式
       while(key1==0);//松手检测
      }
      if(key2==0)        //加键按下
      {
       delay(10);       //延时去抖
       if(key2==0)       //加键按下
       {
        shang+=1;      //上限加5
        if(shang>=100)shang=100;  //上限最大加到100
       }while(key2==0);//松手检测
      }
      if(key3==0)        //减键按下
      {
       delay(10);       //延时去抖
       if(key3==0)       //减键按下
       {
        shang-=1;      //上限减1
        if(shang<=10)shang=10;   //上限最小减到10
       }while(key3==0);//松手检测
      }  
    }
    while(flag==2)        //设置下限
    {
      d1=17;d2=xia/10;d3=xia%10;    //显示字母L 显示下限温度值
      display();        
      if(key1==0)
      {
       delay(10);
       if(key1==0)flag=0;
       while(key1==0);//松手检测
      }
      if(key2==0)
      {
       delay(10);
       if(key2==0)
       {
        xia+=1;
        if(xia>=99)xia=99;
       }while(key2==0);//松手检测
      }
      if(key3==0)
      {
       delay(10);
       if(key3==0)
       {
        xia-=1;
        if(xia<=0)xia=0; 
       }while(key3==0);//松手检测
      }  
    }
    }
    void zi_dong()//自动温控模式
    {
    uchar i;
    d1=dang;d2=wen_du/10;d3=wen_du%10;  //显示档位,显示当前温度值
    zi_keyscan();//按键扫描函数
    display();  //调用显示函数
    
    if(wen_du<xia){dj=1;dang=0;}//低于下限  档位为0 电机停止
    if((wen_du>=xia)&&(wen_du<=shang))//温度大于下限,小于上限
    {
      dang=1;           //档位置1
      for(i=0;i<3;i++){dj=0;display();zi_keyscan();} //PWM通过延时得到
      for(i=0;i<6;i++){dj=0;display();zi_keyscan();}  
    }
    if(wen_du>shang){dj=0;dang=2;}//高温全速,档位置2
    
    }
    void main()    //主函数
    {
    uchar j;
    dj=0;    //电机开
    shang=30;
    xia=20;    //初始上下限值
    for(j=0;j<80;j++)   //先读取温度值,防止开机显示85
      ReadTemperature();
    while(1)     //进入while循环
    { 
      ReadTemperature(); //读取温度值
      for(j=0;j<100;j++)zi_dong();//自动温控模式
    }
    }
    
    

    https://download.csdn.net/download/qq_42253057/18814019

    展开全文
  • DS18B20 驱动编写

    万次阅读 多人点赞 2016-03-24 18:38:47
     DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括:初始化时序、写时序、读时序。 1、初始化时序  主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高...

      对驱动工程师而言,时序分析的意思是让芯片之间的访问满足芯片手册中时序图信号的有效的先后顺序、采样建立时间、保持时间的要求,通过时序来达到数据传输和硬件控制的目的。

    嵌入式开发平台:mini2440

    DS18B20 所用GPIO:S3C2410_GPF(3)


    一、DS18B20 时序分析

            DS18B20的一线工作协议流程是:初始化→ROM操作指令→存储器操作指令→数据传输,其工作时序包括:初始化时序、写时序、读时序。

    1、初始化时序

           主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答,若无低电平出现一直都是高电平说明总线上无器件应答。

       作为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备,若没有检测到就一直在检测等待。



    static int ds18b20_init(void)  
    {  
        int retval = 0;  
      
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0);  
      
        s3c2410_gpio_setpin(DQ, 1);  
        udelay(2);  
        s3c2410_gpio_setpin(DQ, 0); // 拉低ds18b20总线,复位ds18b20   
        udelay(500);                // 保持复位电平500us   
      
        s3c2410_gpio_setpin(DQ, 1); // 释放ds18b20总线   
        udelay(60);  
      
        // 若复位成功,ds18b20发出存在脉冲(低电平,持续60~240us)   
        s3c2410_gpio_cfgpin(DQ, CFG_IN);  
        retval = s3c2410_gpio_getpin(DQ);  
      
        udelay(500);  
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0);  
        s3c2410_gpio_setpin(DQ, 1); // 释放总线   
      
        return retval;  
    }  

    2、写时序

         写周期最少为60微秒,最长不超过120微秒,写周期一开始作为主机先把总线拉低1微秒表示写周期开始,随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平;若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束

         而作为从机的DS18B20则在检测到总线被拉低后等待15微秒然后从15μs到45μs开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。



    static void write_byte(unsigned char data)  
    {  
        int i = 0;  
      
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 1);  
      
        for (i = 0; i < 8; i++)  
        {  
            // 总线从高拉至低电平时,就产生写时隙   
            s3c2410_gpio_setpin(DQ, 1);  
            udelay(2);  
            s3c2410_gpio_setpin(DQ, 0);  
            s3c2410_gpio_setpin(DQ, data & 0x01);  
            udelay(60);  
            data >>= 1;  
        }  
        s3c2410_gpio_setpin(DQ, 1); // 重新释放ds18b20总线   
    }  
    

    3、读时序

          对于读数据操作时序也分为读0时序和读1时序两个过程,读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若要送出1则释放总线为高电平。

         主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0,采样期内总线为高电平则确认为1,完成一个读时序过程,至少需要60μs才能完成。



    static unsigned char read_byte(void)  
    {  
        int i;  
        unsigned char data = 0;  
      // 总线从高拉至低,只需维持低电平17ts,再把总线拉高,就产生读时隙   
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0); 
     
        for (i = 0; i < 8; i++)  
        {  
            
            s3c2410_gpio_setpin(DQ, 1);  
            udelay(2);  
            s3c2410_gpio_setpin(DQ, 0);  
            udelay(2);  
            s3c2410_gpio_setpin(DQ, 1);  
            udelay(8);  
            data >>= 1;  
            s3c2410_gpio_cfgpin(DQ, CFG_IN);  
            if (s3c2410_gpio_getpin(DQ))  
                data |= 0x80;  
            udelay(50);  
        }  
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0);  
        s3c2410_gpio_setpin(DQ, 1); // 释放ds18b20总线   
        return data;  
    }  


    二、操作方法

           DS18B20单线通信功能是分时完成的,有严格的时序概念,如果出现序列混乱,1-WIRE器件将不影响主机,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行,根据DS18B20的协议规定,微控制器控制DS18B20完成温度的转换必须经过以下4个步骤:

    1)每次读写前对DS18B20进行复位初始化。复位要求主CPU将数据线下拉500μs,然后释放,DS18B20收到信号后等待16μs-60μs左右,然后发出60μs-240μs的存在低脉冲,主CPU收到此信号后表示复位成功。


    2)发送一条ROM指令



    3)发送存储器指令



    1、让DS18B20进行一次温度转换的具体操作如下:

    a -- 主机先做个复位操作;
    b -- 主机再写跳过ROM的操作(CCH)命令;
    c -- 然后主机接着写转换温度的操作指令,后面释放总线至少1秒,让DS18B20完成转换操作。需要注意的是每个命令字节在写的时候都是低字节先写,例如CCH的二进制为11001100,在写到总线上时要从低位开始写,写的顺序是“0、0、1、1、0、0、1、1”,整个操作的总线状态如图所。



    2、读取RAM的温度数据,同样,这个操作也要按照三个步骤:

    a -- 主机发出复位操作并接受DS18B20的应答(存在)脉冲;
    b -- 主机发出跳过对ROM操作的命令(CCH);
    c -- 主机发出读取RAM的命令(BEH),随后主机依次读取DS18B20发出的从第0-第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面DS18B20发出的数据即可,同样读取数据也是低位在前,整个操作的总线状态如图所示。



    三、具体驱动编写

    1、ds18b20_drv.c

    #include <linux/init.h>   
    #include <linux/module.h>   
    #include <linux/delay.h>   
    #include <linux/kernel.h>   
    #include <linux/moduleparam.h>   
    #include <linux/init.h>   
    #include <linux/types.h>   
    #include <linux/fs.h>   
    #include <mach/regs-gpio.h>   
    #include <mach/hardware.h>   
    #include <linux/cdev.h>   
    #include <asm/uaccess.h>   
    #include <linux/errno.h>   
    #include <linux/gpio.h>   
    #include <linux/device.h>   
      
    /* 相关引脚定义,方便以后移植 */  
    #define DQ         S3C2410_GPF(3)   
    #define CFG_IN     S3C2410_GPIO_INPUT   
    #define CFG_OUT    S3C2410_GPIO_OUTPUT   
      
    // ds18b20主次设备号(动态分配)   
    static int ds18b20_major = 0;  
    static int ds18b20_minor = 0;  
    static int ds18b20_nr_devs = 1;  
      
    // 定义设备类型   
    static struct ds18b20_device  
    {  
        struct cdev cdev;  
    };  
      
    struct ds18b20_device *ds18b20_devp;    /*设备结构体指针 */  
      
    static struct class *ds18b20_class;  
    static struct class_device *ds18b20_class_dev;  
      
    /* 函数声明 */  
    static int ds18b20_open(struct inode *inode, struct file *filp);  
    static int ds18b20_init(void);  
    static void write_byte(unsigned char data);  
    static unsigned char read_byte(void);  
    static ssize_t ds18b20_read(struct file *filp, char __user * buf, size_t count, loff_t * f_pos);  
    void ds18b20_setup_cdev(struct ds18b20_device *dev, int index);  
      
    static int ds18b20_open(struct inode *inode, struct file *filp)  
    {  
        int flag = 0;  
      
        flag = ds18b20_init();  
        if (flag & 0x01)  
        {  
            printk(KERN_WARNING "open ds18b20 failed\n");  
            return -1;  
        }  
        printk(KERN_NOTICE "open ds18b20 successful\n");  
        return 0;  
    }  
      
    static int ds18b20_init(void)  
    {  
        int retval = 0;  
      
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0);  
      
        s3c2410_gpio_setpin(DQ, 1);  
        udelay(2);  
        s3c2410_gpio_setpin(DQ, 0); // 拉低ds18b20总线,复位ds18b20   
        udelay(500);                // 保持复位电平500us   
      
        s3c2410_gpio_setpin(DQ, 1); // 释放ds18b20总线   
        udelay(60);  
      
        // 若复位成功,ds18b20发出存在脉冲(低电平,持续60~240us)   
        s3c2410_gpio_cfgpin(DQ, CFG_IN);  
        retval = s3c2410_gpio_getpin(DQ);  
      
        udelay(500);  
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0);  
        s3c2410_gpio_setpin(DQ, 1); // 释放总线   
      
        return retval;  
    }  
      
    static void write_byte(unsigned char data)  
    {  
        int i = 0;  
      
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 1);  
      
        for (i = 0; i < 8; i++)  
        {  
            // 总线从高拉至低电平时,就产生写时隙   
            s3c2410_gpio_setpin(DQ, 1);  
            udelay(2);  
            s3c2410_gpio_setpin(DQ, 0);  
            s3c2410_gpio_setpin(DQ, data & 0x01);  
            udelay(60);  
            data >>= 1;  
        }  
        s3c2410_gpio_setpin(DQ, 1); // 重新释放ds18b20总线   
    }  
      
    static unsigned char read_byte(void)  
    {  
        int i;  
        unsigned char data = 0;  
      
        for (i = 0; i < 8; i++)  
        {  
            // 总线从高拉至低,只需维持低电平17ts,再把总线拉高,就产生读时隙   
            s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
            s3c2410_gpio_pullup(DQ, 0);  
            s3c2410_gpio_setpin(DQ, 1);  
            udelay(2);  
            s3c2410_gpio_setpin(DQ, 0);  
            udelay(2);  
            s3c2410_gpio_setpin(DQ, 1);  
            udelay(8);  
            data >>= 1;  
            s3c2410_gpio_cfgpin(DQ, CFG_IN);  
            if (s3c2410_gpio_getpin(DQ))  
                data |= 0x80;  
            udelay(50);  
        }  
        s3c2410_gpio_cfgpin(DQ, CFG_OUT);  
        s3c2410_gpio_pullup(DQ, 0);  
        s3c2410_gpio_setpin(DQ, 1); // 释放ds18b20总线   
        return data;  
    }  
      
    static ssize_t ds18b20_read(struct file *filp, char __user * buf, size_t count, loff_t * f_pos)  
    {  
        int flag;  
        unsigned long err;  
        unsigned char result[2] = { 0x00, 0x00 };  
        //struct ds18b20_device *dev = filp->private_data;   
      
        flag = ds18b20_init();  
        if (flag & 0x01)  
        {  
            printk(KERN_WARNING "ds18b20 init failed\n");  
            return -1;  
        }  
      
        write_byte(0xcc);  
        write_byte(0x44);  
      
        flag = ds18b20_init();  
        if (flag & 0x01)  
            return -1;  
      
        write_byte(0xcc);  
        write_byte(0xbe);  
      
        result[0] = read_byte();    // 温度低八位   
        result[1] = read_byte();    // 温度高八位   
      
        err = copy_to_user(buf, &result, sizeof(result));  
        return err ? -EFAULT : min(sizeof(result), count);  
    }  
      
    static struct file_operations ds18b20_dev_fops = {  
        .owner = THIS_MODULE,  
        .open = ds18b20_open,  
        .read = ds18b20_read,  
    };  
      
    void ds18b20_setup_cdev(struct ds18b20_device *dev, int index)  
    {  
        int err, devno = MKDEV(ds18b20_major, ds18b20_minor + index);  
      
        cdev_init(&dev->cdev, &ds18b20_dev_fops);  
        dev->cdev.owner = THIS_MODULE;  
        err = cdev_add(&(dev->cdev), devno, 1);  
        if (err)  
        {  
            printk(KERN_NOTICE "ERROR %d add ds18b20\n", err);  
        }  
    }  
      
    static int __init ds18b20_dev_init(void)  
    {  
        int result;  
        dev_t dev = 0;  
      
        dev = MKDEV(ds18b20_major, ds18b20_minor);  
      
        if (ds18b20_major)  
        {  
            result = register_chrdev_region(dev, ds18b20_nr_devs, "ds18b20");  
        }  
        else  
        {  
            result = alloc_chrdev_region(&dev, ds18b20_minor, ds18b20_nr_devs, "ds18b20");  
            ds18b20_major = MAJOR(dev);  
        }  
        if (result < 0)  
        {  
            printk(KERN_WARNING "ds18b20: failed to get major\n");  
            return result;  
        }  
      
        /* 为新设备分配内存和初始化 */  
        ds18b20_devp = kmalloc(sizeof(struct ds18b20_device), GFP_KERNEL);  
        if (!ds18b20_devp)  
        {                           /*申请失败 */  
            result = -ENOMEM;  
            goto fail_malloc;  
        }  
        memset(ds18b20_devp, 0, sizeof(struct ds18b20_device));  
      
        ds18b20_setup_cdev(ds18b20_devp, 0);  
      
        /* 自动创建设备节点 */  
        ds18b20_class = class_create(THIS_MODULE, "ds18b20_sys_class");  
        if (IS_ERR(ds18b20_class))  
            return PTR_ERR(ds18b20_class);  
      
        ds18b20_class_dev =  
            device_create(ds18b20_class, NULL, MKDEV(ds18b20_major, 0), NULL, "ds18b20");  
        if (unlikely(IS_ERR(ds18b20_class_dev)))  
            return PTR_ERR(ds18b20_class_dev);  
      
        return 0;  
      
      fail_malloc:  
        unregister_chrdev_region(dev, 1);  
        return result;  
    }  
      
    static void __exit ds18b20_dev_exit(void)  
    {  
        cdev_del(&ds18b20_devp->cdev);  /*注销cdev */  
        kfree(ds18b20_devp);        /*释放设备结构体内存 */  
        unregister_chrdev_region(MKDEV(ds18b20_major, 0), ds18b20_nr_devs); /*释放设备号 */  
        device_unregister(ds18b20_class_dev);  
        class_destroy(ds18b20_class);  
    }  
      
    module_init(ds18b20_dev_init);  
    module_exit(ds18b20_dev_exit);  
    MODULE_LICENSE("Dual BSD/GPL");  

    2、app-ds18b20.c
    #include <stdio.h>   
    #include <stdlib.h>   
    #include <unistd.h>   
    #include <linux/ioctl.h>   
      
    // 函数声明   
    void ds18b20_delay(int i);  
      
    int main()  
    {  
        int fd, i;  
        unsigned char result[2];    // 从ds18b20读出的结果,result[0]存放低八位   
        unsigned char integer_value = 0;  
        float decimal_value = 0;    // 温度数值,decimal_value为小数部分的值   
        float temperature = 0;  
      
        fd = open("/dev/ds18b20", 0);  
        if (fd < 0)  
        {  
            perror("open device failed\n");  
            exit(1);  
        }  
        while (1)  
        {  
            i++;  
            read(fd, &result, sizeof(result));  
            integer_value = ((result[0] & 0xf0) >> 4) | ((result[1] & 0x07) << 4);  
            // 精确到0.25度   
            decimal_value = 0.5 * ((result[0] & 0x0f) >> 3) + 0.25 * ((result[0] & 0x07) >> 2);  
            temperature = (float)integer_value + decimal_value;  
            printf("Current Temperature:%6.2f\n", temperature);  
      
            ds18b20_delay(500);  
        }  
    }  
      
    void ds18b20_delay(int i)  
    {  
        int j, k;  
        for (j = 0; j < i; j++)  
            for (k = 0; k < 50000; k++) ;  
    }  

    测试结果:

    [root@www.linuxidc.com home]#  
    [root@www.linuxidc.com home]#./app-ds18b20  
    open ds18b20 successful  
    Current Temperature: 23.50  
    Current Temperature: 23.50  
    Current Temperature: 23.25  
    Current Temperature: 23.50  
    Current Temperature: 23.50  
    Current Temperature: 23.50  
    ^C  
    [root@www.linuxidc.com home]#  


    展开全文
  • 测温芯片DS18B20详细解读

    万次阅读 多人点赞 2015-12-06 11:15:26
    DS18B20芯片的常见封装为TO-92,也就是普通直插三极管的样子,当然也可以找到以SO(DS18B20Z)和μSOP(DS18B20U)形式封装的产品,下面为DS18B20各种封装的图示及引脚。    了解了这些该芯片的封装形式,下面...
  • DS18B20的具体操作流程

    千次阅读 2017-03-17 19:35:44
    一, DS18B20的初始化 (1) 先将数据线置高电平“1”。 (2) 延时(该时间要求的不是很严格,但是尽可能的短一点) (3) 数据线拉到低电平“0”。 (4) 延时750微秒(该时间的时间范围可以从480到960微秒)...
  • ds18b20与dht11代码设计

    2021-01-31 10:59:40
    1.2 DS18B20的初始时序 初始化时序:1-wire总线需获取存在脉冲来检测是否存在DS18B20,还要通过这个脉冲过程通知DS18B20准备好,单片机将要对它进行操作。脉冲检测过程中,首先单片机拉低引脚,持续480us到960...
  • DS18B20驱动详解(蓝桥杯单片机)

    千次阅读 2021-03-03 22:52:08
    目录简介结构 简介 DS18B20数字温度计提供9位到12位摄氏温度测量,并具有非易失性用户可编程上、下触发点报警...每个DS18B20都有一个独特的64位串行代码,它允许多个DS18B20在同一根单线总线上工作。因此,使用一个微处
  • 单片机中使用DS18B20温度传感器C语言程序.doc单片机中使用 DS18B20 温度传感器 C 语言程序(参考 1) / DS18B20 测温程序 硬件A T89S52 1单线 ds18b20 接 P2.2 2七段数码管接 P0 口 3使用外部电源给 ds18b20 供电,...
  • 传感器学习——DS18B20

    千次阅读 2020-02-23 14:24:32
    DS18B20 DS18B20是Dallas公司生产的数字温度传感器,具有体积小、适用电压宽、经济灵活的特点。它内部使用了onboard专利技术,全部传感元件及转换电路集成在一个形如三极管的集成电路内。DS18B20有电源线、地线及...
  • (1)单线ds18b20接P2.2 (2)使用外部电源给ds18b20供电,没有使用寄生电源奥 软件: KeiuVision2 刚开始对时序把握不好,可是在论坛里没找到比较详细的解释,所以俺倒塌了这个东东,就把俺的经验贴上来,供大家...
  • Ds18b20课程设计

    千次阅读 2016-09-12 17:14:06
    1、采用ds18b20温度传感器采集室内温度,并读取当期温度值显示在lcd1602显示屏上。 2、设计温度报警,当温度大于某个值时蜂鸣器报警(设温度为31摄氏度)。 3、温度报警时将单片机开发板上的led模块以跑马灯的形式...
  •   传统的模拟温度测量抗干扰能力差,放大电路零点漂移大,导致测量值误差大... DS18B20是Dallas公司生产的数字温度传感器,具有体积小、适用电压宽、经济灵活的特点。它内部使用了onboard专利技术,全部传感元件及
  • linux字符设备DS18B20驱动源码

    千次阅读 2017-08-20 13:05:38
    DS18B20是常用的数字温度传感器,经常用单片机来控制,本文基于arm11芯片来实现ds18b20驱动,系统是linux。 驱动是大学的时候实现的,里面主要涉及到寄存器的读写和ds18b20时序操作。需要参考arm11的芯片手册和ds...
  • 在该系统中,1-Wire总线上只存在1个DS18B20,在控制DS18B20进行温度测量的时候,根据1-Wire总线的特性和DS18B20的控制要求,可以采用相对简单的控制流程。下面是控制流程图: 我们用状态机来实现这个控制流程...
  • 详解温度传感器DS18B20编程与使用

    千次阅读 2018-12-09 21:53:11
    DS18B20是由DALLAS半导体公司推出的一种的“一线总线”接口的温度传感器, 与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。 1.测量温度范围:-55~+125℃...
  • 一种快速查询多点DS18B20温度的方法

    万次阅读 2015-04-21 14:44:38
    一种快速查询多点DS18B20温度的方法 为了满足实时性要求较高系统的设计需求,针对串联多个器件在一线制总线上的结构导致的在查询多点温度时速度缓慢的问题,北京铭正同创科技有限公司提出了一种快速查询多点温度...
  • DS18B20中文资料手册及程序代码下载链接: 链接:https://pan.baidu.com/s/1c_POj04yqatXVwzM_zarGw 提取码:2q3a DS18B20单总线上多路采集的关键在于读取ROM指令,通过ROM指令读取指定的DS18B20温度。 64 ...
  • 【朱老师课程总结 侵删】 第一部分、章节目录 2.1.1.DS18B20相关背景知识1 ...2.1.8.DS18B20的工作流程分析 2.1.9.DS18B20的编程要点 2.1.10.DS18B20移植实验1 2.1.11.DS18B20移植实验2 2.1.12.DS18B20移植
  • 单片机程序DS18B20-液晶1602显示温度和控制),可直接用于课程设计、毕业设计和项目开发。
  • DS18B20温度转换与显示

    千次阅读 2012-07-14 08:57:36
    最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序. DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,...
  • (转)ds18b20时序说明

    万次阅读 2013-04-16 14:02:05
    ds18b20时序说明 新手在DS18B20读写过程中要犯很多错误。老衲普度众生,简要说明它怎么用。 1、过程1、2是初始化过程,每次读取都要初始化,否则18b20处于待机状态,无法成功读取。 过程1:拉低...
  • DS18B20 DS1302的结构

    2008-11-21 10:32:13
    DS18B20 摘 要:介绍美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。它可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能...
  • 51/stm32/arduino驱动DS18B20串口输出温度

    热门讨论 2021-04-12 15:33:30
    51/stm32/arduino驱动DS18B20串口输出温度DS18B20简介DS18B20寄存器配置例程烧录51单片机程序烧录与现象stm32程序烧录与现象arduino程序烧录与现象如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 524
精华内容 209
关键字:

ds18b20程序流程图