打印

关于18B20温度传感器

[复制链接]
1885|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linfeng133|  楼主 | 2007-10-17 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到对18B20读取和写入命令的单总线对时序要求很严格。那读取温度时为了保证时序,是不是要关中断呢?
但是我没有关中断,经较长时间运行,却没有发现有一次度读取是错误:每两秒读一次,开有一个时钟中断。
是不是不关中断也行呢,心里很不踏实。请有经验的朋友说说

相关帖子

沙发
tage| | 2007-10-17 20:06 | 只看该作者

要是时钟中断

要是时钟中断是2秒那个功能就不用关了。

使用特权

评论回复
板凳
linfeng133|  楼主 | 2007-10-17 20:47 | 只看该作者

两秒读一次数据,并不是关中断两秒钟

数据读取过程还是挺快的

使用特权

评论回复
地板
machunshui| | 2007-10-17 22:07 | 只看该作者

要关中断

要关中断,
在每个字节读写时序发起时的低电平时关中断,时间只有几个US,
不是在整个读写数据期间关中断

以下是一个PIC16F877的用18B20测温的部分程序
#include <pic.h>
#include "temperature.h"
#include "main.h"

bank1 bit RE2Bit;
bank1 bit bStartConversion;
bank1 unsigned int TemperatureMs1000;
bank1 bit bWaitConversion;
bank1 bit bCanRead;
bank1 bit tempBit; 

void InitTemperatureTest()
{
    TRISE2 = 1;
    bStartConversion = 1;
    TemperatureMs1000 = 1000;
    bWaitConversion = 0;
    bCanRead = 0;
// Not set 18B20,12 bit precision
}

bit Reset18B20()
{
    RE2 = 0;
    TRISE2 = 0;
    SetDelayTenUs(55);//3+500 US
    TRISE2 = 1;//Set Input,RES pull High 
    SetDelayTenUs(7);//73 us
    tempBit = RE2;
    SetDelayTenUs(24);//240us
    return tempBit;
}

unsigned char ReadOneChar()
{
    unsigned char i=0;
    unsigned char dat = 0;
    
    for (i=8;i>0;i--)
    {
        GIE = 0;//Close Globle Intterupt
        RE2 = 0;//delay 2us
        TRISE2 = 0;
        dat>>=1;
        asm("NOP");
        TRISE2 = 1;
        
        //delay 4Us
        asm("NOP");
        asm("NOP");
        asm("NOP");
        asm("NOP");
        RE2Bit = RE2;
        GIE = 1;//Open Globle Intterupt

        if(RE2Bit)
        {
            dat |= 0x80;
        }
        SetDelayTenUs(5);//53 us,all > 60Us
    }
    return(dat);
}

void WriteOneChar(unsigned char dat)
{
     unsigned char j;

    for(j=8; j>0; j--)
    {
        GIE = 0;//Close Globle Intterupt
        RE2 = 0;//delay 2us
        TRISE2 = 0;
        asm("NOP");
        asm("NOP");
        RE2 = dat&0x01;
        GIE = 1;//Open Globle Intterupt
        SetDelayTenUs(6);//63us
        TRISE2 = 1;
        dat>>=1;
    }
    SetDelayTenUs(10);//103us
}

bit StartTemperatureTest()
{
    if(!Reset18B20())
    {
        WriteOneChar(0xCC); // ignore ROM Oprator
        WriteOneChar(0x44); // start temperature conversion
        bStartConversion = 0;
        TemperatureMs1000 = 1000;
        bWaitConversion = 1;
        return 1;
    }
    return 0;
}

unsigned char ReadTemperature()
{
    unsigned char a=0;
    unsigned char b=0;
    unsigned char t=0;
    
    if(!Reset18B20())
    {
        WriteOneChar(0xCC); // ignore ROM Oprator
        WriteOneChar(0xBE); //read cmd
        a=ReadOneChar();   //low char
        b=ReadOneChar();   //high char
        a=a>>4;            //低位右移4位,舍弃小数部分
        t=b<<4;            //高位左移4位,舍弃符号位
        t |= a;
        t |= (b & 0x80);
        bCanRead = 0;
        bStartConversion = 1;
    }           
    return(t);
}

使用特权

评论回复
5
qjy_dali| | 2007-10-18 02:05 | 只看该作者

关中断是保险的

使用特权

评论回复
6
ayb_ice| | 2007-10-18 08:11 | 只看该作者

只有关中断才能确保可靠,这也限制了单总线的应用范围。

使用特权

评论回复
7
linfeng133|  楼主 | 2007-10-18 12:34 | 只看该作者

谢谢各位!

特别谢谢machunshui的程序。基本上明白了。

使用特权

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

本版积分规则

5

主题

19

帖子

1

粉丝