蓝桥杯单片机DS18b20单总线测温模块常见问题解决

文章详细分析了DS18b20单总线温度传感器在使用中出现的温度跳变、开机显示85.00、温度不刷新等问题,指出这些问题主要是由于单片机中断影响时序、温度转换延迟和延时函数不准确导致的,并提供了相应的解决思路和代码示例,包括优化单总线读写操作和调整延时函数以适应不同型号的单片机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝桥杯单片机DS18b20单总线测温模块常见问题解决

有道是:“溪水声声留我住,梅花朵朵唤人回”

DS18b20测温模块作为一个比较简单、稳定的蓝桥杯单片机外设模块,

使用时却经常出现各种问题,总是让我们不禁三番多次回顾其基础知识,

却总也摸不着头脑,

那本文也许就是你的救星,你的百度搜索也将到此截止。

DS18B20是单总线数字化温度传感器,应用非常广泛。

它输出的是数字信号,同时具有体积小,硬件资源耗费少,抗干扰能力强,精度高等特点。

但我们在使用的时候它显得并不“稳定”,总是会出现许多问题,例如:

1.DS18b20温度显示会跳动、跳变

2.DS18b20开机显示85.00之类的

3.DS18b20一直显示35.93度,且温度不刷新

本文将分析以上问题的原理以及提供解决思路。

目录

1.DS18b20温度显示会跳动、跳变

2.DS18b20开机显示85.00之类的

3.DS18b20一直显示35.93度,且温度不刷新

#DS18B20的温度转换与读取流程


1.DS18b20温度显示会跳动、跳变

现象:例如需要显示的温度为:26.1,而数码管显示在26.1和3.5

        (或者其他的一些不该出现的值)之间来回跳变。
原因: 没有考虑到单片机进入中断对onewire时序的影响。

                造成时序紊乱,读出来的温度值自然是乱的。

 解决:在官方给出的驱动必要处加上EA = 0;

//通过单总线向DS18B20写一个字节
void Write_DS18B20(unsigned char dat)
{
unsigned char i;
EA = 0;
for(i=0;i<8;i++)
{
    DQ = 0;
    DQ = dat&0x01;
    Delay_OneWire(5);
    DQ = 1;
    dat >>= 1;
}
    Delay_OneWire(5);
    EA = 1;
}

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
EA = 0;
for(i=0;i<8;i++)
{
    DQ = 0;
    dat >>= 1;
    DQ = 1;
if(DQ)
{
    dat |= 0x80;
}	    
Delay_OneWire(5);
}
EA = 1;
return dat;   
}

2.DS18b20开机显示85.00之类的

原因:因为温度传感器的温度转换需要一定的时间,所以刚一开始温度转换然后紧接着读取温度,再显示出来,他读取的温度便是上一次转换的结果,由于ds18b20初始温度值为85,所以这里的“上一次转换的结果”就是85.

解决方法

在程序初始化的部分加上

    Read_Temperature();//此时读取的温度值为默认的85

    Delay_1ms(750);//等待上一个read函数温度转换完成

   Read_Temperature();

//此时再读取的温度值就变成了第一个read函数转换完成的温度值

先读,再延时较长时间,在进行后续要求的读取

3.DS18b20一直显示35.93度,且温度不刷新

原因

最基础的原因:用标志刷新读取手法时 标志位 数据类型容量溢出导致计数不到那个值,比如要计数到500的,但定义的count是char类型的,这根本不可能计数到500因为到255就溢出了

时序原因

DS18B20最高具有12为精度(默认模式),分辨率达到0.0625摄氏度,且外围电路极其简单,甚至可以不接VCC,就靠数据流吊着就能工作。当然它工作时时序可没有那么简单,稍有不慎(延时错误),整个工作时序就混乱了,因此准确把每次延时至关重要。

解决方法:检查时序

比赛方提供的驱动程序中有单总线驱动,官方给配的,十有八九好使,不过我在用的过程中却发现有时都回来数据是错的,温度没读对,在仔细研究后发现,官方给的驱动是针对STC89C52的,其中给的延时函数如下:

 而我们实际用的芯片是IAP15系列,作为1T单片机,指令执行速度是12T单片机的12倍,那么上面这个简陋延时函数实际上是以原来的1/12时间就执行完了,这个延时在DS18B20中能够正常使用吗?当然不能,因此在上述函数基础上进行改进:

 

#DS18B20的温度转换与读取流程

【1】DS18B20复位

【2】写入字节0xcc,跳过ROM指令

【3】写入字节0x44,开始温度转换

【4】延时700~900ms

【5】DS18B20复位

【6】写入字节0xcc,跳过ROM指令

【7】写入字节0xbe,读取高速暂存器

【8】读取暂存器第0字节,即温度数据的LSB

【9】读取暂存器第1字节,即温度数据的MSB

【10】DS18B20复位,表示读取数据结束

【11】将LSB和MSB整合成为一个16位数据

【12】判断读取结果的符号,进行正负温度的数据处

 

### 蓝桥杯比赛中的温度传感器相关题目解析 在蓝桥杯竞赛中,涉及硬件设备的应用编程是一个常见的主题。其中,关于温度传感器的相关题目通常会考察选手对于数据采集、处理以及控制逻辑的理解能力。 #### 数据读取与转换 温度传感器的核心功能在于实时监测环境温度并将其转化为可被计算机识别的数据信号。例如,在某些赛题中可能要求实现DS18B20这样的数字温度计接口程序[^1]。这类器件通过单总线协议传输信息,因此编写驱动代码时需要注意初始化序列、发送命令字节以及接收测量结果的过程。 ```c #include <stdio.h> #include <wiringPi.h> #define ONE_WIRE_PIN 7 // GPIO pin number used for one-wire communication. void init_ds18b20() { pinMode(ONE_WIRE_PIN, OUTPUT); digitalWrite(ONE_WIRE_PIN, LOW); delayMicroseconds(480); digitalWrite(ONE_WIRE_PIN, HIGH);delayMicroseconds(60); } float read_temperature(){ int raw_data; float celsius; /* Code to communicate with DS18B20 and fetch the temperature data */ return celsius; } ``` 上述C语言片段展示了如何利用Wiring Pi库来操作树莓派上的GPIO引脚完成对DS18B20的简单配置[^2]。实际比赛中还需要考虑错误检测机制以确保通信可靠性。 #### 控制算法设计 除了基本的数据获取之外,很多情况下还会涉及到基于当前测得温湿度值执行特定动作的需求。比如当室内气温超过设定阈值时启动风扇降温或者记录异常情况到日志文件里等等。这就需要用到条件判断语句配合循环结构形成完整的业务流程描述[^3]。 ```python while True: temp = get_current_temp() if temp > THRESHOLD_TEMP: turn_on_fan() log_event(f"High Temperature Alert! Current Temp:{temp}") sleep(POLL_INTERVAL) ``` 此Python伪码体现了持续监控场景下的一种典型做法——周期性查询最新状态并与预定义标准对比决定下一步行动方向[^4]。 #### 性能优化考量 针对嵌入式平台开发而言,资源利用率始终是个重要议题。所以在解决包含温度传感元件在内的各类工程实践类考题过程中也应重视效率方面的改进措施。这包括但不限于减少不必要的I/O操作次数、选用更高效的数值计算方法等方面的工作[^5]。 ---
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NULL指向我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值