📄 ds18b20.c
字号:
/******************************************************************************/
/**
/** 功能描述:通过AT89S/C52,DS18B20和6位数码管,采集温度并在数码管上实时显示。
/** 并有相应的不同颜色的led和蜂鸣器指示。
/** 创 建 人:chiusir@yahoo.cn 日期:2008-04-06 */
/** 修 改 人: 日期:2008-04-18 */
/** 其他说明:
/******************************************************************************/
#include<regx51.h>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
sbit SIO = P2^0;
/*******************************************************************************
*** 函 数 名: void DLY_us(U8 x)
*** 功能描述: 微秒级延时;
*** 全局变量: NO !
*** 输 入: x !
*** 输 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函数说明:
*** //1-5,2-7,3-9 ,5--16.5us,10-30.4,22-52,25-58,35-78,61-125,125-250,250--500us
/******************************************************************************/
void DLY_us(U8 x) //x取值1~255;
{
while(--x);
}
/*******************************************************************************
*** 函 数 名: void DLY_ms(U16 x)
*** 功能描述: 毫秒级延时;
*** 全局变量: NO !
*** 输 入: U16 x !
*** 输 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函数说明:
/******************************************************************************/
void DLY_ms(U8 x) //x取值1~255;
{
U8 i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/*******************************************************************************
*** 函 数 名: void Init1820()
*** 功能描述:
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: NO !
*** 修 改 人: 日期:2008-04-18
*** 函数说明:
/******************************************************************************/
void Init1820()
{
SIO = 1;
_nop_();
SIO = 0; //拉低数据线,准备Reset OneWire Bus;
DLY_us(125); //延时500us,Reset One-Wire Bus.
DLY_us(125);
SIO = 1; //提升数据线;
DLY_us(15); //延时35us;
while(SIO) //等待Slave 器件Ack 信号;
{
_nop_();
}
DLY_us(60); //延时125us;
SIO = 1; //提升数据线,准备数据传输;
}
/*******************************************************************************
*** 函 数 名: static void DS18B20_WR(U8 cmd)
*** 功能描述: 写一个字节;
*** 全局变量: NO !
*** 输 入: cmd:8bit;
*** 输 出: NO !
*** 函数说明: cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
void WR1820(U8 cmd)
{
U8 i;
for(i=0;i<8;i++)
{
if(cmd & 0x01) //低位在前;
{
SIO = 0; //结束Recovery time;
_nop_();
_nop_();
_nop_();
SIO = 1;
} //发送数据;
else
SIO = 0; //结束Rec time;
_nop_();
_nop_();
_nop_();
//SIO = 0; } //发送数据;
DLY_us(30); //等待Slave Device采样;
SIO = 1; //Recovery;
_nop_(); //Recovery Time Start;
cmd >>= 1;
}
}
/*******************************************************************************
*** 函 数 名: U8 RD1820(void)
*** 功能描述: 读取一个字节;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: 8bit data;*
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U8 RD1820(void)
{
U8 i;
U8 tmp=0;
SIO = 1;
_nop_(); //准备读;
for(i=0;i<8;i++)
{
tmp >>= 1; //低位先发;
SIO = 0; //Read init;
_nop_(); //1us;
SIO = 1; //必须写1,否则读出来的将是不预期的数据;
DLY_us(2); //延时7us;
_nop_();
if(SIO) //在12us处读取数据;
tmp |= 0x80;
DLY_us(30); //延时55us;
SIO = 1;
_nop_(); //恢复One Wire Bus;
}
return tmp;
}
/*******************************************************************************
*** 函 数 名: U16 RD_T();
*** 功能描述: 读取温度;
*** 全局变量: NO !
*** 输 入: NO !
*** 输 出: 16bit data;
*** 函数说明: 读之前必须首先写1;
/******************************************************************************/
U16 RD_T()
{
U16 tp;
U8 tmbuf[2];
Init1820();
WR1820(0xcc);
//delay_ms(2);
WR1820(0x44);
// _nop_();
// SIO=1;
// delay_ms(250); //多个1820时要延时,单个就不用,数据手册里看
// delay_ms(250);
// delay_ms(250);
Init1820();
WR1820(0xcc);
WR1820(0xbe);
tmbuf[0]=RD1820();
tmbuf[1]=RD1820();
Init1820();
tp=tmbuf[1]*256+tmbuf[0];
return(tp);
}
/*******************************************************************************
**** End Of File
*******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -