stm32f103zet6 ds18b20

main.c

// main.c
#include "sys.h"
#include "ds18b20.h"int main(void){	uart_init(9600);delay_init();while(DS18B20_Init())	//DS18B20初始化	{printf("error");delay_ms(200);}while(1){printf("%4.2f\r\n",Get_Temp());}}

ds18b20.h

// ds18b20.h
#ifndef __DS18B20_H
#define __DS18B20_H 
#include "sys.h"   
//DS18B20引脚宏定义						
#define DS18B20_GPIO_PORT		GPIOB
#define DS18B20_GPIO_PIN		GPIO_Pin_12
#define DS18B20_GPIO_CLK   	RCC_APB2Periph_GPIOB
//输出状态定义
#define OUT 1
#define IN  0
//控制DS18B20引脚输出高低电平
#define DS18B20_Low  GPIO_ResetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)
#define DS18B20_High GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)		
u8 DS18B20_Init(void);//初始化DS18B20
short DS18B20_Get_Temp(void);//获取温度
void DS18B20_Start(void);//开始温度转换
void DS18B20_Write_Byte(u8 dat);//写入一个字节
u8 DS18B20_Read_Byte(void);//读出一个字节
u8 DS18B20_Read_Bit(void);//读出一个位
void DS18B20_Mode(u8 mode);//DS18B20引脚输出模式控制
u8 DS18B20_Check(void);//检测是否存在DS18B20
void DS18B20_Rst(void);//复位DS18B20   
float Get_Temp(void);
#endif

ds18b20.c

// ds18b20.c
#include "ds18b20.h"
#include "delay.h"			
void DS18B20_Rst(void)	   
{                 DS18B20_Mode(OUT); 	//SET OUTPUTDS18B20_Low; 				//拉低DQdelay_us(750);    	//拉低750usDS18B20_High; 			//DQ=1 delay_us(15);     	//15US
}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
/*
复位脉冲执行完之后,总线已经被拉高了;
此时,从机需要给总线拉高;
因此,逻辑是:主机切换为输入模式判断总线是否仍为高点平,如果超过200us,表示从机没反应,初始化失败;如果200us内,总线被从机拉低了,则开始计时拉低的时间,<240us初始化成功,超时则失败
*/
u8 DS18B20_Check(void) 	   
{   u8 retry=0;DS18B20_Mode(IN);	//SET  INPUT	 while (GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)&&retry<200){retry++;delay_us(1);};	 if(retry>=200)return 1;else retry=0;while (!GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN)&&retry<240){retry++;delay_us(1);};if(retry>=240)return 1;	    return 0;
}
//从DS18B20读取一个位
//返回值:1/0
u8 DS18B20_Read_Bit(void) 	 
{u8 data;DS18B20_Mode(OUT);	//SET OUTPUTDS18B20_Low; delay_us(2);DS18B20_High; DS18B20_Mode(IN);	//SET INPUTdelay_us(12);if(GPIO_ReadInputDataBit(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN))data=1;else data=0;	 delay_us(50);           return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
u8 DS18B20_Read_Byte(void)     
{        u8 i,j,dat;dat=0;for (i=1;i<=8;i++){j=DS18B20_Read_Bit();dat=(j<<7)|(dat>>1);}						    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(u8 ByteData)     {             u8 j;u8 LastBit;DS18B20_Mode(OUT);	//SET OUTPUT;for (j = 1;j <= 8;j++){//取最后一位 LastBit = ByteData&0x01;ByteData = ByteData >> 1;if (LastBit) {DS18B20_Low;	// Write 1delay_us(2);                            DS18B20_High;delay_us(60);             }else{DS18B20_Low;	// Write 0delay_us(60);             DS18B20_High;delay_us(2);                          }}
}
//开始温度转换
void DS18B20_Start(void) {   						               DS18B20_Rst();	   DS18B20_Check();	 DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0x44);	// convert
} //初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在    	 
u8 DS18B20_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE);	 //使能PORTA口时钟 GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;				//PORTA.6 推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);    //输出DS18B20_Rst();return DS18B20_Check();
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
short DS18B20_Get_Temp(void)
{u8 temp;u8 TL,TH;short tem;DS18B20_Start ();  			// ds1820 start convertDS18B20_Rst();DS18B20_Check();	 DS18B20_Write_Byte(0xcc);	// skip romDS18B20_Write_Byte(0xbe);	// convert	    TL=DS18B20_Read_Byte(); 	// LSB   TH=DS18B20_Read_Byte(); 	// MSB  if(TH>7){TH=~TH;TL=~TL; temp=0;					//温度为负  }else temp=1;				//温度为正	  	  tem=TH; 					//获得高八位tem<<=8;    tem+=TL;					//获得底八位tem=(float)tem*0.625;		//转换     if(temp)return tem; 		//返回温度值else return -tem;    
}void DS18B20_Mode(u8 mode)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE);	 //使能PORTA口时钟if(mode){GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;}else{GPIO_InitStructure.GPIO_Pin =  DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;}GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);
}
float Get_Temp(void){short temperature = 0;temperature = DS18B20_Get_Temp();	//读取温度float temp = (float)temperature/10;return  temp;
}

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

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

相关文章

Unity 读Excel,读取xlsx文件解决方案

Unity读取表格数据 效果&#xff1a; 思路&#xff1a; Unity可以解析Json&#xff0c;但是读取Excel需要插件的帮助&#xff0c;那就把这个功能分离开&#xff0c;读表插件就只管读表转Json&#xff0c;Unity就只管Json解析&#xff0c;中间需要一个存储空间&#xff0c;使用…

通过无障碍服务(AccessibilityService)实现Android设备全局水印显示

一、无障碍功能简介 首先我们先来了解下无障碍功能的官方介绍&#xff1a; 无障碍服务仅应用于帮助残障用户使用 Android 设备和应用。它们在后台运行&#xff0c;并在触发 AccessibilityEvents 时接收系统的回调。此类事件表示用户界面中的某些状态转换&#xff0c;例如焦点已…

查看vue的所有版本号和已安装的版本

1.使用npm查看Vue的所有版本&#xff1a; npm view vue versions2.查看项目中已安装的 Vue.js 版本 npm list vue

【鸿蒙NEXT】鸿蒙里面类似iOS的Keychain——关键资产(@ohos.security.asset)实现设备唯一标识

前言 在iOS开发中Keychain 是一个非常安全的存储系统&#xff0c;用于保存敏感信息&#xff0c;如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同&#xff0c;Keychain 提供了更高的安全性&#xff0c;因为它对数据进行了加密&#xff0c;并且只有经过授权的应用程序才…

js ul li 事件委托

<ul><li>1111111111</li><li>2222222222</li><li>3333333333</li><li>4444444444</li> </ul>常规的 li 绑定点击事件 document.querySelectorAll(ul li).forEach((li) > {li.addEventListener(click, functio…

vue 嵌套el-dialo,当内层的弹窗弹出时,整个页面被遮罩

活不多说&#xff0c;直接上问题 当在页面上&#xff0c;点击出现第一个弹窗&#xff0c;然后在弹窗里面&#xff0c;点击在再出现一个弹窗时&#xff0c;就是如下效果。 查看Html,出现了遮罩层 Vue的建议是&#xff0c;不建议嵌套 Dialog&#xff0c;但实际上肯定存在嵌套 …

在基于Centos7的服务器上启用【Gateway】的【Clion Nova】(即 ReSharper C++ 引擎)

1. 检查启动报错日志&#xff0c;目录在 ~/.cache/JetBrains/CLion202x.x.x/log/backend.202x-xx-xx_xxxx.xxxx-err.log 2. 大致可能有两种报错 a. Process terminated. Couldnt find a valid ICU package installed on the system. 这个报错只需要装一下 libicu-devel 包即可…

短视频是如何一步步“蚕食”我们大脑的?

点击上方△腾阳 关注 转载请联系授权 你好&#xff0c;我是腾阳。 今天我们将深入探讨短视频是如何「蚕食」我们的大脑。 首先问下自己&#xff0c;你有多久没有看完一篇长文了&#xff1f; 你是否曾在清晨阳光中&#xff0c;被手机屏幕上短视频图标吸引&#xff0c;而忘记…

1、Jmeter、jdk下载与安装

1、访问官网&#xff0c;点击下载Jmeter http://jmeter.apache.org/ 2、在等待期间&#xff0c;下载对应的Java https://www.oracle.com/cn/java/technologies/downloads/#jdk23-windows 3、全部下载好&#xff0c;先安装JDK ![在这里插入图片描述](https://i-blog.csdnimg…

Hive刷分区MSCK

一、MSCK刷分区 我们平时通常是通过alter table add partition方式增加Hive的分区的&#xff0c;但有时候会通过HDFS put/cp命令或flink、flum程序往表目录下拷贝分区目录&#xff0c;如果目录多&#xff0c;需要执行多条alter语句&#xff0c;非常麻烦。Hive提供了一个"…

云手机+Facebook:让科技与娱乐完美结合

移动互联网时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;早已成为企业、品牌和组织竞相角逐的营销阵地。而云手机的出现&#xff0c;则为Facebook营销注入了新的活力&#xff0c;其独特的优势让营销活动更加高效、精准且灵活。本文将深入探讨云手机在Fa…

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…

solr9.7 单机安装教程

1.环境要求:jdk11以上 2.下载wget https://dlcdn.apache.org/solr/solr/9.7.0/solr-9.7.0.tgz 3.解压 4.修改solr.in.sh配置 5.启动命令 bin/solr start 6.创建core bin/solr create -c <core名称> 注意:用solr ui界面创建&#xff0c;会提示找不到solrconfig.xml和m…

MySQLOCP考试过了,题库很稳,经验分享。

前几天&#xff0c;本人参加了Oracle认证 MySQLOCP工程师认证考试 &#xff0c;先说下考这个证书的初衷&#xff1a; 1、首先本人是从事数据库运维的&#xff0c;今年开始单位逐步要求DBA持证上岗。 2、本人的工作是涉及数据库维护&#xff0c;对这块的内容比较熟悉&#xff…

【MySQL】踩坑笔记——保存带有换行符等特殊字符的数据,需要进行转义保存

问题描述 从DBeaver中导出了部分业务数据的 insert sql&#xff0c;明明在开发、测试环境都可以一把执行通过&#xff0c;却在预发环境执行前的语法检查失败了&#xff0c;提示有SQL语法错误。 这条SQL长这样&#xff0c;default_sql是要在odps上执行的sql语句&#xff0c;提…

计算机网络 (8)物理层的传输方式

一、串行传输与并行传输 串行传输 定义&#xff1a;串行传输是一种数据传输方式&#xff0c;指的是逐位地按照顺序传输数据。在串行传输中&#xff0c;数据位逐个按照一定的顺序进行传输&#xff0c;可以通过单条线路或信道进行。特点&#xff1a; 逐位传输&#xff1a;串行传输…

springboot506基于Springboot的小区疫情购物系统录(论文+源码)_kaic

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

window如何将powershell以管理员身份添加到右键菜单?(按住Shift键显示)

window如何将powershell以管理员身份添加到右键菜单&#xff1f; 在 Windows 中&#xff0c;将 PowerShell 以管理员身份添加到右键菜单&#xff0c;可以让你在需要提升权限的情况下快速打开 PowerShell 窗口。以下是详细的步骤&#xff0c;包括手动编辑注册表和使用注册表脚本…

从零开始开发纯血鸿蒙应用之逻辑封装

从零开始开发纯血鸿蒙应用 一、前言二、逻辑封装的原则三、实现 FileUtil1、统一的存放位置2、文件的增删改查2.1、文件创建与文件保存2.2、文件读取2.2.1、读取内部文件2.2.2、读取外部文件 3、文件删除 四、总结 一、前言 应用的动态&#xff0c;借助 UI 响应完成&#xff0…

从0开始的opencv之旅(1)cv::Mat的使用

目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒&#xff0c;但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理&#xff0c;这样在查找问题&#xff0c;或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…