STC12C5A60S2控制溫度傳感器DS18B20 c程序
STC12C5A60S2控制溫度傳感器DS18B20 c程序工作頻率:12.000MHz
#include"REG51.H"
#include"INTRINS.H" typedefunsignedcharBYTE; sbitDQ=P3^3;//DS18B20的數(shù)據(jù)口位P3.3
BYTETPH;//存放溫度值的高字節(jié)
BYTETPL;//存放溫度值的低字節(jié) voidDelayXus(BYTEn);
voidDS18B20_Reset();
voidDS18B20_WriteByte(BYTEdat);
BYTEDS18B20_ReadByte(); voidmain()
{
DS18B20_Reset();//設(shè)備復(fù)位
DS18B20_WriteByte(0xCC);//跳過ROM命令
DS18B20_WriteByte(0x44);//開始轉(zhuǎn)換命令
while(!DQ);//等待轉(zhuǎn)換完成 DS18B20_Reset();//設(shè)備復(fù)位
DS18B20_WriteByte(0xCC);//跳過ROM命令
DS18B20_WriteByte(0xBE);//讀暫存存儲器命令
TPL=DS18B20_ReadByte();//讀溫度低字節(jié)
TPH=DS18B20_ReadByte();//讀溫度高字節(jié) while(1);
} /**************************************
延時X微秒(STC12C5A60S2@12M)
不同的工作環(huán)境,需要調(diào)整此函數(shù)
此延時函數(shù)是使用1T的指令周期進(jìn)行計算,與傳統(tǒng)的12T的MCU不同
**************************************/
voidDelayXus(BYTEn)
{
while(n--)
{
_nop_();
_nop_();
}
} /**************************************
復(fù)位DS18B20,并檢測設(shè)備是否存在
**************************************/
voidDS18B20_Reset()
{
CY=1;
while(CY)
{
DQ=0;//送出低電平復(fù)位信號
DelayXus(240);//延時至少480us
DelayXus(240);
DQ=1;//釋放數(shù)據(jù)線
DelayXus(60);//等待60us
CY=DQ;//檢測存在脈沖
DelayXus(240);//等待設(shè)備釋放數(shù)據(jù)線
DelayXus(180);
}
} /**************************************
從DS18B20讀1字節(jié)數(shù)據(jù)
**************************************/
BYTEDS18B20_ReadByte()
{
BYTEi;
BYTEdat=0; for(i=0;i8;i++)//8位計數(shù)器
{
dat>>=1;
DQ=0;//開始時間片
DelayXus(1);//延時等待
DQ=1;//準(zhǔn)備接收
DelayXus(1);//接收延時
if(DQ)dat|=0x80;//讀取數(shù)據(jù)
DelayXus(60);//等待時間片結(jié)束
} returndat;
} /**************************************
向DS18B20寫1字節(jié)數(shù)據(jù)
**************************************/
voidDS18B20_WriteByte(BYTEdat)
{
chari; for(i=0;i8;i++)//8位計數(shù)器
{
DQ=0;//開始時間片
DelayXus(1);//延時等待
dat>>=1;//送出數(shù)據(jù)
DQ=CY;
DelayXus(60);//等待時間片結(jié)束
DQ=1;//恢復(fù)數(shù)據(jù)線
DelayXus(1);//恢復(fù)延時
}
}
傳感器相關(guān)文章:傳感器工作原理
風(fēng)速傳感器相關(guān)文章:風(fēng)速傳感器原理 塵埃粒子計數(shù)器相關(guān)文章:塵埃粒子計數(shù)器原理
評論