1-Wired一线式总线

 常见的几种通信接口

 一线式总线

定义

  • 一线式:说明CPU和外设之间数据通信只需一根信号线,此信号线必然是数据线,并且数据线连接了一个上拉电阻,默认为高电平
  • 串行:说明CPU和外设的数据通信一个时钟周期传输一个bit位

问:没有时钟控制信号线,哪来的时钟呢,怎么去传输1个bit位呢?不像I2C总线的"低放高取",
因为它有时钟控制信号线
答:看协议

  • 总线:说明这根数据线上可以连接挂接多个外设

 

 硬件设计

DS18B20硬件特性

DS18B20芯片内部集成了64bit容量的ROM(只读存储器),存储每一个DS18B20唯一的序列码(类似身份证号)所以:CPU将来要想访问某个DS18B20,只需通过ROM中的序列码即可访问,也就是CPU只需向总线发送对应的DS18B20的序列码即可访问某个外设

ROM用来区分不同的设备

 

根据芯片手册P10,访问DS18B20遵循以下三步骤:

  • 第一步CPU向总线发送初始化复位信号,类似I2C的START信号,UART的起始位
  • 第二步CPU向总线发送ROM命令,为了找到要访问的外设,类似I2C总线发送设备地址
  • 第三步CPU向总线发送功能命令(一旦找到外设以后,下面就是读还是写还是其他功能)
     

代码部分

初始化

// 函数定义
void DS18B20_Init(void){// 1.打开GPIOG控制器时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);// 2.配置PG11 - 推挽输出, 50MHzGPIO_InitTypeDef GPIO_Config;GPIO_Config.GPIO_Pin = DS18B20_PIN;GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Config.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(DS18B20_PORT, &GPIO_Config);
}// 配置PG11 - 推挽输出, 50MHz
void  DS18B20_OUT(void){GPIO_InitTypeDef GPIO_Config;GPIO_Config.GPIO_Pin = DS18B20_PIN;GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Config.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(DS18B20_PORT, &GPIO_Config);
}// 配置PG11 - 上拉输入 
void  DS18B20_IN(void){GPIO_InitTypeDef GPIO_Config;GPIO_Config.GPIO_Pin = DS18B20_PIN;GPIO_Config.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(DS18B20_PORT, &GPIO_Config);
}

CPU向总线发送初始化复位信号

void DS18B20_Reset(void){u8 tempTime = 0;// 1.CPU将PG11拉低, >=480us	-> 复位脉冲DS18B20_OUT();DS18B20_IO_OUT = 0; // 拉低 delay_us(500);// 2.CPU将PG11拉高, 15-60usDS18B20_IO_OUT = 1; // 拉高 delay_us(30);// 3.DS18B20若在总线上, 拉低, 60-240us	-> 存在脉冲 DS18B20_IN(); // 输入 // 判断DS18B20是否拉低, PG11 = 0// 1.tempTime >= 240// 2.DS18B20_IO_IN == 0while(DS18B20_IO_IN && tempTime < 240){tempTime++;delay_us(1);}if(tempTime >= 240){printf("RESET FAILED\n");}else{printf("RESET SUCCESS\n");tempTime = 0;}}

CPU向总线写数据

// 从低位开始发送 , 
// 参数 : data 要发送的数据, 命令(0XCC,0XBE,...)
void DS18B20_Write_Byte(u8 data){u8 i;DS18B20_OUT();for(i = 0; i < 8; i++){if(data & 0x01){ // 发送1bit的1// 1.PG11拉低, >1usDS18B20_IO_OUT = 0;delay_us(2);// 2.PG11拉高, 60us DS18B20_IO_OUT = 1;delay_us(60);}else{ // 发送1bit的0// 1.PG11拉低, 60usDS18B20_IO_OUT = 0;delay_us(60);// 2.PG11拉高, 2usDS18B20_IO_OUT = 1;delay_us(2);}data >>= 1; }
}

 CPU从总线读数据

 

// 功能 : 读取1字节数据 
// 读取bit, 循环读8次, 读取数据从低位读 
u8 DS18B20_Read_Byte(void){u8 i = 0, data = 0;// 暂存读取到的数据for(i = 0; i < 8; i++){// 1.CPU拉低PG11, 2usDS18B20_OUT();DS18B20_IO_OUT = 0; delay_us(2);// 2.配置为输入, 释放总线权限// 外设发0, 主动将PG11拉低// 外设发1, 外设什么不做, 上拉电阻拉高, 高电平DS18B20_IN();// 延时等待, 等待高电平/低电平delay_us(8);// ----> 现在检测PG11高低电平, 高电平/低电平data |= DS18B20_IO_IN << i;delay_us(50); }return data;
}

 读取ROM函数

// 定义读取ROM的函数(64bit - 8byte)
// 当做测试函数用(命令)
void DS18B20_ReadRom(void){// 1.初始化DS18B20_Reset();// 2.发送读ROM命令 - 0X33DS18B20_Write_Byte(0X33);// 3.循环读取8字节数据 u8 i;for(i = 0; i < 8; i++){rom[i] = DS18B20_Read_Byte();printf("%#x ", rom[i]);}printf("\n");
}

匹配ROM函数

// 定义匹配ROM的函数 
void DS18B20_MatchRom(void){// 1.发送MATCH ROM (0X55)DS18B20_Write_Byte(0X55);// 2.发送ROM值u8 i;for(i = 0; i < 8; i++)DS18B20_Write_Byte(rom[i]);
}	

获取温度值

这里的难点是解决温度值的转换

 第15:11位是表示正负的,(temp & 0xf800) == 0xf800满足这个条件就说明是负数

可以通过这个方法实现转换:取反加一, 转十添负 

第0位是1/16就是0.0625,再乘以多少个就得到温度值了

//获取温度
// 初始化 - MATCH ROM - CONVERT T - 延时 
// 初始化 - MATCH ROM - READ - 读两个字节 
float DS18B20_GetTemperature(void){u8 temp_lsb = 0, temp_msb = 0;u16 temp = 0;float value; // 暂存转换后的温度值 //1.初始化 DS18B20_Reset();//2.CPU发送MATCH ROM(0X55)DS18B20_MatchRom();//3.CPU发CONVERT T(0X44)DS18B20_Write_Byte(0X44);//4.休眠800msdelay_ms(800);///5.初始化DS18B20_Reset();//6.CPU发送MATCH ROM(0X55)DS18B20_MatchRom();//7.CPU发READ SCRATCHPAD(0XBE)DS18B20_Write_Byte(0XBE);//8.读数据(读2次即可)temp_lsb = DS18B20_Read_Byte(); // byte0temp_msb = DS18B20_Read_Byte(); // byte1// 低位和高位数据的合并, temp读取到的温度值temp = temp_msb << 8 | temp_lsb; // 判断零上/零下 if((temp & 0xf800) == 0xf800){ // 负数/零下temp = (~temp) + 1;  // 获取temp的绝对值value = temp * (-0.0625);}else{// 零上/正数value = temp * 0.0625;}return value;
}  

测试代码

void DS18B20_Test(void){float temp = DS18B20_GetTemperature();printf("CURRENT TEMPERATURE : %.3f\n", temp);
} 

将温度传感器初始化和测试代码加入到初始化函数和cmd函数中

init.c中
static PINIT_T init_func[] = {LED_Init,			// led灯初始化BEEP_Init,		// beep初始化 Systick_init,	// 滴答定时器初始化KEY_Init,			// 按键初始化My_EXTI_Init,	// 中断初始化 UART_Init,		// 串口初始化AT24C02_Init, // AT24C02初始化DS18B20_Init, // 温度传感器的初始化0
};cmd.c中
cmd_t cmd[] = {{"led on", LED_On},{"led off", LED_Off},{"beep on", BEEP_On},{"beep off", BEEP_Off},{"EEPROM R", AT24C02_ReadOne}, // 读取单字节{"EEPROM W", AT24C02_WriteOne}, //写入单字节{"EEPROM RS", AT24C02_ReadMul}, // 读取多字节{"EEPROM WS", AT24C02_WriteMul},	// 写入多字节{"temp", DS18B20_Test},  // 获取温度命令{"rom", DS18B20_ReadRom},	// 读取ROM值命令
};

结果展示

每个DS8B20的ROM都是不一样的,执行前需要读取下自己手中的DS8B20的ROM值,再写入到寄存器中进行匹配,匹配后才能读取到正确的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409410.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GoWeb 设置别名和多环境配置

别名 vite.config.ts中添加代码如下即可 //设置别名resolve: {alias: {"": path.resolve(process.cwd(),"src"),//用替代src}}随后即可使用 配置多环境 vite.config.ts中添加代码如下 envDir: ./viteenv,//相对路径随后在项目根目录创建对应的viteenv…

WEB渗透Win提权篇-RDPFirewall

渗透测试60w字全套md笔记&#xff1a;夸克网盘分享 爆破RDP Hydra爆破RDP >hydra -l admin -P /root/Desktop/passwords -S 192.168.0.0 rdpNlbrute MSF开启 >run post/windows/manage/enable_rdp多用户登陆 Mimikatz设置允许多用户登录 >privilege::debug >t…

游戏开发设计模式之单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;其主要目的是确保一个类在整个程序的生命周期中只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。在游戏开发中&#xff0c;单例模式具有广泛的应用和重要的作用。 单例模式的…

Vue3-win7搭建vue3环境

Vue3-win7搭建vue3环境 官方要求的信息是是node.js 18.03以上。而我的环境&#xff1a;win7 x64&#xff0c; vscode 1.34。 参考网址&#xff1a; 0、基本的安装 https://blog.csdn.net/m0_49139268/article/details/126159171 a、这里有各种安装包的下载路径&#xff08;镜…

FedoSSL

题目&#xff1a;《Towards Unbiased Training in Federated Open-world Semi-supervised》 来源&#xff1a;ICML2023 注意比较与 ORCA 的区别 Abstract 联邦半监督学习&#xff08;FedSSL&#xff09;已经成为一种新范式&#xff0c;允许分布式客户端在稀缺的标记数据和丰富…

chapter08-面向对象编程(重写)day09

目录 302-方法重写介绍 303-方法重写细节 304-方法重写课堂练习1 305-方法重写课堂练习2 302-方法重写介绍 本类有这个方法就调用本类的&#xff0c;没有就向父类查找 303-方法重写细节 子类的形参列表、方法名称要和父类完全一致子类的返回类型&#xff08;String&#x…

【Hot100】LeetCode—200. 岛屿数量

目录 1- 思路DFS 深搜 2- 实现⭐200. 岛屿数量——题解思路 3- ACM 思路 题目连接&#xff1a;200. 岛屿数量 1- 思路 DFS 深搜 在遍历中对 res 结果进行 操作 。遇到一个陆地结果为 1 的地方&#xff0c; 就将他们直接填充为 0 思路 ① 先遍历&#xff0c;收集 res② 之后…

LTSPICE使用教程:入门指导

1.常用快捷键 1.鼠标左键选择&#xff0c;鼠标右键取消&#xff0c;F7移动元器件 2.空格键&#xff1a;最大化显示 3.旋转&#xff1a;CtrlR 4.撤销&#xff1a;F9 5.删除&#xff1a;F5 6.退出编辑状态&#xff1a;ESC 7.元器件的镜像&#xff1a;Ctrle 8.原理图页面和…

viewBinding的使用(android studio)

引入 在开发安卓软件的时候&#xff0c;我们会大量的使用点击事件。通常情况下&#xff0c;我们是这样做的&#xff1a;将在xml文件里把目标组件添加id属性&#xff0c;如下&#xff1a; 然后在activity里面通过findViewById(R.id.back) 得到一个对象&#xff0c;通过对象调用…

mac和windows上安装nvm管理node版本

NVM 是 node version manager 的缩写&#xff0c;它是一个用来管理电脑上 node 版本的命令行工具&#xff0c;在日常前端开发中是一个跟 node 一样会经常用到的工具&#xff0c;可以很方便的让我们快速切换不同的node版本。 mac 上安装 nvm 1、下载安装 nvm 下载安装可以直…

Facebook的区块链战略:如何在社交媒体中实现去中心化

随着区块链技术的发展&#xff0c;Facebook&#xff08;现Meta&#xff09;正积极探索如何将这一技术整合进其社交平台中&#xff0c;以提升用户体验和数据安全。区块链技术以去中心化、透明性和不可篡改性为特点&#xff0c;为社交媒体带来了新的可能性。本文将探讨Facebook在…

在VB.net中,LINQ有什么方法与属性

标题 在VB.net中&#xff0c;LINQ有什么方法与属性 正文 在VB.NET中使用LINQ&#xff08;Language Integrated Query&#xff09;&#xff0c;你可以利用一系列的方法和属性来查询和操作内存中的集合&#xff08;如数组、列表等&#xff09;以及数据库等数据源。LINQ提供了丰富…

OpenGL笔记二十之深度检测概念

OpenGL笔记二十之深度检测概念 —— 2024-08-25 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记二十之深度检测概念1.课程PPT截图2.运行3.代码 1.课程PPT截图 2.运行 3.代码 关键部分 main.cpp #include <iostream>#include "glfra…

【学习笔记】STM32F407探索者HAL库开发(三)IO分配

【学习笔记】STM32F407探索者HAL库开发&#xff08;三&#xff09;IO分配 1 STM32F407 IO资源分配表2 STM32F407ZGT6 引脚定义3 IO分配的重要性3.1 硬件设计优化3.2 软件编程3.3 系统性能提升 4 F1/F7/H7芯片的IO分配差异4.1 引脚数量和分组4.2 功能模式4.2.1 输入模式4.2.2 输…

7-6 分段函数2

计算分段函数&#xff0c;测试数据分别是-1、5、12。 输入格式: 输入一个数。 输出格式: 直接输出保留6位小数的结果&#xff0c;没有其它任何附加字符&#xff0c;没有宽度控制。 输入样例: 11输出样例: 0.999912输入样例: 7输出样例: 8.000000 #include <stdio.h…

java之类和对象2

封装的概念&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&#xff0c;仅对外公开接口来和对象进行 交互 。&#xff08;主要通过类和访问权限符进行封装&#xff09; 访问权限符的介绍&#xff1a; public:相同/不同包中的子类/非子类…

足球规则指南,快速入门一看就懂

保姆级足球规则指南&#xff0c;旨在帮助初学者快速入门&#xff0c;一看就懂。以下是精简而全面的指南&#xff1a; 一、比赛场地与球员 场地&#xff1a;足球比赛在长方形场地上进行&#xff0c;长度为101米&#xff0c;宽度为64米。场地两端设有球门&#xff0c;高2.44米&…

【git bash编码错误解决方案】启动conda环境时报错,其他terminal却正常

&#x1f50e;嘿&#xff0c;这里是慰慰&#x1f469;&#x1f3fb;‍&#x1f393;&#xff0c;会发各种类型的文章&#xff0c;智能专业&#xff0c;从事前端&#x1f43e; &#x1f389;如果有帮助的话&#xff0c;就点个赞叭&#xff0c;让我开心一下&#xff01;&#x1f…

2024网络安全学习路线 非常详细 推荐学习

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间&#xff0c;光语言都有几门&#xff0c;有些人会倒在学习 linux 系统及命令的路上&#…

MacOS安装 Python 和 PyCharm

MacOS安装 Python3.12.5 和 PyCharm 小阿呜有话说一、MacOS安装PythonPython官网下载 二、MacOS安装PyCharmPyCharm官网下载 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 小阿呜有话说 …