⑴ 如何迅速掌握單片機匯編語言的指令
剛好也有這么個困惑,已經解決了,拿出來分享下
比較轉移指令
CJNZ
CJNE
A,#data,rel
CJNE
A,direct,rel
CJNE
Rn,#data,rel
CJNE
@Ri,#data,rel
第一條指令的功能是將A中的值和立即數data比較,如果兩者相等,就次序執行(執行本
指令的下一條指令),如果不相等,就轉移,同樣地,我們能將rel理解成標號,即:CJNEA,
#data,標號。這樣利用這條指令,我們就能判斷兩數是否相等,這在很多場合是非常有用的。
但有時還想得知兩數比較之後哪個大,哪個小,本條指令也具有這樣的功能,如果兩數不相等,則CPU還會反映出哪個數大,哪個數小,這是用CY(進位位)來實現的。如果前面的
數(A中的)大,則CY=0,不然CY=1,因此在程序轉移後再次利用CY就可判斷出A中的數
比data大還是小了。
例:
MOV
A,R0
CJNE
A,#10H,L1
MOV
R1,#0FFH
AJMP
L3
L1:
JC
L2
MOV
R1,#0AAH
AJMP
L3
L2:
MOV
R1,#0FFH
L3:
SJMP
L3
JC是判CY是0,還是1進行轉移,如果CY=1,則轉移到JC後面的標號處
執行,如果CY=0則次序執行(執行它的下面一條指令)。
分析一下上面的程序,如果(A)=10H,則次序執行,即R1=0。如果(A)不等於10H,則轉
到L1處繼續執行,在L1處,再次進行判斷,如果(A)>10H,則CY=1,將次序執行,即執
行MOV
R1,#0AAH指令,而如果(A)<10H,則將轉移到L2處指行,即執行MOV
R1,#0FFH
指令。因此最終結果是:本程序執行前,如果(R0)=10H,則(R1)=00H,如果(R0)>10H,
則(R1)=0AAH,如果(R0)<10H,則(R1)=0FFH。
弄懂了這條指令,其它的幾條就類似了,第二條是把A當中的值和直接地址中的值比較,第
三條則是將直接地址中的值和立即數比較,第四條是將間址定址得到的數和立即數比較,這
里就不詳談了,下面給出幾個對應的常式。
CJNE
A,10H
;把A中的值和10H中的值比較(注意和上題的區別)
CJNE
10H,#35H
;把10H中的值和35H中的值比較
CJNE
@R0,#35H
;把R0中的值作為地址,從此地址中取數並和35H比較
⑵ 51單片機匯編程序詳解:POP是干什麼的
POP和PUSH是成對使用的,PUSH是壓棧,把數據內容放到堆棧里,POP是彈出棧,把堆棧里的內容取出來。
如果用槍的子彈夾比作堆棧,PUSH,相當於把子彈裝進彈夾,POP相當於把子彈從彈夾里打出去
⑶ 匯編語言在51單片機中的所有指令有那些
單片機指令功能一覽表
助記符 代碼 說明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接位元組送A
MOV A,@Ri ER~E7 間接RAM送A
MOV A,#data 74 data 立即數送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接位元組送寄存器
MOV Rn,#data 78~7F data 立即數送寄存器
MOV dircet,A F5 dircet A送直接位元組
MOV dircet,Rn 88~8F dircet 寄存器送直接位元組
MOV dircet1,dircet2 85 dircet1 dircet2 直接位元組送直接位元組
MOV dircet,@Ro 86~87 間接RAM送直接位元組
MOV dircet,#data 75 dircet data 立即數送直接位元組
MOV @Ri,A F6~F7 A送間接RAM
MOV @Ri,#data 76~77 data 直接位元組送間接RAM
MOV @Ri,#data 76~77 data 立即數送間接RAM
MOV DPTR,#data16 90 data 15~8 16位常數送數據指針
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))定址的程序存貯
器位元組選A
MOVC A,@A+PC 83 由((A)+(PC));定址的程序存貯器位元組送A
MOVX A,@Ri E2~E3 送外部數據(8位地址)送A
MOVX A,@DPTR E0 送外部數據(16位地址)送A
MOVX @Ri,A F2~F3 A送外部數據(8位地址)
MOVX @DPTR,A F0 A送外部數據(16位地址)
PUSH dircet C0 dircet 直接位元組進棧,SP加1
POP dircet D0 dircet 直接位元組退棧,SP減1
XCH A,Rn C8~CF 交換A和寄存器
XCH A,dircet C5 dircet 交換A和直接位元組
XCH A,@Ri C6~C7 交換A和間接RAM
XCH A,@Ri D6~D7 交換A和間接RAM的低位
SWAP A C4
算術操作 (A的二個半位元組交換)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接位元組加到A
ADD A,@Ri 26~27 間接RAM加到A
ADD A,#data 24data 立即數加到A
ADD A,Rn 38~3F 寄存器和進位位加到A
ADD A,dircet 35dircet 直接位元組和進位位加到A
ADD A,@Ri 36~37 間接位元組和進位位加到A
ADD A,data 34 data 立即數和進位位加到A
ADD A,Rn 98~9F A減去寄存器和進位位
ADD A,dircet 95 dircet A減去直接位元組和進位位
ADD A,@Ri 36~37 間接RAM和進位位加到A
ADD A,data 34 data 立即數和進位位加到A
SUBB A,Rn 98~9F A減去寄存器和進位位
SUBB A,dircet 95 dircet A減去直接位元組和進位位
SUBB A,@Ri 96~97 A減去間接RAM和進位位
SUBB A,#data 94 data A減去立即數和進位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接位元組加1
INC @Ri 06~07 間接RAM加1
DEC A 14 A減1
DEC Rn 18~1F 寄存器減1
DEC dircet 15 dircet 直接位元組減1
DEC @Ri 16~17 間接RAM減1
INC DPTR A3 數據指針加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十進制加法調整
邏輯操作
ANL A,Rn 58~5F 寄存器「與」到A
ANL A,dircet 55 dircet 直接位元組「與」到A
ANL A,@Ri 56~57 間接RAm「與」到A
ANL A,#data 54 data 立即數「與」到A
ANL dircet A 52 dircet A「與」到直接位元組
ANL dircet,#data 53 dircet data 立即數「與」到直接位元組
ORL A,Rn 48~4F 寄存器「或」到A
ORL A,dircet 45 dircet 直接位元組「或」到A
ORL A,@Ri 46~47 間接RAM「或」到A
ORL A,#data 44 data 立即數「或」到A
ORL dircet,A 42 dircet A「或」到直接位元組
ORL dircet,#data 43 dircet data 立即數「或」到直接位元組
XRL A,Rn 68~6F 寄存器「異或」到A
XRL A,dircet 65 dircet 直接位元組「異或」到A
XRL A,@Ri 66~67 間接RAM「異或」到A
XRL A,#data 64 data 立即數「異或」到A
XRL dircet A 62 dircet A「異或」到直接位元組
XRL dircet,#data 63 dircet data 立即數「異或」到直接位元組
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左環移
RLC A 33 A通過進位左環移
RR A 03 A右環移
RRC A 13 A通過進位右環移
控製程序轉移
ACALL addr 11 *1 addr(a7~a0) 絕對子程序調用
LCALL addr 16 12 addr(15~8) 長子程序調用
addr(7~0)
RET 22 子程序調用返回
RETI addr 11 32 中斷調用返回
AJMP addr 11 △1 addr(a7~a6) 絕對轉移
LJMP addr 16 02addr(15~8) 長轉移
addr(7~0)
SJMP rel 80 rel 短轉移,相對轉移
JMP @A+DPTR 73 相對於DPTR間接轉移
JZ rel 60 rel A為零轉移
JNZ rel 70 rel A為零轉移
CJNE A,dircet,rel B5 dircet rel 直接位元組與A比較,不等則轉移
CJNE A,#data,rel B4 data rel 立即數與A比較,不等則轉移
CJNE A,Rn,#data,rel B8~BF data rel 立即數與寄存器比較,不等則轉移
CJNE @Ri,#data,rel B6~B7 data rel 立即數與間接RAM比較,不等則轉移
DJNZ Rn,rel D8~DF rel 寄存器減1,不為零則轉移
DJNZ dircet,rel B5 dircet rel 直接位元組減1,不為零則轉移
NOP 00 空操作
*=a10a9a8l
△=a10a9a80
布爾變數操作
CLR C C3 清零進位
CLR bit C2 清零直接位
SETB C D3 置位進位
SETB bit D2 置位直接位
CPL C B3 進位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接數「與」到進位
ANL C,/bit B0 直接位的反「與」到進位
ORL C,bit 72 bit 直接位「或」到進位
ORL C,/bit A0 bit 直接位的反「或」到進位
MOV C,bit A2 bit 直接位送進位
MOV bit,C 92 bit 進位送直接位
JC rel 40 rel 進位位為1轉移
JNC rel 50 rel 進位位為0轉移
JB bit,rel 20 bit rel 直接位為1相對轉移
JNB bit,rel 30 bit rel 直接位為0相對轉移
JBC bit,rel 10 bit rel 直接位為1相對轉移,然後清零該位
[1]. 循環移位指令(4條)
RL A ;累加器A中的內容左移一位
RR A ;累加器A中的內容右移一位
RLC A ;累加器A中的內容連同進位位CY左移一位
RRC A ;累加器A中的內容連同進位位CY右移一位
[2]. 累加器半位元組交換指令(1條)
SWAP A ; 累加器中的內容高低半位元組互換
[3]. 求反指令(1條)
CPL A ; 累加器中的內容按位取反
[4]. 清零指令(1條)
CLR A ; 0→(A),累加器中的內容清0
[5]. 邏輯與操作指令(6條)
ANL A,data ;累加器A中的內容和直接地址單元中的內容執行與邏輯操作。結果存在寄存器A中。
ANL data,#data ;直接地址單元中的內容和立即數執行與邏輯操作。結果存在直接地址單元中。
ANL A,#data ;累加器A的內容和立即數執行與邏輯操作。結果存在累加器A中。
ANL A,Rn ;累加器A的內容和寄存器Rn中的內容執行與邏輯操作。結果存在累加器A中。
ANL data,A ;直接地址單元中的內容和累加器A的內容執行與邏輯操作。結果存在直接地址單元中。
ANL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行與邏輯操作。結果存在累加器A中。
[6]. 邏輯或操作指令(6條)
這組指令的作用是將兩個單元中的內容執行邏輯或操作。如果直接地址是I/O地址,則為「讀—修改—寫」操作。
ORL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯或操作。結果存在寄存器A中。
ORL data,#data ;直接地址單元中的內容和立即數執行邏輯或操作。結果存在直接地址單元中。
ORL A,#data ;累加器A的內容和立即數執行邏輯或操作。結果存在累加器A中。
ORL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯或操作。結果存在累加器A中。
ORL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯或操作。結果存在直接地址單元中。
ORL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯或操作。結果存在累加器A中。
[7]. 邏輯異或操作指令(6條)
XRL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯異或操作。結果存在寄存器A中。
XRL data,#data ;直接地址單元中的內容和立即數執行邏輯異或操作。結果存在直接地址單元中。
XRL A,#data ;累加器A的內容和立即數執行邏輯異或操作。結果存在累加器A中。
XRL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯異或操作。結果存在累加器A中。
XRL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯異或操作。結果存在直接地址單元中。
XRL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯異或操作。結果存在累加器A中
控制轉移類指令分析
[1]. 無條件轉移指令(4條)
LJMP addr16 ;addr16→(PC),給程序計數器賦予新值(16位地址)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序計數器賦予新值(11位地址),(PC15-11)不改變
SJMP rel ;(PC)+ 2 + rel→(PC)當前程序計數器先加上2再加上偏移量給程序計數器賦予新值
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址單元的值加上數據指針的值給程序計數器賦予新值
[2]. 條件轉移指令(8條)
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,則轉移到偏移量所指向的地址,否則程序往下執行
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的內容不為0,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的內容不等於直接地址單元的內容,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址單元中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
布爾變數操作指令分析
[1]. 位傳送指令(2條)
MOV C,bit ;bit→CY,某位數據送CY
MOV bit,C ;CY→bit,CY數據送某位
[2]. 位置位復位指令(4條)
CLR C ; 0→CY,清CY
CLR bit ; 0→bit,清某一位
SETB C ; 1→CY,置位CY
SETB bit ; 1→bit,置位某一位
[3]. 位運算指令(6條)
ANL C,bit ;(CY)∧(bit)→CY
ANL C,/bit ;(CY)∧( )→CY
ORL C,bit ;(CY)∨(bit)→CY
ORL C,/bit ;(CY)∧()→CY
CPL C ;()→CY
CPL bit ;()→bir
[4]. 位控制轉移指令(5)
JC rel ; (CY)=1轉移,(PC)+2+rel→PC,否則程序往下執行,(PC)+2→PC。
JNC rel ; (CY)=0轉移,(PC)+2+rel→PC,否則程序往下執行,(PC)+2→PC。
JB bit, rel ; 位狀態為1轉移。
JNB bit, rel ; 位狀態為0轉移。
JBC bit, rel ; 位狀態為1轉移,並使該位清「0」。
⑷ 單片機匯編語言程序的三種基本結構
匯編語言程序有順序程序、分支程序、循環程序三種。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。
分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。
(4)單片機的匯編語言程序指令詳解擴展閱讀:
注意事項:
匯編指令不區分大小寫,目的操作數是存結果的,原操作數是被操作的。
二進制數後跟b,十六進制數後跟h,十進制數不需特殊標記。
匯編源程序中,數據不能以字母開頭,需要在前面加上0,如0a000h。
⑸ 求單片機匯編語言程序解釋
注釋了一下,這個程序不全,編程也很不規范。
SECGE EQU 40H
SECSH EQU 41H
MINGE EQU 42H
MINSH EQU 43H
HOUGE EQU 44H
HOUSH EQU 45H
INTCS EQU 46H
ORG 0000H
START: AJMP MAIN
ORG 000BH
LJMP PITO
ORG 0030H
MAIN: MOV SP, #50H ;棧頂為50H
MOV PSW, #00H ;工作寄存器為0,各標志清零
MOV R0, #20H
MOV R6, #70H
MOV INTCS, #14H
CLR A
ML1: MOV @R0, A ;A的值送R0指向的地址的內容
INC R0
DJNZ R6, ML1 ;20H~8FH清零
MOV TMOD, #01H ;定時器0為16位定時器模式
MOV TH0, #03CH
MOV TL0, #0B0H ;定時/計數器0置初值,50ms中斷一次
CLR TR0 ;關閉定時器0計數
SETB EA ;開中斷
SETB ET0 ;ET0置1,開定時/計數器0中斷
MOV 46H, #0BH
TSF: MOV 79H, #0BH
MOV 7AH, #0BH
MOV 7BH, #0BH
MOV 7CH, #0BH
MOV 7DH, #0BH
MOV 7EH, #0AH
SETB 20H.1
UU: LCALL DISP ;調顯示子程序,顯示"P.
LCALL KEY ;取鍵值
JB ACC.0,UU ;沒有按鍵,循環等待
KSFSF: CLR 20H.1 ;有按鍵,清標志
LCALL DISP0 ;顯示P0
LCALL DISP ;顯示P
LCALL KEY ;取鍵值
JB ACC.0,KSFSF ;沒有按鍵循環等待
YUNXIN: SETB TR0 ;有按鍵,開定時器0
LCALL DISP0 ;顯示P0
LCALL DISP ;顯示P
LCALL KEY ;取鍵值
JB ACC.0,YUNXIN ;沒有按鍵循環等待
KEYSF: LCALL KEY ;有按鍵繼續取鍵值
JZ SETCLK ;鍵值為0,調用SETCLK
LCALL DISP0 ;顯示P0
LCALL DISP ;顯示P
AJMP KEYSF ;循環
SETCLK: CLR TR0 ;關定時器0
LCALL DISP0 ;顯示P0
LCALL DISP ;顯示P
LCALL KEY ;取鍵值
JZ SETCLK ;為0循環等待
JNB ACC.0, A1 ;不為0且最低位為0轉A1
KEYSF0: LCALL KEY ;否則重取鍵值
JZ YUNXIN ;鍵值為0調用YUNXIN
LCALL DISP0 ;顯示P0
LCALL DISP ;顯示P
SJMP KEYSF0 ;循環
KEY:
MOV P1, #0FFH ;向P1口寫入顯示信息
MOV A, P1
CPL A
ANL A, #0FH
RET
A1: JB ACC.1, A2 ;不是B鍵,轉A2
KEYSF1: LCALL KEY ;判B鍵釋放?
JZ ADDHOUR ;B鍵釋放,時加1
LCALL DISP0
LCALL DISP
AJMP KEYSF1
A2: JB ACC.2, A3 ;不是C鍵按下,轉A3
KEYSF2: LCALL KEY ;判C鍵釋放?
JZ ADDMIN ;C鍵釋放,分加1
LCALL DISP0
LCALL DISP
AJMP KEYSF2
A3: JB ACC.3, A4 ;不是D鍵按下,轉A4
KEYSF3: LCALL KEY ;判D鍵釋放?
JZ ADDSEC ;D鍵釋放,秒加1
LCALL DISP0
LCALL DISP
AJMP KEYSF3
A4: LJMP UU
ADDHOUR:MOV R0, #HOUSH ;取時的十位送R0
LCALL DADD1
MOV A, R2
XRL A, #24H ;時滿了24嗎?
JNZ ADD1 ;時未滿24,轉ADD1
LCALL CLR0 ;滿24,時顯示區清零
⑹ 51單片機LED操作匯編語言程序解釋
ORG 0000H //程序的入口
LJMP MAIN //跳到MAIN標號處
ORG 0100H //MAIN入口
MAIN: MOV TMOD, #10H //定義定時器/計數器的工作模式,此為T1方式0,為13位定時器/計數
MOV TL1, #00H //向定時器低位置初值
MOV TH1, #4BH //向定時器高位置初值
MOV R1, #20 //賦值
MOV R0, #00H //賦值
MOV A, #00H //賦值
MOV P3, A //p3口清零(T1口對應p3.5)
MOV DPTR, #TAB //取表中的值
SETB TR1 //開戶定時器T1
LOOP: JBC TF1, PTF1 //TF1為1時(TF1為T1的溢出標志位),清零,並跳到標號PTF1;
AJMP LOOP //等待中斷
PTF1: MOV TL1, #00H //向定時器低位置初值
MOV TH1, #4BH //向定時器高位置初值;因為方式0不能自動重裝初值,所以要軟體重裝初值
DJNZ R1, LOOP //循環
MOV R1, #20 //賦值
MOV A, R0
ADD A,#01H //加1
DA A //累加器十進制調整
ANL A, #0FH //與操作
MOV R0, A //保存A到R0中
MOVC A, @A+DPTR //取表中的值到A
MOV P1, A //將A送到P1口輸出
CPL P3.1 //取反
CPL P3.2 //取反
AJMP LOOP //循環
TAB: //表中的內容
DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
⑺ 誰有單片機匯編語言的指令解釋啊最主要是我現在還不懂指令中的jb,jz是什麼意思
不知道你指的是哪一類單片機,最常用的89C51系列單片機匯編語言共有111條指令,可分為5類:
[1].數據傳送類指令(共29條)
[2].算數運算類指令(共24條)
[3].邏輯運算及移位類指令(共24條)
[4].控制轉移類指令(共17條)
[5].布爾變數操作類指令(共17條)
jz 指令屬於第4類"控制轉移類"里的條件轉移指令,具體格式和作用是:
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,
則轉移到偏移量所指向的地址,否則程序往下執行。
jb 是屬於第5類"布爾變數操作類"指令,其格式和作用如下:
JB bit, rel ; 位狀態為1轉移。
⑻ 單片機(匯編語言)程序
開發當然是用C,又快又易懂好維護,但是想要優化程序還是要懂匯編的,要不然實現同樣一個功能的程序,好的程序員可以把程序設計得又短又快,而不做優化的可能會又臭又長,2K以下可以搞定的,你非要搞到4K以上去那最終產品的成本每個至少會相差幾毛到一兩塊錢,而且成本升高時質量卻是下降的,這樣當然就不好了,所以我個人認為做單片機編程,應當是匯編和C都會才是最好的,次一點的是會C,且能大致看懂匯編,可以幫助優化C程序,
只會匯編,一個程序開發下來,得花幾周到幾個月,開發成本太高了,不值得
只會C完全不懂匯編,那也是很難做出高質量的單片機程序的
⑼ 單片機(匯編語言)指令
MOV PC,#2222H
根本就沒有這條指令,這不是錯不錯的問題,是無中生有。匯編指令不是憑你自己的想像可隨便寫的。PC是程序計數器,是不可訪問的,更沒有MOV指令給它賦值。
⑽ 51單片機延遲程序(匯編語言)解析
DJNZ指令是先減一再判斷結果是不是為0,所以36H賦值0是可以的,標識要循環256次.
延時計算:
12M的晶振換算指令周期為1uS
MDLY1S: MOV 35H, #255 ;2uS
MOV 36H, #0 ;2uS
MOV 37H,#4 ;2uS
DLYB: NOP ;1us
DJNZ 35H, DLYB ;2us,第一次循環為255*(1+2)=765,以
;後為256*(1+2)=768
DJNZ 36H, DLYB ;2us 765+(255*768)+(2*256)=197119
DJNZ 37H,DLYB ;2us 197119+(197122*3)+(2*4)=788493
RET ;2us
所以,從進入函數開始到返回調用地址總的延時時間為: 2+2+2+788493+2 = 788501us