?? ds1820.c
字號:
#include "c8051F020.h"
#include <intrins.h>
/*
數字溫度傳感器DS18b20試驗
試驗準備:用連接線將JH端子的DS12B80位與CN7或CN8的P37口相連
運行此程序,溫度值將在數碼管上顯示.用手觸摸T1芯片(DS18B20)
觀察溫度變化.
*/
#define DataPortDS1820 P37
void Delay1us(unsigned char us)
{
while (us)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
--us;
}
/*
TCON &= ~0xc0; // STOP Timer1 and clear overflow flag
TMOD &= ~0xf0; // configure Timer1 to 16-bit mode
TMOD |= 0x10;
CKCON |= 0x10; // Timer1 counts SYSCLKs
TR1 = 0; // STOP Timer1
TH1 = (-SYSCLK/us) >> 8; // set Timer1 to overflow in us
TL1 = -SYSCLK/us;
TR1 = 1; // START Timer1
while (TF1 == 0); // wait for overflow
TF1 = 0; // clear overflow indicator
*/
}
void Delay15us(void)
{
Delay1us(15);
}
void Delay10us(void)
{
Delay1us(10);
}
bit RstDS1820(void) //返回0-有設備連接1-無設備連接
{
unsigned char i;
bit RstFlag;
RstFlag=1;
DataPortDS1820=0;
for (i=0;i<100/*40*/;i++) //480us
Delay15us();
DataPortDS1820=1;
for (i=0;i<4;i++) //15us-60us
{
Delay15us();
}
for (i=0;i<16;i++) //60us-240us
{
Delay15us();
if (DataPortDS1820==0) RstFlag=0;
}
for (i=0;i<16;i++) //240us
{
Delay15us();
}
return RstFlag;
}
void WriteDS1820(unsigned char ch)
{
unsigned char i;
DataPortDS1820=1;
Delay1us(1);
for (i=0;i<8;i++)
{
EA=0;
DataPortDS1820=0;
Delay15us();
DataPortDS1820=ch&0x1;
EA=1;
Delay15us();Delay15us();Delay15us();
DataPortDS1820=1;
ch=ch>>1;
Delay1us(1);
}
}
unsigned char ReadDS1820(void)
{
unsigned char i,ch;
ch=0;
DataPortDS1820=1;
Delay1us(1);
for (i=0;i<8;i++)
{
EA=0;
DataPortDS1820=0;
Delay10us();
DataPortDS1820=1;
Delay1us(2);
ch=ch>>1;
if (DataPortDS1820==1)
{
ch=ch+0x80;
}
EA=1;
Delay15us();Delay15us();Delay15us();
}
return ch;
}
/*
void GetROMCode(unsigned char idata *ptr)
{
unsigned char i;
RstDS1820();
WriteDS1820(0x33); //28h,1ah,2fh,0bh,00h,00h,00h,89h,
for (i=0;i<8;i++)
{
*(ptr+i)=ReadDS1820();
}
}
void MatchROMCode(unsigned char idata *ptr)
{
unsigned char i;
RstDS1820();
WriteDS1820(0x55);
for (i=0;i<8;i++)
{
WriteDS1820(*(ptr+i));
}
}
bit GetPowerType(void)
{
WriteDS1820(0xb4);
EA=0;
DataPortDS1820=1;
Delay10us();
if (DataPortDS1820)
{
EA=1;return TRUE;
}
else
{
EA=1;return FALSE;
}
}
void WriteConfig(unsigned char Config)
{
WriteDS1820(0x4e);
WriteDS1820(0x7f);
WriteDS1820(0x0);
WriteDS1820(Config);
}
unsigned char GetConfig(void)
{
WriteDS1820(0xBE);
ReadDS1820();
ReadDS1820();
ReadDS1820();
ReadDS1820();
return ReadDS1820();
}
*/
void SkipROMCode(void)
{
RstDS1820();
WriteDS1820(0xcc);
}
void StartADC(void)
{
RstDS1820(); //復位
WriteDS1820(0xcc); //廣播
WriteDS1820(0x44); //啟動AD轉換 12bit700ms
}
unsigned int GetTempValue(void)
{
unsigned char i,j;
unsigned int T;
SkipROMCode();
WriteDS1820(0xBE);
i=ReadDS1820();
j=ReadDS1820();
StartADC();
T=i+j*256;
if (T==0xffff) return 0xffff;
if (T>0x8000)
{
T=-T;
return (0x8000+T*5/8);
}
else
return (T*5/8);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -