找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1709|回复: 10
打印 上一主题 下一主题
收起左侧

这个单片机DS18B20时序是什么问题啊,延时怎么改啊

[复制链接]
跳转到指定楼层
楼主
ID:1058641 发表于 2023-3-17 20:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请大佬们看一下

/*
  单片机程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
        while(t--);
}

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

//从DS18B20读取一个字节
unsigned char Read_DS18B20(void)
{
        unsigned char i;
        unsigned char dat;

        for(i=0;i<8;i++)
        {
                DQ = 0;
                dat >>= 1;
                DQ = 1;
                if(DQ)
                {
                        dat |= 0x80;
                }            
        Delay_OneWire(5);
        }
        return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
          bit initflag = 0;

          DQ = 1;
          Delay_OneWire(100);
          DQ = 0;
          Delay_OneWire(80);
          DQ = 1;
          Delay_OneWire(100);
    initflag = DQ;     
          Delay_OneWire(5);

          return initflag;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:155507 发表于 2023-3-18 12:17 | 只看该作者
改成这样试试

//DS18B20设备初始化
bit init_ds18b20(void)
{
          bit initflag = 0;

          DQ = 1;                //DQ复位
          Delay_OneWire(8); //稍做延时
          DQ = 0;             //单片机将DQ拉低
          Delay_OneWire(80);   //精确延时,大于480us~960us
          DQ = 1;                    //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
          Delay_OneWire(15);
          initflag = DQ;            //稍做延时后,如果initflag=0则初始化成功,initflag=1则初始化失败
          Delay_OneWire(20);

          return initflag;
}
回复

使用道具 举报

板凳
ID:1058641 发表于 2023-3-18 12:25 | 只看该作者
angmall 发表于 2023-3-18 12:17
改成这样试试

//DS18B20设备初始化

好的,我试试
回复

使用道具 举报

地板
ID:1058641 发表于 2023-3-18 12:29 | 只看该作者
angmall 发表于 2023-3-18 12:17
改成这样试试

//DS18B20设备初始化

不行温度还是不变
回复

使用道具 举报

5#
ID:155507 发表于 2023-3-18 14:13 | 只看该作者
你把你的代码完整地贴上来看看
回复

使用道具 举报

6#
ID:1058641 发表于 2023-3-18 15:08 | 只看该作者
#include "reg52.h"
#include "onewire.h"

unsigned char code SMGdaima[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char code distab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

unsigned char temp=0x0000;

void Select573(unsigned int n)
{
        switch(n)
        {
                case 5: P2=(0x1f & P2) | 0xa0;break;
                case 6: P2=(0x1f & P2) | 0xc0;break;
                case 7: P2=(0x1f & P2) | 0xe0;break;
        }
}

void delay(unsigned char t)
{
        while(t--);               
}

void displySMG_bit(unsigned char pos,unsigned char value)
{
        Select573(6);
        P0=0x01<<pos;
        Select573(7);
        P0=value;       
}

void displySMG_temp()
{
        displySMG_bit(7,SMGdaima[temp%10]);
        delay(500);
        displySMG_bit(6,distab[temp%100/10]);
        delay(500);
        displySMG_bit(5,SMGdaima[temp/100]);
        delay(500);
        displySMG_bit(4,SMGdaima[10]);
        delay(500);
        displySMG_bit(3,SMGdaima[10]);
        delay(500);
        displySMG_bit(2,SMGdaima[10]);
        delay(500);
        displySMG_bit(1,SMGdaima[10]);
        delay(500);
        displySMG_bit(0,SMGdaima[10]);
        delay(500);       
}

void delay1(unsigned char t)
{
        while(t--);
}

void readtemp()
{
        unsigned char LSB,MSB;
        init_ds18b20();
        Write_DS18B20(0xcc);
        Write_DS18B20(0x44);

        delay1(1000);
        init_ds18b20();

        Write_DS18B20(0xcc);
        Write_DS18B20(0xbe);

        LSB=Read_DS18B20();
        MSB=Read_DS18B20();

        temp=MSB;
        temp=(temp<<8)|LSB;

        if(temp & 0xfe00 == 0x0000)
        {
                temp>>=4;
                temp=temp*10;
                temp=temp+(LSB&0x0f)*0.625;
                       
        }
}

void init_buzz()
{
        Select573(5);
        P0=0x00;       
}

void main()
{
        init_buzz();
        while(1)
        {
                readtemp();
                displySMG_temp();               
        }
}
回复

使用道具 举报

7#
ID:1034262 发表于 2023-3-18 17:01 | 只看该作者
照着手册里的时序写,示波器配合看时序。
回复

使用道具 举报

8#
ID:1058641 发表于 2023-3-18 21:31 | 只看该作者
具体怎么操作呢
回复

使用道具 举报

9#
ID:1058641 发表于 2023-3-19 10:47 | 只看该作者
解决了,是十二分频的问题
回复

使用道具 举报

10#
ID:1088441 发表于 2023-7-27 11:08 | 只看该作者
你这是在弄蓝桥杯吗,如果是的话不建议程序里用延时函数噢,很容易出现时序问题的,可以用定时器中断来代替延时。然后它给的DS18B20的库函数里的时序也是有问题的,是用的51的时序。
回复

使用道具 举报

11#
ID:382454 发表于 2023-7-28 11:50 | 只看该作者
精确延时,用官方STC的软件来生成。DS18B20的代码网上很多,最好是用开发板正常的代码,来学习,之后再一点点改。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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