return error; //error=1 in case of no acknowledge //??:0??,1??
}
//----------------------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DATA_OUT=1;
DATAModeInput();
for (i=0x80;i>0;i/=2)
{
SCLK_OUT=1;
delay_us(1);
if(DATA_IN)val=(val|i);
SCLK_OUT=0;
delay_us(1);
}
DATAModeOutput();
if(ack)DATA_OUT=0;
else DATA_OUT=1;
delay_us(1);
SCLK_OUT=1;
delay_us(10);
SCLK_OUT=0;
delay_us(1);
DATA_OUT=1;
return val;
}
//----------------------------------------------------------------------------------
char s_softreset(void)
//----------------------------------------------------------------------------------
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //reset communication
error+=s_write_byte(Reset); //send RESET-command to sensor
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //transmission start
error=s_write_byte(STATUS_REG_R); //send command to sensor
*p_value=s_read_byte(ACK); //read status register (8-bit)
*p_checksum=s_read_byte(noACK); //read checksum (8-bit)
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_write_statusreg(unsigned char *p_value)
//----------------------------------------------------------------------------------
// writes the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //transmission start
error+=s_write_byte(STATUS_REG_W);//send command to sensor
error+=s_write_byte(*p_value); //send value of status register
return error; //error>=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned error=0;
unsigned int i;
s_transstart(); //transmission start
switch(mode) //send command to sensor
{
case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
default : break;
}
DATAModeInput();
for(i=0;i<50000;i++)
{
delay_us(10);
if(DATA_IN==0)break;
}
if(DATA_IN)error+=1;
DATAModeOutput();
*(p_value) =s_read_byte(ACK); //read the first byte (MSB)
*(p_value+1)=s_read_byte(ACK); //read the second byte (LSB)
*p_checksum =s_read_byte(noACK); //read checksum
return error;
}
//---------------------------------------
//----------------------------------------------------------------------------------------
void calc_sth11(float *p_humidity ,float *p_temperature)
{
const float C1=-4.0; // for 12 Bit
const float C2= 0.0405; // for 12 Bit
const float C3=-0.0000028; // for 12 Bit
const float T1=0.01; // for 14 Bit @ 5V
const float T2=0.00008; // for 14 Bit @ 5V
float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit
float t=*p_temperature; // t: Temperature [Ticks] 14 Bit
float rh_lin; // rh_lin: Humidity linear
float rh_true; // rh_true: Temperature compensated humidity
float t_C; // t_C : Temperature [¬C
t_C=t*0.01-40; //calc. Temperature from ticks to [¬C
rh_lin=C3*rh*rh + C2*rh + C1; //calc. Humidity from ticks to [%RH]
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. Temperature compensated humidity [%RH]
if(rh_true>100)rh_true=100; //cut if the value is outside of
if(rh_true<0.1)rh_true=0.1; //the physical possible range
*p_temperature=t_C; //return temperature [¬C
*p_humidity=rh_true; //return humidity[%RH]
}
//--------------------------------------------------------------------
float calc_dewpoint(float h,float t)
{
float logEx,dew_point ;
logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2) ;
dew_point=(logEx-0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
//-------------------------------------------------------------
这是代码 延时用的原子哥的
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "sht10.h"
typedef union
{
unsigned int i; //????????
float f;
} value;
int main()
{
value humi_val,temp_val;
float dew_point;
unsigned char error,checksum;
uart_init(9600);
LED_Init();
INIT_SHT10GPIO();
delay_init();
printf("start!!!\n");
delay_ms(20);
s_connectionreset();
while(1)
{
error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity
SendString(USART1,"EEROR1:");SendData(USART1,error+0x30);
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature
SendString(USART1,"EEROR2:");SendData(USART1,error+0x30);
SendString(USART1,"hello\n") ;
if(error!=0) s_connectionreset(); //in case of an error: connection reset
else
{
humi_val.f=(float)humi_val.i; //converts integer to float
temp_val.f=(float)temp_val.i; //converts integer to float
calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature
dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
//----------wait approx. 0.8s to avoid heating up SHTxx------------------------------
delay_ms(800); //(be sure that the compiler doesn’t eliminate this line!)
}