任務9-用自制的跑馬燈電路實現8只LED循環點亮_第1頁
任務9-用自制的跑馬燈電路實現8只LED循環點亮_第2頁
任務9-用自制的跑馬燈電路實現8只LED循環點亮_第3頁
任務9-用自制的跑馬燈電路實現8只LED循環點亮_第4頁
任務9-用自制的跑馬燈電路實現8只LED循環點亮_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

9.1.1明確工作任務用任務3制作的8位LED跑馬燈電路,通過編寫程序控制與P0口相連的8個LED燈循環點亮,每個燈點亮的時間為0.5秒。任務9用自制的跑馬燈電路實現8只LED循環點亮

9.1.2跟我想

1.編寫跑馬燈程序思路該任務要求通過編寫程序,使連接P0口的8個LED燈循環點亮(跑馬燈),每個燈點亮的時間為0.5秒。怎樣來編寫程序呢?我們用一個寄存器R1存儲用于點亮P0口的LED燈的數據,R1首先存儲點亮與P0.0相連的LED燈D0(數據為:0000001H),可以通過指令MOVP0,R1將與P0.0相連的LED0點亮,然后調用延時0.5秒的程序,延時時間到后,可以帶進位位左移指令RRA,將R1中的數據左移一位(數據為:00000010),再送給P0口,點亮與P0.1相連的LED燈D1,依次類推;用寄存器R2存儲LED燈從D0移動到D7的移動次數為8次,每移一次減1,R2的值為0時,表示第1次循環結束,接下來又從點亮D0開始下一個循環,就這樣反復循環點亮,達到跑馬燈的效果。在編寫程序之前,讓我們學一學相關指令的功能和用法。任務9用自制的跑馬燈電路實現8只LED循環點亮

9.1.3跟我學1)減1不為零循環轉移指令DJNZDJNZRn,rel;PC←PC+2,Rn←(Rn)-1,若(Rn)≠0,則PC←PC+relDJNZdirect,rel;PC←PC+2,direct←(direct)-1,若(direct)≠0,則

PC←PC+rel;每執行一次循環轉移指令,第一操作數(Rn或direct中的數)減1,并保存,若減1后結果不為零,則轉移至目的地(標號處);若減1后結果為零,則程序按順序執行下一條指令。

任務9用自制的跑馬燈電路實現8只LED循環點亮

2)移位指令移位指令的功能是對累加器A的內容進行循環移位,除了帶進位標志位CY的移位指令會影響CY外,其它指令都不影響CY、AC、OV等標志位。

RLA;循環左移指令;

RLCA;帶進位位循環左移指令;圖6-1RLA指令示意圖圖6-2RLCA指令示意圖任務9用自制的跑馬燈電路實現8只LED循環點亮

RRA;循環右移指令;RRCA;帶進位位循環右移指令;

任務9用自制的跑馬燈電路實現8只LED循環點亮

3)堆棧操作指令(1)堆棧的概念堆棧就是按照堆放貨物(先堆下面,先搬上面,即后進先出)的思路,設計一種按后進先出原則組成的存儲區,稱為堆棧區。在51單片機中,片內RAM都可用做堆棧區。在使用堆棧前,應設置一個棧底,告訴CPU從那個地址單元開始堆放數據,如棧底為40H單元,第1個數(設:#30H)存放在棧底的上一個單元41H中,則第2個數存放42H單元中,如果有多個數要堆放在堆棧區中,以此類推,當用戶取數時,則先從最頂部開始,即最后存的數先取出。在51單片機中有一個專門的堆棧指針寄存器SP,用于存放棧頂單元的地址。任務9用自制的跑馬燈電路實現8只LED循環點亮

(2)堆棧的作用堆棧的作用是在子程序調用與中斷時,用于保存斷點地址及片內數據單元的內容。(3)堆棧的使用方法需要用到堆棧時,首先通過MOVSP,#data指令設置棧底,如:MOVSP,#60H.

注意:51單片機復位后,默認的棧底為07H,即SP的默認值為07H。因07H地址在RAM的工作寄存器區,所以用07H作為棧底,不是很合適,使用時必須另設棧底。在子程序調用或響應中斷后,CPU會直接將斷點地址壓入堆棧區,但是要將某個數據保存在堆棧區就必須用壓棧指令PUSH和出棧指令POP。任務9用自制的跑馬燈電路實現8只LED循環點亮

壓棧指令格式為:PUSHdirect;SP←SP+1

;(SP)←(direct)執行時堆棧指針SP先加1,然后將直接地址direct中的數據壓至SP所指定的地址單元。如:MOVSP,#50H;設置棧底為50H單元

MOV30H,#25H;將立即數25H送30H單元

PUSH30H;將30H中的數據25H壓入堆棧區51H單元出棧指令格式為:POPdirect;(direct)←(SP);SP←SP-1該指令執行時先將SP所指單元數據彈出至direct所指的地址單元,然后SP減1指向新的棧頂單元地址。4)子程序調用指令子程序調用指令的功能調用子程序,執行時先將斷點地址(調用指令的下一條指令的首地址)壓入堆棧區,然后將子程序的首地址送PC,執行子程序。(1)長調用指令LCALLaddr16;PC←PC+3

;SP←SP+1

;(SP)←PC7-0

;SP←SP+1

;(SP)←PC15-8

;PC←addr16這條指令調用地址為addr16(在寫程序時都用子程序標號)處的子程序。執行時,先將PC+3(因為該指令是3字節指令)以獲得下一條指令的首地址(斷點地址),并把它壓入SP所指定的堆棧區,然后將子程序標號所在的16位地址送PC指針,使CPU轉去執行子程序。LCALL中的addr16取值范圍為16位地址,所以子程序可位于程序存儲器64KB空間的任何一處。(2)短調用指令ACALLaddr11;;PC←PC+2

;SP←SP+1

;(SP)←PC7-0

;SP←SP+1

;(SP)←PC15-8

;PC10-0←addr10-0

執行該指令時,先將PC+2得到下一條指令的16位首地址,并將其壓入堆棧,最后子程序標號所在的子程序入口地址送給PC,CPU轉入子程序執行。由于短調用指令中的PC高5位地址不變,所以其轉移的范圍為2KB。任務9用自制的跑馬燈電路實現8只LED循環點亮

ORG0000HAJMPSTART;轉移至標號START ORG0030H;以下程序下載到單片機的ROM時,從ROM的0030地址開始存儲

START:MOVR1,#00000001B;將立即數01H送R1 MOVR2,#08;將立即數8送R2,循環8次(8個燈)LOOP:MOVA,R1;將R1中的數送A MOVP0,A;將A中的數送P0口,點亮LED燈

CALLDEL1S;調用延時子程序,控制亮燈時間

RLA;A中的數據左移一位,為下一次亮燈作準備

MOVR1,A;左移后的數據存放在R1 DJNZR2,LOOP;循環了8次嗎?沒有則繼續

AJMPSTART;完成8次循環,轉移至START重新開始

;***************1秒鐘延時子程序***********************

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論