搜档网
当前位置:搜档网 › SHT71

SHT71

//头文件
#include
#include

//测量命令
#define TEMPERATURE 0x03
#define HUMINITY 0x05
//定义SHT71与单片机的通信引脚
sbit SCL = P1^1; //时钟线
sbit SDA = P1^0; //数据线

//函数预定义
unsigned char MCU_receive_byte(void);
void Sent_command(unsigned char command);
void MCU_receive_word(void);
void SHT_ACK();
void SHT_end(void);
void SHT_ini(void);
void SHT_reset(void);
void SHT_start();
void SHT_measurement(unsigned char measure);
void UART_ini(void);
void USART_RX_interrupt(void);
void UART_Send_Byte(unsigned char Data);
void Delay(unsigned char time);

//
//------------------------------
//
// 主函数
//
//------------------------------
//
void main(void)
{
EA = 0;
UART_ini();
SHT_ini();
EA = 1;
for(;;)
{
Delay(10); //延时0.75S
SHT_measurement(TEMPERATURE); //温度测量
MCU_receive_word();
Delay(10);
SHT_measurement(HUMINITY); //湿度测量
MCU_receive_word();
}
}
//
//------------------------------
//
// SHT71初始化
//
//------------------------------
//
void SHT_ini(void)
{
SHT_reset(); //SHT71软复位
Delay(1);
}
//
//------------------------------
//
// SHT71 复位
//
//------------------------------
//
void SHT_reset(void)
{
unsigned char i;

SDA = 1;
SCL = 0;

for (i=0;i<20 ;i++ ) //至少9个Clock
{
SCL = 1;
_nop_();
SCL = 0;
}

}
//
//------------------------------
//
// SHT71 启动一次测量
//
//------------------------------
//
void SHT_measurement(unsigned char measure)
{
SHT_start(); //启动
Sent_command(measure); //发送命令
SHT_ACK(); //等待转换结束
MCU_receive_word(); //接收测量结果
SHT_end(); //结束一次测量
}
//
//------------------------------
//
// SHT71启动信号
//
//------------------------------
//
void SHT_start()
{
SCL = 0;
SDA = 1;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
SCL = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
SDA = 1;
_nop_();
_nop_();
SCL = 0;
}
//
//------------------------------
//
// SHT71 控制命令发送
// command = 0x03---温度
// 0x05---湿度
//
//------------------------------
//
void Sent_command(unsigned char command)
{
unsigned char model = 0x80;
unsigned char i;

for(i=0;i<7;i++)
{
SCL = 0;
if((command & model) == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}
SCL = 1;
model = model>>1;
}

SCL = 0;

if((command & model) == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}

SCL = 1;
_nop_();
SCL = 0;

while(SDA == 1)
{
}

SCL = 1;
_nop_();
SCL = 0;
_nop_();
}
//
//------------------------------
//
// SHT71 等待应答信号
//
//------------------------------
//
v

oid SHT_ACK()
{
while(SDA == 1)
{
}
}
//
//------------------------------
//
// SHT71 接收一个字节
//
//------------------------------
//
unsigned char MCU_receive_byte(void)
{
unsigned char i;
unsigned char model = 0x00;
unsigned char temp;

SCL = 0;
_nop_();
for(i=0;i<8;i++)
{
SCL = 1;
if(SDA == 0)
{
temp = 0;
}
else
{
temp = 1;
}

model = model|(temp<<(7-i));
SCL = 0;
}

SDA = 0; //
_nop_();
SCL = 1;
_nop_();
SCL = 0;
return model;
}
//
//------------------------------
//
// SHT71 结束一次测量
//
//------------------------------
//
void SHT_end(void)
{
SCL = 0;
SDA = 1;
}
//
//------------------------------
//
// SHT71 接收结果
//
//------------------------------
//
void MCU_receive_word(void)
{
unsigned char temp;
temp = MCU_receive_byte(); //将测量结果通过串口发送
UART_Send_Byte(temp);
temp = MCU_receive_byte();
UART_Send_Byte(temp);
}


//-----------------------------
//
// 软件延时(非精确)
//
//-----------------------------
void Delay(unsigned char time)
{
unsigned char i;
unsigned int j;

for (i = 0;i < time;i++)
{
for (j=0;j<30000;j++)
{
}
}
}
//---------------------------------
//
// 单片机晶振 22.1184MHZ
// 串行口初始化设置
// 方式1,8数据位,一个停止位,无奇偶校验
// 串口中断允许,波特率9600bps
//
//------------------------------------
void UART_ini(void)
{
SCON = 0x50; //方式1,波特率可变,8bits,接受允许
PCON&= 0x7F; //SMOD = 0
TMOD |= 0x20; //timer1 mode 2

TL1 = 0xfd; //| f
//| 波特率=----------------------
TH1 = 0xfd; //| 32*2^smod*12*(256-TL1)
TCON |= 0x40; //start

TI = 0;
}
//---------------------------------------------------------------
//
// 串口发送单字节程序
//
//----------------------------------------------------------------
void UART_Send_Byte(unsigned char Data)
{
SBUF = Data;
while (TI == 0) //等待发送完毕
{
}
TI = 0;
}
//---------------------------------------------------------------
//
// 串口中断服务程序
//
// ----只有接收使用
//
//----------------------------------------------------------------
void RX_INT(void) interrupt 4 using 3
{
if (RI==1)
{
do
{
RI = 0;
}
while (RI != 0);

//未指定
}
else
{
}
}

相关主题