找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 611|回复: 7
收起左侧

DS18B20采集数据失败

[复制链接]
ID:1061677 发表于 2024-6-17 09:58 | 显示全部楼层 |阅读模式
主程序如下。目前数码管显示的数据是06666,这个是不正常的。这个程序是我仿照普中的DS18B20实验来做的,预期是用DS18B20测温,数码管显示数据,保留一位小数。
目前显示不正常,我首先是检查DS18B20初始化是否有问题,所以我加了一个指示灯,发现初始化是没有问题的。
所以说现在让我疑惑的有两点,第一点就是T_value = DS18B20_Read_T()*10;//保留一位小数,
我觉得问题是出现在这里,因为这里
/*
                if(T_value < 0)
                {
                        T_value = - T_value;
                        temp_buf[0] = 0x40; //-
                }
                else
                {
                        temp_buf[0] = 0x00; //不显示
                }
                */
我无论加不加注释,数码管要点亮的首位总是显示0。我不知道为什么会这样。
第二点是这一句temp_buf[3] = duan_table[T_value%1000%100/10]; //个位+小数点,加个小数点的话应该写成temp_buf[3] = duan_table[T_value%1000%100/10] | 0x80;(用的是共阴极数码管),但是这样写的话,这一位完全不亮。
我非常疑惑,恳请诸位大神指点迷津。

#include <REGX51.H>
#include "Delay.h"
#include <intrins.h>
#include "Smg.h"
#include "DS18B20.H"
#include "LED.h"
extern duan_table[];
void main(void)
{
        uchar i = 0;
        int T_value;
        uchar temp_buf[5];
        uint DS18B20_OK = 0;
       
        DS18B20_OK = DS18B20_Init();//DS18B20初始化
        if(DS18B20_OK)
                LED_OFF();
        else
                LED_ON();
        while(1)
        {
                i++;
                if(i%50 == 0) //每隔一段时间读取温度值,间隔时间要大于温度传感器转换时间
                        T_value = DS18B20_Read_T()*10;//保留一位小数
                /*
                if(T_value < 0)
                {
                        T_value = - T_value;
                        temp_buf[0] = 0x40; //-
                }
                else
                {
                        temp_buf[0] = 0x00; //不显示
                }
                */
                temp_buf[1] = duan_table[T_value/1000];
                temp_buf[2] = duan_table[T_value%1000/100];
                temp_buf[3] = duan_table[T_value%1000%100/10]; //个位+小数点
                temp_buf[4] = duan_table[T_value%1000%100%10];
                smg_display(temp_buf, 4);

        }
}


51hei图片_20240617095054.jpg

04_51_DS18B20_V1.0.1.zip

78.33 KB, 下载次数: 0

20-DS18B20温度传感器实验.zip

22.56 KB, 下载次数: 1

回复

使用道具 举报

ID:688692 发表于 2024-6-19 09:12 | 显示全部楼层
楼主可以先刷我的程序看看硬件有没有问题,然后再排查。
http://www.51hei.com/bbs/dpj-235842-1.html
回复

使用道具 举报

ID:427868 发表于 2024-6-21 07:01 | 显示全部楼层
    以下四句可以简化。
    temp_buf[1] = duan_table[T_value/1000];
    temp_buf[2] = duan_table[T_value%1000/100];
    temp_buf[3] = duan_table[T_value%1000%100/10]; //个位+小数点
    temp_buf[4] = duan_table[T_value%1000%100%10];
    简化为:
     temp_buf[1] = duan_table[T_value/1000];
     temp_buf[2] = duan_table[T_value/100%10];
     temp_buf[3] = duan_table[T_value/10%10];
     temp_buf[4] = duan_table[T_value%10];
    简化后代码会减小,运行也会快些,毕竟除法求余数比较耗时。
回复

使用道具 举报

ID:1109793 发表于 2024-6-21 08:58 | 显示全部楼层
刘佑红 发表于 2024-6-21 07:01
以下四句可以简化。
    temp_buf[1] = duan_table[T_value/1000];
    temp_buf[2] = duan_table[T_ ...
  1. for(j=4;j<255;j--){                          
  2.         temp_buf[j]=duan_table[T_value/%10];
  3.     T_value/=T_value//10;
  4.     }   
复制代码

这样是不是也行。
回复

使用道具 举报

ID:1109793 发表于 2024-6-21 13:11 | 显示全部楼层

代买里面怎么多了好几个/?
回复

使用道具 举报

ID:824490 发表于 2024-6-21 15:14 | 显示全部楼层

行不行试试就知道,但这行应该是不行的
  1. T_value/=T_value//10;
复制代码
回复

使用道具 举报

ID:1109793 发表于 2024-6-21 15:25 | 显示全部楼层
名字不是重点 发表于 2024-6-21 15:14
行不行试试就知道,但这行应该是不行的

很奇怪复制粘贴的居然多了好几个/
回复

使用道具 举报

ID:427868 发表于 2024-6-21 16:55 | 显示全部楼层

for(j=4;j<255;j--){                          
        temp_buf[j]=duan_table[T_value/%10];
    T_value/=T_value//10;
    }
以上几行是不行的,首先 for循环函数内j会始终小于255,不能跳出循环。另外temp_buf[j]=duan_table[T_value%10];    T_value=T_value/10;想得到什么结果?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表