📄 ds18b20.c
字号:
#include"DS18B20.h"
uchar temp_data[2]={0x00,0x00}; // 读出温度暂放
uchar display[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据,一个运算暂存用
uchar flag=0;//标志
uchar doth,dotl;//显示小数部分
///*******温度小数部分用查表法**********//
const uchar ditab[16]={0,6,13,18,25,31,38,44,50,56,63,69,75,81,88,94};
//*****************DS18B20复位函数****************************//
void DS18B20_RESET(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ_HIGH();NOP();NOP();
DQ_LOW(); //
DelayUs(550); // 550us
DQ_HIGH(); //
DelayUs(65); // 66us
presence=DQ; // presence=0继续下一步
}
DelayUs(498); //延时500us
//presence =~DQ;
if(DQ)
presence = 0;
else
presence = 1;
}
DQ_HIGH();
}
//*****************DS18B20写命令函数****************************//
void DS18B20_WRITE_BYTE(uchar val)
{
uchar i;
for (i=8; i>0; i--) //
{
DQ_HIGH();NOP();NOP();
DQ_LOW();NOP();NOP();NOP();NOP();NOP();//5us
DQ = val&0x01; //最低位移出
DelayUs(65); //66us
val=val/2; //右移一位
}
DQ_HIGH();
DelayUs(11);
}
//*****************DS18B20读一字节函数****************************//
uchar DS18B20_READ_BYTE(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DQ_HIGH();NOP();NOP();
value>>=1;
DQ_LOW(); //
NOP();NOP();NOP();NOP(); //4us
DQ_HIGH();NOP();NOP();NOP();NOP(); //4us
if(DQ)value|=0x80;
DelayUs(65); //66us
}
DQ_HIGH();
return(value);
}
//***********读出温度函数**********/
void DS18B20_READ_TEMP()
{
DS18B20_RESET(); //总线复位
DS18B20_WRITE_BYTE(0xCC); // 发Skip ROM命令
DS18B20_WRITE_BYTE(0xBE); // 发读命令
temp_data[0]=DS18B20_READ_BYTE(); //温度低8位
temp_data[1]=DS18B20_READ_BYTE(); //温度高8位
DS18B20_RESET();
DS18B20_WRITE_BYTE(0xCC); // Skip ROM
DS18B20_WRITE_BYTE(0x44); // 发转换命令
}
///***********温度数据处理函数**********/
void work_temp()
{
uchar n = 0;
uchar flag3 = 1,flag2 = 1; //数字显示修正标记
if((temp_data[1]&0xf8)!= 0x00)
{
temp_data[1] = ~(temp_data[1]);
temp_data[0] = ~(temp_data[0])+1;
n = 1;
flag = 1;
}//负温度求补码
if(temp_data[0] > 255)
{
temp_data[1]++;
}
display[4] = temp_data[0]&0x0f;
display[0] = ditab[display[4]];
doth = display[0]/10;
dotl = display[0]%10;
display[4] = ((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);
display[3] = display[4]/100;
display[2] = display[4]/10%10;
display[1] = display[4]%10;
if(!display[3])
{
display[3] = 0x0a;
flag3 = 0;
if(!display[2])
{
display[2] = 0x0a;
flag2= 0 ;
}
}//最高位为0时都不显示
if(n)
{
display[3] = 0x0b;//负温度时最高位显示"-"
flag3 = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -