当前位置:首页 > PIC16F887A测量SHT11温湿传感器用LCD1602显示
NOP(); DATA=0; NOP(); SCK=0;
NOP();NOP();NOP(); SCK=1; NOP(); DATA=1; NOP(); SCK=0; }
//---------------------------------------------------------------------------------- void s_connectionreset(void){ //系统复位 TRISC7=0; TRISC6=0;
unsigned char i;
DATA=1; SCK=0; //准备
for(i=0;i<9;i++) //DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位 { SCK=1; SCK=0; }
s_transstart(); //启动传输 }
//----------------------------------------------------------------------------------
char s_write_byte(unsigned char value)
//---------------------------------------------------------------------------------- // 写字节函数 {
DATA_IO=0;
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //高位为1,循环右移
{ if (i & value) DATA=1; //和要发送的数相与,结果为发送的位 else DATA=0; SCK=1;
NOP();NOP();NOP(); SCK=0; }
DATA=1; //释放数据线 DATA_IO=1; SCK=1;
error=DATA; //检查应答信号,确认通讯正常 SCK=0;
return error; //error=1 通讯错误 }
//---------------------------------------------------------------------------------- char s_read_byte(unsigned char ack)
//---------------------------------------------------------------------------------- // 读数据; {
unsigned char i,val=0; DATA_IO=0;
DATA=1; //数据线为高 DATA_IO=1;
for (i=0x80;i>0;i/=2) //右移位 { SCK=1;
if (DATA) val=(val | i); //读数据线的值 SCK=0; }
DATA_IO=0;
DATA=!ack; //如果是校验,读取完后结束通讯; SCK=1;
NOP();NOP();NOP(); SCK=0;
DATA=1; //释放数据线 return val; }
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //----------------------------------------------------------------------------------
// 进行温度或者湿度转换,由参数mode决定转换内容; {
unsigned error=0; unsigned char i;
s_transstart(); //启动传输 switch(mode){
case 02 : error+=s_write_byte(MEASURE_TEMP); break; case 01 : error+=s_write_byte(MEASURE_HUMI); break; default : break; }
for (i=0;i<110;i++){ delay(2);
if(DATA==0) break; //等待测量结束; }
if(DATA) error+=1; // 如果长时间数据线没有拉低,说明测量错误 *(p_value) =s_read_byte(ACK); //读第一个字节,高字节 (MSB) *(p_value+1)=s_read_byte(ACK); //读第二个字节,低字节 (LSB)
*p_checksum =s_read_byte(noACK); //read CRC校验码 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; float t=*p_temperature; float rh_lin; float rh_true; float t_C;
t_C=t*0.01 - 40; //补偿温度
rh_lin=C3*rh*rh + C2*rh + C1; //相对湿度非线性补偿
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //相对湿度对于温度依赖性补偿 if(rh_true>100)rh_true=100; //湿度最大修正 if(rh_true<0.1)rh_true=0.1; //湿度最小修正 *p_temperature=t_C; //返回温度结果 *p_humidity=rh_true; //返回湿度结果 }
//-------------------------------------------------------------------- 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; }
//---------------------------------------------------------------------------------- void main()
//---------------------------------------------------------------------------------- // 示例程序,完成如下功能 // 1. 复位
// 2. 湿度的12测量以及温度的14位精度测量 // 3. 补偿及修正温湿度 // 4. 计数并得出绝对湿度
{
LCD_init(); //对LCD初始化 USART_init();//串行传输初始化 float dew_point;
unsigned char error,checksum; unsigned char HUMI,TEMP; HUMI=0X01; TEMP=0X02; init_uart();
s_connectionreset(); while(1) { error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //湿度测量 error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //温度测量 if(error!=0) s_connectionreset(); //如果发生错误,系统复位 else
{ humi_val.f=(float)humi_val.i; //转换为浮点数(共用体) temp_val.f=(float)temp_val.i; //转换为浮点数
calc_sth11(&humi_val.f,&temp_val.f); //修正相对湿度及温度 dew_point=calc_dewpoint(humi_val.f,temp_val.f); //计算绝对湿度值
//printf(\ set_display_position(1); print(\
zhuanhuan(temp_val.f); //转换温度为uchar方便液晶显示 Dataconv((unsigned char)temp_val.f);
str[5]=0xDF; //℃的符号
str[6]=0x43; str[7]='\\0'; print(str); set_display_position(0x41); print(\ zhuanhuan(humi_val.f); //转换湿度为uchar方便液晶显示 str[5]='%'; //%的符号 str[6]='\\0'; //字符串结束标志 print(str);
}
delay(800); //等待足够长的时间,以现行下一次转换 } }
共分享92篇相关文档