📄 ds18b20.c
字号:
#include"DS18B20.h"
void initialize_clk()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
do
{
IFG1 &= ~OFIFG; //清除振荡错误标志
for(i = 0; i < 100; i++)
_NOP(); //延时等待
}
while ((IFG1 & OFIFG) != 0); //如果标志为1继续循环等待
IFG1&=~OFIFG;
}
void delay_18B20(int i)
{
while(i--);
}
void initialize_DS18B20(void)
{
DS18B20|=DQ;
DQ_OUT |= DQ; //DQ复位 ______ _____ ____
delay_18B20(10); //稍做延时 |_____.......________| |__|
DQ_OUT &= (~DQ); //主机将DQ拉低 |<---">480us"------->| ->| |<-18B20将数据线拉低
delay_18B20(680); //大于 480us延时
DS18B20&=(~DQ); //转为输入状态
delay_18B20(100); //等待18B20将数据线拉低
while(!(DQ_IN&DQ)); //为低则等待18B20释放数据线,
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
DS18B20|=DQ;
for (i=8; i>0; i--)
{
DQ_OUT &= (~DQ); //拉低数据线
delay_18B20(5); //稍做延时
if(dat&0x01)
DQ_OUT |= DQ;
else DQ_OUT &= (~DQ); //输出数据
delay_18B20(70); //保持45us
DQ_OUT |= DQ; //恢复数据线
delay_18B20(1); //两位间隔>1us
dat>>=1; //dat=dat右移一位
}
}
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
DS18B20|=DQ;
for (i=8;i>0;i--)
{
DS18B20|=DQ;
DQ_OUT &= (~DQ); //拉低数据线
dat>>=1; //dat=dat右移一位
DS18B20&=(~DQ); //将数据线交给18b20,此时端口被上啦电阻拉高
delay_18B20(5); //等待18b20送出数据
if(DQ_IN&DQ) //读取数据
dat|=0x80; //dat=dat||0x80
delay_18B20(60); //读间隙>60us
}
return(dat);
}
unsigned long ReadTemperature(void)
{
unsigned char a,b;
unsigned long l;
initialize_clk();
delay_18B20(100);
initialize_DS18B20();
WriteOneChar(0xcc); //跳过ROM
WriteOneChar(0xBE); //读暂存存储器
a=ReadOneChar(); //读低八位
b=ReadOneChar(); //读高八位
l=b;
l=l<<8;
l=l|a;
l=l*625;
delay_18B20(100);
initialize_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44); //启动下一次转换
return l;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -