📄 ds18b20.c
字号:
#include<p18f452.h>
#include"delays.h"
#define DSDQ PORTAbits.RA0 //define ds18b20 信号端口
#define TRISDQ TRISAbits.TRISA0 //define ds18b20 端口I/O
#define DQ_HIGH() TRISDQ=1 //设置数据口味输入
#define DQ_LOW() DSDQ=0 ; TRISDQ=0 //设置数据口为输出(低电平)
char tempflag;
/*****************************************************************************
******函 数 名 称 : reset()
******函 数 功 能 : 启动ds18b20
******输 入 : 无
******输 出 : 无
******备注 : 等待ds18b20 应答
******************************************************************************/
void reset(void)
{
char presence=1;
while(presence)
{
DQ_LOW() ;
delays(17,50);
DQ_HIGH() ;
delays(2,73);
if(DSDQ==1) presence=1; // 没有接受到应答信号
else presence=0; // 接受到应答信号
delays(17,30);
}
}
/*****************************************************************************
******函 数 名 称 : writecmd()
******函 数 功 能 : 为DS18B20写入八位命令
******输 入 : cmd
******输 出 : 无
******备注 :
******************************************************************************/
void writecmd(char cmd)
{
int i;
char temp;
TRISDQ=0; //置为输出
for(i=8;i>0;i--) //写入八位数据
{
temp=cmd&0x01;
DQ_LOW() ;
delays(2,2);
if(temp==1)
{DQ_HIGH();
delays(2,80);
}
else
{
delays(2,80);
DQ_HIGH();
}
cmd=cmd>>1;
}
}
/*****************************************************************************
******函 数 名 称 : readdate()
******函 数 功 能 : 从DS18B20读出八位命令
******输 入 : 无
******输 出 : value
******备注 :
******************************************************************************/
char readdate(void)
{
char value=0;
char tmp=0x01;
while (tmp)
{
DQ_LOW() ; //置低输出低电平
delays(2,2); //延迟>15us
DQ_HIGH();
if(DSDQ) value|=tmp;
tmp=tmp<<1;
delays(2,80);
}
return value;
}
/*****************************************************************************
******函 数 名 称 : get_ds18b20_temp()
******函 数 功 能 : 读取温度
******输 入 : 无
******输 出 : float t
******备注 :
******************************************************************************/
float get_ds18b20_temp(void)
{
int i;
float t ;
union {
char c[2];
int x ;
}temp1;
temp1.x=0;
DQ_HIGH();
reset();
writecmd(0xCC); // 跳过ROM
writecmd(0X44); //开始转换
for(i=10;i>0;i--) //延迟750us
{
delays(101,270);
};
reset();
writecmd(0xCC); // 跳过ROM
writecmd(0XBE); //开始转换
temp1.c[0]=readdate();
temp1.c[1]=readdate();
if(temp1.c[1]>=0x80) tempflag=1;
else tempflag=0;
if(tempflag) temp1.x=~temp1.x+1;
t=((float)temp1.x)/16.0;
return (t);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -