DS18B20驱动程序调试总结

发布者:SparklingSoul最新更新时间:2023-09-04 来源: zhihu关键字:DS18B20  驱动程序  调试总结 手机看文章 扫描二维码
随时随地手机看文章

DS18B20是一款精度比较好的温度传感器,最重要的是它通过一根导线,既完成通讯,又给芯片供电,在MCU引脚数量比较紧张的时候,确实是个不错的选择。这颗芯片看起来简单,但真正让它跑起来,从里面读出温度数据可没有想象的那么容易。这不,群里的Ryan Wang同学就被折磨得不行。难能可贵的是,在王同学终于搞定它之后,无私地分享出心得和代码。如果你觉得这篇文章能帮到更多的同学,就帮忙转发,或点个在看吧。


通过CUBE使能TIM2定时器,Clock Source使用internal Clock,MCU主频为32Mhz,故Prescaler=32-1=31,Counter Mode为UP,这里注意Counter Period 官方手册要求最低为1,经测试设置为2时,定时器更为准确。


完成以上配置后,需要在程序手动调整和增加功能代码:


1. Cube配置TIM2定时器的基础上,在程序编写delay_us(uint16_t us)函数,delay_us的精确度将直接影响DS18B20温度数据的读取结果。本程序使用了HAL库(CUBE勾选配置)


void delay_us(uint16_t us)

{

 /* 中断会打断微秒延时函数

  * 但计数器计数不会停

  * 防止计数器增加到65535之后重新开始计数

  */

    uint16_t differ=50000-us;

 

    HAL_TIM_Base_Start(&htim2);

    __HAL_TIM_SET_COUNTER(&htim2,differ);


    while(differ<50000)

    {

        differ=__HAL_TIM_GET_COUNTER(&htim2);

    }


    HAL_TIM_Base_Stop(&htim2);

}

2. 注意程序工程中DS18B20.H的定义,及DS18B20.C文件,(同文件夹下附件)其内部函数定义根据DS18B20官方手册进行操作,DS18B20为one wire 通讯,对时序的要求相对严格,DS18B20的数据通讯通过DS18B20的data管脚进行单片机通讯,主要流程为:

1. DS18B20初始化

2. DS18B20接入自检

3. DS18B20写0xcc(SKIP ROM)

4. 写0x44(通知传感器进行温度数据采集与转换)

5. DS18B2再次初始化

6. DS18B20再次接入自检

7. DS18B20写0xcc(SKIP ROM)(倒序即0011 0011,如下图左)

8. DS18B20写0xbe(通知传感器进行数传)(倒序0111 1101,下图右)

9. DS18B20读一个字节

10. DS18B20再读一个字节

11.数据的预处理



3. 以上每步操作都需要微秒级延时等待,参考DS18B20官方手册关于“DS18B20初始化与check”,“写0”,“写1”,“读0”,“读1”的具体时序要求,注意针对不同MCU的主频配置,在保证1微秒延时准确的前提下,具体的微秒延时将有所调整;特别注意在读时序时的延时,针对32MHZ的本机,在DS18B20.C中已做延时调整(参考正点原子DS18B20试验(72MHZ),使用示波器抓取各个阶段波形,结合DS18B20手册,对比调试,)若时序不对,则读数一直为0或者85。着重理解DS18B20_data管脚的输入和输出模式,拉高和拉低(如DS18B20标准电路要求在data管脚接上拉电阻,那么在管脚IN和OUT模式下,如未人为拉高或拉低,则管脚电平会自动拉高)。







关键字:DS18B20  驱动程序  调试总结 引用地址:DS18B20驱动程序调试总结

上一篇:单片机低功耗几点内容
下一篇:MCU复位和程序启动那些事

推荐阅读最新更新时间:2024-11-11 15:20

DS18B20温度格式转换
#include stdio.h #include stdint.h /* DS18B20温度格式转换 */ uint8_t tempIntPart ; uint8_t tempDecPart ; float convertToFloat(int16_t temperature) { float temp; temp = (float)temperature; temp /= 16.0f; return temp; } void splitIntPart(int16_t temperature) { uint8_t i; if (temperature & 0x8000) temper
[单片机]
AVR M16实验之六 DS18B20测温
/********************************************************************** * 文件名称: main.c * 程序作者: kidcao1987 * 程序版本: V1.0 * 功能描述: 装上LCD1602,在其上,显示当前的温度。 * 编译器:WinAVR-20090313 * 芯片:ATmega16,外部11.0592MHZ晶振 * 技术支持:http://bbs.cepark.com **********************************************************************/ #include #include
[单片机]
HD4478U显示LCD与51单片机驱动程序
#include SST89x5x4.H #include absacc.h #include intrins.h sbit LCDRSPIN = P3^7; sbit LCDRWPIN = P3^6; sbit LCDEPIN = P2^6; #define UCHAR unsigned char void delay(unsigned int i) { UCHAR j; for(i; i 0; i--) for(j = 200; j 0; j--); } /////////////////////////////// //控制LCD unsigned char XPOS,YPOS; //测
[单片机]
ds18b20 温度模块串口显示简单代码
今天晚上没事干编了一个极简的一个小程序,虽然简单但是还是很稳定的,连接也很简单,用最小系统板p0.0口接上ds18b20模块就可以了 #include reg51.h #include intrins.h #include stdio.h #include DS18B20.h #define OSC 11059200 //晶振频率 #define BAUDRATE 9600 //波特率 void main(void) { unsigned int i; unsigned char tmph,tmpl; Temp t; unsigned char strTemp ; //显示到屏幕的温度数据
[单片机]
<font color='red'>ds18b20</font> 温度模块串口显示简单代码
基于AT91RM9200的I/O驱动程序(linux)
#include linux/config.h #include linux/module.h #include linux/sched.h #include linux/slab.h #include linux/ioport.h #include linux/errno.h #include linux/kernel.h #include linux/fs.h #include linux/string.h #include linux/poll.h #include linux/init.h #include linux/devfs_fs_kernel.h #include linux/miscdevi
[单片机]
mini2440上DS18B20驱动程序(含简单测试)
ds18b20_drv.c #include linux/init.h #include linux/module.h #include linux/delay.h #include linux/kernel.h #include linux/moduleparam.h #include linux/init.h #include linux/types.h #include linux/fs.h #include mach/regs-gpio.h #include mach/hardware.h #include linux/cdev.h #include
[单片机]
AURIX™嵌入式软件增加了符合ASIL D和SIL-2标准的驱动程序,以支持AUTOSARv4.4.0
英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)通过在现有的AUTOSARv4.2.2 MCAL基础上增加对AUTOSARv4.4.0的支持,进一步扩展其AURIX™ TC3xx MCAL。这将加快OEM厂商的软件开发。针对ASIL D应用,MC-ISAR TC3xx路线图已更新,以提供符合ASIL D标准的驱动程序。通过即将推出的维护版2.25.0,该驱动程序将包含符合ASIL D标准的软件产品。2.30.0版本将提供对IEC 61508 SIL-2的支持。最新版本面向各个汽车领域的AUTOSAR应用,包括 发动机 、底盘、安全和车身,以及商业农用车、工业和船舶应用。 MC-ISAR AS440 EX
[汽车电子]
液晶显示器lcd1602驱动程序
#include lcd1602_driver.h #include msp430g2553.h #include typedef.h #ifndef _LCD_1602_ #define _LCD_1602_ //lcd1602的io #define LCD1602_WR_DATA_PORT P2OUT //数据输出端口 #define LCD1602_RD_DATA_PORT P2IN //数据输入端口 #define LCD_EN_SET { P1DIR |= BIT5 ; P1OUT |= BIT5; } //lcd使能设置 #define LCD_EN_CLR { P1DIR |= BIT5; P1OUT &= ~
[单片机]

推荐帖子

EEWORLD大学堂----MSP430——有源RFID的最佳选择
MSP430——有源RFID的最佳选择:https://training.eeworld.com.cn/course/348EEWORLD大学堂----MSP430——有源RFID的最佳选择
dongcuipin 单片机
好书共读——《硬件设计指南:从器件认知到手机基带设计》_第四、五、六部分
第二、三部分过了一遍,讲的是电源、运放等,仿真较多,放到后面再仿再写,先写后面的部分。第四部分:讲的是信号完整性记录一下阅读过程中的关键点4.1、怎么减小走线的环路电感减小信号路径和返回路径的自感(缩短PCB走线,或增加走线的线宽或线厚)或者增加信号与返回路径之间的互感(选择介质厚度更薄的PC层叠结构,让信号路径和返回路径更近,或者保证完整的参考平面)4.2、微带线与带状线PCB中的微带线是只有一个参考平面的传输线(表层走线)带状线是有两个参考平面
chrisrh 电源技术
AD7280 调不通
我现在在做AD7280电源摸块,用51的单片机,可是程序怎么也通不信,不知道是不是我的spi总线程序有问题,现在比较纠结,有哪位大神做个,帮帮忙。AD7280调不通电路程序都可能有问题啊首先要排除是不是硬件电路的问题然后看看SPI配置和芯片的需求是否一致没有用过这个芯片,具体也说不上来,不过根据我多年的经验,调试发生问题,绝大部分都是时序问题,本身SPI就有四种组合模式,主机跟从机通讯要遵循特定的模式,然后具体不同的芯片可能时序延迟上也有要求。你以为你单片机的程序没有错,但是可能
天凡一 ADI参考电路
天气热了,来电清凉的电子作品。
这几天天气大热啊,热到什么程度呢?大概也不清楚。借着手中的LanuchPad和OLED做个温度计玩玩。所谓无图无真相,先上图。先是显示效果图。没开空调之前。开了一会儿之后。空调设定的24°。整个全家福。右边的lanuchPad是打酱油的。左边的才是核心控制的。温度传感器用的AD7416,因为正好手里有。PCB也懒得做了,直接在芯片管脚上焊的,左上角。整个就是G2452+AD7416+OLEd。天气热了,来电清凉的电子作品。哈哈,那个OLED很好看。清凉!
deweyled 微控制器 MCU
error while loading shared libraries: libartsc.so.0解决办法
本帖最后由paulhyde于2014-9-1508:55编辑在linux(FC8)下运行linphone,出现了如下错误:errorwhileloadingsharedlibraries:libartsc.so.0:cannotopensharedobjectfile:Nosuchfileordirectory原因分析:由于系统缺少artsc软件包造成的解决办法:下载arts-1.0.3-1.i386.rpm,在linux终端下执行:#r
clark 电子竞赛
老师是这么教我们进修单片机的
看到不少网友都在问怎样提高自己的能力,我在这里想谈一下我自己当年的学习过程。我学的是计算机系的通讯工程专业,主要的发展方向是做计算机网络偏软件这一块,这点从我的毕业设计课题《宾馆客房管理系统》就能看出来。因为带到通讯,所以学校里也教数电模电单片机什么的。其中《单片机和通讯接口》这门课我学到了很多东西,可以说,整个大学觉得最有收获的就是这门课。我的老师上课很有特性,首先没有教材,理由是现在技术一日千里,等到教材出来就已经淘汰了。我们直接拿磁盘从老师的电脑上拷课件,然后打印。通常讲到单片机这
ssjatq 单片机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved