📄 ds18b20.c
字号:
#include "DS18B20.h"
#include <stdio.h>
#include <intrins.h>
#include "P8XC5X2.h"
extern unsigned char SampleHVal[8],SampleLVal[8]; //模拟量采集结果
extern unsigned char Sensor;
/****************************************************************************
函数功能:延时子程序
作 者:沈建良
时 间:2006年4月20日
入口参数:time
出口参数:
****************************************************************************/
void delay(unsigned char time)
{
unsigned char n;
n=0;
while(n < time)
{n++;}
return;
}
/****************************************************************************
函数功能:DS18B20初始化子程序
作 者:沈建良
时 间:2006年4月20日
入口参数:
出口参数:
****************************************************************************/
void Init_DS18B20(unsigned char no) //初始化子程序
{
unsigned char x=0;
if(no==0)
{
P1_0=1; //P1_先置高
delay(8); //稍延时
P1_0=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_0=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_0; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==1)
{
P1_1=1; //P1_先置高
delay(8); //稍延时
P1_1=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_1=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_1; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==2)
{
P1_2=1; //P1_先置高
delay(8); //稍延时
P1_2=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_2=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_2; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==3)
{
P1_3=1; //P1_先置高
delay(8); //稍延时
P1_3=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_3=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_3; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==4)
{
P1_4=1; //P1_先置高
delay(8); //稍延时
P1_4=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_4=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_4; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==5)
{
P1_5=1; //P1_先置高
delay(8); //稍延时
P1_5=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_5=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_5; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==6)
{
P1_6=1; //P1_先置高
delay(8); //稍延时
P1_6=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_6=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_6; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
if(no==7)
{
P1_7=1; //P1_先置高
delay(8); //稍延时
P1_7=0; //发送复位脉冲
delay(85); //延时(>480ms)
P1_7=1; //拉高数据线
delay(14); //等待(15~60ms)
x=P1_7; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
delay(20);
}
}
/****************************************************************************
函数功能:向DS18B20读一字节数据
作 者:沈建良
时 间:2006年4月20日
入口参数:
出口参数:dat
****************************************************************************/
unsigned char ReadOneChar(unsigned char no) //读一字节数据 //主机数据线先从高拉至低电平1ms以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60ms,各个读周期之间必须有1ms以上的高电平恢复期
unsigned char dat=0;
if(no==0)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_0=1;
delay(1);
P1_0=0;
dat>>=1;
P1_0=1;
if(P1_0)
dat|=0x80;
delay(4);
}
}
if(no==1)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_1=1;
delay(1);
P1_1=0;
dat>>=1;
P1_1=1;
if(P1_1)
dat|=0x80;
delay(4);
}
}
if(no==2)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_2=1;
delay(1);
P1_2=0;
dat>>=1;
P1_2=1;
if(P1_2)
dat|=0x80;
delay(4);
}
}
if(no==3)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_3=1;
delay(1);
P1_3=0;
dat>>=1;
P1_3=1;
if(P1_3)
dat|=0x80;
delay(4);
}
}
if(no==4)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_4=1;
delay(1);
P1_4=0;
dat>>=1;
P1_4=1;
if(P1_4)
dat|=0x80;
delay(4);
}
}
if(no==5)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_5=1;
delay(1);
P1_5=0;
dat>>=1;
P1_5=1;
if(P1_5)
dat|=0x80;
delay(4);
}
}
if(no==6)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_6=1;
delay(1);
P1_6=0;
dat>>=1;
P1_6=1;
if(P1_6)
dat|=0x80;
delay(4);
}
}
if(no==7)
{
for (i=8;i>0;i--) //一个字节有8位
{
P1_7=1;
delay(1);
P1_7=0;
dat>>=1;
P1_7=1;
if(P1_7)
dat|=0x80;
delay(4);
}
}
return(dat);
}
/****************************************************************************
函数功能:向DS18B20写一字节数据
作 者:沈建良
时 间:2006年4月20日
入口参数:dat
出口参数:
****************************************************************************/
void WriteOneChar(unsigned char dat,unsigned char no) //向DS18S20写一字节数据
{
unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15ms之内将所需写的位送到数据线上,
if(no==0)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_0=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_0=dat&0x01;
delay(5);
P1_0=1;
dat>>=1;
}
delay(4);
}
if(no==1)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_1=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_1=dat&0x01;
delay(5);
P1_1=1;
dat>>=1;
}
delay(4);
}
if(no==2)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_2=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_2=dat&0x01;
delay(5);
P1_2=1;
dat>>=1;
}
delay(4);
}
if(no==3)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_3=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_3=dat&0x01;
delay(5);
P1_3=1;
dat>>=1;
}
delay(4);
}
if(no==4)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_4=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_4=dat&0x01;
delay(5);
P1_4=1;
dat>>=1;
}
delay(4);
}
if(no==5)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_5=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_5=dat&0x01;
delay(5);
P1_5=1;
dat>>=1;
}
delay(4);
}
if(no==6)
{
for(i=8;i>0;i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
P1_6=0; //在开始另一个写周期前必须有1ms以上的高电平恢复期。
P1_6=dat&0x01;
delay(5);
P1_6=1;
dat>>=1;
}
delay(4);
}
}
/****************************************************************************
函数功能:向DS18B20读温度值
作 者:沈建良
时 间:2006年4月20日
入口参数:
出口参数:temperature
****************************************************************************/
void GetTempValue(unsigned char no)
{
Init_DS18B20(no); //初始化
WriteOneChar(0xcc,no); //跳过读序列号
WriteOneChar(0x44,no); //启动温度转换
delay(200);
delay(200);
delay(200);
delay(200);
delay(200);
Init_DS18B20(no);
WriteOneChar(0xcc,no);
WriteOneChar(0xbe,no); //读温度寄存器
SampleLVal[no]=ReadOneChar(no);//读出温度低位
SampleHVal[no]=ReadOneChar(no);//读出温度高位
if((SampleHVal[no]==0xff))
{
Sensor&=~(0x01<<no);
SampleLVal[no]=0;
SampleHVal[no]=0;
}
else
{
Sensor|=0x01<<no;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -