📄 ds18b20.c
字号:
#include "DS18B20.h"
volatile char wendu[3];
void delay_18b20(unsigned int t)
{
while(t--);
}
unsigned char init_18b20()
{
unsigned char i=0;
DQ=1;
DQ=0;
delay_18b20(79); //延时480us-960us
DQ=1;
delay_18b20(4); //延时15us-60us
i=DQ;
while(!DQ);
return(i);
}
unsigned char read_18b20_byte( void )
{
unsigned char times,ram;
ram = 0;
for ( times = 8; times > 0; times--)
{
ram >>= 1; //将采样到的数据依次向低位移
DQ=0; //将总线拉低,然后释放。整个过程不大于15us
_nop_(); _nop_(); //delay 2us
DQ=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
if( DQ ) //采样总线上的数据
{
ram |= 0x80;
}
delay_18b20(4); //延时,使整个读操作时序大于60us.
}
return ram;
}
void write_18b20_byte(unsigned char command)
{
unsigned char i;
for (i = 8; i > 0; i--)
{
if((command & 0x01))
{
//写1操作
DQ=0;
_nop_(); _nop_();
DQ=1; //将DQ拉低,延时2us后释放,以上操作必须在15us内完成
delay_18b20(4); //延时,使整个操作大于60us。本次52us
}
else
{
//写0操作
DQ=0;
delay_18b20(4); // 本次 52us
}
DQ=1;
command >>= 1; //两个写操作之间,至少有1us的间隙,此语句4us
}
}
void get_wendu()
{
unsigned char a,b;
float get_temp;
int temp1,temp2;
init_18b20();
write_18b20_byte(0xcc);
write_18b20_byte(0x44); //温度转换
init_18b20();
write_18b20_byte(0xcc);
write_18b20_byte(0xbe); //读温度
a=read_18b20_byte();
b=read_18b20_byte();
temp1=b;
temp1=temp1<<8;
temp1=temp1|a;
get_temp=temp1*0.0625;
temp2=get_temp*10+0.5; //扩大十倍并四舍五入
wendu[0]=temp2%1000/100; //十位
wendu[1]=temp2%1000%100/10; //个位
wendu[2]=temp2%1000%100%10; //小数位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -