云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > PIC16F887A测量SHT11温湿传感器用LCD1602显示

PIC16F887A测量SHT11温湿传感器用LCD1602显示

  • 62 次阅读
  • 3 次下载
  • 2025/7/7 16:55:41

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); //等待足够长的时间,以现行下一次转换 } }

搜索更多关于: PIC16F887A测量SHT11温湿传感器用LCD1602 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

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++)

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com