您的位置 首页 芯闻

[C51代码]DS18B20驱动

/*******************ds18b20.c**************************/#includeAtmel/AT89X51.h#includelink.h#includ

/*******************ds18b20.c**************************/
#include “Atmel/AT89X51.h”
#include “link.h”
#include “ds18b20.h”
#include “delay.h”

/**************定量界说***************/
union
{
uchar c[2];
uint x;

}temp;

uchar idata flag=0;
uint idata cc=0;
uchar idata disp[8];

/****************************************************************
*函数功用:复位DS18B20
*进口参数:无
*出口参数:presence,指示复位是否成功
****************************************************************/
uchar Reset_DS18B20(void)
{
uchar presence;
DQ = 0; //pull DQ line low
delay(248); // leave it low for 500us
DQ = 1; // allow line to return high
delay(48); // wait for presence 100us
presence = DQ; // get presence signal
delay(198); // wait for end of timeslot 400us
return(presence); // presence signal returned
} // 0=presence, 1 = no part

/****************************************************************
*函数功用:读取DS18B20的一个字节
*进口参数:无
*出口参数:value,读取的一个字节
****************************************************************/
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i–)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
DQ = 1; // then return high
delay(3); // 11us
if(DQ) value|=0x80;
delay(25); // wait for rest of timeslot 55us
}
return(value);
}

/****************************************************************
*函数功用:写一个字节到DS18B20
*进口参数:val,要写的一个字节
*出口参数:无
****************************************************************/
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i–)
{
DQ = 0; // pull DQ low to start timeslot
DQ = val&0x01; // 写1时,使得15us以内拉高 整个写1时隙不低于60us,写0时坚持低在60us到120us之间
delay(38); // hold value for remainder of timeslot 80us
DQ = 1;
val=val/2;
}
delay(38); //80us
}
/****************************************************************
*函数功用:读取DS18B20的温度值
*进口参数:无
*出口参数:temp.x温度值
****************************************************************/
uint Read_Temperature(void)
{ EA=0;
Reset_DS18B20();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
temp.c[1]=read_byte();
temp.c[0]=read_byte();
Reset_DS18B20();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
return temp.x;
}
/****************************************************************
*函数功用:将DS18B20的温度值送LCD显现
*进口参数:无
*出口参数:无
****************************************************************/
void DS18B20Disp(void)
{
flag=0; //温度正负标志位
cc=Read_Temperature();
if (cc>0xf800)
{
flag=1;

cc=~cc+1;
}
cc=cc*0.625;

disp[0]=0+cc/1000;
disp[1]=0+(cc/100)%10;
disp[2]=0+(cc/10)%10;
disp[3]=.; //小数点
disp[4]=0+cc%10;
disp[5]=0xdf;
disp[6]=C;
disp[7]=\0;

if(flag)
{ if (disp[1]==0)
{
disp[0]= ;
disp[1]=-;

}
else disp[0]=-;

}
else
{ if (disp[0]==0)
{
disp[0]= ;
if(disp[1]==0) disp[1]= ;
}

}
}
/* 延时函数为
void delay(unsigned char i)
{
while(–i);
}
*/

/*******************ds18b20.h**************************/
#ifndef _DS18B20_h_
#define _DS18B20_h_
#include “Atmel/AT89X51.h”
#include “link.h”
/**************引脚界说***************/
sbit DQ=P1^0; //IO

/**************变量声明***************/
extern uchar idata disp[8];

/**************函数声明***************/
extern uchar Reset_DS18B20(void);
extern uchar read_byte(void);
extern void write_byte(uchar val);
extern uint Read_Temperature(void);
extern void DS18B20Disp(void);

#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/275357.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部