?? ds18b20.c
字號:
/***********************************************************************
;便攜式溫度計
;數(shù)碼管引腳連接:a=P1.2 b=P1.1 c=P1.0 d=P1.3 e=P1.4 f=P1.6 g=P1.5 h=P1.7共陽;
;編寫人:蘆慶
;時間:2008年7月27日
;主控芯片:AT89C2051-24PU
;溫度傳感器:DS18B20
;占用資源:定時器0,P1口,P3.3,P3.4,P3.5
;晶振速度:6MHz
;版本:1.0
;
;ROM指令 代碼
;Read ROM(讀ROM) [33H]
;Match ROM(匹配ROM) [55H]
;Skip ROM(跳過ROM] [CCH]
;Search ROM(搜索ROM) [F0H]
;Alarm search(告警搜索) [ECH]
;
;存儲器操作指令 代碼
;Write Scratchpad(寫暫存存儲器) [4EH]
;Read Scratchpad(讀暫存存儲器) [BEH]
;Copy Scratchpad(復制暫存存儲器) [48H]
;Convert Temperature(溫度變換) [44H]
;Recall EPROM(重新調(diào)出) [B8H]
;Read Power supply(讀電源) [B4H]
************************************************************************/
/*******************文件包含**********************/
#include <MAIN.H>
/*****************外部變量聲明********************/
extern uchar flag;
extern uchar Temp[2];//原始溫度數(shù)據(jù)
extern uchar DispLED[4];//數(shù)碼管顯示緩沖區(qū)
/*******************變量聲明**********************/
uchar Temperature;
sbit dq=P3^7;//定義DS18B20數(shù)據(jù)引腳
/**************************微秒級延時*********************/
void TempDelay (uchar us)
{
while(us--);
}
/*****************18B20初始化函數(shù)***********************/
void Init18b20 ()
{
dq=1;
_nop_();
dq=0;
TempDelay(86/2); //delay 530 uS//80
_nop_();
dq=1;
TempDelay(14/2); //delay 100 uS//14
_nop_();
_nop_();
_nop_();
if(dq==0)
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(20/2); //20
_nop_();
_nop_();
dq = 1;
}
/**************************向18B20寫入一個字節(jié)******************/
void WriteByte (uchar wr) //單字節(jié)寫入
{
uchar i;
for (i=0;i<8;i++)
{
dq = 0;
_nop_();
dq=wr&0x01;
TempDelay(5/2); //delay 45 uS //5
_nop_();
_nop_();
dq=1;
wr >>= 1;
}
}
/*************************讀18B20的一個字節(jié)***********************/
uchar ReadByte() //讀取單字節(jié)
{
uchar i;
uchar u=0;
for(i=0;i<8;i++)
{
dq = 0;
u >>= 1;
dq = 1;
if(dq==1)
u |= 0x80;
TempDelay (4/2);
_nop_();
}
return(u);
}
/**********************延時函數(shù)****************************/
void mDelay(uint num)
{
uint i;
for(;num>0;num--)
{ for(i=0;i<124;i++)
{;}
}
}
/********************溫度轉(zhuǎn)換全處理********************/
void Temperature_change(void)
{
Init18b20 ();//初始化18B20
WriteByte(0xcc); //跳過ROM
WriteByte(0x44); //啟動溫度轉(zhuǎn)換
mDelay(50);//重要延時
Init18b20 ();
WriteByte(0xcc); //跳過ROM
WriteByte(0xbe); //讀取溫度
Temp[0]=ReadByte();//溫度低8位
Temp[1]=ReadByte();//溫度高8位
if(Temp[1]<0xF0)//溫度大于0度
{
DispLED[3]=(Temp[0]&0x0F)*625/1000%10;//小數(shù)
Temperature=(Temp[0]>>4)+(Temp[1]<<4);
DispLED[2]=Temperature%10;//個位
DispLED[1]=Temperature/10;//十位
DispLED[0]=Temperature/100;//
}
else//溫度小于0度
{
Temp[0]=~Temp[0]+1;
Temp[1]=~Temp[1];
DispLED[3]=(Temp[0]&0x0F)*625/1000%10;//小數(shù)
Temperature=(Temp[0]>>4)+(Temp[1]<<4);
DispLED[2]=Temperature%10;//個位
DispLED[1]=Temperature/10;//十位
DispLED[0]=Temperature/100+10;//百位+負號
}
}
void init_1820(void)
{
Init18b20 ();//初始化18B20
if(flag==0)//效驗錯誤
{
DispLED[0]=12;//字母F
DispLED[1]=13;//字母A
DispLED[2]=14;//字母L
DispLED[3]=14;//字母L
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -