?? shtxx_iic._c
字號:
//溫濕度傳感器SHTXX系列,I2C接口程序
//2007-06-06
//-----------------------函數聲明,變量定義--------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
sbit SDA=P2^0; // 將p1.0口模擬數據口
sbit SCL=P2^1; // 將p1.1口模擬時鐘口
//#define NUM 10 // 接收和發送緩存區的深度
#define uchar unsigned char
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
#define BIT7 0X80
#define BIT6 0X40
#define BIT5 0X20
#define BIT4 0X10
#define BIT3 0X08
#define BIT2 0X04
#define BIT1 0X02
#define BIT0 0X01
//unsigned char idata sendbuf[NUM]; // 數據發送緩沖區
//unsigned char idata receivebuf[NUM]; // 數據接收緩沖區
//bit bdata SystemError; // 從機錯誤標志位
//--------------------------------------------------------------------------------------------------
// 函數名稱: iic_start()
// 函數功能: 啟動I2C總線子程序
//--------------------------------------------------------------------------------------------------
void iic_start(void)
{
//:當SCK 時鐘高電平時DATA 翻轉為低電平,緊接著SCK 變為低電平,隨后是在SCK時鐘高電平時DATA 翻轉為高電平。
// EA=0;
SDA = 1;
SCL = 1;
SDA = 0;
SCL = 0;
SCL = 1;
SDA = 1;
SCL = 0;
_nop_();_nop_();
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: iic_reset()
// 函數功能: 停止I2C總線數據傳送子程序
//--------------------------------------------------------------------------------------------------
void iic_reset(void)
{
SDA = 1; //當DATA 保持高電平時,觸發SCK 時鐘9 次或更多。
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
SCL = 1;SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: iic_stop()
// 函數功能: 停止I2C總線數據傳送子程序
//--------------------------------------------------------------------------------------------------
void iic_stop(void)
{
SDA = 1; //通過保持確認位ack 高電平,來中止通訊。
SCL = 1;SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: slave_ACK
// 函數功能: 從機發送應答位子程序
//--------------------------------------------------------------------------------------------------
void slave_ACK(void)
{
SDA = 0;
SCL = 1;SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: slave_NOACK
// 函數功能: 從機發送非應答位子程序,迫使數據傳輸過程結束
//--------------------------------------------------------------------------------------------------
void slave_NOACK(void)
{
SDA = 1; //通過保持確認位ack 高電平,來中止通訊。
SCL = 1;SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: check_ACK
// 函數功能: 主機應答位檢查子程序,迫使數據傳輸過程結束
//--------------------------------------------------------------------------------------------------
void check_ACK(void)
{
SDA = 1; // 將p1.0設置成輸入,必須先向端口寫1
SCL = 1;
F0 = 0;
if(SDA == 1) // 若SDA=1表明非應答,置位非應答標志F0
F0 = 1;
SCL = 0;
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: IICSendByte
// 入口參數: ch
// 函數功能: 發送一個字節
//--------------------------------------------------------------------------------------------------
void IICSendByte(unsigned char ch)
{
unsigned char idata n=8; // 向SDA上發送一位數據字節,共八位
while(n--)
{
if((ch&0x80) == 0x80) // 若要發送的數據最高位為1則發送位1
{
SDA = 1; // 傳送位1
SCL = 1;SCL = 0;
}
else
{
SDA = 0; // 否則傳送位0
SCL = 1;SCL = 0;
}
ch = ch<<1; // 數據左移一位
}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: IICreceiveByte
// 返回接收的數據
// 函數功能: 接收一字節子程序
//--------------------------------------------------------------------------------------------------
unsigned char IICreceiveByte(void)
{
unsigned char idata n=8; // 從SDA線上讀取一上數據字節,共八位
unsigned char tdata;
while(n--)
{
SDA = 1;
SCL = 1;
tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位為1,則數據的最后一位置1
else
tdata = tdata&0xfe; // 否則數據的最后一位置0
SCL=0;
}
return(tdata);
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: InitSHTXX
// 函數功能: 初始化SHTXX
//--------------------------------------------------------------------------------------------------
void InitSHTXX(void)
{
unsigned char initdat;
initdat=0x06;//寫狀態寄存器命令
iic_start();//啟動I2C
IICSendByte(initdat);//發送命令
// slave_ACK();//給SHTXX應答位
check_ACK();
if(F0==0)
{// initdat=0x00;//14bit(溫度)、12bit(濕度)
initdat=0x01;//12bit(溫度)、8bit(濕度)
IICSendByte(initdat);//發送狀態字
//slave_ACK();//給SHTXX應答位
check_ACK();
}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: ReadStatus
// 返回接收的數據
// 函數功能: 讀狀態寄存器
//--------------------------------------------------------------------------------------------------
unsigned char ReadStatus(void)
{
unsigned char rdata;
rdata=0x07;//讀狀態寄存器命令
iic_start();//啟動I2C
IICSendByte(rdata);//發送命令
slave_ACK();//給SHTXX應答位
rdata=IICreceiveByte();//接收狀態字
slave_NOACK();//給SHTXX非應答位,結束讀命令
return(rdata);
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: MeasureTem
// 函數功能: 測量溫度,調用后應延遲
//--------------------------------------------------------------------------------------------------
void MeasureTem(void)
{
unsigned char initdat;
initdat=0x03;//測量溫度命令
iic_start();//啟動I2C
IICSendByte(initdat);//發送命令
check_ACK();
/* TH0=0X28;
TL0=0X00;//11.0592MHz 60mS
TR0=1;*/
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: MeasureHum
// 函數功能: 測量濕度,調用后應延遲
//--------------------------------------------------------------------------------------------------
void MeasureHum(void)
{
unsigned char initdat;
initdat=0x05;//測量濕度命令
iic_start();//啟動I2C
IICSendByte(initdat);//發送命令
check_ACK();
/* TH0=0Xca;
TL0=0X00;//11.0592MHz 15mS
TR0=1;*/
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: SoftReset
// 函數功能: 軟復位,復位接口、清空狀態寄存器, ,即清空為默認值,調用后應延遲11mS
//--------------------------------------------------------------------------------------------------
void SoftReset(void)
{
unsigned char initdat;
initdat=0x1E;//軟復位命令
iic_start();//啟動I2C
IICSendByte(initdat);//發送命令
/* TH0=0Xca;
TL0=0X00;//11.0592MHz 15mS
TR0=1;*/
}
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// 函數名稱: ReadData
// 返回接收的數據
// 函數功能: 讀測量數據
//--------------------------------------------------------------------------------------------------
int ReadData(void)
{
int rdata;int *p;
unsigned char dd[2];
while(SDA==1);//等待轉換結束
dd[0]=IICreceiveByte();//接收狀態字
slave_ACK();//給SHTXX應答位
dd[1]=IICreceiveByte();//接收狀態字
slave_NOACK();//給SHTXX非應答位,結束讀命令
p=dd;
rdata=*p;
return(rdata);
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: CalculateTem
// 返回計算后的溫度數據
// 函數功能: 計算溫度值
//--------------------------------------------------------------------------------------------------
float CalculateTem(void)
{
float rdata;int rdat;
uchar *p;
float temp;
rdat=ReadData();
p=&rdat;
*p=*p&0x0f;//12bit模式,清除高4位
//*p=*p&0x3f;//14bit模式,清除高2位
rdata=rdat;
temp=0.04*rdata-40;//12bit溫度公式
//temp=0.01*rdata-40;//14bit溫度公式
return(temp);
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: CalculateHum
// 返回計算后的濕度數據
// 函數功能: 計算濕度值
//--------------------------------------------------------------------------------------------------
float CalculateHum(void)
{
float rdata;int rdat;
uchar *p;
float hump;
rdat=ReadData();
p=&rdat;
*p=*p&0x00;//8bit模式,清除高8位
//*p=*p&0x0f;//12bit模式,清除高4位
rdata=rdat;
hump=0.648*rdata-rdata*rdata*0.00072-4;//8bit濕度公式
//temp=0.0405*rdata-rdata*rdata*0.0000028-4;//12bit濕度公式
return hump;
}
//--------------------------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -