📄 ds18b20.h
字号:
#ifndef __DS18B20_H__
#define __DS18B20_H__
#include <reg51.h>
#include <intrins.h>
sbit DS18B20_DQ = P0^7;
#define DS18B20_CONVERT_TEMP 0x44
#define DS18B20_WRITE_SCRATCHPAD 0x4E
#define DS18B20_READ_SCRATCHPAD 0xBE
#define DS18B20_COPY_SCRATCHPAD 0x48
#define DS18B20_RECALL_E2 0xB8
#define DS18B20_READ_POWER 0xB4
#define DS18B20_READ_ROM 0x33
#define DS18B20_MATCH_ROM 0x55
#define DS18B20_SKIP_ROM 0xCC
#define DS18B20_SEARCH_ROM 0xF0
#define DS18B20_ALARM_ROM 0xEC
//extern unsigned char DS_CODE[8];
unsigned char temp_data,temp_data_2;
unsigned int TempDec; //用来存放4位小数
void delay_50us_DS(unsigned int t);
void WriteByte_DS(unsigned char dat);
unsigned char ReadByte_DS(void);
bit Reset_DS(void);
void ReadCode_DS(void);
void Init_DS(void);
void Read_Temp_DS(void);
unsigned char DS_CODE[9];
unsigned char TEMP_DS[2];
unsigned char OK_TEMP_DS[10];
void delay_50us_DS(unsigned int t)
{
unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
void Init_DS(void) {
}
void Read_Temp_DS(void) {
Reset_DS();
WriteByte_DS(DS18B20_SKIP_ROM);
WriteByte_DS(DS18B20_CONVERT_TEMP);
Reset_DS();
WriteByte_DS(DS18B20_SKIP_ROM);
WriteByte_DS(DS18B20_READ_SCRATCHPAD);
TEMP_DS[0] = ReadByte_DS();
TEMP_DS[1] = ReadByte_DS();
Reset_DS();
temp_data = TEMP_DS[1];
temp_data &= 0xf0; //取高4位
if (temp_data==0xf0) //判断是正温度还是负温度读数
{
//负温度读数求补,取反加1,判断低8位是否有进位
if (TEMP_DS[0]==0)
{ //有进位,高8位取反加1
TEMP_DS[0]=~TEMP_DS[0]+1;
TEMP_DS[1]=~TEMP_DS[1]+1;
}
else
{ //没进位,高8位不加1
TEMP_DS[0]=~TEMP_DS[0]+1;
TEMP_DS[1]=~TEMP_DS[1];
}
}
temp_data = TEMP_DS[1]<<4; //取高字节低4位(温度读数高4位)
temp_data_2 = TEMP_DS[0]>>4; //取低字节高4位(温度读数低4位)
temp_data = temp_data|temp_data_2; //组合成完整数据
OK_TEMP_DS[0] = temp_data/100+0x30; //取百位转换为ASCII码
OK_TEMP_DS[1] = (temp_data%100)/10+0x30; //取十位转换为ASCII码
OK_TEMP_DS[2] = (temp_data%100)%10+0x30; //取个位转换为ASCII码
TEMP_DS[0]&=0x0f; //取小数位转换为ASCII码
TempDec = ((TEMP_DS[0]&0x0f)*0.0625)*10000;//小数部分,扩大1万倍
OK_TEMP_DS[3] = '.';
OK_TEMP_DS[4] = TempDec/1000+0x30; //取小数个位转换为ASCII码
OK_TEMP_DS[5] = (TempDec%1000)/100+0x30; //取小数十位转换为ASCII码
OK_TEMP_DS[6] = ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
OK_TEMP_DS[7] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码
OK_TEMP_DS[8] = 'C';
OK_TEMP_DS[9] = '\0';
}
void ReadCode_DS(void) {
unsigned char i;
Reset_DS();
WriteByte_DS(DS18B20_READ_ROM);
for(i = 0; i < 8; i++)
{
DS_CODE[i] = ReadByte_DS();
}
}
void WriteByte_DS(unsigned char dat) {
unsigned char i;
for(i = 0; i < 8; i++)
{
DS18B20_DQ = 0;//拉低总线
_nop_();_nop_();
DS18B20_DQ = dat & 0x01;
delay_50us_DS(2);//至少保持60us
DS18B20_DQ = 1;
dat >>= 1;
}
}
unsigned char ReadByte_DS(void) {
unsigned char dat, i;
bit r;
for(i = 0; i < 8; i++)
{
dat >>= 1;
DS18B20_DQ = 0;//拉低总线
_nop_();_nop_();_nop_();_nop_();_nop_();
DS18B20_DQ = 1;//释放总线 准备读数据
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
r = DS18B20_DQ;
if(r == 1) dat |= 0x80;
delay_50us_DS(1);
DS18B20_DQ = 1;
}
return dat;
}
bit Reset_DS(void) {
bit f;
DS_CODE[8] = '\0';
DS18B20_DQ = 1;
_nop_();_nop_();_nop_();_nop_();
//拉低总线 延时480us - 960us产生复位脉冲
DS18B20_DQ = 0;
delay_50us_DS(10);
//释放总线
DS18B20_DQ = 1;
delay_50us_DS(2);
//采样应答脉冲...
f = DS18B20_DQ;
//延时恢复总线
delay_50us_DS(8);
return f;
}
#endif //__DS18B20_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -