void delay_us(uint count)//进入一次该函数需要11.95us
{
while(count--); //执行一次cout-- 需要6.5us
} //即delay_us(2)的延时时间为6.5*2+11.95
void delay_ms(uint y)
{
uint x;
for(;y>0;y--)
{
for(x=110;x>0;x--);
}
}
uchar DS18B20Init(void) //send reset and initialization command
{
uchar i=0;
DS=0;
delay_us(82);//复位,至少延时480us,挂在总线上的DS18B20将被复位
DS=1;//释放总线,
i=0;
while(DS)//延时等待82us
{
delay_ms(1);
i++;
if(i>5)
{
return 0;//初始化失败
}
}
return 1;//初始化成功
}
void writebyte(uchar byte) //write a byte to ds18b20
{
uchar j;
for(j=0;j<8;j++)
{
DS=0;//每次写入一个数据之前需要把总线拉低
_nop_();//15us内要释放总线,产生写时序
DS=byte&0x01;//写入字节从最低位开始
delay_us(10);//延时不少于60us,不可以大于120us
DS=1;//释放总线,准备下一次数据写入
byte>>=1;
}
}
uchar readbyte(void) //读字节
{
uchar i,j,byte;
for(i=0;i<8;i++)
{
DS=0;
_nop_();
_nop_();//延时至少1us,产生读时序
DS=1;
delay_us(1);//释放总线
j=DS;//数据采集,
delay_us(10);//延时不少于60us
byte=(j<<7)|(byte>>1);
delay_us(6);
}
return byte;
}
void main()
{
int i,temp;
uchar L,H;
while(1)
{
DS18B20Init();//初始化
delay_ms(1);
writebyte(0xcc); // address all drivers on bus,发送跳跃ROM指令
writebyte(0x44); // initiates a single temperature conversion,发送温度转换指令
DS18B20Init();//主机和DS18B20做任何通讯前需要对其初始化
delay_ms(1);
writebyte(0xcc);//发送跳跃ROM
writebyte(0xbe);//读取DS18B20暂存器值
L=readbyte();//读低俗暂存器的值
H=readbyte();//读高速暂存器的值
i=H;
i<<=8;//H移到高8位
i|=L;//L写入i的低字节
if(i<0)
{
i=i-1;
temp=~i;
}
else
{
temp=i;
}
i=temp*0.0625*10000 ;//浮点型数据转换
Display(i);
}
}
|