精华内容
下载资源
问答
  • DS18B20温度传感器 ------ 自学笔记

    千次阅读 2020-05-14 18:17:01
    三、DS18B20实物图 四、DS18B20的内部结构 4.1、64位(激)光刻只读存储器 4.2、DS18B20温度转换规则 4.3、DS18B20温度传感器的存储器 4.4、配置寄存器 4.5、DS18B20的ROM指令表 4.6、DS18B20的RAM指令表 ...

    目录

     

    一、简介

    二、DS18B20的特点

    三、DS18B20实物图

    四、DS18B20的内部结构

    4.1、64位(激)光刻只读存储器

    4.2、DS18B20温度转换规则

     

    4.3、DS18B20温度传感器的存储器

    4.4、配置寄存器

    4.5、DS18B20的ROM指令表

    4.6、DS18B20的RAM指令表

    4.7、DS18B20初始化

    4.8、DS18B20读时序

    4.9、DS18B20写时序

    4.10、DS18B20电路图

    五、软件设计

    5.1、DS18.c

    5.2、DS18.h

    5.3、main.c


    一、简介

    DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变外观。具有耐磨,防高温,体积小,封装形式多样等特点。适用于各种狭小空间设备数字测温和控制领域。

     

    二、DS18B20的特点

    • 适用电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电(寄生电源:不是实际的电源器件,而是一种供电方式,即通过数据线供电)
    • 独特的单线接口方式(一条总线),DS18B20在与微处理连接时仅需要一条线即可实现微处理器与DS18B20的双向通信。
    • DS18B20支持多点网络功能,多个DS18B20可以并联在唯一的三线上,实现网络多点测温。
    • DS18B20在使用中不需要任何外围元件,全部传感器元件及转换电路集成在形如一只三极管的集成电路内
    • 温范围-55摄氏度~+125摄氏度,在-10摄氏度~+85摄氏度时精度位正负0.5摄氏度
    • 可编程的分辨率位9~12位,对应的可分辨温度为0.5摄氏度,0.25摄氏度,0.125摄氏度和0.0625摄氏度,可实现高精度测温
    • 在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率是最多750ms内把温度值转换位数字,速度更快。
    • 测量结果直接输出数字温度,以“一根总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。
    • 负压特性:电源反接时,芯片不会因发热而烧毁,但不能正常工作。

    三、DS18B20实物图

    四、DS18B20的内部结构

    4.1、64位(激)光刻只读存储器

    光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号,

    • 64位光刻ROM的排列是:起始8位(28H)是产品类型标号
    • 接着的48位是该DS18B20自身的序列号
    • 最后的8位是前面56位的循环冗余码

    光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上接多个DS18B20的目的。

    4.2、DS18B20温度转换规则

    • DS18B20的核心功能:直接读出数字的温度值。
    • 温度传感器的精度位用户可编程的9,10,11或12位,分别位0.5摄氏度,0.25摄氏度,0.125摄氏度,0.0625摄氏度增量递增。
    • 在上电状态默认的精度位12位。

     

    • DS18B20启动保持低功耗等待状态,当需要执行温度测量和AD转换 时,总线控制器必须发出[44h]命令,转换完以后,产生的温度数据以两个字节的形式被存储到高速暂存器的温度寄存器中,DS18B20继续保持等待状态。
    • 这12位转化后得到的12位数据,存储器DS18B20的两个8位的RAM中,高字节的前5位是字符位,如果测得的温度大于0,这5位为‘0’,只要将测到的数值乘以0.0625即可得到实际温度;如果温度小于0,这5位为‘1’,测到的数值需要先减1再取反再乘以0.0625即可得到实际的温度。

     

    4.3、DS18B20温度传感器的存储器

    DS18B20温度传感器的内部存储器包括一个高精度的暂存器RAM和一个非易失性的带电擦除可编程存储器(EEPROM),后者存放高温度和低温度触发器TH、TL和结构存储器

    4.4、配置寄存器

    存储器的第四位位配置寄存器,其组织如下图,用好可以按下表设置R0和R1位来设定DS18B20的精度,上电默认设置:R0=1,R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留禁止写入。

    4.5、DS18B20的ROM指令表

    指令 约定代码 功能
    读ROM 33H 读DS18B20温度传感器ROM中的编码(即64位地址)
    符合ROM 55H

    发此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的

    DS18B20使之做出响应,为下一步该DS18B20的读写做准备

    搜索ROM oFOH 用于确定挂接在同一总线上DS18B20的个数和识别64位ROM地址,为操作各器件作好准备
    跳过ROM 0CCH 忽略64位上ROM地址,直接向DS18B20发温度变换指令,适用于单片工作
    告警搜索命令 0ECH 执行之后只有温度超过设定值上限或者下限的片子才做出响应。

     

     

     

     

     

     

     

     

     

     

    4.6、DS18B20的RAM指令表

    4.7、DS18B20初始化

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

    4.8、DS18B20读时序

    1. 将数据线拉低“0”
    2. 延时1us
    3. 将数据线拉高“1”,释放总线准备读数据
    4. 延迟10us
    5. 读数据线的状态得到一个状态位,并进行数据处理
    6. 延时45us
    7. 重复1~7步骤,直到读完一个字节

    4.9、DS18B20写时序

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

    4.10、DS18B20电路图

    五、软件设计

    5.1、DS18.c

    #include"DS18.h"
    
    // 延时函数	   1ms
    void Delay1ms(uint y)
    {
    	uint x;
    	for( ; y>0; y--)
    	{
    		for(x=110; x>0; x--);
    	}
    }
    
    // 初始化化函数
    uchar Ds18b20Init()
    {
    uchar i =0;
    DSPORT=0;        // 数据线拉低
    i=70;
    while(i--);     // 延时642us
    DSPORT = 1;	    // 拉高总线,如果DS18B20做出反应将会在15us~60us后总线拉低
    i=0;
    while(DSPORT)   
    {
        Delay1ms(1);
        i++;
        if(i>5)          // 等待>5ms
        {
        return 0;  // 初始化失败
    
        }
    }
        return 1;   // 初始化成功
    }
    
    //  向DS18B20写入一个字节
    void Ds18b20WriteByte(uchar dat)
    {
    uint i,j;
        for(j=0;j<8;j++)
        {
    	DSPORT=0;	      //每写入一位数据之前先把总线拉低1us
    	i++;
    	DSPORT = dat & 0x01; // 然后写入一个数据,从最低位开始
    	i=6;
    	while(i--);	  //延时68us,持续时间最少60us
    	DSPORT = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
    	dat >>= 1;
        }
    }
    
    //  读数据
    uchar Ds18b20ReadByte()
    {
    	uchar byte, bi;
    	uint i, j;	
    	for(j=8; j>0; j--)
    	{
    		DSPORT = 0;//先将总线拉低1us
    		i++;
    		DSPORT = 1;//然后释放总线
    		i++;
    		i++;//延时6us等待数据稳定
    		bi = DSPORT;	 //读取数据,从最低位开始读取
    		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
    		byte = (byte >> 1) | (bi << 7);						  
    		i = 4;		//读取完之后等待48us再接着读取下一个数
    		while(i--);
    	}				
    	return byte;
    }
    
     //	 让18b20开始转换温度
    void  Ds18b20ChangTemp()
    {
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
    	Ds18b20WriteByte(0x44);	    //温度转换命令
    	//Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了
       
    }
    
      //  发送读取温度命令
    void  Ds18b20ReadTempCom()
    {	
    
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
    	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
    }
    
     //   读取温度
    int Ds18b20ReadTemp()
    {
    	int temp = 0;
    	uchar tmh, tml;
    	Ds18b20ChangTemp();			 	//先写入转换命令
    	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
    	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
    	tmh = Ds18b20ReadByte();		//再读高字节
    	temp = tmh;
    	temp <<= 8;
    	temp |= tml;
    	return temp;
    }
    
    
    

    5.2、DS18.h

    #ifndef _DS18_
    #define _DS18_
    
    #include<reg52.h>
    // 定义关键词
    #ifndef uchar               // 如果没有定义uchar
    #define uchar unsigned char	// 那么就定义无符号的uchar
    #endif	                    // 结束
    
    #ifndef uint
    #define uint unsigned int
    #endif
    
    // 定义使用的IO口
    sbit DSPORT=P3^7;
    
    //声明全局函数
    void Delaylms(uint);
    uchar Ds1820Init();
    void Ds1820WriteByte(uchar com);
    uchar Ds18b20ReadByte();
    void Ds18b20ChangTemp();
    void Ds1820ReadTempCom();
    int Ds18b20ReadTemp();
    
    #endif
    

    5.3、main.c

    #include "reg52.h"
    #include "DS18.h"
    
    typedef unsigned int u16;	   //  对数据类型进行声明定义
    typedef unsigned char u8;
    
    sbit LSA = P2^2;
    sbit LSB = P2^3;
    sbit LSC = P2^4;
    
    char num = 0;
    u8 DisplayData[8];
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示0~9的数字
    
    //  延时函数
    void delay(u16 i)
    {
    while(i--);	   // i=1时 大约延时10us
    }
    
    // 温度读取处理转换函数
    void datapros(int temp)
    {
       	float tp;  
    	if(temp< 0)				//当温度值为负数
      	{
    		DisplayData[0] = 0x40; 	  //   -
    		//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
    		temp=temp-1;
    		temp=~temp;
    		tp=temp;
    		temp=tp*0.0625*100+0.5;	
    		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
    		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
    		//算加上0.5,还是在小数点后面。
     
      	}
     	else
      	{			
    		DisplayData[0] = 0x00;
    		tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
    		//如果温度是正的那么,那么正数的原码就是补码它本身
    		temp=tp*0.0625*100+0.5;	
    		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
    		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
    		//算加上0.5,还是在小数点后面。
    	}
    	DisplayData[1] = smgduan[temp % 10000 / 1000];
    	DisplayData[2] = smgduan[temp % 1000 / 100];
    	DisplayData[3] = smgduan[temp %  100 / 10];
    	DisplayData[4] = smgduan[temp %  10 / 1];
    
    
    }
    
    //  数码管显示函数
    void DigDisplay()
    {
    	u8 i;
    	for(i=0;i<6;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSA=1;LSB=1;LSC=1; break;//显示第0位
    			case(1):
    				LSA=0;LSB=1;LSC=1; break;//显示第1位
    			case(2):
    				LSA=1;LSB=0;LSC=1; break;//显示第2位
    			case(3):
    				LSA=0;LSB=0;LSC=1; break;//显示第3位
    			case(4):
    				LSA=1;LSB=1;LSC=0; break;//显示第4位
    			case(5):
    				LSA=0;LSB=1;LSC=0; break;//显示第5位
    		}
    		P0=DisplayData[i];//发送数据
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
     void main()
    {	
    	while(1)
    	{
    		datapros(Ds18b20ReadTemp());	 //数据处理函数
    		DigDisplay();//数码管显示函数		
    	}		
    }

     

     

     

     

    展开全文
  • ds18b20 Linux驱动

    千次阅读 2016-05-20 09:55:41
    DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。工作电压 3.0~5.5V/DC 超低功耗静态功耗 ...DS18B20实物图 DS18B20电路如图如下 驱动代码如下 DS18B2
    DS18B20是常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。工作电压 3.0~5.5V/DC 
    超低功耗静态功耗<3uA,测温范围 -55℃~+125℃,
    测量结果以9~12位数字量方式串行传送。
    面对着扁平的那一面,左负右正,一旦接反就会立刻发热,有可能烧毁!同时,接反也是导致该传感器总是显示85℃的原因。

    DS18B20实物图
    DS18B20实物图

    DS18B20电路如图如下
    DS18B20电路如图如下

    驱动代码如下

    DS18B20_driver.c

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/miscdevice.h>
    #include <linux/fs.h>
    #include <linux/types.h>
    #include <linux/moduleparam.h>
    #include <linux/slab.h>
    #include <linux/ioctl.h>
    #include <linux/cdev.h>
    #include <linux/delay.h>
    
    #include <asm/uaccess.h>  //其中copy_to*在其中
    
    #include <mach/gpio.h>
    #include <mach/regs-gpio.h>
    #include <plat/gpio-cfg.h>
    
    
    /*基于友善之臂smart210开发板,DS18B20数据引脚GPH2(0),位于开发板左上角GPIO,第二排排针倒数第五引脚*/
    spinlock_t lock;  //不用也行
    unsigned int tmp_wendu ;
    
    #define DEVICE_NAME "DS18B20"
    #define NODE_NAME "DS18B20"
    //********************************
    //功能:设置引脚为输入功能
    //********************************
    void set_con_in(void)
    {
        s3c_gpio_cfgpin(S5PV210_GPH2(0), S3C_GPIO_INPUT);
        //gpio_set_value(S5PV210_GPH2(0), 1);    
    }
    //********************************
    //功能:设置引脚为输出功能
    //********************************
    void set_con_out(void)
    {
        s3c_gpio_cfgpin(S5PV210_GPH2(0), S3C_GPIO_OUTPUT);
    }
    //********************************
    //功能:引脚输出高或低电平功能,i=1(高)
    //********************************
    void set_output_data(int i)
    {
        if (i == 0) {
            gpio_set_value(S5PV210_GPH2(0), 0);    
        }    else if(i == 1) {
            gpio_set_value(S5PV210_GPH2(0), 1);    
        }
    }
    //********************************
    //功能:ds18b20复位
    //********************************
    int init_DS18B20(void)
    {
        int result = 10;
        set_con_out();
        __udelay(3);    //短时间延迟
        set_output_data(1);
        __udelay(3);    //短时间延迟
        set_output_data(0);
        __udelay(550); //480-960us
        set_output_data(1);
        __udelay(20); //15-60us,最好大于15us
        set_con_in();
        __udelay(100); //60-240us, ds18b20回应值保持时间
        result = gpio_get_value(S5PV210_GPH2(0));
        printk("init_DS18B20--result:%d\n", result);
    
        set_con_out();
        __udelay(3);
        set_output_data(1);
        //__udelay(300);
    
        return result;
    
    }
    
    //*************************************
    //功能:从ds18b20读一个字节的数据
    //*************************************
    unsigned char read_one_char(void)
    {
        unsigned char i = 0;
        unsigned char dat = 0;
        unsigned char temp = 0;
    
        spin_lock(&lock);
    
        for(i=0; i<8; i++) {
            set_con_out();
            __udelay(3);
            set_output_data(1);
            dat >>= 1;
            set_output_data(0); //该行与下行等效该行上面的4行
            __udelay(18);  //按时序来延时,不能太小或太大
    
            set_con_in();
            __udelay(1);
            temp = gpio_get_value(S5PV210_GPH2(0)) & 0x01;
            if (temp)
                dat |= 0x80;
            else 
                dat |= 0x00;
    
            printk("read_one_char--temp: %d\n", temp);
            __udelay(65);    
    
        }
        spin_unlock(&lock);
        printk("read_one_char--dat: %d\n", dat);
    
        return dat;
    
    }
    
    //*************************************
    //功能:向ds18b20写一个字节的数据
    //*************************************
    void write_one_char(unsigned char dat)
    {
        //printk("write_one_char--dat: %d\n", dat);
        unsigned char i = 0;
    
        spin_lock(&lock);
        set_con_out();
    
        for(i=0; i<8; i++) {
    
            set_output_data(1);
            __udelay(1);
    
            set_output_data(0);
            __udelay(5);    
            set_output_data(dat & 0x01); 
            __udelay(55);
            set_output_data(1);
            __udelay(2);
            dat >>= 1;    
        }
        spin_unlock(&lock);
        __udelay(30);
    }
    
    //********************************
    //功能:读取ds18b20的温度
    //********************************
    unsigned int read_wendu(void)
    {
        unsigned char dat_L = 0, dat_H = 0;
        unsigned int wendu_value;
        int ds18b20_back_value;
    
    
        ds18b20_back_value  = init_DS18B20();
    
        if (ds18b20_back_value)
            printk("ds18b20 init error!!!\n");
        else 
            printk("ds18b20_back_value %d\n", ds18b20_back_value);
        write_one_char(0xCC);
        write_one_char(0x44);
    
        if (init_DS18B20())
            printk("ds18b20 init error!!!\n");
        else 
            printk("ds18b20 init ok \n");
        write_one_char(0xcc);
        write_one_char(0xBE);
    
        dat_L = read_one_char();
        dat_H = read_one_char();
    
        if((dat_H & 0xf8) != 0x00) {
            dat_L = (~dat_L) + 1;
    
            if (dat_L > 255)
                dat_H = (~dat_H) + 1;
        }
        wendu_value = (dat_H * 16 + dat_L/16) * 10 +((dat_L%16)*10/16);
    
        printk("read_wendu--dat_L: %d    dat_H: %d    wendu: %d.%d\n",dat_L, dat_H, \
            wendu_value/10, wendu_value%10);
    
        return(wendu_value);
    }
    
    static int ds18b20_open(struct inode *inode, struct file *filp)
    {
        printk (KERN_INFO "Device opened\n");
        spin_lock_init(&lock);
        return 0;
    }
    
     /*读取数据*/
    static int ds18b20_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos)
    {
        unsigned int wendu_value = 0;
        int res = 0;
        wendu_value = read_wendu();
    
        if (wendu_value>2000)
        {
            wendu_value = tmp_wendu;
        }
        tmp_wendu = wendu_value;
        printk("wendu_valu is %d\n", wendu_value); 
        res=copy_to_user(buffer, &wendu_value, sizeof(wendu_value));
        if (res < 0)
        {
            printk("copy_to_user error! ");
        }
        printk("copy_to_user len! %d\n ", res);
        return 0;   
    }
    /*写命令,在此置空*/
    static int ds18b20_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
    {
        return 0;
    }
    
    static int ds18b20_release(struct inode *inode,struct file *filp)
    {
        printk (KERN_INFO "device closed\n");
        return 0;
    }
    
    static long ds18b20_ioctl(struct file *filp, unsigned int cmd,
            unsigned long arg)
    {
        return 0;
    }
    
    static struct file_operations ds18b20_fops = {
        .owner  = THIS_MODULE,
        .open   =    ds18b20_open,
        .read   = ds18b20_read,
        .write  = ds18b20_write,
        .unlocked_ioctl    = ds18b20_ioctl,
        .release = ds18b20_release,
    };
    
    static struct miscdevice ds18b20_dev = {
        .minor            = MISC_DYNAMIC_MINOR,
        .name            = DEVICE_NAME,
        .nodename        = NODE_NAME,
        .fops            = &ds18b20_fops,
    };
    
    static int __init ds18b20_dev_init(void) {
        int ret;
    
        ret = gpio_request(S5PV210_GPH2(0), "DS18B20");
        if (ret) {
            printk("%s: request GPIO %d for GPE0 failed, ret = %d\n", DEVICE_NAME,
                S5PV210_GPH2(0), ret);
            return ret;
    
            s3c_gpio_cfgpin(S5PV210_GPH2(0), S3C_GPIO_OUTPUT);
            gpio_set_value(S5PV210_GPH2(0), 1);
        }
    
        ret = misc_register(&ds18b20_dev);//注册杂设备驱动
    
        printk(DEVICE_NAME"\tinitialized\n");
    
        return ret;
    }
    
    static void __exit ds18b20_dev_exit(void) {
        int i;
    
        for (i = 0; i < 1; i++) {
            gpio_free(S5PV210_GPH2(0));
        }
    
        misc_deregister(&ds18b20_dev);
    }
    
    module_init(ds18b20_dev_init);
    module_exit(ds18b20_dev_exit);
    
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("GaoZhe.");

    Makefile

    ifneq ($(KERNELRELEASE),)
    obj-m := DS18B20_driver.o
    else
    PWD := $(shell pwd)
    KDIR:= /home/bishe/kernel/linux-3.0.8
    all:
        make -C $(KDIR) M=$(PWD)
    clean:  
        rm -rf *.o *.order *.ko *.mod.c *.symvers *.c~ *~
    endif

    应用程序如下

    #include <fcntl.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/select.h>
    
    int main(int argc, char *argv[])
    {
        int fd, i;
        char *buf;
        unsigned int a=0;
        fd = open("/dev/DS18B20", O_RDWR);
        if(-1 == fd)
            {
            perror("open file error\r\n");
            exit(-1);
            }
            printf("open /dev/DS18B20 success!\n");
        while(1)
            {
            int i=read(fd,&a,5);
            if(i<0)
            {
                printf("read tempture is error!\n");
            }   
        printf("test_temptureis:%d.%d\n",a/10,a%10); 
            sleep(1);
            }
        close(fd);
        return 0;
    }

    在这里用的是misc杂项设备的,#make之后,会生成DS18B20_driver.ko,然后#insmod DS18B20_driver.ko加载模块,执行#cat /proc/devices 发现并没有DS18B20这个驱动模块啊,而多了一个主设备号为10的misc,同时,#ls /dev 会发现自动生成了DS18B20设备文件,为什么呢?因为misc杂项设备驱动共用一个主设备号,区分不同设备的依据是次设备号,这里共用的是主设备号是10,次设备号是系统自动分配的。当#insmod后,系统会自动在/dev目录下创建设备文件,不需要手动mknod创建。

    展开全文
  • 所有课程见此链接: zigbee CC2530 系列教程 0 课程介绍 ...开发板硬件设计有温湿度传感器DHT11,原理图如图4-12-1所示,可以用此接口代替DS18B20,DS18B20实物图如图4-12-2所示,电源对应连接至DH...

    所有课程见此链接:

    zigbee CC2530 系列教程 0 课程介绍

     

    4.11温度传感器DS18B20实验

    4.11.1 实验目的

    学习使用温度传感器DS18B20,并在串口显示温度数据。

    4.11.2 实验讲解

    开发板硬件设计有温湿度传感器DHT11,原理图如图4-12-1所示,可以用此接口代替DS18B20,DS18B20实物图如图4-12-2所示,电源对应连接至DHT11接口,DQ连接至P06接口。

    图4-12-1 DHT11接口图                    图4-12-2 DS18B20引脚

    主函数部分程序如下:

    #include"iocc2530.h"
    
    #include"uart.h"
    
    #include"ds18b20.h"
    
    #include"delay.h"
    
    void Initial() //系统初始化
    
    {
    
      CLKCONCMD = 0x80;     //选择32M振荡器
    
      while(CLKCONSTA&0x40); //等待晶振稳定
    
      UartInitial();              //串口初始化
    
      P0SEL &= 0xbf;           //DS18B20的io口初始化
    
    }
    
    
    
    void main()
    
    {
    
      char data[5]="Temp="; //串口提示符
    
      Initial();
    
      while(1)
    
      {
    
        Temp_test();   //温度检测
    
        /*******温度信息打印 ***********/
    
        UartTX_Send_String(data,5);
    
        UartSend(temp/10+48);
    
        UartSend(temp%10+48);
    
        UartSend('\n');
    
        Delay_ms(1000); //延时函数使用定时器方式
    
      }
    
    }

    4.11.3 实验效果

    图4-13 实验效果图

    展开全文
  • 温度传感器DS18B20 实物图 原理图 单总线 单片机通过1-Wire协议与DS18B20进行通信,将温度读出 单总线驱动代码借用了蓝桥杯赛点数据资源包给的onewire.c 修改添加了几处 DS18B20对时序要求非常严格,所以在操作时序...

    温度传感器DS18B20

    实物图在这里插入图片描述

    原理图

    在这里插入图片描述

    单总线

    单片机通过1-Wire协议与DS18B20进行通信,将温度读出

    单总线驱动代码借用了蓝桥杯赛点数据资源包给的onewire.c
    修改添加了几处
    DS18B20对时序要求非常严格,所以在操作时序前,为防止中断干扰总线时序,先关闭中断,操作完成后再打开

    /*
      程序说明: 单总线驱动程序
      软件环境: Keil uVision 4.10 
      硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
      日    期: 2011-8-9
    */
    #include "reg52.h"
    
    sbit DQ = P1^4;  //单总线接口
    
    //单总线延时函数
    void Delay_OneWire(unsigned int t)  //STC89C52RC
    {
    	/*=========添加========*/
    	t *= 7;
    	/*=========添加========*/
    	while(t--);
    }
    
    //通过单总线向DS18B20写一个字节
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	EA = 0;/*=========添加========*/
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    	EA = 1;/*=========添加========*/
    }
    
    //从DS18B20读取一个字节
    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
      	EA = 0;/*=========添加========*/
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		dat >>= 1;
    		DQ = 1;
    		if(DQ)
    		{
    			dat |= 0x80;
    		}	    
    		Delay_OneWire(5);
    	}
    	EA = 1;/*=========添加========*/
    	return dat;
    }
    
    //DS18B20设备初始化
    bit init_ds18b20(void)
    {
      	bit initflag = 0;
      	EA = 0;/*=========添加========*/
      	DQ = 1;
      	Delay_OneWire(12);
      	DQ = 0;
      	Delay_OneWire(80);
      	DQ = 1;
      	Delay_OneWire(10); 
        initflag = DQ;     
      	Delay_OneWire(5);
      	EA = 1;/*=========添加========*/
      	return initflag;
    }
    
    

    启动DS18B20

    bit start_DS18B20()
    {
    	bit ack;
    	ack = init_ds18b20();
    	if(ack == 0)
    	{
    		Write_DS18B20(0xCC);
    		Write_DS18B20(0x44);
    	}
    	return ack;
    }
    

    0xCC,时跳过ROM的指令,因为单总线上只挂载了一个DS18B20
    0x44,启动一次温度转换
    在这里插入图片描述
    R1 R0出厂默认是11
    也就是在

    Write_DS18B20(0x44);
    

    之后,至少要等750ms才能读取数据,
    否则读取到的数据可能是错误的值
    这了我第一次读出来的是85,
    显然,要么数据错了,要么我已经没了。。。

    获取温度

    unsigned int temp_get()
    {
    	bit ack;
    	unsigned char LSB,MSB;
    	unsigned int temp;
    	
    	ack = init_ds18b20();
    	if(ack == 0)
    	{
    		Write_DS18B20(0xCC);
    		Write_DS18B20(0xBE);
    		LSB = Read_DS18B20();
    		MSB = Read_DS18B20();
    		temp = ((unsigned int)MSB << 8) + LSB;
    		temp >>= 4;
    		return temp;
    	}
    	else return 0;
    

    在这里插入图片描述
    在这里插入图片描述

    MSB是高位 LSB是低位
    这里温度我直接取整了,
    并且没考虑负温度,(因为我是南方人 ) /dogo
    取小数的话

    temp = ( ((u32)MSB) << 8) + LSB;	
    temp *= 625;	
    

    temp*=625等价于
    temp*(1/16)*(1000)
    这样做避免了浮点数运算,单片机能更快的处理
    并且数码管显示时整形也更方便把单独的位取出来
    然后

    主函数

    start_DS18B20();
    temp = temp_get();
    

    这样直接用就行,数码管的就不放上去了

    展开全文
  • 温度传感器DS18B20简介特点实物图原理图内部结构(1) 64位(激)光刻只读存储器(2) DS18B20温度转换规则(3) DS18B20温度传感器的存储器(4) 配置寄存器ROM指令RAM指令编程原理DS18B20初始化DS18B20读时序DS18B20写时序...
  • 大部分人在使用时也不会严格对照数据手册的时序操作,所以经常会有人遇到,网上下载的代码无法正常驱动DS18B20读取环境温度,有的代码在Proteus等仿真软件里是可以正常使用的(时钟频率设定等因素),但在实物中就...
  • 温度传感器 DS18B20

    千次阅读 2017-07-11 20:56:14
    开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的3. 温度寄存器 ...
  • 上图,这是我的实物图。 我给它标个号吧。 如图。平滑的一面朝上,也就是有英文的,从左至右给引脚标上1,2,3 引脚顺序从左至右分别是 GND DATA VCC 也就是 千万,千万别接反了啊 ...
  • 两路DS18B20接口 2路DS18B20接口,可以外接温度传感器测量温度。1) 原理图 2) 实物图 3) 接口说明温度传感器的插口为U5、U7,共两路温度传感器接口,留接口能更方便外接传感器,比如外接探头式的DS18B20。模块...
  • Arduino DS18B20温度检测

    2015-09-06 12:28:00
    一.实物图 注:电阻选取4.7k欧 二....注:先下载Onewire库到arduinolibraries目录下,然后就有例子 ...// OneWire DS18S20, DS18B20, DS1822 Temperature Example // // http://www.pjrc.com/teensy/t...
  • 课题研究目的: 温度数我们日常生产和生活中实时在接触到的物理量,但仅凭感觉只能感觉到大概的温度值,传统的指针式的温度计虽然能指示温度,但是精度低,使用不够方便,显示不够直观,数字温度计的出现让人们直观...
  • 在这里插入图片描述
  • 这个温度计使用的单片机是STC89C2051,测量范围-55到+125度,显示精度为0.1度,DS18B20数据脚P0.4 ,采用器件默认的12位转化,显示采用4位LED共阳显示测温值,P2口为段码输入,P0~P3为位选,继电器接P1.1,蜂鸣器接P...
  • 目录原理红外通信DS18B20 原理 红外通信 红外通信原理 红外通信的原理就是利用38k载波对原始信号进行调制,使其变成0调制后的信号,我们单片机就只需要对这个信号进行分析处理就可以得到数据。 NEC协议红外...
  • DS18B20数字温度计设计

    千次阅读 多人点赞 2018-05-15 13:26:33
    一、单片机简介. 1二、设计任务和要求.... 8单片机硬件连接实物图及实验结果. 4四、系统软件算法设计. 74.1主程序. 74.2 子程序. 7五、总结与体会. 75. 1 课程设计过程中遇到的问题及解决方法总...
  • 基于51单片机及DS18B20温度传感器的数字温度计设计

    千次阅读 多人点赞 2017-12-03 23:44:41
    基于51单片机及DS18B20温度传感器的数字温度计设计,是知创学院Jason大学时做的课程设计,虽说比较简单,但对初学者还是有一些借鉴意义。好多朋友也在微信中留言询问有没有相关资料。特借此机会公布一下下载地址,...
  • 实物图 代码 提前下载OneWire和DallasTemperature库 #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS A1// 数据输出脚接开发板数字引脚A1 OneWire oneWire(ONE_WIRE_...
  • 17年节能减排大赛作品,获得校赛一等奖,控制简单,主要是想法比较好,想做类似项目的可以参考一下 实物图如下:
  • 2、由于ds18b20的程序前面文章已经写过,所以暂不概述; 3、液晶显示采用sms太阳人的液晶显示屏; 4、实物图如下: 5、使用xc编译完成,调试过程中,当使用static bit 的时候不能进行函数传参,一直很头疼,最后...
  • 前些天用汇编做的 源程序、原理图、实物图都有。 word格式的
  • DS18B20温度测量(2)实际制做

    千次阅读 2013-10-23 16:34:05
     这个是原理图: 实际接线图如下: 接好的实物图如下: 接下来就是写程序了,我们还是一步步地来完成: ① 向总线发出复位信号: sbit TMDAT=P1^1; //设P1.1为TMDAT void tmreset(void) { uint i; ...
  • 3.材料简单:stm32f103c8t6一个,0.96寸oled显示屏一个,ds18b20一个,四个按键,一个蜂鸣器,usb转ttl一个(烧录用),还有面包板,杜邦线这些。 4.下面是程序: main.c文件如下: #include "stm32f10x.h" #...
  • 课程设计_电子万年历DS12C887+温度18B20+LCD12864显示+闹钟,实物原理
  • 实物显示图片 完整工程和资料包下载:... ...一:DS1302驱动代码头文件(DS1302.h) ...#ifndef DS18B20_H #define DS18B20_H #include "stm32f10x.h" #include "sys.h" //DS13...
  • 基于PROTEUS温度检测

    2009-03-18 09:07:07
    实物图中,由数字温度传感器DS18B20采集温度,在其内部进行A/D转换,输出数字量与单片机AT89C51直接通讯,由于数字温度传感器DS18B20温度转换是通过单片机来控制的,但DS18B20通过单总线与单片机进行通讯,所以其...
  • 本次课题是以STC89C51单片机为主控芯片,结合DS18B20温度传感器、蓝牙模块等设计的一个测温系统,温度可以通过LCD液晶屏和手机APP实时显示。通过手机APP对上下报警温度进行设置,如果所监测到的温度,超过了设置的...
  • 信号采集系统.rar

    2020-07-03 14:45:58
    利用51单片机和ds18b20做的数据采集系统,这是ad软件的原理加pcb,可以直接做实物。它通过ds18b20对温度的采集,最终在四位数码管上显示出来,并且可以设计和调节温度上下限,可以说很实用方便了。
  • (2)测温芯片:DS18B20 (3)显示方式:四位共阳数码管 实物展示: 视频演示: 数码管温度报警器功能介绍: 采用DS18B20采集温度 数码管显示温度 可通过按键设定上限和下限温度的报警值 高于上限温度或是低于下限温度...
  • 本系统所设计的数字温度计采用的是DS18B20数字温度传感器测温,DS18B20直接输出的就是数字信号,与传统的温度计相比,具有读数方便,测温范围广,测温准确,上下限报警功能。其输出温度采用LED数码管显示,主要用于...
  • 这里要做出说明的是,大多数DS18B20程序代码都是12T单片机下设计的,而1T单片机指令速度要比12T单片机快很多,这就导致了DS18B20程序不能直接拿来调用。笔者根据stc的官方资料,通过计算指令外加逻辑分析仪测试的...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

ds18b20实物图