?? ds18b20.c
字號:
/**************************************************************************************
* 子程序:底層程序 *
* 功能:外部測溫功能; *
* 調(diào)用子程序; *
* *
***************************************************************************************/
# include "stc12c5a60s2.h"
#include "INTRINS.H"
# include "macroandconst.h"
# include "main.h"
# include "nokia5110.h"
# include "delay.h"
sbit DQ = P1^5; //DS18B20的數(shù)據(jù)口位P3.3
BYTE TPH; //存放溫度值的高字節(jié)
BYTE TPL; //存放溫度值的低字節(jié)
void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();
uint get_temperatuerResult();
uint get_temperatuerResult()
{
uint temperatuerResult;
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é)
temperatuerResult=TPH<<8;
temperatuerResult|=TPL;
return temperatuerResult;
}
/**************************************
復(fù)位DS18B20,并檢測設(shè)備是否存在
**************************************/
void DS18B20_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ù)
**************************************/
BYTE DS18B20_ReadByte()
{
BYTE i;
BYTE dat = 0; for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
dat >>= 1;
DQ = 0; //開始時間片
DelayXus(1); //延時等待
DQ = 1; //準(zhǔn)備接收
DelayXus(1); //接收延時
if (DQ) dat |= 0x80; //讀取數(shù)據(jù)
DelayXus(60); //等待時間片結(jié)束
}
return dat;
} /**************************************
向DS18B20寫1字節(jié)數(shù)據(jù)
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
char i; for (i=0; i<8; i++) //8位計(jì)數(shù)器
{
DQ = 0; //開始時間片
DelayXus(1); //延時等待
dat >>= 1; //送出數(shù)據(jù)
DQ = CY;
DelayXus(60); //等待時間片結(jié)束
DQ = 1; //恢復(fù)數(shù)據(jù)線
DelayXus(1); //恢復(fù)延時
}
}
void temperatuercheck()
{
uint WENDU;
//uchar warring;
uchar ge,shi,bai,xiaoshu;
WENDU=get_temperatuerResult()*0.625;//放大十倍;
LCD_write_hanzi(0,0,6);
LCD_write_hanzi(1,0,7); //temperature
LCD_write_hanzi(3,2,11);
bai=WENDU/1000;
shi=WENDU/100%10;
ge=WENDU/10%10;
xiaoshu=WENDU%10;
if(bai!=0)
LCD_write_shu(1,2,bai);
else
LCD_write_shu(1,2,90);
LCD_write_shu(2,2,shi);
LCD_write_shu(3,2,ge);
LCD_write_shu(4,2,87);
LCD_write_shu(5,2,xiaoshu);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -