📄 ds18b20.txt
字号:
/*-----------------------------------------------------------------------
*
* DS18B20温度传感器读写部分:
*
* 通过对传感器写入命令来控制传感器的实时输出
*-------------------------------------------------------------------------*/
void delay15(uchar n) //精确延时 N*15US
{
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
n--;
}while(n);
}
//DS18B20初始化判标志位程序
void DSinited(void)
{
uchar time=25;
DQ1=0;
delay15(40);
DQ1=1;
while(time--)
{
if(DQ1==0)
{
Flag0=1; //表示DS18B20存在
break;
}
else
Flag0=0; //表示DS18B20不存在
}
delays(10);
// DQ1=1;
}
//从DS18B20读出一个字节的数据
uchar DSread()
{
uchar i;
uchar byte;
uchar dateout=0;
uchar buff=0x01;
for(i=0;i<8;i++)
{
DQ1=0;
_nop_();
_nop_();
_nop_();
DQ1=1;
delay15(1);
byte=buff&DQ1;
byte=byte<<i;
dateout=dateout|byte;
delay15(1);
}
return(dateout);
}
//向DS18B20写程序
void DSwrite(uchar date)
{
uchar i;
for(i=0;i<8;i++)
{
DQ1=0;
delay15(1);
DQ1=date&0x01;
date=date>>1;
delay15(2);
DQ1=1;
_nop_();
}
delay15(3);
// DQ1=1;
}
//设置DS18B20暂存存储器
void DSconfine(void)
{
while(Flag0)
{
DSwrite(0xcc); //发SKIP ROM命令
_nop_();
DSwrite(0x4e); //发写暂存存储器命令
_nop_();
DSwrite(0x00); //TH(报警上限)中写入00H
_nop_();
DSwrite(0x00); //TL(报警下限)中写入00H
_nop_();
DSwrite(0x1f); //选择温度分辨率
_nop_();
}
}
//将从DS18B20中读出的温度数据进行转换
uchar convert_temp(uchar date1,uchar date2)
{
uchar buff1;
uchar buff2;
bit byte;
uchar dateout;
buff1=date1&0xF0; //舍去温度低位中小数点后四位
buff1=buff1>>4; //将高四位转到低四位
buff2=date2&0x0F; //取低四位
buff2=buff2<<4; //将数据移到高四位,最高位为符号位
dateout=buff1|buff2;
byte=(bit)(date1&0x08); //取第四位,采用四舍五入的计算法
if(byte)
dateout++;
return(dateout);
}
//读出温度转换值(返回值为一位,高位为符号位)
uchar Gettemper(void)
{
uchar dateout;
uchar dateout1;
uchar dateout2;
DQ1=1;
DSinited();
if(Flag0)
{
DSwrite(0xcc); //跳过ROM匹配
_nop_();
DSwrite(0x44); //发出温度转换命令
_nop_();
DSinited(); //准备读温度前先复位
_nop_();
DSwrite(0xcc); //跳过ROM匹配
_nop_();
DSwrite(0xbe); //发出读温度命令
_nop_();
dateout1=DSread(); //返回读出的温度低位值
dateout2=DSread(); //返回读出的温度高位值
dateout=convert_temp(dateout1,dateout2);
return(dateout);
}
else
return(0);
}
void main(void)
{
uchar wendu;
bit a;
wendu=Gettemper(); //进行温度采集
a=(bit)(wendu&0x80);
if(a) //为负值时,此时温度为0下,否则为0上,温度值即为数据的值
wendu=~wendu;
show(wendu); //将数据值显示出来
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -