📄 ds18b20.c
字号:
/*************************
函数名:DS18B20
功能:发送复位和初始化
读数据
写数据
**************************/
#include <clock.h>
void dsreset(void) //发送复位和初始化
{
uint i;
DS=0;
i=103;
while(i>0)i--; //延时
DS=1;
i=4;
while(i>0)i--;
}
bit tmpreadbit(void) //读取数据的一位
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //读一个字节
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}
void tmp() //读取温度
{
float tt;
uchar a,b;
dsreset(); //复位
delay(1);
tmpwritebyte(0xcc); //跳过序列号命令
tmpwritebyte(0xbe); //发转换命令
a=tmpread(); //读取低位温度
b=tmpread(); //读取高位温度
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
// return temp;
}
void write_tmp(uchar add2,uchar date) //写温度
{
uchar bai,shi,ser;
ser=temp/10;
SBUF=ser;
bai=temp/100;
shi=temp%100/10;
write_com(0x80+0x40+add2);
write_date(0x30+bai);
write_date(0x30+shi);
}
void write_tmp1 (uchar add3,uchar date) //写温度小数点后一位
{
uchar ge,ser;
ser=temp/10;
SBUF=ser;
ge=temp%10;
write_com(0x80+0x40+add3);
write_date(0x30+ge);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -