《電子工程師項目教學(xué)與訓(xùn)練》課件第1章_第1頁
《電子工程師項目教學(xué)與訓(xùn)練》課件第1章_第2頁
《電子工程師項目教學(xué)與訓(xùn)練》課件第1章_第3頁
《電子工程師項目教學(xué)與訓(xùn)練》課件第1章_第4頁
《電子工程師項目教學(xué)與訓(xùn)練》課件第1章_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第1章自動升降旗控制器設(shè)計

1.1引言1.2自動升降旗控制器設(shè)計任務(wù)書 1.3設(shè)計方案

1.4硬件電路設(shè)計

1.5軟件設(shè)計1.6程序清單

1.1引言國旗是一個國家的標(biāo)志,升降國旗的儀式要求規(guī)范莊嚴(yán),在升國旗的過程中要演奏國歌,并且要求國旗的升起過程要與國歌的演奏過程同步,而在實際的升國旗過程中由于升旗手訓(xùn)練的程度及熟練的程度不同,使得有些升旗過程出現(xiàn)瑕疵,不完美,影響了升旗儀式的莊嚴(yán)。自動升降旗控制器是模擬實際的升降旗過程實現(xiàn)升降旗過程自動化控制的裝置,可以解決升降旗過程中的相關(guān)問題。本項目主要訓(xùn)練單片機及其I/O接口的設(shè)計、步進電機驅(qū)動、軟件編程能力、電子電路制作及調(diào)試等方面的知識與技能。1.2自動升降旗控制器設(shè)計任務(wù)書

1.設(shè)計任務(wù)設(shè)計一個自動升降旗控制系統(tǒng),該系統(tǒng)能夠自動控制升旗和降旗。升旗時,國旗在旗桿的最高端自動停止;降旗時,在最低端自動停止。自動升降旗控制系統(tǒng)的機械模型如圖1-1所示。旗幟的升降由電機驅(qū)動,系統(tǒng)設(shè)置兩個控制按鍵,一個是升旗鍵,另一個是降旗鍵,系統(tǒng)中的其他功能鍵由設(shè)計者定義。圖1-1自動升降旗控制系統(tǒng)的機械模型

2.設(shè)計要求

(1)按下升旗鍵后,國旗勻速上升,同時流暢地演奏國歌;上升到最高端時自動停止上升,國歌停奏;按下降旗鍵后,國旗勻速下降,降旗的時間不演奏國歌,下降到最低端時自動停止。

(2)為避免誤動作,國旗在最高端時,按升旗鍵不起作用;國旗在最低端時,按降旗鍵不起作用。

(3)升降旗的時間均為43s,與國歌的演奏時間相等,同時,旗從旗桿的最下端上升到頂端。降旗時不演奏國歌,同時,旗從旗桿的最上端下降到底端。

(4)數(shù)字即時顯示旗幟所在的高度,以“cm”為單位,誤差不大于2cm。

(5)使升降旗控制器具有升半旗和降半旗的功能。根據(jù)《國旗法》,升旗時,按升旗鍵,奏國歌,國旗從最底端上升到最高端之后,國歌停奏,然后自動下降到總高度的2/3處停止;降旗時,按降旗鍵,國旗先從2/3高度處上升到最高端,再自動從最高端下降到底端之后自動停止。

(6)不論旗幟是在頂端還是在底端,關(guān)斷電源之后重新合上電源,旗幟所在的高度數(shù)據(jù)顯示不變。

(7)要求升降旗的速度可調(diào)整,在旗桿高度不變的情況下,升降旗時間的調(diào)整范圍為30~120s,步進為1s。說明:旗幟用大于100g的重物代替。1.3設(shè)計方案自動升降旗控制器要求實現(xiàn)升降旗過程的全自動控制,那么首當(dāng)其沖要考慮的就是采用什么樣的控制芯片實現(xiàn)相關(guān)的控制,在控制器的選擇中主要應(yīng)考慮控制器連接的外設(shè)情況及處理器的速度是否能夠滿足相應(yīng)的設(shè)計要求。在本設(shè)計中處理器主要連接的外部設(shè)備有鍵盤、數(shù)碼顯示器、電機驅(qū)動電路等。處理器的主要任務(wù)是對鍵盤的掃描、顯示器的管理及對電機的控制,這里最重要的任務(wù)是對電機速度的控制。圖1-2所示為自動升降旗控制器的結(jié)構(gòu)框圖。圖1-2自動升降旗控制器的結(jié)構(gòu)框圖由分析設(shè)計要求可知,在該系統(tǒng)中電機的控制無疑是最重要的,即通過電機的控制來實現(xiàn)升降旗過程中旗幟運行速度和位置的控制。選擇普通的8位單片機完全可以滿足設(shè)計的要求,這里綜合考慮各方面的因素最終選擇MCS-51系列的單片機作為主控制器來組成基本的控制系統(tǒng)。MCS-51單片機具有靈活的I/O口接口方式,通過I/O接口可以很方便地實現(xiàn)鍵盤與顯示器的連接與管理,也可以較方便地實現(xiàn)直流電機、步進電機的控制,因此系統(tǒng)的整體硬件設(shè)計方案確定為以單片機為主控制器,通過接口電路連接鍵盤、顯示器及電機驅(qū)動電路等,從而實現(xiàn)自動控制。1.4硬件電路設(shè)計1.4.1I/O接口的整體設(shè)計思路

MCS-51系列單片機的I/O接口線共有32根,在其端口上連接外部設(shè)備可以通過直接I/O的方式進行連接,也可以通過總線接口進行連接,一般的原則是應(yīng)考慮到外部設(shè)備端口的多少以及要求控制的靈活性。在外部設(shè)備端口較少、占用I/O口線不多的情況下應(yīng)盡量采用直接I/O的方式連接設(shè)備,這樣可以使接口電路結(jié)構(gòu)簡單,硬件成本較低,控制靈活;相反,如果需要擴展的設(shè)備端口數(shù)目較多,采用直接I/O口線的數(shù)目不能滿足需求,則應(yīng)采用總線擴展實現(xiàn)I/O設(shè)備的連接。根據(jù)設(shè)計的要求是在升降旗的過程中實時顯示旗幟的實際高度,旗桿的高度為180cm,要求顯示的高度以“cm”為單位,因此該控制器中應(yīng)至少設(shè)置3位LED顯示器用于高度的顯示。其次,該控制器中設(shè)置了用于操作的鍵盤,鍵盤接口可以通過獨立式鍵盤或矩陣式鍵盤來實現(xiàn),通常在按鍵不是很多的情況下采用獨立式鍵盤接口,反之,則應(yīng)該采用矩陣式鍵盤接口。最后電機驅(qū)動電路的連接也需要使用I/O口線,因此在該電路設(shè)計中控制器的I/O口線并不十分充足,加之在設(shè)計時要留有一定的設(shè)計余量,這里對于鍵盤接口和顯示器接口均采用了總線擴展的形式來實現(xiàn)。1.4.2主控制器部分電路設(shè)計根據(jù)上面的分析,設(shè)計中最終選用了AT89C51芯片作為主處理器,為了實現(xiàn)總線擴展,在單片機的外部通過鎖存器74LS373鎖存P0送出的低8位地址,形成低8位地址總線,P2口作為專用的高8位地址線,圖1-3是主控制器的部分電路。由圖可以看出,通過P0、P2口形成了地址總線A[7..0]、A[15..8]和數(shù)據(jù)總線AD[7..0]。1.4.3顯示器接口設(shè)計該系統(tǒng)采用LED數(shù)碼管作為顯示器件,顯示接口電路如圖1-4所示。圖1-3主控制器部分電路圖1-4顯示接口電路在該設(shè)計中顯示器主要用于旗幟實際高度的顯示,旗幟高度的范圍為0~180cm,需要3位LED數(shù)碼管。除此之外在進行升旗時間調(diào)整時還可以用顯示器顯示設(shè)置的時間值,按照設(shè)計的要求,該時間的范圍為30~120s。因此,如果僅從滿足設(shè)計要求的角度出發(fā)采用3位的LED顯示器,設(shè)置相應(yīng)的顯示接口就可以了。但是這里考慮到控制器運行于不同的狀態(tài)時能夠進行明確的區(qū)分以及在調(diào)試過程中用于測試等因素,硬件中設(shè)置了6位的LED顯示器。該顯示接口電路采用6片74LS273作為靜態(tài)顯示的鎖存器,當(dāng)要送給顯示器顯示數(shù)據(jù)時,通過相應(yīng)的I/O選通信號和總線寫信號實現(xiàn)鎖存器的寫入同步控制。這里L(fēng)ED數(shù)碼管每位占用一個I/O地址端口,共需要6個I/O端口,除此之外,鍵盤接口也要占用兩個I/O端口,因此在該系統(tǒng)中共需要8個I/O端口來連接顯示器和鍵盤,以及通過一片74LS138實現(xiàn)譯碼,產(chǎn)生8個I/O端口選通信號。圖1-5為I/O端口地址譯碼電路。由該電路可以看出這里采用的譯碼方式為部分譯碼,由該譯碼電路可以進一步推出各個I/O端口的地址映像,具體推導(dǎo)情況及地址對應(yīng)關(guān)系如表1-1所示。表中X表示其取值為無關(guān)項,由此可知顯示器端口對應(yīng)的I/O地址為8000H~8005H,K_OUT與K_IN為鍵盤接口的名稱,其對應(yīng)的映像地址分別為8006H和8007H。圖1-5I/O端口地址譯碼電路表1-1I/O端口地址映像表1.4.4鍵盤接口電路設(shè)計這里通過總線實現(xiàn)了2×8的矩陣式鍵盤擴展,這種擴展方式可以滿足大規(guī)模的鍵盤擴展要求。在該系統(tǒng)中擴展了16個按鍵,實際上是留有很大余量的,便于系統(tǒng)的調(diào)試與功能擴展。圖1-6為鍵盤接口電路圖。圖1-6鍵盤接口電路1.4.5電機驅(qū)動電路及其接口設(shè)計根據(jù)設(shè)計要求,電機需要提升的旗幟重量等價于100g的重物,因此這里對電機的轉(zhuǎn)矩要求并不高,很小的電機就可以滿足設(shè)計要求??梢赃x擇微型直流電機,也可以選擇步進電機,這里考慮到控制的難易程度,選擇微型步進電機作為驅(qū)動電機使用。這里需要解釋為什么沒有選擇普通的直流電機。如果用普通的直流電機來實現(xiàn)驅(qū)動,必須認(rèn)真考慮的問題就是如何使電機的速度保持要求的值,而且速度要隨升旗時間的設(shè)置不同而變化。這個問題的本質(zhì)是微型直流電機的調(diào)速問題,要解決這樣的問題,電路設(shè)計中必須引入閉環(huán)控制,需要設(shè)置電機運行速度及位置的檢測電路,并且在軟件設(shè)計上采用適當(dāng)?shù)目刂扑惴?,因此電路的?fù)雜程度及控制難度都會增加。選用步進電機可以較好地避開上述問題。由于步進電機可以通過運行的步數(shù)精確控制電機轉(zhuǎn)過的位移,通過控制步進電機運行一步的時間就可以控制電機運行的速度,改變步進電機的步進時間就可以改變電機的運行速度。采用步進電機實現(xiàn)控制實際上是進行開環(huán)控制,因此簡化了軟硬件的設(shè)計。設(shè)計中選用的步進電機型號為35BY48H10。步進電機的驅(qū)動采用了驅(qū)動模塊SMD-401。驅(qū)動模塊與處理器之間的接口簡單,采用單片機的P1.0、P1.1、P1.2分別作為驅(qū)動模塊的輸入信號CP、DIR、HOLD。單片機與步進電機驅(qū)動器之間的接口電路如圖1-7所示。圖1-7單片機與步進電機驅(qū)動器之間的接口電路1.5軟件設(shè)計1.5.1概述軟件設(shè)計是該系統(tǒng)設(shè)計的重要組成部分,合理的軟件設(shè)計可以更好地發(fā)揮硬件的功能,甚至可以通過軟件設(shè)計補償硬件設(shè)計的不足,因此在涉及到單片機應(yīng)用的系統(tǒng)中,應(yīng)該認(rèn)真考慮軟件的設(shè)計,充分發(fā)揮系統(tǒng)的性能。好的軟件設(shè)計應(yīng)該具有好的人機交互界面,即用戶可以方便地對設(shè)備進行操作,輸入操作命令,而設(shè)備也通過友好、清晰的方式把相關(guān)的信息輸出給用戶。從使用的功能上看,好的軟件應(yīng)該在系統(tǒng)硬件的基礎(chǔ)上很好地實現(xiàn)設(shè)備設(shè)計的各項功能,達到相關(guān)的性能指標(biāo)。從軟件的內(nèi)部結(jié)構(gòu)來看,好的軟件設(shè)計應(yīng)該具有清晰的層次、合理的結(jié)構(gòu),采用結(jié)構(gòu)化、模塊化的程序設(shè)計理念不僅可以提高編程的效率,而且也便于程序的維護修改及交流。1.5.2總程序結(jié)構(gòu)分析對升降旗控制器的功能進行分析,可以總結(jié)出該控制器主要應(yīng)實現(xiàn)如下三方面的功能:第一,通過人機交互界面設(shè)定系統(tǒng)的狀態(tài)及時間。系統(tǒng)上電缺省的情況為升國旗,因此升降過程的時間設(shè)定為43s,但是如果升降的不是國旗,則可以通過鍵盤設(shè)定新的升降旗時間;系統(tǒng)缺省的狀態(tài)為正常升旗或降旗,但也可以通過鍵盤設(shè)定為升半旗或降半旗狀態(tài)。第二,實現(xiàn)按照設(shè)定的時間升旗幟的功能。自動升降旗控制器就是要實現(xiàn)升旗過程的自動化控制,因此該功能是該控制器要實現(xiàn)的最重要的功能,要實現(xiàn)該功能,就要控制好電機的速度及電機提升的高度。第三,實現(xiàn)按照設(shè)定的時間降旗的功能。降旗與升旗的過程同樣也是該控制器要重點控制的過程。不管是在升旗操作中還是在降旗操作中都要區(qū)分是進行正常的升降旗操作還是進行半旗狀態(tài)下的升降旗操作,并分別予以控制。根據(jù)系統(tǒng)要實現(xiàn)的功能給出系統(tǒng)軟件的程序結(jié)構(gòu)框圖,如圖1-8所示。從框圖可以看出,該系統(tǒng)的主程序結(jié)構(gòu)是以鍵盤掃描及鍵盤功能處理為主線進行設(shè)計的,整體上是一個循環(huán)程序結(jié)構(gòu)。即通過鍵盤掃描程序用戶可以輸入操作命令,通過鍵功能處理程序?qū)斎氲拿钸M行判斷,進行任務(wù)分發(fā),具體的任務(wù)由各個程序塊來實現(xiàn),而各個程序功能塊的實現(xiàn)又可以進行任務(wù)分解,由底層的子程序來實現(xiàn)。通過這樣的層次劃分就可以使程序具有較好的結(jié)構(gòu)化效果,編制程序思路就會更清晰,效率就會更高,因此我們在開始寫程序之前必須足夠重視程序的結(jié)構(gòu)設(shè)計。圖1-8系統(tǒng)程序結(jié)構(gòu)框圖1.5.3鍵盤掃描程序設(shè)計鍵盤掃描程序是需要反復(fù)使用的重要程序,該設(shè)計中鍵盤是通過總線擴展而來的矩陣式鍵盤,其掃描方法與普通的矩陣式鍵盤掃描的一般原理基本相同。不過,為了提高程序的健壯性,對于鍵盤掃描所得的鍵值采用了更完全的編碼方式,即當(dāng)鍵盤陣列中有鍵按下時,掃描后給出對應(yīng)的鍵值編碼,當(dāng)鍵盤掃描后無鍵按下時則帶回一個特定的編碼值0FFH,這樣對鍵功能的處理就更加完善與靈活。鍵盤掃描子程序具體見程序清單。1.5.4顯示程序設(shè)計顯示程序也是系統(tǒng)中重復(fù)使用的功能程序,因此該部分程序也設(shè)置為子程序的形式,供需要使用的地方調(diào)用。該設(shè)計中需要顯示的信息有:升降旗過程中的高度、升降旗時間及必要的狀態(tài)信息。該系統(tǒng)通過總線擴展的方式擴展了6位LED數(shù)碼管,采用的顯示方案為:用3位LED顯示高度和時間,用1位LED顯示控制器的狀態(tài),剩余的2位LED用于格式裝飾。當(dāng)系統(tǒng)上電后進入默認(rèn)的狀態(tài),在該狀態(tài)下可以進行正常的升降旗控制,此時用于狀態(tài)顯示的數(shù)碼管顯示為“1”,其顯示格式示意圖見圖1-9。在升降旗的過程中低3位用于顯示旗幟的高度。圖1-9正常升降旗信息顯示當(dāng)設(shè)定為半旗狀態(tài)時最高位顯示為“2”,在該狀態(tài)下可以進行升半旗及降半旗的操作,其顯示格式如圖1-10所示。當(dāng)設(shè)定為時間調(diào)整方式時最高位顯示為“3”,在該狀態(tài)下可以進行升降旗操作時間的調(diào)整,此時的顯示格式如圖1-11所示。顯示子程序的功能只負(fù)責(zé)把顯示單元的內(nèi)容轉(zhuǎn)換為顯示代碼并送相應(yīng)的I/O映像地址進行顯示,而具體顯示的內(nèi)容與顯示子程序本身無關(guān),顯示子程序具體見程序清單。圖1-10半旗狀態(tài)下的信息顯示圖1-11時間設(shè)定狀態(tài)下的信息顯示1.5.5電機控制程序設(shè)計旗桿的總高度為180cm,通過測試程序可以測出在步進電機的驅(qū)動下旗幟從旗桿的底部上升到旗桿的頂部,步進電動機走過的總步數(shù)為14400,由此可以折算出旗幟的高度每升高或降低1cm,步進電機應(yīng)該正轉(zhuǎn)或反轉(zhuǎn)80步。因此在升降旗的過程中,步進電機每轉(zhuǎn)過80步,旗幟的高度增加或降低1cm。在升旗時升起的高度從0cm達到180cm,升旗過程結(jié)束;當(dāng)降旗時旗幟的高度從180cm降到0cm,降旗過程結(jié)束。對于半旗狀態(tài)下升旗及降旗的控制過程可以分步來進行。升半旗時,在電機的驅(qū)動下旗幟的高度先從0cm上升到180cm,隨后電機反轉(zhuǎn)高度從180cm降到120cm,升半旗過程結(jié)束;降半旗時,先使旗幟從高度為120cm處上升到180cm處,再從180cm處降旗到0cm,降旗過程結(jié)束。步進電機驅(qū)動的速度是通過控制步進電機運行一步所需的時間來進行控制的,這里步進電機的驅(qū)動器采用了集成的控制模塊,其控制較簡單,要使其走過一步只需向控制模塊的CP端發(fā)送一個脈沖即可,而脈沖的周期就決定了步進電機運行這一步所需要的時間,因此脈沖的周期決定了步進電機的速度,步進電機運行的步數(shù)決定了電機轉(zhuǎn)過的距離。通過上面的分析可知,只要改變步進電機驅(qū)動脈沖的周期就可以控制步進電機運行的速度。當(dāng)進行升降旗操作時,根據(jù)設(shè)定的升降旗時間可以計算出對應(yīng)的升降旗過程中步進電機每個驅(qū)動脈沖的周期及一個周期中高低電平的時間寬度,不過這里的計算工作并不是由單片機來完成,而是通過查表的方法得到的,升降旗的時間設(shè)定范圍為30~120s,因此可以通過計算得到對應(yīng)設(shè)定時間的驅(qū)動脈沖定時值,并把每一個時間值對應(yīng)的脈沖定時值存入一個表中,單片機在升降旗時根據(jù)設(shè)定的時間值查表得到相應(yīng)的驅(qū)動脈沖的定時值,從而控制驅(qū)動脈沖的寬度,最終實現(xiàn)速度的控制。步進電機的驅(qū)動脈沖CP為正方波,即脈沖的一個周期內(nèi)高低電平持續(xù)的時間相同,為產(chǎn)生這樣的脈沖信號使用單片機的定時/計數(shù)器1,并使該定時/計數(shù)器工作在方式1——中斷模式。在每次升旗或降旗時,通過初始化程序設(shè)定定時/計數(shù)器1的工作模式,設(shè)定步進電機需要運行的總步數(shù),通過查表程序得到對應(yīng)設(shè)定時間值的定時器初值,并啟動定時/計數(shù)器1,在定時/計數(shù)器1的中斷服務(wù)程序中完成CP脈沖定時值的重新裝入,計算當(dāng)前的升旗或降旗高度,計算步進電機走過的總步數(shù)以確定是否完成了升降旗的操作,當(dāng)設(shè)定的步數(shù)值減到了0時,定時/計數(shù)器1停止運行并設(shè)置相關(guān)的狀態(tài)標(biāo)志。有關(guān)升降旗控制的詳細程序見程序清單。1.5.6其他功能當(dāng)系統(tǒng)上電后系統(tǒng)默認(rèn)的狀態(tài)為正常升降旗狀態(tài),在此狀態(tài)下可以進行正常的升降旗操作。但是系統(tǒng)上電后旗幟的初始位置可能并不符合要求,當(dāng)旗幟的位置并不在要求的初始位置時,應(yīng)該進行調(diào)整。為了實現(xiàn)這一功能,系統(tǒng)設(shè)置了兩個功能鍵,一個為上升鍵,一個為下降鍵,當(dāng)上升鍵或下降鍵第一次按下時旗幟上升或下降,再次按下上升鍵或下降鍵則旗幟停止運動,可以通過這兩個按鍵反復(fù)調(diào)整旗幟的初始位置直到符合要求為止。上電后用戶可能進行的操作有正常的升降旗操作及半旗狀態(tài)下的升降旗操作,因此上電后必須告訴控制器旗幟的當(dāng)前位置在什么地方,這樣后面的相關(guān)操作才可能正常進行。告訴控制器旗幟的位置也就等于確定了旗幟當(dāng)前的高度,因此在該設(shè)計中增加了兩個鍵來確定旗幟的缺省位置:一個為初始位置狀態(tài)切換鍵,一個為確認(rèn)鍵。具體操作方法為:當(dāng)?shù)谝淮伟聪鲁跏嘉恢们袚Q鍵時數(shù)碼管顯示“4--000”,表示旗幟的當(dāng)前位置在旗桿的底部,高度為0cm,此時如果按下確認(rèn)鍵,則控制器設(shè)置當(dāng)前高度為0cm,設(shè)置相關(guān)的內(nèi)部標(biāo)志,并退回到正常升降旗狀態(tài);如果旗幟的當(dāng)前位置處在旗桿的頂部,則在第一次按下初始位置切換鍵后,再次按下該鍵,此時數(shù)碼管顯示“4--180”,表示旗幟的位置在旗桿的頂部,旗幟高度為180cm,按下確認(rèn)鍵后控制系統(tǒng)把旗幟的當(dāng)前高度設(shè)置為180cm,設(shè)置相關(guān)的內(nèi)部標(biāo)志,并返回到正常的升降旗狀態(tài);如果當(dāng)前旗幟的位置為半旗狀態(tài)的升起狀態(tài),即旗幟的高度為120cm,可以連按3次初始位置設(shè)置鍵,則顯示為“4--120”,表示當(dāng)前旗幟高度為120cm,再按確認(rèn)鍵,控制器內(nèi)部設(shè)置旗幟的當(dāng)前高度為120cm,設(shè)置相關(guān)的狀態(tài)標(biāo)志并返回到半旗狀態(tài)。1.6程序清單

;;;;;;;;;;定義變量;;;;;;;;;;;;;;;;;;;;

DIR BIT P1.1 ;電極方向控制

CP BIT P1.0 ;電機驅(qū)動脈沖輸出

HOLD BIT P1.2 ;電機鎖定控制信號

STOP BIT 00H ;電機停轉(zhuǎn)標(biāo)志

DOWN_FLAG BIT 01H ;旗幟位置在旗桿的底部時的標(biāo)志

UP_FLAG

BIT 02H ;旗幟位置在旗桿的頂部時的標(biāo)志

T_FLAG

BIT 03H

MID_FLAG BIT 04H ;半旗狀態(tài)標(biāo)志

LED1 EQU 31H ;數(shù)碼管最低位顯示緩沖

LED2 EQU 32H

LED3 EQU 33H

LED4 EQU 34H

LED5 EQU 35H

LED6 EQU 36H ;數(shù)碼管最高位顯示緩沖

NUM_H EQU 37H ;電機運行步數(shù)計數(shù)

NUM_L EQU 38H

HIGE EQU 39H ;旗幟的當(dāng)前高度

COUNT EQU 3AH

HANG EQU 3BH

LIE EQU 3CH

KEY EQU 3DH ;鍵盤掃描帶回的鍵值

TIME EQU 3EH ;升降旗時間設(shè)定值

T_L EQU 3FH ;步進電機運行控制脈沖的定時值

T_H EQU 40H

;-------------------------------------------

;;;;;;;;;;程序開始;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H SJMP MAIN ORG 000BH LJMP INT_T0

ORG 001BH LJMP INT_T1 ORG 0050H

MAIN: NOP MOV IE,#00H MOV IP,#00H MOV SP,#60H CLR DIR ;電機正轉(zhuǎn)

CLR CP CLR HOLD ;電機鎖定

CLR STOP ; MOV LED1,#00H ;顯示計數(shù)單元清零

MOV LED2,#00H MOV LED3,#00H MOV LED4,#10H MOV LED5,#10H MOV LED6,#01H LCALL DISPLAY ;顯示

;

MOV COUNT,#81 MOV TIME,#42 MOV HIGE,#00H CLR UP_FLAG SETB DOWN_FLAG CLR MID_FLAG ;

K_LOOP: LCALL KEY_SCAN MOV A,KEY CJNE A,#0FFH,KEY_0 LJMP K_LOOP

KEY_0: CJNE A,#00H,KEY_1 LJMP SHENGQI

KEY_1: CJNE A,#01H,KEY_2 LJMP JIANGQI

KEY_2: CJNE A,#02H,KEY_3 LJMP BANQI

KEY_3: CJNE A,#03H,KEY_4 LJMP TIME_SET

KEY_4: CJNE A,#06H,KEY_5 LJMP RUN_UP

KEY_5: CJNE A,#07H,KEY_6 LJMP RUN_DOWN

KEY_6: CJNE A,#08H,KEY_7 LJMP INIT_SET

KEY_7: LJMP FUWEI

FUWEI: LJMP K_LOOP

;;;;;;;;;;旗幟初始位置設(shè)置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INIT_SET: NOP ;PUSH LED6 MOV LED6,#04H MOV LED3,#00H MOV LED2,#00H MOV LED1,#00H LCALL DISPLAY ;

IK1: LCALL KEY_SCAN MOV A,KEY CJNE A,#08H,NEXT_1 ;用08H號鍵實現(xiàn)初始狀態(tài)切換

MOV LED3,#01H MOV LED2,#08H MOV LED1,#00H LCALL DISPLAY LJMP NEXT_2 ;

NEXT_1: CJNE A,#09H,IK1 ;設(shè)置旗幟的高度為0cm MOV HIGE,#00H CLR UP_FLAG SETB DOWN_FLAG

;POP LED6

MOV LED6,#01H

LCALL DISPLAY

LJMP K_LOOP ;

NEXT_2:

LCALL KEY_SCAN

MOV A,KEY

CJNE A,#08H,NEXT_3

MOV LED3,#01H

MOV LED2,#02H

MOV LED1,#00H

LCALL DISPLAY

LJMP NEXT_4

;

NEXT_3:

CJNE A,#09H,NEXT_2

MOV HIGE,#180

SETB UP_FLAG

CLR DOWN_FLAG

MOV LED6,#01H

;POP LED6

LCALL DISPLAY

LJMP K_LOOP

;

NEXT_4:

LCALL KEY_SCAN

MOV A,KEY

CJNE A,#08H,NEXT_5

LJMP INIT_SET

NEXT_5:

CJNE A,#09H,NEXT_4

MOV HIGE,#120

SETB UP_FLAG

CLR DOWN_FLAG

SETB MID_FLAG

;POP LED6

MOV LED6,#02H

LCALL DISPLAY

LJMP K_LOOP

;---------------------------------------------------------

;;;;;;;;;;旗幟位置調(diào)整程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RUN_UP:

NOP

MOV TMOD,#10H ;?T1設(shè)定為工作方式1,定時功能

CLR DIR ;電機正轉(zhuǎn),旗幟上升

LJMP COM_PRO

;

RUN_DOWN:

NOP

MOV TMOD,#10H

SETB DIR

LJMP COM_PRO

COM_PRO:

MOV DPTR,#T_TAB

MOV A,#42

CLR C

SUBB A,#30

RL A

MOV R3,A

MOVC A,@A+DPTR

MOV TH1,A ;修改定時時間,用于速度控制

MOV T_H,A MOV A,R3 INC A MOVC A,@A+DPTR MOV TL1,A MOV T_L,A CLR TF1 SETB TR1 CLR CP CLR STOP SETB HOLD ;電機松開

W_KEY: LCALL KEY_SCAN MOV A,KEY CJNE A,#06H,W_UP CLR TR1 SETB STOP CLR DIR CLR HOLD ;電機鎖死

LJMP K_LOOP

W_UP: JNB TF1,W_KEY CLR TF1 CPL CP MOV TL1,T_L MOV TH1,T_H SJMP W_KEY

;--------------------------------------------

;;;;;;;;;;;;;升旗操作;;;;;;;;;;;;;;;;;;;;;;;;

SHENGQI:NOP

JB UP_FLAG,NO_OPR

JB MID_FLAG,SQ_MID

LCALL SQ_OPR

LJMP K_LOOP

SQ_MID: LCALL SQ_OPR_M

NO_OPR:LJMP K_LOOP

;;;

SQ_OPR:NOP

CLR DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AGA1: JNB STOP,AGA1

CLR CP

CLR HOLD

CLR TR1

CLR DOWN_FLAG

SETB UP_FLAG

RET

;;;

SQ_OPR_M: NOP

CLR DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AGA1_B: JNB STOP,AGA1_B

CLR CP

CLR HOLD

CLR TR1

LCALL DELAY

SETB DIR

SETB HOLD

CLR STOP

SETB TR1

MOV NUM_H,#12H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#0C0H

AGA2_B: JNB STOP,AGA2_B

CLR CP

CLR HOLD

CLR TR1

CLR DOWN_FLAG

SETB UP_FLAG

RET

;-------------------------------------------

;;;;;;;;;;;;;降旗操作;;;;;;;;;;;;;;;;;;;;;;;

JIANGQI: NOP

JB DOWN_FLAG,NO_OPR1

JB MID_FLAG,J_MID

LCALL J_OPR

LJMP K_LOOP

J_MID:

LCALL J_OPR_M

NO_OPR1: LJMP K_LOOP

;;;

J_OPR: NOP

SETB DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AGA2: JNB STOP,AGA2

CLR CP

CLR HOLD

CLR TR1

SETB DOWN_FLAG

CLR UP_FLAG

RET

;;;

J_OPR_M: NOP

CLR DIR

CLR STOP

SETB HOLD

MOV NUM_H,#12H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#0C0H

LCALL INIT_T1

AG1_B:

JNB STOP,AG1_B

CLR CP

CLR HOLD

CLR TR1

LCALL DELAY

SETB DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AG2_B: JNB STOP,AG2_B

CLR CP

CLR HOLD

CLR TR1

SETB DOWN_FLAG

CLR UP_FLAG

RET

;-------------------------------------------

;;;;;;;;;;;;;半旗狀態(tài)設(shè)置;;;;;;;;;;;;;;;;;;;

BANQI: NOP

CPL MID_FLAG

JNB MID_FLAG,NNO_P

MOV LED6,#02H ;表示半旗狀態(tài)

LCALL DISPLAY

LJMP K_LOOP

NNO_P: MOV LED6,#01H ;表示缺省狀態(tài)

LCALL DISPLAY

LJMP K_LOOP

;-------------------------------------------

;;;;;;;;;;;;;升旗時間設(shè)定;;;;;;;;;;;;;;;;;;;

TIME_SET:NOP

SETB T_FLAG

PUSH LED6

LCALL TIME_DIS

T_KEY: LCALL KEY_SCAN

;

MOV A,KEY

CJNE A,#03H,T_UP

LJMP SET_END

T_UP: CJNE A,#04H,T_DOWN

LCALL TIME_UP

SJMP T_KEY

T_DOWN: CJNE A,#05H,T_KEY

LCALL TIME_DOWN

SJMP T_KEY

SET_END:POP LED6

CLR T_FLAG

LCALL DEFAULT

LJMP K_LOOP

;

TIME_DIS: MOV LED6,#03H ;03H表示調(diào)整時間

MOV LED5,#10H

MOV LED4,#10H

MOV A,TIME

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

DEFAULT: NOP

MOV LED5,#10H

MOV LED4,#10H

MOV A,HIGE

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

;-------------------------------------------

;;;;;;;;;;;;;升旗時間增加;;;;;;;;;;;;;;;;;;;

TIME_UP:NOP

JB T_FLAG,UP_OPR

RET

UP_OPR:INC TIME

MOV A,TIME

CJNE A,#120,DY120

DY120: JC T_T

MOV TIME,#120

T_T: MOV A,TIME

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

;-------------------------------------------

;;;;;;;;;;;;;升旗時間減小;;;;;;;;;;;;;;;;;;;

TIME_DOWN: NOP

JB T_FLAG,DOWN_OPR

RET

DOWN_OPR: MOV A,TIME

DEC A

MOV TIME,A

CJNE A,#1EH,XY30

XY30: JC SET30

JMP TX_TIME

SET30:

MOV TIME,#30

TX_TIME: MOV A,TIME

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

;-------------------------------------------

L_LOOP: NOP

AGAIN: ;LCALL ONE_STEP ;LCALL JIAN1 JNB STOP,AGAIN ;;;; CLR CP CLR HOLD LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY SETB DIR

CLR STOP

MOV NUM_H,#38H MOV NUM_L,#40H SETB HOLD

AGAIN_F: ;LCALL ONE_STEP ;LCALL JIAN1 JNB STOP,AGAIN_F ; CLR CP CLR HOLD LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY

LCALL DELAY LCALL DELAY CLR DIR CLR STOP MOV NUM_H,#38H MOV NUM_L,#40H SETB HOLD LJMP L_LOOP

;;;;;;;;;;步進電機運行步數(shù)控制減一控制;;;;;;;

JIAN1: NOP CLR C MOV A,NUM_L SUBB A,#01H MOV NUM_L,A JC HSUBB LJMP PAN_L

HSUBB: MOV NUM_L,#0FFH CLR C MOV A,NUM_H SUBB A,#01H MOV NUM_H,A

PAN_L: NOP MOV A,NUM_L

CJNE A,#00H,J_END MOV A,NUM_H CJNE A,#00H,J_END SETB STOP

J_END: RET

;-------------------------------------------

;;;;;;;;;;升旗高度cm數(shù)加一程序;;;;;;;;;;;;;;

JIA_1: INC HIGE

MOV A,HIGE

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

RET

;-------------------------------------------

;;;;;;;;;;降旗高度cm數(shù)減一程序;;;;;;;;;;;;;;

JIAN_1: MOV A,HIGE

CLR C

SUBB A,#01H

MOV HIGE,A

JC H_0

JMP H_1

H_0: MOV HIGE,#00H

H_1: MOV A,HIGE

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

RET

;--------------------------------------------

;;;;;;;;;;鍵盤掃描子程序;;;;;;;;;;;;;;;;;;;;;;;

KEY_SCAN:NOP

ST: ACALL KEY_ON JNZ DELAY1 AJMP ST_END

DELAY1: ACALL KDL10MS ;去抖動延遲

ACALL KEY_ON JNZ KEY_NUM AJMP ST_END

KEY_NUM:ACALL KEY_LIE

KEY_OFF: ACALL KEY_ON ;等待鍵釋放

JNZ KEY_OFF AJMP ST_OUT

ST_END: MOV KEY,#0FFH ;無鍵按下時以0FFH作為帶回的鍵值

ST_OUT: RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY_ON: MOV A,#00H MOV DPTR,#8006H;鍵盤輸出端口地址為8006H MOVX @DPTR,A NOP NOP NOP NOP NOP NOP INC DPTR ;鍵盤輸入端口地址為8007H MOVX A,@DPTR CPL A ;判斷是否有鍵按下

RET

KDL10MS:MOV R7,#20H

KL1: MOV R6,#0FFH DJNZ R6,$ DJNZ R7,KL1 RET ;10ms延時,去抖動

KEY_LIE: MOV LIE,#02H ;開始列掃描

MOV DPTR,#8006H;鍵盤輸出端口地址為8006H MOV A,LIE MOVX @DPTR,A NOP NOP NOP NOP NOP NOP

INC DPTR ;鍵盤輸入端口地址為8007H MOVX A,@DPTR MOV HANG,A CPL A JZ NEXT ;若第一列無鍵按下,則掃描下一列

AJMP KEY_HANG

NEXT: MOV LIE,#01H ;開始第二列掃描

MOV DPTR,#8006H MOV A,LIE MOVX @DPTR,A NOP NOP NOP NOP

NOP

NOP

INC DPTR

MOVX A,@DPTR

MOV HANG,A

CPL A

JZ ERROR ;若無鍵輸入,則輸出錯誤,程序返回

KEY_HANG: DJNZ LIE,NEXT2

MOV LIE,#08H

AJMP NEXT3

NEXT2:

MOV LIE,#00H

NEXT3:

MOV A,HANG

JB ACC.0,LONE

MOV A,#00H

ADD A,LIE

MOV KEY,A

RET

LONE: MOV A,HANG JB ACC.1,LTWO MOV A,#01H ADD A,LIE MOV KEY,A RET

LTWO: MOV A,HANG JB ACC.2,LTHREE MOV A,#02H ADD A,LIE MOV KEY,A RET

LTHREE: MOV A,HANG JB ACC.3,LFOUR MOV A,#03H ADD A,LIE MOV KEY,A RET

LFOUR: MOV A,HANG JB ACC.4,LFIVE MOV A,#04H ADD A,LIE MOV KEY,A RET

LFIVE: MOV A,HANG JB ACC.5,LSIX MOV A,#05H ADD A,LIE MOV KEY,A RET

LSIX: MOV A,HANG JB ACC.6,LSEVEN MOV A,#06H ADD A,LIE MOV KEY,A RET

LSEVEN: MOV A,#07H ADD A,LIE MOV KEY,A RET

ERROR: MOV A,#0FFH ;鍵盤掃描錯誤,帶回鍵值0FFH MOV KEY,A RET

;----------------------------------------------

;;;;;;;;;;T0初始化為計數(shù)功能,工作方式2;;;;;;;;

INIT_T0: NOP NOP MOV TMOD,#06H MOV TH0,#0FFH MOV TL0,#0FFH SETB ET0 SETB EA SETB TR0 RET

;---------------------------------------------

;;;;;;;;;;T0中斷服務(wù)程序;;;;;;;;;;;;;;;;;;;;;;

INT_T0: RETI PUSH ACC PUSH PSW LCALL JIA_1 LCALL DISPLAY POP PSW POP ACC RETI

;--------------------------------------------

;;;;;;;;;;T1中斷的初始化程序;;;;;;;;;;;;;;;;;

INIT_T1: NOP MOV A,TMOD ORL A,#10H ;T1設(shè)定為工作方式1,定時功能

MOV TMOD,A ; MOV DPTR,#T_TAB MOV A,TIME CLR C SUBB A,#30 RL A MOV R3,A MOVC A,@A+DPTR MOV TH1,A ;修改定時時間,用于速度控制

MOV T_H,A MOV A,R3 INC A MOVC A,@A+DPTR MOV TL1,A

MOV T_L,A

; CLR TF1 SETB ET1 SETB EA SETB TR1 RET

;-----------------------------

溫馨提示

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

最新文檔

評論

0/150

提交評論