精华内容
下载资源
问答
  • DS18B20数据手册及代码讲解,内容详尽,对学习DS18B20有很大帮助
  • DS18b20温度传感器使用

    千次阅读 2017-09-17 19:22:55
    前期准备DS18B20温度传感器用户手册单线接口访问DS18B20的协议如下: 初始化 ROM操作命令 存储器操作命令 处理/数据 初始化 单线总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由...

    前期准备

    DS18B20温度传感器用户手册

    单线接口访问DS18B20的协议如下:

    1. 初始化
    2. ROM操作命令
    3. 存储器操作命令
    4. 处理/数据

    初始化

     单线总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。(我们只有一个温度传感器所以用不到)
    

    初始化时序图
    1. 数据线拉到低电平“0”。
    2. 延时480微秒(该时间的时间范围可以从480到960微妙)。
    3. 数据线拉到高电平“1”。
    4. 延时等待80微妙。如果初始化成功则在15到60微妙时间内产生一个由DS18B20所返回的低电平“0”.根据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时判断。
    5. 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(3)步的时间算起)最少要480微妙。

    uchar Ds18b20Init()//初始化DS18B20
    {
        uchar i;
        DSPORT=0;//数据线拉低
        i=480;
        while(i--);//延时480us
        DSPORT=1;//数据线拉高
        i=80;
        while(i--);延时80us
        i=60;
        while(i--)//判断是否在60us内响应
        {
            if(DSPORT==0)
            {
                Delay1ms(480);//延时480us
                return 1;
            }
        }
    }

    读时序过程时序图

    读时序过程时序图

    1. 将数据线拉低“0”。
    2. 延时1微妙。
    3. 将数据线拉高“1”,释放总线准备读数据。
    4. 延时10微妙。
    5. 读数据线的状态得到1个状态位,并进行数据处理。
    6. 延时45微妙。
    7. 重复1~7步骤,直到读完一个字节。
    uchar Ds18b20ReadByte()//读时序
    {
        uchar bi,byte;
        char i,j;
        j=0;
        for(i=7;i>=0;i--)
        {
            DSPORT=0;//拉低总线1us
            j++;
            DSPORT=1;//释放总线
            j++;
            j++;  //延时6us等待数据稳定
            bi=DSPORT;  //读取数据,从最低位开始读取
            //将byte左移一位,然后与上右移7位后的bi
            byte=(byte>>1)|(bi<<7);
            j=45;
            while(j--);
        }
        return byte;
    }

    写时序过程时序图

    这里写图片描述
    1.数据线先置低电平“0”
    2.延时15微妙。
    3.按从低位到高位的顺序发送数据(一次只发送一位)。
    4.延时60微妙。
    5.将数据线拉到高电平。
    6.重复1~5步骤,直到发送完整的字节。
    7.最后将数据线拉高。

    void Ds18b20WriteByte(uchar byte)//向Ds18b20写入一个字节
    {
        char bi=0x01;
        char i,j;
        for(i=0;i<8;i++)
        {
            DSPORT=0;//每写入一位数据之前先把总线拉低1us
            j++;
            DSPORT=byte & 0x01;//然后写入一个数据,从最低开始
            byte>>=1;
            j=6;
            while(j--);//延时68us至少60us
            DSPORT=1; //释放总线,至少1us之后继续写入
        }
    }

    ROM操作命令

    指令 约定代码 功能
    读ROM 33H 读DS18B20温度传感器ROM中的编码(即64位地址)
    符合ROM 55H 发出此命令,接着发出64位ROM编码,访问单总线上与该编码对应的DS18B20使之做出响应,为下一步对该DS18B20的读写做准备。
    搜索ROM 0FOH 用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件做好准备。
    跳过ROM 0CCH 忽略64位ROM地址,直接向DS18B20发温度变化命令,适用于单片工作。
    告警搜索命令 0ECH 执行后只有温度超过设定值上限或下限的片子才做出响应。

    RAM操作命令

    指令 约定代码 功能
    温度变换 44H 启动DS18B20进行温度转换,12位转换时最长为750ms(9位为93.75ms),结果存入内部9字节RAM中。
    读暂存器 0BEH 读内部RAM中9字节的内容
    写暂存器 4EH 发出向内部RAM的3、4字节写上、下限温度数据命令,紧跟该命令之后,时传送两字节的数据。
    复制暂存器 48H 将RAM中第3、4字节的内容复制到EEPROM中。
    重调EEPROM 0B8H 将EEPROM中内容恢复到RAM中的第3、4字节。
    读供电方式 0B4H 读DS18B20的供电模式,寄生供电时发送0,外接电源供电发送1
    //让Ds18b20开始转换温度
    void Ds18b20ChangTemp()
    {
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);//跳过ROM操作命令
        Ds18b20WriteByte(0x44);//温度转换命令
    }
    //发送读取温度的命令
    void Ds18b20ReadTempCom()
    {
        Ds18b20Init();;
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);//跳过ROM命令
        Ds18b20WriteByte(0xbe);//发送读取温度的命令
    }
    //主函数
    int Ds18b20ReadTemp()
    {
        int temp=0;
    
        Ds18b20ChangTemp(); //先写入转换命令
    
        Ds18b20ReadTempCom();//然后等待转换完发送读取温度命令
    
        tml=Ds18b20ReadByte();//读取低位
    
        tmh=Ds18b20ReadByte(); //读取高位
    
        temp=tmh;
        temp<<=8;
        temp|=tml;
    
        return temp;
    
    }

    附加

    配置寄存器设置
    这里写图片描述
    温度寄存器格式
    这里写图片描述

    展开全文
  • Dht11与Ds18b20温度传感器使用

    千次阅读 2017-11-23 20:18:26
    说说使用感想DS18B20不愧是大厂的传感器,功能丰富,但使用起来确实有点麻烦。 DHT11应该就是国产模仿的吧,功能简单,没有唯一标识码,没有RAM,没有报警等等功能。 对照手册编写逻辑代码问题不大,关键就是STM32 ...

    使用MCU,STM32F103C8T6+OLED显示,板子自己手焊的。

    说说使用感想DS18B20不愧是大厂的传感器,功能丰富,但使用起来确实有点麻烦。

    DHT11应该就是国产模仿的吧,功能简单,没有唯一标识码,没有RAM,没有报警等等功能。

    对照手册编写逻辑代码问题不大,关键就是STM32 HAL库里面us延时的问题,我用的是模仿在hal_rcc.c里面的一个函数

    /**
      * @brief  This function provides delay (in milliseconds) based on CPU cycles method.
      * @param  mdelay: specifies the delay time length, in milliseconds.
      * @retval None
      */
    static void RCC_Delay(uint32_t mdelay)
    {
      __IO uint32_t Delay = mdelay * (SystemCoreClock / 8U / 1000U);
      do 
      {
        __NOP();
      } 
      while (Delay --);
    }

    把1000改成1000000,延时有误差,但也算能将就用。其中肯定有更好的办法,以后再看吧。

    其实没什么难的,都可以自己根据手册,将代码敲出来,这个链接写的DS18B20,特别值得参考:

    http://bbs.elecfans.com/jishu_920279_1_1.html

    代码也很规范。


    最后上个图,我的成品。







    展开全文
  • DS18xx系列温度传感器是数字式温度传感器,相对于传统温度传感器精度高、稳定性好、电路简单、控制方便,在这里以DS18B20为例做简单应用介绍。详细资料请参阅芯片手册。 一、特性: (1)应用中不需要外部任何元...

    DS18xx系列温度传感器是数字式温度传感器,相对于传统温度传感器精度高、稳定性好、电路简单、控制方便,在这里以DS18B20为例做简单应用介绍。详细资料请参阅芯片手册。

    一、特性:

    (1)应用中不需要外部任何元器件即可实现测温电路。

    (2)测温范围-55~+125℃,最大精度0.0625℃。

    (3)只通过一条数据线即可实现通信。

    (4)每个DS1820器件上都有独一无二的序列号,所以一条数据线上可以挂接很多该传感器。

    (5)内部有温度上、下限告警功能。

    二、操作简介

    DS18B20工作时需要接收特定的指令来完成相应功能(指令,可以简单的理解为可以被识别并有相应意义的一系列高低电平信号),它的指令可分为ROM指令和RAM指令;ROM指令主要对其内部的ROM进行操作,如查所使用DS18B20的序列号等,如果只使用一个DS18B20,ROM操作一般就可以直接跳过了;RAM指令主要是完成对其内RAM中的数据进行操作,如让其开始进行数据采集、读数据等。DS18B20数字温度传感器是单总线器件,数据的读写只通过一条数据线进行并且这一条线上允许挂很多该传感器;这样对器件进行读写指令时就会麻烦一些,必须应用特定时序来识别高低电平信号(如写高电平1,并不是把数据线直接拉高,而是用有一定时序关系的高低电平来代表写1),所以指令表中的0、1在写给DS18B20时就得变成代表0、1电平的时序段序列。同样,从DS18B20读数据时,也是由特定的时序来完成数据读取。

    DS18B20进行读写的时序图如下:

    硬件连接方式有两种,一种是由单独电源供电(3~5V);第二种是由数据线为DS18B20供电(工作速度相对较慢)。

    单独电源供电方式

    数据线为DS1820供电方式

    三、DS1820的工作过程:

    1. 复位操作
    2. 执行ROM操作的5条指令之一:1)读ROM,2)匹配ROM,3)搜索ROM,4)跳过ROM,5)报警搜索。
    3. 存储器操作命令:温度转换、读取温度、设定上下限温度值等指令
    4. 读取温度数据:主机读取温度数据后进行数据处理。

    可以初始化数据精度,按芯片手册写入固定指令。数据位数可设置成9、10、11、12位,其中7位为温度整数部分,1位表示温度正负,其余位数为小数。如9位数据时,有1位为小数,精度为0.5。

    四、指令功能介绍:

    (1)ROM操作指令:

    1. 读ROM指令 :Read ROM [33h]

    这个命令允许总线控制器读到DS1820 的8 位系列编码、唯一的序列号和8 位CRC 码。只有在总线上存在单只DS1820 的时候才能使用这个命令。如果总上有不止一个从机,当所有从机试图同时传送信号时就会发生数据冲突(漏极开路连在一起开成相与的效果)。

    2. 匹配ROM指令 :Match ROM [55h]

    匹配ROM 命令,后跟64 位ROM 序列,让总线控制器在多点总线上定位一只特定的DS1820。只有和64 位ROM 序列完全匹配的DS1820 才能响应随后的存储器操作命令。所有和64 位ROM序列不匹配的从机都将等待复位脉冲。这条命令在总线上有单个或多个器件时都可以使用。

    3. 跳过ROM指令:Skip ROM [CCh]

    这条命令允许总线控制器不用提供64 位ROM 编码就使用存储器操作命令,在单点总线情况下右以节省时间。如果总线上不止一个从机,在Skip ROM 命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突(漏极开路下拉效果相当于相与)。

    4. 搜索ROM指令:Search ROM [F0h]

    当一个系统初次启动时,总线控制器可能并不知道单线总线上有多少器件或它们的64 位ROM编码。搜索ROM 命令允许总线控制器用排除法识别总线上的所有从机的64 位编码。

    5. 报警搜索指令:Alarm Search [ECh]

    这条命令的流程图和Search ROM 相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS18B20 才会响应这条命令。报警条件定义为温度高于TH 或低于TL。只要DS18B20 不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。

    (2)存储器操作指令:

    五、复位时序:

    DS18B20 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写0、写1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。和DS18B20 间的任何通讯都需要以初始化序列开始,初始化序列见上图。一个复位脉冲跟着一个存在脉冲表明DS18B20 已经准备好发送和接收数据(适当的ROM 命令和存储器操作命令)。

    六、数据处理:

    下面以9位温度数据格式为例。

    DS18B20 内部对此计算的结果可提供0.5℃的分辨力。温度以16位带符号位扩展的二进制补码形式读出,表1 给出了温度值和输出数据的关系。数据通过单线接口以串行方式传输。DS1820 测温范围-55℃~+125℃,以0.5℃递增。如用于华氏温度,必须要用一个转换因子查找表。读取数据时需要读取前16位数据,低字节在前,高字节为符号为。

    DS1820 内温度表示值为1/2℃LSB,如下所示9位格式:

     

    表1 温度值和输出数据的关系

    七、应用实例:数字电子温度计

        硬件为:单片机、数码管、温度传感器DS18B20

        功能:显示当前温度值,可显示正和负温度值

    程序:

    #include<reg52.h>

    /*------SEG PORT-----*/

    #define LEDADDR P2

    #define LED_port P0

    /*------DS18B20 PORT-----*/

    sbit DB_B20=P0^0;

    /*-----COMMON FUNCTION----*/

    void delay_us(unsigned int time);

    /*-----SEG FUNCTION-------*/

    unsigned char seg_val[6];    

     

    unsigned char ledcode[12] = {0XC0,0XF9,0XA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff};//共阳极数码管0,1,2,3,4,5,6,7,8,9,-,null

    unsigned char currled=0;

    unsigned char led_en=0x04;//

    void display(void);

    void display_tem(void);

    /*--- DS18B20 FUNCTION-----*/

    unsigned char tem_pnt;

    unsigned char tem_num;

    bit tem_sign;

     

    bit reset_B20(void);

    unsigned char read_b20_byte(void);

    void write_b20_byte(unsigned char);

     

    void convert_cmd_b20(void);

    void read_cmd_b20(void);

    void data_convert_b20(void);

    /*--- TIME FUNCTION-----*/

    unsigned char times;

    void times_init(void);

    /*-----------------------*/

    main()

    {    

        times_init();

        while(1)

        {

            display_tem();

            display();

        }

    }

    /*-----COMMON FUNCTION----*/

    void delay_us(unsigned int us)

    {

        while(us--);//for(;us>0;us--);//while(time--);

    }

     

    /*-----SEG FUNCTION-------*/

    void display(void)

    {

        LEDADDR=0xff;

        LED_port=(LED_port&0x03)|led_en;

        led_en<<=1;

        if(currled==1)

            LEDADDR=ledcode[seg_val[currled]]& 0x7f;

        else

            LEDADDR=ledcode[seg_val[currled]];

        currled++;

        if(currled==6)

        {

            currled=0;

            led_en=0x04;

        }    

        delay_us(300);

    }

    void display_tem(void)

    {

        unsigned char n;

        unsigned char p;

        if(tem_sign==0)

        {

            n=~(tem_num-1);

            p=~(tem_pnt-1);

        }

        else

        {

            n=tem_num;

            p=tem_pnt;

        }

        seg_val[5]=11;

        seg_val[4]=11;

        seg_val[3]=n/100;    

        n=n%100;

        seg_val[2]=n/10;

        if(seg_val[3]==0)

        {

            seg_val[3]=11;

            if(seg_val[2]==0)

                seg_val[2]=11;

        }

        seg_val[1]=n%10;

        seg_val[0]=p;

        if(seg_val[2]==11 && seg_val[3]==11 && tem_sign==0)

            seg_val[2]=10;

        else if(seg_val[3]==11 && tem_sign==0)

            seg_val[3]=10;

        else if(tem_sign==0)

            seg_val[4]=10;        

    }

    /*--- DS18B20 FUNCTION-----*/

    bit reset_B20(void)

    {

        bit state;

        DB_B20=0;

        delay_us(29);//>480us 29

        DB_B20=1;

        delay_us(3);//15---60us     3

        state=DB_B20;

        delay_us(25);//480us 25

        return state;

    }

    void write_b20_byte(unsigned char cmd)

    {

        unsigned char i;

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

        {

            DB_B20=0;

            DB_B20=cmd&0x01;

            delay_us(5);

            DB_B20=1;

            cmd>>=1;         //6

        }

        delay_us(5);

    }

    unsigned char read_b20_byte(void)

    {

        unsigned char rbyte=0;

        unsigned char i;

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

        {

            rbyte>>=1;

            DB_B20=0;

            DB_B20=1;

            //delay_us(1);

            if(DB_B20)

                rbyte |= 0x80;

            delay_us(6);         //6

        }

        return rbyte;

    }

     

    void convert_cmd_b20(void)

    {

        reset_B20();

        write_b20_byte(0xcc);

        write_b20_byte(0x44);    

    }

    void read_cmd_b20(void)

    {

        reset_B20();

        write_b20_byte(0xcc);

        write_b20_byte(0xbe);

    }

    void data_convert_b20(void)

    {

        unsigned char a;

        unsigned char b;

        int point;

        a=read_b20_byte();

        b=read_b20_byte();

        point=(a & 0x0f)*625+500;

        tem_pnt=point/1000;

        tem_num=a>>4 | b<<4;

        if(tem_num & 0x80)

            tem_sign=0;

        else

            tem_sign=1;

    }

    /*--- TIME FUNCTION-----*/

    void times_init(void)

    {

        times=29;

        TMOD=0X01;

        TH0=0X3C;

        TL0=0XB0;

        EA=1;

        ET0=1;

        TR0=1;

    }

    void time0(void) interrupt 1

    {

        if(times==19)

            convert_cmd_b20();

        else if(times==9)    

            read_cmd_b20();

        else if(times==0)

        {

            data_convert_b20();

            times=29;

        }

        times--;

        TH0=0X3C;

        TL0=0XB0;

    }

    /*---------------------*/    

    截图:

    转载于:https://www.cnblogs.com/litiansheng/archive/2011/02/11/1951391.html

    展开全文
  • STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口,因为用到的是PA15管脚, 由...

    STM32单片机学习(11) DS18B20温度传感器实验

    本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机

    注:使用普中科技开发板测试时,需要拔掉Boot1插口,因为用到的是PA15管脚, 由开发板电路图可知,需要改变PA15 管脚的映射,将其设置成普通IO口

    参考资料

    DS18B20中文手册.pdf   http://download.csdn.net/detail/leytton/7742193

    STM32-外设篇 视频教程(Cortex-M3)-主讲人:刘洋   http://yun.baidu.com/pcloud/album/info?uk=2853967793&album_id=5492137931588632574

    main.c

     

    /*
    *	
    * 软件功能:	 DS18B20温度<strong><a target=_blank href="http://www.eeworld.com.cn/MEMS/" target="_blank" style="color: rgb(1, 88, 167); text-decoration: none;">传感器</a></strong>
    * 
    */
    #include "stm32f10x.h"
    #include <stdio h="">
    #include "delay.h"
    #include "<strong><a target=_blank href="http://www.eeworld.com.cn/mcu/2012/1011/article_10680.html" target="_blank" style="color: rgb(1, 88, 167); text-decoration: none;">ds18b20</a></strong>.h"
      
    void RCC_Configuration(void);
    void GPIO_Configuration(void);
    void USART1_Configuration(void);
    void Uart1_PutChar(u8 ch);
    void Uart1_PutString(u8* buf , u8 len);
    int fputc(int ch, FILE *f);
    							
    /*
    函数: int main(void)
    功能: main主函数
    参数: 无
    返回: 无
    /
    int main(void)
    {
      double temperature=0;
      RCC_Configuration();
      GPIO_Configuration();
      delay_init(72);
      USART1_Configuration();
      
      while(1)
      {  
    	  if(!DS18B20_Is_Exist())
    	  {
    	  	 printf("未检测到DS18B20温度传感器...\n");
    		 delay_ms(500);
    	  }
    	  else
    	  {
    	  	 printf("检测到DS18B20温度传感器\n获取数据中...\n");
    		 temperature=DS18B20_Get_wd();
    	     printf("当前温度:%0.4lf ℃\n\n",temperature);
    	  }
      }
    }
    
    /*
    函数: void RCC_Configuration(void)
    功能: 复位和时钟控制 配置
    参数: 无
    返回: 无
    /
    void RCC_Configuration(void)
    {
      ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量
      RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值
      RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振
      HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好
      if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好
      {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
        FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时
          	
        RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟
        RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟
             
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
        RCC_PLLCmd(ENABLE);                                   //使能PLL时钟
       
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪
        {
        }
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟
        while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟
        {
        }
      }
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  //允许 GPIOA、USART1、AFIO时钟
    }
    
    /*
    函数: void GPIO_Configuration(void)
    功能: GPIO配置
    参数: 无
    返回: 无
    /
    void GPIO_Configuration(void)
    {
      
      GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复合推挽输出 	 
      GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA9串口输出
    
      //把调试设置普通IO口
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);  
    
      // 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
      GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
      
    }
    
    
    /*
    	函数名:USART1_Configuration
    	输  入:
    	输  出:
    	功能说明:
    	初始化串口硬件设备,启用中断
    	配置步骤:
    	(1)打开GPIO和USART1的时钟
    	(2)设置USART1两个管脚GPIO模式
    	(3)配置USART1数据格式、波特率等参数
    	(4)使能USART1接收中断功能
    	(5)最后使能USART1功能
    */
    void USART1_Configuration(void)	  //串口配置   详见《STM32的函数说明(中文).pdf》P346
    {
    	USART_InitTypeDef USART_InitStructure;
    	USART_InitStructure.USART_BaudRate=9600;   //波特率为9600
    	USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //数据位为8
    	USART_InitStructure.USART_StopBits=USART_StopBits_1; //在帧结尾传输 1 个停止位
    	USART_InitStructure.USART_Parity=USART_Parity_No; //校验模式:奇偶失能
    	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制失能
    	USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //USART_Mode 指定了使能或者失能发送和接收模式:发送使能|接收失能
    	USART_Init(USART1, &USART_InitStructure);	  //初始化配置
    
    	USART_Cmd(USART1,ENABLE);	//使能或者失能 USART 外设
    	USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.USART_FLAG_TC为发送完成标志位
    }
    
    
    //发送一个字符
    void Uart1_PutChar(u8 ch)
    {
        USART_SendData(USART1, (u8) ch);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成
    }
    
    //发送一个字符串 Input : buf为发送数据的地址 , len为发送字符的个数
    void Uart1_PutString(u8* buf , u8 len)
    {   
    	u8 i;
        for(i=0;i<len;i++) {="" uart1_putchar(*(buf++));="" }="" int="" fputc(int="" ch,="" file="" *f)="" uart1_putchar((u8)ch);="" 此处为自定义函数,参见串口中断通信,请勿盲目="" return="" (ch);="" <="" pre="">
    
    
    DS18B20.h
    <p style="margin-top: 17px; margin-bottom: 17px; padding-top: 0px; padding-bottom: 0px; text-indent: 0em;"> </p>
    <p style="margin-top: 17px; margin-bottom: 17px; padding-top: 0px; padding-bottom: 0px; text-indent: 0em;"> </p>
    <pre name="code" style="margin-top: 0px; margin-bottom: 0px; padding: 0px;">#ifndef __DS18B20_H
    #define __DS18B20_H 			   
    #include "stm32f10x.h"
    
    #define DS18B20_Pin GPIO_Pin_15
    #define DS18B20_GPIO GPIOA
    
    #define DS18B20_DQ_High() GPIO_SetBits(DS18B20_GPIO,DS18B20_Pin)
    #define DS18B20_DQ_Low()  GPIO_ResetBits(DS18B20_GPIO,DS18B20_Pin)
    
    void DS18B20_IO_IN(void);
    void DS18B20_IO_OUT(void);
    u8 DS18B20_Read_Byte(void);
    void DS18B20_Write_Byte(u8 dat);
    void DS18B20_Reset(void);
    double DS18B20_Get_wd(void);
    u8 DS18B20_Is_Exist(void);
    
    #endif
    

     

     

    DS18B20.c
    #include "stm32f10x.h"
    #include "ds<strong><a target=_blank href="http://www.eeworld.com.cn/mcu/2015/0311/article_18675.html" target="_blank" style="color: rgb(1, 88, 167); text-decoration: none;">18b20</a></strong>.h"
    #include "delay.h"
    
    
    void DS18B20_IO_IN(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体
    	GPIO_InitStructure.GPIO_Pin = DS18B20_Pin; 		
      	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //配置成上拉输入; 
        GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
    }
    
    void DS18B20_IO_OUT(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体
    	GPIO_InitStructure.GPIO_Pin = DS18B20_Pin; 		
      	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //配置成推挽输出; 
        GPIO_Init(DS18B20_GPIO, &GPIO_InitStructure);
    }
    
    u8 DS18B20_Read_Byte(void)
    {
    	u8 i=0,TmpData=0;
    	for(i=0;i<8;i++)
    	{
    		  TmpData>>=1;		   //右移
    
    		  DS18B20_IO_OUT();	   //输出模式
    
    		  DS18B20_DQ_Low();	   //拉低
    
    		  delay_us(4);         //延时4us
    		  DS18B20_DQ_High();     //拉高,释放<strong><a target=_blank href="http://www.eeworld.com.cn/qrs/2015/0505/article_22256.html" target="_blank" style="color: rgb(1, 88, 167); text-decoration: none;">总线</a></strong>
    		  delay_us(10);        //延时10us
    
    		  DS18B20_IO_IN();     //输入模式 
    
    		  if(GPIO_ReadInputDataBit(DS18B20_GPIO,DS18B20_Pin)== 1)  TmpData |=0x80; //读取数据 ,从低位开始
    
    		  delay_us(45);        //延时45us
    	}
    
    	return 	TmpData;
    }
    
    void DS18B20_Write_Byte(u8 dat)
    {
    	u8 i=0;
    
    	DS18B20_IO_OUT();	   //输出模式
    
    	for(i=0;i<8;i++)
    	{  
    		  DS18B20_DQ_Low();	   //拉低
    		  delay_us(15);         //延时15us
    
    		  if(dat&0x01==0x01)  DS18B20_DQ_High(); 
    		  else 	DS18B20_DQ_Low();
    
    		  delay_us(60);        //延时60us
    
    		  DS18B20_DQ_High();   //拉高
    
    		  dat>>=1;  //准备下一位数据的写入
    	}
    
    }
    
    //复位函数
    void DS18B20_Reset(void)
    {
    	   DS18B20_IO_OUT();	   //输出模式
    	   DS18B20_DQ_Low();	   //拉低
    	   delay_us(480);        //延时480us
    	   DS18B20_DQ_High();
    	   delay_us(480);        //延时480us
    
    }
    
    
    //返回温度值
    double DS18B20_Get_wd(void)
    {
    	u8 TL=0,TH=0;
    	u16 temp=0;
    	double wd=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;
    }
    
    //等待DS18B20的回应
    //返回1:检测到DS18B20的存在
    //返回0:不存在
    u8 DS18B20_Is_Exist(void) 	   
    {   
    	   DS18B20_IO_OUT();	   //输出模式
    	   DS18B20_DQ_High();   //默认高电平
    
    	   DS18B20_DQ_Low();	   //拉低
    	   delay_us(600);        //延时600us
    	   DS18B20_DQ_High();
    	   delay_us(100);        //延时100us
    
    	   DS18B20_IO_IN();	   //输入模式
    	   if(GPIO_ReadInputDataBit(DS18B20_GPIO,DS18B20_Pin)== 0)	 return 1;	 
    	   else  return 0;
    
    }
    
    
    展开全文
  • 系统每隔5s刷新一次温度数据; 用户可以通过改变'SPACE'来改变刷新温度时间间隔(s);...P1^1接DS18B20的数据引脚; 本系统使用的液晶无字库,文字的代码通过LCD取模软件生成,取模方式为纵向倒叙。
  • 使用.c文件read函数读取返回的16进制值就可以直接获得传感器温度,本程序为hal库开发 主要是自己在做练习题的时候没有hal版驱动所以重新弄了一个。
  • add_2019.2.14: DS18B20的参考手册以及讲解请看http://www.21ic.com/jichuzhishi/datasheet/DS18B20/data/187578.html 头文件跟我要。 /***********************... File name: 温度传感器DS18B20使用 M...
  • (当我第一次拿DS18B20测得我手的温度,我觉得我还是挺暖的人哈哈哈哈) 结构上就是一个接地线,一个电源线,接了一个上拉电阻,还有一个信号线。 可想而知,之后对于这个器件的控制基本上就是对P1^4口的操作。 二、...
  • DS18B20使用手册

    2017-05-08 08:31:01
    温度传感器18b20
  • 18B20数字温度传感器中文资料 操作时序
  • DS18B20读取温度驱动--基于stm32f10xDS18B20简述封装硬件架构和你的开发板连接同DS18B20通信的方法计算温度转换时间1-Wire总线协议设备的初始化...DS18B20是一个种低成本的数字温度传感器芯片使用1-wire总线协议, 转
  • Ds18B20+proteus+1823.zip

    2019-05-26 14:13:37
    PIC16F1823读取DS18B23温度传感器的Demo程序,使用RC0端口,通过Proteus进行了仿真,UART串口显示读取值。 另外,内附DS18B23数据手册
  • 介绍了DS18B20的数字温度传感器使用方法,还有一些应用程序
  • DS18B20是常用的环境温度测量的传感器,但其对通信时序要求较高,而51单片机资源有限,大部分人在使用时也不会严格对照数据手册的时序图操作,所以经常会有人遇到,网上下载的代码无法正常驱动DS18B20读取环境温度,...
  • 关于ds18b20程序

    2009-05-05 18:01:55
    DS18B20温度传感器 * * C51 * * yajou 2008-06-28 无CRC * ********************************************************/ #include "reg51.h" #include "intrins.h" #include "DS18B20.h" /**********************...
  • 使用DS18B20温度传感器进行测温 好处:测量简便精准,成本低。 思路: 根据手册要求先定义初始化函数,写函数,读函数。再根据相应格式写出主函数,求出温度值,最后用显示函数将温度显示在数码管上,保留一位小数。...
  • DS18B20设置高低温限值(写暂存器)

    千次阅读 2017-02-17 15:50:54
    最近使用DS18B20,一个总线挂载多个传感器,为了识别每个传感器的实际位置,想了一个办法:在使用前先对DS18B20编号并记录该编号的实际放置位置。这样在读取数据后即可得到是哪个位置编号的温度值。看了看手册发现...
  • (2) 掌握DS18B20温度传感器的工作原理 (3) 掌握单总线通信方式实现MCU与DS18B20数据传输 实验内容: 学习DS18B20温度传感器的单总线传输机制,通过单片机MCU的I/O实现温度采集,并将数据显示在数码管上。 参考资料:...
  • 使用GP2Y1014AU粉尘传感器,L:CD1602液晶显示,DS18B20温度显示,资源包含电路图,源程序,数据手册
  • 九、 18B20温度传感器函数 1、Init_DS18B20 ---------------------18b20初始化 2、ReadOneChar----------------------读取一个字节 3、WriteOneChar --------------------写入一个字节 4、ReadTemperature ---------...
  • LPC1768实现精准延时——Systick的使用

    千次阅读 2014-10-08 02:15:13
    今天在写用1768读取温度传感器DS18b20的程序,它是单总线的传感器,因此读写都需要按照手册上的时序。这是问题就来了,如何在1768中写一个尽可能精确us级延时函数?以前用51单片机写延时函数是用嵌套的for循环就能...
  • 系统采用STM32F103VET6(主控芯片)+uCOS(操作系统)-III+emwin5.24(图形界面)+MPU6050(MPU6050数据手册)(三轴加速度传感器)+BC04(蓝牙模块)+GPRS+DS18B20DS18B20数据手册)。 智能手表功能简介: 1.具有...
  • │ │ ├─数码管显示DS18B20温度计【支持负温度】 │ │ ├─数码管显示【9999】计数器 │ │ ├─数码管显示数字钟【jetchen】 │ │ └─金星遥控器G328111解码程序数码管显示 │ │ │ ├─《Mini51板CPLD选择与...
  • 温度采集用得是片内的线性温度传感器,温度偏高了,不过硬件上预留了DS18B20的位置,暂未使用。 7.触摸画板功能可以实时显示在触屏上画下的线条,这个功能比较简单了,不过也有待完善。 8.文件浏览跟前面提到的进入...
  • 电子设计.doc

    2019-05-28 11:58:28
    0008、VB上位机与18b20下位机 0009、八路扫描式抢答器设计论文 0010、比较全面的手机原理资料 0011、采用实时时钟芯片DS1302+AT89C2051的红外遥控LED电子钟 0012、51单片机超声波测距程序 0013、单片机C语言程序设计...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

ds18b20温度传感器使用手册