📄 ds18b20.c
字号:
/*------------------------------------------------------------------
//名称:温度传感器ds18b20程序
//作者:何 锦 权
//版本:1.0
//时间:2005/8/23
-------------------------------------------------------------------*/
#include <reg52.h>
#include "DS18B20.h"
/////////////////////////////////////////////////////////////////
//微秒级延时
void delay5ns(unsigned int i)
{
while(i--);
}
/////////////////////////////////////////////////////////////////、
//初始化
void DS18B20_INIT()
{
unsigned char x=0;
DQ = 1; //DQ复位
delay5ns(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay5ns(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay5ns(14);
x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay5ns(20);
}
/////////////////////////////////////////////////////////////////
//写命令
void DS18B20_WRITE(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
delay5ns(5);
DQ = 1;
dat >>= 1;
}
}
//////////////////////////////////////////////////////////////////
//读一个字节
unsigned char DS18B20_READ()
{
unsigned char i;
unsigned char dat;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
dat |= 0x80;
delay5ns(4);
}
return(dat);
}
///////////////////////////////////////////////////////////////////
//读温度
unsigned int DS18B20_READ_TEMP()
{
unsigned int templ,temph;
unsigned int temp_code;
DS18B20_INIT(); //复位
DS18B20_WRITE(0xcc); //跳过读序号列号的操作
DS18B20_WRITE(0x44); //启动温度转换
DS18B20_INIT();
DS18B20_WRITE(0xcc);
DS18B20_WRITE(0xbe); //读取温度寄存器, 前两个就是温度
templ = DS18B20_READ(); //读温度的低字节
temph = DS18B20_READ(); //读温度的高字节
temp_code = temph;
temp_code <<= 8;
temp_code |= templ;
temp_code *= 0.625; //处理,处理后的结果为实际值的十倍,相当于精确到小数点后第一位。
return( temp_code ); //返回温度值,返回值为实际温度的十倍
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -