这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » DS18B20

共12条 1/2 1 2 跳转至

DS18B20

菜鸟
2013-03-23 11:43:20     打赏

//==========================================================================//
//向18b20写数据
//==========================================================================//
void Write18B20_byte(uchar data)
{
    uchar i,dat;
    for(i=0;i<8;i++)
    {
        SysCtlPeriEnable(DQ_PERIPH);                                    //  使能GPIOB端口
        GPIOPinTypeOut(DQ_PORT , DQ_PIN);                               //  设置PB0输出类型
        GPIOPinWrite(DQ_PORT , DQ_PIN , 0x00);       //  PB0输出低电平
        Delay(18); 
        dat=data & 0x01;
        GPIOPinWrite(DQ_PORT , DQ_PIN , dat);
        GPIOPinRead(DQ_PORT , DQ_PIN);
        Delay(50); 
        GPIOPinTypeOut(DQ_PORT , DQ_PIN);
        GPIOPinWrite(DQ_PORT , DQ_PIN , 0xff);
        data>>=1;
    }
      Delay(5* (TheSysClock / 4000));   
}

//==========================================================================//
//读取18b20数据
//==========================================================================//
uchar Read18B20_byte(void)
{
     uint i;
     uchar value;
     for(i=0;i<8;i++)
     {
        SysCtlPeriEnable(DQ_PERIPH);                                    //  使能GPIOB端口
        GPIOPinTypeOut(DQ_PORT , DQ_PIN);                               //  设置PB0输出类型
        GPIOPinWrite(DQ_PORT , DQ_PIN , 0x00);       //  PB0输出低电平
        Delay(5); 
        value>>=1;
        GPIOPinWrite(DQ_PORT , DQ_PIN , 0xff);
        Delay(40);                                                              //  延时2us
        if(GPIOPinRead(DQ_PORT , DQ_PIN))
          value|=0x80;
        Delay(3 * (TheSysClock / 4000));
     }
     return (value);
}

//===========================================================================//
//18b20测温程序
//===========================================================================//
uint readtemp(void)
{
        unsigned char TemL,TemH;
        Init_DS18B20();                                                         //复位18b20
        Delay(1200);                                                        //时                                                       //延时300us
        Write18B20_byte(0xcc);                                                       //跳过ROM区域                                                          //延时10us
        Write18B20_byte(0x44);                                                       //温度转换
        Delay(1200);                                                        //延时1s
        Init_DS18B20();
        Write18B20_byte(0xcc);                                                       //跳过ROM区域                                                          //延时10us
        Write18B20_byte(0xbe);                                      
        TemL=Read18B20_byte();                                                   //读低位温度值
        TemH=Read18B20_byte();                                                   //读高位温度值
        TemH<<=4;
        TemH+=(TemL&0xf0)>>4;
        TemH=TemH*(0.0625);
        return (TemH);
}

/*us级延时函数                                        */
/*******************************************************************/
void Delay(uint val)
{
 uint i;
 for(;val>0;val--)
  for(i=0;i<3;i++);
}

温度传感器18b20一直显示15,这是为什么?各位大侠帮助....




关键词: arm    

菜鸟
2013-03-23 12:00:02     打赏
2楼

//===========================================================================//
//初始化DS18b20
//===========================================================================//
uchar Init_DS18B20(void)
{
    uchar n;
    SysCtlPeriEnable(DQ_PERIPH);                                    //  使能GPIOB端口
    GPIOPinTypeOut(DQ_PORT , DQ_PIN);                               //  设置PB0输出类型
    GPIOPinWrite(DQ_PORT , DQ_PIN , 0xff);                          //  PB0输出低电平
    Delay(8);                                                     //  延时0.6us
    GPIOPinWrite(DQ_PORT , DQ_PIN , 0x00);                                //  设置PB0输入类型
    Delay(1200);
    GPIOPinWrite(DQ_PORT , DQ_PIN , 0xff);
    Delay(60);                                                        //延时1s
    GPIOPinTypeIn(DQ_PORT , DQ_PIN);
    n = GPIOPinRead(DQ_PORT , DQ_PIN);
    Delay(800);
    GPIOPinTypeOut(DQ_PORT , DQ_PIN);
    GPIOPinWrite(DQ_PORT , DQ_PIN , 0xff);
    return (n);
}
 

院士
2013-03-23 12:50:06     打赏
3楼

看了两遍 才发现楼主帖子最下面的一行小字~~


出现温度错误一般是时序没有正确。

而且目测 楼主也极可能是写寄存器与读寄存器的间隔时间出了问题


菜鸟
2013-03-23 13:26:19     打赏
4楼

那就是延迟的问题了...谢谢啦....

不知道你有木有经典的ARM延时程序啊???


院士
2013-03-23 17:57:49     打赏
5楼

arm构架下一般不用这种延时了。

那种延时一般只在51系列才会用。


高工
2013-03-24 00:03:50     打赏
6楼

原因是ARM速度比较快,延时麻烦的很。动不动就要循环几万周期。。


systick延时比较靠谱。


要是有了操作系统,可以OSDelay().这样MCU就去干别的活了


高工
2013-03-24 00:04:47     打赏
7楼
没有验证码的回复真的很爽。。。。。。。。。。。。。。。。。。

助工
2013-03-24 09:22:14     打赏
8楼
good

菜鸟
2013-03-24 10:05:44     打赏
9楼
那么ARM构架下时钟周期是怎么计算的啊...有点不懂。。。。

院士
2013-03-25 16:55:19     打赏
10楼

尽量不要计算了。

而是使用估算。例如在进入“循环”前,计录下systick值,执行完后再记录下systick的值。


如果数汇编,那得有些考验……


共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]