?? 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 //設(shè)置數(shù)據(jù)口味輸入
#define DQ_LOW() DSDQ=0 ; TRISDQ=0 //設(shè)置數(shù)據(jù)口為輸出(低電平)
char tempflag;
/*****************************************************************************
******函 數(shù) 名 稱 : reset()
******函 數(shù) 功 能 : 啟動ds18b20
******輸 入 : 無
******輸 出 : 無
******備注 : 等待ds18b20 應(yīng)答
******************************************************************************/
void reset(void)
{
char presence=1;
while(presence)
{
DQ_LOW() ;
delays(17,50);
DQ_HIGH() ;
delays(2,73);
if(DSDQ==1) presence=1; // 沒有接受到應(yīng)答信號
else presence=0; // 接受到應(yīng)答信號
delays(17,30);
}
}
/*****************************************************************************
******函 數(shù) 名 稱 : writecmd()
******函 數(shù) 功 能 : 為DS18B20寫入八位命令
******輸 入 : cmd
******輸 出 : 無
******備注 :
******************************************************************************/
void writecmd(char cmd)
{
int i;
char temp;
TRISDQ=0; //置為輸出
for(i=8;i>0;i--) //寫入八位數(shù)據(jù)
{
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;
}
}
/*****************************************************************************
******函 數(shù) 名 稱 : readdate()
******函 數(shù) 功 能 : 從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;
}
/*****************************************************************************
******函 數(shù) 名 稱 : get_ds18b20_temp()
******函 數(shù) 功 能 : 讀取溫度
******輸 入 : 無
******輸 出 : 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); //開始轉(zhuǎn)換
for(i=10;i>0;i--) //延遲750us
{
delays(101,270);
};
reset();
writecmd(0xCC); // 跳過ROM
writecmd(0XBE); //開始轉(zhuǎn)換
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -