搜索
bottom↓
回复: 76

DS18B20的操作读写源程序(7.3728MHZ晶震)

[复制链接]

出0入4汤圆

发表于 2005-6-1 14:30:57 | 显示全部楼层 |阅读模式
点击此处下载armok0151356.rar





需要加一个4.7k的上拉电阻。



用内部的上拉源程序需要改动。



晚上写个详细的操作说明

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2005-6-1 17:28:26 | 显示全部楼层
期待~~!一直想做个温度计放在寝室里~! 顺便问问 18b20 好买么? 多少钱一只?

出0入0汤圆

发表于 2005-6-1 17:34:35 | 显示全部楼层
我也正在做測溫的,考慮成平,打算用熱敏加m48做!

出0入0汤圆

发表于 2005-6-1 18:14:39 | 显示全部楼层
18b20 好买,我没讲价10元。

ilan2003 小松工程

谢谢了,期待啊~~~~~~



我的用串口监视,总是得到 FE FF 或者FF FF 偶尔还有C0 FF。

怎么回事啊?



但是监视每个bit,(低,高温度共16个bit)就正确。



郁闷~~~~
-----此内容被greatsnows于2005-06-01,18:23:08编辑过

出0入0汤圆

发表于 2005-6-1 18:52:42 | 显示全部楼层
请大家一定看看,很奇怪的问题。

/*---------------------------------------------------------

*  从温度芯片DS18B20读配置或数据(接收一个字节)

*/

int8_t ds18b20_read(void)

{

    int8_t i,dat;



    dat = 0x00;       // 数据接收准备

     

    // 每个字节共8位,一次收一位

    for(i=0; i<8; i++)

        {

        cli();        // 保证绝对不会发生中断!  



        // 从总线拉低到读总线状态,不能大于15us!

        DQ_TO_0();    // 设置1-wire总线为低电平(拉低总线以同步)

        wait_us(2);   // 2us

        DQ_TO_1();    // 设置1-wire总线为高电平(释放总线)

        wait_us(4);   // 4us         

        

        if(DQ_status())

                {

                        dat+=0x80;   // 读取总线电平,先收低位再收高位

                        dat >>= 1;

                        sendchar(1); //串口监视

                       

                        //Nokia3310_Write_Char('1');

         }

                 else

                 {

                        //Nokia3310_Write_Char('0');

                        dat >>= 1;

                        sendchar(0);  //串口监视

                 }

        sei();        // 恢复系统中断

        wait_us(62.5);  // 必须大于60us

    }

        sendchar(dat);

    return(dat);                         //串口监视





在串口得到的竟然是



01 00 01 00 00 00 01 01 21 01 00 00 00 00 00 00 00 FF

01 00 00 01 01 00 01 01 DB 01 00 00 00 00 00 00 00 FF



之类的,请问怎么回事啊?

}

出0入4汤圆

 楼主| 发表于 2005-6-1 19:49:04 | 显示全部楼层
那应该不是我的程序的问题了。

我的程序中的注释算够详细了吧!







“我也正在做測溫的,考慮成平,打算用熱敏加m48做!”

用1N4148不错的,线性很好的,用M8的AD转换精度还是不错的。

不过互换性可能差了点,只要经过标定就一定很准的。

出0入0汤圆

发表于 2005-6-1 20:09:42 | 显示全部楼层
to ilan2003 小松工程

上面的是我遇到的问题。

你遇到的是什么问题?怎么解决的?

出0入4汤圆

 楼主| 发表于 2005-6-1 20:54:11 | 显示全部楼层
其实我遇到的问题是因为没有把初始化程序写好,在判断到DS18B20强制拉低总线的时候,我就结束了程序,其实应该是等待DS18B20释放总线的。

我写了份DS18B20的操作规范,不是很全,主要介绍DS18B20的读位和写位和初始化的时序操作,主要是画了3张流程图

这里下载:



http://www.hzxingao.com/download/ds18b20.rar

出0入0汤圆

发表于 2005-6-2 09:16:38 | 显示全部楼层
"用1N4148不错的",但要加一級運送放才行啊, 成本又增加了..

出0入4汤圆

 楼主| 发表于 2005-6-2 09:34:00 | 显示全部楼层
比起DS18B20要便宜吧

1N4148+OP07+电阻电容  最多1.5元

DS18B20听说9元,

怎么样,4148便宜吧

热敏电阻要线性处理

出0入0汤圆

发表于 2005-6-2 09:45:49 | 显示全部楼层
準備用查表法做(表已經做好),精度為1度,做多路時用熱敏電阻的成本優勢就明顯了..

出0入0汤圆

发表于 2005-6-8 13:24:54 | 显示全部楼层
小松工程大哥~!



           我就是用你写的程序,只不过是换成了内部8m晶振~!我把延迟稍微改了点~!

现在的问题是,能读出数据来,也会随着温度变化,但是就是不准确~! 如:25度我读出来是 转换成 10 进制是 00421 !

        我想请教你的这个函数读出来X就是温度值么?怎么把这个值变成实际的温度?



unsigned int readTempDS18B20(void)

{

        BYTE tempL,tempH;

        WORD x=0;

        resetDS18B20();

        writeByteDS18B20(0xcc);         //跳过ROM

        writeByteDS18B20(0x44);                //启动温度转换

        delayUs(1);

        resetDS18B20();

        writeByteDS18B20(0xcc);                //跳过ROM

        writeByteDS18B20(0xbe);                //读数据

        tempL=readByteDS18B20();

        tempH=readByteDS18B20();

        x=(tempH<<8)|tempL;

        return(x);

}

出0入4汤圆

 楼主| 发表于 2005-6-8 18:47:10 | 显示全部楼层
其实这个函数没有考虑到负温度,读出来的数字还要换算成温度。具体看18B20的数据格式。



我这里没有说明,疏忽了。

换算成温度千万不要用浮点运算,我感觉ICC的浮点运算处理的很不好。





假设你只要精确到1度



换算温度用很简单的方法就可以处理:



首先判断是正温度还是负温度

然后判断倒数第四位是1还是0

如果是1且温度为正,那么 温度=x>>4+1;

如果是1且温度为负,那么 温度=x>>4-1;

如果是0,温度=x>>4;



这样的操作可以节省很多的flah空间。

出0入0汤圆

发表于 2005-6-8 22:18:13 | 显示全部楼层
我读出来 的数据 如25度 是0x019B 按照手册上些的,好像既不是正数也不是负数~!

是不是由于这个移位造成的?x=(tempH<<8)|tempL;



手册上是这样写的+25度 是 0b0000 0000 0011 0010

我的算出来是            :0b0000 0001 1001 1011



还有就是你说的 判断倒数第四位是从哪边数呀? bit0 还是 bit15 ??

出0入4汤圆

 楼主| 发表于 2005-6-8 22:37:03 | 显示全部楼层
啊呀,你注意是什么分辨率的啊!



我这里是12位,都怪我没说清楚,老大。呵呵,你那个手册是哪里找来的。

可能是9位精度时候的吧

我的算出来是            :0b0000 0001 1001 1011 如果是12位的,不就是

0b0000 0001 1001 1011*0.0625=25.5..

如果是9位的





英文手册上是这样写的:

TEMPERATURE REGISTER FORMAT Figure 2

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0

LS Byte 23 22 21 20 2-1 2-2 2-3 2-4

bit 15 bit 14 bit 13 bit 12 bit 11 bit 10 bit 9 bit 8

MS Byte S S S S S 26 25 24

TEMPERATURE/DATA RELATIONSHIP Table 2

TEMPERATURE DIGITAL OUTPUT

(Binary)

DIGITAL OUTPUT

(Hex)

+125°C 0000 0111 1101 0000 07D0h

+85°C* 0000 0101 0101 0000 0550h

+25.0625°C 0000 0001 1001 0001 0191h

+10.125°C 0000 0000 1010 0010 00A2h

+0.5°C 0000 0000 0000 1000 0008h

0°C 0000 0000 0000 0000 0000h

-0.5°C 1111 1111 1111 1000 FFF8h

-10.125°C 1111 1111 0101 1110 FF5Eh

-25.0625°C 1111 1110 0110 1111 FE6Fh

-55°C 1111 1100 1001 0000 FC90h

出0入0汤圆

发表于 2005-6-9 10:31:25 | 显示全部楼层
感谢 小松工程 大哥~! 我搞定了~~~!



都怪我懒,不想看手册~!给您添麻烦了~~!





出0入0汤圆

发表于 2005-11-2 17:16:20 | 显示全部楼层
搂主问您一下,Mega系列单片机里的内部上拉电阻不能代替那个4.7K电阻吗?

出0入0汤圆

发表于 2005-11-2 18:31:03 | 显示全部楼层
一个电阻,不会对你的系统增加什么 成本和空间吧~!

出0入0汤圆

发表于 2005-11-3 09:24:01 | 显示全部楼层
那倒不会,只是不想改板子了,谢谢了

出10入210汤圆

发表于 2005-11-3 09:31:42 | 显示全部楼层
按ATmega8原理與應用書上的ICC例子改到GCC上,用8位LED顯示器輸出,效果還不錯,只是高溫是會不讀不出的現象(用鉻鐵加溫至110度以上時)。

出0入0汤圆

发表于 2005-11-4 15:51:55 | 显示全部楼层
好久没有来这里了.

to:greatsnows 过热阿塔斯

我以前做过DS18B20,是通过PC机的并口模拟的的,调试时出现读出DS18B20代码和温度数据有出现0xFF的现象,找来找去都是时序的问题,你仔细分析一下你的时序,说不定就是它的问题

出0入0汤圆

发表于 2005-11-24 12:07:48 | 显示全部楼层
to ilan2003 小松工程:



   你的程序在发出转换温度指令(CONVT 0x44)之后怎么不需要延时 750ms(12bit)就可以马上读出温度数据?



/**********************************************************************

functionName: unsigned int readTempDS18B20(void)

description :读DS18B20温度

**********************************************************************/

unsigned int readTempDS18B20(void)

{

        BYTE tempL,tempH;

        WORD x;

        resetDS18B20();

        writeByteDS18B20(0xcc);         //跳过ROM

        writeByteDS18B20(0x44);                //启动温度转换

        delayUs(1);

        resetDS18B20();

        writeByteDS18B20(0xcc);                //跳过ROM

        writeByteDS18B20(0xbe);                //读数据

        tempL=readByteDS18B20();

        tempH=readByteDS18B20();

        x=(tempH<<8)|tempL;

        return(x);

}

出0入4汤圆

 楼主| 发表于 2005-11-25 08:58:06 | 显示全部楼层
哦,这个倒是没注意,看了datasheet,确实需要等待750ms以后再读,但是我也不明白居然读出来的数据是正确的,不过奇怪的是很多人都反映的第一次数据读得的结果是85

出0入0汤圆

发表于 2006-1-14 13:02:24 | 显示全部楼层
我前一段时间也写了几个18B20的程序,用LCD显示,功能如下:

1:读ID码

2:读RAM

3:读温度等数据

4:写EEPROM,修改转换精度

http://www.avrdiy.com/应用设计/DS18B20在BASCOM-AVR上的应用.htm

出0入0汤圆

发表于 2006-1-15 05:24:53 | 显示全部楼层
"哦,这个倒是没注意,看了datasheet,确实需要等待750ms以后再读,但是我也不明白居然读出来的数据是正确的,不过奇怪的是很多人都反映的第一次数据读得的结果是85 "



数据手册上的750MS(毫秒)是错误的,应该是750US(微秒)才对!(不知道为什么会出现这样的错误!?)

按数据手册上的750MS写程序,害很多不知情的人在启动温度转换后要等待差不多一秒才读温度值,浪费大量单片机时间和资源!

出0入0汤圆

发表于 2006-1-15 16:42:25 | 显示全部楼层
750uS! 够厉害的,现在有这么好的12bit温度检测芯片?

是750mS,绝对没错。



Thermometer resolution is user-selectable from 9 to 12 bits

Converts temperature to 12-bit digital word in 750ms (max.)



THERMOMETER RESOLUTION CONFIGURATION Table 3

R1 R0 Resolution Max Conversion Time

0  0   9-bit     93.75 ms (tCONV/8)

0  1  10-bit    187.5 ms  (tCONV/4)

1  0  11-bit    375 ms    (tCONV/2)

1  1  12-bit    750 ms    (tCONV)

出0入0汤圆

发表于 2006-1-19 19:46:03 | 显示全部楼层
楼上的,口说无凭,最好是自己亲自试试!我用51做的多点温度控制器在启动温度转换后的等待时间就是750uS的!用了几个月一直都很正常!

出0入0汤圆

发表于 2006-1-19 20:01:37 | 显示全部楼层
这个数据是DS18B20的MAXIM/DALLAS官方的数据手册上的,不是我口说的。

请认真看看手册。

如果在温度转换完成前发出读取温度命令,将会读到前次转换的温度值

----这就是为什么很多人第一次会读到85度的原因----因为DS18B20的温度寄存器的上电默认值是85度(The power on reset register value is +85°C.)



PS:现在市面上还没有750uS转换速度的12bit温度检测芯片。

出0入0汤圆

发表于 2006-1-20 08:50:48 | 显示全部楼层
对于18B20,我是用了一点点,就300-400个吧!!!

我的一般是:发出转换命令后,大概 1秒钟后去读取温度值。一点也不会让浪费我的CPU时间,测温度又不是做位置控制,要那么快干吗???



前一些时候,美信送了两片:DS2450给我,东西是好东东。就不知市场价是多少???太贵就不玩它了!

谁用过能告诉我吗????
-----此内容被baplmqj于2006-01-20,09:01:00编辑过

出0入0汤圆

发表于 2006-1-22 01:01:57 | 显示全部楼层
"这个数据是DS18B20的MAXIM/DALLAS官方的数据手册上的,不是我口说的。

请认真看看手册。

如果在温度转换完成前发出读取温度命令,将会读到前次转换的温度值

----这就是为什么很多人第一次会读到85度的原因----因为DS18B20的温度寄存器的上电默认值是85度(The power on reset register value is +85°C.)



PS:现在市面上还没有750uS转换速度的12bit温度检测芯片。 "



的确原来是我搞错了!等待750uS后读出的是前次的转换结果,难怪每次开机时第一次读出来的温度值都是85度!呵呵.................

请HJJourAVR原谅我的无知!实在抱歉!

出0入0汤圆

发表于 2006-3-18 16:03:23 | 显示全部楼层
为什么我用这个程序,读出的结果总是0xffff呢?(初始化已经成功了)

出0入0汤圆

发表于 2006-5-16 21:16:18 | 显示全部楼层
小松工程 大哥~! 我用你的程序在proteus仿真软件上怎么会,采不能采集到数据啦.初始化是成功了,不过然后通过LED来显示出来的数据全是0.读不到DS18B20温度传感器的温度来.我用的proteus是6.7版的.

请问你知道是为什么吗?

谢谢你了啊.

出0入0汤圆

发表于 2006-5-16 22:26:44 | 显示全部楼层
proteus是6.7版的没有DS18B20这个器件呀!

出0入0汤圆

发表于 2006-5-17 08:32:55 | 显示全部楼层
关于32楼

在本站proteus论坛有网友给出了一个很好的地址,里面有ds18B20的模型库文件。



关于31楼

仿真成功后,程序放到实际的环境中,不是百分百成功的。

实际环境中成功的程序,放到proteus中,未必一定仿真成功。



我把经过实际验证的18B20程序放在proteus里面仿真,居然不成功,当然这仅仅是一个例子,或许有点以偏概全,但是仿真的时序和实际的时序毕竟是有差别的。

出0入0汤圆

发表于 2006-6-15 08:53:57 | 显示全部楼层
#include<pic18fxx8.h>

unsigned int i,x;

main()

{

TRISC=TRISC&0xDF;

PORTC=0x00;

for(i=100;--i;)continue;//拉低总线,延时480us—960us

PORTC=0x20;

for(i=2;--i;)continue;    //拉高总线,延时15us—60us

TRISC=TRISC|0x20;

x=RC5;                        //等待18b20回送一个数据,为0则初始化成功,1则失败

for(i=30;--i;)continue;

}





这是DS18B20的初始化程序,我单独拿出来调试。无论怎么改初始化的数据,输出的波形时序不对,请问这个程序哪里出错了?当拉低总线时,无论时间值怎样设定,输出波形显示延时时间只有100us左右;拉高总线时,显示的延时时间总是拉低总线时的2倍左右。拜托各位大侠指点迷津阿!

出0入0汤圆

发表于 2006-6-24 19:03:06 | 显示全部楼层
30楼的兄弟,我这次也遇到了你同样的问题,我痛苦的调了两天,终于搞定了。

也许你已经在初始化是判断到了低电平,但是一定要等这段低电平结束后再去读数,

否则就是高电平。你试一下。

出0入4汤圆

 楼主| 发表于 2006-6-24 20:18:44 | 显示全部楼层
请大家仔细看datasheet中的时序图,再对着程序好好分析

出0入0汤圆

发表于 2006-6-28 09:45:35 | 显示全部楼层
各位我在初始化中也判断到了ds18b20拉低总线,然后等待了将近20ms才判断到释放总线(高电平),手册上是60-240us,不知对不对?然后我读出来的是0x0000

请各位指点

出0入0汤圆

发表于 2006-8-21 08:35:12 | 显示全部楼层
/***********************************************************

*  文件名称:18b20.c

*  功    能:读取18B20的温度

*  时    间:2006.8.1

*  端口使用:PD4(DQ)

   说    明:晶振:8MHz

************************************************************/

#include <iom8v.h>

#include <macros.h>

#include "display.h"



#define xtal  8                      //1MS

/************************************************************

*   函数名称:void DelayUS(unsigned int time)

*   功    能:软件延时1.1Us

*   入口参数:time 延时时间

*   出口参数:无

************************************************************/

void DelayUS(unsigned int time)

{   

     while(time>1)

            time--;

}

/************************************************************

*   函数名称:void DelayMS(unsigned int time)

*   功    能:软件延时  1/1000s

*   入口参数:time 延时时间 MS  

*   出口参数:无

************************************************************/

void DelayMS (unsigned int time)

{

    unsigned int i;

    while(time--)       

        {

          for(i=1;i<(unsigned int)(xtal*143-2);i++)

              ;

        }  

}

/***********************************************************

*   函数名称:void DisInit(void)

*   功    能:显示端口初始化

*   入口参数:无

*   出口参数:无

**********************************************************/

void DisInit(void)

{

    DDRB = 0xFF;

        PORTB= ~DISCODE[0];

        DDRC = 0x0F;

        PORTC= 0x0F;  /* 四个数码管都显示0;*/

}

/***********************************************************

*   函数名称:unsigned char Check18B20(void)

*   功    能:检查18B20是否存在

*   入口参数:无

*   出口参数:检查存在是返回 0

                不存在是返回 1

**********************************************************/

unsigned char Check18B20(void)

{

    unsigned char signal;

       

        DDRD |= 0x08;

        PORTD&= 0xF7;   //PD3输出低电平 ,复位18B20

        DelayUS(436);   //延时480US

       

        PORTD|= 0x08;    //PD3输出高

        DDRD |= 0x08;   //PD3输入

        DelayUS(57);   //延时63US

        while(PIND & 0x08)

            signal = 0;  //读取PD3的值,也就是18B20输出的值

       

        DelayUS(181);   //延时200US

        return signal;

}                               

/***********************************************************

*   函数名称:unsigned char Read18B20(void)

*   功    能:从18B20读一个字节的数据

*   入口参数:无

*   出口参数:读出的数据

***********************************************************/

unsigned char Read18B20(void)

{

    unsigned int byte=0,i;

    for(i=0;i<8;i++)

        {

            DDRD |= 0x08;

                PORTD&= 0xF7;   //总线为低电平

                asm("nop");

                asm("nop");

                asm("nop");

               

                PORTD|= 0X08;   //总线为高电平

                asm("nop");

                asm("nop");

                DDRD &= 0xf7;   //PD3端口输入

                PORTD|= 0X08;

        //DelayUS(1);

                if((PIND & 0x08)==0x08)

                {

                    byte |= (0x01<<i);    //先读高位的值

                }

                DelayUS(37);          // delay 55us

        }

        return byte;

}



/***********************************************************

*   函数名称:void Write18B20(unsigned char cmd)

*   功    能:向18B20写入一个字节的数据

*   入口参数:要写入的数据或者是字节

*   出口参数:无

***********************************************************/

void Write18B20(unsigned char cmd)

{

    unsigned int i ;

        for(i=0;i<8;i++)

        {

            DDRD |= 0x08;

                if(cmd & 0x01)

                {

                    PORTD |= 0X08;   

                        PORTD &= 0XF7;   //高……》低

                       

                    DelayUS(10);     //delay 15us

                        PORTD |= 0x08;   //高

                        DelayUS(37);     //  延时56us

                }

                else

                {   

                        PORTD &= 0XF7;  //高……》低

                       

                    DelayUS(40);    //延时60us

                        PORTD |= 0x08;

                        DelayUS(5);

                }

                cmd = cmd>>1;

        }

}

/***********************************************************

*   函数名称:unsigned int GetTemp(void)

*   功    能:得到一个温度的数据 16位;高5位为正负标志  0:正温度

                                                        1:负温度

*   入口参数:无

*   出口参数:温度的数据

***********************************************************/                                                                                                               

unsigned int GetTemp(void)

{



    unsigned int temph=0 ,templ=0;

        unsigned int ds18b20_temp=0;

       

        while(0x00 != Check18B20()) //检查18b20是否存在

            ;



    Write18B20(0xcc);               

        Write18B20(0x44);  //启动转换

        DelayMS(200);       //200MS

        while(0x00 != Check18B20()) //检查18B20是否存在,复位

            ;

        Write18B20(0xcc);

    Write18B20(0xbe);  //读取温度值

       

        templ = Read18B20();

        temph = Read18B20();

        ds18b20_temp = temph<< 8;

        ds18b20_temp |=templ;

        return ds18b20_temp;

}



这是我的一个程序哦,

完全可以用哦!

8M晶振!

出0入0汤圆

发表于 2006-8-21 08:37:33 | 显示全部楼层
点击此处下载armok01126891.rar

出0入0汤圆

发表于 2006-8-21 08:41:03 | 显示全部楼层
这个就是用M8 做的一个程序!

下面再传一个上位机,读取温度的程序!(VB做的)

点击此处下载armok01126893.rar

出0入0汤圆

发表于 2006-11-10 22:39:31 | 显示全部楼层
请高人"ilan2003 小松工程"和"lychee420":

    我调试"ilan2003 小松工程"的程序,显示结果一直是1111 1111 1111 1111

    我调试"lychee420"的程序,        显示结果一直是0000 0101 0101 0000



    我一只调试了很久,手头也没有工具在检测准确的延时,所以搞了很长时间都没有把DS18B20搞定,很是苦恼,太打击我了!

   

    各位高人,谁能帮我一下啊,吾不胜感激啊!

   

    小袁 QQ:14739247

     Email:yinghaoyuan@sina.com

出0入0汤圆

发表于 2008-8-7 22:11:47 | 显示全部楼层
ding xia ..

出0入0汤圆

发表于 2009-1-4 11:22:44 | 显示全部楼层
18b20精度到底能做到多少呀?



就是能显示温度,精度很差有什么用呢?

出0入0汤圆

发表于 2009-1-1 01:04:27 | 显示全部楼层
18B20能测的温度范围是多少?最高和最低,这个问题太低级哇

出0入0汤圆

发表于 2009-1-1 00:54:35 | 显示全部楼层
MARK

出0入0汤圆

发表于 2008-12-17 20:52:59 | 显示全部楼层
DS18B20官方datasheet里面有一个错误,就是TH和TL的位代表的意思,很多的人都没搞清楚,我也很纳闷的是出厂这么长时间的产品,竟然会出现这样的错误,不过他们公司倒是很快改过来了。更新的版本应该就没有这个错误了,不过旧的datasheet还是存在这个错误的。

出0入0汤圆

发表于 2008-10-15 08:59:34 | 显示全部楼层
请大家注意转换时间,即750MS转换时间的问题,不然你没次读到将是上一次寄存器的值,如过程序是狂读刷新的话,到不要紧;但如果是收到命令读的话就一定要加750MS的延时(12bit),否则就是读的是上一次的值(第一次是85),大家应该很明白了吧!

出0入0汤圆

发表于 2009-3-25 22:01:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-4-2 15:58:59 | 显示全部楼层
我现在想用LPC2132来做个测温的,但是调了很久了还是不行,读出来的数据都是FF ,我用示波器来测过每一个延时,应该都没有什么问题了的,而且也是按照时序图来写程序,但是就是测不出数据来!我快要发疯了,哪位大侠能指点一下迷津啊!先谢谢了!

出0入0汤圆

发表于 2009-4-2 16:00:46 | 显示全部楼层
我的邮箱是liangxixing.ok@163.com QQ:406132257

出0入0汤圆

发表于 2009-6-10 11:02:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-6-11 10:00:48 | 显示全部楼层
mark   study

出0入0汤圆

发表于 2009-10-15 21:06:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-12-27 01:58:10 | 显示全部楼层
刚开始学习这个 谢谢

出0入0汤圆

发表于 2010-1-3 15:29:19 | 显示全部楼层
有没有人做过这种类似的单线通信应用啊?

出0入0汤圆

发表于 2010-1-8 17:41:55 | 显示全部楼层
是啊,开机温度显示0或85°c,呵呵....

出0入0汤圆

发表于 2010-1-8 20:01:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-8 20:03:34 | 显示全部楼层
c的吗?偶现在在学汇编,c看不懂,,,

出0入0汤圆

发表于 2010-1-13 17:07:05 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-2-23 12:06:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-2-23 12:51:35 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-6 21:36:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-15 16:17:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-17 15:26:15 | 显示全部楼层
应该没问题的,自己搞了一个通过

出0入0汤圆

发表于 2010-4-27 00:41:18 | 显示全部楼层
学习了额 谢谢楼主

出0入0汤圆

发表于 2010-5-15 19:01:41 | 显示全部楼层
谢谢,正需要这个东西!

出0入0汤圆

发表于 2010-10-24 15:16:21 | 显示全部楼层

出0入0汤圆

发表于 2010-11-16 11:09:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-21 01:01:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-6 15:49:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-10 22:01:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-11 21:45:00 | 显示全部楼层
不是说温度转换完成后18b20会拉低数据线,大家怎么不靠这个来检测?

出0入0汤圆

发表于 2011-8-15 10:40:19 | 显示全部楼层
mark  学习了!

出0入0汤圆

发表于 2011-10-5 21:03:42 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2012-1-15 17:45:47 | 显示全部楼层
unsigned int ds1820_read_temp(void)
{

        unsigned  int i;
       
        unsigned char buf[9];

        ds1820_reset();
        delay_1ms();
        ds1820_write_byte(0xCC);        //勿略地址
        ds1820_write_byte(0xBE);        //读取温度
        for (i = 0; i < 9; i++)
        {
                buf = ds1820_read_byte();
               
        }
        i = ((buf[1]*256+buf[0]));
        i=i>>4+1;
        return i;
}




void ds18b20_show(void)
{
uint temp1;
LCD_diver(0,xy(2,2));
lCD_word("Tem ");

ds1820_start();
delay_ms(750);
temp1=ds1820_read_temp();

LCD_diver(1,((temp1/100)+'0'));
LCD_diver(1,((temp1%100/10)+'0'));
LCD_diver(1,((temp1%10)+'0'));
}


我的怎么读出来的是131 度晕死了  如果 把计算改成i = ((buf[1]*256+buf[0])/16);则等于250+度 怎么回事?
现在读 高字节 就是10000  低字节就是10000000  不变的 0 0    8M晶振

出0入0汤圆

发表于 2012-2-13 16:12:35 | 显示全部楼层
标记一下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-12 07:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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