• 一、基础介绍 时序介绍就暂不介绍,可以网上搜集资料 二、proteus仿真图 三、程序代码 #include<reg51.h> #include"temp.h" #define duanxuan P1 //段选端口 #define weixuan P2 //位选端口 ...

    一、基础介绍

    时序介绍就暂不介绍,可以网上搜集资料

    二、proteus仿真图

    仿真图

    三、程序代码

    #include<reg51.h>
    #include"temp.h"
    
    #define duanxuan P1        //段选端口
    #define weixuan P2         //位选端口
    
    unsigned char code wxcode[4]={0x01,0x02,0x04,0x08};
    unsigned char code dxcode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    	
    
    sbit DSPORT=P3^7;
    int temp;
    
    void DigDisplay(int);
    
    
    /******************/
    void Delay1ms(unsigned int y)
    {
    	unsigned int x;
    	for(y;y>0;y--)
    		for(x=110;x>0;x--);
    }
    /*******************************************************************************
    * 函数名         : Ds18b20Init
    * 函数功能		   : 初始化
    * 输入           : 无
    * 输出         	 : 初始化成功返回1,失败返回0
    *******************************************************************************/
    
    unsigned char Ds18b20Init()
    {
    	unsigned int i;
    	DSPORT=0;			 //将总线拉低480us~960us
    	i=70;	
    	while(i--);//延时642us
    	DSPORT=1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
    	i=0;
    	while(DSPORT)	//等待DS18B20拉低总线
    	{
    		i++;
    		if(i>5000)//等待>5MS
    			return 0;//初始化失败	
    	}
    	return 1;//初始化成功
    }
    
    /*******************************************************************************
    * 函数名         : Ds18b20WriteByte
    * 函数功能		   : 向18B20写入一个字节
    * 输入           : com
    * 输出         	 : 无
    *******************************************************************************/
    
    void Ds18b20WriteByte(unsigned char dat)
    {
    	unsigned int 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;
    		DigDisplay(temp);
    	}
    }
    /*******************************************************************************
    * 函数名         : Ds18b20ReadByte
    * 函数功能		   : 读取一个字节
    * 输入           : com
    * 输出         	 : 无
    *******************************************************************************/
    
    
    unsigned char Ds18b20ReadByte()
    {
    	unsigned char byte,bi;
    	unsigned int 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--);
    		DigDisplay(temp);
    	}				
    	return byte;
    }
    /*******************************************************************************
    * 函数名         : Ds18b20ChangTemp
    * 函数功能		   : 让18b20开始转换温度
    * 输入           : com
    * 输出         	 : 无
    *******************************************************************************/
    
    void  Ds18b20ChangTemp()
    {
    	int i = 50;
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令		 
    	Ds18b20WriteByte(0x44);	  //温度转换命令
    		
    	while(i != 0)
    	{
    		i--;
    		DigDisplay(temp);
    		
    	}
    //	Delay1ms(100);
    }
    /*******************************************************************************
    * 函数名         : Ds18b20ReadTempCom
    * 函数功能		   : 发送读取温度命令
    * 输入           : com
    * 输出         	 : 无
    *******************************************************************************/
    
    void  Ds18b20ReadTempCom()
    {	
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
    	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
    }
    /*******************************************************************************
    * 函数名         : Ds18b20ReadTemp
    * 函数功能		   : 读取温度
    * 输入           : com
    * 输出         	 : 无
    *******************************************************************************/
    
    int Ds18b20ReadTemp()
    {
    	int temp=0;
    	unsigned char tmh,tml;
    	Ds18b20ChangTemp();			 	//先写入转换命令
    	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
    	tml=Ds18b20ReadByte();		//读取温度值共16位,先读低字节
    	tmh=Ds18b20ReadByte();		//再读高字节
    	temp=tmh;
    	temp<<=8;
    	temp|=tml;
    	return temp;
    }
    /******************/
    
    void main()
    {
    	int tp;
    	int i= 0;
    	while(1)
    	{
    			temp = Ds18b20ReadTemp();
    			if(temp < 0)				
    			{
    				temp=temp-1;
    				temp=~temp;
    				tp=temp;
    				temp=tp*0.0625*100+0.5;
    			}
    			else
    			{			
    				tp=temp;
    				temp=tp*0.0625*100+0.5;	
    			}
    	    DigDisplay(temp);
    	}
    }
    
    void DigDisplay(int temp) 	 //数码管显示
    {
    	int bai;
    	int shi;
    	int ge;
    	int yi;
    	
    
    	unsigned char i;
    	unsigned int j;
    	
    	bai = temp / 10000;
      shi = temp % 10000 / 1000;
      ge = temp % 1000 / 100;
      yi = temp % 100 / 10;
    	for(i=0; i<5; i++)
    	{
    		 weixuan = wxcode[i];
    		 duanxuan = 0xff;
    		if(i == 0)
    		{
    			duanxuan = dxcode[bai];
    		}
    		if(i == 1)
    		{
    			duanxuan = dxcode[shi];
    		}
    		if(i == 2)
    		{
    			//duanxuan = dxcode[ge]|0x00;
    			duanxuan = dxcode[ge]&0x7f;
    		}
    		if(i == 3)
    		{
    			duanxuan = dxcode[yi];
    		}
    		j=10;
    		while(j--);
    		duanxuan=0xff;
    	}
    }
    
    展开全文
  • 51单片机ds18b20

    2019-03-25 21:56:35
    温度传感器是比较简单的外设之一,学习51单片机都会学习ds18b20来学习51的ad转换。 ds18b20是通过iic总线来进行通行的,属于比较简单的模块之一,这里贴出ds18b20的驱动程序,调用时只要直接读取对应地址的数据即可...

    温度传感器是比较简单的外设之一,学习51单片机都会学习ds18b20来学习51的ad转换。

    ds18b20是通过iic总线来进行通行的,属于比较简单的模块之一,这里贴出ds18b20的驱动程序,调用时只要直接读取对应地址的数据即可。

     #include"temp.h"
    
    void Delay1ms(uint y)
    {
    	uint x;
    	for( ; y>0; y--)
    	{
    		for(x=110; x>0; x--);
    	}
    } 
    
    uchar Ds18b20Start()
    {
     uchar i;
     DSPORT=0;
     i=70;
     while(i--);
     DSPORT=1;
     i=0;
     while(DSPORT)
     {
      Delay1ms(1);
      i++;
      if(i>5)
      {return 0;}
     }
     return 1;
    }
    
    void Ds18b20WriteByte(uchar dat)
    {
     uchar i,j;
     for(j=0;j<8;j++)
     {
      DSPORT=0;
      i++;
      DSPORT=dat&0x01;
      i=6;
      while(i--);
      DSPORT=1;
      dat>>=1;
     }
    }
    
    uchar Ds18b20ReadByte()
    {
     uchar bi,byte;
     uint i,j;
     for(j=8;j>0;j--)
     {
      DSPORT=0;
      i++;
      DSPORT=1;
      i++;
      i++;
      bi=DSPORT;
      byte=(byte>>1)|(bi<<7);
      i=4;
      while(i--);
     }
     return byte;
    }
    
    void Ds18b20ChangeTemp()
    {
     Ds18b20Start();
     Delay1ms(1);
     Ds18b20WriteByte(0xcc);
     Ds18b20WriteByte(0x44);
    }
    
    void Ds18b20ReadTempCom()
    {
     Ds18b20Start();
     Delay1ms(1);
     Ds18b20WriteByte(0xcc);
     Ds18b20WriteByte(0xbe);
    }
    
    int Ds18b20ReadTemp()
    {
     uchar tmh,tml;
     int temp=0;
     Ds18b20ChangeTemp();
     Ds18b20ReadTempCom();
     tml=Ds18b20ReadByte();
     tmh=Ds18b20ReadByte();
     temp=tmh;
     temp<<=8;
     temp|=tml;
     return temp;
    }
    
    
    展开全文
  • 51单片机DS18B20模块

    2018-04-05 21:57:44
    说在前面:要和几个朋友做一个项目 ,其中要用到DS18B20,简单介绍下它的特点吧2.简介:1.电压范围:3.0到5.5v2.温度范围:-55度到125度3.可编程分辨率为9-12位,对应分辨温度为0.5度,0.25度,0.125度。0.0625度4....

    2018/4/5

    51单片机

    1.说在前面:要和几个朋友做一个项目 ,其中要用到DS18B20,简单介绍下它的特点吧

    2.简介:

    1.电压范围:3.0到5.5v

    2.温度范围:-55度到125度

    3.可编程分辨率为9-12位,对应分辨温度为0.5度,0.25度,0.125度。0.0625度

    4.特点:采用了单线接口的方式,通过一根线实现和MCU之间的单向通讯

    3.内部结构


    4.温度和数据之间的关系

    数据位一共是16位,高字节前5位是符号位(全0位为正,全1位负),后面为数据位,从2^6开始向后,如果为正值,直接乘以0.0625得标准值。如果为负值,则减一再取反

    5.在DS18b20中对ROM和RAM进行配置,达到初始化的效果

    6.控制八段数码管显示温度代码:

    //预编译文件
    #ifndef _temp_H
    #define _temp_H
    #include<reg52.h>
    //定义无符号字符型
    #ifndef uchar 
    #define uchar unsigned char
    #endif
    //定义无符号字符型
    #ifndef uint 
    #define uint unsigned int
    #endif
    sbit DSPORT=P3^7;
    
    #endif
      #include"temp.h"
    //延时1ms
    void Delay1ms(uint y)
    {
    	uint x;
    	for(;y>0;y--)
    	{
    		for(x=110;x>0;x--);	
    	}
    }
    
    //DS18B20 初始化函数
    //1.确定返回值 1:存在  0:不存在
    uchar Ds18b20Init()
    {
    	uchar i=0;
    	DSPORT=0; //拉低
    	i=70;
    	while(i--);//延时642us
    	DSPORT=1; //拉高
    	i=0;
    	while(DSPORT)//已读取低电平
    	{
    		Delay1ms(1);//延时1ms 
    		i++;
    		if(i>5)
    		{
    			return 0;//初始化失败
    		}
    	 	
    	}
    	return 1;//初始化成功 
    }
    //写入8位数值
    void DsWriteByte(uchar dat)
    {
    	uchar i,j;
    	for(j=0;j<8;j++)
    	{
    		DSPORT=0; //拉低
    		DSPORT=dat&0x01;//判断最低位是否为1 
    		i=6;
    		while(i--);//延时68us
    		DSPORT=1; //拉高
    		dat>>=1;//右移符号,保证循环的每一次都是0X01
    	}
    }
    uchar DsReadByte()
    	{
    		uint i,j;
    		uchar bi,byte;  
    		for(j=8;j>0;j--)
    		{
    			DSPORT=0; //拉低
    			i++; //延时1ms
    			DSPORT=1; //拉高
    			i++;
    			i++;
    		
    			bi=DSPORT;	//0
    			byte=(byte>>1)|(bi<<7);//移位  1000 0000->0100 0000 | 0
    			i=4;
    			while(i--);
    			}
    			return byte;//读取
    		}
    	 	
    	void DSchangetemp()//对所给数值进行转换
    	{
    		  Ds18b20Init();
    		  Delay1ms(1);
    		  DsWriteByte(0XCC);//发送指令,开启温度传感器
    		  DsWriteByte(0x44);//发送指令,温度传感器为12位
    	}
    	 void DSreadtempcom()//发送温度读取指令
    	 {
    	 	  Ds18b20Init();
    		  Delay1ms(1);
    		  DsWriteByte(0XCC);//发送指令,开启温度传感器
    		  DsWriteByte(0xbe);//发送指令,温度传感器为12位
    	 }
    	 int DSreadtemp()//温度读取
    	 {
    	 	int temp=0;
    	 	uchar tmh,tml;
    		DSchangetemp();
    		DSreadtempcom();
    		tml=DsReadByte();  //读取低字节
    		tmh=DsReadByte(); //读取高字节
    		temp= tmh;
    		temp<<=8;//左移八位,所以成为了低八位
    		temp|=tml;//获得了低八位数据
    		return temp;
    	 }
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    #include"temp.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 Dispdata[8];
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
       //延时函数
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    
    
    	//数据处理函数
    void datapros(int temp)
    {
    	float tp;
    	if(temp<0)
    	{
    	   Dispdata[0]=0x40;//代表负号
    	   temp=temp-1;
    	   temp=~temp;
    	   tp=temp;
    	   temp=tp*0.0625*100+0.5;//得到标准温度
    	}
    	else
    	{
    	 Dispdata[0]=0x00;
    	 tp=temp;
    	 temp=tp*0.0625*100+0.5;//得到标准温度
    	}
    	  Dispdata[1]=smgduan[temp/10000];// 百位
    	  Dispdata[2]=smgduan[temp%10000/1000];//十位
    	  Dispdata[3]=smgduan[temp%10000%1000/100]|0x80 ;//个位,显示小数点
    	  Dispdata[4]=smgduan[temp%100/10];//十分位
    	  Dispdata[5]=smgduan[temp%100%10];//十分位
    }
    	void DigDisplay()
    {
    	u8 i;
    	for(i=0;i<4;i++)
    	{
    		switch(i)	 //位选,选择点亮的数码管,
    		{
    			case(0):
    				LSA=0;LSB=0;LSC=0; break;//显示第0位
    			case(1):
    				LSA=1;LSB=0;LSC=0; break;//显示第1位
    			case(2):
    				LSA=0;LSB=1;LSC=0; break;//显示第2位
    			case(3):
    				LSA=1;LSB=1;LSC=0; break;//显示第3位
    			case(4):
    				LSA=0;LSB=0;LSC=1; break;//显示第4位
    			case(5):
    				LSA=1;LSB=0;LSC=1; break;//显示第5位		
    		}
    		P0=Dispdata[5-i];//发送段码
    		delay(100); //间隔一段时间扫描	
    		P0=0x00;//消隐
    	}		
    }
    
    
    void main()
    {
    		
    	while(1)
    	{
    	
    		datapros(DSreadtemp());	 //数据处理函数
    		DigDisplay();//数码管显示函数		
    	}		
    }
    
    


    展开全文
  • 学习了单片机,对于单片机温度传感器DS18B20的一些理解

    DS18B20温度模块

       1.1模块特征

          

    供电方式 (两种供电方式:供电为:35.5V)

        


    DS18B20结构图

          

    主要由2部分组成:64ROM9字节暂存器,如图所示

     

       164ROM。它的内容是64位序列号,它可以被看做是该DS18B20de地址序列码,

            其作用是使每个DS18B20都不相同,这样就可以实现一根总线上挂载多个DS18B20

            的目的。(由于实验条件,本次只在一根总线下挂载了一个DS18B20)。

       29字节暂存器包含:温度传感器、上限触发TH高温报警器、下线触发TL低温报警

            器、高速暂存器、8CRC产生器。

             

     

    以上部分为9字节的暂存单元(包括EEPROM)。

    字节01是温度暂存器,用来存储转换好的温度。

    字节23是用户用来设置最高报警和最低报警值。软件实现。(由于设计时的气候环境,

             只设置了一个上限温度报警,而没有设定下限温度报警)。

    字节4是配置寄存器,用来配置转换精度,让它工作在912位。

    字节57保留位。

    字节8 CRC校验位。是64ROM中的前56位编码的校验码。由CRC发生器产生。


    温度寄存器

        温度寄存器结构图

              

        

          温度寄存器由两个字节组成,分为低8位和高8位,一共16个字节。

            *其中,第0位到第3位,存储的是温度值的小数部分。

            *4位到第10位存储的是温度值的整数部分。

            *11位到第15位为符号位,全0表示是正温度,全1表示负温度。

            *下表中的数值,如果相应的位为1,表示存在,如果相应的位为0,表示不存在。

                 

       

      配置寄存器

        配置寄存器结构图

                 

          精确值:

               9--bit       0.5

               10-bit       0.25

               11-bit       0.125

               12-bit       0.0625

                一般都默认为12--bit 


           

      初始化

              

             初始化时序包括:主机发出的复位脉冲和从机发出的应答脉冲。主机通过拉低单总线480-960us产生复位脉冲;然后由主机释放总线,并进入接收模式。主机释放总线时,    会产生一由低电平跳变为高电平的上升沿,单总线器件检测到该上升沿后,延时15-60us,接着单总线器件通过拉低总线60-240us来产生应答脉冲。主机接收到从机的以应     答脉冲后,说明有单总线器件在线,初始化完成,主机可以对从机进行ROM命令和操作。

    位写入时序

          

       

          写时隙:当主机把数据线从逻辑高电平拉到逻辑低电平时候,开始写时隙,两种写时间隙:写1和写0。所有写时隙必须最少持续60us,包括两个写周期间至少1us的恢            复时间。DQ引脚电平变低后,DS18B20在一个15us60us的时间内对DQ引脚采样。如果DQ引脚高电平,写1,如果低电平,写0,主机要生成一个写1时间隙。

             必须把数据线拉到低电平然后释放,在写时隙开始后的15us内允许数据拉到高电平。主机要生成一个写0时间隙,必须把数据线拉到低电平并保持60us

     位读入时序

         

      

      当主机把总线从高电平拉低,并保持至少1us后释放总线;并在15us内读取从DS18B20输出的数据。

     

    DS18B20ROM操作命令

      用途:主要用于选定在单总线上的DS18B20,分为5个命令。

    1:读出ROM,代码为33H,用于读出DS18B20的序列号,即64位激光ROM代码。

    2:匹配ROM,代码为55H,用于识别(或选中)某一特定的DS18B20进行操作。

    3:搜索ROM,代码为F0H,用于确定总线上的节点数以及所有节点的序列号。

    4:跳过ROM,代码为CCH,当总线仅有一个DS18B20时,不需要匹配。

    5:报警搜索,代码为ECH,主要用于鉴别和定位系统中超出程序设定的报警温度

            界限的节点。

     

     启动温度转换

       三个步骤:

       1、复位DS18B20

       2、发出跳过ROM命令(CCH

       3、发出启动温度转换命令(44H

     其中Skip ROM 命令仅适用于总线上只有一个DS18B20时的情况。


    部分源码:

     

    #include <reg52.h>
    #include "./delay/delay.h"
    #include <intrins.h>
    #include <stdio.h>
    #include "./LCD1602/LCD1602.h"
    
    sbit ds = P3^4;
    bit ack = 0;
    
    void ds18b20_reset()
    {
    		ds = 1;
    		ds = 0;
    		delay_us(200);
    		delay_us(200);
    		ds = 1;
    		delay_us(30);
    	
    		if(0 == ds)
    		{
    				ack = 1;
    		}
    		else
    		{
    				ack = 0;
    		}
    		delay_us(200);
    		delay_us(200);
    }
    
    void ds18b20_write_byte(unsigned char byte)
    {
    		unsigned char i;
    		for(i = 0; i < 8; i++)
    		{
    				ds = 0;
    				_nop_();
    				_nop_();
    				ds = byte & 0x01;
    				byte >>= 1;
    				delay_us(30);
    				ds = 1;
    		}
    		delay_us(30);
    }
    
    bit ds18b20_read_bit()
    {
    		bit temp;
    		ds = 1;
    		ds = 0;
    		_nop_();
    		_nop_();
    		ds = 1;
    		temp = ds;
    		delay_us(30);
    		return temp;
    }
    
    unsigned char ds18b20_read_byte()
    {
    		unsigned char i, j, k;
    		for(i = 0; i < 8; i++)
    		{
    				j = ds18b20_read_bit();
    				k = (j << 7) | (k >> 1);
    		}
    		return k;
    }
    
    void main()
    {
    		unsigned char a;
    		unsigned char i;
    		unsigned int temp, b;
    		float wendu;
    		unsigned char disbuf[20];
    		BLK = 0;
    	
    		lcd1602_init();
    		while(1)
    		{
    				
    				ds18b20_reset();
    				ds18b20_write_byte(0xcc);
    				ds18b20_write_byte(0x44);
    			
    				ds18b20_reset();
    				ds18b20_write_byte(0xcc);
    				ds18b20_write_byte(0xbe);
    				a = ds18b20_read_byte();
    				b = ds18b20_read_byte();
    				temp = (b << 8) | a;
    				wendu = (float)temp * 0.0625;
    				sprintf(disbuf,"temp is:%7.3f",wendu);
    				lcd1602_dis_str(0,0,disbuf);
    			
    				
    				
    
    		}
    }




    展开全文
  • 单片机ds18b20程序

    2019-06-03 15:54:22
    ds18b20对时序要求很高,所以一定要注意延时 下面是32单片机的程序 //复位DS18B20 void DS18B20_Rst(void) { DS18B20_IO_OUT(); //SET PG11 OUTPUT DS18B20_DQ_OUT=0; //拉低DQ delay_us(750); //延时750us...

    ds18b20对时序要求很高,所以一定要注意延时

    下面是32单片机的程序

    //复位DS18B20
    void DS18B20_Rst(void)	   
    {                 
    	DS18B20_IO_OUT(); 	//SET PG11 OUTPUT
        DS18B20_DQ_OUT=0; 	//拉低DQ
        delay_us(750);    	//延时750us
        DS18B20_DQ_OUT=1; 	//DQ=1 
    	delay_us(15);     	//15US
    }
    
    //等待DS18B20的回应
    //返回1:未检测到DS18B20的存在
    //返回0:存在
    u8 DS18B20_Check(void) 	   
    {   
    	u8 retry=0;
    	DS18B20_IO_IN();	//SET PG11 INPUT	 
        while (DS18B20_DQ_IN&&retry<200)
    	{
    		retry++;
    		delay_us(1);
    	};	 
    	if(retry>=200)return 1;
    	else retry=0;
        while (!DS18B20_DQ_IN&&retry<240)
    	{
    		retry++;
    		delay_us(1);
    	};
    	if(retry>=240)return 1;	    
    	return 0;
    }
    
    //从DS18B20读取一位
    //返回1/0
    u8 DS18B20_Read_Bit(void) 	 
    {
        u8 data;
    	DS18B20_IO_OUT();	//SET PG11 OUTPUT
        DS18B20_DQ_OUT=0; 
    	delay_us(2);
        DS18B20_DQ_OUT=1; 
    	DS18B20_IO_IN();	//SET PG11 INPUT
    	delay_us(12);
    	if(DS18B20_DQ_IN)data=1;
        else data=0;	 
        delay_us(50);           
        return data;
    }
    
    //从DS18B20读取一个字节
    u8 DS18B20_Read_Byte(void)     
    {        
        u8 i,j,dat;
        dat=0;
    	for (i=1;i<=8;i++) 
    	{
            j=DS18B20_Read_Bit();
            dat=(j<<7)|(dat>>1);
        }						    
        return dat;
    }
    
    //写一个字节到DS18B20
    void DS18B20_Write_Byte(u8 dat)     
     {             
        u8 j;
        u8 testb;
    	DS18B20_IO_OUT();	//SET PG11 OUTPUT;
        for (j=1;j<=8;j++) 
    	{
            testb=dat&0x01;
            dat=dat>>1;
            if (testb) 
            {
                DS18B20_DQ_OUT=0;	// Write 1
                delay_us(2);                            
                DS18B20_DQ_OUT=1;
                delay_us(60);             
            }
            else 
            {
                DS18B20_DQ_OUT=0;	// Write 0
                delay_us(60);             
                DS18B20_DQ_OUT=1;
                delay_us(2);                          
            }
        }
    }
    
    //开始温度转换
    void DS18B20_Start(void) 
    {   						               
        DS18B20_Rst();	   
    	DS18B20_Check();	 
        DS18B20_Write_Byte(0xcc);	// skip rom
        DS18B20_Write_Byte(0x44);	// convert
    } 
    
    //初始化DS18B20的DQ 同时检测DS18B20的存在
    //返回1:不存在
    //返回0:存在   	 
    u8 DS18B20_Init(void)
    {
     	GPIO_InitTypeDef  GPIO_InitStructure;
     	
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    	
     	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;		
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  
     	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     	GPIO_Init(GPIOC, &GPIO_InitStructure);
    
     	GPIO_SetBits(GPIOC,GPIO_Pin_10);    //拉高
    
    	DS18B20_Rst();
    
    	return DS18B20_Check();
    }  
    
    //从ds18b20得到温度值
    //精度0.1C
    short DS18B20_Get_Temp(void)
    {
        u8 temp;
        u8 TL,TH;
    	short tem;
        DS18B20_Start ();  			// ds1820 start convert
        DS18B20_Rst();
        DS18B20_Check();	 
        DS18B20_Write_Byte(0xcc);	// skip rom
        DS18B20_Write_Byte(0xbe);	// convert	    
        TL=DS18B20_Read_Byte(); 	// LSB 
        TH=DS18B20_Read_Byte(); 	// MSB  
    		USART_SendData(USART1, TL);
    		delay_ms(10);
    		USART_SendData(USART1, TH);
    	   	  
        if(TH>7)
        {
            TH=~TH;
            TL=~TL; 
            temp=0;					//温度为负
        }else temp=1;				//温度为正  	  
        tem=TH; 					
        tem<<=8;    
        tem+=TL;					
        tem=(float)tem*0.625;		
    	if(temp)return tem; 	
    	else return -tem;    
    }
    
    

    然后这里是51单片机的程序

    这里我用的是12M晶振,延时程序如下

    /*us延时,参数为1时约延时7us
    			  10时约延时50us
    			 100时约延时205us
    			 250时约延时480us	
    */
    void delay(uchar us) {
    	while(us--);
    }
    

    然后下面就是对DQ信号线操作的程序

    //复位ds18b20
    void Init_ds18b20(void) {
    	DQ = 1; 
    	delay(1); 
    	DQ = 0; 
    	delay(250); 
    	DQ = 1; 
    	delay(100);
    }
    
    //读一个字节
    uchar ReadoneByte() {
    	uchar i;
    	uchar dat = 0;
    	for(i=8; i>0; i--) {
    		DQ = 0;
    		_nop_();
    		dat >>= 1;
    		DQ = 1;
    		delay(1);
    		if(DQ) dat |= 0x80;
    		delay(10);
    	}
    	return dat;
    }
    
    //写一个字节
    void WriteoneByte(uchar dat) {
    	uchar i;
    	for(i=8; i>0; i--) {
    		DQ = 0;
    		_nop_();
    		DQ = dat & 0x01;
    		delay(10);
    		DQ = 1;
    		dat >>= 1;
    		delay(1);
    	}
    }
    
    //获取温度值
    int GetTempe() {
    	int temp;
    	uchar teml, temh;
    	Init_ds18b20();
    	WriteoneByte(0xcc);
    	WriteoneByte(0x44);
    	Init_ds18b20();
    	WriteoneByte(0xcc);
    	WriteoneByte(0xbe);
    	teml = ReadoneByte();//先读低四位
    	temh = ReadoneByte();//再读高四位
    	
    	temp = teml/16+temh*16;//这里只保留了整数,去掉了小数
    	//temp <<= 8;
    	//temp += teml;
    	//t = temp * 0.625;
    	return temp;
    }
    
    
    展开全文
  • 51单片机DS18B20温度传感器驱动,仅有.h文件,无.c文件。 /************************************************************************************* ************** ******************************************...
  • DS18B20 (by 51单片机

    2018-04-30 18:50:35
    依旧是接着蓝桥杯的机会来学习一下DS18B20和单总线技术,平台依旧是IAP15F2K61S2单片机DS18B20单线数字温度计以9位数字量的形式反映器件的温度值,DS18B20通过一个单线接口发送或者接受信息,因此在中央微处理器和DS...
  • DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。单总线,意味着没有时钟线,只有一根通信线。单总线读写数据是靠控制起始时间和采样时间来完成...
  • 2. 每个DS18B20都有唯一的64为序列号储存在板载ROM(只读存储器)中; 3. 无需外部器件 4. 电源范围3.0V~5.5V 5. 可以测量的范围是-55℃~+125℃(摄氏度); 6. 在-10~+85℃范围内精确度为±0.5℃; 7. 温度...
  • 51单片机——DS18B20

    2016-04-21 11:57:54
    单片机——DS18B20 宗旨:技术的学习是有限的,分享的精神是无限的。  DS18B20——温度传感器,单片机可以通过 1-Wire 和 DS18B20 进行通 信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 ...
  • DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,...
  • DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器。与传统的热敏电阻相比,他能够直接读出被测温度并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。可以分别在93.75 ms...
  • 一篇基于DS18B20的温度控制系统的论文,MUC是STC89C51,文中包括一些代码以及整个系统的架构
  • 51单片机DS18B20

    2020-03-10 16:07:15
    对于新手而言, DS18B20基本概念仅做了解,最重要的是利用单片机DS18B20进行编程,读取温度信息,并把读取到的温度信息利用数码管,LCD1602或者上位机进行显示 初识DS18B20 DS18B20是常用的数字温度传感器,其输出的是...
  • DS18B20数字温度传感器提供9-Bit到12-Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能。DS18B20采用的1-Wire通信即仅采用一个数据线(以及地)与微控制器进行通信,采集数据的...
  • 含有原理图和PCB带有源程序代码,可同时检测四路温度,用数码管显示!
  • 51单片机复习:DS18B20

    2019-04-08 21:00:01
    DS18B20温度传感器:(初始化,写字节,读字节,发送温度转换命令,发送读取温度命令,读取温度) 1.一些注意点: .适应电压范围更宽,电压范围:3.0~5.5V .测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ ....
  • 首先我们看一下ds18b20的结构图: 通过结构图,我们大致能了解一些DS18B20的内部结构,重点是我们要知道,他是如何测温度的,以及温度是怎么计算为我们想要的值的。 ds18b20采用的是单总线结构,我们...
  • 用51单片机读取DS18B20的温度数据,并在1602上面显示,包含完整工程和proteus仿真
  • (1)DS18B20初步认识DS18B20是美国DALLAS半导体公司推出的一种数字化单总线器件,属于新一代适配微处理器的改进型智能温度传感器。我们先来看看DS18B20在芯片手册上的标题——“DS18B20 Programmable Resolution 1-...
1 2 3 4 5 ... 20
收藏数 2,242
精华内容 896