打印

问个18b20程序的问题,纠结很长时间了,求解救

[复制链接]
楼主: 东北小辉辉
手机看帖
扫描二维码
随时随地手机跟帖
21
蜗牛狂奔| | 2012-12-9 17:46 | 只看该作者 回帖奖励 |倒序浏览
我比较讨厌这个温度传感器,时序复杂!感觉很少产品中用到它

使用特权

评论回复
22
icecut| | 2012-12-9 18:07 | 只看该作者
蜗牛狂奔 发表于 2012-12-9 17:46
我比较讨厌这个温度传感器,时序复杂!感觉很少产品中用到它

水平不行吧...哈哈.18b20玩好的很少啦..

lz网上搜吧,能用.我就网上搜了一个没问题.
先学读代码再学写代码.如果搞不定,就网上搜,如果网上搜不到,那就买板子要人家调好的.这上面耗时间耗不起.

使用特权

评论回复
23
dqyubsh| | 2012-12-9 18:40 | 只看该作者
我同意21楼,简单应用可选,有定时器、中断的场合慎用。

使用特权

评论回复
24
chenyu988| | 2012-12-9 19:30 | 只看该作者
NE5532说的很有道理。调试18B20的话主要是时序问题,时序要求很严格的。
另外程序要模块化,正巧我最近也在做一个时钟+温度的东东。
我先把12864显示调好了,然后调了时钟,51我不知道怎么用仿真器仿真,我用的MSP430是能够在线仿真的,直接看变量的值就行了。现在时钟已经调试好了,接下来准备调试18b20了。

使用特权

评论回复
25
ocon| | 2012-12-9 19:34 | 只看该作者
这个传感器对时序要求准,容易被LED数码管扫描中断处理程序影响。

使用特权

评论回复
26
beanandpeach| | 2012-12-9 21:25 | 只看该作者
检查时序!

使用特权

评论回复
27
aifang| | 2012-12-9 21:39 | 只看该作者
void init_18b20()
{
        dq=0;
        delay2(53);//延时493us,需要延时超过480,最大960
        dq=1;//释放总线
        delay2(5);//经测试延时61us
        while(!dq);//等待18b20输出低
        delay(46);//释放总线到开始执行其他操作需要至少480us
}
void write_18b20(uchar dat)//写时序
{
        uchar i;
        bit j;
        for(i=8;i>0;i--)
        {
                j=dat&0x01;
                dat=dat>>1;
                dq=1;//一次下降沿表示写操作开始
                dq=0;//同上

///在这里放一个十微秒左右的延时



                if(j)
                {
                        dq=1;
                }
                else
                {
                        dq=0;
                }


                   dp = 1;
                   ///延时45微秒左右,读写一次的周期为60微秒左右

        }
}
uchar read_18b20()//读时序
{
        uchar i,dat;
        for(i=8;i>0;i--)
        {
                dq=1;
                dq=0;
                _nop_();//持续低电平1us
                dq=1;
                dat=dat>>1;
                if(dq==1)
                {
                        dat=dat|0x80;
                        delay2(5);
                }
        }
        return dat;
}

使用特权

评论回复
28
aifang| | 2012-12-9 21:39 | 只看该作者
DS18B20的时序很重要

使用特权

评论回复
29
ningling_21| | 2012-12-9 23:22 | 只看该作者
网上大把的程序,拿来试试看看...

使用特权

评论回复
30
西门看雪| | 2012-12-9 23:44 | 只看该作者
大概看了一下,LZ的程序时序严重不符合DS18B20的要求,读不出温度来那是正常的,要是读出来那才是怪了!

下边给楼猪贴一个我自己写的例程:

(那些_nop_ ()中文注释都是特别重要的地方,务必要符合中文注释的时序要求。延时函数都是经过严格仿真的,实际误差不超过5%!)

#ifndef _ds18b20_h_
#define _ds18b20_h_

#include<intrins.h>

sbit ds18b20=P3^7;    //ds18b20 为温度传感器的i/o口线

void delay15us (unsigned int n)  //使用22.1184兆晶振,延时 15*n 微秒;
{
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();
while(--n)
{
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();_nop_ ();
_nop_ ();
}
}

unsigned char init_ds18b20(void) //初始化ds18b20
{
  unsigned char initflag;
  ds18b20=0;
  delay15us(36);
  ds18b20=1;
  delay15us(6);
  initflag = ds18b20;
  delay15us(18);
  ds18b20=1;
  return (initflag); //返回0则初始化成功,否则初始化失败
}

void writeonechar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8;i>0;i--)
  {
   ds18b20=0;
_nop_ ();
_nop_ ();
_nop_ ();   //延时必须大于1us
ds18b20 = dat&0x01;
delay15us(4);
ds18b20=1;
dat>>=1;
  }
}

unsigned char readonechar(void)
{
unsigned char i=0,dat=0;
for(i=8;i>0;i--)
{
  dat>>=1;
  ds18b20=0;
  _nop_ ();
  _nop_ ();
  _nop_ ();   //延时必须大于1us
  ds18b20=1;
  _nop_ ();
  _nop_ ();
  _nop_ ();
  _nop_ ();
  _nop_ ();
  _nop_ ();
  _nop_ ();
  _nop_ ();
  _nop_ ();
  if(ds18b20) dat|=0x80;
  delay15us(4);
  ds18b20=1;
}
return(dat);
}

void convert(void)    //启动温度转换
{
init_ds18b20();
writeonechar(0xcc);   //跳过读序号列号的操作
writeonechar(0x44);   //启动温度转换
}

int readtemperature(void)   //读取温度,需在启动温度转换750ms之后
{
unsigned char low=0,high=0;
int t=0;
init_ds18b20();
writeonechar(0xcc);
writeonechar(0xbe);//发出读取温度寄存器命令
low=readonechar();
high=readonechar();
t=high;
t<<=8;
t|=low;
return(t);
}

#endif

使用特权

评论回复
31
dtmcp| | 2012-12-10 09:41 | 只看该作者
18B20最有可能是时序的问题,不同年处理器,不同的运行速度,都有很大影响,简单的办法就是用示波器测一下

使用特权

评论回复
32
储小勇_526| | 2012-12-10 10:31 | 只看该作者
准备自己搞温度显示挂在自己家每个角落

使用特权

评论回复
33
ayb_ice| | 2012-12-10 11:12 | 只看该作者
dqyubsh 发表于 2012-12-9 18:40
我同意21楼,简单应用可选,有定时器、中断的场合慎用。

没有问题的,是用的不对,

中断间隔大于1MS的应用没有任何问题

使用特权

评论回复
34
江枫渔火| | 2012-12-10 11:16 | 只看该作者
很多开发板都有18B20的实验,不过这东西实用意义真不很大,公司做产品都不采用的。原因是价格贵。
用这东西要点只是掌握好时序,多看看手册,再看看别人写的例程。没什么好玩的~

使用特权

评论回复
35
chiplights| | 2012-12-10 11:23 | 只看该作者
好像写错了

使用特权

评论回复
36
wzf3151| | 2012-12-10 11:55 | 只看该作者
把网上的程序弄下来,把延时函数调准,把IO设置对就好了。我一直都想好好研究这个传感器的协议,但上帝一直不给机会,我就随便弄个程序,把延时调准就能用了,从来没有费过事。

但是每次调那个时间必用示波器,我就搞不懂了,没有示波器,你还能怎么调这个程序

使用特权

评论回复
37
jlgcumt| | 2012-12-10 12:26 | 只看该作者
直接上硬件才是王道!

使用特权

评论回复
38
jlgcumt| | 2012-12-10 12:27 | 只看该作者
不要为了省钱,要不然以后你会花更多的钱!

使用特权

评论回复
39
YIHUI1991| | 2012-12-10 14:12 | 只看该作者

使用特权

评论回复
40
jilinhuangtao| | 2012-12-10 14:35 | 只看该作者
我也遇到过这个问题,主要是时序。单总线器件时序是难点核心。我当时是调试同事的程序,用的软件仿真。打开了时序计时器调通的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则