精华内容
下载资源
问答
  • msp430编写的ds18b20温度传感器与计算机串口通信
  • DS18B20温度传感器

    2019-05-05 10:15:28
    //获取温度值并减去DS18B20的温漂误差 if(f)f=0; if(f>999)f=999; bai=f/100; //计算得到十位数字 shi=(f0)/10; //计算得到个位数字 ge=(f0); //计算得到整数位 } /*****显示开机初始化等待画面*****/ void Disp_...
  • 51单片机~DS18B20温度传感器 (一)简介说明: (二)接线: 1. 内部结构: 正温度前五位是0. 负温度前五位是1. 由LS,MS组成的四位十六进制数,和16位二进制数。(先MS后LS) 结合上下图直到温度计算:1乘2 ...

    51单片机~DS18B20温度传感器

    (一)简介说明:
    在这里插入图片描述
    在这里插入图片描述
    (二)接线:

    在这里插入图片描述
    1. 内部结构:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    正温度前五位是0.
    负温度前五位是1.

    在这里插入图片描述
    由LS,MS组成的四位十六进制数,和16位二进制数。(先MS后LS)
    结合上下图直到温度计算:1乘2 ^ 6 + 0乘2 ^ 5 +1乘2^ 4 +0乘2^ 3 +……2^0 ==85
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    (二)使用流程,按照时序图编写程序(判断应用):
    粗黑线是总线控制的电平
    灰线表示DS18B20控制的;
    电阻上拉是由于上图接线有一个上拉电阻

    在这里插入图片描述
    读时重复七次直到读完为止

    在这里插入图片描述
    在这里插入图片描述
    测试温度代码:
    temp.h

    #ifndef __TEMP_H_
    #define __TEMP_H_
    
    #include<reg52.h>
    //---重定义关键词---//
    #ifndef uchar
    #define uchar unsigned char
    #endif
    
    #ifndef uint 
    #define uint unsigned int
    #endif
    
    //--定义使用的IO口--//
    sbit DSPORT=P3^7;
    
    //--声明全局函数--//
    void Delay1ms(uint );
    uchar Ds18b20Init();
    void Ds18b20WriteByte(uchar com);
    uchar Ds18b20ReadByte();
    void  Ds18b20ChangTemp();
    void  Ds18b20ReadTempCom();
    int Ds18b20ReadTemp();
    
    #endif
    
    

    main.c

    /*************************************************************************************
    
    *
    实验现象:下载程序后,在温度传感器接口处,按照丝印方向插好温度传感器,数码管就会显示
    			检测的温度值
    		  
    接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
    		 
    	
    注意事项:										
    
    										  
    **************************************************************************************
    
    */
    
    #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 DisplayData[8];
    u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
    
    /*******************************************************************************
    * 函 数 名         : delay
    * 函数功能		   : 延时函数,i=1时,大约延时10us
    *******************************************************************************/
    void delay(u16 i)
    {
    	while(i--);	
    }
    
    
    /*******************************************************************************
    * 函 数 名         : datapros()
    * 函数功能		   : 温度读取处理转换函数
    * 输    入         : temp
    * 输    出         : 无
    *******************************************************************************/
    
    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];
    
    }
    
    
    /*******************************************************************************
    * 函数名         :DigDisplay()
    * 函数功能		 :数码管显示函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    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;//消隐
    	}		
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	while(1)
    	{
    		datapros(Ds18b20ReadTemp());	 //数据处理函数
    		DigDisplay();//数码管显示函数		
    	}		
    }
    

    temp.c

    #include"temp.h"
    /*******************************************************************************
    * 函 数 名         : Delay1ms
    * 函数功能		   : 延时函数
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    
    void Delay1ms(uint y)
    {
    	uint x;
    	for( ; y>0; y--)
    	{
    		for(x=110; x>0; x--);
    	}
    }
    /*******************************************************************************
    * 函 数 名         : Ds18b20Init
    * 函数功能		   : 初始化
    * 输    入         : 无
    * 输    出         : 初始化成功返回1,失败返回0
    *******************************************************************************/
    
    uchar Ds18b20Init()
    {
    	uchar i;
    	DSPORT = 0;			 //将总线拉低480us~960us
    	i = 70;	
    	while(i--);//延时642us
    	DSPORT = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
    	i = 0;
    	while(DSPORT)	//等待DS18B20拉低总线
    	{
    		Delay1ms(1);
    		i++;
    		if(i>5)//等待>5MS
    		{
    			return 0;//初始化失败
    		}
    	
    	}
    	return 1;//初始化成功
    }
    
    /*******************************************************************************
    * 函 数 名         : Ds18b20WriteByte
    * 函数功能		   : 向18B20写入一个字节
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    
    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;
    	}
    }
    /*******************************************************************************
    * 函 数 名         : Ds18b20ReadByte
    * 函数功能		   : 读取一个字节
    * 输    入         : 无
    * 输    出         : 无
    *******************************************************************************/
    
    
    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;
    }
    /*******************************************************************************
    * 函 数 名         : 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;  //将低八位组合  0000 0000 | tel=tel; 从而使高低八位结合
    	return temp;
    }
    
    展开全文
  • 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;
    
    }
    
    
    展开全文
  • 【蓝桥杯】—{模块}—{DS18B20温度传感器Part_2}一、初始化1、初始化时序图: 2、相关延时时间的计算: 3、官方底层驱动代码: 4、Template: 二、写时序/读时序1、读/写时序图: 3、官方底层驱动代码: 4、Template...

       九层妖塔 起于垒土
    在这里插入图片描述

    一、初始化

    1、初始化时序图:

    在这里插入图片描述

    2、相关延时时间的计算:

    AB:主机下拉500us发送存在脉冲。
    B:主机释放总线并进入接收模式(RX)。释放总线即DQ=1
    BC:DS18B20等待时间。15us<BC<60us
    CD:DS18B20发送存在脉冲。60us<CD<240us
    T:主机读取DQ数据线电平状态时刻。
    BTBCmaxBC_{max}<BTBT<BCminBC_{min}+CDminCD_{min} ,即60us<BTBT<75us,BTBT取65us
    TE:取500us

    3、官方底层驱动代码:

    //DS18B20初始化
    bit init_ds18b20(void)
    {
      	bit initflag = 0;
      	
      	DQ = 1;
      	Delay_OneWire(12);
      	DQ = 0;
    
      	Delay_OneWire(80); // 延时大于480us
      	DQ = 1;
      	Delay_OneWire(10);  // 14
      	initflag = DQ;     // initflag等于1初始化失败
      	Delay_OneWire(5);
      
      	return initflag;
    }
    

    4、Template:

    bit DS18B20_Init(void)
    {
      	bit presence = 0; //返回值,DS18B20返回存在脉冲为1
      	
      	DQ = 1;         //为主机拉低总线做准备
        Delay5us();     //稍加延时使总线电平稳定
    	DQ = 0;         //主机下拉500us,发送存在脉冲
        Delay500us();
      	DQ = 1;       //主机释放单总线
    	Delay65us();  //等待DS18B20
      	presence = !DQ; 
        Delay500us(); //保持时序完整
    	
      	return presence;
    }
    

    5、Notes:

     ●按照官方底层驱动所要求的12MHz,Debug了多次,例程延时所测偏离正常。
     ●presence = !DQ;存在presence为1即真。
     ●函数名DS18B20_Init便于在Functions栏中快速查找。

    二、写时序/读时序

    1、读/写时序图:

    在这里插入图片描述

    3、官方底层驱动代码:

    //通过单总线向DS18B20写一个字节
    void Write_DS18B20(unsigned char dat)
    {
    	unsigned char i;
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		DQ = dat&0x01;
    		Delay_OneWire(5);
    		DQ = 1;
    		dat >>= 1;
    	}
    	Delay_OneWire(5);
    
    }
    
    //从DS18B20读取一个字节
    unsigned char Read_DS18B20(void)
    {
    	unsigned char i;
    	unsigned char dat;
    //	unsigned char index = 0;
      	   	
    	for(i=0;i<8;i++)
    	{
    		DQ = 0;
    		dat >>= 1;
    		DQ = 1; 
    	   	Delay_us();
    
    		if(DQ)  
    		{
    			dat |= 0x80;
    		}	    
    		Delay_OneWire(5);
    	}
    	return dat;
    }
    

    4、Template:

    //---------------------------------------向DS18B20写一个字节-------------------------//
    void DS18B20_Write(uchar dat)
    {
    	uchar i;
    	for(i=0;i<8;i++)
    	{
    		DQ=0;        //下拉
    		DQ=dat&0X01; //写入一位数据
    		Delay65us(); //保持时序完整
    		DQ=1;        //释放总线
    		dat >>=1;
    	}
    	Delay65us();  //保持时序完整
    }
    //--------------------------------------从DS18B20读一个字节----------------------------//
    uchar DS18B20_Read(void)
    {
    	uchar i;
    	uchar dat=0;
    	for(i=0;i<8;i++)
    	{
    		DQ=0;       //主机拉低总线
    		dat >>=1;   //右移兼延时,第一次移位无效
    		DQ=1;       //释放总线
    		Delay5us();//稍加延时使总线电平稳定
    		if(DQ==1)
    		{
    			dat |=0X80;
    		}
    		Delay65us();//保持时序完整
    	}
    	return dat;
    }
    
    

    5、Notes:

     ●读时序中将返回值uchar dat=0;

    ○在函数调用时对自动变量赋初值,每调用一次函数重新给一次初值。
    ○若在定义时不赋初值,自动变量的初值不确定。每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的内容是不可知的。

     ●读时序中Delay5us();//稍加延时使总线电平稳定。释放总线后,若读到的是1,则DQ线会被上拉电阻拉高,从0到1需要跨过阈值需要一段时间。按照芯片手册要求尽量在15us后端取检测。

    三、DS18B20温度采集函数

    1、Template:

    //-------------------------------------DS18B20温度采集函数---------------------------//
    uint DS18B20_get_Temperature(void)
    {
    	uint low,high;
    	uint Temp=0;
    	DS18B20_Init();      //初始化
    	DS18B20_Write(0XCC); //跳过ROM
    	DS18B20_Write(0X44); //转换温度
    		
    	DS18B20_Init();      //初始化
    	DS18B20_Write(0XCC); //跳过ROM
    	DS18B20_Write(0XBE); //读暂存器
    	low = DS18B20_Read(); //低字节,16位温度低8位,Byte 0
    	high = DS18B20_Read();//高字节,16位温度高8位, Byte 1
    	
    	Temp = (high<<8)+(low&0X00FF);
    	return Temp;
    }
    

    2、Notes:

     ●uint low,high;官方例程中将其定义为uchar,并且也进行了high<<8操作,若使用uchar在调用子函数之初就开辟了8位的内存地址,再进行左移,感觉会数据溢出。但是调试时并没有发生错误。
     ●uint Temp=0;low&0X00FF
     ●返回值Temp为16位无符号整型。
     ●12位分辨率的精度位0.0625,最大转换时间为750ms。写入DS18B20_Write(0X44); //转换温度开始温度转换后,就由DS18B20的相关硬件部分去执行温度转换,转换完成后存放在暂存器的低两位字节中;若不进行初始化直接读取时序,如果DS18B20正在温度转换过程中则返回0来响应,若转换完成则返回1。主机可以对DS18B20进行其他操作,由DS18B20的其他硬件部分响应;主机若对DS18B20进行其他操作,必须由初始化开始。
     在执行第二个初始化时,转换温度的命令已经写入DS18B20,虽然温度还未转换完成,但是单总线已经空闲,可以继续执行下边几乎不耗时的读暂存器命令。所以在上电之初,会出现短暂的85初始值。

    四、DS18B20温度数码管段码转换函数

    1、Template:

    //-------------------------------------DS18B20温度数码管段码转换函数------------------------//
    void DS18B20_SEG(uint Temp)
    {
    		yi=20;                          //符号位
    	    er=(Temp>>4)/100;               //百位
    		san=((Temp>>4)%100)/10;         //十位
    		si=((Temp>>4)%10)+10;           //个位
    		wu=((Temp&=0X000F)*625)/1000;   //小数点后一位
    		liu=((Temp&=0X000F)*625)/100%10;//小数点后两位
    		qi=((Temp&=0X000F)*625)/10%10;  //小数点后三位
    		ba=((Temp&=0X000F)*625)%10;     //小数点后四位
    }
    

    2、Notes:

     ●第一位为符号位,现写入全灭,可以通过判断Temp高四位确认正负。
     ●整数部分,加符号位共八位,可测温范围:-128~+127 。整数部分以(Temp>>4)为整体进行操作。虽然从暂存器读到的Tenp为16位二进制无符号整数,进行取余、除法运算时,右端的数为十进制,对于单片机(计算机)统一转换为二进制进行运算,同样在用户端为了便于理解可以理解为都是十进制
     ●小数部分以((Temp&=0X000F)*625)为整体进行操作。(Temp&=0X000F)的四位有效数值为的权值依次为232^3,222^2,212^1,202^0,若为二进制小数,小数点后四位小数权值依次为212^{-1},222^{-2},232^{-3},242^{-4},所以将(Temp&=0X000F)乘以242^{-4}即0.0625,((Temp&=0X000F)*0.0625)即为小数点后四位(最多表示4位小数)。为了避免浮点数运算,可将十进制小数((Temp&=0X000F)*0.0625)扩大一万倍,即将十进制小数点左移四位,即为((Temp&=0X000F)*625)
     ●对小数部分,尝试了右移4位来代替除法运算,可是在这儿,数值却移出去了。最后一位出现了0,5以外的值。
     ●12位分辨率的精度位0.0625,所以数码管最后一位一定为0或5。
     ●若要求不显示四位小数,通过除法和求余的方法是将不显示的部分直接抹掉;若采用prinftsprinft指定小数位数输出,可以实现四舍五入。

    五、主函数

    uint Temp;  //DS18B20温度值,16位
    uchar SEG_Array[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,       //数字0~9无点,索引值0~9
    	                   0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,     //数字0~9有点,索引值(0~9)+10
    	                   0XFF,   //灭灯,索引值20
    					   0X86,   //字母大写E,索引值21
    	                   0XC8,   //字母小写n,索引值22
    					   0XBF    //中间一横,索引值23
    };
    void main(void)
    {
    	All_Init();  //开发板初始化
    
    	while(1)
    	{
            Temp=DS18B20_get_Temperature();  //温度采集
    		DS18B20_SEG(Temp);         //将16位Temp转换为段码
    
    		SEG_1_2(yi,er);
    		SEG_3_4(san,si);
    		SEG_5_6(wu,liu);
    		SEG_7_8(qi,ba);
    		SEG_Init();
    	}
    }
    

    补:

    • 不同类型间数值的运算。
    • prinftsprinft的具体使用。
    • 将相对独立的模块化程序使用头文件和从c文件的形式在主c文件中调用。
    • Debug的具体使用规则。
    展开全文
  • STM32单片机(11) DS18B20温度传感器实验

    千次阅读 2014-08-12 00:45:02
    本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机

    【转载请注明出处:http://blog.csdn.net/leytton/article/details/38504319

    本程序主要实现 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温度传感器
    * 
    *******************************************************************************/
    #include "stm32f10x.h"
    #include <stdio.h>
    #include "delay.h"
    #include "ds18b20.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);
    }
    

    DS18B20.h

    #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 "ds18b20.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();     //拉高,释放总线
    		  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;
    
    }
    


    展开全文
  • 51单片机之DS18B20温度传感器实验

    千次阅读 2020-05-23 13:31:13
    一、 DS18B20 介绍 1、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃。 2、可编程的分辨率为 9~12 位,对应的可分辨温度分别为 0.5℃、0.25℃、 0.125℃ 和 0.0625℃,可实现高精度测温 比如我们要计算+85 ...
  • 基于超声波测距的倒车报警系统。 计划通过超声波传感器测距,温度传感器校正误差,lcd1602显示结果,距离...利用温度传感器DS18B20测量温度并修正当前的声速。 LCD1602液晶模块为显示装置,单片机计算完成后输送信...
  • 1. DS18B20简介 温度传感器的最高精度为0.0625℃。温度值被保存在暂存寄存器的第0和1字节。第1字节的高5为用来表示温度的正负,当为1时为负值,当为0时为正值。 温度传感器的测量范围为:-5~125℃   2. 温度...
  • 基于18B20温度传感器的设计文档多功能数字钟的系统采用AT89C51单片机作为控制系统的核心,模型采用单片机作为主控制器,利用DSl302时钟芯片计算当前的秒、分、时、日、月、年。通过1602液晶屏友好的人机界面将结果...
  • 介绍了一种基于DS18B20的数字温度计设计方案。方案利用AT89S52单片机控制DS18B20进行数据采集并由HS1602液晶显示模块显示结果,另外,采集结果可由RS-232-C接口送入计算机显示并存储。按键控制实现过界报警温度设定...
  • 温度传感器是各种传感器中最常用的一种,早期使用的是模拟温度传感器,如热敏电阻,随着环境温度的变化,它的阻值也发生线性变化,用处理器采集电阻两端的电压,然后根据某个公式就可以计算出当前环境温度。
  • 1.利用DS18B20 温度传感器采集温度; 2.制作一个基于STC89C52 单片机的温度采集系统,并将采集信息数据通过NRF24L01无线传输模块传送给计算机,利用计算机对其进行实时显示、存储,以便进行数据分析。 【资源下载...
  • DS18B20被称为是数字温度传感器,也就是说它能够将外部温度转换为数字量(0和1)并存储在DS18B20中的某个存储器中。 那么引申出两个问题。第一存放在哪个存储器中?第二如何读取DS18B20的数据? 一、存储以及计算...
  • 所有的树莓派ds18b20传感器温度相关信息都在/sys/bus/devices/28-xxxx路径下,我们编程只需在/sys/bus/devices/路径下找到28-开头的文件夹, 打开即可看到w1_slave文件,打开文件可看到以下内容。 其中crc=0a YES ...
  • DS18B20 的CRC 算法详解

    2020-08-03 10:44:00
    本文主要介绍的是DS18B20温度传感器中CRC的计算方法。
  • 基于ARM和DS18B20的温度监测系统使用SAMSUNG公司的32位ARM微控制器S3C2440作为数据采集单元, 数字温度传感器DS18B20作为温度检测元件。给出了系统的总体设计方案、硬件设计及软件框图。对测得的数据采用防脉冲干扰...
  • 读取温度。 二、原理分析 数码管是如何点亮的? 我们可以将数码管看成8个LED灯组合成的,8个LED灯的不同组合就形成了数字或字母。数码管和LED灯一样分为共阴极和共阳极,如上图所示。 若共阳极数码管,当对应I/O口...
  • DS18B20读取温度驱动--基于stm32f10xDS18B20简述封装硬件架构和你的开发板连接同DS18B20通信的方法计算温度转换时间1-Wire总线协议设备的初始化...DS18B20是一个种低成本的数字温度传感器芯片使用1-wire总线协议, 转
  •  本制作采用USB口作为供电端口,用DS18B20温度传感器进行温度信息采集,用AT89C2051单片机进行控制,采用四位共阳数码管显示,从而实现对温度的测量显示(系统框图如图1所示)。本设计可培养学生对单片机学习的兴趣...
  • 蓝桥杯单片机DS18B20程序,用蓝桥杯给的单总线驱动,读取DS18B20传感器温度数据,在用单片机计算温度值,非常的银杏,非常的好用!
  • 由895X系列单片机来控制来驱动18b20温度传感器模块,通过编写C语言代码,来实现对模块的控制驱动,不断的接收读取18b20传过来的温度信号。将传过来的高低位字节经过个人代码的处理计算转换成10进制数,来显示到LCD中...
  •  本制作采用USB口作为供电端口,用DS18B20温度传感器进行温度信息采集,用AT89C2051单片机进行控制,采用四位共阳数码管显示,从而实现对温度的测量显示(系统框图如图1所示)。本设计可培养学生对单片机学习的兴趣...
  • 由于传感器能将各种物理量、化学量和生物量等信号转变为电信号,使得人们可以利用计算机实现自动测量、信息处理和自动控制,...温度传感器是其中重要的一类传感器。其发展速度之快,以及其应用之广,并且还有很大潜力。
  • 关于ds18b20程序

    2009-05-05 18:01:55
    DS18B20温度传感器 * * C51 * * yajou 2008-06-28 无CRC * ********************************************************/ #include "reg51.h" #include "intrins.h" #include "DS18B20.h" /**********************...
  • 本次的设计主要是利用了数字温度传感器DS18B20测量温度信号,计算后可以在LCD数码管上显示相应的温度值。其温度测量范围为-55~125C,精确到0.5C。 二、实验内容 本温度计属于多功能温度计,可以设置上下报警温度,...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 122
精华内容 48
关键字:

ds18b20温度传感器温度计算