📄 ds18b20.h
字号:
/**********************DS18B20.h**********************/
/*********************温度测量头文件******************/
/****************数据和控制总线PORTA_BIT0*************/
/**************宏定义***************/
#define uchar unsigned char
#define uint unsigned int
/**************LED地址***************/
#define TMDAT PORTA_BIT0 //控制线兼数据线
unsigned char Temp_Integer=0; //温度整数部分
unsigned char Temp_Decimal=0; //温度小数部分
unsigned char fg=0; //温度正负标志
//-------------------------------------------------------------------------------------
//函数名称:delay
//入口参数:count
//函数功能:延时子程序
//-------------------------------------------------------------------------------------
/*********************delay函数*****************************/
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<5;j++); //delay(1) 10us;delay(10) 60us;delay(100) 567us
}
//-------------------------------------------------------------------------------------
//函数名称:Reset_18B20
//入口参数:无
//函数功能:
//-------------------------------------------------------------------------------------
void Reset_18B20(void)
{
DDRA=0xff; //输出脉冲
delay(1);
TMDAT=0;
delay(100); //延时约530us总线停留在低电平超过480μs,总线上的所有器件都将被复位
TMDAT=1;
delay(5);
}
//-------------------------------------------------------------------------------------
//函数名称:Wait_18B20
//入口参数:无
//函数功能:等待DS18B20应答
//-------------------------------------------------------------------------------------
void Wait_18B20(void)
{
DDRA=0x00; //输入检测
// PORTA=0xff;
delay(5);
while(TMDAT);
delay(10);
PORTB=0xfe;
DDRA=0xff; //输出脉冲
TMDAT=1;
delay(100);
/* delay(10);
DDRA=0x00; //输入检测
PORTA=0xff;
delay(10);
while(TMDAT==0);
DDRA=0xff; //输出脉冲
delay(1);
TMDAT=1;
PORTB=0xfc;
// PORTB=0x00;
delay(10); */
}
//-------------------------------------------------------------------------------------
//函数名称:Readbit_18B20
//入口参数:无
//返回值: dat
//函数功能:在总线上读一位
//-------------------------------------------------------------------------------------
uchar Readbit_18B20(void)
{
uchar dat=0;
DDRA=0xff; //输出脉冲
TMDAT=0;
delay(1);
TMDAT=1;
delay(1);
DDRA=0xfe; //输入脉冲
dat=TMDAT;
delay(10);
return(dat);
}
//-------------------------------------------------------------------------------------
//函数名称:Readbyte_18B20
//入口参数:无
//返回值: dat
//函数功能:读一个字节
//-------------------------------------------------------------------------------------
uchar Readbyte_18B20(void)
{
uchar i=0,j=0,dat=0;
for(i=1;i<=8;i++)
{
j=Readbit_18B20();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
//-------------------------------------------------------------------------------------
//函数名称:Writebyte_18B20
//入口参数:dat
//函数功能:写命令
//-------------------------------------------------------------------------------------
void Writebyte_18B20(uchar dat)
{
uint i=0;
uchar j=0;
uchar testb=0;
DDRA=0xff; //输出脉冲
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
TMDAT=0; //写1
delay(1);
TMDAT=1;
delay(5);//写时间隙开始后的15μs内允许数据线拉到高电平
}
else
{
TMDAT=0; //写0
delay(15);//主机要生成一个写0 时间隙,必须把数据线拉到低电平并保持至少60μs
TMDAT=1;
delay(1);
}
}
}
//-------------------------------------------------------------------------------------
//函数名称:Start_Convert
//入口参数:无
//函数功能:开始转换
//-------------------------------------------------------------------------------------
void Start_Convert(void)
{
Reset_18B20(); //复位DS18B20
Wait_18B20(); //等待DS18B20应答
delay(5);
Writebyte_18B20(0xcc);
Writebyte_18B20(0x44);
}
//-------------------------------------------------------------------------------------
//函数名称:Readbyte_18B20
//入口参数:无
//函数功能:读取温度值
//-------------------------------------------------------------------------------------
void Get_temp()
{
uchar H_18B20=0,L_18B20=0,y1=0,y2=0;
fg=0;
Reset_18B20(); //复位DS18B20
Wait_18B20(); //等待DS18B20应答
delay(10);
Writebyte_18B20(0xcc); //跳过ROM命令
Writebyte_18B20(0xbe); //发送读取数据命令
L_18B20=Readbyte_18B20(); //读取温度低八位数据
H_18B20=Readbyte_18B20(); //读取温度高八位数据
/* H_18B20=0x01;
L_18B20=0xD8; */
if(H_18B20>0x7f) //最高位为1时温度是负
{
L_18B20=~L_18B20+1; //补码转换,取反加一
H_18B20=~H_18B20;
fg=1; //读取温度为负时fg=1
}
//温度小数部分
Temp_Decimal=L_18B20&0x0f;
//温度整数部分
L_18B20=L_18B20>>4;
H_18B20=H_18B20<<4;
Temp_Integer=H_18B20|L_18B20;
}
/*********************************************************************
*功能:延时子程序
*说明:形参Delayms=5000,时间延长大约为1s
*********************************************************************/
void Delay(uint Delayms)
{
uchar j;
uint i;
for(i=0;i<Delayms;i++)
for(j=0;j<255;j++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -