多點糧庫溫度監(jiān)控管理系統(tǒng)實習(xí)報告_第1頁
多點糧庫溫度監(jiān)控管理系統(tǒng)實習(xí)報告_第2頁
多點糧庫溫度監(jiān)控管理系統(tǒng)實習(xí)報告_第3頁
多點糧庫溫度監(jiān)控管理系統(tǒng)實習(xí)報告_第4頁
多點糧庫溫度監(jiān)控管理系統(tǒng)實習(xí)報告_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

糧庫溫度監(jiān)控管理系統(tǒng)實習(xí)報告系別:電氣工程系班級:學(xué)號:25號實習(xí)時間:2014.11.24~2014.12.6指導(dǎo)教師:實習(xí)名稱:糧庫溫度監(jiān)控管理系統(tǒng)二、實習(xí)目的:1、能夠正確使用相關(guān)軟件編寫上位機、下位機程序?qū)崿F(xiàn)數(shù)據(jù)的采集;2、要求系統(tǒng)界面美觀、大方,顏色、字體等選擇合適,控件選擇合理;3、本系統(tǒng)能夠控制下位機的啟動與停止,同時應(yīng)具有實時顯示、曲線繪制、數(shù)據(jù)保存、數(shù)據(jù)瀏覽、分析(上下限提示、平均值、直方圖或餅圖等)等基本功能,并配置菜單、工具欄等;4、下位機提供糧庫中八個糧倉的溫度數(shù)據(jù),用數(shù)碼管或液晶循環(huán)顯示;三、實訓(xùn)過程:1.設(shè)計的內(nèi)容本次設(shè)計所做的是基于VB的溫度數(shù)據(jù)采集與控制系統(tǒng),它采用DS18B20作為溫度傳感器,以微機作為主控計算機。通過仿真電路,由串行通訊線把數(shù)據(jù)直接傳送給上位機,讓上位機對所得到的數(shù)據(jù)進行分析處理,并且應(yīng)用VB語言編程實現(xiàn)溫度的顯示。硬件方面是由上位機和仿真電路來實現(xiàn)的,DS18B20采集到的溫度數(shù)據(jù)通過串行通訊線傳送給上位機,運行在上位機上的編程軟件VB利用串行通訊線提供給硬件的接口,對整個單總線進行操作控制,并且對測量數(shù)據(jù)進行處理。軟件方面主要是通過對系統(tǒng)參數(shù)的設(shè)置,通信控件的應(yīng)用,最終實現(xiàn)對DS18B20的控制和溫度數(shù)據(jù)的讀取。2.仿真電路此次下位機主要是由8個溫度傳感器DS18B20構(gòu)成,在此系統(tǒng)中應(yīng)用DS18B20溫度傳感器檢測溫度,經(jīng)信號處理后,通過仿真運行,最終在上位機上應(yīng)用編程軟件VB語言實現(xiàn)溫度的顯示。登錄界面通過輸入用戶名和密碼來進行登錄進入主界面,并有用戶名注冊和找回密碼功能。登錄界面主界面串口編寫在主界面中打開串口參數(shù)對串口參數(shù)進行設(shè)置。(程序如下)PrivateSubForm2_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadMe.Text="串口參數(shù)"EndSubPrivateSubComboBox1_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox1.SelectedIndexChangedForm3.SerialPort1.PortName=ComboBox1.TexEndSubPrivateSubComboBox2_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox2.SelectedIndexChangedForm3.SerialPort1.BaudRate=ComboBox2.TextEndSubPrivateSubComboBox3_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox3.SelectedIndexChangedComboBox3.Text=Form3.SerialPort1.ParityEndSubPrivateSubComboBox4_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox4.SelectedIndexChangedComboBox4.Text=Form3.SerialPort1.DataBitsEndSubPrivateSubComboBox5_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox5.SelectedIndexChangedComboBox5.Text=Form3.SerialPort1.StopBitsEndSubPrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickForm3.TextBox1.Text=ComboBox1.TextForm3.TextBox2.Text=ComboBox2.TextForm3.TextBox3.Text=ComboBox3.TextForm3.TextBox4.Text=ComboBox4.TextForm3.TextBox5.Text=ComboBox5.TextMe.Hide()EndSub5.曲線繪圖通過打開串口和下位機仿真電路進行數(shù)據(jù)傳遞,實現(xiàn)在上位機進行監(jiān)控各糧倉溫度,還可以通過曲線把各個糧倉的溫度直觀的顯示在界面。并附有上下限溫度報警系統(tǒng),使用戶可以快速的對糧倉的溫度進行調(diào)整。(程序如下)DimgAsGraphics=PictureBox1.CreateGraphics'曲線繪圖h=PictureBox1.Heightg.TranslateTransform(30,h-165)Dimp1AsPen=NewPen(Color.Maroon)z=Val(TextBox6.Text)q=5i=30x21=x11+iy21=-z*qg.DrawLine(p1,x11,y11,x21,y21)x11=x21y11=y21Ifx21=450Thenx11=0PictureBox1.Refresh()EndIfIfx22=450Orx23=450Orx24=450Orx25=450Orx26=450Orx27=450Orx28=450Thenx11=0PictureBox1.Refresh()EndIfg.Dispose()p1.Dispose()EndSubPrivateSub打開串口ToolStripMenuItem_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handles打開串口ToolStripMenuItem.ClickIfSerialPort1.IsOpen=FalseThen'串口通信SerialPort1.Open()Timer3.Enabled=TrueSerialPort1.Write(TextBox6.Text)EndIfEndSubPrivateSub關(guān)閉串口ToolStripMenuItem_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handles關(guān)閉串口ToolStripMenuItem.ClickIfSerialPort1.IsOpen=TrueThenSerialPort1.Close()Timer3.Enabled=FalseTextBox6.Text="1"TextBox7.Text="0"TextBox8.Text="0"TextBox9.Text="0"TextBox10.Text="0"TextBox11.Text="0"TextBox12.Text="0"TextBox13.Text="0"EndIfEndSubPrivateSubTimer3_Tick(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesTimer3.TickDimcAsDoubleDimdat,rAsStringDimb(3)AsSingler=SerialPort1.ReadExisting()IfLen(r)<3OrLen(r)>3ThenExitSubElsec=rIfc<>0Thenb(0)=c\100b(1)=c\10Mod10b(2)=cMod10EndIfIfb(2)=1Thendat=b(0)*10+b(1)TextBox6.Text=datEndIfIfb(2)=2Thendat=b(0)*10+b(1)TextBox7.Text=datEndIfIfb(2)=3Thendat=b(0)*10+b(1)TextBox8.Text=datEndIfIfb(2)=4Thendat=b(0)*10+b(1)TextBox9.Text=datEndIfIfb(2)=5Thendat=b(0)*10+b(1)TextBox10.Text=datEndIfIfb(2)=6Thendat=b(0)*10+b(1)TextBox11.Text=datEndIfIfb(2)=7Thendat=b(0)*10+b(1)TextBox12.Text=datEndIfIfb(2)=8Thendat=b(0)*10+b(1)TextBox13.Text=datEndIfEndIfSerialPort1.DiscardInBuffer()'把串口緩存清空EndSub6.圖形數(shù)據(jù)顯示直方圖顯示和餅圖顯示每一個顏色都代表一個糧庫溫度可以使用戶更一步直觀的了解各糧倉的溫度。(各顏色對應(yīng)于主界面中糧倉按鈕旁的顏色)數(shù)據(jù)統(tǒng)計和保存統(tǒng)計每秒各糧倉的溫度情況并保存,方便用戶隨時調(diào)看每天的溫度歷史記錄。四、實習(xí)體會:在做課程設(shè)計之前,整個人對課程設(shè)計的流程可謂是一頭霧水。在結(jié)課之前,我們學(xué)了VB的串口通信。在課上積累的基礎(chǔ)上,我開始了串口通信課程設(shè)計的制作。設(shè)計時,最初想到的是界面如何更加美觀。在好奇心的驅(qū)使下,到網(wǎng)上下載好多圖片作為背景。慢慢地,開始讀入編程階段。要進入一個系統(tǒng),最開始需要寫一段代碼運行進入系統(tǒng)。這讓我想起了平常的很多登錄界面,比如QQ登錄。每次人的登錄界面,現(xiàn)在終于自己面臨設(shè)計界面,剛開始確實迷茫,但是想想平常的很多界面的運行方式方法問題就迎楞而解了。在曲線繪圖、溫度報警、數(shù)據(jù)顯示、數(shù)據(jù)查詢這一方面的代碼是不盡相同的。為了實現(xiàn)這些功能,我查找了書上的各個章節(jié)的練習(xí)題,希望能夠找到點靈感。終于功夫不負有心人,我也成功地讓這些按鈕能夠運行??偠灾?,這次的課程設(shè)計讓我體驗了編寫城中的酸與苦。也學(xué)到了很多東西。(程序源碼)#include<reg52.h>#defineLCD1602_DBP0sbitLCD1602_RS=P2^5;sbitLCD1602_RW=P2^6;sbitLCD1602_E=P2^7;/*等待液晶準備好*/voidLcdWaitReady(){unsignedcharsta;LCD1602_DB=0xFF;LCD1602_RS=0;LCD1602_RW=1;do{LCD1602_E=1;sta=LCD1602_DB;//讀取狀態(tài)字LCD1602_E=0;}while(sta&0x80);//bit7等于1表示液晶正忙,重復(fù)檢測直到其等于0為止}/*向LCD1602液晶寫入一字節(jié)命令,cmd-待寫入命令值*/voidLcdWriteCmd(unsignedcharcmd){LcdWaitReady();LCD1602_RS=0;LCD1602_RW=0;LCD1602_DB=cmd;LCD1602_E=1;LCD1602_E=0;}/*向LCD1602液晶寫入一字節(jié)數(shù)據(jù),dat-待寫入數(shù)據(jù)值*/voidLcdWriteDat(unsignedchardat){LcdWaitReady();LCD1602_RS=1;LCD1602_RW=0;LCD1602_DB=dat;LCD1602_E=1;LCD1602_E=0;}/*設(shè)置顯示RAM起始地址,亦即光標位置,(x,y)-對應(yīng)屏幕上的字符坐標*/voidLcdSetCursor(unsignedcharx,unsignedchary){unsignedcharaddr;if(y==0)//由輸入的屏幕坐標計算顯示RAM的地址 addr=0x00+x;//第一行字符地址從0x00起始elseaddr=0x40+x;//第二行字符地址從0x40起始LcdWriteCmd(addr|0x80);//設(shè)置RAM地址}/*在液晶上顯示字符串,(x,y)-對應(yīng)屏幕上的起始坐標,str-字符串指針*/voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str){LcdSetCursor(x,y);//設(shè)置起始地址while(*str!='\0')//連續(xù)寫入字符串數(shù)據(jù),直到檢測到結(jié)束符{LcdWriteDat(*str++);}}/*初始化1602液晶*/voidInitLcd1602(){LcdWriteCmd(0x38);//16*2顯示,5*7點陣,8位數(shù)據(jù)接口LcdWriteCmd(0x0C);//顯示器開,光標關(guān)閉LcdWriteCmd(0x06);//文字不動,地址自動+1LcdWriteCmd(0x01);//清屏}#include<reg52.h>#include<intrins.h>unsignedcharcodeID[8][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},//第一個DS18B20的序列號 {0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},//第2個DS18B20的序列號 {0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0}, {0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7}, {0x28,0x34,0xc5,0xb8,0x00,0x00,0x00,0x52}, {0x28,0x35,0xc5,0xb8,0x00,0x00,0x00,0x65}, {0x28,0x36,0xc5,0xb8,0x00,0x00,0x00,0x3c}, {0x28,0x37,0xc5,0xb8,0x00,0x00,0x00,0x0b}, }; unsignedcharlcdadd=0;sbitIO_18B20=P3^7;//DS18B20通信引腳/*軟件延時函數(shù),延時時間(t*10)us*/voidDelayX10us(unsignedchart){do{_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();}while(--t);}/*復(fù)位總線,獲取存在脈沖,以啟動一次讀寫操作*/bitGet18B20Ack(){bitack;EA=0;//禁止總中斷IO_18B20=0;//產(chǎn)生500us復(fù)位脈沖DelayX10us(50);IO_18B20=1;DelayX10us(6);//延時60usack=IO_18B20;//讀取存在脈沖while(!IO_18B20);//等待存在脈沖結(jié)束EA=1;//重新使能總中斷 returnack;}/*向DS18B20寫入一個字節(jié),dat-待寫入字節(jié)*/voidWrite18B20(unsignedchardat){unsignedcharmask;EA=0;//禁止總中斷for(mask=0x01;mask!=0;mask<<=1)//低位在先,依次移出8個bit{IO_18B20=0;//產(chǎn)生2us低電平脈沖_nop_();_nop_();if((mask&dat)==0)//輸出該bit值IO_18B20=0;elseIO_18B20=1;DelayX10us(6);//延時60usIO_18B20=1;//拉高通信引腳} EA=1;//重新使能總中斷}/*從DS18B20讀取一個字節(jié),返回值-讀到的字節(jié)*/unsignedcharRead18B20(){unsignedchardat;unsignedcharmask;EA=0;//禁止總中斷for(mask=0x01;mask!=0;mask<<=1)//低位在先,依次采集8個bit{IO_18B20=0;//產(chǎn)生2us低電平脈沖_nop_();_nop_();IO_18B20=1;//結(jié)束低電平脈沖,等待18B20輸出數(shù)據(jù)_nop_();//延時2us_nop_();if(!IO_18B20)//讀取通信引腳上的值dat&=~mask;elsedat|=mask;DelayX10us(6);//再延時60us}EA=1;//重新使能總中斷returndat;}/*啟動一次18B20溫度轉(zhuǎn)換,返回值-表示是否啟動成功*/bitStart18B20(){bitack;ack=Get18B20Ack();//執(zhí)行總線復(fù)位,并獲取18B20應(yīng)答if(ack==0)//如18B20正確應(yīng)答,則啟動一次轉(zhuǎn)換{ Write18B20(0xCC);Write18B20(0x44);//啟動一次溫度轉(zhuǎn)換}return~ack;//ack==0表示操作成功,所以返回值對其取反}/*讀取DS18B20轉(zhuǎn)換的溫度值,返回值-表示是否讀取成功*/bitGet18B20Temp(int*temp){bitack;unsignedcharLSB,MSB,i;//16bit溫度值的低字節(jié)和高字節(jié)staticunsignedcharadder=0;ack=Get18B20Ack();//執(zhí)行總線復(fù)位,并獲取18B20應(yīng)答if(ack==0)//如18B20正確應(yīng)答,則讀取溫度值{// Write18B20(0xCC);//跳過ROM操作 Write18B20(0x55);for(i=0;i<8;i++) { Write18B20(ID[adder][i]); lcdadd=adder; } adder++; if(adder>=8) adder=0;Write18B20(0xBE);//發(fā)送讀命令LSB=Read18B20();//讀溫度值的低字節(jié)MSB=Read18B20();//讀溫度值的高字節(jié)*temp=((int)MSB<<8)+LSB;//合成為16bit整型數(shù)}return~ack;//ack==0表示操作應(yīng)答,所以返回值為其取反值#include<reg52.h>unsignedchari=0,z;unsignedcharIDD[8][5]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}, {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},};voidDelayMs(unsignedcharn){ unsignedchari=0,j=0; for(i=0;i<n;i++) for(j=0;j<123;j++);}bitflag1s=0;//1s定時標志unsignedcharT0RH=0;//T0重載值的高字節(jié)unsignedcharT0RL=0;//T0重載值的低字節(jié)voidConfigTimer0(unsignedintms);externvoidConfigUART(unsignedintbaud);unsignedcharIntToString(unsignedchar*str,intdat);externbitStart18B20();externunsignedcharlcdadd,tmp;externbitGet18B20Temp(int*temp);externvoidInitLcd1602();externvoidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str);voidmain(){bitres;inttemp;//讀取到的當前溫度值intintT,decT;//溫度值的整數(shù)和小數(shù)部分unsignedcharlen;unsignedcharstr[12];EA=1;//開總中斷ConfigTimer0(10);//T0定時10ms ConfigUART(9600);Start18B20();//啟動DS18B20 InitLcd1602();//初始化液晶while(1){if(flag1s)//每秒更新一次溫度{flag1s=0;res=Get18B20Temp(&temp);//讀取當前溫度 if(res)//讀取成功時,刷新當前溫度顯示{intT=temp>>4;//分離出溫度值整數(shù)部分decT=temp&0xF;//分離出溫度值小數(shù)部分len=IntToString(str,intT);//整數(shù)部分轉(zhuǎn)換為字符串str[len++]='.';//添加小數(shù)點decT=(decT*10)/16;//二進制的小數(shù)部分轉(zhuǎn)換為1位十進制位str[len++]=decT+'0';//十進制小數(shù)位再轉(zhuǎn)換為ASCII字符while(len<4)//用空格補齊到6個字符長度{str[len++]='';}str[len]='\0';//添加字符串結(jié)束符 switch(lcdadd) { case0:LcdShowStr(0,0,"1:");LcdShowStr(2,0,str) ;break;//顯示到液晶屏上 case1:LcdShowStr(8,0,"2:");LcdShowStr(10,0,str);break; case2:LcdShowStr(0,1,"3:");LcdShowStr(2,1,str) ;break;//顯示到液晶屏上 case3:LcdShowStr(8,1,"4:");LcdShowStr(10,1,str);break; case4:LcdShowStr(0,0,"5:");LcdShowStr(2,0,str) ;break;//顯示到液晶屏上 case5:LcdShowStr(8,0,"6:");LcdShowStr(10,0,str);break; case6:LcdShowStr(0,1,"7:");LcdShowStr(2,1,str) ;break;//顯示到液晶屏上 case7:LcdShowStr(8,1,"8:");LcdShowStr(10,1,str);break; default:break; } for(z=0;z<2;z++) IDD[lcdadd][z]=str[z]; IDD[lcdadd][2]='\0'; }else//讀取失敗時,提示錯誤信息{LcdShowStr(0,0,"error!");}/*********************************************************/ if(tmp==1) { while(IDD[lcdadd][i]!='\0') { SBUF=IDD[lcdadd][i]; while(!TI); TI=0; i++; DelayMs(30); } SBUF=lcdadd+1+0x30; while(!TI); TI=0; i=0; }Start18B20();//重新啟動下一次轉(zhuǎn)換}}}/*整型數(shù)轉(zhuǎn)換為字符串,str-字符串指針,dat-待轉(zhuǎn)換數(shù),返回值-字符串長度*/unsignedcharIntToString(unsignedchar*str,intdat){signedchari=0;unsignedcharlen=0;unsignedcharbuf[6];if(dat<0)//如果為負數(shù),首先取絕對值,并在指針上添加負號{dat=-dat;*str++='-';len++;} if((dat<10)&(dat>0)) { *str++='0';len++; }do{//先轉(zhuǎn)換為低位在前的十進制數(shù)組buf[i++]=dat%10;dat/=10;}while(dat>0);len+=i;//i最后的值就是有效字符的個數(shù)while(i--

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論