//DS18B20温度æ£æµåå
¶æ¶²æ¶æ¾ç¤º
#include<reg51.h> //å
å«åçæºå¯åå¨ç头æ件
#include<intrins.h> //å
å«_nop_()å½æ°å®ä¹ç头æ件
unsigned char code digit[10]={"0123456789"}; //å®ä¹å符æ°ç»æ¾ç¤ºæ°å
unsigned char code Str[]={"Test by DS18B20"}; //说ææ¾ç¤ºçæ¯æ¸©åº¦
unsigned char code Error[]={"Error!Check!"}; //说æ没ææ£æµå°DS18B20
unsigned char code Temp[]={"Temp:"}; //说ææ¾ç¤ºçæ¯æ¸©åº¦
unsigned char code Cent[]={"Cent"}; //温度åä½
/*******************************************************************************
以ä¸æ¯å¯¹æ¶²æ¶æ¨¡åçæä½ç¨åº
*******************************************************************************/
sbit RS=P2^7; //å¯åå¨éæ©ä½ï¼å°RSä½å®ä¹ä¸ºP2.0å¼è
sbit RW=P2^6; //读åéæ©ä½ï¼å°RWä½å®ä¹ä¸ºP2.1å¼è
sbit E=P2^5; //使è½ä¿¡å·ä½ï¼å°Eä½å®ä¹ä¸ºP2.2å¼è
sbit BF=P0^7; //å¿ç¢æ å¿ä½ï¼ï¼å°BFä½å®ä¹ä¸ºP0.7å¼è
/*****************************************************
å½æ°åè½ï¼å»¶æ¶1ms
(3j+2)*i=(3Ã33+2)Ã10=1010(å¾®ç§)ï¼å¯ä»¥è®¤ä¸ºæ¯1毫ç§
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<4;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
å½æ°åè½ï¼å»¶æ¶è¥å¹²æ¯«ç§
å
¥å£åæ°ï¼n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
å½æ°åè½ï¼å¤æ液æ¶æ¨¡åçå¿ç¢ç¶æ
è¿åå¼ï¼resultãresult=1ï¼å¿ç¢;result=0ï¼ä¸å¿
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0; //æ ¹æ®è§å®ï¼RS为ä½çµå¹³ï¼RW为é«çµå¹³æ¶ï¼å¯ä»¥è¯»ç¶æ
RW=1;
E=1; //E=1ï¼æå
许读å
_nop_(); //空æä½
_nop_();
_nop_();
_nop_(); //空æä½å个æºå¨å¨æï¼ç»ç¡¬ä»¶ååºæ¶é´
result=BF; //å°å¿ç¢æ å¿çµå¹³èµç»result
E=0; //å°Eæ¢å¤ä½çµå¹³
return result;
}
/*****************************************************
å½æ°åè½ï¼å°æ¨¡å¼è®¾ç½®æ令ææ¾ç¤ºå°ååå
¥æ¶²æ¶æ¨¡å
å
¥å£åæ°ï¼dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //å¦æå¿å°±çå¾
RS=0; //æ ¹æ®è§å®ï¼RSåR/Wåæ¶ä¸ºä½çµå¹³æ¶ï¼å¯ä»¥åå
¥æ令
RW=0;
E=0; //Eç½®ä½çµå¹³(æ ¹æ®è¡¨8-6ï¼åæ令æ¶ï¼E为é«èå²ï¼
// å°±æ¯è®©Eä»0å°1åçæ£è·³åï¼æ以åºå
ç½®"0"
_nop_();
_nop_(); //空æä½ä¸¤ä¸ªæºå¨å¨æï¼ç»ç¡¬ä»¶ååºæ¶é´
P0=dictate; //å°æ°æ®éå
¥P0å£ï¼å³åå
¥æ令æå°å
_nop_();
_nop_();
_nop_();
_nop_(); //空æä½å个æºå¨å¨æï¼ç»ç¡¬ä»¶ååºæ¶é´
E=1; //Eç½®é«çµå¹³
_nop_();
_nop_();
_nop_();
_nop_(); //空æä½å个æºå¨å¨æï¼ç»ç¡¬ä»¶ååºæ¶é´
E=0; //å½Eç±é«çµå¹³è·³åæä½çµå¹³æ¶ï¼æ¶²æ¶æ¨¡åå¼å§æ§è¡å½ä»¤
}
/*****************************************************
å½æ°åè½ï¼æå®å符æ¾ç¤ºçå®é
å°å
å
¥å£åæ°ï¼x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //æ¾ç¤ºä½ç½®çç¡®å®æ¹æ³è§å®ä¸º"80H+å°åç x"
}
/*****************************************************
å½æ°åè½ï¼å°æ°æ®(å符çæ åASCIIç )åå
¥æ¶²æ¶æ¨¡å
å
¥å£åæ°ï¼y(为å符常é)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS为é«çµå¹³ï¼RW为ä½çµå¹³æ¶ï¼å¯ä»¥åå
¥æ°æ®
RW=0;
E=0; //Eç½®ä½çµå¹³(æ ¹æ®è¡¨8-6ï¼åæ令æ¶ï¼E为é«èå²ï¼
// å°±æ¯è®©Eä»0å°1åçæ£è·³åï¼æ以åºå
ç½®"0"
P0=y; //å°æ°æ®éå
¥P0å£ï¼å³å°æ°æ®åå
¥æ¶²æ¶æ¨¡å
_nop_();
_nop_();
_nop_();
_nop_(); //空æä½å个æºå¨å¨æï¼ç»ç¡¬ä»¶ååºæ¶é´
E=1; //Eç½®é«çµå¹³
_nop_();
_nop_();
_nop_();
_nop_(); //空æä½å个æºå¨å¨æï¼ç»ç¡¬ä»¶ååºæ¶é´
E=0; //å½Eç±é«çµå¹³è·³åæä½çµå¹³æ¶ï¼æ¶²æ¶æ¨¡åå¼å§æ§è¡å½ä»¤
}
/*****************************************************
å½æ°åè½ï¼å¯¹LCDçæ¾ç¤ºæ¨¡å¼è¿è¡åå§å设置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); //延æ¶15msï¼é¦æ¬¡åæ令æ¶åºç»LCDä¸æ®µè¾é¿çååºæ¶é´
WriteInstruction(0x38); //æ¾ç¤ºæ¨¡å¼è®¾ç½®ï¼16Ã2æ¾ç¤ºï¼5Ã7ç¹éµï¼8ä½æ°æ®æ¥å£
delaynms(5); //延æ¶5msãï¼ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
WriteInstruction(0x38);
delaynms(5); //延æ¶5msãï¼ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
WriteInstruction(0x38); //è¿ç»ä¸æ¬¡ï¼ç¡®ä¿åå§åæå
delaynms(5); //延æ¶5msãï¼ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
WriteInstruction(0x0c); //æ¾ç¤ºæ¨¡å¼è®¾ç½®ï¼æ¾ç¤ºå¼ï¼æ å
æ ï¼å
æ ä¸éªç
delaynms(5); //延æ¶5msãï¼ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
WriteInstruction(0x06); //æ¾ç¤ºæ¨¡å¼è®¾ç½®ï¼å
æ å³ç§»ï¼å符ä¸ç§»
delaynms(5); //延æ¶5msãï¼ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
WriteInstruction(0x01); //æ¸
å±å¹æ令ï¼å°ä»¥åçæ¾ç¤ºå
容æ¸
é¤
delaynms(5); //延æ¶5msãï¼ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
/************************************************************************
以ä¸æ¯DS18B20çæä½ç¨åº
************************************************************************/
sbit DQ=P3^3;
unsigned char time; //设置å
¨å±åéï¼ä¸é¨ç¨äºä¸¥æ ¼å»¶æ¶
/*****************************************************
å½æ°åè½ï¼å°DS18B20ä¼ æå¨åå§åï¼è¯»ååºçä¿¡å·
åºå£åæ°ï¼flag
***************************************************/
bit Init_DS18B20(void)
{
bit flag; //å¨åDS18B20æ¯å¦åå¨çæ å¿ï¼flag=0ï¼è¡¨ç¤ºåå¨ï¼flag=1ï¼è¡¨ç¤ºä¸åå¨
DQ = 1; //å
å°æ°æ®çº¿æé«
for(time=0;time<2;time++) //ç¥å¾®å»¶æ¶çº¦6å¾®ç§
;
DQ = 0; //åå°æ°æ®çº¿ä»é«æä½ï¼è¦æ±ä¿æ480~960us
for(time=0;time<200;time++) //ç¥å¾®å»¶æ¶çº¦600å¾®ç§
; //以åDS18B20ååºä¸æç»480~960usçä½çµå¹³å¤ä½èå²
DQ = 1; //éæ¾æ°æ®çº¿ï¼å°æ°æ®çº¿æé«ï¼
for(time=0;time<10;time++)
; //延æ¶çº¦30usï¼éæ¾æ»çº¿åéçå¾
15~60us让DS18B20è¾åºåå¨èå²ï¼
flag=DQ; //让åçæºæ£æµæ¯å¦è¾åºäºåå¨èå²ï¼DQ=0表示åå¨ï¼
for(time=0;time<200;time++) //延æ¶è¶³å¤é¿æ¶é´ï¼çå¾
åå¨èå²è¾åºå®æ¯
;
return (flag); //è¿åæ£æµæåæ å¿
}
/*****************************************************
å½æ°åè½ï¼ä»DS18B20读åä¸ä¸ªåèæ°æ®
åºå£åæ°ï¼dat
***************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat; //å¨å读åºçä¸ä¸ªåèæ°æ®
for (i=0;i<8;i++)
{
DQ =1; // å
å°æ°æ®çº¿æé«
_nop_(); //çå¾
ä¸ä¸ªæºå¨å¨æ
DQ = 0; //åçæºä»DS18B20读书æ®æ¶,å°æ°æ®çº¿ä»é«æä½å³å¯å¨è¯»æ¶åº
dat>>=1;
_nop_(); //çå¾
ä¸ä¸ªæºå¨å¨æ
DQ = 1; //å°æ°æ®çº¿"人为"æé«,为åçæºæ£æµDS18B20çè¾åºçµå¹³ä½åå¤
for(time=0;time<2;time++)
; //延æ¶çº¦6usï¼ä½¿ä¸»æºå¨15uså
éæ ·
if(DQ==1)
dat|=0x80; //å¦æ读å°çæ°æ®æ¯1ï¼åå°1åå
¥dat
else
dat|=0x00;//å¦æ读å°çæ°æ®æ¯0ï¼åå°0åå
¥dat
//å°åçæºæ£æµå°ççµå¹³ä¿¡å·DQåå
¥r[i]
for(time=0;time<8;time++)
; //延æ¶3us,两个读æ¶åºä¹é´å¿
é¡»æ大äº1usçæ¢å¤æ
}
return(dat); //è¿å读åºçåè¿å¶æ°æ®
}
/*****************************************************
å½æ°åè½ï¼åDS18B20åå
¥ä¸ä¸ªåèæ°æ®
å
¥å£åæ°ï¼dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // å
å°æ°æ®çº¿æé«
_nop_(); //çå¾
ä¸ä¸ªæºå¨å¨æ
DQ=0; //å°æ°æ®çº¿ä»é«æä½æ¶å³å¯å¨åæ¶åº
DQ=dat&0x01; //å©ç¨ä¸è¿ç®ååºè¦åçæä½äºè¿å¶æ°æ®,
//并å°å
¶éå°æ°æ®çº¿ä¸çå¾
DS18B20éæ ·
for(time=0;time<10;time++)
;//延æ¶çº¦30usï¼DS18B20å¨æä½åç约15~60usæé´ä»æ°æ®çº¿ä¸éæ ·
DQ=1; //éæ¾æ°æ®çº¿
for(time=0;time<1;time++)
;//延æ¶3us,两个åæ¶åºé´è³å°éè¦1usçæ¢å¤æ
dat>>=1; //å°datä¸çåäºè¿å¶ä½æ°æ®å³ç§»1ä½
}
for(time=0;time<4;time++)
; //ç¨ä½å»¶æ¶,ç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
/******************************************************************************
以ä¸æ¯ä¸æ¸©åº¦æå
³çæ¾ç¤ºè®¾ç½®
******************************************************************************/
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºæ²¡ææ£æµå°DS18B20
***************************************************/
void display_error(void)
{
unsigned char i;
WriteAddress(0x00); //åæ¾ç¤ºå°åï¼å°å¨ç¬¬1è¡ç¬¬1åå¼å§æ¾ç¤º
i = 0; //ä»ç¬¬ä¸ä¸ªå符å¼å§æ¾ç¤º
while(Error[i] != '\0') //åªè¦æ²¡æåå°ç»ææ å¿ï¼å°±ç»§ç»å
{
WriteData(Error[i]); //å°å符常éåå
¥LCD
i++; //æåä¸ä¸ä¸ªå符
delaynms(100); //延æ¶100msè¾é¿æ¶é´ï¼ä»¥çæ¸
å
³äºæ¾ç¤ºç说æ
}
while(1) //è¿å
¥æ»å¾ªç¯ï¼çå¾
æ¥æåå
;
}
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºè¯´æä¿¡æ¯
***************************************************/
void display_explain(void)
{
unsigned char i;
WriteAddress(0x00); //åæ¾ç¤ºå°åï¼å°å¨ç¬¬1è¡ç¬¬1åå¼å§æ¾ç¤º
i = 0; //ä»ç¬¬ä¸ä¸ªå符å¼å§æ¾ç¤º
while(Str[i] != '\0') //åªè¦æ²¡æåå°ç»ææ å¿ï¼å°±ç»§ç»å
{
WriteData(Str[i]); //å°å符常éåå
¥LCD
i++; //æåä¸ä¸ä¸ªå符
delaynms(100); //延æ¶100msè¾é¿æ¶é´ï¼ä»¥çæ¸
å
³äºæ¾ç¤ºç说æ
}
}
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºæ¸©åº¦ç¬¦å·
***************************************************/
void display_symbol(void)
{
unsigned char i;
WriteAddress(0x40); //åæ¾ç¤ºå°åï¼å°å¨ç¬¬2è¡ç¬¬1åå¼å§æ¾ç¤º
i = 0; //ä»ç¬¬ä¸ä¸ªå符å¼å§æ¾ç¤º
while(Temp[i] != '\0') //åªè¦æ²¡æåå°ç»ææ å¿ï¼å°±ç»§ç»å
{
WriteData(Temp[i]); //å°å符常éåå
¥LCD
i++; //æåä¸ä¸ä¸ªå符
delaynms(50); //延æ¶1msç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
}
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºæ¸©åº¦çå°æ°ç¹
***************************************************/
void display_dot(void)
{
WriteAddress(0x49); //åæ¾ç¤ºå°åï¼å°å¨ç¬¬2è¡ç¬¬10åå¼å§æ¾ç¤º
WriteData('.'); //å°å°æ°ç¹çå符常éåå
¥LCD
delaynms(50); //延æ¶1msç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºæ¸©åº¦çåä½(Cent)
***************************************************/
void display_cent(void)
{
unsigned char i;
WriteAddress(0x4c); //åæ¾ç¤ºå°åï¼å°å¨ç¬¬2è¡ç¬¬13åå¼å§æ¾ç¤º
i = 0; //ä»ç¬¬ä¸ä¸ªå符å¼å§æ¾ç¤º
while(Cent[i] != '\0') //åªè¦æ²¡æåå°ç»ææ å¿ï¼å°±ç»§ç»å
{
WriteData(Cent[i]); //å°å符常éåå
¥LCD
i++; //æåä¸ä¸ä¸ªå符
delaynms(50); //延æ¶1msç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
}
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºæ¸©åº¦çæ´æ°é¨å
å
¥å£åæ°ï¼x
***************************************************/
void display_temp1(unsigned char x)
{
unsigned char j,k,l; //j,k,låå«å¨å温度çç¾ä½ãåä½å个ä½
j=x/100; //åç¾ä½
k=(x%100)/10; //ååä½
l=x%10; //å个ä½
WriteAddress(0x46); //åæ¾ç¤ºå°å,å°å¨ç¬¬2è¡ç¬¬7åå¼å§æ¾ç¤º
WriteData(digit[j]); //å°ç¾ä½æ°åçå符常éåå
¥LCD
WriteData(digit[k]); //å°åä½æ°åçå符常éåå
¥LCD
WriteData(digit[l]); //å°ä¸ªä½æ°åçå符常éåå
¥LCD
delaynms(50); //延æ¶1msç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
/*****************************************************
å½æ°åè½ï¼æ¾ç¤ºæ¸©åº¦çå°æ°æ°é¨å
å
¥å£åæ°ï¼x
***************************************************/
void display_temp2(unsigned char x)
{
WriteAddress(0x4a); //åæ¾ç¤ºå°å,å°å¨ç¬¬2è¡ç¬¬11åå¼å§æ¾ç¤º
WriteData(digit[x]); //å°å°æ°é¨åç第ä¸ä½æ°åå符常éåå
¥LCD
delaynms(50); //延æ¶1msç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
}
/*****************************************************
å½æ°åè½ï¼å好读温度çåå¤
***************************************************/
void ReadyReadTemp(void)
{
Init_DS18B20(); //å°DS18B20åå§å
WriteOneChar(0xCC); // è·³è¿è¯»åºå·åå·çæä½
WriteOneChar(0x44); // å¯å¨æ¸©åº¦è½¬æ¢
for(time=0;time<100;time++)
; //温度转æ¢éè¦ä¸ç¹æ¶é´
Init_DS18B20(); //å°DS18B20åå§å
WriteOneChar(0xCC); //è·³è¿è¯»åºå·åå·çæä½
WriteOneChar(0xBE); //读å温度å¯åå¨,å两个åå«æ¯æ¸©åº¦çä½ä½åé«ä½
}
/*****************************************************
å½æ°åè½ï¼ä¸»å½æ°
***************************************************/
void main(void)
{
unsigned char TL; //å¨åæåå¨ç温度ä½ä½
unsigned char TH; //å¨åæåå¨ç温度é«ä½
unsigned char TN; //å¨å温度çæ´æ°é¨å
unsigned char TD; //å¨å温度çå°æ°é¨å
LcdInitiate(); //å°æ¶²æ¶åå§å
delaynms(5); //延æ¶5msç»ç¡¬ä»¶ä¸ç¹ååºæ¶é´
if(Init_DS18B20()==1)
display_error();
display_explain();
display_symbol(); //æ¾ç¤ºæ¸©åº¦è¯´æ
display_dot(); //æ¾ç¤ºæ¸©åº¦çå°æ°ç¹
display_cent(); //æ¾ç¤ºæ¸©åº¦çåä½
while(1) //ä¸ææ£æµå¹¶æ¾ç¤ºæ¸©åº¦
{
ReadyReadTemp(); //读温度åå¤
TL=ReadOneChar(); //å
读çæ¯æ¸©åº¦å¼ä½ä½
TH=ReadOneChar(); //æ¥ç读çæ¯æ¸©åº¦å¼é«ä½
TN=TH*16+TL/16; //å®é
温度å¼=(TH*256+TL)/16,å³ï¼TH*16+TL/16
//è¿æ ·å¾åºçæ¯æ¸©åº¦çæ´æ°é¨å,å°æ°é¨å被丢å¼äº
TD=(TL%16)*10/16; //计ç®æ¸©åº¦çå°æ°é¨å,å°ä½æ°ä¹ä»¥10åé¤ä»¥16åæ´ï¼
//è¿æ ·å¾å°çæ¯æ¸©åº¦å°æ°é¨åç第ä¸ä½æ°å(ä¿ç1ä½å°æ°)
display_temp1(TN); //æ¾ç¤ºæ¸©åº¦çæ´æ°é¨å
display_temp2(TD); //æ¾ç¤ºæ¸©åº¦çå°æ°é¨å
delaynms(10);
}
}
//Download by
http://www.codefans.net