|
SHT11是一个一体化的温湿度传感器.
下图是SHT11温度测量的结果:
下图是SHT11湿度测量的结果:
SHT11测温度的程序:
- #include<reg51.h>
- #include<intrins.h>
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit led1=P1^7;
- sbit led2=P1^6;
- sbit DATA=P1^1;
- sbit SCK=P1^0;
- #define noACK 0
- #define ACK 1 //adr command r/w
- #define STATUS_REG_W 0x06 //0000 0110
- #define STATUS_REG_R 0x07 //0000 0111
- #define MEASURE_TEMP 0x03 //0000 0011
- #define MEASURE_HUMI 0x05 //0000 0101
- #define RESET 0x1e //0001 1110
- sbit dula=P2^6;
- sbit wela=P2^7;
- uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar code table_dian[]={ 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd,0x87, 0xff,0xef,0xf7,0xfc,0xb9,0xd1,0xf9,0xf1};
- uchar error=0;
- void delayms(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for( j=110;j>0;j--);
- }
-
- //启动时序
- void transstart()
- {
- SCK=1;
- _nop_();
- DATA=0;
- _nop_();
- SCK=0;
- _nop_();
- _nop_();
- _nop_();
- SCK=1;
- _nop_();
- DATA=1;
- _nop_();
- SCK=0;
- }
- //写入命令子函数
- uchar write_byte(uchar value)
- {
- uchar i;
- for(i=0x80;i>0;i=i/2)
- {
- if(i&value) DATA=1;
- else DATA=0;
- SCK=1;
- _nop_();
- _nop_();
- _nop_();
- SCK=0;
- }
- DATA=1;
- SCK=1;
- error=DATA;
- SCK=0;
- return error;
- }
- //从传感器读数据
- uchar read_byte(bit ack)
- {
- uchar i,val=0;
- DATA=1;
- for(i=0x80;i>0;i=i/2)
- {
- SCK=1;
- if(DATA) val=val|i;
- SCK=0;
- }
- DATA=!ack;
- SCK=1;
- _nop_();
- _nop_();
- _nop_();
- SCK=0;
- DATA=1;
- return val;
- }
- //
- void connectionreset()
- {
- uchar i;
- DATA=1;
- SCK=0;
- for(i=0;i<9;i++)
- {
- SCK=1;
- SCK=0;
- }
- transstart();
- }
- //测量函数,温度和湿度
- uint measure()
- {
- uchar value_1,value_2;
- uint tempvalue;
- transstart();
- error+=write_byte(MEASURE_TEMP);
- if(error!=0) connectionreset();
- else
- {
- while(DATA==1)
- _nop_();
- if(DATA==0)
- {
- value_1=read_byte(ACK);
- value_2=read_byte(noACK);
- tempvalue=value_2+value_1*256;
- }
- //转换成 16 位的 int 型
- else error=1;
- }
- return tempvalue;
- }
- //数码管显示函数
- void display(float dis_value)
- {
- float value;
- int qian,bai,shi,ge;
- value=dis_value*100;
- qian=(int)value/1000;
- bai=(int)value%1000/100;
- shi=(int)value%100/10;
- ge=(int)value%10;
-
- dula=1;
- P0=table[qian];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xfe;
- wela=0;
- delayms(3);
- dula=1;
- P0=table_dian[bai];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xfd;
- wela=0;
- delayms(3);
- dula=1;
- P0=table[shi];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xfb;
- wela=0;
- delayms(3);
- dula=1;
- P0=table[ge];
- dula=0;
- P0=0xff;
- wela=1;
- P0=0xf7;
- wela=0;
- delayms(3);
- wela=1;
- P0=0xff;
- wela=0;
- }
- //计算温度值子函数
- float calc_temp(uint tempvalue)
- {
- uchar i;
- const float d1=-39.9;
- const float d2=+0.01;
- float temp_final;
- tempvalue=tempvalue&0x3fff; //取出低 14 位
- temp_final=d1+d2*((float)tempvalue);
- for(i=100;i>0;i--)
- display(temp_final);
- return temp_final;
- }
- //主函数
- void main()
- {
- float dis_tempvalue;
- uint tempvalue;
- while(1)
- {
- connectionreset();
- error=0;
- tempvalue=measure();
- if(error==0)
- {
- led1=0;
- delayms(200);
- led1=1;
- delayms(200);
- dis_tempvalue=calc_temp(tempvalue);
- }
- else
- {
- continue;
- }
- }
- }
复制代码
下载:
测湿度.rar
(21.71 KB, 下载次数: 52)
测温度.rar
(20.34 KB, 下载次数: 29)
|
|