找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1521|回复: 4
收起左侧

求大佬看看我的51单片机获取DS18B02温度传感器代码哪里出错了

[复制链接]
ID:915152 发表于 2021-5-3 04:23 | 显示全部楼层 |阅读模式
看了文档和官方教程视频后自己写了一个,但是一直出错,代码和官方的逐行分析了没发现错误的地方, 获取的数据tmp一直为1593不变。想了一天楞是没有想出来,欲哭无泪,,,求大神指点一下小小白,不胜感激!

main.zip

1.05 KB, 下载次数: 4

我的程序

普中51单片机开发攻略--A2-splitted.pdf

812.59 KB, 下载次数: 5

硬件资料

回复

使用道具 举报

ID:96682 发表于 2021-5-3 09:06 来自手机 | 显示全部楼层
把代码帖出来不是更好么,这样无需解压台式机 手机版都能看到
回复

使用道具 举报

ID:390416 发表于 2021-5-3 12:23 | 显示全部楼层
看我的贴子 参考
回复

使用道具 举报

ID:77840 发表于 2021-5-3 14:25 | 显示全部楼层
帮楼主贴出来代码如下:
#include <reg52.h>
#include <intrins.h>

typedef unsigned char u8;
typedef unsigned int u16;
#define Led P0

sbit Line = P3 ^ 7;
sbit L1 = P2 ^ 2;
sbit L2 = P2 ^ 3;
sbit L3 = P2 ^ 4;
u8 zifu[16] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
               0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

void delay(u16 i)
{
    while (i--)
        ;
}

void delay_10us()
{
    u8 a, b;
    for (a = 1; a > 0; a--)
        for (b = 1; b > 0; b--)
            ;
}

void delay_100us()
{
    u8 a, b;
    for (a = 10; a > 0; a--)
        for (b = 10; b > 0; b--)
            ;
}

u8 init() //初始化时序
{
    u8 i = 0;
    Line = 0;
    delay_100us();
    delay_100us();
    delay_100us();
    delay_100us();
    delay_100us();
    Line = 1;
    delay_10us();
    delay_10us();
    delay_10us();
    delay_10us();
    while (Line)
    {
        delay_10us();
        delay_10us();
        delay_10us();
        i++;
        if (i > 16)
            return 0;
    }
    return 1;
}

void sendbyte(u8 dat)   //写时序
{
    u8 i;
    for (i = 0; i < 8; i++)
    {
        Line = 0;
        _nop_();
        _nop_();
        Line = dat & 0x01;
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        Line = 1;
        _nop_();
        _nop_();
        dat >>= 1;
    }
}

u8 readbyte()   //读时序
{
    u8 i = 0, dat = 0;
    for (i = 0; i < 8; i++)
    {
        Line = 0;
        _nop_();
        _nop_();
        Line = 1;
        _nop_();
        _nop_();
        delay_10us();
        dat <<= 1;
        dat |= Line;
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
    }
    return dat;
}

u16 gettemp()   //转化为具体的温度数字
{
    u16 tmp = 0;
    u16 c = 2047;

    u8 tl, th;

    init(); // 复位
    sendbyte(0xcc); //skip rom
    sendbyte(0x44); //转换命令
    delay_10us();

    init(); //
    sendbyte(0xcc);//
    sendbyte(0xbe);//读存储器命令
    delay_10us();
   
    tl = readbyte();
    th = readbyte();
   
  //以下是数据处理,我用官方的程序比对过了,没有问题,出问题的在上面与 ds18b20 通信上  
    tmp = th;
    tmp << 8;
    tmp |= tl;
    tmp &= c;
    tmp *= 6.25;
    return tmp;
}

void printled(u16 dat)
{
    u8 q = dat / 1000;
    u8 b = dat % 1000 / 100;
    u8 s = dat % 100 / 10;
    u8 g = dat % 10;
    L1 = L2 = L3 = 1;
    Led = zifu[q];
    delay(100);
    Led = 0;
    L3 = L2 = 1;
    L1 = 0;
    Led = zifu[b];
    delay(100);
    Led = 0;
    L3 = L1 = 1;
    L2 = 0;
    Led = zifu[s];
    delay(100);
    Led = 0;
    L3 = 1;
    L2 = L1 = 0;
    Led = zifu[g];
    delay(100);
    Led = 0;
}

void main()
{
    L1 = L2 = L3 = 1;
    Led = zifu[8];
    while (1)
    {
        printled(gettemp());
    }
}
回复

使用道具 举报

ID:77840 发表于 2021-5-3 14:30 | 显示全部楼层
对比一下文档和楼主程序部分,我觉得是读的时候不一样* 函 数 名 : Ds18b20ReadByte
* 函数功能 : 读取一个字节
* 输 入 : 无
* 输 出 : 无
*****************************************************************
**************/
uchar Ds18b20ReadByte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
DSPORT = 0;//先将总线拉低 1us
i++;
DSPORT = 1;//然后释放总线
i++;
i++;//延时 6us 等待数据稳定
bi = DSPORT; //读取数据,从最低位开始读取
/*将 byte 左移一位,然后与上右移 7 位后的 bi,注意移动之后移掉
那位补 0。*/
byte = (byte >> 1) | (bi << 7);
i = 4; //读取完之后等待 48us 再接着读取下一个数
while(i--);
}
return byte;
}
**********下面是楼主的代码
u8 readbyte()   //读时序
{
    u8 i = 0, dat = 0;
    for (i = 0; i < 8; i++)
    {
        Line = 0;
        _nop_();
        _nop_();
        Line = 1;
        _nop_();
        _nop_();
        delay_10us();
        dat <<= 1;
        dat |= Line;
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
        delay_10us();
    }
    return dat;
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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