?? ds18b20.c
字號:
/*****************************************************************************
MCS8051-III學習板演示程序
(c) Copyright 2007-2007,廣州恒芯電子
All Rights Reserved
*****************************************************************************/
/*****************************************************************************
程序說明
名稱: MCS8051-III學習板演示程序(DS18B20測試)
功能: 實現在數碼管上顯示當前溫度
版本:2007-07-01
*****************************************************************************/
/*****************************************************************************
硬件說明
單片機: 兼容MCS-51單片機/STC89C51
晶振頻率: 12MHz
*****************************************************************************/
#include "regx52.h"
/****************************************************************************
說明: 程序預定義
*****************************************************************************/
#define LED7A_STATUS P1_7/*數碼管第一位控制引腳(0為有效,1為無效)*/
#define LED7B_STATUS P1_6/*數碼管第二位控制引腳(0為有效,1為無效)*/
#define LED7C_STATUS P1_5/*數碼管第三位控制引腳(0為有效,1為無效)*/
#define LED7D_STATUS P1_4/*數碼管第四位控制引腳(0為有效,1為無效)*/
#define LED7_STATUS P0/*數碼管狀態引腳(0為有效,1為無效)*/
#define DS18B20_IO P3_2/*DS18B20數據引腳*/
#define DS18B20_ORDER_READID 0x33
#define DS18B20_ORDER_JMPROM 0xcc
#define DS18B20_ORDER_START 0x44
#define DS18B20_ORDER_READREG 0Xbe
/****************************************************************************
說明: 變量定義
*****************************************************************************/
code unsigned char m_ucLedTab[]=
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0xC6, 0xa1 ,0x86 ,0x8e, 0xff
};/*數碼管十六進制編碼表*/
unsigned char m_ucLedBuf[4];/*七段數碼管顯示值緩存*/
/****************************************************************************
名稱: Delay
說明: 程序延時
參數: 無
返回: 無
*****************************************************************************/
void Delay();
/****************************************************************************
名稱: Led7Scan()
說明: 數碼管動態掃描處理程序
參數: 無
返回: 無
*****************************************************************************/
void Led7Scan();
/****************************************************************************
名稱:DS18B20ReadTemp
說明:DS18B20讀取當前溫度
參數:無
返回: unsigned char 溫度值
****************************************************************************/
unsigned char DS18B20ReadTemp();
/****************************************************************************
名稱:DS18B20Init
說明:DS18B20初始化
參數:無
返回: 無
****************************************************************************/
unsigned char DS18B20Init();
/****************************************************************************
名稱:DS18B20ReadBit
說明:DS18B20讀位操作
參數:無
返回: unsigned char ucData 讀位
****************************************************************************/
unsigned char DS18B20ReadBit();
/****************************************************************************
名稱:DS18B20ReadChar
說明:DS18B20讀字節操作
參數:無
返回: unsigned char ucData 讀字節
****************************************************************************/
unsigned char DS18B20ReadChar();
/****************************************************************************
名稱:DS18B20WriteBit
說明:DS18B20寫位操作
參數:unsigned char ucData 寫位
****************************************************************************/
void DS18B20WriteBit(unsigned char ucData);
/****************************************************************************
名稱:DS18B20WriteChar
說明:DS18B20寫字節操作
參數:unsigned char ucData 寫字節
返回: 無
****************************************************************************/
void DS18B20WriteChar(unsigned char ucData);
/****************************************************************************
名稱:DS18B20Delay
說明:DS18B20延時
參數:unsigned int uiDelay 時間延時
返回: 無
****************************************************************************/
void DS18B20Delay(unsigned char ucDelay);
/*****************************************************************************
程序開始
*****************************************************************************/
void main()
{
unsigned char ucTemp=0;/*計數值置0*/
/*T0中斷設定*/
TMOD=0x01;/*使用T0:GATE=0,C/T=0(定時),M1 M0=01(工作方式1)*/
TH0=0xec;/*定時時間5毫秒*/
TL0=0x78;
ET0=1;/*允許T0中斷*/
TR0=1;/*使T0工作*/
EA=1;/*總中斷開啟*/
while(1)
{
ucTemp=DS18B20ReadTemp();/*獲取當前溫度*/
m_ucLedBuf[0]=16;
m_ucLedBuf[1]=16;
m_ucLedBuf[2]=(ucTemp%100)/10;/*取出十位數*/
m_ucLedBuf[3]=ucTemp%10;/*取出個位數*/
Delay();/*延時*/
}
}
/*****************************************************************************
名稱: Interrupt1Handler
說明: T0中斷入口
參數: 無
返回 :無
*****************************************************************************/
void Interrupt1Handler() interrupt 1
{
Led7Scan();/*數碼管動態掃描處理程序*/
TH0=0xec;/*重新設置T0定時值*/
TL0=0x78;
}
/****************************************************************************
名稱: Delay
說明: 程序延時
參數: 無
返回: 無
*****************************************************************************/
void Delay()
{
unsigned char a,b;
for(a=0;a<255;a++)
for(b=0;b<255;b++);
}
/****************************************************************************
名稱: Led7Scan()
說明: 數碼管動態掃描處理程序
參數: 無
返回: 無
*****************************************************************************/
void Led7Scan()
{
static unsigned char a=0;
switch(a)/*判斷數碼管動態掃描值*/
{
case 0:/*處理數碼管第一位*/
LED7D_STATUS=1;/*設置數碼管第四位為無效*/
LED7A_STATUS=0;/*設置數碼管第一位位有效*/
break;
case 1:/*處理數碼管第二位*/
LED7A_STATUS=1;/*設置數碼管第一位為無效*/
LED7B_STATUS=0;/*設置數碼管第二位位有效*/
break;
case 2:/*處理數碼管第三位*/
LED7B_STATUS=1;/*設置數碼管第二位為無效*/
LED7C_STATUS=0;/*設置數碼管第三位位有效*/
break;
case 3:/*處理數碼管第四位*/
LED7C_STATUS=1;/*設置數碼管第三位為無效*/
LED7D_STATUS=0;/*設置數碼管第四位位有效*/
break;
}
LED7_STATUS=m_ucLedTab[m_ucLedBuf[a]];/*將顯示碼送數碼管狀態引腳*/
a++;/*數碼管動態掃描值加1,若該值4則置為0*/
if(a>3)
a=0;
}
/****************************************************************************
名稱:DS18B20Delay
說明:DS18B20延時
參數:unsigned int uiDelay 時間延時
返回: 無
****************************************************************************/
void DS18B20Delay(unsigned char ucDelay)
{
unsigned char a;
for(a=0;a<ucDelay;a++);
}
/****************************************************************************
名稱:DS18B20Init
說明:DS18B20初始化
參數:無
返回: 無
****************************************************************************/
unsigned char DS18B20Init()
{
DS18B20_IO=0;
DS18B20Delay(30);
DS18B20_IO=1;
DS18B20Delay(30);
return DS18B20_IO;
}
/****************************************************************************
名稱:DS18B20WriteChar
說明:DS18B20寫字節操作
參數:unsigned char ucData 寫字節
返回: 無
****************************************************************************/
void DS18B20WriteChar(unsigned char ucData)
{
unsigned char a,b;
EA=0;
for(a=0;a<8;a++)
{
b=ucData>>a;
b&=0x01;
DS18B20WriteBit(b);
}
EA=1;
DS18B20Delay(5);
}
/****************************************************************************
名稱:DS18B20WriteBit
說明:DS18B20寫位操作
參數:unsigned char ucData 寫位
****************************************************************************/
void DS18B20WriteBit(unsigned char ucData)
{
DS18B20_IO=0;
if(ucData==1)
DS18B20_IO=1;
DS18B20Delay(5);
DS18B20_IO=1;
}
/****************************************************************************
名稱:DS18B20ReadChar
說明:DS18B20讀字節操作
參數:無
返回: unsigned char ucData 讀字節
****************************************************************************/
unsigned char DS18B20ReadChar()
{
unsigned char a,b=0;
for(a=0;a<8;a++)
{
EA=0;
if(DS18B20ReadBit())
b|=0x01<<a;
EA=1;
DS18B20Delay(6);
}
return b;
}
/****************************************************************************
名稱:DS18B20ReadBit
說明:DS18B20讀位操作
參數:無
返回: unsigned char ucData 讀位
****************************************************************************/
unsigned char DS18B20ReadBit()
{
unsigned char a;
DS18B20_IO=0;
DS18B20_IO=1;
for(a=0;a<3;a++);
return(DS18B20_IO);
}
/****************************************************************************
名稱:DS18B20ReadTemp
說明:DS18B20讀取當前溫度
參數:無
返回: unsigned char 溫度值
****************************************************************************/
unsigned char DS18B20ReadTemp()
{
unsigned char ucTempL,ucTempM;
unsigned char ucTemp;
DS18B20Init();
DS18B20WriteChar(DS18B20_ORDER_JMPROM);
DS18B20WriteChar(DS18B20_ORDER_START);
DS18B20Delay(5);
DS18B20Init();
DS18B20WriteChar(DS18B20_ORDER_JMPROM);
DS18B20WriteChar(DS18B20_ORDER_READREG);
ucTempL=DS18B20ReadChar();
ucTempM=DS18B20ReadChar();
ucTempL=ucTempL>>4;
ucTemp=(ucTempM&0x3)<<4;
ucTemp=ucTempL|ucTemp;
return ucTemp;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -