基于51的溫度控制系統(tǒng)設(shè)計(jì)C語(yǔ)言源程序_第1頁(yè)
基于51的溫度控制系統(tǒng)設(shè)計(jì)C語(yǔ)言源程序_第2頁(yè)
基于51的溫度控制系統(tǒng)設(shè)計(jì)C語(yǔ)言源程序_第3頁(yè)
基于51的溫度控制系統(tǒng)設(shè)計(jì)C語(yǔ)言源程序_第4頁(yè)
基于51的溫度控制系統(tǒng)設(shè)計(jì)C語(yǔ)言源程序_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、/*程序名稱:溫度監(jiān)控系統(tǒng)*/*程序功能:利用 89C52單片機(jī)和DS18B20a度傳感器實(shí)現(xiàn)環(huán)境*/*溫度的實(shí)時(shí)測(cè)量和高、低溫報(bào)警*/*程序版本:*/*作 者:*/*編寫時(shí)間:*/*/#include <>#include <>/含_nop_()延時(shí)函數(shù)/定義數(shù)據(jù)類型#define uchar unsigned char#define uint unsigned int/定義端口#define LED P0/段碼輸出口sbitDQ = P3 A2;/傳感器數(shù)據(jù)口sbitSMG_q = P1A0;/定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)sbitSMG_b = P1A1;/定義數(shù)碼

2、管陽(yáng)級(jí)控制腳(百位)sbitSMG_s = P1A2;/定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)sbitSMG_g = P1A3;/定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)sbitbuzzer = P1A5;/蜂鳴器sbitled_low = P2A6;/低溫指示燈sbitled_high = P2A7;/高溫指示燈sbitled_ok = P2A5;/溫度正常指示燈sbitled_work = P2 A4;/工作指示燈sbitset = P3A7;/設(shè)置按鍵sbitadd = P3A4;/加一按鍵sbitdec = P3A5;/減一按鍵按鍵次數(shù)寄存器主函數(shù)用循環(huán)計(jì)數(shù)器溫度值溫度值整數(shù)形式上下限初值/定義變量和常量i

3、nt count = 0;/int h;/uint temp;/uchar r;/共陽(yáng)LED段碼表uchar high = 35,low = 20;/"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" uchar code LED_code12 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; uchar code

4、 LED_code1口 = 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;uchar code ditab16 =0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09;/小數(shù)部分轉(zhuǎn)換碼表uchar data temp_data2 = 0x00,0x00;/存儲(chǔ)從傳感器讀出的溫度值uchar data dp5 = 0x00,0x00,0x00,0x00,0x00;/顯示單元數(shù)據(jù),共 4 個(gè)數(shù)據(jù)和一個(gè)運(yùn)算/子函數(shù)聲明voidds_reset

5、();/DS18B20初始化函數(shù)voidds_write(uchar ds_wrdata); /DS18B20寫數(shù)據(jù)函數(shù)uchar ds_read();/DS18B20讀數(shù)據(jù)函數(shù)read_temp();/讀取溫度函數(shù)voidchange_temp(uint tem); /溫度數(shù)據(jù)處理voidxianshi(int horl);/溫度顯示轉(zhuǎn)換voiddisplay();/數(shù)碼管顯示函數(shù)voidkeyscan();/按鍵查詢函數(shù)voidwarn_led();/超限報(bào)警voiddelay(uint t);/延時(shí)函數(shù),單次25us/*主函數(shù)*/void main()LED=0x00;/初始化顯示端口l

6、ed1=0;led2=0;led3=0;led4=0;for(h=0;h<4;h+)dph=8;while(1)/循環(huán)執(zhí)行顯示和溫度讀取uchar i;for(i=0;i<200;i+) warn_led();/display();/keyscan();/change_temp(read_temp(); /指示燈控制顯示按鍵掃描溫度數(shù)據(jù)讀取和處理/*/* 函數(shù)名稱:ds_reset()*/*函數(shù)功能:DS18B20®始化*/*入口參數(shù):無(wú)*/*輸出參數(shù):無(wú)*/* 調(diào)用函數(shù):delay();_nop_();*/*全局變量:無(wú)*/* 局部變量:presence*/*/void

7、 ds_reset(void) char presence=1; while(presence) while(presence) DQ=1;/_nop_(); _nop_(); DQ=0;/delay(50); / DQ=1;/delay(6);/presence=DQ; / delay(45);/presence=DQ; DQ=1;/led_work=0; 傳感器數(shù)據(jù)段先置高電平/適當(dāng)延時(shí)傳感器數(shù)據(jù)段從高電平拉到低電平延時(shí)再置高電平延時(shí)初始化成功,繼續(xù)下一步延時(shí)拉高電平/開工作指示燈/*/* 函數(shù)名稱:ds_write()*/*函數(shù)功能:向 DS18B20寫數(shù)據(jù)*/* 入口參數(shù):ds_wrd

8、ata*/*輸出參數(shù):無(wú)*/* 調(diào)用函數(shù):delay();_nop_();*/*全局變量:無(wú)*/* 局部變量:ds_wrdata*/ /*/ void ds_write(uchar ds_wrdata) uchar i;for(i=8;i>0;i-)DQ=1;_nop_();_nop_();DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=ds_wrdata&0x01;/最低位移出delay(6);ds_wrdata=ds_wrdata/2; /右移 1 位DQ=1;delay(1);/*/*函數(shù)名稱:ds_read()*/*函數(shù)功能:從 DS18B

9、20賣數(shù)據(jù)*/*入口參數(shù):無(wú)*/*輸出參數(shù):value*/*調(diào)用函數(shù):delay();_nop_();*/*全局變量:*/*局部變量:i;value;*/*/uchar ds_read(void)( 一uchar i;uchar value=0;for(i=8;i>0;i-)(DQ=1;_nop_();_nop_();value>>=1;DQ=0;_nop_();_nop_();_nop_();_nop_();DQ=1;_nop_();_nop_();_nop_();_nop_();if(DQ)value|=0x80; delay(6);)DQ=1;return(value)

10、;)/*/* 函數(shù)名稱:read_temp()*/*函數(shù)功能:讀溫度數(shù)據(jù)數(shù)據(jù)*/*入口參數(shù):無(wú)*/*輸出參數(shù):yemp*/ /* 調(diào)用函數(shù):ds_reset();ds_write();ds_read(); */* delay();*/*全局變量:temp*/* 局部變量:temp_data口;*/*/*/* 函數(shù)名稱:chang_temp()*/*函數(shù)功能:將溫度法感器中獨(dú)到的數(shù)據(jù)進(jìn)行轉(zhuǎn)換/*入口參數(shù):tem*/*輸出參數(shù):dp口*/*調(diào)用函數(shù):無(wú)*/* 全局變量:dp口;ditab口;r;*/*局部變量:tem*/*/*/read_temp()ds_reset();/傳感器初始化delay(

11、200);ds_write(0xcc);/發(fā)跳過(guò)讀取序列號(hào)命令ds_write(0x44);/發(fā)溫度轉(zhuǎn)換命令ds_reset();delay(1);ds_write(0xcc);ds_write(0xbe);/讀18B20 44存儲(chǔ)器temp_data0=ds_read(); /讀溫度值的低字節(jié)命令temp_data1=ds_read(); /讀溫度值的高字節(jié)temp=temp_data1;temp<<=8;temp=temp|temp_data0; /兩字節(jié)合成一個(gè)整型變量)return temp;/返回溫度值void change_temp(uint tem)(一uchar n

12、=0; if(tem>6348) (/溫度值正負(fù)判斷tem=65536-tem;/負(fù)溫度求補(bǔ)碼n=1;/標(biāo)志位置1)dp4=tem&0x0f;/取小數(shù)部分的值dp0=ditabdp4;/存入小數(shù)部分顯示值dp4=tem>>4;/取中間八位,即整數(shù)部分的值dp3=dp4/100;/取百位數(shù)據(jù)dp1=dp4%100;/取后兩位數(shù)據(jù)dp2=dp1/10;/取十位數(shù)據(jù)dp1=dp1%10;/個(gè)位r=dp1+dp2*10+dp3*100; /實(shí)際溫度值(十進(jìn)制)if(!dp3) (/符號(hào)位顯示判斷dp3=0x0a; if(!dp2) (/最高位為0時(shí)不顯示dp2=0x0a;/次

13、高位為0時(shí)不顯示))if(n)(dp3=0x0b;/負(fù)溫度時(shí)最高位顯示 "-"),*/*函數(shù)名稱 /*函數(shù)功能 /*入口參數(shù) /*輸出參數(shù) /*調(diào)用函數(shù) /*全局變量 /*局部變量xianshi()*/溫度數(shù)據(jù)轉(zhuǎn)換成顯示所需LED段碼*/horl*/dp*/*/dp;*/n;*/*/void xianshi(int horl)(int n=0;if(horl>128)/負(fù)數(shù)補(bǔ)碼轉(zhuǎn)換(horl=256-horl;n=1;)dp3=horl/100;dp3=dp3&0x0f;/dp2=horl%100/10;dp1=horl%10;dp0=0;if(!dp3)(d

14、p3=0x0a; if(!dp2) (dp2=0x0a;) if(n) (dp3=0x0b;)百位/ 十位/個(gè)位/小數(shù)位/高位為零不顯示/負(fù)數(shù)最高位顯示/*/* 函數(shù)名稱:display()*/*函數(shù)功能:數(shù)碼管顯示*/*入口參數(shù):無(wú)*/*輸出參數(shù):無(wú)*/*調(diào)用函數(shù):delay()*/* 全局變量:dp;LED_code;LED_code1口;*/* led1;led2;led3;led4; */*局部變量:j;*/,*void display()(int j;for(j=0;j<4;j+)/4位 LED掃描控制( switch(j) (case 0:LED=LED_codedp0;le

15、d4=1;delay(450);led4=0;break; /小數(shù)位case 1:LED=LED_code1dp1;led3=1;delay(450);led3=0;break; /個(gè)位case 2:LED=LED_codedp2;led2=1;delay(450);led2=0;break; /十位case 3:LED=LED_codedp3;led1=1;delay(450);led1=0;break; /百位/*/*函數(shù)名稱:keyscan()*/*函數(shù)功能:按鍵查詢*/*入口參數(shù):無(wú)*/*輸出參數(shù):無(wú)*/*調(diào)用函數(shù):delay();display();xianshi(); */*全局變

16、量:count;high;low;*/*局部變量:無(wú)*/*/void keyscan() if(set=0)while(1)delay(500);if(set=0)count+;while(!set)display();if(count=1)xianshi(high);display();if(add=0)/set 鍵按下/延時(shí)去抖動(dòng)/重新判斷set鍵是否按下/按鍵彈起繼續(xù)顯示前面內(nèi)容/set按下一次執(zhí)行此段/轉(zhuǎn)換上限溫度為段碼并顯示/add鍵是否按下while(!add) display();high+=1;)if(dec=0)(while(!dec) display(); high-=1;

17、)if(count=2)(xianshi(low);display();if(add=0)(while(!add) display();low+=1;)if(dec=0)(while(!dec) display();low-=1;)if(count>=3)(count=0;break;)/彈起時(shí)上限溫度加一并顯示/dec 鍵是否按下/彈起時(shí)上限溫度減一并顯示/set 鍵按下兩次執(zhí)行此段/轉(zhuǎn)換下限溫度為段碼并顯示/add 鍵是否按下/彈起時(shí)下限溫度加一并顯示/dec 鍵是否按下/彈起時(shí)下限溫度減一并顯示/set鍵按下三次回到溫度顯示狀態(tài)/*/* 函數(shù)名稱:warn_led()*/*函數(shù)功能:工作情況指示燈控制*/*入口參數(shù):無(wú)*/*輸出參數(shù):無(wú)*/*調(diào)用函數(shù):無(wú)*/* 全局變量:high;low;r;*/*局部變量:無(wú)*/*/void warn_led()( 一if(r>high)(led_low=1;led_high=0;led_ok =1;buzzer = 0;else if(r<low)(led_low=0;led_high=1;led_ok =1;buzzer = 0;else(led_low=1;led_high=1;led_ok =0

溫馨提示

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

評(píng)論

0/150

提交評(píng)論