当前位置: 首页 > news >正文

单片机驱动多个ds18b20

目录

1设计内容

2ds18b20介绍

2.1传感器引脚及原理图

2.2寄存器配置

3程序实现

3.1配置初始化

3.2配置寄存器

3.3ROM读取

3.4温度读取


1设计内容

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

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

2ds18b20介绍

2.1传感器引脚及原理图


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


DS18B20一共有三个引脚,分别是:

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


单个DS18B20接线方式: VDD接到电源,DQ接单片机引脚,同时外加上拉电阻,GND接地

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

2.2寄存器配置

DS18B20写入的功能命令:

ROM指令:

采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令0xCC即可
在这里插入图片描述

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

常用的是:

温度转换 0x44

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

读取温度 0xBE
读取高速暂存器存储的数据
在这里插入图片描述

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都有独立唯一的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 小于栈顶写以前数据 等于栈顶写1chongtuwei=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){//温度传感器-----startif(readTemFlags == 1){readTemFlags = 0;//清零//DelayMs(500);  //启动ds18b20后一定要延时,流出转换时间,否则读出为-1temperature = 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

http://www.lryc.cn/news/291628.html

相关文章:

  • GitLab16.8配置webhooks、Jenkins2.4配置GitLab插件实现持续集成、配置宝塔面板实现持续部署(其三)
  • 鸿蒙会取代Android吗?听风就是雨
  • 检测CUDA 是否能访问GPU时回应速度慢【笔记】
  • 大模型运行成本对比:GPT-3.5/4 vs. 开源托管
  • fastadmin后台自定义按钮和弹窗
  • 《高性能MySQL》
  • postman用法
  • MySQL之数据库DQL
  • 《区块链简易速速上手小册》第9章:区块链的法律与监管(2024 最新版)
  • Spring Boot 中操作 Bean 的生命周期
  • Linux ---- Shell编程三剑客之AWK
  • Netty入门使用
  • go并发编程-runtime、Channel与Goroutine
  • HTTP概述
  • ubuntu20配置mysql8
  • CPU-Cache结构查看
  • Wireshark网络协议分析 - Wireshark速览
  • 查看进程创建的所有线程
  • 汽车软件开发模式的5个特点
  • 双屏联动系统在展厅设计中的互动类型与效果
  • STM32F407移植OpenHarmony笔记5
  • 点击其他区域隐藏弹出框效果
  • Python一些可能用的到的函数系列123 ATimer2-时间偏移
  • 企业微信主体变更 怎么操作?
  • 《区块链简易速速上手小册》第8章:区块链的技术挑战(2024 最新版)
  • 基于STM32的云上OneNET智慧大棚(包含程序设计报告)
  • 11.scala函数进阶
  • 在WebSocket中使用Redis出现空指针异常解决方案
  • 问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体
  • 《区块链简易速速上手小册》第10章:区块链的未来与趋势(2024 最新版)