版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
微機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與綜合實(shí)驗(yàn)設(shè)計(jì)報(bào)告設(shè)計(jì)題目小型步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì)指導(dǎo)老師設(shè)計(jì)者目錄摘要…………….…………...…...3課程設(shè)計(jì)目的…………...4設(shè)計(jì)題目名稱及要求…….4實(shí)驗(yàn)設(shè)備…………...…..…….4設(shè)計(jì)的思想和實(shí)施方案……………..….…….5硬件原理圖…………………….11典型程序模塊及典型編程技巧…….……13課程設(shè)計(jì)中遇到的問題及解決方法………………...………16程序流程圖………….…19匯編程序清單及程序注釋…………..…..……..23C語言程序清單及注釋………….……..…..…30收獲體會………………….………..……..…37參考文獻(xiàn)………..….…..……38摘要在現(xiàn)代電子產(chǎn)品中,步進(jìn)電機(jī)廣泛應(yīng)用于ATM機(jī)、噴繪機(jī)、刻字機(jī)、寫真機(jī)、噴涂設(shè)備、醫(yī)療儀器及設(shè)備、計(jì)算機(jī)外設(shè)及海量存儲設(shè)備、精密儀器、工業(yè)控制系統(tǒng)、辦公自動化、機(jī)器人等領(lǐng)域。所以步進(jìn)電機(jī)的控制是一門很實(shí)用的技術(shù)。本實(shí)驗(yàn)主要是基于唐都——PIT試驗(yàn)箱的步進(jìn)電機(jī)控制的設(shè)計(jì)。主要使用到了并行接口電路8255、LED七段數(shù)碼管電路、8086cpu、步進(jìn)電機(jī)等元件。主要是通過按鍵的不同來設(shè)置直流電機(jī)的轉(zhuǎn)速、運(yùn)行狀態(tài)和方向。軟件部分采用了匯編語言編寫程序代碼和C語言編寫的步進(jìn)電機(jī)控制程序,通過判斷、跳轉(zhuǎn)、循環(huán)、延時等基本技術(shù)實(shí)現(xiàn)。此系統(tǒng)可以通過鍵盤輸入相關(guān)數(shù)據(jù),并根據(jù)需要,實(shí)時對步進(jìn)電機(jī)工作方式進(jìn)行設(shè)置,具有實(shí)時性和交互性的特點(diǎn)。該設(shè)計(jì)可應(yīng)用于步進(jìn)電機(jī)控制的大多數(shù)場合關(guān)鍵詞:步進(jìn)電動機(jī)調(diào)速方向控制并行接口七段數(shù)碼管小型步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì)報(bào)告PAGE46/462010年12月27號小型步進(jìn)電機(jī)控制系統(tǒng)課程設(shè)計(jì)目的課程設(shè)計(jì)是本科教學(xué)全過程中的重要環(huán)節(jié)?!段C(jī)應(yīng)用系統(tǒng)設(shè)計(jì)與綜合實(shí)驗(yàn)(實(shí)踐)》課程設(shè)計(jì)主要培養(yǎng)我們自動化專業(yè)學(xué)生,運(yùn)用所學(xué)知識解決計(jì)算機(jī)應(yīng)用領(lǐng)域內(nèi)實(shí)際問題能力,進(jìn)一步提高學(xué)生運(yùn)用計(jì)算機(jī)編程語言綜合編程能力、程序調(diào)試技能和微機(jī)系統(tǒng)接口綜合應(yīng)用及電路設(shè)計(jì)能力。1、學(xué)習(xí)在PC系統(tǒng)中擴(kuò)展簡單的I/O接口的方法。2、熟練掌握和運(yùn)用匯編和C語言編寫程序控制8255各口的輸入輸出,并正確帶動數(shù)碼管及步進(jìn)電機(jī);能熟練運(yùn)用匯編和C語言實(shí)現(xiàn)8254的定時功能,以確保8255輸出的脈沖頻率穩(wěn)定。3、熟練掌握ISA總線配置方式下硬件實(shí)驗(yàn)的調(diào)試,并能獨(dú)立的排除故障,以確保實(shí)驗(yàn)的順利進(jìn)行。4、.鞏固和加深課堂所學(xué)知識;5、學(xué)習(xí)掌握一般的軟硬件的設(shè)計(jì)方法和查閱、運(yùn)用資料的能力;6、通過步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì)與制作,深入了解與掌握步進(jìn)電機(jī)的運(yùn)行方式、方向、速度、啟/停的控制。設(shè)計(jì)的題目名稱及要求設(shè)計(jì)題目:小型步進(jìn)電機(jī)控制系統(tǒng)設(shè)計(jì)。設(shè)計(jì)要求:(1)分別用C語言和匯編語言編程完成硬件接口功能設(shè)計(jì);(2)基于80x86微機(jī)接口硬件電路設(shè)計(jì)調(diào)試;(3)控制功能要求:小鍵盤給定分段速度,數(shù)碼管顯示當(dāng)前步進(jìn)電機(jī)啟動與停止、方向、速度信息;(4)具有本地與遠(yuǎn)程(串行方式下)功能。三、實(shí)驗(yàn)設(shè)備PC機(jī)一臺(裝有TDPIT軟件)、唐都AEDK8688ET實(shí)驗(yàn)箱。使用硬件:8086PC,8255芯片,鍵盤數(shù)碼管,步進(jìn)電機(jī)驅(qū)動電路,步進(jìn)電機(jī)。系統(tǒng)設(shè)計(jì):鍵盤采用實(shí)驗(yàn)板提供的4*4鍵盤,使用4個數(shù)碼管實(shí)時顯示系統(tǒng)當(dāng)前狀態(tài)。四、設(shè)計(jì)的思想和實(shí)施方案4.1.2步進(jìn)電機(jī)的工作原理步進(jìn)電機(jī)是將電脈沖信號轉(zhuǎn)變?yōu)榻俏灰苹蚓€位移的開環(huán)控制元件。在非超載的情況下,電機(jī)的轉(zhuǎn)速、停止的位置只取決于脈沖信號的頻率和脈沖數(shù),而不受負(fù)載變化的影響,即給電機(jī)加一個脈沖信號,電機(jī)則轉(zhuǎn)過一個步距角。這一線性關(guān)系的存在,加上步進(jìn)電機(jī)只有周期性的誤差而無累積誤差等特點(diǎn)。使得在速度、位置等控制領(lǐng)域用步進(jìn)電機(jī)來控制變的非常的簡單。步進(jìn)電機(jī)動態(tài)指標(biāo)及術(shù)語:1、步距角精度:步進(jìn)電機(jī)每轉(zhuǎn)過一個步距角的實(shí)際值與理論值的誤差。用百分比表示:誤差/步距角*100%。不同運(yùn)行拍數(shù)其值不同,四拍運(yùn)行時應(yīng)在5%之內(nèi),八拍運(yùn)行時應(yīng)在15%以內(nèi)。2、失步:電機(jī)運(yùn)轉(zhuǎn)時運(yùn)轉(zhuǎn)的步數(shù),不等于理論上的步數(shù)。稱之為失步。3、失調(diào)角:轉(zhuǎn)子齒軸線偏移定子齒軸線的角度,電機(jī)運(yùn)轉(zhuǎn)必存在失調(diào)角,由失調(diào)角產(chǎn)生的誤差,采用細(xì)分驅(qū)動是不能解決的。4、電機(jī)正反轉(zhuǎn)控制:當(dāng)電機(jī)繞組通電時序?yàn)锳B-BC-CD-DA或()時為正轉(zhuǎn),通電時序?yàn)镈A-CA-BC-AB或()時為反轉(zhuǎn)。驅(qū)動控制系統(tǒng)組成:使用、控制步進(jìn)電機(jī)必須由環(huán)形脈沖,功率放大等組成的控制系統(tǒng),其方框圖如下:脈沖信號的產(chǎn)生:脈沖信號一般由單片機(jī)或CPU產(chǎn)生,一般脈沖信號的占空比為0.3-0.4左右,電機(jī)轉(zhuǎn)速越高,占空比則越大。下圖步進(jìn)電機(jī)為一四相步進(jìn)電機(jī),采用單極性直流電源供電。只要對步進(jìn)電機(jī)的各相繞組按合適的時序通電,就能使步進(jìn)電機(jī)步進(jìn)轉(zhuǎn)動。圖1是該四相反應(yīng)式步進(jìn)電機(jī)工作原理示意圖。圖1四相步進(jìn)電機(jī)步進(jìn)示意圖開始時,開關(guān)sb接通電源,sa、sc、sd斷開,b相磁極和轉(zhuǎn)子0、3號齒對齊,同時,轉(zhuǎn)子的1、4號齒就和c、d相繞組磁極產(chǎn)生錯齒,2、5號齒就和d、a相繞組磁極產(chǎn)生錯齒。當(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四相繞組輪流供電,則轉(zhuǎn)子會沿著a、b、c、d方向轉(zhuǎn)動。四相步進(jìn)電機(jī)按照通電順序的不同,可分為單四拍、雙四拍、八拍三種工作方式。單四拍與雙四拍的步距角相等,但單四拍的轉(zhuǎn)動力矩小。八拍工作方式的步距角是單四拍與雙四拍的一半,因此,八拍工作方式既可以保持較高的轉(zhuǎn)動力矩又可以提高控制精度。單四拍、雙四拍與八拍工作方式的電源通電時序與波形分別如圖2.a、b、c所示:a.單四拍b.雙四拍c八拍圖2.步進(jìn)電機(jī)工作時序波形圖4.1.28255A的功能簡介Intel8086/8088系列的可編程外設(shè)接口電路(ProgrammablePeripheralInterface)簡稱PPI,型號為8255(改進(jìn)型為8255A及8255A-5),具有24條輸入/輸出引腳、可編程的通用并行輸入/輸出接口電路。它是一片使用單一+5V電源的40腳雙列直插式大規(guī)模集成電路。8255A的通用性強(qiáng),使用靈活,通過它CPU可直接與外設(shè)相連接。8255A在使用前要寫入一個方式控制字,選擇A、B、C三個端口各自的工作方式,共有三種;方式0:基本的輸入輸出方式,即無須聯(lián)絡(luò)就可以直接進(jìn)行的I/O方式。其中A、B、C口的高四位或低四位可分別設(shè)置成輸入或輸出。方式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.方式2:雙向I/O方式,只有A口可以工作在這種方式,該I/O線即可輸入又可輸出,此時C口有5條線被規(guī)定為A口和外圍設(shè)備的雙向聯(lián)絡(luò)線,C口剩下的三條線可作為B口方式1的聯(lián)絡(luò)線,也可以和B口一起方式0的I/O線。4.1.3設(shè)計(jì)思想和實(shí)施方案初步設(shè)計(jì)的模塊圖如下:步進(jìn)電機(jī)步進(jìn)電機(jī)8086CPULED數(shù)碼顯示模塊小鍵盤輸入模塊8255模塊進(jìn)一步的設(shè)計(jì)圖:電機(jī)狀態(tài)顯示模塊電機(jī)狀態(tài)顯示模塊CPU8255LED顯示模塊步進(jìn)電機(jī)模塊鍵盤掃描模塊本次設(shè)計(jì),對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è)計(jì)沒有用到。此外,本次設(shè)計(jì)還用到了實(shí)驗(yàn)箱中的鍵盤及數(shù)碼管顯示單元:方向鍵:控制步進(jìn)電機(jī)運(yùn)行方向,無論電機(jī)處于運(yùn)行或停止?fàn)顟B(tài),每按下一次,電機(jī)轉(zhuǎn)動方向反向;運(yùn)行/暫停鍵:控制電機(jī)運(yùn)行與否。電機(jī)轉(zhuǎn)動時按下,電機(jī)暫停,當(dāng)前電機(jī)運(yùn)行參數(shù)不變,再次按下時,電機(jī)繼續(xù)按暫停前參數(shù)運(yùn)行;停止鍵:無論電機(jī)處于任何狀態(tài),按下此鍵,電機(jī)停止轉(zhuǎn)動,電機(jī)各運(yùn)行參數(shù)復(fù)位,默認(rèn)參數(shù)為:“順時針,停止?fàn)顟B(tài),1檔”;檔位鍵:無論電機(jī)處于任何狀態(tài),均可設(shè)定電機(jī)檔位。數(shù)碼管顯示信息:左起第一個數(shù)碼管顯示當(dāng)前電機(jī)的運(yùn)行狀態(tài):S(Stop)表示當(dāng)前電機(jī)為停止?fàn)顟B(tài);E(Enable)表示當(dāng)前電機(jī)為運(yùn)行狀態(tài);P(Pause)表示當(dāng)前電機(jī)為暫停狀態(tài)。第二個數(shù)碼管未使用,只有小數(shù)點(diǎn)點(diǎn)亮。第三個數(shù)碼管顯示電機(jī)運(yùn)行方向:C(Clockwise)表示電機(jī)運(yùn)行方向?yàn)轫槙r針;A(Anti-clockwise)表示電機(jī)運(yùn)行方向?yàn)槟鏁r針。第四個數(shù)碼管顯示電機(jī)的檔位:1、2、3、4分別表示1、2、3、4檔。鍵盤數(shù)碼管內(nèi)部連線如下圖:五、硬件電路原理圖圖步進(jìn)電機(jī)控制系統(tǒng)硬件電路原理如上圖示:該原理圖涉及到系統(tǒng)總線、可編程外圍接口芯片8255、鍵盤及數(shù)碼管顯示單元和步進(jìn)電機(jī)及其驅(qū)動電路.8255的D0~D7依次接系統(tǒng)總線的XD0~XD7,A1和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口高四位沒用到。圖步進(jìn)電機(jī)模塊此模塊的主要功能是通過接收8255的C口輸入信號來控制步進(jìn)電機(jī)的轉(zhuǎn)動,A,B,C,D分別代表不同的四個相位,分別接入到PC0,PC1,PC2和PC3,實(shí)現(xiàn)轉(zhuǎn)動控制。圖LED模塊六、典型程序模塊及典型編程技巧分析1.主函數(shù)模塊主函數(shù)MAIN主要是綜合調(diào)用各子函數(shù),以完成對四項(xiàng)八拍步進(jìn)電機(jī)轉(zhuǎn)速和轉(zhuǎn)向的控制,并在數(shù)碼管上實(shí)時顯示電機(jī)的運(yùn)行狀態(tài)、轉(zhuǎn)向和轉(zhuǎn)速檔位。本次設(shè)計(jì)的電機(jī)轉(zhuǎn)速分為四個檔,分為一二三四檔,在數(shù)碼管的檔位部分顯示,分別顯示1,2,3,4。當(dāng)程序開始運(yùn)行時,數(shù)碼管上顯示初始狀態(tài):S(停止),小數(shù)點(diǎn)(該位不用)C(順時針)1(速度為1檔)小鍵盤“0”控制電機(jī)轉(zhuǎn)向:程序默認(rèn)初始態(tài)為C(順時針);按下該鍵,電機(jī)可以切換轉(zhuǎn)向,C(Clockwise)表示電機(jī)運(yùn)行方向?yàn)轫槙r針;A(Anti-clockwise)表示電機(jī)運(yùn)行方向?yàn)槟鏁r針。無論電機(jī)處于運(yùn)行或停止?fàn)顟B(tài),每按下一次,電機(jī)轉(zhuǎn)動方向反向。小鍵盤“1”控制電機(jī)開始和暫停兩個狀態(tài)之間的切換:電機(jī)轉(zhuǎn)動時按下,電機(jī)暫停,當(dāng)前電機(jī)運(yùn)行參數(shù)不變,再次按下時,電機(jī)繼續(xù)按暫停前參數(shù)運(yùn)行。E(Enable)表示當(dāng)前電機(jī)為運(yùn)行狀態(tài);P(Pause)表示當(dāng)前電機(jī)為暫停狀態(tài)。小鍵盤“2”控制電機(jī)的停止復(fù)位(S:Stop):按下該鍵,電機(jī)停止轉(zhuǎn)動,并且恢復(fù)到初始參數(shù)狀態(tài)。小鍵盤“4”“5”“6”“7”控制電機(jī)的四個轉(zhuǎn)速檔位:當(dāng)按下這四個鍵時,分別是電機(jī)運(yùn)行在1,2,3,4,轉(zhuǎn)速檔位。即實(shí)現(xiàn)了電機(jī)的調(diào)速,并且可以實(shí)現(xiàn)任意檔速的切換。2.鍵盤掃描與顯示子程序模塊此子函數(shù)是用來掃描小鍵盤哪行哪列有鍵按下,當(dāng)確定某行某列有鍵按下時,再把相應(yīng)的鍵值保存起來。小鍵盤有四行四列共16個按鍵,第一行從左到右依次是0~3;第二行從左到右依次是4~7;第三行從左到右依次是8~B;第二行從左到右依次是C~F。為了實(shí)現(xiàn)判斷功能,在C語言中設(shè)置三個標(biāo)志位:1.運(yùn)行狀態(tài)標(biāo)志MODE:0=停止(Stop);1=運(yùn)行(Enable);2=暫停(Pause)。2.方向標(biāo)志DIR(Direction):0=逆時針(Anti-clockwise);1=順時針(Clockwise)。3.檔位標(biāo)志GRD(Grade):1=1檔;2=2檔;3=3檔;4=4檔。數(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.C1”。在匯編程序中,用DTABLE1中存放數(shù)碼管的編碼。[SI][SI+2][SI+4][SI+6]中分別存放四個數(shù)碼管應(yīng)顯示的編碼在DTABLE1中對應(yīng)的位置。與C程序中不同,匯編程序中取消了dir、mode、grd三個獨(dú)立的變量,而是直接用[SI][SI+4][SI+6]來代表,即:[SI]=0時,表示停止?fàn)顟B(tài);[SI]=1時,表示運(yùn)行狀態(tài);[SI]=2時,表示暫停狀態(tài);[SI+4]=3時,表示方向?yàn)槟鏁r針;[SI+4]=4時,表示方向?yàn)轫槙r針;[SI+6]=5時,表示檔位為1檔;[SI+6]=6時,表示檔位為2檔;[SI+6]=7時,表示檔位為3檔;[SI+6]=8時,表示檔位為4檔。首先保證使計(jì)數(shù)值i在0-7之間變化,若正轉(zhuǎn),則遞增;反轉(zhuǎn)則遞減。判斷是否運(yùn)行,如運(yùn)行,則跳出循環(huán),給步進(jìn)電機(jī)發(fā)驅(qū)動脈沖。3.保存鍵值子程序此函數(shù)完成在按下小鍵盤按鍵后,將其相應(yīng)的電機(jī)運(yùn)行狀態(tài)、轉(zhuǎn)向和轉(zhuǎn)速數(shù)值保存起來,以備其它子程序使用。4.掃描是否有按鍵閉合子程序此子函數(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”;若小鍵盤有鍵按下則AL寄存器數(shù)據(jù)為非“0”。為減少引線,鍵盤采用矩陣式。鍵盤的識別采用行掃描法,程序使某行為低電平,則說明行列交叉點(diǎn)處的鍵被按下,然后,再具體確定按下的是哪個鍵。為此先使所在行輸出為0,再檢查列線是否有0。如果有零的話,此時由于不能確定閉合鍵所在的行,于是再用行掃描法來具體定位。如果讀得數(shù)據(jù)全部為1,則說明無鍵閉合。硬件上將8255端口C的上、下半部分分別用作鍵盤的行線和列線。用電平邏輯開關(guān)輸出高低電平來代替鍵盤按鍵。5.顯示鍵值子程序?qū)⒈4媸局底雍瘮?shù)中保存下的電機(jī)運(yùn)行狀態(tài)、轉(zhuǎn)向和轉(zhuǎn)速值送到數(shù)碼管上顯示。數(shù)碼管的段位順序如右圖所示:一般來說在一個字節(jié)中按照abcdefgdp的順序放置字型碼,比如在一個“共陰極”數(shù)碼管上要顯示“1”,則b、c段需被點(diǎn)亮,因此在段選線中寫入60H。對應(yīng)規(guī)則:a>D7 b>D6c>D5d>D4e>D3f>D2g>D1圖3-2數(shù)碼管顯示dp>D0LED顯示器的顯示方法有兩種——靜態(tài)顯示法和動態(tài)掃描顯示法。靜態(tài)顯示就是每一個顯示器各筆畫段都要獨(dú)占具有所存功能的輸出口線,CPU把要顯示的字符代碼送到輸出口上,就可以是顯示器顯示所需的數(shù)字后符號。但由于它站用的I/O口線較多,硬件成本高。所以我們選用了動態(tài)掃描顯示法。6.清除數(shù)碼管顯示子程序?qū)⒍挝恢?即可清除數(shù)碼管顯示,即將00H分別送入A口(驅(qū)動LED燈和B口(驅(qū)動數(shù)碼管)便可實(shí)驗(yàn)此功能7.軟件延時子程序延時子函數(shù),可供別的程序調(diào)用以實(shí)現(xiàn)較好的顯示和操作效果。讀取鍵盤時要有一定的延時,來跳過鍵盤在剛按下時產(chǎn)生的抖動。判斷檔位,進(jìn)行相應(yīng)的延時,注意延時的時候也應(yīng)每隔一定時間調(diào)用keyscan()鍵盤掃描及顯示程序,已保證及時響應(yīng)鍵盤輸入,和刷新數(shù)碼管,使數(shù)碼管常亮。應(yīng)注意調(diào)用子程序前要將CX與AX寄存器的內(nèi)容入棧進(jìn)行保護(hù)。七、課程設(shè)計(jì)中遇到的問題及解決方法在本次課程設(shè)計(jì)過程中,我遇到了一下問題:首先,在顯示模塊中,在做數(shù)碼管顯示時,每次可以輸出四位信息,而且要輸出的字符須轉(zhuǎn)化為相應(yīng)的ASCII才行,否則就不能輸出想要的東西。顯示模塊的調(diào)試一般是程序問題,硬件連接很簡單,一般不會出錯,我在調(diào)試時,開始沒有初始化8255,導(dǎo)致結(jié)果不能輸出。再就是相應(yīng)的端口一定不能定義錯誤。這在顯示模塊調(diào)試中應(yīng)該多注意。在這里還有一個比較難解決的問題,即調(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ù)碼管有個較好的顯示效果。在剛開始編程時,各種功能大部分是由主程序來完成的。由于主程序過于復(fù)雜,可讀性不高。使得在以后的程序的調(diào)試中遇到了很大的麻煩。后來把主程序的部分功能轉(zhuǎn)化成子程序來實(shí)現(xiàn),并在一些重要的地方增加了注釋,使的程序的可讀性大大加強(qiáng)。調(diào)試也變的比較簡單了。其次,在使用小鍵盤時容易死機(jī)。出現(xiàn)死機(jī)的原因有很多,有時候同一個程序換臺機(jī)子運(yùn)行就會死機(jī),有時候同一臺機(jī)子同一個程序運(yùn)行多次就會死機(jī),不過總的來看死機(jī)的出現(xiàn)多少是和所編寫的程序有關(guān),記得我以前用小鍵盤時就是很容易就死機(jī)了,不過在這次的課程設(shè)計(jì)中我把所有的和小鍵盤有關(guān)的程序都用了子函數(shù)代替,大大簡化了主程序的結(jié)構(gòu),這樣就基本再也沒發(fā)生過死機(jī)現(xiàn)象了。再者,當(dāng)小鍵盤按下不松時電機(jī)也停止轉(zhuǎn)動這種情況出現(xiàn)在電機(jī)的加速、減速和改變轉(zhuǎn)向中,這主要是在原有的keyscan程序中有一段判斷按鍵是否彈起的程序,將此段換成一個合適的軟件延時便可以起到很好的效果(按鍵不松時可以連續(xù)的加速和減速)。再就是寄存器的使用問題。在編程時,子程序的調(diào)試也是相當(dāng)重要,由于子程序不可避免的使用AX\BX\CX\DX通用寄存器一個或幾個。使得原主程序中的通用寄存器的內(nèi)容很容易被覆蓋,對子程序中所有的通用寄存器出入棧即可以避免上訴的問題,不用考慮使用的是哪幾個寄存器,使用起來又比較簡單方便。數(shù)碼轉(zhuǎn)換問題,首先查找許多相關(guān)的典型程序,例如:十六位二進(jìn)制數(shù)轉(zhuǎn)換為10進(jìn)制BCD碼,可將AX中的二進(jìn)制數(shù)先后除以1000,100,10,每次除法所得的商,即是BCD的千位、百位和十位數(shù),余數(shù)是個位。TRAN:PUSHCXSHLDX,CLPUSHDXXCHGAL,AHSUBDX,DXSUBAH,AHMOVCX,1000MOVCL,10DIVCXDIVCLXCHGAX,DXADDDL,ALMOVCL,4MOVCL,4SHLDX,CLSHLDX,CLMOVCL,100ADDDL,AHDIVCLMOVAX,DXADDDL,ALPOPDXMOVCL,4POPCX而在算術(shù)運(yùn)算方面也遇到了不少的問題,由于設(shè)計(jì)過程中存在著小數(shù)所以很多時候總會出現(xiàn)算術(shù)方面錯誤,具體表現(xiàn)為結(jié)果的溢出或者結(jié)果小數(shù)點(diǎn)位置錯誤。解決的方法通常是先將所要計(jì)算的數(shù)值乘以10、100等使得數(shù)值為整數(shù),然后再進(jìn)行計(jì)算,而在結(jié)果輸出時再除以相映的數(shù)值從而實(shí)現(xiàn)小數(shù)的算術(shù)運(yùn)算功能,而不需要采用定義浮點(diǎn)型去計(jì)算小數(shù)以避免出現(xiàn)數(shù)值定義的錯誤。另一個常見的錯誤就是自定義存儲空間之間的數(shù)值存放,因?yàn)樵谠S多時候總是需要將結(jié)果保存在某一段存儲空間里面,由于對存儲空間的定義使得其大小范圍各有不同,所以對其賦值時總是會出現(xiàn)溢出或數(shù)值轉(zhuǎn)換的錯誤。而在子程序調(diào)用以循環(huán)方面存在的問題是指針的計(jì)數(shù)以及標(biāo)志位清零或置1搞錯從而使子程序運(yùn)算錯誤或者進(jìn)入死循環(huán)等。所采取的解決方法是對指針計(jì)數(shù)值在各個部分運(yùn)算結(jié)束后進(jìn)行清零以保證指針初值的正確。最后的問題就是DOS系統(tǒng)功能調(diào)用和BIOS中斷調(diào)用,因?yàn)楸菊n題設(shè)計(jì)中要實(shí)現(xiàn)軟件時鐘,所以需要對軟件延遲以及中斷調(diào)用有一定的了解,對此在設(shè)計(jì)時查閱了一些相關(guān)的軟件中斷命令。當(dāng)個模塊都調(diào)試成功后,即可合成到一起運(yùn)行。本系統(tǒng)電機(jī)的速度可以通過速度增減鍵來控制。通過驗(yàn)證各按鍵是否被有效采用,來檢驗(yàn)該系統(tǒng)是否正確的完成了指定的功能。八、實(shí)驗(yàn)程序的流程圖電機(jī)停止轉(zhuǎn)動鍵值為0?電機(jī)停止轉(zhuǎn)動鍵值為0?延時等待仍在按下?初始化8255開始小鍵盤有鍵按下?改變電機(jī)轉(zhuǎn)向(速度置最低)電機(jī)運(yùn)行電機(jī)速度方向不變電機(jī)暫停鍵值為2?鍵值為3?鍵值為4~7結(jié)束小鍵盤有鍵按下?鍵值為1?數(shù)碼管同步顯示電機(jī)的狀態(tài)、轉(zhuǎn)速和方向否否是是否否否是否是是是 電機(jī)速度檔位否是否是否是是是否否電機(jī)速度檔位否是否是否是是是否否掃描與顯示流程圖:鍵盤顯示子程序流程圖:鍵盤掃描子程序流程圖:九、匯編程序清單及程序注釋;步進(jìn)電機(jī)實(shí)驗(yàn)IOY0EQU0e400H;片選IOY0對應(yīng)的端口始地址MY8255_AEQUIOY0+00H*4;8255的A口地址MY8255_BEQUIOY0+01H*4;8255的B口地址MY8255_CEQUIOY0+02H*4;8255的C口地址MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDATA SEGMENTDTABLE1DB6DH,79H,73H,77H,39H,06H,5BH,4FH,66H,80HDTABLE3DB10H,30H,20H,60H,40H,0C0H,80H,90HDATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,3000HMOV[SI],00HMOV[SI+2],09HMOV[SI+4],04HMOV[SI+6],05HMOV[SI+8],01HMOVDX,MY8255_MODE;初始化8255工作方式MOVAL,81H;方式0,A口、B口輸出,C口低4位輸入OUTDX,ALKAISHI: MOVSI,3000HMOVDH,[SI+8]CMPDH,8JAZHI1CMPDH,1JBZHI8JMPJIXUZHI1: MOV[SI+8],01HJMPJIXUZHI8: MOV[SI+8],08HJIXU: CALLKEYSCANMOVAH,1;判斷是否有按鍵按下INT16HJZSFRUN;無按鍵則跳回繼續(xù)循環(huán),有則退出QUIT:MOVAX,4C00H;結(jié)束程序退出INT21HSFRUN: MOVSI,3000HMOVDH,[SI]CMPDH,01HJNZJIXU MOVDH,[SI+4] CMPDH,04H JNZZIJIAN INC[SI+8] JMPRUNKAISHI1:JMPKAISHIZIJIAN: DEC[SI+8]RUN: MOVAL,[SI+8] MOVBX,OFFSETDTABLE3ANDAX,00FFH ADDBX,AX DECBX MOVAL,[BX]MOVDX,MY8255_COUTDX,AL DANG1: MOVDH,[SI+6] CMPDH,05H JNZDANG2 PUSHCX MOVCX,10HDA1: CALLDALLY1 CALLDALLY1 CALLDALLY1 CALLDALLY1CALLKEYSCAN JMPKAISHIDANG2: CMPDH,06H JNZDANG3DA2: CALLDALLY1 CALLDALLY1 CALLDALLY1 JMPKAISHIDANG3: CMPDH,07H JNZDANG4DA3: CALLDALLY1 CALLDALLY1 JMPKAISHIDANG4: CMPDH,08H JNZKAISHI1DA4: CALLDALLY1 CALLKEYSCAN JMPKAISHIDALLY1PROCNEAR;軟件延時子程序PUSHCXPUSHAXMOVCX,00AFHD11: MOVAX,5000HD22: DECAXJNZD22PUSHCXPUSHAXCALLKEYSCANPOPAXPOPCXLOOPD11POPAXPOPCX RET DALLY1ENDPKEYSCANPROCNEAR;鍵盤掃描子程序BEGIN: CALLDIS;顯示刷新 CALLCLEAR;清屏 CALLCCSCAN;掃描按鍵 JNZGETKEY1;有鍵按下則跳置GETKEY1 JMPGOBACK1GETKEY1:CALLDIS;顯示刷新CALLDALLYCALLDALLYCALLCLEAR;清屏 CALLCCSCAN;再次掃描按鍵 JNZGETKEY2;有鍵按下則跳置GETKEY2 JMPBEGIN;否則跳回開始繼續(xù)循環(huán)GETKEY2:MOVCH,0FEH MOVCL,00H;設(shè)置當(dāng)前檢測的是第幾列COLUM:MOVAL,CH;選取一列,將X1~X4中一個置0MOVDX,MY8255_A OUTDX,ALMOVDX,MY8255_C;讀Y1~Y4,用于判斷是哪一行按鍵閉合 INAL,DXL1:TESTAL,01H;是否為第1行JNZL2;不是則繼續(xù)判斷MOVAL,00H;設(shè)置第1行第1列的對應(yīng)的鍵值 JMPKCODEBEGIN1: JMPBEGINL2:TESTAL,02H;是否為第2行JNZL3;不是則繼續(xù)判斷MOVAL,04H;設(shè)置第2行第1列的對應(yīng)的鍵值JMPKCODEL3:TESTAL,04H;是否為第3行JNZL4;不是則繼續(xù)判斷MOVAL,08H;設(shè)置第3行第1列的對應(yīng)的鍵值 JMPKCODEL4:TESTAL,08H;是否為第4行JNZNEXT;不是則繼續(xù)判斷MOVAL,0CH;設(shè)置第4行第1列的對應(yīng)的鍵值KCODE:ADDAL,CL;將第1列的值加上當(dāng)前列數(shù),確定按鍵值 CALLPUTBUF;保存按鍵值 PUSHAXKON:CALLDIS;顯示刷新 CALLCLEAR;清屏 CALLCCSCAN;掃描按鍵,判斷按鍵是否彈起 JNZKON;未彈起則繼續(xù)循環(huán)等待彈起 POPAXNEXT:INCCL;當(dāng)前檢測的列數(shù)遞增 MOVAL,CH TESTAL,08H;檢測是否掃描到第4列 JZBEGIN1 ROLAL,1;沒檢測到第4列則準(zhǔn)備檢測下一列 MOVCH,AL JMPCOLUMGOBACK1: RETKEYSCANENDPCCSCANPROCNEAR;掃描是否有按鍵閉合子程序MOVAL,00HMOVDX,MY8255_A;將4列全選通,X1~X4置0 OUTDX,ALMOVDX,MY8255_CINAL,DX;讀Y1~Y4 NOTALANDAL,0FH;取出Y1~Y4的反值 RETCCSCANENDPCLEARPROCNEAR;清除數(shù)碼管顯示子程序MOVDX,MY8255_B;段位置0即可清除數(shù)碼管顯示MOVAL,00HOUTDX,AL RETCLEARENDPDISPROCNEAR;顯示鍵值子程序PUSHAXPUSHSI MOVSI,3006H MOVDL,0F7H MOVAL,DLAGAIN:PUSHDXMOVDX,MY8255_AOUTDX,AL;設(shè)置X1~X4,選通一個數(shù)碼管MOVAL,[SI];取出緩沖區(qū)中存放鍵值MOVBX,OFFSETDTABLE1 ANDAX,00FFH ADDBX,AX MOVAL,[BX]MOVDX,MY8255_B OUTDX,AL;寫入數(shù)碼管A~Dp CALLDALLY DECSI DECSI;取下一個鍵值POPDXMOVAL,DL TESTAL,01H;判斷是否顯示完?JZOUT1;顯示完,返回 RORAL,1 MOVDL,AL JMPAGAIN;未顯示完,跳回繼續(xù)OUT1:POPSI POPAX RETDIS ENDPPUTBUFPROCNEAR;保存鍵值子程序MOVSI,3000H CMPAL,00H JNZMODEDIR: CMP[SI+4],03H JZDIR1MOV[SI+4],03HJMPLASTDIR1: MOV[SI+4],04HJMPLASTMODE: CMPAL,01H JNZSTOP CMP[SI],01H JZMODE1 MOV[SI],01H JMPLASTMODE1: MOV[SI],02HJMPLASTSTOP: CMPAL,02H JNZGRD1 MOV[SI],00H MOV[SI+4],04H MOV[SI+6],05HGRD1: CMPAL,04H JNZGRD2 MOV[SI+6],05HGRD2: CMPAL,05H JNZGRD3 MOV[SI+6],06HGRD3: CMPAL,06H JNZGRD4 MOV[SI+6],07HGRD4: CMPAL,07H JNZLAST MOV[SI+6],08HLAST: CALLDIS CALLCLEAR CALLCCSCANGOBACK:RETPUTBUFENDPDALLYPROCNEAR;軟件延時子程序PUSHCXMOVCX,00FFHD1:MOVAX,00FFHD2:DECAX JNZD2 LOOPD1 POPCX RETDALLYENDPCODEENDSENDSTART十、C語言程序清單#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<bios.h>#include<ctype.h>#include<process.h>voiddis(void);voidkey(void);voidclear(void);voidccscan(void);voidaction(void);voidputbuf(void);voidgetkey(void);voiddelay0(inttime);voidkeyscan(void);voiddelay1(inttime);#defineIOY00x0C400#defineMY8255_AIOY0+0x00*4#defineMY8255_BIOY0+0x01*4#defineMY8255_CIOY0+0x02*4#defineMY8255_MODEIOY0+0x03*4chara[]={0x6d,0x79,0x73,0x77,0x39,0x06,0x5b,0x4f,0x66,0x80};charb[]={0x00,0x09,0x04,0x05};charc[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};intdir=1;intmode=0;intgrd=1;intcc;intn;voidmain(){inti=0;intj;outp(MY8255_MODE,0x81);while(1){while((i<=7)&&(i>=0)){while(1){keyscan();if(mode==1)break;key();}if(dir==1)i++;if(dir==0)i--;outp(MY8255_C,c[i]);if(grd==4)for(j=500;j>0;j--){delay1(0x10);keyscan();}if(grd==3)for(j=1000;j>0;j--){delay1(0x10);keyscan();}if(grd==2)for(j=3000;j>0;j--){delay1(0x10);keyscan();}if(grd==1)for(j=5000;j>0;j--){delay1(0x10);keyscan();}key();}if(i>7)i=0;if(i<0)i=7;}}voiddelay1(inttime){inti;intj;for(i=0;i<=time;i++){for(j=0;j<=0x700;j++){}}return;}voidkeyscan(){dis();clear();ccscan();if(cc){dis();delay0(0x100);delay0(0x100);clear();ccscan();if(cc){getkey();putbuf();}}key();}voidgetkey(void){inti;intj=0xfe;for(i=0;i<=3;i++){outp(MY8255_A,j);if(!((inp(MY8255_C))&0x01)){n=i+0;action();return;}if(!((inp(MY8255_C))&0x02)){n=i+4;action();return;}if(!((inp(MY8255_C))&0x04)){n=i+8;action();return;}if(!((inp(MY8255_C))&0x08)){n=i+12;action();return;}j<<=1;}}voidccscan(void){outp(MY8255_A,0x00);cc=inp(MY8255_C);cc=(~cc)&0x0F;}voiddis(void){inti;intj=0xf7;for(i=3;i>=0;i--){outp(MY8255_A,j);out
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 濱州職業(yè)學(xué)院《服飾搭配藝術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 畢節(jié)工業(yè)職業(yè)技術(shù)學(xué)院《有機(jī)化學(xué)(上)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度智能機(jī)器人技術(shù)研發(fā)與應(yīng)用技術(shù)服務(wù)合同2篇
- 策劃服務(wù)合同書
- 購銷合同中英文版本
- 大件玩具出租合同
- 2025年新型快遞柜運(yùn)營管理合同書3篇
- 建筑安裝工程專業(yè)分包合同
- 學(xué)生會體育部工作計(jì)劃15篇
- 北京語言大學(xué)《高等代數(shù)選講》2023-2024學(xué)年第一學(xué)期期末試卷
- 方大重整海航方案
- 河北省秦皇島市昌黎縣2023-2024學(xué)年八年級上學(xué)期期末數(shù)學(xué)試題
- 礦山治理專項(xiàng)研究報(bào)告范文
- 國家開放大學(xué)2023年7月期末統(tǒng)一試《11124流行病學(xué)》試題及答案-開放本科
- 貨運(yùn)安全生產(chǎn)管理制度
- 施工圖審查招標(biāo)文件范文
- 幼兒園中班體育《我們愛運(yùn)動》+課件
- 郭錫良《古代漢語》課件
- 外研版四年級英語下冊(一年級起點(diǎn))全冊完整課件
- 防止電力生產(chǎn)事故的-二十五項(xiàng)重點(diǎn)要求(2023版)
- 教研室主任崗位申請書
評論
0/150
提交評論