版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
中國(guó)地質(zhì)大學(xué)(武漢)微機(jī)接口課程設(shè)計(jì)報(bào)告學(xué)院:計(jì)算機(jī)學(xué)院專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)學(xué)生姓名:曹宏武班級(jí):191083-04學(xué)號(hào):20081001121設(shè)計(jì)地點(diǎn):信息大樓610指導(dǎo)教師:熊幕舟老師團(tuán)隊(duì)成員:趙逢洲、屈建偉、黃海猛完成日期:2011年2月20日利用步進(jìn)電機(jī)模擬小車的運(yùn)行需求分析及實(shí)驗(yàn)?zāi)康模捍舜螌?shí)驗(yàn)的需求分析如下:計(jì)算每次加電代碼輸入步進(jìn)電機(jī)以后小車(步進(jìn)電機(jī))行進(jìn)的距離(弧度,并按照一定的比例換算成長(zhǎng)度)利用8個(gè)開關(guān)設(shè)計(jì)8個(gè)檔位,其中一個(gè)倒檔,6個(gè)進(jìn)檔,1個(gè)靜止檔,不同檔位設(shè)置不同的行進(jìn)速度,其中出靜止檔外倒檔最低;在屏幕上顯示2個(gè)窗口,分別顯示小車當(dāng)前的速度與行駛里程,其中行駛里程與程序運(yùn)行的次數(shù)無(wú)關(guān);利用8個(gè)led顯示當(dāng)前的檔位狀況,其中:倒檔時(shí),某一個(gè)等閃爍靜止檔是,全部等閃爍另外設(shè)計(jì)一種小車的自動(dòng)行駛模式,在這種模式下,小車不通過(guò)開關(guān)控制檔位,而通過(guò)一個(gè)窗口的輸入小車行進(jìn)模式(請(qǐng)自行設(shè)計(jì)行進(jìn)代碼),實(shí)現(xiàn)小車在不同檔位下運(yùn)行的時(shí)間、次序。實(shí)驗(yàn)要求同學(xué)能夠理解的0工作方式下通過(guò)時(shí)序?qū)Σ竭M(jìn)電機(jī)的工作8255A流程的控制,同時(shí)將流水燈當(dāng)作檔位的控制開關(guān),能夠更好的體現(xiàn)對(duì)接口芯片的控制過(guò)程,而自動(dòng)方式控制步進(jìn)電機(jī)的運(yùn)轉(zhuǎn),題目非常的開放,能夠充分的發(fā)揮同學(xué)們的想象空間,同學(xué)們可以通過(guò)不同的編碼形式來(lái)完成這個(gè)題目。 設(shè)計(jì)2.08255A芯片簡(jiǎn)介由于此次的設(shè)計(jì)涉及到8255A接口芯片的編程,因此在這里先對(duì)8255A的接口芯片做簡(jiǎn)要的介紹:8255A是一個(gè)具有兩個(gè)8位和兩個(gè)4位并行I/O端口的接口芯片,它為Intle系列的CPU與外部設(shè)備之間提供TTL電平兼容的接口,以及需要同時(shí)兩位以上信息傳送的一切形式的并行接口。在學(xué)校的實(shí)驗(yàn)平臺(tái)上它的命令口的地址為0x0c803,PA,PB,PC口的端口地址分別為0x0c800,0x0c801,0x0c802。其引腳圖和內(nèi)部框圖分別如下:2.1流水燈的控制平臺(tái)的介紹:在學(xué)校的實(shí)驗(yàn)平臺(tái)上LED燈的端口地址是0x0c860,通過(guò)控制LED輸入電平的高低來(lái)控制LED燈的明與暗,而電平的高低是通過(guò)想端口寫的數(shù)據(jù)來(lái)體現(xiàn)的,例如向端口寫1就代表輸入的是高電平而0則代表的是低電平。因而要實(shí)現(xiàn)需求分析中的流水燈的各種功能,只需要控制各端口的電平的高低,也就是對(duì)端口寫數(shù)據(jù)的不同。燈的閃爍的實(shí)現(xiàn)就是在LED燈全明與全暗之間設(shè)置一個(gè)延遲,這樣觀察的效果就是閃爍,而從左至右和從右至左的變化是通過(guò)將初始值(10h和01h)進(jìn)行向左移位或者向右移位即可。圖3:實(shí)驗(yàn)平臺(tái)簡(jiǎn)介 2.2設(shè)計(jì)思想:在以前的上機(jī)實(shí)驗(yàn)中我們分別做過(guò)流水燈和步進(jìn)電機(jī)的實(shí)驗(yàn),而且都成功的完成了這兩次實(shí)驗(yàn),因此此次課程設(shè)計(jì)算的上是對(duì)以前做的實(shí)驗(yàn)的一次綜合,而創(chuàng)新點(diǎn)就在于在自動(dòng)控制方式下編碼與解碼的問題,因此在設(shè)計(jì)思想中,手動(dòng)控制這一塊我將只做簡(jiǎn)要介紹,詳細(xì)介紹的是在自動(dòng)控制中所采用的方法。手動(dòng)控制:因?yàn)闀r(shí)間和速度都是按照一定的比例來(lái)完成的,所以不同檔位的實(shí)現(xiàn)也就是LED燈的控制開關(guān)在不同狀態(tài)下時(shí)延遲時(shí)間不同的控制,同時(shí)在不同的延遲時(shí)間下給每個(gè)檔位指定一個(gè)速度,延遲長(zhǎng)的速度小,延遲短的速度大,這樣便能實(shí)現(xiàn)對(duì)不同檔位的控制,而燈的閃爍也只是在燈的明與暗之間加上一個(gè)延遲的時(shí)間便能完成,總體來(lái)說(shuō)手動(dòng)控制的大體思想較為簡(jiǎn)單,而難點(diǎn)主要是在檔位切換的問題,開關(guān)的拔動(dòng)和檔位的變換以及電機(jī)做出的反應(yīng)這期間的時(shí)間差應(yīng)該越小越好,因而在程序的書寫過(guò)程中我使用的Switch…Case…語(yǔ)句,電機(jī)每走一步就進(jìn)行一次判斷,而不是用For循環(huán)來(lái)控制,這樣能將時(shí)間差縮短到很小的范圍內(nèi)。表1:相序表的設(shè)計(jì)繞組與數(shù)據(jù)線的連接及八拍數(shù)據(jù)的表示DCBAPA7PA6PA5PA4PA3PA2PA1PA00000010100010101000101000101010001010000010100010100000101000101自動(dòng)控制:檔位的切換和LED燈的明暗控制和手動(dòng)控制肯定是沒有什么區(qū)別的,而自動(dòng)控制的主要難點(diǎn)在于對(duì)控制序列的定義及解析,也就是將不同的檔位及在該檔位下行進(jìn)的步數(shù)進(jìn)行的定義。我的解決思路是用abcdefgh八個(gè)不同的字母來(lái)分別表示不同的檔位,同時(shí)用數(shù)字表示在該檔位下運(yùn)行的步驟,在得知檔位和數(shù)字后,就只需要用循環(huán)來(lái)控制在當(dāng)前檔位下的行進(jìn)步數(shù)便能完成在自動(dòng)控制下的工作。控制序列的輸入在我的程序中并不是用常用的文本輸入(實(shí)驗(yàn)后發(fā)現(xiàn)文本輸入更為簡(jiǎn)單而不需要進(jìn)行數(shù)字的轉(zhuǎn)換,這里走了彎路,但是還是按照最初自己的設(shè)計(jì)思路來(lái)說(shuō)明的),我是從編輯框的控件進(jìn)行輸入的,由于編輯框的數(shù)據(jù)相當(dāng)與字符串的類型,因而并不能對(duì)數(shù)字進(jìn)行識(shí)別(即在編輯框中輸入123,程序中只能分別識(shí)別數(shù)字123而不是整數(shù)123而文本輸入便能解決這個(gè)問題,這就是我說(shuō)的彎路所在),同時(shí)在序列輸入完畢后我會(huì)對(duì)該序列進(jìn)行遍歷,如果遇到不是a~h或者不是0~9中的字符便提示該序列是非法序列,否則用兩個(gè)數(shù)組對(duì)字母或者數(shù)字分別進(jìn)行存儲(chǔ),同時(shí)用計(jì)數(shù)器進(jìn)行計(jì)數(shù)來(lái)判別字母或者數(shù)字是否相對(duì)應(yīng),一個(gè)字母應(yīng)該相對(duì)應(yīng)的對(duì)應(yīng)一個(gè)數(shù)字,這樣才算完整的序列。序列判別完畢后,接下來(lái)的工作就是用序列來(lái)控制電機(jī)的自動(dòng)運(yùn)轉(zhuǎn),即控制在整數(shù)步驟內(nèi)完成相應(yīng)的電機(jī)運(yùn)轉(zhuǎn)操作,具體的運(yùn)轉(zhuǎn)操作還是和手動(dòng)控制一樣。值得注意的是無(wú)論是自動(dòng)測(cè)試還是手動(dòng)測(cè)試,都要求用文件來(lái)保存小車行駛的里程,以便下次程序運(yùn)行時(shí)開始重新調(diào)用,因此在程序中涉及到了讀、寫文件的操作,我的設(shè)計(jì)過(guò)程中,都是在電機(jī)沒運(yùn)轉(zhuǎn)一步時(shí)便開始重新將里程寫入文件,而讀文件是在每次程序開始重新運(yùn)行時(shí)。2.3基于MFC的程序具體的設(shè)計(jì)步驟:主程序框圖如下: 進(jìn)入主程序主程序的設(shè)計(jì)框圖如下:進(jìn)入主程序手動(dòng)?手動(dòng)?是否進(jìn)入手動(dòng)測(cè)試部分,用戶手動(dòng)控制測(cè)序的測(cè)試過(guò)程用戶輸入運(yùn)行序列,程序自動(dòng)運(yùn)行進(jìn)入手動(dòng)測(cè)試部分,用戶手動(dòng)控制測(cè)序的測(cè)試過(guò)程用戶輸入運(yùn)行序列,程序自動(dòng)運(yùn)行(2)詳細(xì)的設(shè)計(jì)步驟步驟1:創(chuàng)建基于對(duì)話框的MFC程序,同時(shí)將主對(duì)話框及作為程序的主登錄界面,給程序添加自動(dòng)測(cè)試和手動(dòng)測(cè)試的選擇按鈕,及進(jìn)入測(cè)試的按鈕,如圖示:圖4:主程序界面步驟2:創(chuàng)建2個(gè)新的對(duì)話框分別作為手動(dòng)測(cè)試和自動(dòng)測(cè)試的主界面,同時(shí)都給對(duì)話框分別添加速度和里程顯示的編輯框以及進(jìn)入測(cè)試的按鈕,同時(shí)MFC的頭文件中還必須添加#include"conio.h"的頭文件,以便對(duì)實(shí)驗(yàn)中的端口地址進(jìn)行調(diào)用。界面設(shè)置如圖示:圖5:各測(cè)試程序界面步驟3:完成相應(yīng)代碼部分的書寫調(diào)試分析調(diào)試過(guò)程中在手動(dòng)控制這塊基本沒有什么問題,問題主要是集中在自動(dòng)測(cè)試的過(guò)程中,這也和每個(gè)人的程序書寫有關(guān),由于我的程序不是用的文本來(lái)進(jìn)行控制序列的輸入,因此在進(jìn)行字符的轉(zhuǎn)換這一塊經(jīng)常一些沒想到的情況出現(xiàn),但是通過(guò)不斷的調(diào)試和老師的驗(yàn)收,最后還是圓滿的完成了此次課程設(shè)計(jì)。4.實(shí)驗(yàn)結(jié)果及收獲本次實(shí)驗(yàn)一共是四個(gè)人一組,因此在糾錯(cuò)方面能夠較為迅速的發(fā)現(xiàn)問題同時(shí)解決問題,在第二次實(shí)驗(yàn)的時(shí)候我們組就已經(jīng)驗(yàn)收了,這里也頗為自豪。實(shí)驗(yàn)的過(guò)程印象較為深刻的是老師在檢查自動(dòng)運(yùn)轉(zhuǎn)這一塊,有幾次都是因?yàn)槌绦虿粔驀?yán)謹(jǐn)而犯了錯(cuò)誤,因此在以后的程序書寫過(guò)程中應(yīng)該更加認(rèn)真的審視自己的程序。同時(shí)此次實(shí)驗(yàn)也是對(duì)MFC綜合應(yīng)用的一次鍛煉,在以后的學(xué)習(xí)中應(yīng)該自己多給自己創(chuàng)造一些這樣的機(jī)會(huì),鍛煉自己學(xué)習(xí)的綜合運(yùn)用能力。部分程序清單如下://不同狀態(tài)的定義typedefenum{s0,s1,s2,s3,s4,s5,s6,s7,s8,s9}State;//手動(dòng)測(cè)試部分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("本次測(cè)試結(jié)束,請(qǐng)重新開始!"); 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;}//電機(jī)開始右轉(zhuǎn)intSpeed::Right(){ _outp(0x0c801,a[ii]); ii++; if(ii==8) ii=0; return0;}//電機(jī)開始左轉(zhuǎn)intSpeed::Left(){ _outp(0x0c801,a[jj]); jj--; if(jj==-1) jj=7; return0;}//自動(dòng)測(cè)試部分///////////////////////////////////////////////////////////////////////////////Lengthmessagehandlers//對(duì)輸入的初始行進(jìn)序列的判斷判斷是否合法如果合法則開始存儲(chǔ)運(yùn)行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;}//主要用于在進(jìn)行序列判斷時(shí)序列當(dāng)前位數(shù)的識(shí)別intLength::PanDuan(int&n){ switch(n) { case0: return1; case1: return10; case2: return100; case3: return1000; case4: return10000; case5: return1000000; } return0;}//自動(dòng)運(yùn)行的主函數(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. 本站所有資源如無(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 婦科腫瘤的PET-CT評(píng)估
- 2025物業(yè)租賃合同格式范本
- 2024年江蘇省常州市中考數(shù)學(xué)真題卷及答案解析
- 個(gè)人外匯交易策略:市場(chǎng)分析
- 食品生產(chǎn)應(yīng)急管理預(yù)案-文書模板
- 林業(yè)保護(hù)基礎(chǔ)測(cè)繪計(jì)劃管理辦法
- 洗衣店鍋爐維修服務(wù)合同
- 賓館屋頂防水施工協(xié)議
- 國(guó)際教師簽證管理辦法
- 醫(yī)療資產(chǎn)捐贈(zèng)制度手冊(cè)
- 生命密碼-課件
- 幼兒園小班美術(shù)教案《做蛋糕》含反思
- 動(dòng)畫制作員職業(yè)技能鑒定考試題庫(kù)-下(多選、判斷題部分)
- 急救中心急救站點(diǎn)建設(shè)標(biāo)準(zhǔn)
- 高中化學(xué)《元素周期表和元素周期律的應(yīng)用》優(yōu)質(zhì)課教學(xué)設(shè)計(jì)、教案
- 工序標(biāo)準(zhǔn)工時(shí)及產(chǎn)能計(jì)算表
- 汽車后尾燈試驗(yàn)報(bào)告
- 住院HIS系統(tǒng)流程圖
- 田徑活動(dòng)記錄第一學(xué)期記錄
- 全國(guó)家庭教育工作評(píng)估方案
- 采購(gòu)部年終總結(jié)計(jì)劃PPT模板
評(píng)論
0/150
提交評(píng)論