51单片机ds18b20温度检测(51单片机lcd1602电子时钟)

基于51单片机LCD1602温度显示(DS18B20测温)要在1602上显示温度先要了解1602是如何显示的。详情可以参考我之前的文章基于51单片机1602显示DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。我们首先来了解“单总线”的概念。目前,常用的单片机与外设之间进行数据传输的串行总线主要有I2、SPI和SCI总线。其中I2总线以同步串行二线方式进行通信

大家好,又见面了,我是你们的朋友全栈君。

基于51单片机DS18B20测温

要在1602上显示温度先要了解1602是如何显示的。详情可以参考我之前的文章基于51单片机1602显示

DS18B20是美国DALLAS半导体公司推出的第一片支持“一线总线”接口的温度传感器,具有微型化、低功耗、高性能、抗干扰能力强、易配微处理器等优点,可直接将温度转化成串行数字信号供处理器处理。
我们首先来了解“单总线”的概念。目前,常用的单片机与外设之间进行数据传输的串行总线主要有I2、SPI和SCI总线。其中I2总线以同步串行二线方式进行通信(一条时钟线、一条数据线), SPI总线则以同步串行三线方式进行通信(一条时钟线、一条数据输入线、 一条数据输出线),SCI 总线以异步方式进行通信(一条数据输入线、一条 数据输出线)。这些总线至少需要两条信号线,而DS18B20使用的单总线技术与上述总线不同,它采用单条信号线,既可传输时钟,又可传输数据, 而且数据传输是双向的,因而这种单总线技术具有线路简单、硬件开销少、成本低廉、便于扩展和维护等优点。单总线适用于单主机系统,能够控制一个或多个从机设备。也就是说18B20链接单片机进行数据传输只使用单片机的一个I/O口非常节省I/O口也非常的方便。
下面说一下怎么才可以给DS18B20里面的数据读出来。

DS18B20的指令:
①33H一读ROM。读DS18B20温度传感器ROM中的编码(即64位地址)。

②55H一匹配ROM。发出此命令之后,接着发出64位ROM编码,访问单总线上与该编码相对应的DS18B20并使之做出响应,为下一步对该DS18B20的读/写做准备。

③FOH一搜索ROM。用于确定挂接在同一总线上DS18B20的个数,识别64位ROM地址,为操作各器件做好准备。

④CCH一跳过ROM。忽略64位ROM地址,直接向18B20 发温度变换命令,适用于一个从机工作。

⑤ECH一告警搜索命令。执行后只有温度超过设定值上限或下限的芯片才做出响应。

如果主机只对一个DS18B20进行操作,就不需要读取ROM编码和匹配ROM编码,只要用跳过ROM(CCH)命令,就可进行如下温度转换和读取操作。
①44H一温度转换。启动DS18B20进行温度转换,12位转换时最长为750ms(9位为93.75ms)。结果存入内部9字节的RAM中。
2BEH—读暂存器。读内部RAM中9字节的温度数据。
③4EH—写暂存器。发出向内部RAM的第2、3字节写上、下限温度数据命令,紧跟该命令之后,是传送2字节的数据。
④48H复制暂存器。将RAM中第2、3字节的内容复制到E2PROM中。
⑤B8H一重调E2PROM。将E2PROM中内容恢复到RAM中的第3、4字节。
⑥B4H—读供电方式。读DS18B20的供电模式。寄生供电时,DS18B20发送0;外接电源供电时,DS18B20发送1

DS18B20 单线通信功能是分时完成的,它有严格的时隙概念,如果出现序列混乱,1-WIRE 器件将不响应主机,因此读写时序很重要。系统对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下三个步骤 :
(1)每次读写前对 DS18B20 进行复位初始化。
(2)发送一条 ROM 指令。
(3)发送存储器指令。

unsigned char Ds18b20Init()//18B20初始化
{ 
   
	unsigned int i;
	DSPORT=0;			 //将总线拉低480us~960us
	i=70;	
	while(i--);//延时642us
	DSPORT=1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i=0;
	while(DSPORT)	//等待DS18B20拉低总线
	{ 
   
		i++;
		if(i>5000)//等待>5MS
			return 0;//初始化失败 
	}
	return 1;//初始化成功
}

现在我们做的是让DS18B20进行一次温度转换,那具体操作如下:
(1)主机先作复位操作。
(2)主机再写跳过ROM的操作(CCH)命令。
(3)然后主机接着写个转换温度的操作命令,后面释放总线至少 1s,让DS18B20 完成转换的操作。在这里要注意的是每个命令字节在写的时候都是低字节先写,例如 CCH 的二进制为 11001100,在写到总线上时要从低位开始写,写的顺序是“1、1、0、0、1、1、0、0”。

void  Ds18b20ChangTemp()
{ 
   
	Ds18b20Init();
	Delay1ms(1);
	Ds18b20WriteByte(0xcc);		//跳过ROM操作命令 
	Ds18b20WriteByte(0x44);	    //温度转换命令
// Delay1ms(100); //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}
void Ds18b20WriteByte(unsigned char dat)//向18B20写入一个字节
{ 
   
	unsigned int i,j;
	for(j=0;j<8;j++)
	{ 
   
		DSPORT=0;			//每写入一位数据之前先把总线拉低1us
		i++;
		DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
		i=6;
		while(i--); //延时68us,持续时间最少60us在这里插入代码片
		DSPORT=1;	//然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
		dat>>=1;
	}
}

读取 RAM 内的温度数据同样也要接照三个步骤:
(1)主机发出复位操作并接收 DS18B20 的应答(存在)脉冲。
(2)主机发出跳过对 ROM 操作的命令(CCH)。
(3)主机发出读取 RAM 的命令(BEH),随后主机依次读取 DS18B20 发出的从第0到第8,共九个字节的数据。如果只想读取温度数据,那在读完第0和第1个数据后就不再理会后面 DS18B20 发出的数据即可。同样读取数据也是低位在前的。

void  Ds18b20ReadTempCom()
{ 
   	

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

int Ds18b20ReadTemp()//读取温度 返回一个数字量
{ 
   
	int temp=0;
	unsigned char tmh,tml;
	Ds18b20ChangTemp();			 	//先写入转换命令
	Ds18b20ReadTempCom();			//然后等待转换完后发送读取温度命令
	tml=Ds18b20ReadByte();		//读取温度值共16位,先读低字节
	tmh=Ds18b20ReadByte();		//再读高字节
	temp=tmh;
	temp<<=8;
	temp|=tml;
	return temp;
}
unsigned char Ds18b20ReadByte()//向18B20读取一个字节
{ 
   
	unsigned char byte,bi;
	unsigned int i,j;	
	for(j=8;j>0;j--)
	{ 
   
		DSPORT=0;//先将总线拉低1us
		i++;
		DSPORT=1;//然后释放总线
		i++;
		i++;//延时6us等待数据稳定
		bi=DSPORT;	 //读取数据,从最低位开始读取
		/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
		byte=(byte>>1)|(bi<<7);						  
		i=4;		//读取完之后等待48us再接着读取下一个数
		while(i--);
	}				
	return byte;
}

读取返回值后要将返回值转换成1602可识别的温度显示值:

void LcdDisplay(int temp) 	 //lcd显示
{ 
   
    
  unsigned char  datas[] = { 
   0, 0, 0, 0, 0}; //定义数组
	float tp;  
	if(temp< 0)				//当温度值为负数
  	{ 
   
	  write_com(0x80+0x40);		//写地址 80表示初始地址
		SBUF='-';//将接收到的数据放入到发送寄存器
		while(!TI);			         //等待发送数据完成
		TI=0;						 //清除发送完成标志位
	    write_date('-');  		//显示负
		//因为读取的温度是实际温度的补码,所以减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的就
		//算由?.5,还是在小数点后面。
 
  	}
 	else
  	{ 
   			
	  	write_com(0x80+0x40);		//写地址 80表示初始地址
	    write_date('+'); 		//显示正
		SBUF='+';//将接收到的数据放入到发送寄存器
		while(!TI);			         //等待发送数据完成
		TI=0;						 //清除发送完成标志位
		tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
		//如果温度是正的那么,那么正数的原码就是补码它本身
		temp=tp*0.0625*100+0.5;	
		//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
		//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
		//算加上0.5,还是在小数点后面。
	}
	datas[0] = temp / 10000;
	datas[1] = temp % 10000 / 1000;
	datas[2] = temp % 1000 / 100;
	datas[3] = temp % 100 / 10;
	datas[4] = temp % 10;

	write_com(0x82+0x40);		  //写地址 80表示初始地址
	write_date('0'+datas[0]); //百位 
	SBUF = '0'+datas[0];//将接收到的数据放入到发送寄存器
	while (!TI);			         //等待发送数据完成
	TI = 0;
	
	write_com(0x83+0x40);		 //写地址 80表示初始地址
	write_date('0'+datas[1]); //十位
	SBUF = '0'+datas[1];//将接收到的数据放入到发送寄存器
	while (!TI);			         //等待发送数据完成
	TI = 0;

	write_com(0x84+0x40);		//写地址 80表示初始地址
	write_date('0'+datas[2]); //个位 
	SBUF = '0'+datas[2];//将接收到的数据放入到发送寄存器
	while (!TI);			         //等待发送数据完成
	TI = 0;

	write_com(0x85+0x40);		//写地址 80表示初始地址
	write_date('.'); 		//显示 ‘.’
	SBUF = '.';//将接收到的数据放入到发送寄存器
	while (!TI);			         //等待发送数据完成
	TI = 0;

	write_com(0x86+0x40);		 //写地址 80表示初始地址
	write_date('0'+datas[3]); //显示小数点 
	SBUF = '0'+datas[3];//将接收到的数据放入到发送寄存器
	while (!TI);			         //等待发送数据完成
	TI = 0;

	write_com(0x87+0x40);		 //写地址 80表示初始地址
	write_date('0'+datas[4]); //显示小数点 
	SBUF = '0'+datas[4];//将接收到的数据放入到发送寄存器
	while (!TI);			         //等待发送数据完成
	TI = 0;
}

仿真效果看基于51单片机1602带温度显示的电子时钟这个文章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/129430.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 交换机与poe交换机区别_网络交换机和poe交换机区别

    交换机与poe交换机区别_网络交换机和poe交换机区别POE(PowerOverEthernet)指的是在目前的以太网接口Cat.5走线系统架构未作其他改变的情形下,在为一些由于IP的终端设备(如IP电话机,无线网络连接点AP,网络摄像头等)传送数据数据信号的与此同时,还能为该类机器设备给予直流电源的技术性.便是适用以太网接口供电的交换机。POE交换机和普通交换机有什么区别呢?关键分成五大层面的不一样:1.可靠性不一样;2.传送功能不一样;3.成本费不一样;4.供电方法不一样;5.操纵不一样。1.可靠性不一样;POE交换机便是适用对网络.

    2022年9月28日
    1
  • Java实现九九乘法表[通俗易懂]

    Java实现九九乘法表[通俗易懂]有时候我们在java编程的时候,想实现九九乘法表的效果,怎么实现呢,下面来分享一下方法输出九九乘法口诀表,如图所示。观察九九乘法口诀表,可以得出图表的规律:总共有9行,第几行就有几个表达式。同时要注意每行表达式的规律:第j行,表达式就从j1开始,一直到jj结束,共有j个表达式,这个效果可以通过一次循环实现。这样的话,正好可以通过双重循环来控制输出,外层循环控制行数,内层循环控制列。还有个地方…

    2022年7月25日
    8
  • 100vh和100%的区别[通俗易懂]

    100vh和100%的区别[通俗易懂]介绍vh就是当前屏幕可见高度的1%,也就是说height:100vh==height:100%;我的案例:元素没有设置高度的时候,我写移动端界面的时候用100vh会把屏幕撑大到需要滑动框,但是100%却不会。我是怎么解决的呢:在最外层包一个div,给这个div设置height:100vh…

    2022年5月4日
    70
  • idea是什么软件_总结IDEA开发的26个常用设置

    idea是什么软件_总结IDEA开发的26个常用设置IDEA软件设置Settings页面Settings是对软件本身的一些属性进行配置,例如字体主题背景图插件等。如何打开Settings设置页面Settings设置页面结构详解结构Appearance&Behavior外观和行为Keymap快捷键Editor编辑器设置Plugins插件VersionControl版本控制Build,Execution,Deployme…

    2022年8月29日
    4
  • navcat 15 激活码_最新在线免费激活

    (navcat 15 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
    61
  • Java课设–学生成绩管理系统一

    Java课设–学生成绩管理系统一写在前面这个项目是Java课程的课设,一共花了5天的时间去完成它,在这期间感谢一些博主的帮助,让我了解到了一些新的技术知识,所以打算写这一系列博客来介绍一整个课设项目,也为了帮助之后的人,如有错误,请联系我。为了更好的让读者了解到整个项目的设计流程,我将项目拆分成几个部分来就行解说,这一小节是一个总述,主要介绍课设的整个框架和最终效果,代码我会放到后面的github链接上,欢迎大家star。如果有一些参考没有加上联系,希望大家可以联系我,因为写的时候查的比较快,没有记录到博主的链接,敬请谅解!!!一、

    2022年7月8日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号