下面是我写的DS18B20读取温度的程序/************************************************
*名称: DS18B20温度传感器设计子程序
*说明: 外部电源供电,温度值为整数值,无报警功能
***************************************************/
#include<reg51.h>
#include"typedef.h"
#include"DS18B20.h"
sbit DQ=P1^5; //温度传感器信号线
//延时函数
/*void delay(u8 x)
{
u8 a;
for(x;x>0;x--)
for(a=100;a>0;a--);
}
*/
void rest() //DS18B20复位函数
{
u8 i;
DQ=1;
DQ=0;
i=250;
while(--i); //约500周期
DQ=1;
i=30;
while(--i); //30周期
while(DQ); //等待总线应答--拉低
i=100; //200周期
while(--i);
}
bit tempreadbit() //读一位数据
{
u8 i;
bit dat;
DQ=1;
DQ=0;
i++; //延时1个周期
DQ=1;
i=4;
while(--i); //延时9周期
dat=DQ;
i=25;
while(--i); //延时50个周期
return dat;
}
u8 tempread() //读一个字节的数据
{
u8 i,j,dat;
dat=0;
for(i=0;i<8;i++)
{
j=tempreadbit()&0x01;
dat=(j<<7)|(dat>>1);
}
return dat;
}
void tempwrite(u8 dat) //写一个字节数据
{
u8 i,j;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
j++;
DQ=dat&0x01;
j=30;
while(j--);
DQ=1;
dat>>=1;
}
}
void tempchang() //开始获取温度并转换
{
rest();
tempwrite(0xcc);
tempwrite(0x44);
}
u16 RDtemp() //开始读取温度
{
u8 Th,Tl,temp;
u16 Temp;
// float F_temp;
rest();
tempwrite(0xcc);
tempwrite(0xbe);
Tl=tempread();
Th=tempread();
Temp=Th;
Temp<<=8;
Temp=Temp|Tl;
Temp>>=4;
// F_temp=Temp*0.0625;
// Temp=F_temp*8+0.5;
temp=Temp;
return temp;
}
本菜鸟脸皮比较厚,大家尽管批,有则改之无则加勉~:lol |