void Init_DS18B20(void) { unsigned char x=0; DQ = 1; Delayns(8); DQ = 0; Delayns(80); DQ = 1; Delayns(14); x=DQ; Delayns(20); } unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for(i=0;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; Delayns(4); } return(dat); } void WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=0;i>0;i--) { DQ = 0; DQ = dat&0x01; Delayns(5); DQ = 1; dat>>=1; } } unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt = 0; Init_Ds18B20(); WriteOneChar(0xCC); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE); a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; t=tt*10+0.5; return(t); }

时间: 2023-10-22 07:09:44 浏览: 39
这段代码是使用单总线DS18B20温度传感器读取温度的代码,具体的函数包括: 1. Init_DS18B20():初始化DS18B20传感器,包括发送复位信号,等待一定时间,读取DS18B20的响应等。 2. ReadOneChar():读取单总线上DS18B20传感器发送的数据。 3. WriteOneChar():向单总线上的DS18B20传感器写入数据。 4. ReadTemperature():读取DS18B20传感器的温度数据,并计算出对应的温度值。 其中,Init_DS18B20() 和 ReadOneChar() 函数用来实现单总线通信协议,WriteOneChar() 用来向DS18B20传感器写入指令,ReadTemperature() 则用来读取DS18B20传感器的温度数据,并进行相关的计算,得到对应的温度值。
相关问题

解释一下这串代码void delay_18B20(uint i) { while(i--); } void Init_DS18B20(void) { uchar x=0; DQ =1; delay_18B20(8); DQ =0; delay_18B20(80); DQ =1; delay_18B20(14); x=DQ; delay_18B20(20); } uchar ReadOneChar(void) { unsigned char i=0; unsigned char dat0 = 0; for(i=8;i>0;i--){ DQ= 0; dat0>>=1; DQ= 1; if(DQ) dat0|=0x80; delay_18B20(4); } return(dat0); }

这段代码是用来操作DS18B20温度传感器的函数。 - `delay_18B20`函数用于实现延时功能,参数`i`表示延时的次数。函数内部使用了一个简单的`while`循环,通过不断递减`i`的值来实现延时。 - `Init_DS18B20`函数用于初始化DS18B20温度传感器。在初始化过程中,通过设置`DQ`引脚的电平和调用`delay_18B20`函数来实现相应的延时。具体的初始化步骤包括: - 将`DQ`引脚设置为高电平。 - 延时一段时间(约8微秒)。 - 将`DQ`引脚设置为低电平。 - 延时一段时间(约80微秒)。 - 将`DQ`引脚设置为高电平。 - 延时一段时间(约14微秒)。 - 读取`DQ`引脚的电平,并将结果保存在变量`x`中。 - 延时一段时间(约20微秒)。 - `ReadOneChar`函数用于从DS18B20温度传感器读取一个字节的数据。在读取过程中,通过控制`DQ`引脚的电平和调用`delay_18B20`函数来实现相应的延时。具体的读取步骤包括: - 使用一个循环,循环8次,每次读取一个位。 - 将`DQ`引脚设置为低电平,用于发送读取命令。 - 将要读取的数据位右移一位。 - 将`DQ`引脚设置为高电平,用于读取数据位的值。 - 如果`DQ`引脚为高电平,则将要读取的数据位的最高位设为1;否则设为0。 - 延时一段时间(约4微秒)。 - 返回读取到的数据字节。 需要注意的是,代码中使用了一些未定义的类型和变量,如`uchar`、`DQ`,这些可能是用户自定义的类型或者来自其他地方的定义。在理解代码功能时,需要对这些类型和变量进行适当的替换或定义。同时,还需要确保正确地连接和配置DS18B20温度传感器以及相应的引脚。

void Init_DS18B20(void) { unsigned char x=0; DQ=1; Delayns(8); DQ=0; Delayns(80); DQ=1; Delayns(14); x=DQ; Delayns(20); } unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat=0; for(i=8;i>0;i--) { DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0x80; Delayns(4); } return(dat); } void WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; Delayns(5) ; DQ=1; dat>>=1; } } unsigned int ReadTemperature(void) { unsigned char a =0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0XCC); WriteOneChar(0X44); Init_DS18B20(); WriteOneChar(0XCC); WriteOneChar(0XBE); a=ReadOneChar(); b= ReadOneChar(); t=b; t<<=8; t=t|a; tt=t0.0625; t=tt10+0.5; return(t); }请帮我看看代码有没有错,为什么我读的有问题。我如果要读温度的话,怎么读

根据你提供的代码来看,这段代码主要是用来读取DS18B20温度传感器的温度值的。下面是一些可能导致读取温度有问题的原因: 1. DS18B20传感器的连接方式是否正确?DS18B20传感器应该连接到微控制器的GPIO引脚,并且需要使用上拉电阻将引脚拉高。在代码中,DQ引脚对应的GPIO引脚需要设置为输出模式,并且在需要读取数据时需要将其设置为输入模式。 2. DS18B20传感器的工作电压是否正确?DS18B20传感器的工作电压一般为3V到5V之间,需要根据具体的传感器和电路进行设置。 3. 温度值的转换是否正确?在代码中,读取到的温度值需要进行转换才能得到实际温度值。具体转换方法可以参考DS18B20的数据手册。 如果你要读取温度值,可以调用`ReadTemperature()`函数来实现。该函数会返回一个unsigned int类型的温度值,单位为0.1摄氏度。例如,如果返回值为250,表示实际温度为25.0摄氏度。该函数的调用流程如下: 1. 调用`Init_DS18B20()`函数初始化DS18B20传感器。 2. 调用`WriteOneChar(0XCC)`函数发送跳过ROM操作码。 3. 调用`WriteOneChar(0X44)`函数发送温度转换操作码。 4. 调用`Init_DS18B20()`函数重新初始化DS18B20传感器。 5. 调用`WriteOneChar(0XCC)`函数发送跳过ROM操作码。 6. 调用`WriteOneChar(0XBE)`函数发送读取温度值操作码。 7. 调用`ReadOneChar()`函数读取温度值的低8位。 8. 调用`ReadOneChar()`函数读取温度值的高8位。 9. 将读取到的温度值转换成实际温度,并返回结果。 需要注意的是,读取温度值的过程中可能会存在误差,因此需要根据具体情况进行校准。

相关推荐

最新推荐

recommend-type

一种基于DS18B20的温度采集系统设计

在数字式温度传感器的内部一般包含有温度传感器、接口电路、存储器(或寄存器)、信号处理器和A/D转换器。与传统的模拟温度传感器相比,数字式温度传感器在器件微小化、抗干扰能力、可靠性、分辨率以及精度方面都具有...
recommend-type

DS18B20数据手册-中文版(带目录)

使用参见:https://handsome-man.blog.csdn.net/article/details/104530051
recommend-type

51单片机DS18B20测量温度实验

实验任务 用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。
recommend-type

基于89C51和DS18B20的温度采集系统设计

本系统是以89C51单片机为控制核心技术的温度采集控制系统,介绍了与DS18B20温度传感器组成温度采集系统的设计方案。本温度采集系统的下位机采用89C51单片机为主控制器,利用DS18B20温度传感器进行溫度测量,采用...
recommend-type

基于AT89C51和DS18B20的最简温度测量系统

本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。