3638|7

85

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于DS18B20的提问! [复制链接]

最近的工作需要驱动DS18B20读取温度,在看了DS18B20的文档后第一感觉就是麻烦,由于只用了一根线的原因对于时序的要求极为严格,所以做了3天了都还没采出温度来
很让人恼火!希望各位指点哈!

考虑到我使用的是VRTX平台调试的,而且不怎么熟悉C中嵌汇编弄了半天也没起色所以干脆就全用C了,重要的延时程序也用FOR循环写的,但是经过示波器测试时间上还是比较准确!
del500us()       //经过示波器测试实际时间是500~510us
del20us()          //经过示波器测试实际时间是20us
del6us()          //经过示波器测试实际时间是6~7us
int del_time;
del_time+=2;      //经过示波器测试实际时间是2us
del_time++;       //经过示波器测试实际时间是1.5~2us

然后是我采集温度部分程序:(其中outp()和inp()是VRTX听过的口地址访问)

主程序:
mian()
{
        ......
        _disable();
        INIT_DS1820();                  //初始化DS1820
        DS1820_ROMCMD(0x33);            //写ROM命令-读ROM
        hj_ch[0]=DS1820_READ();         
        hj_ch[1]=DS1820_READ();
        hj_ch[2]=DS1820_READ();
        hj_ch[3]=DS1820_READ();
        hj_ch[4]=DS1820_READ();
        hj_ch[5]=DS1820_READ();
        hj_ch[6]=DS1820_READ();
        hj_ch[7]=DS1820_READ();

        del20us();
        del20us();
        INIT_DS1820();
        DS1820_ROMCMD(0x44);
        delay_time(5);

        INIT_DS1820();
        DS1820_ROMCMD(0xCC);
        DS1820_ROMCMD(0xBE);
        DS1820_GETTMP();
        _enable();   
        ......  
}
下面是具体的操作:
void DS1820_ROMCMD(char cmd)
{
        char c,cmd_temp;
        L0:
        cmd_temp=cmd;
        outp(P1LTCH,0x00);
        for(c=0;c<8;c++)
        {
                if((cmd_temp&0x01)==0x01)
                {     
                        outp(P1LTCH,0x01);
                }
                else
                {
                        outp(P1LTCH,0x00);
                }
                del20us();
                del20us();
                del20us();
/*               if((inp(P1PIN)&0x01)!=(cmd_temp&0x01))             //本来是想自己加个校验的但是总是死监控,只有屏蔽先了
                {
                        outp(P1LTCH,0x01);
                        goto L0;
                } */
                outp(P1LTCH,0x01);
                del6us();
                cmd_temp>>=1;
        }
        outp(P1LTCH,0x01);
}
void INIT_DS1820()
{
        char c;
        outp(P1LTCH,0x01);
        del20us();

        outp(P1LTCH,0x00);
        del500us();
        del20us();
        del20us();
        del20us();
        del20us();
        del20us();
        outp(P1LTCH,0x01);
        del20us();
        del6us();
        del6us();
        while((inp(P1PIN)&0X01)==0x01)
        {
                del6us();
        }
        del20us();
        del20us();
        del20us();
        del20us();
        del20us();
        del20us();
        del6us();
        outp(P1LTCH,0x01);
}
char DS1820_READ()
{
        char i;
        char temp=0;
        char pin;
        outp(P1LTCH,0x01);
        del6us();
        del6us();
        for(i=0;i<8;i++)
        {
                temp>>1;
                outp(P1LTCH,0x00);
                del_time++;
                outp(P1LTCH,0x01);
                del_time=del_time+2;
                del_time=del_time+2;
                del_time++;                     
                pin=inp(P1PIN);
                if((pin&0X01)==0x01)
                        temp|=0x80;
                del20us();
                del20us();
                del20us();
                outp(P1LTCH,0x01);
        }
        return temp;
}
void DS1820_GETTMP()
{
        int i;
        double tmp=0;
        char r_temp;
        for(i=0;i<2;i++)
        {
                tmpbuf=DS1820_READ();
        }
        DS1820_RST();
        DS1820_IDLE();
        r_temp=tmpbuf[0];
        if((r_temp&0x01)==0x01)
        {
                tmp=tmp+0.0625;
        }
        r_temp>>=1;
        for(i=0;i<7;i++)
        {
                if((r_temp&0x01)==0x01)
                {
                        tmp+=0.0625*2*(i+1);
                }
                r_temp>>=1;
        }
        r_temp=tmpbuf[1];
        r_temp&=0x07;
        tmp+=r_temp*16;
        Rtmp=(float)tmp;  
}
void DS1820_RST()
{
        char i;
        _Set186Register(P1LTCH,0x00);
        for(i=0;i<12;i++)
        {
                del20us();
        }
        _Set186Register(P1LTCH,0x01);
        for(i=0;i<12;i++)
        {
                del20us();
        }
}
void DS1820_IDLE()
{
        _Set186Register(P1LTCH,0x01);
        del6us();
        del6us();
}

经过这两天的调试只是把初始化成功通过了(惭愧啊),但是在写命令和读数据上总是不成功读出来的都是0x80,而且无法观察我送出去的命令到底是不是我想发的命令,读数又不成功无法验证发命令,真的很烦劳啊!请大家帮帮忙吧!谢谢了


最新回复

见附件 [attach]436335[/attach]     详情 回复 发表于 2019-10-5 11:37
点赞 关注(1)

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
如果要自己重头些,的确很麻烦的。
——————————————————
我以前是参考网上的例子做的
在这里只能给你建议,在读写ds18B20的时候要求时序不能被干扰,否则不会成功的。
所以在这期间要把所有中断关闭,读写完之后再开。
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
mark
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
mark
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
关闭中断了的
其中_disable();
和_enable()就是VRTX提供的开关中断

其实网上的例子我也下了几个但是都是清一色的51驱动,4M的晶振
但我是186的芯片晶振也是40M的
而且VRTX也不好用连延时都是靠示波器做出来的郁闷
而1820这东西对时间的要求简直变态没办法才自己写的
今天又自虐了一天还是没的进展
继续郁闷中
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
读出的初始值就是0x80。
 
 
 

回复

203

帖子

0

TA的资源

一粒金砂(高级)

7
 

ds18b20采集模块lct2662m,                                     ds18b20采集仪表 LCT2201C

 

采集数据显示

 

培训视频 

 
个人签名北京长信物联科技有限公司
专业的USB温湿度传感器、485温湿度传感器、气体传感器、64路DS18B20温度采集模块厂商。
www.lct2000.cn
QQ:1930227091
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

8
 

见附件

STM32F10x_DS18BD20源程序说明191002.zip (96.53 KB, 下载次数: 1)

 

 
个人签名CAN总线STM32F105_Keil工程C++源程序
https://bbs.eeworld.com.cn/thread-553036-1-1.html
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表