📄 ds18b20.h
字号:
/*************DS18B20温度测量头文件************/
/****硬件平台:DS18B20单总线温度传感器***********/
/****硬件连接:P2_2接DQ(信号线2pin),电源3in,地1pin****************/
/****程序功能:实时温度测量,温度范围:0-125C,精度:0.1C************/
/****编程流程:初始化--写指令--读数据--数据处理--显示温度************/
/****功能改进:当温度为负时,一直显示0000;当拔下传感器时,一直显示0000(以前没有做处理,拔下后显示2559)*/
#define DQ P2_2 //定义通信端口
unsigned char code dottable[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,//小数部分近似处理16进制转化为10进制
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//延时函数
delay(unsigned int i)
{
while(i--);
}
/**************初始化函数****************/
Init18B20()
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //大于480us
DQ = 1; //拉高总线
delay(14); //等待15~60us
x=DQ; //读取DQ电平,如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
/**************读一个字节**************/
ReadByte()
{
unsigned char i,Byte=0;
for(i=0;i<8;i++)
{
DQ=0; //从高拉至低电平,后保持低电平1~4us
Byte>>=1;//低位先进,右移动
DQ=1; //拉高总线,产生读时间隙
if(DQ) //若DQ=1,则读1
Byte=Byte|0x80;
delay(4); //延时<15us
}
return(Byte);
}
/**************写一个字节**************/
WriteByte(unsigned char Byte)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=0; //DQ从高拉至低电平,产生写时间间隙
DQ=Byte&0x01; //把Byte的最低位写入DQ
delay(5); //延时<15us,将bit送给总线
DQ=1;
Byte>>=1; //低位先送出,Byte右移
}
}
/************数据处理函数*************/
DataDealing(unsigned char x,unsigned char y) //读出的温度值转化为要显示的数字
{
unsigned char tempx,tempy,tempyy;
unsigned int z;
if(x&0x80) z=0;
else {
tempx=x&0x0f; //整数部分=高4位(高字节的低半字节)+低四位(低字节的高半字节)
tempy=y&0xf0;
tempx<<=4;
tempy>>=4;
tempyy=y&0x0f; //小数部分=低字节的低半字节
tempyy=dottable[tempyy]; //查表近似处理
z=(tempx+tempy)*10+tempyy; //要显示的数字=整数+小数
}
return(z); //要显示的数字
}
/*************读取温度***************/
ReadTemperature()
{
unsigned char low,high;
unsigned int value; //温度值
EA=0; //关闭所有的中断,避免中断程序对18B20读写时序的打断,(18B20对时间延迟要求比较高),经实践加不加几乎没有影响,因为此段程序太短了。
Init18B20();
WriteByte(0xCC); //跳过读序号列号的操作,该指令允许总线不用提供64位ROM编码就使用存储器,节省时间
WriteByte(0xBE); //读取寄存器的内容,共9个寄存器,前两个(LSB,MSB)就是温度
low=ReadByte(); //低位,LSB,先读低位
high=ReadByte(); //高位,MSB,后读高位
Init18B20();
WriteByte(0xCC); //跳过读序号列号的操作,该指令允许总线不用提供64位ROM编码就使用存储器,节省时间
WriteByte(0x44); //启动温度转换
EA=1; //打开所有的中断,
value=DataDealing(high,low);//调用数据处理子程序,读出的温度值转化为要显示的数字
return(value);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -