在用STC89單片機的代碼一直到STC15系列的單片機的時候,出先調(diào)試得不出正確溫度的問題,后來才執(zhí)拗89S52 是12T的 15系列的是1T的 單片機的時鐘周期存在區(qū)別,新手初學,不喜勿噴啊,下邊吧整理的源碼粘在下邊,親測,可用!!
DS18B20.C文件
#include <\stc\stc15f2k60s2.h>
#include "userdef.h"
#include"ds18b20.h"
/****************************************************************************
**STCμ¥Ƭ»úËù¶è±è8051Ëù¶è¿ì£¬êôóú1¸öê±Öó/»úÆ÷ÖüÆú¸ßËùμ¥Ƭ»ú¡£Ëù¶è¿ìêÇÆäóÅμã**
*******μ«êǶÔóúòaòÆÖ2′«í3μÄ80513ìDò¶øÑÔ£¬DèòaDT¸Äê±Dò¡£à′êμÏÖÄ31|Äü**********
***òÔÏÂ3ìDòêÇDS18B20¼òμ¥μÄÇy¶ˉ3ìDò£¬ÔúSTC12C5A60S2ÖDμ÷êÔí¨1y£¬×îÖÕ·μ»Øò»¸ö***
***unsigned int,μí12λ¾íêÇζèêy¾Y¡£ÔúÖ÷3ìDòàïÔËDDÔËËã¼′¿éμÃμ½êμ¼êμÄζèÖμ***
****************************************************************************/
/***********ds18b20×ó3ìDò*************************/
/***********ds18b20Ñóê±oˉêy(¾§Õñ11.0592MHz )*******/
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b203õê¼»ˉoˉêy**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ¸′λ
delay_18B20(80); //éÔ×÷Ñóê±
DQ = 0; //μ¥Ƭ»ú½«DQà-μí
delay_18B20(800); //¾«è·Ñóê± ′óóú 480us
DQ = 1; //à-¸ß×üÏß
delay_18B20(140);
x=DQ;
delay_18B20(200);
}
/***********ds18b20¶áò»¸ö×Ö½ú**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // ¸øÂö3åDÅoÅ
dat>>=1;
DQ = 1; // ¸øÂö3åDÅoÅ
if(DQ)
dat|=0x80;
delay_18B20(40); //40
}
return(dat);
}
/*************ds18b20D′ò»¸ö×Ö½ú****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(50); //50
DQ = 1;
dat>>=1;
}
}
/**************¶áè¡ds18b20μ±Ç°Î¶è************/
unsigned int ReadTemp(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int temp_value=0;
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0x44);
delay_18B20(1000);
Init_DS18B20();
WriteOneChar(0xCC);
WriteOneChar(0xBE);
delay_18B20(1000);
a=ReadOneChar(); //¶áè¡Î¶èÖμμíλ
b=ReadOneChar(); //¶áè¡Î¶èÖμ¸ßλ
temp_value = b<<8;
temp_value |= a;
return temp_value;
}
DS18B20.H文件
#ifndef __DS18B20_H_
#define __DS18B20_H_
//--¶¨òåê1óÃμÄIO¿ú--//
sbit DQ=P1^2;
//--éùÃ÷諾Öoˉêy--//
void Init_DS18B20(void) ;
void delay_18B20(unsigned int i);
unsigned char ReadOneChar(void);
void WriteOneChar(uchar dat);
unsigned int ReadTemp(void);
#endif
|