<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51單片機匯編語言

        作者:未知   來源:會員上傳   點擊數:  更新時間:2014年05月20日   【字體:
         
        a)        單個與多個LED燈,位操作與字節操作輸出
        ORG 0000H
        START:
           CLR C
          MOV P0.0,C
          MOV P1.1,C
          MOV P2.2,C
          MOV P3.3,C
          CLR A
          CPL A
          MOV P0,A
          MOV P1,A
          MOV P2,A
          MOV P3,A
          END
        程序說明:
        可以用7段數碼管來代替各端口的8個LED燈,硬件的這種顯示方式使得數字表達成為實用。數字顯示由數碼管的硬件結構與工作原理(7個LED燈的幾何變形組合)和數字表達的數據格式確定。
        如:
        共陽極數碼管顯示數字3,則有P1口送數據#4FH;
        MOV  P1, #0B0H
        共陰極數碼管顯示數字8,則有P1口送數據#80H;
        MOV  P1, #7F H
        用數據表表示則有:
        TABshuziyang: //陽極管(共陰極管取反即可)
        DB (數字0~F
        C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C6H,A1H,86H,8EH
        TABshuziyin: //陰極管(共陽極管取反即可)
        DB(數字0~F
                3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
         
        b)        單個與多個LED燈閃爍—延時子程序注意定時器


        前邊已經看到,通過改變位或字節的賦值,可以使得LED燈亮或滅,以此形成閃爍效果。但是硬件的響應時間太短,使得效果不佳。雖然可以通過改變單片機的時鐘設置來改變效果。但時鐘的改變極其不方便,因此需要利用延時指令(注意定時器功能)獲得理想的效果。延時效果是利用單片機空轉來實現的。
          ACALL  DELAY   ; 調延時子程序 
        *************************************************************************
        DELAY:      ; 延時子程序 — 這是一個非常有用、而且常見的一個子程序
          MOV R5,#04H    ;將16進制數04H傳遞給寄存器R5
        F3:
          MOV R6,#0FFH  ;將16進制數0FFH傳遞給寄存器R6
        F2:
          MOV R7,#0FFH  ;將16進制數0FFH傳遞給寄存器R7
        F1:
          DJNZ  R7, F1 ;寄存器R7減1非0跳轉到F1,直到減為0順序執行下一指令
          DJNZ  R6, F2 ;寄存器R6減1非0跳轉到F2,直到減為0順序執行下一指令
          DJNZ  R5, F3 ;寄存器R5減1非0跳轉到F3,直到減為0順序執行下一指令
          RET       ; 子程序結束,返回子程序入口處  ACALL  DELAY   ; 調延時子程序 
        ***************************************************************************
        應用實例
        MAIN:
           CLR C      MOV P0.0,C      MOV P1.1,C     MOV P2.2,C   MOV P3.3,C
            ACALL  DELAY   ; 調延時子程序
         CLR A
          CPL A
          MOV P0,A
          MOV P1,A
          MOV P2,A
          MOV P3,A
        ACALL DELAY; 調延時子程序 
        SJMP MAIN ;相對轉移時間短,用AJMP絕對轉移時間長,RET是用于子程序的返回
          DELAY:      ; 延時子程序 - 這是一個非常有用、而且常見的一個子程序
          MOV R5,#04H    ;16進制數04H傳遞給寄存器R5
        F3:
          MOV R6,#0FFH  ;16進制數0FFH傳遞給寄存器R6
        F2:
          MOV R7,#0FFH  ;16進制數0FFH傳遞給寄存器R7
        F1:
          DJNZ  R7, F1 ;寄存器R710跳轉到F1,直到減為0順序執行下一指令
          DJNZ  R6, F2 ;寄存器R610跳轉到F2,直到減為0順序執行下一指令
          DJNZ  R5, F3 ;寄存器R510跳轉到F3,直到減為0順序執行下一指令
          RET       ; 子程序結束,返回子程序入口處  ACALL  DELAY   ; 調延時子程序  
          END
        程序說明:
        注意延時子程序中的DJNZ  R7, F1;DJNZ  R6, F2 ; DJNZ  R5, F3 ;通過增加或減少循環數目控制或改變延時時間
         
        c)         單個與多個LED燈流動—位循環、字節循環與延時子程序
        ORG 0000H
        MAIN:
        ;****************位循環掃描—流水燈—逐級增加燈的數目*******************
        CLR C        MOV P0.0,C          ACALL  DELAY   ; 調延時子程序
        MOV P0.1,C   ACALL  DELAY      MOV P0.2,C  
        ACALL  DELAY    MOV P0.3,C       ACALL  DELAY     MOV P0.4,C
        ACALL  DELAY    MOV P0.5,C      ACALL  DELAY      MOV P0.6,C
            ACALL  DELAY   MOV P0.7,C
            ACALL  DELAY ;注意前面各位狀態一直持續。P0口各位電平保持不變
        ;****************位循環—流水燈—逐個改變燈亮與滅*******************
          CLR C       MOV P0.0,C         ACALL  DELAY  ; 調延時子程序
        CPL C       MOV P0.0,C         ACALL  DELAY
          CLR C       MOV P0.1,C         ACALL  DELAY
        CPL C       MOV P0.1,C         ACALL  DELAY
          CLR C       MOV P0.2,C         ACALL  DELAY
        CPL C       MOV P0.2,C         ACALL  DELAY
          CLR C       MOV P0.3,C         ACALL  DELAY
        CPL C       MOV P0.3,C         ACALL  DELAY
          CLR C      MOV P0.4,C      ACALL  DELAY
        CPL C      MOV P0.4,C      ACALL  DELAY
          CLR C      MOV P0.5,C      ACALL  DELAY
        CPL C  MOV P0.5,C   ACALL DELAY;注意前面各位狀態—電平、輸出狀態變化
        ……、……
         ;*******************字節循環—逐級增加輸出口的數目********************
          CPL A  MOV P0,A     ACALL  DELAY    MOV P1,A     ACALL  DELAY 
          MOV P2,A      ACALL  DELAY   MOV P3,A    ACALL  DELAY
        ;*******************字節循環—流水燈—逐漸改變燈的亮滅狀態*************
          MOV  P2,#01H ;注意:#01H #02H #04H #08H #80H #40H #20H #10H陽極管
             ACALL  DELAY 
          MOV  P2,#02H;注意:#FEH #FDH #FBH #F7H #7FH #BFH #DFH #EFH陰極管
             ACALL  DELAY   MOV  P2,#04H   ACALL  DELAY  MOV  P2,#08H
             ACALL  DELAY   MOV  P2,#10H   ACALL  DELAY  MOV  P2,#20H
             ACALL  DELAY   MOV  P2,#40H   ACALL  DELAY  MOV  P2,#80H
             ACALL  DELAY 
        ;****************字節循環—數碼管—字符(數字、字母等)**************
          MOV  P1,#40H  ;改變字節中各位的電平狀態,以便控制輸出、顯示所要求的內容
             ACALL  DELAY   MOV  P1,#79H    ACALL  DELAY   MOV  P1,#24H
             ACALL  DELAY   MOV  P1,#30H    ACALL  DELAY   MOV  P1,# 19H
             ACALL  DELAY   MOV  P1,#12H    ACALL  DELAY   MOV  P1,#02H
             ACALL  DELAY   MOV  P1,#78H    ACALL  DELAY 
        SJMP MAIN ;相對轉移時間短,用AJMP絕對轉移時間長,RET是用于子程序的返回
        ;*******************延時子程序***************************
          DELAY:      ; 延時子程序—去除一個循環,時間變短了。
          MOV R6,#04H ;將16進制數04H傳遞給工作寄存器R6。改變#04H為#3FH時間變長
        F2:
          MOV R7,#0FFH  ;將16進制數0FFH傳遞給工作寄存器R7
        F1:
          DJNZ  R7, F1 ;寄存器R7減1非0跳轉到F1,直到減為0順序執行下一指令
          DJNZ  R6, F2 ;寄存器R6減1非0跳轉到F2,直到減為0順序執行下一指令
          RET       ; 子程序結束,返回子程序入口處  ACALL  DELAY   ; 調延時子程序 
          END
         
        ;********字節循環數碼管字符(數字、字母等)數表指針***********
        MAIN:
        CLR A
               MOV P3,#00H
                MOV P0,#00H
                MOV P2,#00H
             MOV R0,#00H  ;寄存器中放數值0
                MOV DPTR,#TABZshuzi ;指針PC指向數表
        DISP:                ;段標記
             MOV A,R0  ;將寄存器中的數值轉移到累加器中
                MOVC A,@A+DPTR  ;以DPTR作為基礎,與累加器相加得到新地址給累加器
                MOV P3,A   ;將累加器的地址給P3口
                MOV P0,A
                SETB p2.3 ;一位數顯示位控制;個位
                SETB p2.7
                      ACALL DELAY  ;調延時子程序
                      ACALL DELAY
                INC R0 ;寄存器R0加1
                CJNE R0,#16H,DISP ;寄存器與立即數18比較,不相等則轉移到DISP循環。相等則順序執行
        TABshuziyang://陽極管
        DB  C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C6H,A1H,86H,8EH,0FFH
        TABshuziyin: //陰極管
        DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH
        END
        ;*************字節循環數碼管字符(數字、字母等)移位控制***********
        RL A  將累加器的值左移一位
        RLC A  將累加器含進位C左移一位
        RR A  將累加器的值右移一位
        RRC A  將累加器含進位C右移一位
         
        1.  單個按鍵,單個與多個LED最小系統位輸入與位、字節輸出判斷與子程序
        a)       單個按鍵與單個LED燈(位操作輸入與輸出)判斷與子程序
        b)      單個按鍵與多個LED燈(位操作輸入與字節操作輸出)
        c)       單個按鍵與多個LED燈(位操作輸入與位、字節操作輸出)
        d)      單個按鍵與單個電機控制開環控制
         
        1. 單個按鍵,單個與多個LED位操作輸入位、字節操作輸出)—最小系統
        a)  單個按鍵,單個LED燈(位操作與位輸入、輸出)—有、無判斷而傳送數據
        通過三個方面(程序指令、虛擬仿真、實體電路)探討單輸入與單輸出:主要是理解位數據傳送,包括匯編語言的數據傳送指令實踐、實際虛擬電路的數據傳送響應,以體現抽象與具體的可理解性。
        ??  單輸出的電子線路 — 靜態特性— 動態特性,指令控制輸出
        ??  單輸入與單的電子線路 — 靜態特性(線路組成與結構)
        ??  單輸入與單輸出電子線路的控制指令 — 動態特性(行為與狀態)
        ;分號,這是一種注釋方式符號
        ORG  0000H   ;這是偽指令,機器并不執行,用于程序的交流。指令執行的起始地址,十進制用D表示,十六進制用H表示,二進制用B表示。一個字節(8位機、16位機、32位機、64位機)一次執行。也可以按位來執行,也就是一個bit。
        ORG  00000000B與ORG  0000H作用相同。注意8位(bit)一個字節。16位的處理器需要用0000 0000H 表示。16或32位以上,使用操作系統(Wince、Linux等)更有效,可以利用大量的、底層的、專業化、標準化的面向控制的庫函數(如:API等)。
        START:  ;這是偽指令,機器并不執行。只是為了匯編語言講故事的可理解性
           MAIN:    ;偽指令,主程序,用于區別子程序
           PC→MOV  A,#00H   ;將立即數00000000B(常數0D)傳送給累加器ACC(專用寄存器,可用于存放計算結果等)。要通過累加器A和其它存儲地址進行數據交換。注意PC是自動移位(自動+1)到下一個語句的地址。使用該語句實質上是讓PC具有初始位置。
        PC→MOV  P1,   ;將累加器中的數(常數0D)傳送給端口P1(P1口8位全部置0,低電平, P1端口各位處于關閉狀態,LED燈處于系統響應的準備狀態),按字節傳送數據。特別記憶:PC→表示指針所指地址,并會自動加1。輸出口字節
        PC→MOV  C,0A0H   ;檢測P2.0口的狀態,將P2.0口的狀態(由按鍵狀態決定)傳送給位累加器C,位累加器C的地址是PSW(程序狀態字寄存器)的進位標志位CY(D7H\PSW.7)。P2.0口可以是開或關,也就是置1或0,高電平或低電平),按字節傳送數據。要通過位累加器C和其它存儲地址進行數據交換。該語句也可以寫成:MOV  C,P2.0,比較字節數據傳送MOV A,#00H或MOV  A,P1。輸入口
        PC→MOV  P1.0,C   ;等價于MOV  90H,C  ;將位累加器C地址中的值傳送給P1.0口(90H是其直接地址),也就是將P2.0口的狀態(由直接地址0A0H狀態決定)傳送給直接地址90H,P1.0口,輸出口
        PC→MOV  P1.1,  ;等價于MOV  91H,C
        PC→MOV  P1.2,  ;等價于MOV  92H,C
        PC→MOV  P1.3,  ;等價于MOV  93H, 等等
        END ;偽指令,程序結束標志
        程序說明
        單個按鍵控制單個LED燈及其狀態,也可以控制若干個LED燈及其狀態。也就是多個LED燈,單個按鍵。反過來,可以是多個按鍵控制單個燈或多個按鍵控制多個LED燈。通過簡單硬件連接和匯編語言的位指令運用,理解單片機作為數字電路的特點,門電路的特點,開關電路的特點,高與低電平時的電子線路處于開或關的狀態,或叫關閉與導通。

        圖1-單個LED燈-單個按鍵的實現。用P2.0口的狀態來控制其它Px.i口的狀態,從而實現燈的開與關。其中:左圖為Proteus軟件的界面,右圖為Keil軟件的界面。


        圖2-單個LED燈與數碼管-單個按鍵的實現。用P2.0口的位狀態來控制其它P1口的字節狀態,從而用字節數據傳輸實現數碼管的開與關。詳細的說明,后續再談。其中:圖2的左圖為Proteus軟件的界面,右圖為Keil軟件的界面。圖3為匯編指令集—匯編程序。
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮