微機接口課程設(shè)計報告_第1頁
微機接口課程設(shè)計報告_第2頁
微機接口課程設(shè)計報告_第3頁
微機接口課程設(shè)計報告_第4頁
微機接口課程設(shè)計報告_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

中國地質(zhì)大學(武漢)微機接口課程設(shè)計報告學院:計算機學院專業(yè):計算機科學與技術(shù)專業(yè)學生姓名:曹宏武班級:191083-04學號:20081001121設(shè)計地點:信息大樓610指導教師:熊幕舟老師團隊成員:趙逢洲、屈建偉、黃海猛完成日期:2011年2月20日利用步進電機模擬小車的運行需求分析及實驗目的:此次實驗的需求分析如下:計算每次加電代碼輸入步進電機以后小車(步進電機)行進的距離(弧度,并按照一定的比例換算成長度)利用8個開關(guān)設(shè)計8個檔位,其中一個倒檔,6個進檔,1個靜止檔,不同檔位設(shè)置不同的行進速度,其中出靜止檔外倒檔最低;在屏幕上顯示2個窗口,分別顯示小車當前的速度與行駛里程,其中行駛里程與程序運行的次數(shù)無關(guān);利用8個led顯示當前的檔位狀況,其中:倒檔時,某一個等閃爍靜止檔是,全部等閃爍另外設(shè)計一種小車的自動行駛模式,在這種模式下,小車不通過開關(guān)控制檔位,而通過一個窗口的輸入小車行進模式(請自行設(shè)計行進代碼),實現(xiàn)小車在不同檔位下運行的時間、次序。實驗要求同學能夠理解的0工作方式下通過時序?qū)Σ竭M電機的工作8255A流程的控制,同時將流水燈當作檔位的控制開關(guān),能夠更好的體現(xiàn)對接口芯片的控制過程,而自動方式控制步進電機的運轉(zhuǎn),題目非常的開放,能夠充分的發(fā)揮同學們的想象空間,同學們可以通過不同的編碼形式來完成這個題目。 設(shè)計2.08255A芯片簡介由于此次的設(shè)計涉及到8255A接口芯片的編程,因此在這里先對8255A的接口芯片做簡要的介紹:8255A是一個具有兩個8位和兩個4位并行I/O端口的接口芯片,它為Intle系列的CPU與外部設(shè)備之間提供TTL電平兼容的接口,以及需要同時兩位以上信息傳送的一切形式的并行接口。在學校的實驗平臺上它的命令口的地址為0x0c803,PA,PB,PC口的端口地址分別為0x0c800,0x0c801,0x0c802。其引腳圖和內(nèi)部框圖分別如下:2.1流水燈的控制平臺的介紹:在學校的實驗平臺上LED燈的端口地址是0x0c860,通過控制LED輸入電平的高低來控制LED燈的明與暗,而電平的高低是通過想端口寫的數(shù)據(jù)來體現(xiàn)的,例如向端口寫1就代表輸入的是高電平而0則代表的是低電平。因而要實現(xiàn)需求分析中的流水燈的各種功能,只需要控制各端口的電平的高低,也就是對端口寫數(shù)據(jù)的不同。燈的閃爍的實現(xiàn)就是在LED燈全明與全暗之間設(shè)置一個延遲,這樣觀察的效果就是閃爍,而從左至右和從右至左的變化是通過將初始值(10h和01h)進行向左移位或者向右移位即可。圖3:實驗平臺簡介 2.2設(shè)計思想:在以前的上機實驗中我們分別做過流水燈和步進電機的實驗,而且都成功的完成了這兩次實驗,因此此次課程設(shè)計算的上是對以前做的實驗的一次綜合,而創(chuàng)新點就在于在自動控制方式下編碼與解碼的問題,因此在設(shè)計思想中,手動控制這一塊我將只做簡要介紹,詳細介紹的是在自動控制中所采用的方法。手動控制:因為時間和速度都是按照一定的比例來完成的,所以不同檔位的實現(xiàn)也就是LED燈的控制開關(guān)在不同狀態(tài)下時延遲時間不同的控制,同時在不同的延遲時間下給每個檔位指定一個速度,延遲長的速度小,延遲短的速度大,這樣便能實現(xiàn)對不同檔位的控制,而燈的閃爍也只是在燈的明與暗之間加上一個延遲的時間便能完成,總體來說手動控制的大體思想較為簡單,而難點主要是在檔位切換的問題,開關(guān)的拔動和檔位的變換以及電機做出的反應(yīng)這期間的時間差應(yīng)該越小越好,因而在程序的書寫過程中我使用的Switch…Case…語句,電機每走一步就進行一次判斷,而不是用For循環(huán)來控制,這樣能將時間差縮短到很小的范圍內(nèi)。表1:相序表的設(shè)計繞組與數(shù)據(jù)線的連接及八拍數(shù)據(jù)的表示DCBAPA7PA6PA5PA4PA3PA2PA1PA00000010100010101000101000101010001010000010100010100000101000101自動控制:檔位的切換和LED燈的明暗控制和手動控制肯定是沒有什么區(qū)別的,而自動控制的主要難點在于對控制序列的定義及解析,也就是將不同的檔位及在該檔位下行進的步數(shù)進行的定義。我的解決思路是用abcdefgh八個不同的字母來分別表示不同的檔位,同時用數(shù)字表示在該檔位下運行的步驟,在得知檔位和數(shù)字后,就只需要用循環(huán)來控制在當前檔位下的行進步數(shù)便能完成在自動控制下的工作??刂菩蛄械妮斎朐谖业某绦蛑胁⒉皇怯贸S玫奈谋据斎耄▽嶒灪蟀l(fā)現(xiàn)文本輸入更為簡單而不需要進行數(shù)字的轉(zhuǎn)換,這里走了彎路,但是還是按照最初自己的設(shè)計思路來說明的),我是從編輯框的控件進行輸入的,由于編輯框的數(shù)據(jù)相當與字符串的類型,因而并不能對數(shù)字進行識別(即在編輯框中輸入123,程序中只能分別識別數(shù)字123而不是整數(shù)123而文本輸入便能解決這個問題,這就是我說的彎路所在),同時在序列輸入完畢后我會對該序列進行遍歷,如果遇到不是a~h或者不是0~9中的字符便提示該序列是非法序列,否則用兩個數(shù)組對字母或者數(shù)字分別進行存儲,同時用計數(shù)器進行計數(shù)來判別字母或者數(shù)字是否相對應(yīng),一個字母應(yīng)該相對應(yīng)的對應(yīng)一個數(shù)字,這樣才算完整的序列。序列判別完畢后,接下來的工作就是用序列來控制電機的自動運轉(zhuǎn),即控制在整數(shù)步驟內(nèi)完成相應(yīng)的電機運轉(zhuǎn)操作,具體的運轉(zhuǎn)操作還是和手動控制一樣。值得注意的是無論是自動測試還是手動測試,都要求用文件來保存小車行駛的里程,以便下次程序運行時開始重新調(diào)用,因此在程序中涉及到了讀、寫文件的操作,我的設(shè)計過程中,都是在電機沒運轉(zhuǎn)一步時便開始重新將里程寫入文件,而讀文件是在每次程序開始重新運行時。2.3基于MFC的程序具體的設(shè)計步驟:主程序框圖如下: 進入主程序主程序的設(shè)計框圖如下:進入主程序手動?手動?是否進入手動測試部分,用戶手動控制測序的測試過程用戶輸入運行序列,程序自動運行進入手動測試部分,用戶手動控制測序的測試過程用戶輸入運行序列,程序自動運行(2)詳細的設(shè)計步驟步驟1:創(chuàng)建基于對話框的MFC程序,同時將主對話框及作為程序的主登錄界面,給程序添加自動測試和手動測試的選擇按鈕,及進入測試的按鈕,如圖示:圖4:主程序界面步驟2:創(chuàng)建2個新的對話框分別作為手動測試和自動測試的主界面,同時都給對話框分別添加速度和里程顯示的編輯框以及進入測試的按鈕,同時MFC的頭文件中還必須添加#include"conio.h"的頭文件,以便對實驗中的端口地址進行調(diào)用。界面設(shè)置如圖示:圖5:各測試程序界面步驟3:完成相應(yīng)代碼部分的書寫調(diào)試分析調(diào)試過程中在手動控制這塊基本沒有什么問題,問題主要是集中在自動測試的過程中,這也和每個人的程序書寫有關(guān),由于我的程序不是用的文本來進行控制序列的輸入,因此在進行字符的轉(zhuǎn)換這一塊經(jīng)常一些沒想到的情況出現(xiàn),但是通過不斷的調(diào)試和老師的驗收,最后還是圓滿的完成了此次課程設(shè)計。4.實驗結(jié)果及收獲本次實驗一共是四個人一組,因此在糾錯方面能夠較為迅速的發(fā)現(xiàn)問題同時解決問題,在第二次實驗的時候我們組就已經(jīng)驗收了,這里也頗為自豪。實驗的過程印象較為深刻的是老師在檢查自動運轉(zhuǎn)這一塊,有幾次都是因為程序不夠嚴謹而犯了錯誤,因此在以后的程序書寫過程中應(yīng)該更加認真的審視自己的程序。同時此次實驗也是對MFC綜合應(yīng)用的一次鍛煉,在以后的學習中應(yīng)該自己多給自己創(chuàng)造一些這樣的機會,鍛煉自己學習的綜合運用能力。部分程序清單如下://不同狀態(tài)的定義typedefenum{s0,s1,s2,s3,s4,s5,s6,s7,s8,s9}State;//手動測試部分voidSpeed::OnButtonStart(){ //TODO:Addyourcontrolnotificationhandlercodehere fp=fopen("data.txt","r"); if(!feof(fp)) { fscanf(fp,"%d",&m_length); } _outp(0x0c803,0x80); while(1) { ReadDota(); if(flag==1) { flag=0; fp=fopen("data.txt","w"); fprintf(fp,"%d",m_length); MessageBox("本次測試結(jié)束,請重新開始!"); break; } switch(state) { cases0: flag=1; break; cases1: _outp(0x0c860,255); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases2: m_speed=60; m_length+=40; Right(); _outp(0x0c860,2); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases3: m_speed=70; m_length+=40; Right(); _outp(0x0c860,4); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases4: m_speed=80; m_length+=40; Right(); _outp(0x0c860,8); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases5: m_speed=90; m_length+=40; Right(); _outp(0x0c860,16); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases6: m_speed=100; m_length+=40; Right(); _outp(0x0c860,32); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases7: m_speed=120; m_length+=40; Right(); _outp(0x0c860,64); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases8: m_speed=40; m_length+=40; Left(); _outp(0x0c860,128); Sleep(300); _outp(0x0c860,0); Sleep(300); break; cases9: MessageBox("確定要換檔?"); break; default: break; } } }//初始化及檔位的判斷intSpeed::ReadDota(){ intk; k=_inp(0x0c860); if(k==0) state=s0; elseif(k==1) state=s1; elseif(k==2) { state=s2; dalay=1000; } elseif(k==4) { state=s3; dalay=800; } elseif(k==8) { state=s4; dalay=600; } elseif(k==16) { state=s5; dalay=400; } elseif(k==32) { state=s6; dalay=200; } elseif(k==64) { state=s7; dalay=100; } elseif(k==128) { state=s8; dalay=1500; } else state=s9; UpdateData(0); UpdateWindow(); return0;}//電機開始右轉(zhuǎn)intSpeed::Right(){ _outp(0x0c801,a[ii]); ii++; if(ii==8) ii=0; return0;}//電機開始左轉(zhuǎn)intSpeed::Left(){ _outp(0x0c801,a[jj]); jj--; if(jj==-1) jj=7; return0;}//自動測試部分///////////////////////////////////////////////////////////////////////////////Lengthmessagehandlers//對輸入的初始行進序列的判斷判斷是否合法如果合法則開始存儲運行voidLength::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere m_ceshi=""; fp1=fopen("data.txt","r"); if(!feof(fp1)) { fscanf(fp1,"%d",&m_length); } chars[1000]; intn; inti,j; charalp[200]; intnum[200],tmp=0; intcount1=0,count2=0,countN=0; intflag=0;//表示是數(shù)字1表示是字母 charz[10]; UpdateData(1); n=m_ceshi.GetLength(); itoa(n,z,10); MessageBox(z); s[0]=m_ceshi.GetAt(0); if(!(s[0]>=97&&s[0]<=104)) { MessageBox("非法序列monkey!"); m_ceshi=""; nimei(); return; } for(i=0;i<n;i++) { s[i]=m_ceshi.GetAt(i); if(s[i]>=97&&s[i]<=104) { if(flag==1) { MessageBox("非法序列biaoge!"); m_ceshi=""; nimei(); break; } if(countN!=0) { for(j=0;j<countN;j++) { intjj; jj=countN-j-1; tmp+=PanDuan(jj)*((int)s[i-countN+j]-48); } num[count2++]=tmp; tmp=0; countN=0; } alp[count1++]=s[i]; flag=1; countN=0; } elseif(s[i]>=48&&s[i]<=57) { countN++; flag=0; } else { MessageBox("非法序列mengge2!"); m_ceshi=""; nimei(); return; } if((i==(n-1))&&(flag==0)&&(s[i]>=48)&&(s[i]<=57)) { for(j=0;j<countN;j++) { intjj; jj=countN-j-1; tmp+=PanDuan(jj)*((int)s[i-countN+j+1]-48); } // MessageBox("wofuleni"); num[count2++]=tmp; tmp=0; // countN=0; } /*if(s[i]==97) { flag=0; } */ } if(flag==1) { MessageBox("非法序列mengge!"); m_ceshi=""; nimei(); return; } //itoa(count2,z,10); //MessageBox(z); /*for(i=0;i<count2;i++) { m_speed=num[i]; Sleep(300); nimei(); } for(i=0;i<count1;i++) { m_length=alp[i]; Sleep(300); nimei(); }*/ for(i=0;i<count1;i++) { ReadDota(alp[i]); SoGa(num[i]); } UpdateData(1); fp1=fopen("data.txt","w"); fprintf(fp1,"%d",m_length); }//刷新窗口intLength::nimei(){ UpdateData(0); UpdateWindow(); return0;}//主要用于在進行序列判斷時序列當前位數(shù)的識別intLength::PanDuan(int&n){ switch(n) { case0: return1; case1: return10; case2: return100; case3: return1000; case4: return10000; case5: return1000000; } return0;}//自動運行的主函數(shù)intLength::SoGa(intn){ inti; UpdateData(1); fp1=fopen("data.txt","r"); if(!feof(fp1)) { fscanf(fp1,"%d",&m_length); } _outp(0x0c803,0x80); for(i=0;i<n;i++) { switch(state) { caseS1: _outp(0x0c860,255); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS2: m_speed=60; m_length+=40; Right(); _outp(0x0c860,2); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS3: m_speed=70; m_length+=40; Right(); _outp(0x0c860,4); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS4: m_speed=80; m_length+=40; Right(); _outp(0x0c860,8); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS5: m_speed=90; m_length+=40; Right(); _outp(0x0c860,16); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS6: m_speed=100; m_length+=40; Right(); _outp(0x0c860,32); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS7: m_speed=120; m_length+=40; Right(); _outp(0x0c860,64); Sleep(300); _outp(0x0c860,0); Sleep(300); break; caseS8: m_speed=40; m_length+=40; Left(); _outp(0x0c860,128); Sleep(300); _outp(0x0c860,0); Sleep(300); break; //cases9: // MessageBox("確定要換檔?"); //break; default: break; } fp1=fopen("data.txt","w"); fprintf(fp1,"%d",m_length

溫馨提示

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

評論

0/150

提交評論