📄 ds18b20.c
字号:
#include<reg52.h>
#include<stdio.h>
sbit TMDAT=P3^2; //DS18B20 的数据输入/输出脚DQ,根据情况设定
bit fg=1; //温度正负标志unsigned char Data[4]={0};
void dmsec(unsigned int count);
void tmreset (void);
unsigned char tmrbyte (void);
void tmwbyte(unsigned char dat);
void tmstart (void);
void tmrtemp (void);
void DS18B20PRO(void);
extern unsigned char Data[4]={0};
/***********************************************************************************************/
void dmsec(unsigned int count) //延时部分
{
unsigned char i;
while(count--)
{
for(i=0;i<115;i++);
}
}
/*************************************************************************************************/
void tmreset (void) //发送复位
{
unsigned char i;
TMDAT=0;
for(i=0;i<103;i++);
TMDAT=1;
for(i=0;i<4;i++);
}
bit tmrbit(void) //读一位//
{
unsigned int i;
bit dat;
TMDAT=0;
i++;
TMDAT=1;
i++;i++; //微量延时//
dat=TMDAT;
for(i=0;i<8;i++);
return(dat);
}
/************************************************************************************************/
unsigned char tmrbyte (void) //读一个字节
{
unsigned char i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmwbyte(unsigned char dat) //写一个字节
{
unsigned char j,i;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
TMDAT=0; //写0
i++;i++;
TMDAT=1;
for(i=0;i<8;i++);
}
else
{
TMDAT=0; //写0
for(i=0;i<8;i++);
TMDAT = 1;
i++;i++;
}
}
}
/**********************************************************************************************/
void tmstart (void) //发送ds1820 开始转换
{
tmreset(); //复位
dmsec(1); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发转换命令44H,
}
/************************************************************************************************/
void tmrtemp (void) //读取温度
{
unsigned char a,b;
//unsigned char x,y,z;
tmreset (); //复位
dmsec (1); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0xbe); //发送读取命令
a=tmrbyte (); //读取低位温度
b=tmrbyte (); //读取高位温度
if(b>0x7f) //最高位为1 时温度是负
{
a=~a;b=~b+1; //补码转换,取反加一
fg=0; //读取温度为负时fg=0
}
Data[0]=(a/16+b*16)/10; //整数十位
Data[1]=(a/16+b*16)%10; //整数个位
Data[2]=(a&0x0f)*10/16; //小数第一位
Data[3]=(a&0x0f)*100/16%10; //小数第二位
/*x=a>>4;
y=b<<4;
z=x|y;
Data[0]=(z/0x0a+0x30)/10;
Data[1]=(z%0x0a+0x30)%10;
Data[2]=(a&0x0f)*10/16; */
}
/***********************************************************************************************/
void DS18B20PRO(void)
{
tmstart();
dmsec(5); //如果是不断地读取的话可以不延时//
tmrtemp(); //读取温度,执行完毕温度将存于TMP 中//
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -