//SCK:串行时钟,输入口,用于通信
//DATA:串行数据,双向
//命令00000101表示湿度
//命令00000011表示温度 命令发送后等待时间和相应获取位数,约20/80/320ms -->8/12/14 bit
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SHT75_DATA_PIN=P2^7;
sbit SHT75_SCK_PIN=P2^6;
int _data=0;
float result_data=0,temp=0;
void SHT75_reset()//SHT75复位
{
uchar i;
SHT75_DATA_PIN=1;
SHT75_SCK_PIN=0;
_nop_();_nop_();_nop_();_nop_();
for(i=0;i<10;i++)
{
SHT75_SCK_PIN=1;
_nop_();_nop_();_nop_();_nop_();
SHT75_SCK_PIN=0;
_nop_();_nop_();_nop_();_nop_();
}
}
void Initialize_connect_SHT75()//初始话发送命令连接
{
// SHT75_reset();
SHT75_SCK_PIN=1;
_nop_();
SHT75_DATA_PIN=0;
_nop_();
SHT75_SCK_PIN=0;
_nop_();_nop_();
SHT75_SCK_PIN=1;
_nop_();
SHT75_DATA_PIN=1;
_nop_();
SHT75_SCK_PIN=0;
}
void send_byte(uchar cmd)//发送一个字节,由高位到低位循环发送
{
char i;
for(i=7;i>=0;i--){
if(cmd&(0x01<<i)){ //该位为高位
SHT75_DATA_PIN=1;
}
else{
SHT75_DATA_PIN=0;
}
SHT75_SCK_PIN=1; //发送一个电平信号脉冲,该位被送出
_nop_();_nop_();
SHT75_SCK_PIN=0;
}
_nop_();
return;
}
char read_byte()//读取一个字节,由高位到低位接收
{
char _data=0;
char i;
SHT75_DATA_PIN=1; //置高电平,释放数据线
for(i=8;i>0;i--){
_data<<=1; //左移一位,准备读取下一位数据
SHT75_SCK_PIN=1; //置高电平
_nop_();_nop_();_nop_();_nop_(); //延迟4us
if(SHT75_DATA_PIN){ //读取一个位
_data|=0x01;
}
SHT75_SCK_PIN=0; //拉低sck
_nop_();_nop_();
}
return _data;
}
void send_ACK()//ACK 确认字符
{
//SHT75_DATA_PIN=1;
SHT75_DATA_PIN=0;
_nop_();
SHT75_SCK_PIN=1;
_nop_();_nop_();
SHT75_SCK_PIN=0;
_nop_();
SHT75_DATA_PIN=1; //拉高data释放数据线
}
char read_ACK() //读取确认字符
{
char ack;
SHT75_DATA_PIN=1;
_nop_();
SHT75_SCK_PIN=1;
_nop_();_nop_();
ack=SHT75_DATA_PIN;
SHT75_SCK_PIN=0;
_nop_();
return ack;
}
float get_measure_data(uchar cmd)//根据对应的指令,获取相应的测量数据
{
Initialize_connect_SHT75();
send_byte(cmd);
if(read_ACK()){
return -1;
}
while(SHT75_DATA_PIN!=0); //延时等待data变低,之后便可读数据
_data=read_byte(); //读取高八位的数据
send_ACK(); //发送一个确认指令,确定已读取了前八位数据
_data=(_data<<8)+read_byte(); //读取后八位,并和前八位合并成为一个16进制的数据
send_ACK(); //发送一个确认符,表示接受完八位字符
read_byte(); //再读取八位数据是CRC,用于数据校验,可忽略校验
send_ACK();
if(cmd==0x05){ //测湿度
temp=-4+(0.0405*_data)-(2.8e-6*_data*_data);
//对湿度进行温度补偿
result_data=(result_data-25)*(0.01+0.00008*_data)+temp; //由于每次先测量的是温度,所以result_data的值计算前还是温度的值
}
else if(cmd==0x03){ //测温度
result_data=-39.75+0.01*_data;
}
else{
return -1;
}
return result_data;
}