電熱水器自動控溫系統(tǒng)下位機_第1頁
電熱水器自動控溫系統(tǒng)下位機_第2頁
電熱水器自動控溫系統(tǒng)下位機_第3頁
電熱水器自動控溫系統(tǒng)下位機_第4頁
電熱水器自動控溫系統(tǒng)下位機_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGEPAGE6電熱水器自動控溫系統(tǒng)的設(shè)計與實現(xiàn)———下位機電路圖圖1-2下位機電路圖圖1-2下位機電路圖源程序代#include"math.h"#include"reg51.h"#include"INTRINS.H"#defineN4sbitadcstartale=P3^6 ;sbitadc_con=P2^7;sbitadcoe=P3^7;sbitkey1=P1^0;sbitkey2=P1^1;sbitkey3=P1^2;sbitkey4=P1^3;sbitint_0=P3^2;sbitint_1=P3^3;sbitP15=P1^5;sbitP16=P1^6;voiddelay();voiddelay1();voidinituart(void);unsignedchargettemper();voidfillbuff();voidshowbuff();voidled();voidkeyprocess();voidfilter();voidsend_char();codeunsignedcharledtable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//段碼0--9,-codeunsignedcharledtable1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段碼0.--9.unsignedcharvideo_buff[6]="";//顯示緩沖區(qū)unsignedcharlevel; //鍵值unsignedcharlevelflag; //是否按鍵按下unsignedchartemperflag; //溫度是否相同unsignedchartemper; //溫度//主函數(shù)voidmain(){ EX1=1; //允許INT1中斷 EA=1; //中斷總允許 IT1=1; //INT1邊沿觸發(fā)方式 level=0;//初始鍵值 levelflag=0;//無鍵按下標(biāo)志 temperflag=0;//鍵值 temper=0;//adc初始值 P16=0; inituart();//串口初始化 while(1) { filter(); delay1(); showbuff(); //顯示溫度值 led(); if(levelflag||temperflag) { send_char();//如果有按鍵按下或者采集到的值與前一刻不相同時,將//溫度或檔位發(fā)給上位機 } } }//延時函數(shù)voiddelay(){ inti,j; for(i=0;i<50;i++) for(j=0;j<1;j++); }voiddelay1(){ inti,j; for(i=0;i<150;i++) for(j=0;j<25;j++); }//檢測voidled(){ if(level==1) if((video_buff[3]==level)||((video_buff[3]==level+1)&&(video_buff[4]==0)))P16=0; elseP16=1;//如果有按鍵按下或者采集到的值與前一刻不相同時,將溫度或檔位發(fā)給上位機 else if(((video_buff[3]==level)&&(video_buff[4]!=0))||((video_buff[3]==level+1)&&(video_buff[4]==0)))P16=0; elseP16=1; //如果有按鍵按下或者采集到的值與前一刻不相同時,將溫度或檔位發(fā)給上位機 }//得到采樣值 unsignedchargettemper(){ unsignedcharadcdata; EA=0; //采樣時關(guān)閉所有中斷 adc_con=0; adcstartale=0; _nop_();_nop_(); adcstartale=1; //啟動A/D轉(zhuǎn)換,下降沿有效 P0=0xff; while(int_0==0); //等待轉(zhuǎn)換完成 adcoe=0; //允許讀ADC0808 adcdata=P0; //將轉(zhuǎn)換后的數(shù)據(jù)送單片機的P0口 adcoe=1; //不允許讀ADC0808 if(temper!=adcdata)temperflag=1;//相鄰兩次采樣值不同時,temperflag置1 EA=1; //打開所有中斷 returnadcdata;} //處理采樣值,填充顯示緩沖區(qū) voidfillbuff(){unsignedinttmp; tmp=temper*1.96078; video_buff[0]=level;//填充檔位 video_buff[1]=10; //填充‘-’ video_buff[2]=10; //填充‘-’ video_buff[3]=tmp/100; //填充十位 tmp=tmp%100; video_buff[4]=tmp/10; //填充個位 tmp=tmp%10; video_buff[5]=tmp; //填充小數(shù)點位 }//將檔位、溫度值顯示在數(shù)碼管上voidshowbuff(){ unsignedcharii,j,k; unsignedcharp=0x1; unsignedcharxdata*i; P15=0; for(ii=0;ii<6;ii++) { i=0xfff3;//控制口地址 *i=0x80;//控制寫入控制口 j=video_buff[ii]; if(ii==4)k=ledtable1[j]; elsek=ledtable[j]; i=i-3; //位碼地址 *i=p; //送位碼到PA口 i=i+1; //段碼地址 *i=k; //送段碼到PB口 p<<=1; //從左向右依次點亮數(shù)碼管 delay(); } P15=1; }//鍵盤中斷處理程序voidkeyprocess()interrupt2{unsignedchari;for(i=0;i<30;i++);if(int_1)return;//當(dāng)INT1=1時,無中斷,無按鍵按下if(!key1)level=1;//如果key1==0,則1鍵按下if(!key2)level=2;//如果key21==0,則2鍵按下if(!key3)level=3;//如果key3==0,則3鍵按下if(!key4)level=4;//如果key4==0,則4鍵按下levelflag=1; //有按鍵按下video_buff[0]=level; }//均值濾波 voidfilter() //對四次采樣進行求平均,考慮到實際中溫度的變化是一個比較緩慢的過程,//相鄰的幾次采樣變化幅度不大,且為計算簡便,N取值為4{intsum=0,count;for(count=0;count<N;count++) { temper=gettemper(); //一次采樣 if(temperflag) fillbuff(); sum+=video_buff[3]*100+video_buff[4]*10+video_buff[5];delay(); }sum=sum/N;video_buff[3]=sum/100; //溫度的十位video_buff[4]=sum%100/10;//溫度的個位video_buff[5]=sum%10; //溫度的小數(shù)點位video_buff[0]=level;}//串口中斷處理程序voiduartinter(void)interrupt4{ if(RI==1) //如果RI=1,接收完數(shù)據(jù) { RI=0; //軟件清零 levelflag=1; level=SBUF-0x30; if(level>=1&&level<=4) { video_buff[0]=level; //將接收到的檔位值填寫顯示緩沖區(qū) } } if(TI==1) //如果TI=1,發(fā)送完數(shù)據(jù) { TI=0; //軟件清零 }}//串口初始化voidinituart(){ SCON=0X50; //方式1,8位數(shù)據(jù),允許接收sm0sm1sm2rentb8rb8tiri TMOD=0X20; //設(shè)置timer1,方式2(方式2,自動重裝入初值的8位計數(shù)器,串行通信時用) TH1=0XFD;//初始值 TL1=0xfd; TR1=1; //啟動timer1,開始計時 ES=1;// 開啟串口中斷}//向上位機發(fā)送檔位、溫度voidsend_char(){ if(!TI) { if(temperflag==1) //溫度有變化 { SBUF=video_buff[3]+0x30; //發(fā)送十位給上位機 while(TI==0); //等待發(fā)送完,進入中斷處理 SBUF=video_buff[4]+0x30; //發(fā)送個位給上位機 while(TI==0); //等待發(fā)送完,進入中斷處理 SBUF='.'; //發(fā)送小數(shù)點給上位機 while(TI==0); //等待發(fā)送完,進入中斷處理 SBUF=video_buff[5]+0x30; //發(fā)送小數(shù)點位給上位機 while(TI==0); //等待發(fā)送完,進入中斷處理 SBUF='-'; //發(fā)送‘-’給上位機 while(TI==0); //等待

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論