#include <stc12c5a60s2.h>
#include "Delay.h"
#include "sht.h"
#define uchar unsigned char
#define uint unsigned int
#define add_w 0x80 //传感器地址 + 写操作
#define add_r 0x81 //传感器地址 + 读操作
#define T_code 0xe3 //温度 测量指令
#define RH_code 0xe5 //湿度 测量指令
#define user_code_w 0xe6 //用户寄存器 写指令
#define user_code_r 0xe7 //用户寄存器 读指令,可读电池电压是否小于2.25V。(测量后才可查看)
#define RST_code 0xfe //软复位,寄存器服务。
sbit sda=P1^2; //数据线
sbit scl=P1^3; //时钟线
void iic_start(void)
{
sda=1;
delay_us(2);
scl=1;
delay_us(2);
sda=0;
delay_us(2);
scl=0;
delay_us(2);
}
void iic_stop(void)
{
sda=0;
delay_us(2);
scl=1;
delay_us(2);
sda=1;
delay_us(2);
scl=0;
delay_us(2);
}
void ACK (void)
{
sda=0;
delay_us(2);
scl=1;
delay_us(2);
scl=0;
delay_us(2);
}
void noACK (void)
{
scl=1;
delay_us(2);
sda=0;
delay_us(2);
}
bit getACK(void)
{
bit ack1=0;
sda=1;
delay_us(2);
scl=1;
delay_us(2);
ack1=sda;
scl=0;
delay_us(2);
return ack1;
}
void send(uchar DATA)
{
uchar Bit_Counter=8;
while(Bit_Counter>0)
{
sda=(bit)(DATA&0x80);
DATA<<=1;
scl=1;
delay_us(2);
scl=0;
delay_us(2);
Bit_Counter--;
}
}
unsigned char Read()
{
unsigned char x=0,y=8;
sda=1;
while(y>0)
{
scl=1;
delay_us(2);
if(sda)
x=x|0x01;
else
x=x&0xfe;
scl=0;
delay_us(2);
if(y>1)
x=x<<1;
y--;
}
return x;
}
void SHT2x_init()
{
iic_start();
send(add_w);
getACK();
send(RST_code);
getACK();
iic_stop();
delay_ms(15);
sda=1;
scl=1;
}
// 2传感器用户寄存器读取
unsigned char SHT2x_user_register()
{
uchar register_data;
iic_start();
send(add_w);
getACK();
send(user_code_r);
getACK();
iic_start();
send(add_r);
getACK();
register_data=Read();
noACK();
iic_stop();
return register_data;
}
void SHT2x_Resolution()
{
iic_start();
send(add_w);
getACK();
send(user_code_w);
getACK();
send(0x3b);
getACK();
getACK();
iic_stop();
}
bit SHT2x_battery()
{
uchar battery;
iic_start();
send(add_w);
getACK();
send(user_code_r);
getACK();
iic_start();
send(add_r);
getACK();
battery=Read();
noACK();
iic_stop();
battery=(battery&0x40)>>6;
return battery;
}
unsigned int RH_Result()
{
unsigned int RH_Data;
unsigned long RH=0;
iic_start();
send(add_w);
getACK();
send(RH_code);
getACK();
iic_start();
send(add_r);
getACK();
delay_ms(29);
RH_Data=Read();
ACK();
RH_Data=RH_Data<<8;
RH_Data=RH_Data|Read();
noACK();
iic_stop();
RH_Data=RH_Data&0xfffc;
RH=RH_Data*12500L;
RH=RH>>16;
RH=RH-600;
return RH;
}
unsigned int T_Result()
{
unsigned int T_Data;
unsigned long T=0;
iic_start();
send(add_w);
getACK();
send(T_code);
getACK();
iic_start();
send(add_r);
getACK();
delay_ms(85);
T_Data=Read();
ACK();
T_Data=T_Data<<8;
T_Data=T_Data|Read();
noACK();
iic_stop();
T_Data=T_Data&0xfffE;
T=T_Data*17572L;
T=T>>16;
T=T-4685;
return T;
}