📄 ds18b20.c
字号:
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
uchar tplsb,tpmsb;
sbit DQ=P1^2;
//延时tms
void delay(uint t)
{
uint i;
while(t--)
{
for(i=0;i<125;i++)
{}
}
}
//温度转换为十进制
uint TempTrans(uchar ht,uchar lt)
{
uint i=0,k=0;
CY=0;
i=ht;
i=i<<8;
k=lt&0xf0;
i=i|k;
return(i);
}
//产生复位脉冲
void TxReset(void)
{
uint i;
DQ=0;
i=100;
while(i>0)i--;
DQ=1;
i=4;
while(i>0)i--;
}
//等待应答脉冲
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ);
i=4;
while(i>0)i--;
}
//读取数据的一位
bit RdBit(void)
{
uint i;
bit b;
DQ=0;
i++;
DQ=1;
i++;
i++;
b=DQ;
i=8;
while(i>0)i--;
return(b);
}
//读数据一个字节
uchar RdByte(void)
{
uchar i,j,b;
b=0;
for(i=1;i<=8;i++)
{
j=RdBit();
b=(j<<7)|(b>>1);
}
return(b);
}
//写数据一个字节
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1;
if(btmp)
{
DQ=0;
i++;i++;
DQ=1;
i=8;
while(i>0)i--;
}
else
{
DQ=0;
i=8;
while(i>0)i--;
DQ=1;
i++;
i++;
}
}
}
//启动温度转换
void convert(void)
{
TxReset();
RxWait();
delay(1);
WrByte(0xcc);
WrByte(0x44);
}
//读取温度值
void RdTemp(void)
{
TxReset();
RxWait();
delay(1);
WrByte(0xcc);
WrByte(0xbe);
tplsb=RdByte();
tpmsb=RdByte();
// TH=RdByte();
// TL=RdByte();
}
/**void WrTemp(uchar ht,uchar lt)
{
TxReset();
RxWait();
delay(1);
WrByte(0xcc);
WrByte(0x4e);
WrByte(ht);
WrByte(lt);
WrByte(0x7f);
}
/*void alarm(void)
{
TxReset();
RxWait();
delay(1);
WrByte(0xcc);
WrByte(0xbe);
}*/
uchar ds18b20_read(void)
{
uchar temp=0;
//WrTemp(20,10);
delay(1);
convert();
delay(1000);
RdTemp();
temp=TempTrans(tplsb,tpmsb);
return(temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -