版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年國際傳統(tǒng)醫(yī)藥國際城市漁業(yè)航空合同
- 2026年廢疫病疫情波污染易發(fā)區(qū)保護保險合同中
- 2025年普陀區(qū)第二人民醫(yī)院招聘財務(wù)收費崗位合同制員工1名備考題庫及參考答案詳解一套
- 2025年廣州越秀區(qū)文聯(lián)招聘合同制輔助人員備考題庫及一套參考答案詳解
- 嘉善縣招聘協(xié)管員面試題及答案
- 勞保協(xié)管員面試題及答案解析(2025版)
- 2025國家公務(wù)員國家稅務(wù)總局富順縣稅務(wù)局面試試題及答案
- 2025年東光輔警招聘真題及答案
- 定西市隴西縣招聘城鎮(zhèn)公益性崗位工作人員考試真題2024
- 2025 九年級語文下冊戲劇人物性格特點分析課件
- 2026年安全員之A證考試題庫500道附完整答案(奪冠)
- 水里撈東西協(xié)議書
- 轉(zhuǎn)讓荒山山林協(xié)議書
- 銷售人員心理素質(zhì)培訓(xùn)大綱
- 2025四川省國家工作人員學(xué)法用法考試復(fù)習(xí)重點試題(含答案)
- 2025山西大地環(huán)境投資控股有限公司招聘116人考試筆試參考題庫及答案解析
- 2025國家統(tǒng)計局齊齊哈爾調(diào)查隊招聘公益性崗位5人考試筆試參考題庫及答案解析
- 2025年小學(xué)音樂湘藝版四年級上冊國測模擬試卷及答案(三套)
- 2025應(yīng)用為王中國大模型市場
- GB/T 21709.22-2013針灸技術(shù)操作規(guī)范第22部分:刮痧
- GB/T 13245-1991含碳耐火材料化學(xué)分析方法燃燒重量法測定總碳量
評論
0/150
提交評論