智能溫室恒溫控制系統(tǒng)C語言程序_第1頁
智能溫室恒溫控制系統(tǒng)C語言程序_第2頁
智能溫室恒溫控制系統(tǒng)C語言程序_第3頁
智能溫室恒溫控制系統(tǒng)C語言程序_第4頁
智能溫室恒溫控制系統(tǒng)C語言程序_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、程序清單:#include <reg52.h>#include <intrins.h>#include <stdio.h>#define uchar unsigned charsbit TMDAT = P14;/兩個DS18B20的I/O口sbit TMDAT1 = P15;sbit CS=P10;sbit CLK=P11;sbit DIO=P12;sbit KEY=P13;sbit HEAT=P17;sbit COLD=P33;sbit HEAT1=P16;sbit COLD1=P32;sbit ALARM=P36;int num; /保存輸入的數字 in

2、t key=7; /保存數碼管號int qiehuan=0; /控制屏幕顯示溫度或者參數int choose=0; /保存正在使用的DS18B20號int max1=23; /一號通道的報警上下限值int min1=5;int upper1=22; /一號通道的預定溫度值int lower1=18; int max2=23; /二號通道的報警上下限值int min2=5;int upper2=22; /二號通道的預定溫度值int lower2=18; unsigned char buffer116=0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0

3、9,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f;/控制符,用于顯示不帶小數點的數字unsigned char buffer216=0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f;/控制符,用于顯示帶小數點的數字unsigned char turn8=0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87;/控制符,用于選定數碼管號unsigned int result,result1;/保存十六進制的溫度值unsigned char a,b;u

4、char data rebuf,sebuf;uchar bdata com_data;sbit mos_bit=com_data7;sbit low_bit=com_data0;void send(uchar sebuf);void delay_50us();void receive();void reset();void dmsec (unsigned int count);void tmreset (void);void tmstart (void);void tmreset1 (void);void tmstart1 (void);void fuzhi(void);/用于修改參數值voi

5、d xianshi(void);/將修改的參數值顯示unsigned char tmrtemp (void);unsigned char tmrtemp1 (void);main()unsigned int zhengshu,dot; unsigned char temperature;unsigned int symbol;int shiwei; int gewei;unsigned int zhengshu1,dot1; unsigned char temperature1;unsigned int symbol1;int shiwei1; int gewei1; while(1) if(

6、choose=0) /通道一工作dmsec(1);tmstart (); dmsec(1000);tmrtemp (); reset(); if(result>0xf800) /將通道一的溫度轉換為十進制 symbol=1; result=result+1;zhengshu=result/16;dot=result&0x000f;dot=(dot*10)/16; shiwei=(zhengshu/10); gewei=(zhengshu%10); temperature=zhengshu+dot*0.1; /通道一的十進制溫度 if(temperature>upper1)

7、/通道一溫度控制 COLD=1; HEAT=0; /超過預定溫度的上限,啟動小風扇 else if(temperature<lower1) COLD=0; HEAT=1; /低于預定溫度的下限,啟動小燈泡 else COLD=0; HEAT=0; if(temperature>max1|temperature<min1) ALARM=0; /高于或低于設定溫度的上下限,則報警 else ALARM=1; elsedmsec(1); /通道二工作tmstart1 (); dmsec(1000);tmrtemp1 (); reset(); if(result1>0xf800

8、) /將通道二的溫度轉換為十進制 symbol1=1; result1=result1+1;zhengshu1=result1/16;dot1=result1&0x000f;dot1=(dot1*10)/16; shiwei1=(zhengshu1/10); gewei1=(zhengshu1%10); temperature1=zhengshu1+dot1*0.1; /通道二的十進制溫度if(temperature1>upper2) /通道二溫度控制 COLD1=1; HEAT1=0; /超過預定溫度的上限,啟動小風扇 else if(temperature1<lower

9、2) COLD1=0; HEAT1=1; /低于預定溫度的下限,啟動小燈泡 else COLD1=0; HEAT1=0; if(temperature1>max2|temperature<min2) ALARM=0; /高于或低于設定溫度的上下限,則報警 else ALARM=1; /屏幕的顯示: if(qiehuan=0) /顯示溫度 if(choose=0) send(0x80); delay_50us(); if(symbol=1)send(0x0a); elsesend(0x0f); delay_50us(); send(0x81); delay_50us(); send(

10、buffer1shiwei); delay_50us(); send(0x82); delay_50us(); send(buffer2gewei); delay_50us(); send(0x83); delay_50us(); send(buffer1dot); delay_50us(); else send(0x84); delay_50us(); if(symbol1=1)send(0x0a); elsesend(0x0f); delay_50us(); send(0x85); delay_50us(); send(buffer1shiwei1); delay_50us(); send

11、(0x86); delay_50us(); send(buffer2gewei1); delay_50us(); send(0x87); delay_50us(); send(buffer1dot1); delay_50us(); elseif(choose=0) /顯示參數值send(0x80);delay_50us();send(buffer1max1/10);send(0x81);delay_50us();send(buffer1max1%10);send(0x82);delay_50us();send(buffer1min1/10);send(0x83);delay_50us();se

12、nd(buffer1min1%10);send(0x84);delay_50us();send(buffer1upper1/10);send(0x85);delay_50us();send(buffer1upper1%10);send(0x86);delay_50us();send(buffer1lower1/10);send(0x87);delay_50us();send(buffer1lower1%10);delay_50us();if(choose=1)send(0x80);delay_50us();send(buffer1max2/10);send(0x81);delay_50us()

13、;send(buffer1max2%10);send(0x82);delay_50us();send(buffer1min2/10);send(0x83);delay_50us();send(buffer1min2%10);send(0x84);delay_50us();send(buffer1upper2/10);send(0x85);delay_50us();send(buffer1upper2%10);send(0x86);delay_50us();send(buffer1lower2/10);send(0x87);delay_50us();send(buffer1lower2%10);

14、 CS=1; while(KEY); send(0x15); /第一個字節(jié),讀取鍵值命令字 delay_50us(); receive();/第二個字節(jié),讀取鍵值,存放在變量rebuf中 delay_50us(); switch(rebuf)case 0x3F: /按鍵S1,選擇一路choose=0;send(0x88);/第一個字節(jié),閃爍控制命令字delay_50us();send(0xF0);/第二個字節(jié),設置為閃爍CS=1; break;case 0x3E:/按鍵S2, 選擇二路choose=1;send(0x88);/第一個字節(jié),閃爍控制命令字delay_50us();send(0x0

15、F);/第二個字節(jié),設置為閃爍CS=1; break;case 0x36: /按鍵S4,開始修改qiehuan=1;key=7;CS=1; break; case 0x37:/選擇確定qiehuan=0;CS=1; break;case 0x27: /輸入數字"0"key+;num=0;fuzhi();xianshi();CS=1; break; case 0x26: /輸入數字"1" key+;num=1;fuzhi();xianshi();CS=1; break; case 0x1F: /輸入數字"2" key+;num=2;fu

16、zhi();xianshi();CS=1; break; case 0x1E: /輸入數字"3" key+;num=3;fuzhi();xianshi();CS=1; break; case 0x17: /輸入數字"4" key+;num=4;fuzhi();xianshi();CS=1; break; case 0x16: /輸入數字"5"key+;num=5;fuzhi();xianshi();CS=1; break; case 0x0F: /輸入數字"6" key+;num=6;fuzhi();xianshi

17、();CS=1; break; case 0x0E: /輸入數字"7" key+;num=7;fuzhi();xianshi();CS=1; break; case 0x07: /輸入數字"8" key+;num=8;fuzhi();xianshi();CS=1; break; case 0x06: /輸入數字"9" key+;num=9;fuzhi();xianshi();CS=1; break; default: break; while(!KEY); KEY=1; /* FUNCTION */void dmsec (unsign

18、ed int count) / mSec Delay 11.0592 Mhz unsigned int i; / 1MS 延時 while (count-) for (i=0;i<125;i+) void tmreset (void) / Reset TX unsigned int i; TMDAT = 0; i = 103; while (i>0) i-; / Approx 900 uS TMDAT = 1; i = 4; while (i>0) i-;void tmreset1 (void) / Reset TX unsigned int i; TMDAT1 = 0; i

19、 = 103; while (i>0) i-; / Approx 900 uS TMDAT1 = 1; i = 4; while (i>0) i-;void tmpre (void) / Wait for Presence RX unsigned int i; while (TMDAT); while (TMDAT); i = 4; while (i>0) i-;void tmpre1 (void) / Wait for Presence RX unsigned int i; while (TMDAT1); while (TMDAT1); i = 4; while (i>

20、;0) i-;bit tmrbit (void) / read one bit unsigned int i; bit dat; TMDAT = 0; i+; TMDAT = 1; i+; i+; dat = TMDAT; i = 8; while (i>0) i-; return (dat);unsigned char tmrbyte (void) / read one byte unsigned char i,j,dat; dat = 0; for (i=1;i<=8;i+) j = tmrbit (); dat = (j << 7) | (dat >>

21、 1); return (dat);void tmwbyte (unsigned char dat) / write one byte unsigned int i; unsigned char j; bit testb; for (j=1;j<=8;j+) testb = dat & 0x01; dat = dat >> 1; if (testb) TMDAT = 0; / Write 1 i+; i+; TMDAT = 1; i = 8; while (i>0) i-; else TMDAT = 0; / Write 0 i = 8; while (i>

22、;0) i-; TMDAT = 1; i+; i+; void tmstart (void) / ds1820 start convert tmreset (); tmpre (); dmsec (1); tmwbyte (0xcc); / skip rom tmwbyte (0x44); / convertunsigned char tmrtemp (void) / read temp tmreset (); tmpre (); dmsec (1); tmwbyte (0xcc); / skip rom tmwbyte (0xbe); / convert a = tmrbyte (); /

23、LSB b = tmrbyte (); / MSBresult=a+b*256;return(result);bit tmrbit1 (void) / read one bit unsigned int i; bit dat; TMDAT1 = 0; i+; TMDAT1 = 1; i+; i+; dat = TMDAT1; i = 8; while (i>0) i-; return (dat);unsigned char tmrbyte1 (void) / read one byte unsigned char i,j,dat; dat = 0; for (i=1;i<=8;i+

24、) j = tmrbit1 (); dat = (j << 7) | (dat >> 1); return (dat);void tmwbyte1 (unsigned char dat) / write one byte unsigned int i; unsigned char j; bit testb; for (j=1;j<=8;j+) testb = dat & 0x01; dat = dat >> 1; if (testb) TMDAT1 = 0; / Write 1 i+; i+; TMDAT1 = 1; i = 8; while

25、(i>0) i-; else TMDAT1 = 0; / Write 0 i = 8; while (i>0) i-; TMDAT1 = 1; i+; i+; void tmstart1 (void) / ds1820 start convert tmreset1 (); tmpre1 (); dmsec (1); tmwbyte1 (0xcc); / skip rom tmwbyte1 (0x44); / convertunsigned char tmrtemp1 (void) / read temp tmreset1 (); tmpre1 (); dmsec (1); tmwb

26、yte1 (0xcc); / skip rom tmwbyte1(0xbe); / convert a = tmrbyte1 (); / LSB b = tmrbyte1(); / MSBresult1=a+b*256;return(result1);void delay_50us() /延時50us,不同的晶振,有差異,讀者可根據實際情況自定參數 uchar i; for(i=0;i<6;i+); void delay_8us()/延時8us uchar i; for(i=0;i<1;i+); void delay_50ms()/延時50ms uchar i,j; for(j=0

27、;j<50;j+) for(i=0;i<125;i+); void send(uchar sebuf)/發(fā)送一個字節(jié)結束時,7289的CS繼續(xù)使能 uchar i; com_data=sebuf; CS=0;CLK=0; delay_50us(); for(i=0;i<8;i+) delay_8us(); DIO=mos_bit; CLK=1; delay_8us(); com_data=com_data<<1; CLK=0; DIO=0;/改為應該更好; void receive()/接收一個字節(jié)結束時,7289的CS不使能 uchar i; CLK=1; delay_50us(); for(i=0;i<8;i+) com_data=com_data<<1; low_bit=DIO; CLK=1; delay

溫馨提示

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

評論

0/150

提交評論