基于51单片机SHT11温湿度传感器检测程序_第1页
基于51单片机SHT11温湿度传感器检测程序_第2页
基于51单片机SHT11温湿度传感器检测程序_第3页
基于51单片机SHT11温湿度传感器检测程序_第4页
基于51单片机SHT11温湿度传感器检测程序_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于51单片机SHT11S湿度传感器检测程 序(含电路图)卜面就是原理卜面就是SHT1W MCU!接的典型电路:2 接口说明SHT1X(slave)2 典型应用电路卜面就是源代码:#include <reg52 、 h>#include <intrins 、 h>/* 宏定义*/#define uint unsigned int#define uchar unsigned char#define noACK 0#define ACK 1#define STATUS_REG_W 0x06#define STATUS_REG_R 0x07#define MEASURE_TE

2、MP 0x03#define MEASURE_HUMI 0x05#define RESET 0x1eenum TEMP,HUMI; typedef union / 定义共用同类型 unsigned int i;float f; value;/* 位定义*/sbit lcdrs=P2A0;sbit lcdrw=P2A1;sbit lcden=P2A2;sbit SCK = P1A0;sbit DATA = P1A1;/* 变量定义*/uchar table2="SHT11 温湿度检测"uchar table3=uchar table4=uchar table5=IIIIII温

3、度为: "湿度为:"II.uchar wendu6;uchar shidu6;/* 1ms 延时函数*/ void delay(int z) x,y;intfor(x=z;x>0;x-) for(y=125;y>0;y-);/* 50us 延时函数*/void delay_50us(uint t) uint j;for(;t>0;t-)for(j=19;j>0;j-);/* 50ms 延时函数*/void delay_50ms(uint t) uint j;for(;t>0;t-)for(j=6245;j>0;j-); /*12864 液

4、晶写指令*/ void write_12864com(uchar com) lcdrs=0;delay_50us(1);P0=com;lcden=1;delay_50us(10);lcden=0;delay_50us(2);/* 12864 液晶写数据*/void write_dat(uchar dat) lcdrs=1;lcdrw=0;delay_50us(1);P0=dat;lcden=1;delay_50us(10);lcden=0;delay_50us(2);/* 12864 液晶初始化*/void init12864lcd(void) delay_50ms(2);write_1286

5、4com(0x30);delay_50us(4);write_12864com(0x30);delay_50us(4);write_12864com(0x0f);delay_50us(4);write_12864com(0x01);delay_50us(240);write_12864com(0x06);delay_50us(10);write_12864com(0x0c);delay_50us(10); /*12864 液晶显示函数*/void display1(void)uchar i;write_12864com(0x80);for(i=0;i<18;i+)write_dat(ta

6、ble2i);delay_50us(1);/* 12864 液晶显示函数*/void display2(void)uchar i;write_12864com(0x90);for(i=0;i<18;i+)write_dat(table3i);delay_50us(1); /*12864 液晶显示函数*/void display3(void)uchar i;write_12864com(0x88);for(i=0;i<8;i+)write_dat(table4i);delay_50us(1); /*12864 液晶显示函数*/void displaywendu(void) uchar

7、 i;write_12864com(0x94); for(i=0;i<3;i+) write_dat(wendui);delay_50us(1);for(i=0;i<1;i+)write_dat(table5i);delay_50us(1);for(i=4;i<5;i+)write_dat(wendui);delay_50us(1);/* 12864 液晶显示函数*/void displayshidu(void) uchar i;write_12864com(0x8C);for(i=0;i<3;i+)write_dat(shidui);delay_50us(1);for

8、(i=0;i<1;i+)write_dat(table5i);delay_50us(1);for(i=4;i<5;i+)write_dat(shidui);delay_50us(1);/* SHT11 写字节程序*/ char s_write_byte(unsigned char value) unsigned char i,error=0;for (i=0x80;i>0;i>>=1)/ 高位为 1, 循环右移if (i&value) DATA=1; / 与要发送的数相与, 结果为发送的位else DATA=0;SCK=1;_nop_();_nop_();

9、_nop_();/ 延时 3usSCK=0;DATA=1; / 释放数据线SCK=1;error=DATA; / 检查应答信号, 确认通讯正常_nop_();_nop_();_nop_();SCK=0;DATA=1;return error; /error=1 通讯错误/* SHT11 读字节程序*/ char s_read_byte(unsigned char ack) unsigned char i,val=0;DATA=1; / 释放数据线for(i=0x80;i>0;i>>=1)/ 高位为 1, 循环右移SCK=1;if(DATA) val=(val|i);/ 读一位

10、数据线的值SCK=0;DATA=!ack; / 如果就是校验, 读取完后结束通讯;SCK=1;_nop_();_nop_();_nop_();/ 延时 3usSCK=0;_nop_();_nop_();_nop_();DATA=1; / 释放数据线 return val;/* SHT11 启动传输*/void s_transstart(void)DATA=1; SCK=0; / 准备_nop_();SCK=1;_nop_();DATA=0;_nop_();SCK=0;_nop_();_nop_();_nop_();SCK=1;_nop_();DATA=1;_nop_();SCK=0;/*SHT

11、11 连接复位*/void s_connectionreset(void)unsigned char i;DATA=1; SCK=0; / 准备for(i=0;i<9;i+) /DATA保持高,SCK时钟触发9次,发送启动传输,通迅即复位SCK=1;SCK=0;s_transstart(); / 启动传输/* SHT11 温湿度检测char *p_checksum,break;/ 测量温度break;/ 测量湿度*/ char s_measure(unsigned char *p_value, unsigned unsigned charmode)unsigned error=0;uns

12、igned int i;s_transstart(); / 启动传输switch(mode) / 选择发送命令case TEMP : error+=s_write_byte(MEASURE_TEMP); case HUMI : error+=s_write_byte(MEASURE_HUMI); default : break;for (i=0;i<65535;i+) if(DATA=0) break; / 等待测量结束if(DATA) error+=1; / 如果长时间数据线没有拉低, 说明测量错误*(p_value) =s_read_byte(ACK); / 读第一个字节, 高字节

13、(MSB)*(p_value+1)=s_read_byte(ACK); / 读第二个字节, 低字节 (LSB)*p_checksum =s_read_byte(noACK); /read CRC 校验码return error; / error=1 通讯错误/*SHT11 温湿度值标度变换及温度补偿*/void calc_sth10(float *p_humidity ,float *p_temperature)const floatC1=-4、 0; / 12 位湿度精度修正公式const floatC2=+0、 0405; / 12 位湿度精度修正公式const floatC3=-0、 0

14、000028; / 12 位湿度精度修正公式const float T1=+O 01; / 14 位温度精度5V条件修正公式const float T2=+。00008; / 14 位温度精度5V条件修正公式float rh=*p_humidity; / rh: 12 位 湿度float t=*p_temperature; / t: 14 位 温度float rh_lin; / rh_lin:湿度 linear 值float rh_true; / rh_true: 湿度 ture 值float t_C; / t_C : 温度 t_C=t*0 、 01 - 40;/ 补偿温度rh_lin=C3*

15、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; / 返回湿度结果/*主函数*/void main(void) unsignedinttemp,humi;value humi_val,temp_val; / 定义两个共同体, 一

16、个用于湿度, 一个用于温度unsignedcharerror; /用于检验就是否出现错误unsignedcharchecksum;/CRCinit12864lcd();display1();display2();display3();s_connectionreset(); / 启动连接复位while(1)error=0; / 初始化 error=0, 即没有错误error+=s_measure(unsignedchar*)&temp_val 、 i,&checksum,TEMP);/ 温度测量error+=s_measure(unsignedchar*)&humi_v

17、al 、 i,&checksum,HUMI);/ 湿度测量if(error!=0) s_connectionreset();/ 如果发生错误, 系统复位elsehumi_val 、 f=(float)humi_val、i;/转换为浮点数temp_val 、 f=(float)temp_val、i;/转换为浮点数calc_sth10(&humi_val 、 f,&temp_val 、 f);/ 修正相对湿度及温度temp=temp_val 、 f*10;humi=humi_val 、 f*10;wendu0=temp/1000+'0'/ 温度百位wendu1=temp%1000/100+'0'/ 温度十位wendu2=temp%100/10+'0'/ 温度个位wendu3=0x2E; / 小数点wendu4=temp%10+'0'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论