Proteus仿真DS18B20温度传感器不成功——通过调试时序解决

最近在用Proteus8.9仿真51单片机的一些实验程序时出现了一个问题:仿真DS18B20不成功,现象如下:
请添加图片描述

晶体管显示的数值固定不变,我把这个程序放到开发板上去跑,就没有半点问题。后来了解到,由于DS18B20的时钟线和数据线共用,所以它对时序要求很严格。比如初始化时序:

主机输出低电平,保持低电平 时间至少 480us(该时间的时间范围可以从 480 到 960 微秒),以产生复位脉冲。

我的问题也就是出在初始时序上,下面是初始的实验例程代码(普中科技51开发板配套实验代码),只截取了DS18B20初始函数:

uchar Ds18b20Init()
{
	uchar i;
	DSPORT = 0;			 //将总线拉低480us~960us
	i = 70;	
	while(i--);//延时642us
	DSPORT = 1;			//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
	i = 0;
	. . .
}

可以看到代码用while(i--)实现延时,这种延时方法换了平台就不准了,更别说仿真了。不过我依旧想使用它来延时,但需要适当的调试,起初在网上看到有人说i=73可以,我改了后还是不行。

最后,只能使用Keil调试了:

  1. 首先打开代码工程,在要调试的延时函数前后设置断点。(设置方法为单击该行最左边的空白处或右键选择添加断点)
    在这里插入图片描述
  2. 接着点击Debug调试按钮(或者按Ctrl+F5),开始调试。
    在这里插入图片描述
  3. 点击run选项开始运行,程序会卡在第一个断点,此时记录一下sec的时间,我的程序为0.00044900,即449us,接着点击Step out跳过一个函数,直接到达while(i--)结束的地方,此时再记录运行的时间,我的程序为875us。876-449=427,DS18B20初始化中要求的最小拉低时间为480,427小于480,所以不能完成初始化,程序也就无法正常读取温度数据。请添加图片描述
  4. 知道了延时的时间不够,现在只需要适当地增大i的值即可(记得重新编译再调试),我增大到80才勉强达到480us的延时。

把程序烧录到单片机后,开启仿真,终于能正常仿真了:
请添加图片描述

  • 32
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 33
    评论
好的,以下是一个基于 Arduino Uno 板和 DS18B20 温度传感器,并且使用 SSD1306 OLED 显示屏的示例代码,可以获取温度并在 OLED 上显示: 首先,您需要安装 Adafruit_SSD1306 库和 OneWire 库。您可以在 Arduino IDE 中选择菜单 "工具" > "管理库",然后搜索并安装这两个库。 接下来,将 DS18B20 温度传感器连接到 Arduino Uno 板: - 将 DS18B20 的 VCC 引脚连接到 Arduino 的 5V 引脚 - 将 DS18B20 的 GND 引脚连接到 Arduino 的 GND 引脚 - 将 DS18B20 的 DATA 引脚连接到 Arduino 的数字引脚 2 最后,将 SSD1306 OLED 显示屏连接到 Arduino Uno 板: - 将 OLED 的 VCC 引脚连接到 Arduino 的 5V 引脚 - 将 OLED 的 GND 引脚连接到 Arduino 的 GND 引脚 - 将 OLED 的 SCL 引脚连接到 Arduino 的数字引脚 5 - 将 OLED 的 SDA 引脚连接到 Arduino 的数字引脚 4 接下来是示例代码: ```c++ #include <OneWire.h> #include <DallasTemperature.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // 定义 DS18B20 数据引脚 #define ONE_WIRE_BUS 2 // 初始化 OneWire 和 DallasTemperature 库 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); // 定义 OLED 显示屏相关参数 #define OLED_RESET 4 Adafruit_SSD1306 display(OLED_RESET); void setup() { // 初始化串口通信 Serial.begin(9600); // 初始化 OLED 显示屏 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(1); display.setCursor(0, 0); display.println("Temperature:"); display.display(); // 初始化 DS18B20 温度传感器 sensors.begin(); } void loop() { // 获取当前温度 sensors.requestTemperatures(); float temperature = sensors.getTempCByIndex(0); Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" °C"); // 在 OLED 显示屏上显示当前温度 display.clearDisplay(); display.setCursor(0, 0); display.println("Temperature:"); display.setCursor(0, 10); display.print(temperature); display.print(" "); display.print((char)247); display.print("C"); display.display(); // 延时 2 秒 delay(2000); } ``` 请根据您的具体硬件和传感器类型进行修改。另外,您还需要在计算机上安装 SSD1306 OLED 显示屏库和串口通信软件(如 Arduino IDE 或 CoolTerm),以便接收并查看发送的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小辉_Super

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

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

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

打赏作者

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

抵扣说明:

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

余额充值