基于51單片機數(shù)字溫度計設(shè)計_第1頁
基于51單片機數(shù)字溫度計設(shè)計_第2頁
基于51單片機數(shù)字溫度計設(shè)計_第3頁
基于51單片機數(shù)字溫度計設(shè)計_第4頁
基于51單片機數(shù)字溫度計設(shè)計_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

課題:基于51單片機數(shù)字溫度計設(shè)計專業(yè):電子信息工程班級:(1)班學(xué)號:姓名:峰指導(dǎo)教師:周冬芹設(shè)計日期:成績:重慶大學(xué)城市科技學(xué)院電氣學(xué)院基于51單片機一、設(shè)計目的1、掌握單片機電路的設(shè)計原理、組裝與調(diào)試方法。2、掌握LED數(shù)碼顯示電路的設(shè)計和使用方法。3、掌握DS18B20溫度傳感器的工作原理及使用方法。二、設(shè)計要求1、本次單片機課程設(shè)計要求以51系列單片機為核心,以開發(fā)板為平臺。2、設(shè)計一個數(shù)字式溫度計,要求使用DS18B20溫度傳感器測量溫度。3、經(jīng)單片機處理后,要求用4位一體共陰LED數(shù)碼管來設(shè)計顯示電路,以顯示測量的溫度值。4、另外還要求在設(shè)計中加入報警系統(tǒng),如果我們所設(shè)計的系統(tǒng)用來監(jiān)控某一設(shè)備,當(dāng)設(shè)備的溫度超過或低于我們所設(shè)定的溫度值時,系統(tǒng)會產(chǎn)生報警。5、要求在設(shè)計中加入上下限警報溫度設(shè)置電路。設(shè)計的具體實現(xiàn)1數(shù)字溫度計設(shè)計的方案在做數(shù)字溫度計的單片機電路中,對信號的采集電路大多都是使用傳感器,這是非常容易實現(xiàn)的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,就可以滿足設(shè)計要求。采集之后,通過使用51系列的單片機,可以對數(shù)據(jù)進(jìn)行相應(yīng)的處理,再由LED顯示電路對其數(shù)據(jù)進(jìn)行顯示。2系統(tǒng)設(shè)計框圖溫度計電路設(shè)計總體設(shè)計方框圖如下圖所示,控制器采用單片機AT89C51,溫度傳感器采用DS18B20,用4位一體共陰LED數(shù)碼管以串口傳送數(shù)據(jù)實現(xiàn)溫度顯示。此外,還添加了報警系統(tǒng),對溫度實施監(jiān)控。3主控器AT89C51芯片對于單片機的選擇,可以考慮使用8031與8051系列,由于8031沒有內(nèi)部RAM,系統(tǒng)又需要大量內(nèi)存存儲數(shù)據(jù),因而不適用。AT89C51以低價位單片機可為提供許多高性價比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域,對于簡單的測溫系統(tǒng)已經(jīng)足夠。單片機AT89C51具有低電壓供電和體積小等特點,四個端口只需要兩個口就能滿足電路系統(tǒng)的設(shè)計需要該器件是INTEL公司生產(chǎn)的MCS一5l系列單片機中的基礎(chǔ)產(chǎn)品,采用了可靠的CMOS工藝制造技術(shù),具有高性能的8位單片機,屬于標(biāo)準(zhǔn)的MCS—51的CMOS產(chǎn)品。AT8951的管腳如下圖所示:AT89C51芯片管腳圖4時鐘電路 80C51時鐘有兩種方式產(chǎn)生,即內(nèi)部方式和外部方式。80C51中有一個構(gòu)成內(nèi)部震蕩器的高增益反向放大器,引腳XTAL1和XTAL2分別是該放大器的輸入端和輸出端。本次采用內(nèi)部震蕩電路,瓷片電容采用22PF,晶振為12MHZ。晶體震蕩電路圖5復(fù)位電路 單片機系統(tǒng)的復(fù)位電路在這里采用的是上電+按鈕復(fù)位電路形式,其中電阻R采用10KΩ的阻值,電容采用10μF的電容值。復(fù)位電路6溫度傳感電路DALLAS最新單線數(shù)字溫度傳感器DS18B20是一種新型的“一線器件”,其體積更小、更適用于多種場合、且適用電壓更寬、更經(jīng)濟。DALLAS半導(dǎo)體公司的數(shù)字化溫度傳感器DS18B20是世界上第一片支持“一線總線”接口的溫度傳感器。溫度測量范圍為-55~+125攝氏度,可編程為9位~12位轉(zhuǎn)換精度,測溫分辨率可達(dá)0.0625攝氏度,分辨率設(shè)定參數(shù)以及用戶設(shè)定的報警溫度存儲在EEPROM中,掉電后依然保存。被測溫度用符號擴展的16位數(shù)字量方式串行輸出。DS18B20內(nèi)部結(jié)構(gòu)主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。DS18B20的管腳排列、各種封裝形式,DQ為數(shù)據(jù)輸入/輸出引腳。開漏單總線接口引腳。當(dāng)被用著在寄生電源下,也可以向器件提供電源;GND為地信號;VDD為可選擇的VDD引腳。當(dāng)工作于寄生電源時,此引腳必須接地,如下圖所示。DS18B20管腳圖7顯示電路對于數(shù)字溫度的顯示,我們采用4位一體共陰LED數(shù)碼管。足夠顯示0~100中各位數(shù),并且還能顯示一位小數(shù)部分。4位LED數(shù)碼顯示管8溫度報警電路對于數(shù)字溫度計的設(shè)計,除了溫度的數(shù)字顯示功能外還加入了報警系統(tǒng),當(dāng)測量的溫度超過或低于我們所設(shè)定的溫度值時,系統(tǒng)會產(chǎn)生報警并亮紅燈報警。其電路圖如下所示。蜂鳴器紅燈報警系統(tǒng)電路圖源程序:/*********************************************************************程序名;基于51單片機的溫度計*功能:實時測量溫度,超過上下限報警,報警溫度可手動調(diào)整。K1是用來*進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限*調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動*退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動退出;按一下K4消除*按鍵音,再按一下啟動按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實現(xiàn)加1功能,*K1是實現(xiàn)減1功能,K3是用來設(shè)定上下限溫度正負(fù)的。 *********************************************************************/#include<reg52.h> #include<intrins.h>//將intrins.h頭文件包含到主程序(調(diào)用其中的_nop_()空操作函數(shù)延時)#defineuintunsignedint #defineucharunsignedchar ucharmax=0x00,min=0x00; //max是上限報警溫度,min是下限報警溫度bits=0; //s是調(diào)整上下限溫度時溫度閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右bits1=0; //s1標(biāo)志位用于上下限查看時的顯示voiddisplay1(uintz); #include"ds18b20.h" #include"keyscan.h" #include"display.h" /******************************************************//* 主函數(shù) //*****************************************************/voidmain(){ beer=1; //關(guān)閉蜂鳴器 led=1; //關(guān)閉LED燈 timer1_init(0); //初始化定時器1(未啟動定時器1) get_temperature(1); //首次啟動DS18B20獲取溫度(DS18B20上電后自動將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器) while(1) { keyscan(); get_temperature(0); display(temp,temp_d*0.625); alarm(); }}/***********************************************************************程序名;ds18b20數(shù)碼管動態(tài)顯示頭文件*功能:通過定時器0延時是數(shù)碼管動態(tài)顯示**********************************************************************/#ifndef__ds18b20_display_H__ #define__ds18b20_display_H__#defineuintunsignedint //變量類型宏定義,用uint表示無符號整形(16位)#defineucharunsignedchar //變量類型宏定義,用uchar表示無符號字符型(8位)sbitwei1=P2^4; //可位尋址變量定義,用wei1表示P2.4口sbitwei2=P2^5; //用wei2表示P2.5口sbitwei3=P2^6; //用wei3表示P2.6口sbitwei4=P2^7; //用wei4表示P2.7口ucharnum=0; //定義num為全局無符號字符型變量,賦初值為‘0’ucharcodetemperature1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //定義顯示碼表0~9ucharcodetemperature2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //帶小數(shù)點的0~9.ucharcodetemperature3[]={0x00,0x80,0x40,0x76,0x38};//依次是‘不顯示’‘.’‘-’‘H’‘L’/******************************************************//延時子函數(shù) //*****************************************************/voiddisplay_delay(uintt) //延時1ms左右{ uinti,j; for(i=t;i>0;i--) for(j=120;j>0;j--);}/******************************************************//* 定時器1初始化函數(shù) //*****************************************************/voidtimer1_init(bitt){TMOD=0x10; TH0=0x3c; TL0=0xb0; EA=1; ET1=1; TR1=t; //局部變量t為1啟動定時器1,為0關(guān)閉定時器1}/******************************************************//* 定時器1中斷函數(shù) //*****************************************************/voidtimer1()interrupt3{TH0=0x3c; //重新賦初值,定時50msTL0=0xb0; num++; //每進(jìn)入一次定時器中斷num加1(每50ms加1一次)if(num<5) {s=1;if(w==1){beer=1;led=1;}else{beer=1;led=1;}} else//進(jìn)入4次中斷,定時200ms時若報警標(biāo)志位w為‘1’則啟動報警,不為‘1’不啟動//實現(xiàn)間歇性報警功能 {s=0;if(w==1){beer=0;led=0;}else{beer=1;led=1;}} if(num>20) //進(jìn)入20次中斷,定時1s{ num=0; //num歸0,重新定開始定時1s s1=0; //定時1s時間到時自動關(guān)閉報警上下限顯示功能 v1=1; //定時1s時間到時自動關(guān)閉報警上下限查看功能} }/******************************************************//* 調(diào)整報警上下限選擇函數(shù) //*****************************************************/voidselsct_1(ucharf,uchark) //消除百位的0顯示,及正負(fù)溫度的顯示選擇{if(f==0) //若為正溫度,百位為0則不顯示百位,不為0則顯示 { if(k/100==0)P0=temperature3[0]; elseP0=temperature1[k/100]; } if(f==1) //若為負(fù)溫度,若十位為0,百位不顯示,否則百位顯示‘-’ { if(k%100/10==0)P0=temperature3[0]; elseP0=temperature3[2]; }}voidselsct_2(bitf,uchark) //消除十位的0顯示,及正負(fù)溫度的顯示選擇{if(f==0) //若為正溫度,百位十位均為0則不顯示十位,否則顯示十位 { if((k/100==0)&&(k%100/10==0)) P0=temperature3[0]; elseP0=temperature1[k%100/10]; } if(f==1) //若為負(fù)溫度,若十位為0,十位不顯示,否則十位顯示‘-’ { if(k%100/10==0)P0=temperature3[2]; elseP0=temperature1[k%100/10]; } }/******************************************************//* 主函數(shù)顯示 //*****************************************************/voiddisplay(uchart,uchart_d) //用于實測溫度、上限溫度的顯示{uchari;for(i=0;i<4;i++) //依次從左至右選通數(shù)碼管顯示,實現(xiàn)動態(tài)顯示{ switch(i) { case0: //選通第一個數(shù)碼管 wei2=1; //關(guān)第二個數(shù)碼管 wei3=1; //關(guān)第三個數(shù)碼管 wei4=1; //關(guān)第四個數(shù)碼管 wei1=0; //開第一個數(shù)碼管 if(a==0){selsct_1(f,t);}//若a=0則在第一個數(shù)碼管上顯示測量溫度的百位或‘-’ if(a==1) { P0=temperature3[3];//若a=1則在第一個數(shù)碼管上顯示‘H’ } if(a==2) { P0=temperature3[4];//若a=2則在第一個數(shù)碼管上顯示‘L’ } break; case1: //選通第二個數(shù)碼管 wei1=1; wei3=1; wei4=1; wei2=0; if(a==0){selsct_2(f,t);}//若a=0則在第二個數(shù)碼管上顯示測量溫度的十位或‘-’ if(a==1) //若a=1則在第二個數(shù)碼管上顯示上限報警溫度的百位或‘-’ { if(s==0)selsct_1(f_max,max);//若s=0則顯示第二個數(shù)碼管,否則不顯示 elseP0=temperature3[0]; //通過s標(biāo)志位的變化實現(xiàn)調(diào)節(jié)上下限報警溫度時數(shù)碼管的閃爍 if(s1==1)selsct_1(f_max,max);//若s1=1則顯示第二個數(shù)碼管(s1標(biāo)志位用于上下限查看時的顯示) } if(a==2)//若a=2則在第二個數(shù)碼管上顯示下限報警溫度的百位或‘-’ { if(s==0)selsct_1(f_min,min); elseP0=temperature3[0]; if(s1==1)selsct_1(f_min,min); } break; case2: //選通第三個數(shù)碼管 wei1=1; wei2=1; wei4=1; wei3=0; if(a==0){P0=temperature2[t%10];}//若a=0則在第三個數(shù)碼管上顯示測量溫度的個位 if(a==1) //若a=1則在第三個數(shù)碼管上顯示上限報警溫度的十位或‘-’ { if(s==0)selsct_2(f_max,max);//若s=0則顯示第三個數(shù)碼管,否則不顯示 elseP0=temperature3[0]; if(s1==1)selsct_2(f_max,max);//若s1=1則顯示第三個數(shù)碼管 } if(a==2) //若a=2則在第三個數(shù)碼管上顯示下限報警溫度的十位或‘-’ { if(s==0)selsct_2(f_min,min); elseP0=temperature3[0]; if(s1==1)selsct_2(f_min,min); } break; case3: //選通第四個數(shù)碼管 wei1=1; wei2=1; wei3=1; wei4=0; if(a==0){P0=temperature1[t_d];}//若a=0則在第四個數(shù)碼管上顯示測量溫度的小數(shù)位 if(a==1)//若a=1則在第四個數(shù)碼管上顯示上限報警溫度的個位 { if(s==0)P0=temperature1[max%10];//若s=0則顯示第四個數(shù)碼管,否則不顯示 elseP0=temperature3[0]; if(s1==1)P0=temperature1[max%10];//若s1=1則顯示第四個數(shù)碼管 } if(a==2) //若a=2則在第四個數(shù)碼管上顯示下限報警溫度的個位 { if(s==0)P0=temperature1[min%10]; elseP0=temperature3[0]; if(s1==1)P0=temperature1[min%10]; } break; } display_delay(10); //每個數(shù)碼管顯示3ms左右 } }/******************************************************//* 開機顯示函數(shù) //*****************************************************/voiddisplay1(uintz) //用于開機動畫的顯示{uchari,j;bitf=0;for(i=0;i<z;i++) //‘z’是顯示遍數(shù)的設(shè)定{ for(j=0;j<4;j++) //依次從左至右顯示‘-’ { switch(j) { case0: wei2=1; wei3=1; wei4=1; wei1=0;break; P0=temperature3[2];//第一個數(shù)碼管顯示 case1: wei1=1; wei3=1; wei4=1; wei2=0;break; P0=temperature3[2];//第二個數(shù)碼管顯示case2: wei1=1; wei2=1; wei4=1; wei3=0;break; P0=temperature3[2];//第三個數(shù)碼管顯示 case3: wei1=1; wei2=1; wei3=1; wei4=0;break; P0=temperature3[2];//第四個數(shù)碼管顯示 } display_delay(400); //每個數(shù)碼管顯示200ms左右 } }}#endif/*********************************************************************程序名;DS18B20頭文件*說明:用到的全局變量是:無符號字符型變量temp(測得的溫度整數(shù)部分),temp_d*(測得的溫度小數(shù)部分),標(biāo)志位f(測量溫度的標(biāo)志位‘0’表示“正溫度”‘1’表*示“負(fù)溫度”),標(biāo)志位f_max(上限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表*示“負(fù)溫度”),標(biāo)志位f_min(下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表*示“負(fù)溫度”),標(biāo)志位w(報警標(biāo)志位‘1’啟動報警‘0’關(guān)閉報警)。 *********************************************************************/#ifndef__ds18b20_h__ //定義頭文件#define__ds18b20_h__#defineuintunsignedint #defineucharunsignedchar sbitDQ=P2^3; //DS18B20接口sbitbeer=P1^0; //用beer表示P1.0sbitled=P1^1; //用led表示P1.1uchartemp=0; //測量溫度的整數(shù)部分uchartemp_d=0; //測量溫度的小數(shù)部分bitf=0; //測量溫度的標(biāo)志位,0’表示“正溫度”‘1’表示“負(fù)溫度”)bitf_max=0; //上限溫度的標(biāo)志位‘0’表示“正溫度”‘1’表示“負(fù)溫度”)bitf_min=0; //下限溫度的標(biāo)志位‘0’表示“正溫度”、‘1’表示“負(fù)溫度”)bitw=0; //報警標(biāo)志位‘1’啟動報警‘0’關(guān)閉報警/******************************************************//* 延時子函數(shù) //*****************************************************/voidds18b20_delayus(uintt)//延時幾μs{while(t--);}voidds18b20_delayms(uintt) //延時1ms左右{ uinti,j; for(i=t;i>0;i--) for(j=120;j>0;j--);}/******************************************************//* DS18B20初始化函數(shù) //*****************************************************/voidds18b20_init() { ucharc=0; DQ=1; DQ=0; //控制器向DS18B20發(fā)低電平脈沖 ds18b20_delayus(80); //延時15-80μs DQ=1; //控制器拉高總線, while(DQ); //等待DS18B20拉低總線,在60-240μs之間 ds18b20_delayus(150); //延時,等待上拉電阻拉高總線 DQ=1; //拉高數(shù)據(jù)線,準(zhǔn)備數(shù)據(jù)傳輸;}/******************************************************//* DS18B20字節(jié)讀函數(shù) //*****************************************************/uchards18b20_read() { uchari; uchard=0; DQ=1; //準(zhǔn)備讀; for(i=8;i>0;i--) { d>>=1; //低位先發(fā); DQ=0; _nop_(); _nop_(); DQ=1; //必須寫1,否則讀出來的將是不預(yù)期的數(shù)據(jù); if(DQ) //在12us處讀取數(shù)據(jù); d|=0x80; ds18b20_delayus(10); } returnd; //返回讀取的值}/******************************************************//* DS18B20字節(jié)寫函數(shù) //*****************************************************/voidds18b20_write(uchard) {uchari;for(i=8;i>0;i--){ DQ=0; DQ=d&0x01; ds18b20_delayus(5); DQ=1; d>>=1;}}/******************************************************//* 獲取溫度函數(shù) //*****************************************************/voidget_temperature(bitflag) { uchara=0,b=0,c=0,d=0;uinti; ds18b20_init(); ds18b20_write(0xcc); //向DS18B20發(fā)跳過讀ROM命令 ds18b20_write(0x44); //寫啟動DS18B20進(jìn)行溫度轉(zhuǎn)換命令,轉(zhuǎn)換結(jié)果存入內(nèi)部RAM if(flag==1) { display1(1); //用開機動畫耗時 } else ds18b20_delayms(1); ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0xbe); a=ds18b20_read(); //讀內(nèi)部RAM(LSB) b=ds18b20_read(); //讀內(nèi)部RAM(MSB) if(flag==1) //局部位變量f=1時讀上下線報警溫度 { max=ds18b20_read(); //讀內(nèi)部RAM(TH) min=ds18b20_read(); //讀內(nèi)部RAM(Tl) } if((max&0x80)==0x80) //若讀取的上限溫度的最高位(符號位)為‘1’表明是負(fù)溫度 {f_max=1;max=(max-0x80);}//將上限溫度符號標(biāo)志位置‘1’表示負(fù)溫度,將上限溫度裝換成無符號數(shù)。 if((min&0x80)==0x80)//若讀取的下限溫度的最高位(符號位)為‘1’表明是負(fù)溫度 {f_min=1;min=(min-0x80);}//將下限溫度符號標(biāo)志位置‘1’表示負(fù)溫度,將下限溫度裝換成無符號數(shù)。 i=b; i>>=4; if(i==0) {f=0; //i為0,正溫度,設(shè)立正溫度標(biāo)記temp=((a>>4)|(b<<4)); //整數(shù)部分 a=(a&0x0f); temp_d=a; //小數(shù)部分 } else { f=1; //i為1,負(fù)溫度,設(shè)立負(fù)溫度標(biāo)記 a=~a+1; b=~b; temp=((a>>4)|(b<<4)); //整數(shù)部分 a=(a&0x0f); //小數(shù)部分 temp_d=a; }}/******************************************************//* 存儲極限溫度函數(shù) //*****************************************************/voidstore_t(){ if(f_max==1) //若上限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號數(shù) max=max+0x80; if(f_min==1) //若下限溫度為負(fù),將上限溫度轉(zhuǎn)換成有符號數(shù) min=min+0x80;ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x4e); //向DS18B20發(fā)寫字節(jié)至?xí)捍嫫?和3(TH和TL)命令 ds18b20_write(max); //向暫存器TH(上限溫度暫存器)寫溫度 ds18b20_write(min); //向暫存器TL(下限溫度暫存器)寫溫度 ds18b20_write(0xff); //向配置寄存器寫命令,進(jìn)行溫度值分辨率設(shè)置 ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x48); //向DS18B20發(fā)將RAM中2、3字節(jié)的內(nèi)容寫入EEPROM} //DS18B20上電后會自動將EEPROM中的上下限溫度拷貝到TH、TL暫存器/******************************************************//* 溫度超限報警函數(shù) //*****************************************************/voidalarm(){ //若上限值是正值 if(f_max==0) { if(f_min==0) //若下限值是正值 { if(f==0) //若測量值是正值 { if(temp<=min||temp>=max) {w=1;TR1=1;} //當(dāng)測量值小于最小值或大于最大值時報警 if((temp<max)&&(temp>min)) {w=0;} //當(dāng)測量值大于最小值且小于最大值時不報警 } if(f==1){w=1;TR1=1;} //若測量值是負(fù)值時報警 } if(f_min==1) //若下限值是負(fù)值 { if(f==0) //若測量值是正值 { if(temp>=max)//當(dāng)測量值大于最大值時報警 {w=1;TR1=1;} if(temp<max)//當(dāng)測量值小于最大值時不報警 {w=0;} } if(f==1) //若測量值是負(fù)值 { if(temp>=min)//當(dāng)測量值大于最小值時報警 {w=1;TR1=1;} if(temp<min)//當(dāng)測量值小于最小值時不報警 {w=0;} } } } if(f_max==1) //若下限值是負(fù)值 { if(f_min==1) //若下限值是負(fù)值 { if(f==1) //若測量值是負(fù)值 { if((temp<=max)||(temp>=min)) {w=1;TR1=1;} //當(dāng)測量值小于最大值或大于最小值時報警 if((temp<min)&&(temp>max)) {w=0;} //當(dāng)測量值小于最小值且大于最大值時不報警 } if(f==0){w=1;TR1=1;} //若測量值是正值時報警 } } }#endif/*********************************************************************程序名;基于51單片機的溫度計*功能:實時測量溫度,超過上下限報警,報警溫度可手動調(diào)整。K1是用來*進(jìn)入上下限調(diào)節(jié)模式的,當(dāng)按一下K1進(jìn)入上限調(diào)節(jié)模式,再按一下進(jìn)入下限*調(diào)節(jié)模式。在正常模式下,按一下K2進(jìn)入查看上限溫度模式,顯示1s左右自動*退出;按一下K3進(jìn)入查看下限溫度模式,顯示1s左右自動退出;按一下K4消除*按鍵音,再按一下啟動按鍵音。在調(diào)節(jié)上下限溫度模式下,K2是實現(xiàn)加1功能,*K1是實現(xiàn)減1功能,K3是用來設(shè)定上下限溫度正負(fù)的。*********************************************************************/#include<reg52.h>#include<intrins.h>//將intrins.h頭文件包含到主程序(調(diào)用其中的_nop_()空操作函數(shù)延時)#defineuintunsignedint#defineucharunsignedcharucharmax=0x00,min=0x00;//max是上限報警溫度,min是下限報警溫度bits=0;//s是調(diào)整上下限溫度時溫度閃爍的標(biāo)志位,s=0不顯示200ms,s=1顯示1s左右bits1=0;//s1標(biāo)志位用于上下限查看時的顯示voiddisplay1(uintz);//聲明display1()函數(shù)(display.h頭文件中的函數(shù),ds18b20.h要用應(yīng)先聲明)#include"ds18b20.h"#include"keyscan.h"#include"display.h"/******************************************************//*主函數(shù)//*****************************************************/voidmain(){beer=1;//關(guān)閉蜂鳴器led=1;//關(guān)閉LED燈timer1_init(0);//初始化定時器1(未啟動定時器1)get_temperature(1);//首次啟動DS18B20獲取溫度(DS18B20上電后自動將EEPROM中的上下限溫度復(fù)制到TH和TL寄存器)while(1){keyscan();get_temperature(0);display(temp,temp_d*0.625);alarm();}}/***********************************************************************程序名;ds18b20keyscan函數(shù)*功能:通過鍵盤設(shè)定設(shè)定上下限報警溫度**********************************************************************/#ifndef__keyscan_H__ //定義頭文件#define__keyscan_H__sbitkey1=P2^2; sbitkey2=P2^1; sbitkey3=P2^0; sbitkey4=P3^3; uchari=0; //定義全局變量i用于不同功能模式的選擇,‘0’正常模式,‘1’上限調(diào)節(jié)模式,‘2’下限調(diào)節(jié)模式uchara=0; //定義全局變量a用于不同模式下數(shù)碼管顯示的選擇bit k4=0; //K4按鍵雙功能選擇位,k4=0時K4按鍵選擇消按鍵音的功能,k4=1時K4按鍵選擇正負(fù)溫度設(shè)定功能bitv=0; //K2、K3按鍵雙功能選擇位,v=0時選擇上下限查看功能,v=1時選擇上下限溫度加減功能bitv1=0; //v1=1時定時1250ms時間到自動關(guān)閉報警上下限查看功能bitv2=0; /消按鍵音功能調(diào)整位,為‘0’時開按鍵音,為‘1’時關(guān)按鍵音/******************************************************//* 讀鍵盤延時子函數(shù) //*****************************************************/voidkeyscan_delay(uintz) //延時1ms左右{uinti,j;for(i=z;i>0;i--) for(j=120;j>0;j--);}/******************************************************//* 溫度調(diào)節(jié)函數(shù) //*****************************************************/inttemp_change(intcount,bitf) //上下限溫度調(diào)整{if(key2==0) //判斷K2是否按下 { if(v2==0)beer=0; //v2=0開按鍵音,否則消按鍵音 keyscan_delay(10); //延時10ms if(key2==0) //再次判斷K2是否按下(實現(xiàn)按按鍵時消抖) { beer=1; //K2按下關(guān)按鍵音 if(f==0) //若溫度為正 { count++; //每按一下K2溫度上調(diào)1 if(a==1){if(count>125)count=125;}//當(dāng)溫度值大于125時不上調(diào) if(a==2){if(count>125)count=125;} } if(f!=0) //若溫度為負(fù) { count++; //每按一下K2溫度下調(diào)1 if(a==1){if(count>55)count=55;}//當(dāng)溫度值小于-55時不再下調(diào) if(a==2){if(count>55)count=55;} } } while(key2==0); //K2松開按鍵時消抖 keyscan_delay(10); } if(key3==0) { if(v2==0)beer=0; keyscan_delay(10); if(key3==0) //K3按按鍵時消抖 { beer=1; count--; //每按一下K3溫度為正時下調(diào)1,為負(fù)時上調(diào)1 if(a==1){if(count<0)count=0;}//當(dāng)溫度值達(dá)到0時不再調(diào) if(a==2){if(count<0)count=0;} } while(key3==0); keyscan_delay(10); //K3松開按鍵時消抖 } returncount;}/******************************************************//* 讀鍵盤函數(shù) //*****************************************************/voidkeyscan(){ if(key1==0) { if(v2==0)beer=0; keyscan_delay(10); if(key1==0) //K1按按鍵時消抖 { beer=1; TR1=1; //開定時器1,通過s標(biāo)志位的變化,實現(xiàn)在上下限溫度調(diào)整時溫度顯示時閃爍的功能 k4=1; //在上下溫度調(diào)節(jié)功能模式下選擇K4的調(diào)整上下限溫度正負(fù)的功能 v=1; //在上下溫度調(diào)節(jié)功能模式下選擇K2、K3的溫度加減功能 i++; //K1按一下i加1,i=‘0’進(jìn)入正常模式,i=‘1’進(jìn)入調(diào)上限模式,i=‘2’進(jìn)入調(diào)下限模式 if(i>2) //K1按下三次后退出調(diào)節(jié)模式 { i=0; //進(jìn)入正常模式 TR1=0; //關(guān)定時器1 k4=0; //在正常模式下選擇K4的消按鍵音功能 v=0; //在正常模式下選擇K2、K3的查看上下限報警溫度功能 store_t(); //存儲調(diào)整后的上下限報警溫度 } switch(i) //顯示選擇 { case0:a=0;break; //a=0選擇顯示測得的溫度 case1:a=1;break;//a=1選擇顯示上限溫度 case2:a=2;break;//a=2選擇顯示下限溫度 default:break; } } while(key1==0); //K1松按鍵時消抖 keyscan_delay(10); } if(a==1&&v==1) //a=1選擇顯示上限溫度且v=1時選擇上下限溫度加功能 {led=0;max=temp_change(max,f_max);}//顯示上限溫度 elseif(a==2&&v==1) //a=2選擇顯示下限溫度且v=1時選擇上下限溫度減功能 {led

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論