📄 ds18b20.c
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/utility.h"
#include"inc/ds18b20.h"
sbit DS18B20_DQ= P1^4; //单总线引脚
extern vu8 idata week_tempert[8];
/*********************************************************
*将获取的当前温度设置为待显示数据
*函数名称:setTempertShowData()
*说明:这是一个RTX51任务,os_create_task(3)之后开始运行
*********************************************************/
void setTempertShowData(void ) _task_ 8
{
t_tempert tempert;
while(1)
{
getTempert(&tempert);
if(tempert.flag>0)
week_tempert[3]=12;
else
week_tempert[3]=11;
week_tempert[4]=(tempert.tempert>>4) & 0x0F;
week_tempert[5]=tempert.tempert & 0x0F;
os_wait(K_TMO,20,0);
}
}
/**********************************************************
*DS1820复位及存在检测(通过存在脉冲判断有无正常工作的DS1820)
*函数名称:DS1820_reset()
*说明:函数返回一个位标量(0或1)flag=0存在,反之flag=1不存在
**********************************************************/
bit DS18B20_reset()
{
bit flag;
DS18B20_DQ = 0; //拉低总线
delay20US(30); //延时至少480us,产生复位脉冲
DS18B20_DQ = 1; //释放总线
delay20US(4); //延时60--240微秒后对总线采样
flag=DS18B20_DQ;
delay20US(15); //延时至少240微秒等待总线恢复
return flag;
}
/**********************************************************
*写数据到DS1820
*函数名称:DS1820_inputByte()
*说明:
**********************************************************/
void DS18B20_inputByte(u8 ibyte)
{
u8 i,delay;
for (i=8;i>0;i--)
{
DS18B20_DQ = 0; //拉低总线,产生写信号
for(delay=2;delay>0;delay--) ; //延时4us
DS18B20_DQ = ibyte&0x01; //发送1位
delay20US(4); //写时序至少要60us--120us
DS18B20_DQ = 1; //释放总线,等待总线恢复
ibyte>>=1; //准备下一位数据的传送
}
}
/**********************************************************
*从DS1820中读出数据
*函数名称:DS1820_outputByte()
*说明:
**********************************************************/
u8 DS18B20_outputByte()
{
u8 i,delay,obyte;
for (i=8;i>0;i--)
{
obyte>>=1;
DS18B20_DQ = 0; //拉低总线,产生读信号
for(delay=2;delay>0;delay--); //延时4us
DS18B20_DQ = 1; //释放总线,准备读数据
for (delay=4;delay>0;delay--); //延时8微秒读数据
if (DS18B20_DQ == 1)
obyte |= 0x80;
delay20US(4); //延时80us
DS18B20_DQ = 1; //拉高总线,准备下一位数据的读取.
}
return obyte;//返回读到的数据
}
/**********************************************************
*获取当前温度
*函数名称:getTempert()
*说明:
**********************************************************/
void getTempert(t_tempert * t)
{
u8 i;
u8 tempert[2];
DS18B20_reset(); //复位
DS18B20_inputByte(0xcc); //跳过ROM命令
DS18B20_inputByte(0x44); //温度转换命令
os_wait(K_TMO,100,0); //完成温度转换至少需要750ms
DS18B20_reset(); //复位
DS18B20_inputByte(0xcc); //跳过ROM命令
DS18B20_inputByte(0xbe); //读DS1820温度暂存器命令
for (i=0;i<2;i++)
tempert[i]=DS18B20_outputByte();
DS18B20_reset(); //复位,结束读数据
if(tempert[1] & 0xF8==0)
(*t).flag=1;
else
(*t).flag=-1;
(*t).tempert=((tempert[1] & 0x07)<<4) + ((tempert[0] & 0xF0)>>4);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -