一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 3890|回复: 28

[其他综合] 这个DS18B20程序哪里有问题

[复制链接]
发表于 2013-5-31 21:47 | 显示全部楼层 |阅读模式
STC89C52,6T模式,24.576M晶振,有时能读取,有时不能读取,程序是抄袭的,延时函数和原来的不同,改了下延时部分, void delay(uchar xms)  //延时子函数           10us
{
      uchar i,j;
      for(i=xms;i>0;i--)     //xms =10us
       for(j=7;j>0;j--);  
}


unsigned char DS18B20_init(void)        //初始化函数
{
        unsigned char x=0;
        DQ = 1;                    //DQ复位
        delay(2);                  //稍做延时
        DQ = 0;                    //单片机将DQ拉低
        delay(50);                //精确延时 大于 480us
        DQ = 1;                    //拉高总线
        delay(2);                 //15~60us
        x=DQ;                      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        delay(7);                //60~240us
        return(x);
}
unsigned char  ReadOneChar(void)//读一个字节
{
        unsigned char i=0;
        unsigned char dat = 0;
        for (i=8;i>0;i--)
        {
                DQ = 0; // 给脉冲信号
                dat>>=1;
                DQ = 1; // 给脉冲信号
                if(DQ)
                dat|=0x80;
                delay(7); //60~120us
        }
        return(dat);
}

void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;
        for (i=8; i>0; i--)
        {
                DQ = 0;
                DQ = dat&0x01;                                //                                                                  012
                delay(2);   //15~60us
                DQ = 1;
                dat>>=1;
        }
}

void ReadTemp(void)//读取温度
{
        unsigned char data_H,data_L;
        DS18B20_init();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        DS18B20_init();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
        data_L=ReadOneChar();
        data_H=ReadOneChar();
}


发表于 2013-6-1 08:15 | 显示全部楼层
            

                         适当的加大延时间!
回复

使用道具 举报

 楼主| 发表于 2013-6-1 09:28 | 显示全部楼层
倪大德 发表于 2013-6-1 08:15
适当的加大延时间!

问题是前两天可以用,这两天就变得不正常了
回复

使用道具 举报

 楼主| 发表于 2013-6-1 09:51 | 显示全部楼层
还有一个问题,我是用在3264点阵钟上,每间隔1.5是时候屏就会轻微的闪一下,这时间和读取18B20的间隔相同,似乎是读取18B20的时间过长引起程序停顿,读取18B20放在主循环了,用中断产生一个标志位控制
回复

使用道具 举报

发表于 2013-6-1 10:04 | 显示全部楼层
18b20读取太慢。

我在Mega32+VFD时钟上用过,对VFD刷新有严重影响,实在是解决不了。

最终加了片Tiny13专门来读18b20解决问题……
回复

使用道具 举报

发表于 2013-6-1 10:54 | 显示全部楼层
WriteOneChar(0xCC); // 跳过读序号列号的操作
试试在每段写和读指令后面加上段延时试试……
回复

使用道具 举报

发表于 2013-6-1 12:14 | 显示全部楼层
benli 发表于 2013-6-1 09:51
还有一个问题,我是用在3264点阵钟上,每间隔1.5是时候屏就会轻微的闪一下,这时间和读取18B20的间隔相同, ...



         用在3264点阵钟上,不要在中断中读DS18B20,在一幅扫描之后再读。
回复

使用道具 举报

发表于 2013-6-1 12:16 | 显示全部楼层
jimmy_xt 发表于 2013-6-1 10:04
18b20读取太慢。

我在Mega32+VFD时钟上用过,对VFD刷新有严重影响,实在是解决不了。


      现在已很多少用STC片了,原因是:性价比并不高。
回复

使用道具 举报

 楼主| 发表于 2013-6-1 12:19 | 显示全部楼层
倪大德 发表于 2013-6-1 12:14
用在3264点阵钟上,不要在中断中读DS18B20,在一幅扫描之后再读。

不是中断里读取,是在主循环里读取,
回复

使用道具 举报

发表于 2013-6-1 12:35 | 显示全部楼层
benli 发表于 2013-6-1 12:19
不是中断里读取,是在主循环里读取,



                1。 在一幅扫描之后读取无闪烁!

                2。在读取时最好屏蔽系统中断!
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-11-1 08:09 , Processed in 0.033739 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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