2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  微機(jī)應(yīng)用系統(tǒng)設(shè)計與綜合實驗設(shè)計報告</p><p>  設(shè)計題目 小型步進(jìn)電機(jī)控制系統(tǒng)設(shè)計 </p><p>  指導(dǎo)老師 </p><p>  設(shè)計者 </p><p>  專業(yè)班級

2、 </p><p>  學(xué) 號 </p><p>  設(shè)計日期 </p><p><b>  目錄</b></p><p>  摘要…………….……………

3、……………………………...…...3</p><p>  課程設(shè)計目的……………………………………….....…...4</p><p>  設(shè)計題目名稱及要求……………………………….....…….4</p><p>  實驗設(shè)備…………………………………………...…..…….4</p><p>  設(shè)計的思想和實施方案……………………

4、………..….…….5</p><p>  硬件原理圖…………………………………………………….11</p><p>  典型程序模塊及典型編程技巧…………………….…....…13</p><p>  課程設(shè)計中遇到的問題及解決方法………………...………16</p><p>  程序流程圖………………………………………….…......1

5、9</p><p>  匯編程序清單及程序注釋…………………………..…..……..23</p><p>  C語言程序清單及注釋………………………….……..…..…30</p><p>  收獲體會………………………………….………..……..…37</p><p>  參考文獻(xiàn)………………………………………..….…..……38<

6、/p><p><b>  摘 要</b></p><p>  在現(xiàn)代電子產(chǎn)品中,步進(jìn)電機(jī)廣泛應(yīng)用于ATM機(jī)、噴繪機(jī)、刻字機(jī)、寫真機(jī)、噴涂設(shè)備、醫(yī)療儀器及設(shè)備、計算機(jī)外設(shè)及海量存儲設(shè)備、精密儀器、工業(yè)控制系統(tǒng)、辦公自動化、機(jī)器人等領(lǐng)域。所以步進(jìn)電機(jī)的控制是一門很實用的技術(shù)。本實驗主要是基于唐都——PIT試驗箱的步進(jìn)電機(jī)控制的設(shè)計。主要使用到了并行接口電路8255、LED七段

7、數(shù)碼管電路、8086cpu、步進(jìn)電機(jī)等元件。主要是通過按鍵的不同來設(shè)置直流電機(jī)的轉(zhuǎn)速、運行狀態(tài)和方向。軟件部分采用了匯編語言編寫程序代碼和C語言編寫的步進(jìn)電機(jī)控制程序,通過判斷、跳轉(zhuǎn)、循環(huán)、延時等基本技術(shù)實現(xiàn)。</p><p>  此系統(tǒng)可以通過鍵盤輸入相關(guān)數(shù)據(jù), 并根據(jù)需要, 實時對步進(jìn)電機(jī)工作方式進(jìn)行設(shè)置, 具有實時性和交互性的特點。該設(shè)計可應(yīng)用于步進(jìn)電機(jī)控制的大多數(shù)場合</p><p&g

8、t;  關(guān)鍵詞: 步進(jìn)電動機(jī) 調(diào)速 方向控制 并行接口 七段數(shù)碼管</p><p>  小型步進(jìn)電機(jī)控制系統(tǒng)</p><p><b>  課程設(shè)計目的</b></p><p>  課程設(shè)計是本科教學(xué)全過程中的重要環(huán)節(jié)。《微機(jī)應(yīng)用系統(tǒng)設(shè)計與綜合實驗(實踐)》課程設(shè)計主要培養(yǎng)我們自動化專業(yè)學(xué)生,運用所學(xué)知識解決計算機(jī)應(yīng)用領(lǐng)域內(nèi)實際問題能力,進(jìn)

9、一步提高學(xué)生運用計算機(jī)編程語言綜合編程能力、程序調(diào)試技能和微機(jī)系統(tǒng)接口綜合應(yīng)用及電路設(shè)計能力。</p><p>  1、學(xué)習(xí)在PC系統(tǒng)中擴(kuò)展簡單的I/O接口的方法。</p><p>  2、熟練掌握和運用匯編和C語言編寫程序控制8255各口的輸入輸出,并正確帶動數(shù)碼管及步進(jìn)電機(jī);能熟練運用匯編和C語言實現(xiàn)8254的定時功能,以確保8255輸出的脈沖頻率穩(wěn)定。</p><

10、p>  3、熟練掌握ISA總線配置方式下硬件實驗的調(diào)試,并能獨立的排除故障,以確保實驗的順利進(jìn)行。</p><p>  4、.鞏固和加深課堂所學(xué)知識;</p><p>  5、學(xué)習(xí)掌握一般的軟硬件的設(shè)計方法和查閱、運用資料的能力;</p><p>  6、通過步進(jìn)電機(jī)控制系統(tǒng)設(shè)計與制作,深入了解與掌握步進(jìn)電機(jī)的運行方式、方向、速度、啟/停的控制。</p&

11、gt;<p>  設(shè)計的題目名稱及要求</p><p>  設(shè)計題目:小型步進(jìn)電機(jī)控制系統(tǒng)設(shè)計。</p><p><b>  設(shè)計要求:</b></p><p> ?。?)分別用C語言和匯編語言編程完成硬件接口功能設(shè)計;</p><p> ?。?)基于80x86微機(jī)接口硬件電路設(shè)計調(diào)試;</p>

12、<p> ?。?)控制功能要求:小鍵盤給定分段速度,數(shù)碼管顯示當(dāng)前步進(jìn)電機(jī)啟動與停止、方向、速度信息;</p><p> ?。?)具有本地與遠(yuǎn)程(串行方式下)功能。</p><p><b>  三、實驗設(shè)備</b></p><p>  PC機(jī)一臺(裝有TDPIT軟件)、唐都AEDK8688ET實驗箱。</p><

13、;p>  使用硬件:8086 PC,8255芯片,鍵盤數(shù)碼管,步進(jìn)電機(jī)驅(qū)動電路,步進(jìn)電機(jī)。</p><p>  系統(tǒng)設(shè)計:鍵盤采用實驗板提供的4*4鍵盤,使用4個數(shù)碼管實時顯示系統(tǒng)當(dāng)前狀態(tài)。</p><p>  四、設(shè)計的思想和實施方案</p><p>  4.1.2 步進(jìn)電機(jī)的工作原理</p><p>  步進(jìn)電機(jī)是將電脈沖信號轉(zhuǎn)變

14、為角位移或線位移的開環(huán)控制元件。在非超載的情況下,電機(jī)的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負(fù)載變化的影響,即給電機(jī)加一個脈沖信號,電機(jī)則轉(zhuǎn)過一個步距角。這一線性關(guān)系的存在,加上步進(jìn)電機(jī)只有周期性的誤差而無累積誤差等特點。使得在速度、位置等控制領(lǐng)域用步進(jìn)電機(jī)來控制變的非常的簡單。</p><p>  步進(jìn)電機(jī)動態(tài)指標(biāo)及術(shù)語: </p><p><b>  1、步

15、距角精度:</b></p><p>  步進(jìn)電機(jī)每轉(zhuǎn)過一個步距角的實際值與理論值的誤差。用百分比表示:誤差/步距角*100%。不同運行拍數(shù)其值不同,四拍運行時應(yīng)在5%之內(nèi),八拍運行時應(yīng)在15%以內(nèi)。</p><p><b>  2、失步:</b></p><p>  電機(jī)運轉(zhuǎn)時運轉(zhuǎn)的步數(shù),不等于理論上的步數(shù)。稱之為失步。</p

16、><p><b>  3、失調(diào)角:</b></p><p>  轉(zhuǎn)子齒軸線偏移定子齒軸線的角度,電機(jī)運轉(zhuǎn)必存在失調(diào)角,由失調(diào)角產(chǎn)生的誤差,采用細(xì)分驅(qū)動是不能解決的。</p><p>  4、電機(jī)正反轉(zhuǎn)控制:</p><p>  當(dāng)電機(jī)繞組通電時序為AB-BC-CD-DA或()時為正轉(zhuǎn),通電時序為DA-CA-BC-AB或()時

17、為反轉(zhuǎn)。</p><p><b>  驅(qū)動控制系統(tǒng)組成:</b></p><p>  使用、控制步進(jìn)電機(jī)必須由環(huán)形脈沖,功率放大等組成的控制系統(tǒng),其方框圖如下:</p><p><b>  脈沖信號的產(chǎn)生:</b></p><p>  脈沖信號一般由單片機(jī)或CPU產(chǎn)生,一般脈沖信號的占空比為0.3-

18、0.4左右,電機(jī)轉(zhuǎn)速越高,占空比則越大。</p><p>  下圖步進(jìn)電機(jī)為一四相步進(jìn)電機(jī),采用單極性直流電源供電。只要對步進(jìn)電機(jī)的各相繞組按合適的時序通電,就能使步進(jìn)電機(jī)步進(jìn)轉(zhuǎn)動。圖1是該四相反應(yīng)式步進(jìn)電機(jī)工作原理示意圖。 </p><p>  圖1 四相步進(jìn)電機(jī)步進(jìn)示意圖</p><p>  開始時,開關(guān)sb接通電源,sa、sc、sd斷開,b相磁極和轉(zhuǎn)子0、3號

19、齒對齊,同時,轉(zhuǎn)子的1、4號齒就和c、d相 </p><p>  繞組磁極產(chǎn)生錯齒,2、5號齒就和d、a相繞組磁極產(chǎn)生錯齒。</p><p>  當(dāng)開關(guān)sc接通電源,sb、sa、sd斷開時,由于c相繞組的磁力線和1、4號齒之間磁力線的作用,使轉(zhuǎn)子轉(zhuǎn)動,1、4號齒和c相繞組的磁極對齊。而0、3號齒和a、b相繞組產(chǎn)生錯齒,2、5號齒就和a、d相繞組磁極產(chǎn)生錯齒。依次類推,a、b、c、d四相繞組

20、輪流供電,則轉(zhuǎn)子會沿著a、b、c、d方向轉(zhuǎn)動。</p><p>  四相步進(jìn)電機(jī)按照通電順序的不同,可分為單四拍、雙四拍、八拍三種工作方式。單四拍與雙四拍的步距角相等,但單四拍的轉(zhuǎn)動力矩小。八拍工作方式的步距角是單四拍與雙四拍的一半,因此,八拍工作方式既可以保持較高的轉(zhuǎn)動力矩又可以提高控制精度。</p><p>  單四拍、雙四拍與八拍工作方式的電源通電時序與波形分別如圖2.a、b、c所示

21、:</p><p>  a. 單四拍 b. 雙四拍 c八拍</p><p>  圖2.步進(jìn)電機(jī)工作時序波形圖 </p><p>  4.1.2 8255A的功能簡介</p><p>  Intel 8086/8088 系列的可編程外設(shè)接口電路(Programmab

22、le Peripheral Interface)簡稱 PPI,型號為8255(改進(jìn)型為8255A及8255A-5),具有24條輸入/輸出引腳、可編程的通用并行輸入/輸出接口電路。它是一片使用單一+5V電源的40腳雙列直插式大規(guī)模集成電路。8255A的通用性強(qiáng),使用靈活,通過它CPU可直接與外設(shè)相連接。</p><p>  8255A在使用前要寫入一個方式控制字,選擇A、B、C三個端口各自的工作方式,共有三種;&l

23、t;/p><p>  方式0 :基本的輸入輸出方式,即無須聯(lián)絡(luò)就可以直接進(jìn)行的 I/O方式。其中A、B、C口的高四位或低四位可分別設(shè)置成輸入或輸出。</p><p>  方式1 :選通I/O,此時接口和外圍設(shè)備需聯(lián)絡(luò)信號進(jìn)行協(xié)調(diào),只有A口和B口可以工作在方式1,此時C口的某些線被規(guī)定為A口或B口與外圍設(shè)備的聯(lián)絡(luò)信號,余下的線只有基本的I/O功能,即只工作在方式0.</p><

24、;p>  方式2: 雙向I/O方式,只有A口可以工作在這種方式,該I/O線即可輸入又可輸出,此時C口有5條線被規(guī)定為A口和外圍設(shè)備的雙向聯(lián)絡(luò)線,C口剩下的三條線可作為B口方式1的聯(lián)絡(luò)線,也可以和B口一起方式0的I/O線。</p><p>  4.1.3 設(shè)計思想和實施方案</p><p>  初步設(shè)計的模塊圖如下:</p><p><b>  進(jìn)一

25、步的設(shè)計圖:</b></p><p>  本次設(shè)計,對8255的使用是這樣的:8255工作于方式0,A口低四位接鍵盤及數(shù)碼管顯示單元的X1~X4;C口低四位接鍵盤及數(shù)碼管顯示單元的Y1~Y4; C口高四位接步進(jìn)電路的驅(qū)動電路,使電機(jī)轉(zhuǎn)動起來;B口接數(shù)碼管的A、B、C、D、E、F、G和DP,以使數(shù)碼管顯示電機(jī)的轉(zhuǎn)向和轉(zhuǎn)速。8255的A口高四位本次課程設(shè)計沒有用到。</p><p>

26、;  此外,本次設(shè)計還用到了實驗箱中的鍵盤及數(shù)碼管顯示單元:</p><p>  方向鍵:控制步進(jìn)電機(jī)運行方向,無論電機(jī)處于運行或停止?fàn)顟B(tài),每按下一次,電機(jī)轉(zhuǎn)動方向反向;</p><p>  運行/暫停鍵:控制電機(jī)運行與否。電機(jī)轉(zhuǎn)動時按下,電機(jī)暫停,當(dāng)前電機(jī)運行參數(shù)不變,再次按下時,電機(jī)繼續(xù)按暫停前參數(shù)運行;</p><p>  停止鍵:無論電機(jī)處于任何狀態(tài),按下此

27、鍵,電機(jī)停止轉(zhuǎn)動,電機(jī)各運行參數(shù)復(fù)位,默認(rèn)參數(shù)為:“順時針,停止?fàn)顟B(tài),1檔”;</p><p>  檔位鍵:無論電機(jī)處于任何狀態(tài),均可設(shè)定電機(jī)檔位。</p><p><b>  數(shù)碼管顯示信息:</b></p><p>  左起第一個數(shù)碼管顯示當(dāng)前電機(jī)的運行狀態(tài):S(Stop)表示當(dāng)前電機(jī)為停止?fàn)顟B(tài);E(Enable)表示當(dāng)前電機(jī)為運行狀態(tài);P

28、(Pause)表示當(dāng)前電機(jī)為暫停狀態(tài)。</p><p>  第二個數(shù)碼管未使用,只有小數(shù)點點亮。</p><p>  第三個數(shù)碼管顯示電機(jī)運行方向:C(Clockwise)表示電機(jī)運行方向為順時針;A(Anti-clockwise)表示電機(jī)運行方向為逆時針。</p><p>  第四個數(shù)碼管顯示電機(jī)的檔位:1、2、3、4分別表示1、2、3、4檔。</p>

29、<p>  鍵盤數(shù)碼管內(nèi)部連線如下圖:</p><p><b>  五、硬件電路原理圖</b></p><p>  圖 步進(jìn)電機(jī)控制系統(tǒng)硬件電路原理</p><p>  如上圖示:該原理圖涉及到系統(tǒng)總線、可編程外圍接口芯片8255、鍵盤及數(shù)碼管顯示單元和步進(jìn)電機(jī)及其驅(qū)動電路.8255的D0~D7 依次接系統(tǒng)總線的XD0~XD7,A

30、1和A0依次接系統(tǒng)總線的XA3和XA2;WR和RD 依次接系統(tǒng)總線上的XIOW和XIOR;8255的CS接系統(tǒng)總線的IOY0, 8255的A口低四位PA0~PA4依次接小鍵盤的X1~X4(列);C口低四位PC0~PC3分別接小鍵盤的Y1~Y4(行); C口高四位PC4~PC7依次接驅(qū)動電路的A、B、C和D;B口PB0~PB7分別接數(shù)碼管的A、B、C、D、E、F、G和DP;A口高四位沒用到。</p><p><

31、;b>  圖 步進(jìn)電機(jī)模塊</b></p><p>  此模塊的主要功能是通過接收8255的C口輸入信號來控制步進(jìn)電機(jī)的轉(zhuǎn)動,A,B,C,D分別代表不同的四個相位,分別接入到PC0,PC1,PC2和PC3,實現(xiàn)轉(zhuǎn)動控制。</p><p><b>  圖 LED模塊</b></p><p>  六、典型程序模塊及典型編程技

32、巧分析</p><p><b>  1.主函數(shù)模塊</b></p><p>  主函數(shù)MAIN主要是綜合調(diào)用各子函數(shù),以完成對四項八拍步進(jìn)電機(jī)轉(zhuǎn)速</p><p>  和轉(zhuǎn)向的控制,并在數(shù)碼管上實時顯示電機(jī)的運行狀態(tài)、轉(zhuǎn)向和轉(zhuǎn)速檔位。</p><p>  本次設(shè)計的電機(jī)轉(zhuǎn)速分為四個檔,分為一二三四檔,在數(shù)碼管的檔位部分顯

33、示,分別顯示1,2,3,4。</p><p>  當(dāng)程序開始運行時,數(shù)碼管上顯示初始狀態(tài): S(停止),</p><p><b>  小數(shù)點(該位不用)</b></p><p><b>  C(順時針)</b></p><p><b>  1(速度為1檔)</b><

34、/p><p>  小鍵盤“0” 控制電機(jī)轉(zhuǎn)向:</p><p>  程序默認(rèn)初始態(tài)為C(順時針);按下該鍵,電機(jī)可以切換轉(zhuǎn)向,C(Clockwise)表示電機(jī)運行方向為順時針;A(Anti-clockwise)表示電機(jī)運行方向為逆時針。無論電機(jī)處于運行或停止?fàn)顟B(tài),每按下一次,電機(jī)轉(zhuǎn)動方向反向。 </p><p>  小鍵盤“1”控制電機(jī)開始和暫停兩個狀態(tài)之間的切換:&l

35、t;/p><p>  電機(jī)轉(zhuǎn)動時按下,電機(jī)暫停,當(dāng)前電機(jī)運行參數(shù)不變,再次按下時,電機(jī)繼續(xù)按暫停前參數(shù)運行。E(Enable)表示當(dāng)前電機(jī)為運行狀態(tài);P(Pause)表示當(dāng)前電機(jī)為暫停狀態(tài)。 </p><p>  小鍵盤“2”控制電機(jī)的停止復(fù)位(S:Stop):</p><p>  按下該鍵,電機(jī)停止轉(zhuǎn)動,并且恢復(fù)到初始參數(shù)狀態(tài)。</p><p&g

36、t;  小鍵盤“4”“5”“6”“7”控制電機(jī)的四個轉(zhuǎn)速檔位:</p><p>  當(dāng)按下這四個鍵時,分別是電機(jī)運行在1,2,3,4,轉(zhuǎn)速檔位。即實現(xiàn)了電機(jī)的調(diào)速,并且可以實現(xiàn)任意檔速的切換。</p><p>  2. 鍵盤掃描與顯示子程序模塊</p><p>  此子函數(shù)是用來掃描小鍵盤哪行哪列有鍵按下,當(dāng)確定某行某列有鍵按下時,再把相應(yīng)的鍵值保存起來。</

37、p><p>  小鍵盤有四行四列共16個按鍵,第一行從左到右依次是0~3;第二行從</p><p>  左到右依次是 4~7;第三行從左到右依次是 8~B;第二行從左到右依次是 C~F。</p><p>  為了實現(xiàn)判斷功能,在C語言中設(shè)置三個標(biāo)志位:</p><p>  1.運行狀態(tài)標(biāo)志MODE:0 = 停止(Stop);</p>

38、<p>  1 = 運行(Enable);</p><p>  2 = 暫停(Pause)。</p><p>  2.方向標(biāo)志DIR(Direction):</p><p>  0 = 逆時針(Anti-clockwise);</p><p>  1 = 順時針(Clockwise)。</p><p>  

39、3.檔位標(biāo)志GRD(Grade):</p><p><b>  1 = 1 檔;</b></p><p><b>  2 = 2檔;</b></p><p><b>  3 = 3檔;</b></p><p><b>  4 = 4檔。</b></p

40、><p>  數(shù)組a[]中存放數(shù)碼管的編碼,一次為:“S”、“E”、“P”、“A”、“C”、“1”、“2”、“3”、“4”、“.”。數(shù)組b[]中分別存放四個數(shù)碼管應(yīng)顯示的編碼在數(shù)組a[]中對應(yīng)的位置,例如:b[]的初值為:0,9,4,5,則數(shù)碼管會對應(yīng)顯示:“ S . C 1 ”。</p><p>  在匯編程序中,用DTABLE1中存放數(shù)碼管的編碼。[SI][SI+2][SI+4][SI+6

41、] 中分別存放四個數(shù)碼管應(yīng)顯示的編碼在DTABLE1中對應(yīng)的位置。與C程序中不同,匯編程序中取消了dir、mode、grd三個獨立的變量,而是直接用[SI][SI+4][SI+6]來代表,即:</p><p>  [SI]=0時,表示停止?fàn)顟B(tài);</p><p>  [SI]=1時,表示運行狀態(tài);</p><p>  [SI]=2時,表示暫停狀態(tài);</p>

42、<p>  [SI+4]=3時,表示方向為逆時針;</p><p>  [SI+4]=4時,表示方向為順時針;</p><p>  [SI+6]=5時,表示檔位為1檔;</p><p>  [SI+6]=6時,表示檔位為2檔;</p><p>  [SI+6]=7時,表示檔位為3檔;</p><p>  

43、[SI+6]=8時,表示檔位為4檔。</p><p>  首先保證使計數(shù)值i在0-7之間變化,若正轉(zhuǎn),則遞增;反轉(zhuǎn)則遞減。判斷是否運行,如運行,則跳出循環(huán),給步進(jìn)電機(jī)發(fā)驅(qū)動脈沖。</p><p>  3 .保存鍵值子程序</p><p>  此函數(shù)完成在按下小鍵盤按鍵后,將其相應(yīng)的電機(jī)運行狀態(tài)、轉(zhuǎn)向和轉(zhuǎn)速數(shù)值保存起來,以備其它子程序使用。</p>&l

44、t;p>  4. 掃描是否有按鍵閉合子程序</p><p>  此子函數(shù)用來掃描小鍵盤是否有鍵按下。通過8255的C口高四位,使X1~X4(列)全選通,然后由8255的C口低四位判斷各列所對應(yīng)的行是否有鍵安下,無任何鍵按下則C口低四位讀入的全是“1”,若有鍵按下則C口低四位讀入的對應(yīng)行是“0”,其余全是“1”,經(jīng)取反(NOT)后掃描小鍵盤的子程序CCSCAN的功能變?yōu)?若小鍵盤無鍵按下則AL寄存器數(shù)據(jù)為“0

45、”; 若小鍵盤有鍵按下則AL寄存器數(shù)據(jù)為非“0”。</p><p>  為減少引線,鍵盤采用矩陣式。鍵盤的識別采用行掃描法,程序使某行為低電平,則說明行列交叉點處的鍵被按下,然后,再具體確定按下的是哪個鍵。為此先使所在行輸出為0,再檢查列線是否有0。如果有零的話,此時由于不能確定閉合鍵所在的行,于是再用行掃描法來具體定位。如果讀得數(shù)據(jù)全部為1,則說明無鍵閉合。硬件上將8255端口C的上、下半部分分別用作鍵盤的行線

46、和列線。用電平邏輯開關(guān)輸出高低電平來代替鍵盤按鍵。</p><p>  5. 顯示鍵值子程序</p><p>  將保存示值子函數(shù)中保存下的電機(jī)運行狀態(tài)、轉(zhuǎn)向和轉(zhuǎn)速值送到數(shù)碼管上顯示。</p><p>  數(shù)碼管的段位順序如右圖所示:</p><p>  一般來說在一個字節(jié)中按照abcdefg dp的順序放置字型碼,比如在一個“共陰極”數(shù)碼管

47、上要顯示“1”,則b、c段需被點亮,因此在段選線中寫入60H。</p><p><b>  對應(yīng)規(guī)則:</b></p><p>  a----->D7 </p><p><b>  b----->D6</b></p><p><b>  c----->D5</b&

48、gt;</p><p>  d----->D4 </p><p>  e----->D3 </p><p><b>  f----->D2</b></p><p>  g----->D1 圖3-2

49、數(shù)碼管顯示</p><p><b>  dp---->D0</b></p><p>  LED顯示器的顯示方法有兩種——靜態(tài)顯示法和動態(tài)掃描顯示法。靜態(tài)顯示就是每一個顯示器各筆畫段都要獨占具有所存功能的輸出口線,CPU把要顯示的字符代碼送到輸出口上,就可以是顯示器顯示所需的數(shù)字后符號。但由于它站用的I/O口線較多,硬件成本高。所以我們選用了動態(tài)掃描顯示法。<

50、;/p><p>  6. 清除數(shù)碼管顯示子程序</p><p>  將段位置0即可清除數(shù)碼管顯示,即將00H分別送入A口(驅(qū)動LED燈和B口(驅(qū)動數(shù)碼管)便可實驗此功能</p><p>  7. 軟件延時子程序</p><p>  延時子函數(shù),可供別的程序調(diào)用以實現(xiàn)較好的顯示和操作效果。讀取鍵盤時要有一定的延時,來跳過鍵盤在剛按下時產(chǎn)生的抖動。&

51、lt;/p><p>  判斷檔位,進(jìn)行相應(yīng)的延時,注意延時的時候也應(yīng)每隔一定時間調(diào)用keyscan()鍵盤掃描及顯示程序,已保證及時響應(yīng)鍵盤輸入,和刷新數(shù)碼管,使數(shù)碼管常亮。</p><p>  應(yīng)注意調(diào)用子程序前要將CX與AX寄存器的內(nèi)容入棧進(jìn)行保護(hù)。</p><p>  七、課程設(shè)計中遇到的問題及解決方法</p><p>  在本次課程設(shè)計過

52、程中,我遇到了一下問題:</p><p>  首先,在顯示模塊中,在做數(shù)碼管顯示時,每次可以輸出四位信息,而且要輸出的字符須轉(zhuǎn)化為相應(yīng)的ASCII才行,否則就不能輸出想要的東西。顯示模塊的調(diào)試一般是程序問題,硬件連接很簡單,一般不會出錯,我在調(diào)試時,開始沒有初始化8255,導(dǎo)致結(jié)果不能輸出。再就是相應(yīng)的端口一定不能定義錯誤。這在顯示模塊調(diào)試中應(yīng)該多注意。</p><p>  在這里還有一個

53、比較難解決的問題,即調(diào)用了數(shù)碼管顯示程序而卻看不到數(shù)碼管有示數(shù),這主要是調(diào)用數(shù)碼管顯示子函數(shù)的頻率不夠高,可以把數(shù)碼管顯示子函數(shù)換個位置,或者是多調(diào)用幾次就可以解決了。至于數(shù)碼管好像是全亮,情況正好相反,是數(shù)碼管顯示子函數(shù)調(diào)用的頻率過高,把數(shù)碼管顯示子函數(shù)換個位置,或者是在關(guān)鍵位置調(diào)用一下延時函數(shù)就可以解決了。還有,DIS和CLEAR成對調(diào)用可使數(shù)碼管有個較好的顯示效果。</p><p>  在剛開始編程時,各種

54、功能大部分是由主程序來完成的。由于主程序過于復(fù)雜,可讀性不高。使得在以后的程序的調(diào)試中遇到了很大的麻煩。后來把主程序的部分功能轉(zhuǎn)化成子程序來實現(xiàn),并在一些重要的地方增加了注釋,使的程序的可讀性大大加強(qiáng)。調(diào)試也變的比較簡單了。</p><p>  其次,在使用小鍵盤時容易死機(jī)。出現(xiàn)死機(jī)的原因有很多,有時候同一個程序換臺機(jī)子運行就會死機(jī),有時候同一臺機(jī)子同一個程序運行多次就會死機(jī),不過總的來看死機(jī)的出現(xiàn)多少是和所編寫

55、的程序有關(guān),記得我以前用小鍵盤時就是很容易就死機(jī)了,不過在這次的課程設(shè)計中 我把所有的和小鍵盤有關(guān)的程序都用了子函數(shù)代替,大大簡化了主程序的結(jié)構(gòu),這樣就基本再也沒發(fā)生過死機(jī)現(xiàn)象了。</p><p>  再者,當(dāng)小鍵盤按下不松時電機(jī)也停止轉(zhuǎn)動這種情況出現(xiàn)在電機(jī)的加速、減速和改變轉(zhuǎn)向中,這主要是在原有的keyscan程序中有一段判斷按鍵是否彈起的程序,將此段換成一個合適的軟件延時便可以起到很好的效果(按鍵不松時可以連

56、續(xù)的加速和減速)。</p><p>  再就是寄存器的使用問題。在編程時,子程序的調(diào)試也是相當(dāng)重要,由于子程序不可避免的使用AX\BX\CX\DX通用寄存器一個或幾個。使得原主程序中的通用寄存器的內(nèi)容很容易被覆蓋,對子程序中所有的通用寄存器出入棧即可以避免上訴的問題,不用考慮使用的是哪幾個寄存器,使用起來又比較簡單方便。</p><p>  數(shù)碼轉(zhuǎn)換問題,首先查找許多相關(guān)的典型程序,例如:

57、</p><p>  十六位二進(jìn)制數(shù)轉(zhuǎn)換為10進(jìn)制BCD碼,可將AX中的二進(jìn)制數(shù)先后除以1000,100,10,每次除法所得的商,即是BCD的千位、百位和十位數(shù),余數(shù)是個位。</p><p>  TRAN: PUSH CX SHL DX,CL</p><p>  PUSH DX

58、 XCHG AL,AH</p><p>  SUB DX,DX SUB AH,AH</p><p>  MOV CX,1000 MOV CL,10</p><p>  DIV CX DIV CL</p><

59、p>  XCHG AX,DX ADD DL,AL</p><p>  MOV CL,4 MOV CL,4</p><p>  SHL DX,CL SHL DX,CL</p><p>  MOV CL,100

60、 ADD DL,AH</p><p>  DIV CL MOV AX,DX</p><p>  ADD DL,AL POP DX</p><p>  MOV CL,4 POP CX</p>&

61、lt;p>  而在算術(shù)運算方面也遇到了不少的問題,由于設(shè)計過程中存在著小數(shù)所以很多時候總會出現(xiàn)算術(shù)方面錯誤,具體表現(xiàn)為結(jié)果的溢出或者結(jié)果小數(shù)點位置錯誤。</p><p>  解決的方法通常是先將所要計算的數(shù)值乘以10、100等使得數(shù)值為整數(shù),然后再進(jìn)行計算,而在結(jié)果輸出時再除以相映的數(shù)值從而實現(xiàn)小數(shù)的算術(shù)運算功能,而不需要采用定義浮點型去計算小數(shù)以避免出現(xiàn)數(shù)值定義的錯誤。</p><p&

62、gt;  另一個常見的錯誤就是自定義存儲空間之間的數(shù)值存放,因為在許多時候總是需要將結(jié)果保存在某一段存儲空間里面,由于對存儲空間的定義使得其大小范圍各有不同,所以對其賦值時總是會出現(xiàn)溢出或數(shù)值轉(zhuǎn)換的錯誤。</p><p>  而在子程序調(diào)用以循環(huán)方面存在的問題是指針的計數(shù)以及標(biāo)志位清零或置1搞錯從而使子程序運算錯誤或者進(jìn)入死循環(huán)等。所采取的解決方法是對指針計數(shù)值在各個部分運算結(jié)束后進(jìn)行清零以保證指針初值的正確。&

63、lt;/p><p>  最后的問題就是DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用,因為本課題設(shè)計中要實現(xiàn)軟件時鐘,所以需要對軟件延遲以及中斷調(diào)用有一定的了解,對此在設(shè)計時查閱了一些相關(guān)的軟件中斷命令。</p><p>  當(dāng)個模塊都調(diào)試成功后,即可合成到一起運行。本系統(tǒng)電機(jī)的速度可以通過速度增減鍵來控制。通過驗證各按鍵是否被有效采用,來檢驗該系統(tǒng)是否正確的完成了指定的功能。</p>&

64、lt;p>  八、實驗程序的流程圖</p><p><b>  主流程圖:</b></p><p><b>  掃描與顯示流程圖:</b></p><p>  鍵盤顯示子程序流程圖:</p><p>  鍵盤掃描子程序流程圖:</p><p>  九、匯編程序清單及程序

65、注釋</p><p><b>  ;步進(jìn)電機(jī)實驗</b></p><p>  IOY0 EQU 0e400H ;片選IOY0對應(yīng)的端口始地址</p><p>  MY8255_A EQU IOY0+00H*4 ;8255的A口地址</p><p>  MY825

66、5_B EQU IOY0+01H*4 ;8255的B口地址</p><p>  MY8255_C EQU IOY0+02H*4 ;8255的C口地址</p><p>  MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址</p><p>  STACK1 SEGMENT STA

67、CK</p><p>  DW 256 DUP(?)</p><p>  STACK1 ENDS</p><p>  DATA SEGMENT</p><p>  DTABLE1 DB 6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80H</p><p>  DTABLE3 D

68、B 10H,30H,20H,60H,40H,0C0H,80H,90H</p><p>  DATA ENDS </p><p>  CODE SEGMENT</p><p>  ASSUME CS:CODE,DS:DATA</p><p>  START: MOV AX,DATA<

69、/p><p><b>  MOV DS,AX</b></p><p>  MOV SI,3000H</p><p>  MOV [SI],00H</p><p>  MOV [SI+2],09H</p><p>  MOV [SI+4],04H</p><p>  MOV [S

70、I+6],05H</p><p>  MOV [SI+8],01H</p><p>  MOV DX,MY8255_MODE ;初始化8255工作方式 </p><p>  MOV AL,81H ;方式0,A口、B口輸出,C口低4位輸入 </p><p><b>  OUT DX,A

71、L</b></p><p>  KAISHI:MOV SI,3000H </p><p>  MOV DH,[SI+8]</p><p><b>  CMP DH,8</b></p><p><b>  JA ZHI1</b></p><p><b>

72、  CMP DH,1</b></p><p><b>  JB ZHI8</b></p><p><b>  JMP JIXU</b></p><p>  ZHI1:MOV [SI+8],01H</p><p><b>  JMP JIXU</b></p&g

73、t;<p>  ZHI8:MOV [SI+8],08H</p><p>  JIXU:CALL KEYSCAN</p><p>  MOV AH,1 ;判斷是否有按鍵按下</p><p><b>  INT 16H</b></p><p>  JZ SFRUN

74、 ;無按鍵則跳回繼續(xù)循環(huán),有則退出</p><p>  QUIT: MOV AX,4C00H ;結(jié)束程序退出</p><p><b>  INT 21H</b></p><p>  SFRUN:MOV SI,3000H </p><p>  MO

75、V DH,[SI]</p><p>  CMP DH,01H</p><p><b>  JNZ JIXU</b></p><p>  MOV DH,[SI+4]</p><p>  CMP DH,04H</p><p>  JNZ ZIJIAN</p><p>  INC

76、 [SI+8]</p><p><b>  JMP RUN</b></p><p>  KAISHI1: JMP KAISHI</p><p>  ZIJIAN:DEC [SI+8]</p><p>  RUN:MOV AL,[SI+8]</p><p>  MOV BX,OFFSET DTA

77、BLE3</p><p>  AND AX,00FFH </p><p><b>  ADD BX,AX</b></p><p>  DEC BX </p><p>  MOV AL,[BX] </p><p>

78、  MOV DX,MY8255_C </p><p>  OUT DX,AL</p><p>  DANG1:MOV DH,[SI+6]</p><p>  CMP DH,05H</p><p><b>  JNZ DANG2</b></p><p><b>

79、;  PUSH CX</b></p><p>  MOV CX,10H</p><p>  DA1:CALL DALLY1</p><p>  CALL DALLY1</p><p>  CALL DALLY1</p><p>  CALL DALLY1</p><p>  CAL

80、L KEYSCAN</p><p>  JMP KAISHI</p><p>  DANG2:CMP DH,06H</p><p><b>  JNZ DANG3</b></p><p>  DA2:CALL DALLY1</p><p>  CALL DALLY1</p>&l

81、t;p>  CALL DALLY1</p><p>  JMP KAISHI</p><p>  DANG3:CMP DH,07H</p><p><b>  JNZ DANG4</b></p><p>  DA3:CALL DALLY1</p><p>  CALL DALLY1<

82、;/p><p>  JMP KAISHI</p><p>  DANG4:CMP DH,08H</p><p>  JNZ KAISHI1</p><p>  DA4:CALL DALLY1</p><p>  CALL KEYSCAN</p><p>  JMP KAISHI</p>

83、;<p>  DALLY1 PROC NEAR ;軟件延時子程序</p><p><b>  PUSH CX</b></p><p><b>  PUSH AX </b></p><p>  MOV CX,00AFH</p><p>  D11

84、:MOV AX,5000H</p><p>  D22:DEC AX</p><p><b>  JNZ D22</b></p><p><b>  PUSH CX</b></p><p><b>  PUSH AX</b></p><p> 

85、 CALL KEYSCAN</p><p><b>  POP AX</b></p><p><b>  POP CX</b></p><p><b>  LOOP D11</b></p><p><b>  POP AX</b></p>

86、<p><b>  POP CX</b></p><p><b>  RET</b></p><p>  DALLY1 ENDP</p><p>  KEYSCAN PROC NEAR ;鍵盤掃描子程序</p><p>  BEGIN:CAL

87、L DIS ;顯示刷新 </p><p>  CALL CLEAR ;清屏</p><p>  CALL CCSCAN ;掃描按鍵</p><p>  JNZ GETKEY1 ;有鍵按下則跳置GETK

88、EY1 </p><p>  JMP GOBACK1</p><p>  GETKEY1:CALL DIS ;顯示刷新</p><p>  CALL DALLY </p><p>  CALL DALLY</p><p>  CALL CLEA

89、R ;清屏</p><p>  CALL CCSCAN ;再次掃描按鍵</p><p>  JNZ GETKEY2 ;有鍵按下則跳置GETKEY2</p><p>  JMP BEGIN ;否則跳回開始繼續(xù)循環(huán)</p><

90、p>  GETKEY2:MOV CH,0FEH</p><p>  MOV CL,00H ;設(shè)置當(dāng)前檢測的是第幾列</p><p>  COLUM: MOV AL,CH ;選取一列,將X1~X4中一個置0 </p><p>  MOV DX,MY8255_A </p

91、><p><b>  OUT DX,AL</b></p><p>  MOV DX,MY8255_C ;讀Y1~Y4,用于判斷是哪一行按鍵閉合 </p><p><b>  IN AL,DX</b></p><p>  L1: TEST AL,01H

92、 ;是否為第1行</p><p>  JNZ L2 ;不是則繼續(xù)判斷 </p><p>  MOV AL,00H ;設(shè)置第1行第1列的對應(yīng)的鍵值</p><p><b>  JMP KCODE</b></p><p>  BEGIN1:JM

93、P BEGIN</p><p>  L2: TEST AL,02H ;是否為第2行</p><p>  JNZ L3 ;不是則繼續(xù)判斷</p><p>  MOV AL,04H ;設(shè)置第2行第1列的對應(yīng)的鍵值</p><p><

94、b>  JMP KCODE</b></p><p>  L3: TEST AL,04H ;是否為第3行</p><p>  JNZ L4 ;不是則繼續(xù)判斷</p><p>  MOV AL,08H ;設(shè)置第3行第1列的對應(yīng)的鍵值</p

95、><p><b>  JMP KCODE</b></p><p>  L4: TEST AL,08H ;是否為第4行</p><p>  JNZ NEXT ;不是則繼續(xù)判斷</p><p>  MOV AL,0CH ;設(shè)

96、置第4行第1列的對應(yīng)的鍵值</p><p>  KCODE: ADD AL,CL ;將第1列的值加上當(dāng)前列數(shù),確定按鍵值</p><p>  CALL PUTBUF ;保存按鍵值</p><p><b>  PUSH AX</b></p><p>  KO

97、N: CALL DIS ;顯示刷新</p><p>  CALL CLEAR ;清屏</p><p>  CALL CCSCAN ;掃描按鍵,判斷按鍵是否彈起</p><p>  JNZ KON ;未彈起則繼續(xù)循環(huán)等待彈起&l

98、t;/p><p><b>  POP AX</b></p><p>  NEXT: INC CL ;當(dāng)前檢測的列數(shù)遞增 </p><p><b>  MOV AL,CH</b></p><p>  TEST AL,08H

99、 ;檢測是否掃描到第4列</p><p>  JZ BEGIN1</p><p>  ROL AL,1 ;沒檢測到第4列則準(zhǔn)備檢測下一列</p><p><b>  MOV CH,AL</b></p><p><b>  JMP COLUM<

100、;/b></p><p>  GOBACK1:RET</p><p>  KEYSCAN ENDP</p><p>  CCSCAN PROC NEAR ;掃描是否有按鍵閉合子程序</p><p>  MOV AL,00H </p>

101、;<p>  MOV DX,MY8255_A ;將4列全選通,X1~X4置0</p><p><b>  OUT DX,AL</b></p><p>  MOV DX,MY8255_C </p><p>  IN AL,DX ;讀Y1~Y4</p><p

102、><b>  NOT AL</b></p><p>  AND AL,0FH ;取出Y1~Y4的反值</p><p><b>  RET</b></p><p>  CCSCAN ENDP</p><p>  CLEAR PROC NEAR

103、 ;清除數(shù)碼管顯示子程序</p><p>  MOV DX,MY8255_B ;段位置0即可清除數(shù)碼管顯示 </p><p>  MOV AL,00H</p><p><b>  OUT DX,AL</b></p><p><b>  RET</b><

104、/p><p>  CLEAR ENDP</p><p>  DIS PROC NEAR ;顯示鍵值子程序</p><p><b>  PUSH AX </b></p><p>  PUSH SI </p><p>  MOV

105、 SI,3006H </p><p>  MOV DL,0F7H</p><p><b>  MOV AL,DL</b></p><p>  AGAIN: PUSH DX</p><p>  MOV DX,MY8255_A </p><p&g

106、t;  OUT DX,AL ;設(shè)置X1~X4,選通一個數(shù)碼管 </p><p>  MOV AL,[SI] ;取出緩沖區(qū)中存放鍵值 </p><p>  MOV BX,OFFSET DTABLE1</p><p>  AND AX,00FFH</p>

107、<p>  ADD BX,AX </p><p>  MOV AL,[BX] </p><p>  MOV DX,MY8255_B </p><p>  OUT DX,AL ;寫入數(shù)碼管A~Dp</p><p>  CALL DALLY</p><p

108、><b>  DEC SI</b></p><p>  DEC SI ;取下一個鍵值</p><p><b>  POP DX</b></p><p><b>  MOV AL,DL</b></p><p>  TEST AL,01

109、H ;判斷是否顯示完?</p><p>  JZ OUT1 ;顯示完,返回</p><p>  ROR AL,1 </p><p><b>  MOV DL,AL</b></p><p>  JMP AGAIN

110、 ;未顯示完,跳回繼續(xù)</p><p>  OUT1: POP SI</p><p>  POP AX </p><p><b>  RET</b></p><p><b>  DIS ENDP</b></p><p&g

111、t;  PUTBUF PROC NEAR ;保存鍵值子程序</p><p>  MOV SI,3000H </p><p>  CMP AL,00H</p><p><b>  JNZ MODE</b></p><p>  DIR:CMP [SI+4],03H</p>

112、<p><b>  JZ DIR1</b></p><p>  MOV [SI+4],03H </p><p><b>  JMP LAST</b></p><p>  DIR1:MOV [SI+4],04H</p><p><b>  JMP LAST</

113、b></p><p>  MODE:CMP AL,01H</p><p><b>  JNZ STOP</b></p><p>  CMP [SI],01H</p><p><b>  JZ MODE1</b></p><p>  MOV [SI],01H</p

114、><p><b>  JMP LAST</b></p><p>  MODE1:MOV [SI],02H</p><p><b>  JMP LAST</b></p><p>  STOP:CMP AL,02H</p><p><b>  JNZ GRD1</

115、b></p><p>  MOV [SI],00H</p><p>  MOV [SI+4],04H</p><p>  MOV [SI+6],05H</p><p>  GRD1:CMP AL,04H</p><p><b>  JNZ GRD2</b></p><p

116、>  MOV [SI+6],05H</p><p>  GRD2:CMP AL,05H</p><p><b>  JNZ GRD3</b></p><p>  MOV [SI+6],06H</p><p>  GRD3:CMP AL,06H</p><p><b>  JNZ

117、 GRD4</b></p><p>  MOV [SI+6],07H</p><p>  GRD4:CMP AL,07H</p><p><b>  JNZ LAST</b></p><p>  MOV [SI+6],08H</p><p>  LAST:CALL DIS</

118、p><p>  CALL CLEAR</p><p>  CALL CCSCAN</p><p>  GOBACK: RET</p><p>  PUTBUF ENDP</p><p>  DALLY PROC NEAR ;軟件延時子程序</p><p><

119、;b>  PUSH CX</b></p><p>  MOV CX,00FFH</p><p>  D1: MOV AX,00FFH</p><p>  D2: DEC AX</p><p><b>  JNZ D2</b></p><p><b>  

120、LOOP D1</b></p><p><b>  POP CX</b></p><p><b>  RET</b></p><p>  DALLY ENDP</p><p><b>  CODE ENDS</b></p><p><b

121、>  END START</b></p><p><b>  十、C語言程序清單</b></p><p>  #include <stdio.h></p><p>  #include <stdlib.h></p><p>  #include <conio.h>&l

122、t;/p><p>  #include <bios.h></p><p>  #include <ctype.h></p><p>  #include <process.h></p><p>  void dis(void);</p><p>  void key(void);<

123、/p><p>  void clear(void);</p><p>  void ccscan(void);</p><p>  void action(void);</p><p>  void putbuf(void);</p><p>  void getkey(void);</p><p>

124、;  void delay0(int time);</p><p>  void keyscan(void);</p><p>  void delay1(int time);</p><p>  #define IOY0 0x0C400</p><p>  #define MY8255_A IOY0+0x00*4</p>

125、<p>  #define MY8255_B IOY0+0x01*4</p><p>  #define MY8255_C IOY0+0x02*4</p><p>  #define MY8255_MODE IOY0+0x03*4</p><p>  char a[]={0x6d,0x79,0x73,0x77,0x39,0x06,0x5b,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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論