精华内容
下载资源
问答
  • 目录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)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温度传感器等各个模块; 训练系统综合能力;...进行方案分析该项实践要使用到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时能够从前借一位。
    展开全文
  • 51单片机】温度传感器DS18B20原理

    千次阅读 2020-09-22 15:33:52
    简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合不同而改变其外观。...2、独特单线接口方式,DS18B20微处理器连接

    简介

    DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
    在这里插入图片描述

    特点

    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、负压特性:电源极性接反时,芯片不会因发热而烧毁, 但不能正常工作。

    内部结构

    在这里插入图片描述
    (1) 64位(激)光刻只读存储器
    光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。
    在这里插入图片描述
    (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即可得到实际温度。

    在这里插入图片描述
    在这里插入图片描述
    (3) DS18B20温度传感器的存储器
    DS18B20温度传感器的内部存储器包括一个高速的暂存器RAM和一个非易失性的可电擦除的EEPROM,后者存放高温度和低温度触发器TH、TL和结构寄存器。

    (4) 配置寄存器
    存储器的第4位为配置寄存器,其组织见图8,用户可按表3所示设置R0和R1位来设定DS18B20的精度。上电默认设置:R0=1、R1=1(12位精度)。注意:精度和转换时间之间有直接的关系。暂存器的位7和位0-4被器件保留,禁止写入。
    在这里插入图片描述

    ROM指令

    在这里插入图片描述

    RAM指令

    在这里插入图片描述

    初始化

    在这里插入图片描述

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

    读时序

    在这里插入图片描述
    (1).将数据线拉低“0”。
    (2).延时1微妙。
    (3).将数据线拉高“1”,释放总线准备读数据。
    (4).DS18B20如果写0则拉低总线 ,如果为1则释放总线至少15us(从(1)开始算起)延时10微妙。
    (5).读数据线的状态得到1个状态位,并进行数据处理。(从(1)到现在必须小于15us)
    (6).延时45微妙。
    (7).重复1~7步骤,直到读完一个字节。

    写时序

    在这里插入图片描述
    (1).数据线先置低电平“0”
    (2).延时15微妙。
    (3).按从低位到高位的顺序发送数据(一次只发送一位,15us~60us之间的状态由要写的数据决定,写0就是低电平,写1就是高电平)。
    (4).延时60微妙。
    (5).将数据线拉到高电平。
    (6).重复1~5步骤,直到发送完整的字节。
    (7).最后将数据线拉高。
    ps:写周期在60~120us之间

    展开全文
  • 与单片机连接时仅需要一条口线即可实现微处理器 DS18B20 双向通讯 可编程分辨率为 9~12 位, 对应可分辨温度分别为 0.5℃、0.25℃、0.125℃ 和 0.0625℃, 可实现高精度测温。(一般默认采用12) 12
  • 本文介绍一种以单线数字温度传感器DS18B20为温度敏感元件粮仓温控系统,系统以微型计算机为上位机, 89C51单片机为检测分机,DS18B20数字温度传感器直接分机连接,分机测温主机通过RS-485总线网进行通信,系统...
  • DS18B20温度传感器在90c51使用

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

    2019-10-20 22:13:11
    代码是DS18B20温度传感器寄存器配置代码,可以使用51单片机与连接来实现温度测量。
  • #include<reg51.h> #include<stdlib.h><br />#include<stdio.h>//头文件 #...//ds18b20与单片机连接口 sbit PWM=P2^5;//控制信号输出 unsigned char code str[]={"my name is zhb "};<b
  • 关于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和中文显示液晶模块OCMJ2*8C制作液晶电子温度计,通过AT89S51单片机端口的连接,实现了对-55℃到125℃范围内温度高精度,高可靠性的测量和显示。
  • 本文介绍一种以单线数字温度传感器DS18B20为温度敏感元件粮仓温控系统,系统以微型计算机为上位机, 89C51单片机为检测分机,DS18B20数字温度传感器直接分机连接,分机测温主机通过RS-485总线网进行通信,系统...
  • 前现大约几周的时候把硬件的选型硬件连接搞定了,接下来就开始进行芯片开发了,单片机用的是STC的,温度传感器是美信的,接下来写一个温度读取的单片机的程序,我使用的是Keill 5 烧录软件也是官方提供的大家可以...
  • 基于51单片机的温度探测

    万次阅读 2020-05-23 11:29:46
    文末下载链接和项目说明哦 这次项目姑且算作旧瓶装新酒吧,以前做过...DS18B20模块采用排针和杜邦线与单片机连接。同时还设置了临界温度(温度上限),超过该温度使用蜂鸣器鸣响报警。临界温度可以采用两个按键调整。
  • 采用AT89C51单片机作为主控核心,...本论文主要研究了液晶显示器LCD1602及时钟芯片DS1302,温度传感器DS18B20与单片机之间硬件互联及通信,对数种硬件连接方案进行了详尽比较,在软件方面对日历算法也进行了论述。
  • 本文主要介绍了一个基于STC89C52单片机的数字温度报警器系统。...DS18B20与STC89C52结合实现最简温度报警系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。
  • 51单片机的周边电路实例,内含: 24C02接口.bmp 1602液晶接口.bmp 12864液晶接口.bmp AD单片机连接.bmp DA接口.bmp DS18B20接口.bmp ISP下载接口.bmp PDIUSBD12接口.bmp 串口接口.bmp 发光二极管.bmp 蜂鸣器接口....
  • 51单片机工程应用实例》随书光盘

    热门讨论 2011-08-10 17:02:08
    8.3.2 NewMsgRF905SE与单片机的连接 8.4 系统的硬件结构 8.5 单片机编程 8.6 上位机编程 第9章 熔断时间测试仪 9.1 慢熔型片式熔断器 9.2 电流传感器 9.3 测试仪的硬件结构 9.4 测试仪的编程 第10章 FM收音机 ...
  • 采用数字温度芯片DS18B20 测量温度,输出信号全数字化。采用了单总线数据传输,由数字温度计DS18B20和AT89C51单片机构成温度测量装置,它直接输出温度数字信号,也可直接计算机连接
  • 该设计采用51单片机STC89C52控制DS18B20实现无线温度控制系统。通过简单无线通信协议,实现可靠性功耗平衡。该系统能实现对温度测量,同时还可以进行温度设定,是可以实现远程控制无线温度控制系统。...
  • 18-18b20 -- 使用温度传感器18B20测温度,并用数码管显示。P14接通。 19-1602 -- 使用LCD1602显示字符。LCD1602接到P4,方向和板子方向相反。 20-24c08 -- 对24c08进行写读操作。并把写进和读到数用LED显示。P8...
  • 基于单片机的智能浇花(灌溉)系统设计

    万次阅读 多人点赞 2018-12-20 22:43:32
    智能浇花系统主要分为两个部分:监测模块选用湿度传感器YL-69来对土壤中湿度值进行监测以及温度传感器DS18B20对花周围温度进行实时检测。温度值湿度值控制则为连接单片机SRD-05VDC-SL-C继电器,通过控制...
  • 结合前几天来写过的文章, 今天总算写了一个功能较多的应用 - 多功能时钟,... 单片机练习 - 计时器 实验板: TX-1B实验板6位数码管与单片机的连接电路图按键S2, S3与单片机的连接电路图: 其中S2P3.4连, S3P3.5连接...
  • 温度传感器和显示装置:温度传感器是DS18B20DS18B20串行数据线与单片机AT89c4051电路一个I/O口连接,通过该I/O口传递测量数据并且供电;单片机AT89C4051I/O口上还连接有显示器和按键开关,电池正负极与单片机AT...
  • 单片机原理及接口(C ...23.4.1.1 知识背景——DS18B20 数字温度传感器简介 23.4.1.2 程序解析 23.4.1.3 程序下载和调试 23.4.2 分布式红外防盗报警系统应用编程 23.4.2.1 知识背景——MC-760T红外探测器简介 23.4...
  • 设计一个基于AT89C51的单片机温度检测系统,外围模块包括:LED指示灯、蜂鸣器、16X2LCD液晶显示模块、3个按钮键盘(设置键、增加键、减少键)、一线总线上连接3个温度传感器(DS18B20)。

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

ds18b20与51单片机的连接