|
SHT11是一個一體化的溫濕度傳感器.
下圖是SHT11溫度測量的結果:
204847baeod4xxoz300o8q.jpg.thumb.jpg (50.66 KB, 下載次數: 62)
下載附件
2017-3-5 23:50 上傳
下圖是SHT11濕度測量的結果:
2048457717r5i45rhiyfj3.jpg.thumb.jpg (44.26 KB, 下載次數: 45)
下載附件
2017-3-5 23:50 上傳
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;
- }
- }
- }
復制代碼
0.png (66.85 KB, 下載次數: 50)
下載附件
2017-3-5 23:50 上傳
下載:
測濕度.rar
(21.71 KB, 下載次數: 52)
2017-3-5 23:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
測溫度.rar
(20.34 KB, 下載次數: 29)
2017-3-5 23:52 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|