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