1.jpg (54.97 KB, 下載次數(shù): 99)
下載附件
2021-10-12 04:41 上傳
2.jpg (55.63 KB, 下載次數(shù): 91)
下載附件
2021-10-12 04:41 上傳
本設(shè)計中設(shè)定報警上限溫度30℃,報警下限溫度20℃。圖中分別是溫度超過30℃和低于20℃時LED燈模擬制冷和制熱系統(tǒng)開啟,并且蜂鳴器報警。
附錄2:單片機程序
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit d1=P2^2;sbit d2=P2^1;sbit d3=P2^0;sbit d4=P2^3;sbit key1=P1^3;sbit key2=P1^4;sbit key3=P1^5;sbit led1=P1^0;sbit led2=P1^1;sbit baojing=P1^6;sbit DS=P1^2;sbit ACC_7=ACC^7;uint count=300,alarm=200; //最初溫度上下限值:30度、20度uchar shu;uchar shi,fen,ri,yue,nian,xq,miao,ss; uint temp; // 定義溫度變量uchar flag;uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽數(shù)碼管不帶小數(shù)點的0~9編碼uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //帶小數(shù)點的0~9編碼void send_int(void){ TMOD = 0x21; // 定時器1工作于8位自動重載模式, 用于產(chǎn)生波特率 TH1 = 0xfd; // 波特率9600 TL1 = 0xfd; TH0=0xD8; //定時器0定時10ms TL0=0xF0; ET0=1; //允許定時器0中斷 ES=1; //允許串口中斷 EA=1; //開中斷SCON = 0xd8; // 設(shè)定串行口工作方式 PCON = 0x00; // 波特率不倍增} void delay(uint z){ uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--);}void dsreset() //復(fù)位{ uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--;}uchar tmpread() //讀取一字節(jié){ uchar j,k,dat; uint i; for(j=1;j<=8;j++) { DS=0;i++; //延時 DS=1;i++;i++; k=DS; i=8;while(i>0)i--; dat=(k<<7)|(dat>>1);//讀出的數(shù)據(jù)最低位在最前面存一個字節(jié)在DAT里 } return(dat);}void tmpwritebyte(uchar dat) //寫一個字節(jié){ uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //寫 1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //寫 0 i=8;while(i>0)i--; DS=1; i++;i++; } }}void tmpchange() //DS18B20溫度變換{ dsreset(); delay(1); tmpwritebyte(0xcc); //跳過讀取內(nèi)存rom tmpwritebyte(0x44); //開始轉(zhuǎn)換}uint tmp() //讀取溫度{ float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); //a為低字節(jié)8位 b=tmpread(); //b為高字節(jié)8位 temp=b; //temp為溫度值UINT 16bit temp<<=8; //兩個字節(jié)組合到一起 temp=temp|a; if(b>127) { flag=1; ss=flag; temp=~temp+1; } tt=temp*0.0625; // temp/16 則是溫度的真實值tt.7位整數(shù),4位小數(shù) temp=tt*10+0.5; // 擴大十倍取出了第一位小數(shù) return(temp);} /*****溫度顯示********/void displayTemp(uint temp) { uchar ge,shi,bai,qian,ser; d1=0; d1=0; d3=0; d4=0; dsreset(); ser=temp/10; //分離出三位要顯示的數(shù)字 SBUF=ser; qian=temp/1000; bai=temp/100%10; // 百位數(shù)字 shi=temp/10%10; // 十位數(shù)字 ge=temp%10; // 個位數(shù)字 if(flag==1) { flag=0; P0=0xbf; d1=1; delay(2); d1=0; } if(qian!=0) { P0=tab[qian]; d1=1; delay(2); d1=0; } else { P0=0xff; d1=1; delay(2); d1=0; } if(temp>99) { P0=tab[bai]; d2=1; delay(2); d2=0; } P0=tab1[shi]; d3=1; delay(2); d3=0; P0=tab[ge]; d4=1; delay(2); d4=0;} /****按鍵控制******/uint keyscan(){ if(key1==0) //按鍵1 { delay(5); if(key1==0) { while(!key1); shu++; //按鍵1數(shù)按下次數(shù) } } if(key2==0) //按鍵2 { delay(5); if(key2==0) { while(!key2); count=count+10; //溫度上限值加1 if(shu==2) //按鍵1按下2次 { alarm+=10; //溫度下限值加1 } } } if(key3==0) //按鍵3 { delay(5); if(key3==0) { while(!key3); count=count-10; //溫度上限值減1 if(shu==2) //按鍵1按下2下 { alarm-=10; //溫度下限值減1 } } } return(count);} /*****報警控制******/void main(){ led1=1; led2=1; delay(10); while( 1 ) { tmpchange(); if(shu==0) { displayTemp(tmp( )); } keyscan(); if(shu==1) { displayTemp(count); } if(shu==2) { displayTemp(alarm); } if(shu==3) { shu=0; } if(temp>count) { led1=0;baojing=0; } else if(temp<alarm) { led2=0;baojing=0; } else { led1=1; led2=1; baojing=1; } }}
|