【翌创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;"> </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()&&retry<200)
{
retry++;
Delay_us(1);
};
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_Get()&&retry<240)
{
retry++;
Delay_us(1);
};
if(retry>=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<=8;i++)
{
j=DS18B20_Read_Bit();
dat=(j<<7)|(dat>>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<=8;j++)
{
testb=dat&0x01;
dat=dat>>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(&init);
init.mode = IOC_AF_MODE_0;
init.dir = GPIO_DIR_IN_OUT;
init.pull = IOC_PULL_UP;
IOC_Config(IOC_PIN_GPIO0_0, &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>7)
{
TH=~TH;
TL=~TL;
temp=0;//温度为负
}else temp=1;//温度为正
tem=TH; //获得高八位
tem<<=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> </p>
</div>
<div> </div>
<div>做好上述工作之后我们就可以验证了,</div>
<div>
<div style="text-align: center;"></div>
<div style="text-align: center;">我们可以看到DS18B20的温度是30摄氏度左右(和芯片发热有关系)</div>
<div style="text-align: center;"> </div>
<div style="text-align: center;"> </div>
<div style="text-align: center;">好了,今天的测试就到这里了。</div>
<p> </p>
</div>
<div> </div>
<div style="text-align: center;"> </div>
<p> </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> <p>温度是30不算是热</p>
页:
[1]