精华内容
下载资源
问答
  • 整个系统通过单片机MSP430F1121A控制DS18B20读取温度,采用数码管显示,温度传感器DS18B20与单片机之间通过串口进行数据传输。MSP430系列单片机具有超低功耗,且外围整合性高,DS18B20只需一个端口即可实现数据...
  • 引言  在工业、农业和医疗领域,温控系统有着... 因此,本文研究了一种方法,解决了单片机与DS18B20结合测温系统数字传感器更换问题,系统结合了软件编程硬件设计。在提出解决方案中,数据采集模块采用低功
  • 简单描述 (1)DS18B20采用单线接口,它微处理器连接时仅仅需要一条口线即可实现微处理器与DS18B20的双向通信。 (2)引脚 ...从此我们可以看出DS18B20单片机的连接十分的简单,单片机用一个 ...

    一. 简单描述

    (1)DS18B20采用单线接口,它与微处理器连接时仅仅需要一条口线即可实现微处理器与DS18B20的双向通信。
    (2)引脚

    引脚 定义
    GND 接地
    VDD 电源正极
    DQ 信号的输入输出

    从此我们可以看出DS18B20和单片机的连接十分的简单,单片机用一个IO口即可以控制DS18B20
    (3)这个小测温程序中需要用到的指令

    CCH-跳过ROM。忽略64位ROM(每一个DS18B20都有一个独特的64位光刻ROM,此程序中我们仅仅使用一个DS18B20),直接向18B20**发送温度转换命令**
    44H-启动温度转换。
    0xBE-读取温度数据
    

    二. 测温程序编写

    我们在编写程序的时候一定要有模块化的思想,把复杂问题简单化,而且这种方法编写出的代码“可移植行比较强”,遇到类似项目时我们只需重新组装,稍加修改即可。
    (1.)初始化

    	uchar i;
    	DSPORT = 0;			 //对应DQ管脚,我这个单片机对应P3^7.
    	i = 70;	
    	while(i--);//延时642us
    	DSPORT = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低,s说明初始化成功
    	i = 0;
    	while(DSPORT)	//等待DS18B20拉低总线
    	{
    		Delay1ms(1);
    		i++;
    		if(i>5)//等待>5MS
    		{
    			return 0;//初始化失败
    		}
    	
    	}
    	return 1;//初始化成功
    

    (2)写入数据

    
    {
    	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;
    	}
    }
    

    (3.)读入一个字节数据

    	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;
    

    (4.)启动温度转换

    初始化函数
    写入函数(0xcc//跳过ROM指令
    写入(0x44//启动温度转换命令
    

    (5)读取温度数据

    初始化函数
    写入(0xcc//跳过ROm指令
    写入(0xbe//读取温度数据指令
    

    (6.)得到16位温度数据

    	int temp = 0;
    	uchar tmh, tml;
    	Ds18b20ChangTemp();			 	//先写入转换命令
    	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
    	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
    	tmh = Ds18b20ReadByte();		//再读高字节
    	temp = tmh;
    	temp <<= 8;
    	temp |= tml;
    	return temp;
    

    好了到此我们已经使用使用DS18B20得到了温度的数据,此时温度以16位的形式存放在RAM中,要利用这组数据得到正确的温度我们需要:
    如果这个数据是负数,这个数据需要取反加一
    0.0625
    若为整数,我们仅仅需要0.0625即可得到所要的温度
    之后我们仅仅需要利用数码管显示数据即可

    8位动态数码管显示函数

    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;//消隐
    	}		
    }
    

    ok 到此简单的测温程序已经写出了。

    展开全文
  • 目录DS18B20简介外部结构内部结构数据温度读取实验程序实现附 DS18B20简介 DS18B20 是由 DALLAS ...2、独特单线接口方式,DS18B20微处理器连接时仅需要一条口线即可实现微处理器 DS18B20 双向通讯。 3、D

    DS18B20简介

    DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。

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

    从 DS18B20 外观图可以看到,当我们正对传感器切面(传感器型号字符那一面)时,传感器的管脚顺序是从左到右排列。管脚 1 为 GND,管脚 2 为数据DQ,管脚 3 为 VDD。
    如果把传感器插反,那么电源将短路,传感器就会发烫,很容易损坏,所以一定要注意传感器方向。

    内部结构
    • 内部结构图
      在这里插入图片描述

    ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列号。光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目的。
    DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易失性的可电擦除的 EEPROM,后者存放高温度和低温度触发器 TH、TL 和配置寄存器。

    • 配置寄存器
      结构:
      在这里插入图片描述

    配置寄存器是配置不同的位数来确定温度和数字的转化,低五位一直都是"1",TM 是测试模式位,用于设置 DS18B20 在工作模式还是在测试模式。在 DS18B20 出厂时该位被设置为 0,用户不需要去改动。R1 和
    R0 用来设置 DS18B20 的精度(分辨率),可设置为 9,10,11 或 12 位,对应的分辨率温度是 0.5℃,0.25℃,0.125℃和 0.0625℃。在初始状态下默认的精度是 12 位,即 R0=1、 R1=1。
    R0 和 R1 配置如图:
    在这里插入图片描述

    • 高速暂存存储器
      高速暂存存储器由 9个字节组成,其分配如下:
      在这里插入图片描述

    当温度转换命令(44H)发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第 0 和第 1 个字节。
    在这里插入图片描述

    如图,存储的两个字节,一个字节8位共16位,高字节的前 5 位是符号位 S,单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
    如果测得的温度大于 0,这 5 位为‘ 0’,只要将测到的数值乘以 0.0625(默认精度是 12 位)即可得到实际温度;如果温度小于 0,这 5 位为‘ 1’,测到的数值需要取反加 1 再乘以 0.0625 即可得到实际温度。
    举个例子:
    在这里插入图片描述
    以85度为例,温度大于0,所以看到两个字节的前5位为0,然后二进制转十进制:26+24+22+20=85.
    数据输出十六进制是 0X0550,因为高字节的高 5位为 0,表明检测的温度是正温度,0X0550 对应的十进制为 1360,将这个值乘以 12 位精度 0.0625,所以可以得到+85 度

    数据温度的读取
    • 由于DS18B20 是单总线器件,所有的单总线器件都要求采用严格的信号时序,以保证
      数据的完整性。
      DS18B20 时序包括如下几种:初始化时序、写(0 和 1)时序、读(0 和 1)时序。 DS18B20 发送所有的命令和数据都是字节的低位在前。
    • 初始化时序:
      在这里插入图片描述

    单总线上的所有通信都是以初始化时序开始。主机输出低电平,保持低电平时间至少 480us(该时间的时间范围可以从 480 到 960 微妙),以产生复位脉冲。接着主机释放总线,外部的上拉电阻将单总线拉高(外部上来电阻接高电平),延时 15~60 us,并进入接收模式。接着 DS18B20 拉低总线 60~240 us,以产生低电平应答脉冲,若为低电平,还要做延时,其延时的时间从外部上拉电阻将单总线拉高算起最少要480 微妙。

    • 写时序
      在这里插入图片描述

    写时序包括写 0 时序和写 1 时序。所有写时序至少需要 60us,且在 2 次独立的写时序之间至少需要 1us 的恢复时间,两种写时序均起始于主机拉低总线。写 1 时序:主机输出低电平,延时 2us,然后释放总线,延时 60us。写 0时序:主机输出低电平,延时 60us,然后释放总线,延时 2us。

    • 读时序
      在这里插入图片描述

    单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要 60us,且在 2 次独立的读时序之间至少需要 1us 的恢复时间。每个读时序都由主机发起,至少拉低总线 1us。主机在读时序期间必须释放总线,并且在时序起始后的 15us 之内采样总线状态。

    • 温度读取过程
      DS18B20 的典型温度读取过程为:复位→发 SKIP ROM 命令(0XCC)→发开始转换命令(0X44)→延时→复位→发送 SKIP ROM 命令(0XCC)→发读存储器命令(0XBE)→连续读出两个字节数据(即温度)→结束。
    实验
    • 实现功能
      系统运行时,插上 DS18B20 温度传感器,数码管显示检测的温度值。
    • 实现原理
      动态数码管显示原理
      (查看动态数码管显示原理笔记)
      DS18B20温度读取原理
      原理图:
      在这里插入图片描述
    程序实现

    第一部分

    • 头文件
    #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
    

    第二部分

    • 传感器温度读取过程
      (1)初始化时序
      在这里插入图片描述

    如图,先将总线拉高,延时后,DS18B20做出相应将总线拉低,则初始化完成。

    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;//若为低电平,直接跳过while循环初始化成功
    }
    

    (2)写时序
    在这里插入图片描述

    void Ds18b20WriteByte(uchar dat)
    {
    	uint i, j;
    
    	for(j=0; j<8; j++)//8位数据
    	{
    		DSPORT = 0;	     	  //每写入一位数据之前先把总线拉低1us
    		i++;
    		DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始。位运算的与运算,只要数据中有0,则相与后为0,只有为1相与为1
    		i=6;//延时初值
    		while(i--); //延时68us,因为持续时间最少60us
    		DSPORT = 1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
    		dat >>= 1; //移位,从低位向高位写入数据,所以,最低为写入后,向右移,原来的次低位代替原来的低位。
    	}
    }
    

    (3)读时序
    在这里插入图片描述

    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);	 //先将byte右移1位,然后bi左移7位,相或得到数据					  
    		i = 4;		//读取完之后等待48us再接着读取下一个数
    		while(i--);
    	}				
    	return byte;
    }
    
    • 指令操作
      RAM指令表
      在这里插入图片描述

    ROM指令表
    在这里插入图片描述

    (1)转换温度启动指令

    void  Ds18b20ChangTemp() 
    {
    	Ds18b20Init(); //初始化
    	Delay1ms(1);  //延时
    	Ds18b20WriteByte(0xcc);		//写入跳过ROM操作命令(cc)		 
    	Ds18b20WriteByte(0x44);	    //温度转换命令(44)
    	//Delay1ms(100);	//等待转换成功,而如果你是一直刷着的话,就不用这个延时了  
    }
    

    (2)读取温度命令

    void  Ds18b20ReadTempCom()
    {	
    	Ds18b20Init();
    	Delay1ms(1);
    	Ds18b20WriteByte(0xcc);	 //跳过ROM操作命令
    	Ds18b20WriteByte(0xbe);	 //发送读取温度命令
    }
    

    (3)读取温度
    在这里插入图片描述

    共16字节,先读低位再读高位

    int Ds18b20ReadTemp()
    {
    	int temp = 0;
    	uchar tmh, tml;
    	Ds18b20ChangTemp();			 	//先写入转换命令
    	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
    	tml = Ds18b20ReadByte();		//读取温度值共16位,先读低字节
    	tmh = Ds18b20ReadByte();		//再读高字节
    	temp = tmh;
    	temp <<= 8; //移位运算,高字节左移8位,变为16位的高字节
    	temp |= tml; //位运算中的或运算,组合
    	return temp;  //高8位和低8位的组合
    }
    

    第三部分

    • 主函数
    
    #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;	
    	}
    	DisplayData[1] = smgduan[temp/10000];
    	DisplayData[2] = smgduan[temp % 10000/ 1000];
    	DisplayData[3] = smgduan[temp % 10000%1000/100]|0x80;
    	DisplayData[4] = smgduan[temp % 100/10];
    	DisplayData[4] = smgduan[temp % 100%10];
    }
    
    
    /*******************************************************************************
    * 函数名         :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();//数码管显示函数		
    	}		
    }
    

    数码管显示原理
    编程讲解

    展开全文
  • 二、实验目的 1.学习单总线电路接口工作原理; 2.了解DS18B20的工作原理、内部寄存器及接口时序; 与传统热敏电阻相比,他能够直接读出被测...利用DS18B20模块电路与单片机连接,构成室温数字采集与数码管显示。
  • ( 1 )采用单总线接口方式 微处理器连接时仅需要一条口线即可实现微处理器 DS18B20 双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境现场温度测量,使用方便等优点,使用户可轻松地组建传感器...
  • 一、制作目的 熟练掌握键盘、显示、DS18B20温度传感器等各个模块; 训练系统综合能力;...进行方案分析该项实践要使用到LCD1604,DS18B20,DS1302这三种元器件,并且要使用按键DS1302进行连接,从

    一、制作目的

    1. 熟练掌握键盘、显示、DS18B20温度传感器等各个模块;
    2. 训练系统综合的能力;
    3. 编写键盘、显示、DS18B20温度传感器综合程序。

    二、开发环境

    1. Keil开发环境
    2. Proteus仿真环境。

    三、制作内容用LCD、DS18B20、按键配合完成设计

    1. LCD显示,当前的室内温度及时间和日期(可使用DS1302时钟芯片);
    2. 用按键可调节日期和时间

    四、实验步骤

    1. 进行方案分析该项实践要使用到LCD1604,DS18B20,DS1302这三种元器件,并且要使用按键与DS1302进行连接,从而实现通过按键调整DS1302的日期和时间。首先应该对各个部分功能能清晰显示,显示后再对各个部分进行衔接.

    2. 搭建仿真电路图
      在这里插入图片描述
      运用了AT89C51单片机,LCD1604,DS1302时钟芯片,三个独立按键和DS18B20芯片。

    3. 构思整体设计本组选择的是用LCD显示,当前的室内温度及时间和日期(其中使用了DS1302时钟芯片),并且用按键可调节日期和时间。首先搭建LCD1604的仿真电路,测试无误后搭建DS1302时钟芯片电路,并且添加三个独立按键,经调试无误,最后搭建DS18B20温度传感器电路,在LCD1604的后两行进行显示,进而完成整体设计。

    4. 绘制流程图
      在这里插入图片描述

    5. 分模块调试
      (1)首先检测LCD1604是否能正常运行
      在这里插入图片描述
      (2)LCD1604能正常显示,接下来对DS18B20温度传感器模块进行测试,是否能准确显示改变的温度值。(这里使用-10度测试)
      在这里插入图片描述
      (3)对按键进行检测,是否能对日期产生改变,功能键功能是按一下即可改变所要调的位置。例如一开始调秒,按一下功能键即可调分,可由秒分时日月周年循环切换,其他两个独立按键一个是对当前值+1一个是对当前值-1,我们这里测试能不能调到2000年与23小时时候。
      在这里插入图片描述

    6. 综合调试能够正确显示所设定初值的DS1302时钟上的日期与时间,并且可以通过按键对日期和时间进行改变,DS18B20温度传感器也能在LCD1604上显示出当前温度值并且能够随着温度值的改变而在LCD1604上的显示改变。

    五、实验程序与分析

    1. 程序
    #include <reg51.h>#include <intrins.h>  
    //包含_nop_( )空函数指令的头文件
    #define uchar unsigned char
    #define uint unsigned int 
    sbit RS=P2^0; 	//LCD1604位变量
    sbit RW=P2^1;	//LCD1604位变量
    sbit E=P2^2; 	//LCD1604位变量 
    sbit RST=P0^0;	
    //DS1302芯片复位,1—芯片的读/写使能,0—芯片复位并被禁止读/写
    sbit SCLK=P0^1;       //DS1302芯片同步串行时钟输入
    sbit DS1302IO=P0^2;   //DS1302芯片数据输入/输出
    sbit DQ= P2^3;	//定义DS18B20端口DQ
    void lcd_initial(void);	//LCD初始化函数
    void check_busy(void); 	//检查忙标志函数
    void write_command(uchar com); 	//写命令函数
    void write_data(uchar dat);	//写数据函数
    void delay(uint);		//延时函数
    void DS1302_initial();          //DS1302初始化函数
    void DS1302Write(uchar addr,uchar dat);	 
    //对DS1302时钟写入命令,写入数据
    void DS1302Read_Time();                  
    //读取七个字节的时钟信号:秒分时日月周年
    uchar DS1302Read(uchar addr);   			 
    //对DS1302时钟写入命令,读出数据
    void xiangshi();        //将DS1302上的时钟显示在LCD1604上
    void button();		//根据按键值进行操作
    void DS18B20_init(void);//DS18B20的初始化
    uchar read_bit(void);	 //读一位
    uchar read_byte(void);	 //读一个字节
    void write_bit(uchar temp);//写一位
    void write_byte(uchar val);//写一个字节
    void read_T(void);	//读温度
    void delay5(uchar n);	//5us延时
    void convert_T();
    void display_T(void);
    uchar Read_DS1302_data[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};	 
    //DS1302秒分时日月周年读命令
    uchar Write_DS1302_ADDR[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};  
    //DS1302秒分时日月周年写命令
    uchar TIME[7]={0x00,0x00,0x12,0x05,0x02,0x02,0x20};					 
    //DS1302初值
    uchar digit=0;//功能键
    uchar temp_data_l,temp_data_h;
    uint temp_data;
    uchar code LCDData[10]= 
    {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
    uchar code ditab[16]  = 
    {0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,										 
    0x36,0x37,0x38,0x38,0x39,0x39};
    uchar code  table2[16] ="Show Tempreture:";
    uchar display[7] = {0x00,0x00,0x00,0x2e,0x00,0xdf,0x43};
    void main(void) //主函数
    {	
    lcd_initial( );	//调用对LCD初始化函数	
    DS1302_initial(); //调用对DS1302初始化函数	
    while(1){ 		 
    DS1302Read_Time();//读取七个字节的时钟信号:秒分时日月周年		 
    xiangshi();//将DS1302上的时钟显示在LCD1604上		 
    button();         //根据按键值进行操作   	 	 
    read_T();   		 
    convert_T();		 
    display_T(); 	 } 		
    delay(100); 	//延时		
    write_command(0x01);//写入清屏命令		
    delay(100);	//延时 }
    void button()//根据按键值进行操作
    {	
    uchar n,i;	
    P1=0x07;//只看重前三位,后五位忽略
    	n=P1;	
    	n=n&0x07;	
    	if(n!=0x07){    //检测按键按bai下
    	delay(500); //去抖		
    	if(n!=0x07); } //检测按键确实按下,进行按键处理			
    	if(n==0x06){		
    	digit++;}	//由转换周改为转换年(例子)	
    	if(digit==7){		
    	digit=0;}	//轮了一圈又回来	
    	if(n==0x05){		
    	for(i=0;i<7;i++){			
    	if(digit==i){				
    	if((TIME[i]&0x0f)<9){					
    	TIME[i]=TIME[i]+0x01;}				
    	else{TIME[i]=TIME[i]+0x10-0x09;}				
    	DS1302_initial(); }}}	//按下第二个建加1			
    	if(n==0x03){			
    	for(i=0;i<7;i++){			
    	if(digit==i){				
    	if((TIME[i]&0x0f)<10&&(TIME[i]&0x0f)!=0){					
    	TIME[i]=TIME[i]-0x01;}				
    	else{TIME[i]=TIME[i]+0x09-0x10;}				
    	DS1302_initial(); }}}	//按下第三个建减1
    void delay(uint j)//1ms延时子程序
    {	
    uchar i=250;	
    for(;j>0;j--)	
    {		
    while(--i);		
    i=249;		
    while(--i);		
    i=250;	}}
    void delay5(uchar n){	
     do	 
     {	 
     _nop_();	
     _nop_();	
     _nop_();	 
     n--;	 
     }	
      while(n);}
    void xiangshi()	//将DS1302上的时钟显示在
    LCD1604上{	
    button();	
    write_command(0x80);	
    write_data(0x30+2);	
    write_data(0x30+0);	
    write_data(0x30+TIME[6]/16);	//年	
    write_data(0x30+(TIME[6]&0x0f));	
    write_data('-');	
    write_data(0x30+TIME[4]/16);	//月	
    write_data(0x30+(TIME[4]&0x0f));	
    write_data('-');
    write_data(0x30+TIME[3]/16);	//日	
    write_data(0x30+(TIME[3]&0x0f));		write_command(0x8d);			//星期	
    write_data(0x30+(TIME[5]&0x07));		
    write_command(0xc0);	
    write_data(0x30+TIME[2]/16);	//小时	
    write_data(0x30+(TIME[2]&0x0f));	
    write_data(':');	
    write_data(0x30+TIME[1]/16);	//分	
    write_data(0x30+(TIME[1]&0x0f));	
    write_data(':');	
    write_data(0x30+TIME[0]/16);	//秒	
    write_data(0x30+(TIME[0]&0x0f));}``
    void convert_T()
    {	     
    uchar temp;     
    if((temp_data_h&0xf0)==0xf0)//判断是不是负数	   
    {	      
    temp_data_l=~temp_data_l;//如果是负数,取反	      
    if(temp_data_l==0xff)	 //如果低八位全为1	        {	      		
    temp_data_l=temp_data_l+0x01;	      		
    temp_data_h=~temp_data_h;		  		
    temp_data_h=temp_data_h+0x01;  //高八位加1		 	
    }	      
    else	       
    {	       		
    temp_data_l=temp_data_l+0x01;  //取反后需要加1	      		
    temp_data_h=~temp_data_h;           }	 			
    display[4]=ditab[temp_data_l&0x0f];//查表得小数位的值     			
    temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);     			
    display[0]=0x2d;     			
    display[1]=LCDData[(temp%100)/10];     			
    display[2]=LCDData[(temp%100)%10];	   }   
    else		//如果不是负数       
    {  		      	
    display[4]=ditab[temp_data_l&0x0f];//查表得小数位的值     			
    temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);	
    //个位数值     			
    display[0]=LCDData[temp/100];		//百位     			
    display[1]=LCDData[(temp%100)/10];	//十位    	 		
    display[2]=LCDData[(temp%100)%10];	//个位 	    
    }}
    void display_T(void){  
    uchar i;  
    write_command(0x90);  
    for(i=0;i<16;i++)  
    {    
    write_data(table2[i]);  
    }  
    write_command(0xd0);  
    for(i=0;i<7;i++)  {    
    write_data(display[i]);  } }
    void DS1302_initial()  //DS1302初始化函数
    {	
    uchar n;	
    DS1302Write(0x8e,0x00);    
    //禁止写保护(正常工作时不能改变DS1302里的数据,就要进行写保护,就像家里要锁上一把锁)	
    for(n=0;n<7;n++){//写入七个字节时钟信号:秒分时日月周年		
    DS1302Write(Write_DS1302_ADDR[n],TIME[n]);
    }	
    DS1302Write(0x8e,0x80);	   //打开写保护功能
    } 
    void DS1302Read_Time()
    //读取七个字节的时钟信号:秒分时日月周年
    {	
    uchar n;	
    for(n=0;n<7;n++){		
    TIME[n]=DS1302Read(Read_DS1302_data[n]);}}
    ``````c
    void DS1302Write(uchar addr,uchar dat)	 
    //对DS1302时钟写入命令,写入数据
    {	
    uchar n;	
    RST=0;//禁止读写	
    _nop_();	
    SCLK=0; //输入时钟置为低电平	
    _nop_();	
    RST=1;   //允许读写	
    _nop_();	
    for(n=0;n<8;n++){//开始传送8位地址命令		
    DS1302IO=addr&0x01;   //数据从最低位开始传送		
    addr>>=1;		
    SCLK=1;               //时钟拉高,写入一位数据(上升沿写入)		
    _nop_();		
    SCLK=0; //拉低,写入完毕		
    _nop_();	}	
    for(n=0;n<8;n++){//写入八位数据		
    DS1302IO=dat&0x01;   //数据从最低位开始传送		
    dat>>=1;		
    SCLK=1;               
    //时钟拉高,写入一位数据(上升沿写入)		
    _nop_();		
    SCLK=0; //拉低,写入完毕		
    _nop_();	
    }	
    RST=0; //写入数据完毕	
    _nop_();}
    ``````c
    uchar DS1302Read(uchar addr)   //对DS1302时钟写入命令,读出数据
    {	
    uchar n,dat,dat1;	
    RST=0;		//禁止读写	
    _nop_();	
    SCLK=0;     //输入时钟置为低电平	
    _nop_();	
    RST=1;      //允许读写	
    _nop_();	
    for(n=0;n<8;n++){//开始传送8位地址命令		
    DS1302IO=addr&0x01;   //数据从最低位开始传送		
    addr>>=1;		
    SCLK=1;               //时钟拉高,写入一位数据(上升沿写入)		
    _nop_();		
    SCLK=0; //拉低,写入完毕		
    _nop_();	}	
    _nop_();	
    for(n=0;n<8;n++){ //读取八位数据		
    dat1=DS1302IO;		
    dat=(dat>>1)|(dat1<<7);		
    SCLK=1;		
    _nop_();		
    SCLK=0;	//DS1302下降沿,放置数据		
    _nop_();	}	
    RST=0;      //写入数据完毕	
    _nop_();	
    SCLK=1;   //DS1302复位的稳定时间,具体为什么不大清楚	
    _nop_();	
    DS1302IO=0;	
    _nop_();	
    DS1302IO=1;	
    _nop_();	
    return dat;}
    void DS18B20_init(void)	//DS18B20的初始化
    { 	 
    DQ =0;    	 
    delay5(120);      
    //拉低1-Wire总线超过480us来发送复位脉冲,释放总线进入接收模式	 
    DQ =1;    	
    //总线释放后,5KΩ左右的上拉电阻将1-Wire总线拉至高电平	 
    delay5(16);	//等待15-60us	 
    delay5(80);		
    //DS18B20内部总线拉低60-240us来实现发送一个存在脉冲
    }
    uchar read_bit(void)			
    //DS18B20读一个位(每个读时段最小必须有60us的持续时间和并且独立的写时段至少有1us的恢复时间)
    {  
    DQ=0;//主设备拉低总线  
    _nop_();//空操作用于恢复时间  
    _nop_();  
    DQ=1;	//主设备释放总线  
    delay5(2);//采样有效时间为15us  
    return(DQ); }  
    uchar read_byte(void)//DS18B20读一个字节
    { 
    uchar i,temp; temp=0; 
    for(i=0;i<8;i++) {  
    temp>>=1;						  
    if(read_bit())   {		  
    temp|=0x80;		  
    delay5(11);//每个读时段最小必须有60us的持续时间   
    }   
    delay5(6);   } 
    return(temp);}
    void write_bit(uchar temp)//写一位
    { 
    DQ=0; 
    if(temp==1)//写1的时候,不需要等待,直接拉高主设备总线 
    DQ=1; 
    delay5(12);//写0的时候,至少拉低60us 
    DQ=1; }  
    void write_byte(uchar val)//写一个字节
    { 
    uchar i,temp; 
    for(i=0;i<8;i++) {  
    temp=val>>i;//从最低位开始一位一位写进去  
    temp=temp&0x01;  
    write_bit(temp);  
    delay5(5);  }}
    void read_T(void)//读温度
    {     
    DS18B20_init();	//DS18B20的初始化     
    write_byte(0xCC);  //跳过读序号列号的操作(跳过ROM)     
    write_byte(0x44);  //启动温度转换	 
    delay5(500);     
    DS18B20_init();	//DS18B20的初始化     
    write_byte(0xCC);  //跳过读序号列号的操作     
    write_byte(0xBE);  //读取温度寄存器     
    temp_data_l= read_byte();  //温度低8位     
    temp_data_h = read_byte();  //温度高8位 
    }
    void check_busy(void) 
    {	//检查忙标志函数	
    uchar dt;	
    do	
    {		
    dt=0xff;		
    E=0;		
    RS=0;			
    RW=1;		
    E=1;		
    dt=P3;	}while(dt&0x80);	
    E=0;}
    void write_command(uchar com) {  //写命令函数	
    check_busy();	
    E=0;	
    RS=0;	
    RW=0;	
    P3=com;	
    E=1;	
    _nop_( );	
    E=0;	
    delay(1);}
    void write_data(uchar dat)//写数据函数
    {	
    check_busy();	
    E=0;	
    RS=1;	
    RW=0;	
    P3=dat;	E=1;	
    _nop_();	
    E=0;	
    delay(1);	
    }
    void LCD_initial(void)	 //液晶显示器初始化函数
    {	
    write_command(0x38);	
    //写入命令0x38:8位两行显示,5×7点阵字符	
    write_command(0x0c);	
    //写入命令0x0C:开整体显示,光标关,无黑块	
    write_command(0x06);	
    //写入命令0x06:光标右移	
    write_command(0x01); 	
    //写入命令0x01:清屏	
    delay(1);}
    1. 实验结果的分析与总结,有无改进方案?
      实验结果与分析:基本功能能够实现,但是在对DS1302时钟芯片进行调值时,比如24小时后应该归零,但是却变成了25,而且在减法的时候,一旦从0再减,就会变成乱码,这些是有缺漏的。改进方案:改进按键检测与按键进入的子程序中的程序,从而能够实现24小时后归零并且在时钟为00时能够从前借一位。
    展开全文
  • DS18B20温度传感器学习笔记

    千次阅读 多人点赞 2021-01-06 16:19:49
    DS18B20使用方便,单片机DS18B20仅需连接一条数据线,在寄生供电方式下可以不接电源线,DS18B20工作所需电源可以从数据线获得。 传统温度测量方式不同,DS18B20的温度转换结果可直接从数据线读出,在-10℃至...

    DS18B20温度传感器

    DS18B20是DALLAS公司的1-Wire(单总线)数字温度计芯片,温度测量范围从-55℃至+125℃。

    DS18B20使用方便,单片机和DS18B20仅需连接一条数据线,在寄生供电方式下可以不接电源线,DS18B20工作所需的电源可以从数据线获得。

    与传统的温度测量方式不同,DS18B20的温度转换结果可直接从数据线读出,在-10℃至+85℃测量精度可达0.5℃。

    鉴于以上优点DS18B20自问世以来就广泛的应用于恒温控制系统,消费类产品,电子温度计以及数字环境监测系统。

    在这里插入图片描述
    基本功能:
    数字温度计的基本功能如下:

    1. AT89C51每间隔1秒向DS18B20发送测量温度指令,并读出当前环境温度;
    2. 在读出当前环境温度值后,用LCD1602显示温度转换的结果;

    DS18B20内部结构图:
    在这里插入图片描述
    DS18B20内部电路原理图:
    在这里插入图片描述

    重要之处:
    DS18B20的命令序列及操作时序
    1.命令序列
    典型的单总线命令序列如下:
    第一步:初始化;
    第二步:ROM命令;
    第三步:功能命令。
    每次访问单总线器件,必须严格遵守这个命令序列,如果出现序列混乱,则单总线器件不会响应主机。但是,这个准则对于搜索ROM命令和报警搜索命令列外,在执行两者中任何一条命令之后,主机不能执行其后的功能命令,必须返回至第一步。

    (1)初始化
    基于单总线上的所有传输过程都是以初始化开始的,初始化过程中由主机发出的复位脉冲和从机响应的应答脉冲组成。应答脉冲使主机知道,总线上有从机设备,且准备就绪。

    bit Get18B20Ack()
    {
    bit ack;
    EA = 0; //禁止总中断
    IO_18B20 = 0; //产生 500us 复位脉冲
    DelayX10us(50);
    IO_18B20 = 1;
    DelayX10us(6); //延时 60us
    ack = IO_18B20; //读取存在脉冲
    while(!IO_18B20); //等待存在脉冲结束
    EA = 1; //重新使能总中断
    return ack;
    }
    

    首先单片机要拉低这个引脚,持续大概 480us 到 960us 之间的时间即可,我们的程序中持续了 500us。然后,单片机释放总线,就是给高电平,DS18B20 等待大概 15 到 60us 后,会主动拉低这个引脚大概是 60 到240us,而后 DS18B20 会主动释放总线,这样 IO 口会被上拉电阻自动拉高。

    由于 DS18B20 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断。然后第一步,拉低 DS18B20 这个引脚,持续 500us;第二步,延时 60us;第三步,读取存在脉冲,并且等待存在脉冲结束。

    (2)ROM命令
    总线上可以挂多个器件,通过不同的器件地址来访问不同的器件。同样, 1-Wire 总线也可以挂多个器件,但是它只有一条线,如何区分不同的器件呢?

    在每个 DS18B20 内部都有一个唯一的 64 位长的序列号,这个序列号值就存在 DS18B20内部的 ROM 中。开始的 8 位是产品类型编码(DS18B20 是 0x10),接着的 48 位是每个器件唯一的序号,最后的 8 位是 CRC 校验码。 DS18B20 可以引出去很长的线,最长可以到几十米,测不同位置的温度。单片机可以通过和 DS18B20 之间的通信,获取每个传感器所采集到的温度信息,也可以同时给所有的 DS18B20 发送一些指令。这些指令相对来说比较复杂,而且应用很少。
    我们这里只讲一条总线上只接一个器件的指令和程序。
    Skip ROM(跳过 ROM): 0xCC。当总线上只有一个器件的时候,可以跳过 ROM,不进行 ROM 检测。

    (3) RAM 存储器操作指令

    Read Scratchpad(读暂存寄存器): 0xBE
    DS18B20 的温度数据是 2 个字节,我们读取数据的时候,先读取到的是低字节的低位,读完了第一个字节后,再读高字节的低位,直到两个字节全部读取完毕。
    Convert Temperature(启动温度转换): 0x44
    当我们发送一个启动温度转换的指令后, DS18B20 开始进行转换。从转换开始到获取温度, DS18B20 是需要时间的,而这个时间长短取决于 DS18B20 的精度。

    ///
    2、 DS18B20 的位读写时序///重点
    在这里插入图片描述
    当要给 DS18B20 写入 0 的时候,单片机直接将引脚拉低,持续时间大于 60us 小于 120us就可以了。图上显示的意思是,单片机先拉低 15us 之后, DS18B20 会在从 15us 到 60us 之间的时间来读取这一位, DS18B20 最早会在 15us 的时刻读取,典型值是在 30us 的时刻读取,最多不会超过60us, DS18B20 必然读取完毕,所以持续时间超过 60us 即可。

    当要给 DS18B20 写入 1 的时候,单片机先将这个引脚拉低,拉低时间大于 1us,然后马上释放总线,即拉高引脚,并且持续时间也要大于 60us。和写 0 类似的是, DS18B20 会在15us 到 60us 之间来读取这个 1。可以看出来, DS18B20 的时序比较严格,写的过程中最好不要有中断打断,但是在两个“位”之间的间隔,是大于 1 小于无穷的,那在这个时间段,我们是可以开中断来处理其它程序的。发送即写入一个字节的数据程序如下。

    void Write18B20(unsigned char dat)
    {
    unsigned char mask;
    EA = 0; //禁止总中断
    for (mask=0x01; mask!=0; mask<<=1) //低位在先,依次移出 8 个 bit
    {
    IO_18B20 = 0; //产生 2us 低电平脉冲
    _nop_();
    _nop_();
    if ((mask&dat) == 0) //输出该 bit 值
    IO_18B20 = 0;
    else
    IO_18B20 = 1;
    DelayX10us(6); //延时 60us
    IO_18B20 = 1; //拉高通信引脚
    }
    EA = 1; //重新使能总中断
    }
    

    //
    在这里插入图片描述
    当要读取 DS18B20 的数据的时候,我们的单片机首先要拉低这个引脚,并且至少保持1us 的时间,然后释放引脚,释放完毕后要尽快读取。从拉低这个引脚到读取引脚状态,不能超过 15us。大家从图 16-18 可以看出来,主机采样时间,也就是 MASTER SAMPLES,是在 15us 之内必须完成的,读取一个字节数据的程序如下。

    /* 从 DS18B20 读取一个字节,返回值-读到的字节 */
    unsigned char Read18B20()
    {
    	unsigned char dat;
    	unsigned char mask;
    
    	EA = 0;
    	for(mask=0x01; mask!=0; mask<<=1)
    	{
    		IO_18B20 = 0;
    		_nop_();
    		_nop_();
    		IO_18B20 = 1;
    		_nop_();
    		_nop_();
    		if(!IO_18B20)	//读取通信引脚上的值
    			dat &= ~mask;
    		else
    			dat |= mask;
    		DelayX10us(6);
    	}
    	EA = 1;
    
    	return dat;
    }
    

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

    展开全文
  • 本文介绍一种以单线数字温度传感器DS18B20为温度敏感元件粮仓温控系统,系统以微型计算机为上位机, 89C51单片机为检测分机,DS18B20数字温度传感器直接分机连接,分机测温主机通过RS-485总线网进行通信,系统...
  • 【51单片机】温度传感器DS18B20原理

    千次阅读 2020-09-22 15:33:52
    简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合不同而改变其外观。...2、独特单线接口方式,DS18B20微处理器连接
  • 与单片机连接时仅需要一条口线即可实现微处理器与 DS18B20 双向通讯 可编程分辨率为 9~12 位, 对应可分辨温度分别为 0.5℃、0.25℃、0.125℃ 和 0.0625℃, 可实现高精度测温。(一般默认采用12) 12
  • DS18B20温度测量.rar

    2019-10-20 22:13:11
    代码是DS18B20温度传感器寄存器配置代码,可以使用51单片机与连接来实现温度测量。
  • DS18B20温度传感器

    2018-01-13 22:35:51
    DS18B20是一款温度传感器,下面是它引脚图 其中NC为未连接的引脚; DQ为与单片机通信数据线,在蓝桥杯单片机上与P1^4连接 与单片机通信步骤: 1、初始化 2、rom操作 3、DS18B20功能指令 ...
  • #include<reg51.h><br />#include<stdlib.h><br />#include<stdio.h>//头文件 #...//ds18b20与单片机连接口 sbit PWM=P2^5;//控制信号输出 unsigned char code str[]={"my name is zhb "};<b
  • DS18B20单总线协议

    千次阅读 2018-01-16 20:56:14
    单片机课设  ...( 1 )采用单总线接口方式 微处理器连接时仅需要一条口线即可实现微处理器 DS18B20 双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境现场温度测量,使用方便
  • 关于ds18b20程序

    2009-05-05 18:01:55
    DS18B20温度传感器 * * C51 * * yajou 2008-06-28 无CRC * ********************************************************/ #include "reg51.h" #include "intrins.h" #include "DS18B20.h" /**********************...
  • 本文主要介绍了一个基于89S51单片机的测温系统,详细描述了利用数字温度传感器DS...DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
  • DS18B20温度传感器在90c51上使用

    千次阅读 2017-10-15 17:11:00
    这个博客名好长 ...DS18B20是支持一线总线接口温度传感器,它微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通信 。可直接将温度转化为串行数字信号供处理器处理,测温范围在-55°~+125°
  • 【蓝桥杯单片机组】DS18B20

    千次阅读 2017-02-22 10:47:02
    DS18B20与单片机采用单总线连接方式,比赛中使用到文件为提供“onewire.c” 编程步骤: (1)初始化 (2)发送ROM操作命令,包括:Read ROM(读ROM) [33H]、Match ROM(匹配ROM) [55H]、Skip ROM(跳过ROM] [CCH...
  • 使用数字温度传感器DS18B20和中文显示液晶模块OCMJ2*8C制作液晶电子温度计,通过AT89S51单片机端口的连接,实现了对-55℃到125℃范围内温度高精度,高可靠性的测量和显示。
  • 本文介绍一种以单线数字温度传感器DS18B20为温度敏感元件粮仓温控系统,系统以微型计算机为上位机, 89C51单片机为检测分机,DS18B20数字温度传感器直接分机连接,分机测温主机通过RS-485总线网进行通信,系统...
  • DS18B20数字温度计设计

    千次阅读 多人点赞 2018-05-15 13:26:33
    一、单片机简介. 1二、设计任务和要求.... 8单片机硬件连接实物图及实验结果. 4四、系统软件算法设计. 74.1主程序. 74.2 子程序. 7五、总结体会. 75. 1 课程设计过程中遇到问题及解决方法总...
  • 前现大约几周的时候把硬件的选型硬件连接搞定了,接下来就开始进行芯片开发了,单片机用的是STC的,温度传感器是美信的,接下来写一个温度读取的单片机的程序,我使用的是Keill 5 烧录软件也是官方提供的大家可以...
  • 采用LCD1602显示,温度传感器DS18B20与单片机之间通过串口进行数据传输.MSP430系列单片机具有超低功耗,且外围整合性高,DS18B20只需一个端口即可实现数信,连接方便。(包含程序,文档,原理图)
  • 采用数字温度芯片DS18B20 测量温度,输出信号全数字化。采用了单总线数据传输,由数字温度计DS18B20和AT89C51单片机构成温度测量装置,它直接输出温度数字信号,也可直接计算机连接
  • 采用AT89C51单片机作为主控核心,...本论文主要研究了液晶显示器LCD1602及时钟芯片DS1302,温度传感器DS18B20与单片机之间硬件互联及通信,对数种硬件连接方案进行了详尽比较,在软件方面对日历算法也进行了论述。
  • 本文主要介绍了一个基于STC89C52单片机的数字温度报警器系统。...DS18B20与STC89C52结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

ds18b20与单片机的连接