单片机驱动多个ds18b20

这篇具有很好参考价值的文章主要介绍了单片机驱动多个ds18b20。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1设计内容

2ds18b20介绍

2.1传感器引脚及原理图

2.2寄存器配置

3程序实现

3.1配置初始化

3.2配置寄存器

3.3ROM读取

3.4温度读取


1设计内容

通过51单片机,读取总线上挂载的多个ds18b20的温度信息。

如下图,成功读取到3路温度数据。

单片机驱动多个ds18b20,单片机,嵌入式硬件

2ds18b20介绍

2.1传感器引脚及原理图


DS18B20传感器的引脚及封装图如下:

单片机驱动多个ds18b20,单片机,嵌入式硬件
DS18B20一共有三个引脚,分别是:

GND:电源地线
DQ:数字信号输入/输出端。
VDD:外接供电电源输入端。

单片机驱动多个ds18b20,单片机,嵌入式硬件
单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地

注意这个上拉电阻是必须的,就是DQ引脚必须要一个上拉电阻.

2.2寄存器配置

DS18B20写入的功能命令:

ROM指令:

采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令0xCC即可
单片机驱动多个ds18b20,单片机,嵌入式硬件

RAM指令,DS18B20的一些功能指令

常用的是:

温度转换 0x44

开启温度读取转换,读取好的温度会存储在高速暂存器的第0个和第一个字节中

读取温度 0xBE
读取高速暂存器存储的数据
单片机驱动多个ds18b20,单片机,嵌入式硬件

3程序实现

3.1配置初始化

/**初始化DS18B20**/
bit InitDS18B20ACK(){
	bit ACK;//用来判断DS18B20是否初始化成功
	EA = 0;
	DS18B20_IO = 0;
	DS18B20_delayms(1);
	DS18B20_IO = 1;
	DS18B20_delayms(1);
	DS18B20_IO = 0;
	DS18B20_delayms(1);
	ACK = DS18B20_IO;
	DS18B20_IO = 1;
	DS18B20_delayms(1);
	while(!DS18B20_IO);//等待脉冲结束
	EA = 1;
	return ACK;
}

3.2配置寄存器

3.2.1读取ROM测试

在每个DS18B20内部都有一个唯一的64位长的序列号,这个序列号值就存在DS18B20内部的ROM中。开始的8位是产品类型编码(DS18B20是28H),接着的48位是每个器件唯一的序号,最后的8位是CRC校验码。
单片机驱动多个ds18b20,单片机,嵌入式硬件

一线总线系统使用单总线主控来控制一个或多个从机设备。每个DS18B20都有独立唯一的64位-ID,此特性决定了它可以将任意多的DS18b20挂载到一根总线上,通过ROM搜索读取相应DS18B20的温度值。

/**启动DS18B20进行温度的采集以及转换,并返回读取成功与否**/
bit startDs18b201(){	
	bit ACK;
	uchar i,x,k,z;
	uchar MSB,LSB;
	uchar temp[8];
x=0;k=0;
	ACK = InitDS18B20ACK();//总线初始化是否完成
	if(ACK == 0){
		writeToDs18b20(0x33);//跳过ROM的验证操作
		//writeToDs18b20(0xbe);//发送一个读取的命令
		for(i=0;i<8;i++)
		{
			MSB = readeToDs18b20();
			dis0[i]=MSB;
		}
		for(i=0;i<4;i++)
		{
			k=IntToString(temp,(int)dis0[i]);
			for(z=0;z<k;z++)
			{
				LCD_Write_Char(x++,0,temp[z]);
			}
		}
		/*
		x=0;
		for(i=0;i<4;i++)
		{
			k=IntToString(temp,(int)dis0[i+4]);
			for(z=0;z<k;z++)
			{
				LCD_Write_Char(x++,1,temp[z]);
			}
		}
		*/
			LCD_Write_String(0,1,dis0);
	while(1);
		//DS18B20_delayms(500);  //上电转换需要延时足够长时间,否则会读出默认值85  会造成main里面后续任务一直等待,改为通过变量控制。
	}
	return ACK;//ACK == 0 启动成功,1就不成功
}

通过连接多个温湿度测试,第一位都是( ,对应16进制28,10进制40.

3.3ROM读取

上面那个只是测试,直接用下面这个读取rom

/*************************************************************************************************************************
*函数        	:	u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)
*功能        	:	搜索DS18B20 ROM
*参数        	:	pID:DS18B20 ID缓冲区指针
					Num:DS18B20数目,必须事先知道
*返回        	:	搜索到的DS18B20数目
*说明        	:	程序必须事先知道DS18B20数目,搜索的数目只会小于这个数目
					代码移植于互联网
*************************************************************************************************************************/
u8 DS18B20_SearchROM(u8 (*pID)[8],u8 Num)
{ 
	unsigned char k,l,chongtuwei,m,n;
	unsigned char zhan[(MAXNUM)]= {0x00 };  //一定要初始化为0,否则会概率性搜错
	unsigned char ss[64];
	bit ACK;
	uchar MSB,LSB;
	uchar dis1111[16];
	u8 num = 0;
	l=0;
	chongtuwei=0;
	
	do
	{


	ACK = InitDS18B20ACK();
		writeToDs18b20(0xf0);//搜索rom
		//DS18B20_WriteData(0xf0);	
		for(m=0;m<8;m++)
		{
			unsigned char s=0;
			for(n=0;n<8;n++)
			{
				k=DS18B20_Read2Bit();//读两位数据
				if(n==1)
				{
						sprintf(dis1111,"dis1111 %d ",(int)k);
						LCD_Write_String(0,0,dis1111);
				//while(1);
					
					}

				k=k&0x03;
				s>>=1;
				if(k==0x01)//01读到的数据为0 写0 此位为0的器件响应
				{   		
					DS18B20_WriteBit (0);
	    			ss[(m*8+n)]=0;
				}
				else if(k==0x02)//读到的数据为1 写1 此位为1的器件响应
				{
					s=s|0x80;
					DS18B20_WriteBit (1);
					ss[(m*8+n)]=1;
				}
				else if(k==0x00)//读到的数据为00 有冲突位 判断冲突位 
				{				//如果冲突位大于栈顶写0 小于栈顶写以前数据 等于栈顶写1
					chongtuwei=m*8+n+1;					
					if(chongtuwei>zhan[l])
					{						
						DS18B20_WriteBit (0);
						ss[(m*8+n)]=0;												
						zhan[++l]=chongtuwei;						
					}
					else if(chongtuwei<zhan[l])
					{
						s=s|((ss[(m*8+n)]&0x01)<<7);
						DS18B20_WriteBit (ss[(m*8+n)]);
					}
					else if(chongtuwei==zhan[l])
					{
						s=s|0x80;
						DS18B20_WriteBit (1);
						ss[(m*8+n)]=1;
						l=l-1;
					}
				}
				else
				{
					return num;	//搜索完成,//返回搜索到的个数
				}
			}
			pID[num][m]=s;		
		}
		num=num+1;
	}
	while(zhan[l]!=0&&(num<MAXNUM));	
	
	return num;		//返回搜索到的个数
}

3.4温度读取

	do{
		num = DS18B20_SearchROM(ID_Buff,DS18B20_NUM);

		sprintf(dis0,"DS18B20_NUM %d ",(int)DS18B20_NUM);
		LCD_Write_String(0,0,dis0);

		sprintf(dis1,"num %d ",(int)num);
		LCD_Write_String(0,1,dis1);	
	}while(num!=DS18B20_NUM);
	startDs18b20();
	//while(1);
	DelayMs(500);DelayMs(500);DelayMs(500);DelayMs(500);
	while(1)
	{
			//温度传感器-----start
		if(readTemFlags == 1)
		{
			readTemFlags = 0;//清零
			

		//DelayMs(500);  //启动ds18b20后一定要延时,流出转换时间,否则读出为-1
			temperature = DS18B20_ReadDesignateTemper(ID_Buff[i ++]);
			startDs18b20();
			temp_int = temperature/100;//取整数部分
			temp_dec = temperature%100;//取小数部分
			len = IntToString(str,(int)temp_int);
			
		}
		//temperature = temperature >> 4;
		sprintf(dis1,"temp[%d] %d.%d   ",(int)i,(int)temp_int,(int)temp_dec);
		LCD_Write_String(0,1,dis1);

		if(i>3) i=0;
		DelayMs(100);DelayMs(500);DelayMs(500);DelayMs(500);


		
	}

项目整体链接如下。

https://download.csdn.net/download/weixin_51248645/88797969文章来源地址https://www.toymoban.com/news/detail-832477.html

到了这里,关于单片机驱动多个ds18b20的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机读取DS18B20温度传感器

    1 .首先我们知道DS18B20是 单总线协议 ,只有一根数据线。所以Data数据线即使发送端又是接收端,同时DS18B20内部接了弱上拉电阻(如图一所示),数据线默认为高电平。有了这些概念,我们就能进行下一步。                                                图一 (截取

    2024年02月08日
    浏览(28)
  • 51单片机(十三)DS18B20温度传感器

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(31)
  • 51单片机DS18B20测温LCD1602显示

    主函数 自定义头文件 LCD1602函数 DS18B20 共用函数

    2024年02月11日
    浏览(27)
  • MCU-51:单片机DS18B20温度报警器

    DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,相比较于模拟温度传感器,具有功能强大、硬件简单、易扩展、抗干扰性强等特点 测温范围:-55°C 到 +125°C 通信接口:1-Wire(单总线) 其它特征:可形成总线结构、内置温度报警功能、

    2024年02月02日
    浏览(43)
  • 单片机第二季:温度传感器DS18B20

    目录 1,DS18B20介绍 2,DS18B20数据手册  2.1,初始化时序  2.2,读写时序  3,DS18B20工作流程 4,代码   DS18B20的基本特征: (1)内置集成ADC,外部数字接口,也就是可以直接与单片机的数字接口连接,DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只

    2024年02月10日
    浏览(39)
  • 【小实验】C51单片机 DS18B20温度显示实验

         利用单总线技术和数码管动态显示的原理,要求实现DS18B20温度采集并显示,能够设定温度值上限值27.5度,当超出上限值LED灯闪烁。    实验前可先用protues绘制出原理图:   代码仅供参考,希望大家能够在此基础上优化代码,而不是ctrl+c,ctrl+v。 谢谢!!!        

    2024年02月12日
    浏览(34)
  • 基于51单片机多路温度检测proteus仿真 ds18b20

    本设计是基于51单片机多路温度检测proteus仿真_ds18b20(仿真+程序+原理图) 仿真图proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:C0042 功能说明: 通过对多路DS18B20温度传感器的数据采集,实现8路/4路温度采集并将数值显示在LCD显示屏上; 通过按键设置温度报警

    2024年02月12日
    浏览(36)
  • 【蓝桥杯-单片机学习笔记(十三)】DS18B20温度传感器

    一、温度传感器-DS18B20介绍 DS18B20是单总线数字化温度传感器,测量温度范围是-55℃~+125℃,在-10℃~+85℃范围内,精度为±0.5℃。支持3V~5.5V的供电电压范围。DS18B20可以程序设定9~12位的分辨率,精度为±0.5℃。 1.DS18B20内部结构 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度

    2023年04月09日
    浏览(51)
  • 基于51单片机的DS18B20温度控制加热降温系统设计

    仿真图:proteus8.9以上 程序代码:KEIL4/KEIL5 原理图:AD 设计编号:A0007 结合实际情况,基于51单片机设计一个排队叫号系统设计。该系统应满足的功能要求为: 系统由51单片机、DS18B20温度传感器、LCD1602液晶显示屏、继电器、风扇、加热膜、按键、蜂鸣器组成。 可实现以下基本功能

    2023年04月09日
    浏览(69)
  • 51单片机DS18B20测温数码管显示例程(Proteus仿真+程序)

          本设计由STM32单片机+DS18B20温度传感器+四段数码管显示模块组成。 1、主控制器是51单片机 2、DS18B20温度传感器采集温度,精度0.1摄氏度 3、数码管显示温度,由三极管驱动。 4、测温范围-55~110摄氏度,误差±0.1℃ 注意:Proteus7.8以上版本打开 19、51单片机DS18B20测温数码管

    2023年04月08日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包