申小林 发表于 2024-10-25 16:01

【翌创ET6001】-06 板载DS18B20测试

<div class='showpostmsg'><p>DS18B20是这个板子为数不多的板载传感器,那么今天就和大家来聊一下,我觉得最舒服的是这个板子的IO口可以设置为双向IO口,这样的话很多操作就会很方便。</p>

<p>我们首先确定引脚 ,我们就直接用P0.0来作为DS18B20的接口,确定接口之后就需要确定IO的特性以及复用关系</p>

<div style="text-align: center;"></div>

<div style="text-align: center;"></div>

<div style="text-align: center;">确定了IO接口以及复用关系了之后就可以设置IO的引脚参数了。</div>

<div style="text-align: center;">我们这里就直接先将所有的DS18B20的代码都做上传,然后我们后面就不用管了。</div>

<div style="text-align: center;">&nbsp;</div>

<div>
<pre>
<code>#include "DRV_18B20.h"
#include "DRV_UART.h"
/*********************************************************************************
**********************************************************************************
* 文件名称: ds18b20.c                                                            *
**********************************************************************************
*********************************************************************************/

       
#define DS18B20_DQ_H()      GPIO_WritePin(GPIO0,GPIO_PIN_00,1)
#define DS18B20_DQ_L()      GPIO_WritePin(GPIO0,GPIO_PIN_00,0)
#define DS18B20_DQ_Get()GPIO_ReadPin(GPIO0,GPIO_PIN_00)



//复位DS18B20
void DS18B20_Rst(void)          
{               

DS18B20_DQ_L(); //拉低DQ
Delay_us(750);    //拉低750us
DS18B20_DQ_H(); //DQ=1
        Delay_us(15);   //15US
}

/****************************************************************************
* 名    称: unsigned char DS18B20_Check(void)
* 功    能:等待DS18B20的回应
* 入口参数:无
* 返回参数:返回1:未检测到DS18B20的存在
*         返回0:存在
* 说    明:      
****************************************************************************/       
unsigned char DS18B20_Check(void)           
{   
        unsigned char retry=0;

    while (DS18B20_DQ_Get()&amp;&amp;retry&lt;200)
        {
                retry++;
                Delay_us(1);
        };       
        if(retry&gt;=200)return 1;
        else retry=0;
    while (!DS18B20_DQ_Get()&amp;&amp;retry&lt;240)
        {
                retry++;
                Delay_us(1);
        };
        if(retry&gt;=240)return 1;          
        return 0;
}

//从DS18B20读取一个位    返回值:1/0
unsigned char DS18B20_Read_Bit(void)                        // read one bit
{
unsigned char data;

DS18B20_DQ_L();
        Delay_us(2);
   DS18B20_DQ_H();

        Delay_us(12);
        if(DS18B20_DQ_Get())data=1;
else data=0;       
Delay_us(50);         
return data;
}

/****************************************************************************
* 名    称: unsigned char DS18B20_Read_Byte(void)
* 功    能:从DS18B20读取一个字节
* 入口参数:无
* 返回参数:读到的一个字节数据
* 说    明:      
****************************************************************************/
unsigned char DS18B20_Read_Byte(void)   
{      
    unsigned char i,j,dat;
    dat=0;
        for (i=1;i&lt;=8;i++)
        {
      j=DS18B20_Read_Bit();
      dat=(j&lt;&lt;7)|(dat&gt;&gt;1);
    }                                                  
    return dat;
}


/****************************************************************************
* 名    称: void DS18B20_Write_Byte(unsigned char dat)
* 功    能:写一个字节到DS18B20
* 入口参数:dat:要写入的字节
* 返回参数:无
* 说    明:      
****************************************************************************/
void DS18B20_Write_Byte(unsigned char dat)   
{            
    unsigned char j;
    unsigned char testb;
    for (j=1;j&lt;=8;j++)
        {
      testb=dat&amp;0x01;
      dat=dat&gt;&gt;1;
      if (testb)
      {
            DS18B20_DQ_L();// Write 1
            Delay_us(2);                           
            DS18B20_DQ_H();
            Delay_us(60);            
      }
      else
      {
            DS18B20_DQ_L();// Write 0
            Delay_us(60);            
            DS18B20_DQ_H();
            Delay_us(2);                        
      }
    }
}

//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{                                                                 
    DS18B20_Rst();          
          DS18B20_Check();       
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}

/****************************************************************************
* 名    称: unsigned char DS18B20_Init(void)
* 功    能:初始化DS18B20的IO口DQ 同时检测18B20的存在
* 入口参数:dat:要写入的字节
* 返回参数:返回1:不存在
*         返回0:存在
* 说    明:      
****************************************************************************/       
unsigned char DS18B20_Init(void)
{
          IOC_Init_TypeDef init;
    IOC_ConfigStructInit(&amp;init);
    init.mode = IOC_AF_MODE_0;
    init.dir = GPIO_DIR_IN_OUT;
    init.pull = IOC_PULL_UP;
    IOC_Config(IOC_PIN_GPIO0_0, &amp;init);
    GPIO_PortOutputEnable(GPIO0, GPIO_PIN_00);
    GPIO_WritePin(GPIO0, GPIO_PIN_00, SET);
       
       
        DS18B20_Rst();
        return DS18B20_Check();
}

/****************************************************************************
* 名    称: short DS18B20_Get_Temp(void)
* 功    能:从ds18b20得到温度值
* 入口参数:无
* 返回参数:温度值 (-550~1250)
* 说    明:      
****************************************************************************/
short DS18B20_Get_Temp(void)
{
    unsigned char temp;
    unsigned char TL,TH;
          short tem;
    DS18B20_Start ();                  // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();       
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert          
    TL=DS18B20_Read_Byte(); // LSB   
    TH=DS18B20_Read_Byte(); // MSB   
    if(TH&gt;7)
    {
      TH=~TH;
      TL=~TL;
      temp=0;//温度为负
    }else temp=1;//温度为正                    
    tem=TH; //获得高八位
    tem&lt;&lt;=8;   
    tem+=TL;//获得底八位
    tem=(double)tem*0.625;//转换   
        if(temp)return tem; //返回温度值
        else return -tem;   
}
















</code></pre>

<p>需要代码的自己复制粘贴就行,。h文件的我就不复制了,太麻烦,</p>

<p>做好了之后我们做做硬件的连接。</p>

<div style="text-align: center;"></div>

<p>&nbsp;</p>
</div>

<div>&nbsp;</div>

<div>做好上述工作之后我们就可以验证了,</div>

<div>
<div style="text-align: center;"></div>

<div style="text-align: center;">我们可以看到DS18B20的温度是30摄氏度左右(和芯片发热有关系)</div>

<div style="text-align: center;">&nbsp;</div>

<div style="text-align: center;">&nbsp;</div>

<div style="text-align: center;">好了,今天的测试就到这里了。</div>

<p>&nbsp;</p>
</div>

<div>&nbsp;</div>

<div style="text-align: center;">&nbsp;</div>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

Jacktang 发表于 2024-10-26 14:32

<p>温度是30不算是热</p>
页: [1]
查看完整版本: 【翌创ET6001】-06 板载DS18B20测试