logo资料库

基于51单片机SHT11温湿度传感器检测程序(运用12864液晶显示.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
/**************************************************************************** 科嵌工作室 http://blog.sina.com.cn/u/2152097243 QQ: 591819849 Email: huchengjian2011@sina.cn 基于 51 单片机 SHT11 温湿度传感器检测程序(运用 12864 液晶显示) *****************************************************************************/ #include #include /******************************************************** 宏定义 ********************************************************/ #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_TEMP 0x03 #define MEASURE_HUMI 0x05 #define RESET 0x1e enum {TEMP,HUMI}; typedef union { unsigned int i; float f; } value; //定义共用同类型 /******************************************************** 位定义 ********************************************************/ sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2; sbit SCK = P1^0; sbit DATA = P1^1; /******************************************************** 变量定义
********************************************************/ uchar table2[]="SHT11 温湿度检测"; uchar table3[]="温度为: ℃"; uchar table4[]="湿度为:"; uchar table5[]="."; uchar wendu[6]; uchar shidu[6]; /******************************************************** 1ms 延时函数 ********************************************************/ void delay(int z) { int x,y; for(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 液晶写指令 ********************************************************/ void write_12864com(uchar com) { lcdrs=0;
lcdrw=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_12864com(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(table2[i]); delay_50us(1); } } /******************************************************** 12864 液晶显示函数 ********************************************************/ void display2(void) { uchar i; write_12864com(0x90); for(i=0;i<18;i++) { write_dat(table3[i]); delay_50us(1); } } /******************************************************** 12864 液晶显示函数 ********************************************************/ void display3(void) { uchar i; write_12864com(0x88); for(i=0;i<8;i++) { write_dat(table4[i]); delay_50us(1); } } /******************************************************** 12864 液晶显示函数
********************************************************/ void displaywendu(void) { uchar i; write_12864com(0x94); for(i=0;i<3;i++) { write_dat(wendu[i]); delay_50us(1); } for(i=0;i<1;i++) { write_dat(table5[i]); delay_50us(1); } for(i=4;i<5;i++) { write_dat(wendu[i]); delay_50us(1); } } /******************************************************** 12864 液晶显示函数 ********************************************************/ void displayshidu(void) { uchar i; write_12864com(0x8C); for(i=0;i<3;i++) { write_dat(shidu[i]); delay_50us(1); } for(i=0;i<1;i++) { write_dat(table5[i]); delay_50us(1); } for(i=4;i<5;i++) { write_dat(shidu[i]); delay_50us(1);
} } /******************************************************** SHT11 写字节程序 ********************************************************/ char s_write_byte(unsigned char value) { unsigned char i,error=0; for (i=0x80;i>0;i>>=1) { if (i&value) DATA=1; else DATA=0; SCK=1; _nop_();_nop_();_nop_(); SCK=0; } DATA=1; SCK=1; error=DATA; _nop_();_nop_();_nop_(); SCK=0; DATA=1; return error; } //高位为 1,循环右移 //和要发送的数相与,结果为发送的位 //延时 3us //释放数据线 //检查应答信号,确认通讯正常 //error=1 通讯错误 /******************************************************** SHT11 读字节程序 ********************************************************/ char s_read_byte(unsigned char ack) { unsigned char i,val=0; DATA=1; for(i=0x80;i>0;i>>=1) { SCK=1; if(DATA) val=(val|i); SCK=0; } DATA=!ack; SCK=1; _nop_();_nop_();_nop_(); SCK=0; _nop_();_nop_();_nop_(); //释放数据线 //高位为 1,循环右移 //读一位数据线的值 //如果是校验,读取完后结束通讯; //延时 3us
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; } /******************************************************** SHT11 连接复位 ********************************************************/ void s_connectionreset(void) { unsigned char i; DATA=1; SCK=0; for(i=0;i<9;i++) 通迅即复位 { SCK=1; SCK=0; } s_transstart(); } //准备 //DATA 保持高,SCK 时钟触发 9 次,发送启动传输, //启动传输 /******************************************************** SHT11 温湿度检测 ********************************************************/
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) { unsigned error=0; unsigned int i; s_transstart(); switch(mode) //启动传输 //选择发送命令 { case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //测量温度 case HUMI : error+=s_write_byte(MEASURE_HUMI); break; // 测 量湿度 default : break; } for (i=0;i<65535;i++) if(DATA==0) break; if(DATA) error+=1; 明测量错误 *(p_value) =s_read_byte(ACK); *(p_value+1)=s_read_byte(ACK); *p_checksum =s_read_byte(noACK); return error; //等待测量结束 // 如果长时间数据线没有拉低,说 //读第一个字节,高字节 (MSB) //读第二个字节,低字节 (LSB) //read CRC 校验码 // error=1 通讯错误 } /******************************************************** SHT11 温湿度值标度变换及温度补偿 ********************************************************/ void calc_sth10(float *p_humidity ,float *p_temperature) { const float C1=-4.0; const float C2=+0.0405; const float C3=-0.0000028; const float T1=+0.01; const float T2=+0.00008; // 12 位湿度精度 修正公式 // 12 位湿度精度 修正公式 // 12 位湿度精度 修正公式 // 14 位温度精度 5V 条件 修正公式 // 14 位温度精度 5V 条件 修正公式 float rh=*p_humidity; float t=*p_temperature; float rh_lin; float rh_true; float t_C; 12 位 湿度 // rh: // t: 14 位 温度 // rh_lin: 湿度 linear 值 // rh_true: 湿度 ture 值 // 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; //湿度最大修正 //湿度最小修正 //补偿温度 //相对湿度非线性补偿 //相对湿度对于温度依赖性补偿
分享到:
收藏