当前位置:文档之家› ds18b20读取温度程序

ds18b20读取温度程序

#include
#include

#define uchar unsigned char
#define uint unsigned int

#define L_W_D XBYTE[0Xf5ff]
#define L_W_C XBYTE[0Xf1ff]
#define L_R_C XBYTE[0Xf3ff]

/*******DS18B20定义*****/
sbit DQ=P3^5;//ds18b20与单片机连接口
//unsigned char code str1[]={"temperature: "};
//unsigned char code str2[]={" "};
uint avalue;//温度值
uchar tflag;//温度正负标志


/*******************************************************************************************/
/************************函数声明*******************************************************************/
void delay();
void wait();
void send_command(uint command) ;
void send_data(uint sdata) ;
void delay_18B20(unsigned int i);
void ds18b20rst();
uchar ds18b20rd();
void ds18b20wr(uchar wdata);
void read_temp();
void ds1820disp(uint tvalue);
/***********************1602写命令程序******************************************************/
void send_command(uint command)
{
wait();
L_W_C=command;
}



/***************************1602**********************************************/
void delay()
{
uint i,j;
for(i=0;i<50;i++)
for(j=0;j<50;j++)
;
}
/**************************读忙程序**************************************************/
void wait()
{
uchar x;
do
{x=L_R_C;}
while(x&0x80);
delay();
}

/*************************1602写数据程序*****************************************************/
void send_data(uint sdata)
{
wait();
L_W_D=sdata;
}

/******************************ds18b20程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
while(i--);
}

void ds18b20rst()/*ds18b20复位*/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1; //拉高
delay_18B20(40);
}

uchar ds18b20rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}

void ds18b20wr(uchar wdata)/*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
void read_temp()/*读取温度值并转换*/
{
uchar a1,b1;
uchar flagdat;
uint a,b,c,d;
ds18b20rst();
ds18b20wr(0xcc);//*跳过读序列号*/
ds18b20wr(0x44);//*启动温度转换*/
delay();
ds18b20rst();
ds18b20wr(0xcc);//*跳过读序列号*/
ds18b20wr(0xbe);//*读取温度*/
a1=ds18b20rd();
b1=ds18b20rd();
avalue=(b1<<8);

avalue+=a1;
if(avalue<0x0fff)
tflag=0;
else
{
avalue=~avalue+1;
tflag=1;
}
avalue=avalue*(0.625);//温度值扩大10倍,精确到1位小数

a=avalue/1000+

0x30;//百位数
b=avalue%1000/100+0x30;//十位数
c=avalue%100/10+0x30;//个位数
d=avalue%10+0x30;//小数位

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(a==0x30)
{
a=0x20;//如果百位为0,不显示
if(b==0x30)
{
b=0x20;//如果百位为0,十位为0也不显示
}
}
send_command(0x80);
send_data(flagdat);//显示符号位
send_command(0x80);
send_data(a);//显示百位
send_command(0x81);
send_data(b);//显示十位
send_command(0x82);
send_data(c);//显示个位
send_command(0x83);
send_data(0x2e);//显示小数点
send_command(0x84);
send_data(d);//显示小数位
send_command(0x85);
send_data(0xdf);//显示小数位

}

/***************主函数**********************************************/
main()
{
uint i;
send_command(0x38);
send_command(0x0c);
send_command(0x06);
send_command(0x01);
send_command(0x81);
send_data(0x35);

Init905();
Config905();

while(1)
{
read_temp();//显示
}


}

相关主题
文本预览
相关文档 最新文档