📄 ds18b20.h
字号:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint temp; //定义16位整型的温度数据
float f_temp; //定义浮点型的温度数据
sbit DQ=P1^0; /* DS18B20单数据总线 */
void delay_ms(uint ms)
{
uchar x,y;
for(x=ms;x>0;x--)
for(y=110;y>0;y--);
}
/* DS18B20复位,初始化函数 */
void temp_init(void)
{
uint i;
DQ=1; //先拉高数据线
_nop_();
DQ=0; //拉低数据线
i=103;
while(i>0)i--; //延时,范围为480~~960us
DQ=1; //释放数据总线
i=4;
while(i>0)i--; //延时等待,完成复位
}
/* 读取DS18B20 一位数据函数 */
bit temp_read_bit(void) //按时序图
{
uint i;
bit dat;
DQ=0; i++; //起延时作用
DQ=1; i++;i++; //起延时作用
dat=DQ;
i=8; while(i>0)i--;
return(dat);
}
/** 读取1Byte数据函数 **/
uchar temp_read_byte(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=temp_read_bit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在前,这样刚好一个字节在dat
}
return(dat);
}
/* 向DS18B20写一个字节数据的子函数 */
void temp_write_byte(uchar dat)
{
uint i;
uchar j;
bit testb; //定义位
for(j=0;j<8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb==1) //写1
{
DQ=0;
i++;i++;
DQ=1;
i=8;while(i>0)i--;
}
else
{
DQ=0; //写0
i=8;while(i>0)i--;
DQ=1;
i++;i++;
}
}
}
/* DS18B20开始获取温度并转换 */
void tempchange(void)
{
temp_init(); //DS18B20复位,初始化函数
delay_ms(1);
temp_write_byte(0xcc); //跳过ROM指令
temp_write_byte(0x44); //写温度转换指令
}
/** 读取寄存器中储存的温度数据 **/
uint get_temp()
{
uchar a,b;
temp_init(); //DS18B20复位,初始化函数
delay_ms(1);
temp_write_byte(0xcc); //跳过ROM指令
temp_write_byte(0xbe); //发送读暂存器(内部RAM中9字节的温度数据)
a=temp_read_byte(); //读取低八位
b=temp_read_byte(); //读取高八位
temp=b;
temp<<=8; //把数据移到高八位
temp=temp|a; //把数据组合成16位
f_temp=temp*0.0625; //12位的数据,分辨率为0.0625℃
temp=f_temp*100+5; //*10表示取以位小数。+0.5是四舍五入
f_temp=f_temp+0.05;
return temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -