專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)匯編語(yǔ)言

作者:未知   來(lái)源:會(huì)員上傳   點(diǎn)擊數(shù):  更新時(shí)間:2014年05月20日   【字體:
 
a)        單個(gè)與多個(gè)LED燈,位操作與字節(jié)操作輸出
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
程序說(shuō)明:
可以用7段數(shù)碼管來(lái)代替各端口的8個(gè)LED燈,硬件的這種顯示方式使得數(shù)字表達(dá)成為實(shí)用。數(shù)字顯示由數(shù)碼管的硬件結(jié)構(gòu)與工作原理(7個(gè)LED燈的幾何變形組合)和數(shù)字表達(dá)的數(shù)據(jù)格式確定。
如:
共陽(yáng)極數(shù)碼管顯示數(shù)字3,則有P1口送數(shù)據(jù)#4FH;
MOV  P1, #0B0H
共陰極數(shù)碼管顯示數(shù)字8,則有P1口送數(shù)據(jù)#80H;
MOV  P1, #7F H
用數(shù)據(jù)表表示則有:
TABshuziyang: //陽(yáng)極管(共陰極管取反即可)
DB (數(shù)字0~F
C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H,88H,83H,C6H,A1H,86H,8EH
TABshuziyin: //陰極管(共陽(yáng)極管取反即可)
DB(數(shù)字0~F
        3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
 
b)        單個(gè)與多個(gè)LED燈閃爍—延時(shí)子程序注意定時(shí)器


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

圖1-單個(gè)LED燈-單個(gè)按鍵的實(shí)現(xiàn)。用P2.0口的狀態(tài)來(lái)控制其它Px.i口的狀態(tài),從而實(shí)現(xiàn)燈的開(kāi)與關(guān)。其中:左圖為Proteus軟件的界面,右圖為Keil軟件的界面。


圖2-單個(gè)LED燈與數(shù)碼管-單個(gè)按鍵的實(shí)現(xiàn)。用P2.0口的位狀態(tài)來(lái)控制其它P1口的字節(jié)狀態(tài),從而用字節(jié)數(shù)據(jù)傳輸實(shí)現(xiàn)數(shù)碼管的開(kāi)與關(guān)。詳細(xì)的說(shuō)明,后續(xù)再談。其中:圖2的左圖為Proteus軟件的界面,右圖為Keil軟件的界面。圖3為匯編指令集—匯編程序。
關(guān)閉窗口

相關(guān)文章