📄 ds1820.c
字号:
/*********************************************************************************************************
* ds1820 drivers
* QZhao,2007
* All Rights Reserved
* File : ds1820.c
* By : QZhao
* Contact : zq1987731@163.com
*********************************************************************************************************/
/*★★★可调用函数:TempConvert()->温度转换开始,结果存入全局变量tph,tpl DIS_T_Z()->温度转为数字存入缓冲区*/
/*********************************************************************************************************
*
* 产生复位脉冲初始化DS18B20
*
*********************************************************************************************************/
static bool TxReset(void)
{
uint i;
DQ=0;
/* 拉低约900us */
i=100;
while(i>0)
i--;
DQ=1; // 产生上升沿
i=4;
while(i>0)
i--;
return TRUE;
}
/*********************************************************************************************************
*
* 等待应答脉冲
*
*********************************************************************************************************/
/* static bool RxWait(void)
{
uint i;
while(DQ);
while(~DQ); // 检测到应答脉冲
i = 4;
while(i>0)
i--;
return TRUE;
}
*/
/*********************************************************************************************************
*
* 读取数据的一位,满足读时隙要求
*
*********************************************************************************************************/
static bit RdBit(void)
{
uint i;
bit b;
DQ=0;
i++;
DQ=1;
i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
b=DQ;
i=8;
while(i>0)
i--;
return b;
}
/*********************************************************************************************************
*
* 读取数据的一个字节
*
*********************************************************************************************************/
static uchar RdByte(void)
{
uchar i,j,b;
b=0;
for(i=1;i<=8;i++)
{
j=RdBit();
b=(j<<7)|(b>>1);
}
return b;
}
/*********************************************************************************************************
*
* 写数据的一个字节,满足写1和写0的时隙要求
*
*********************************************************************************************************/
static bool WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp=b&0x01;
b>>=1; // 取下一位(由低位向高位)
if(btmp)
{
/* 写1 */
DQ=0;
i++;i++; // 延时,使得15us以内拉高
DQ=1;
i=8;
while(i>0)
i--; // 整个写1时隙不低于60us
}
else
{
/* 写0 */
DQ = 0;
i = 8;
while(i>0)
i--; // 保持低在60us到120us之间
DQ = 1;
i++;i++;
}
}
return TRUE;
}
/*********************************************************************************************************
*
* 启动温度转换
*
*********************************************************************************************************/
static bool convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
// RxWait(); // 等待应答(由↓延时代替)
delayms(10);
delayms(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
return TRUE;
}
/*********************************************************************************************************
*
* 读取温度值
*
*********************************************************************************************************/
bool RdTemp(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
// RxWait(); // 等待应答(由↓延时代替)
delayms(10);
delayms(1); // 延时
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tpl=RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tph=RdByte(); // 高位值高位字节(其中高5位为符号位)
return TRUE;
}
/*********************************************************************************************************
*
* 温度转换开始
*
*********************************************************************************************************/
bool TempConvert(void)
{
delayms(1); // 延时1ms
convert(); // 启动温度转换,需要750ms
return TRUE;
}
/*********************************************************************************************************
*
* 温度-数值转换
*
*********************************************************************************************************/
bool DIS_T_Z(void)
{
int a;
uchar a0,a1,a2,a3,af;
a=(int)tph<<8|(int)tpl;
if(tph&0x80) //符号部分转换
{
DIS_BUF_T[0]='-';
a=a^0xFFFF+1;
}
else
DIS_BUF_T[0]='+';
a0=(uchar)(a>>4); //温度整数部分转换
a1=a0%10;
a2=(a0%100-a0)/10;
a3=(a0-a0%100)/100;
DIS_BUF_T[1]=a3+0x30;
DIS_BUF_T[2]=a2+0x30;
DIS_BUF_T[3]=a1+0x30;
DIS_BUF_T[4]='.';
af=(uchar)(a&0x000F); //小数部分处理
switch(af)
{
case 0x00:
DIS_BUF_T[5]='0'; DIS_BUF_T[6]='0'; DIS_BUF_T[7]='0'; DIS_BUF_T[8]='0'; break;
case 0x01:
DIS_BUF_T[5]='0'; DIS_BUF_T[6]='6'; DIS_BUF_T[7]='2'; DIS_BUF_T[8]='5'; break;
case 0x02:
DIS_BUF_T[5]='1'; DIS_BUF_T[6]='2'; DIS_BUF_T[7]='5'; DIS_BUF_T[8]='0'; break;
case 0x03:
DIS_BUF_T[5]='1'; DIS_BUF_T[6]='8'; DIS_BUF_T[7]='7'; DIS_BUF_T[8]='5'; break;
case 0x04:
DIS_BUF_T[5]='2'; DIS_BUF_T[6]='5'; DIS_BUF_T[7]='0'; DIS_BUF_T[8]='0'; break;
case 0x05:
DIS_BUF_T[5]='3'; DIS_BUF_T[6]='1'; DIS_BUF_T[7]='2'; DIS_BUF_T[8]='5'; break;
case 0x06:
DIS_BUF_T[5]='3'; DIS_BUF_T[6]='7'; DIS_BUF_T[7]='5'; DIS_BUF_T[8]='0'; break;
case 0x07:
DIS_BUF_T[5]='4'; DIS_BUF_T[6]='3'; DIS_BUF_T[7]='7'; DIS_BUF_T[8]='5'; break;
case 0x08:
DIS_BUF_T[5]='5'; DIS_BUF_T[6]='0'; DIS_BUF_T[7]='0'; DIS_BUF_T[8]='0'; break;
case 0x09:
DIS_BUF_T[5]='5'; DIS_BUF_T[6]='6'; DIS_BUF_T[7]='2'; DIS_BUF_T[8]='5'; break;
case 0x0A:
DIS_BUF_T[5]='6'; DIS_BUF_T[6]='2'; DIS_BUF_T[7]='5'; DIS_BUF_T[8]='0'; break;
case 0x0B:
DIS_BUF_T[5]='6'; DIS_BUF_T[6]='8'; DIS_BUF_T[7]='7'; DIS_BUF_T[8]='5'; break;
case 0x0C:
DIS_BUF_T[5]='7'; DIS_BUF_T[6]='5'; DIS_BUF_T[7]='0'; DIS_BUF_T[8]='0'; break;
case 0x0D:
DIS_BUF_T[5]='8'; DIS_BUF_T[6]='1'; DIS_BUF_T[7]='2'; DIS_BUF_T[8]='5'; break;
case 0x0E:
DIS_BUF_T[5]='8'; DIS_BUF_T[6]='7'; DIS_BUF_T[7]='5'; DIS_BUF_T[8]='0'; break;
case 0x0F:
DIS_BUF_T[5]='9'; DIS_BUF_T[6]='3'; DIS_BUF_T[7]='7'; DIS_BUF_T[8]='5'; break;
default: break;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -