基于51單片機 sht11傳感器
#include<reg52.h> //包含單片機寄存器的頭文件 #define uchar unsigned char #define uint unsigned int sbit P10=P1^0; sbit ADD=P1^1; sbit SUB=P1^2; sbit P13=P1^3; uint ya,temp,num=0,aa,th=180,tl=90;
//uchar aa,th=200,tl=100; unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit CS=P2^3; //將CS位定義為P3.4引腳 sbit CLK=P2^4; //將CLK位定義為P1.0引腳 sbit DIO=P2^5; //將DIO位定義為P1.1引腳 void delay(uint z); void display(uint a); void displayth(uint b); void displaytl(uint c); void init() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void key() { if(P10==0) { delay(5); if(P10==0) { num++; if(num==3) { num=0; } } while(!P10) display(temp); delay(5); while(!P10) display(temp); } if(num!=0) { if(ADD==0) { delay(5); if(ADD==0) { if(num==1) { th++; if(th==250) th=tl+10; } if(num==2) { if(tl<(th-10)) tl++; Else
tl=90; } } while(!ADD) display(th);
} if(SUB==0) { delay(5); if(SUB==0) { if(num==1) { th--; if(th==(tl+10)) th=250; } if(num==2) { tl--; if(tl==90) tl=th-10; } } while(!SUB) display(tl); } } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uint a) {
P2=0xfe; P0=table[a/100]; delay(5);
P2=0xfd; P0=table[a%100/10]; delay(5);
P2=0xfb; P0=table[a%100%10]; delay(5); } void displayth(uint b) {
P2=0xfe; P0=table[b/100];
delay(5); P2=0xfb; P0=table[c/100]; delay(5); } void display(uint c) {
P2=0xfd; P0=table[c%100/10]; delay(5); P2=0xfb; P0=table[c%100%10]; delay(5); } unsigned char A_D() {
unsigned char i,dat; CS=1; //一個轉換周期開始 CLK=0; //為第一個脈沖作準備 CS=0; //CS置0,片選有效 DIO=1; //DIO置1,規定的起始信號 CLK=1; //第一個脈沖 CLK=0; //第一個脈沖的下降沿,此前DIO必須是高電平 DIO=1; //DIO置1, 通道選擇信號 CLK=1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0 CLK=0; //第二個脈沖下降沿 DIO=0; //DI置0,選擇通道0 CLK=1; //第三個脈沖 CLK=0; //第三個脈沖下降沿 DIO=1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1 CLK=1; //第四個脈沖 for(i=0;i<8;i++) //高位在前 { CLK=1; //第四個脈沖 CLK=0; dat<<=1; //將下面儲存的低位數據向右移 dat|=(unsigned char)DIO; //將輸出數據DIO通過或運算儲存在dat最低位 }
CS=1; //片選無效 return dat; //將讀書的數據返回 }
/***************************************************** 函數功能:主函數 ***************************************************/ main(void) { init(); while(1) { key(); if((temp<tl)||(temp>th)) P13=0; else P13=1; if(num==0) { display(temp); } if(num==1) { displayth(th); } if(num==2) { displaytl(tl); } } } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256 aa++; if(aa==20) { ya=A_D(); temp=(ya*100/51);//((ya*5)*100/255); aa=0; }
|