㈠ 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」。
㈡ 51單片機怎麼休眠
呵呵,最近剛好研究了一下這個問題 x0dx0ax0dx0a51單片機空閑和掉電模式應用x0dx0a 我們知道單片機內部有一個電源管理寄存器PCON,這個寄存器的最低兩位,IDL和PD這兩位分別用來設定是否使單片機進入空閑模式和掉電模式。x0dx0a 1. 空閑模式 當單片機進入空閑模式時,除CPU處於休眠狀態外,其餘硬體全部處於活動狀態,晶元中程序未涉及到的數據存儲器和特殊功能寄存器中的數據在空閑模式期間都將保持原值。但假若定時器正在運行,那麼計數器寄存器中的值還將會增加。單片機在空閑模式下可由任一個中斷或硬體復位喚醒,需要注意的是,使用中斷喚醒單片機時,程序從原來停止處繼續運行,當使用硬體復位喚醒單片機時,程序將從頭開始執行。???? 讓單片機進入空閑模式的目的通常是為了降低系統的功耗,舉個很簡單的例子,大家都用過數字萬用表,在正常使用的時候表內部的單片機處於正常工作模式,當不用時,又忘記了關掉萬用表的電源,大多數表在等待數分鍾後,若沒有人為操作,它便會自動將液晶顯示關閉,以降低系統功耗,通常類似這種功能的實現就是使用了單片機的空閑模式或是掉電模式。以STC89系列單片機為例,當單片機正常工作時的功耗通常為4mA~7mA,進入空閑模式時其功耗降至2mA,當進入掉電模式時功耗可降至0.1μA以下。x0dx0a2.?? 休眠模式 當單片機進入掉電模式時,外部晶振停振、CPU、定時器、串列口全部停止工作,只有外部中斷繼續工作。使單片機進入休眠模式的指令將成為休眠前單片機執行的最後一條指令,進入休眠模式後,晶元中程序未涉及到的數據存儲器和特殊功能寄存器中的數據都將保持原值。可由外部中斷低電平觸發或由下降沿觸發中斷或者硬體復位模式換醒單片機,需要注意的是,使用中斷喚醒單片機時,程序從原來停止處繼續運行,當使用硬體復位喚醒單片機時,程序將從頭開始執行。【例】:開啟兩個外部中斷,設置低電平觸發中斷,用定時器計數並且顯示在數碼管的前兩位,當計到5時,使單片機進入空閑(休眠)模式,同時關閉定時器,當單片機響應外部中斷後,從空閑(休眠)模式返回,同時開啟定時器。程序代碼如下:x0dx0a/************************************************************************x0dx0a************************************************************************/x0dx0a #define IdleMode() PCON |=0x01 //01為空閑模式x0dx0a // 當單片機進入空閑模式時,除CPU處於休眠狀態外,其餘硬體全部處於活動狀x0dx0a //晶元中程序未涉及到的數據存儲器和特殊功能寄存器中的數據在空閑模式期間都將保持原值。x0dx0a //但假若定時器正在運行,那麼計數器寄存器中的值還將會增加。x0dx0a //單片機在空閑模式下可由任一個中斷或硬體復位喚醒,x0dx0a //需要注意的是,使用中斷喚醒單片機時,程序從原來停止處繼續運行,當使用硬體復位喚醒單片機時,程序將從頭開始執行。x0dx0a #define PowerOFF() PCON |=0x02 //02掉電模式x0dx0a //進入掉電模式,外部晶振停振、CPU、定時器、串列口全部停止工作,只有外部中斷繼續工作x0dx0a //使單片機進入休眠模式的指令將成為休眠前單片機執行的最後一條指令x0dx0a //進入休眠模式後,晶元中程序未涉及到的數據存儲器和特殊功能寄存器中的數據都將保持原值。x0dx0a //可通過外部中斷喚醒,proteus模擬時無法喚醒x0dx0a #define EXT0_Init() EX0=1;EA=1 //打開外部中斷,以方便喚醒。喚醒後程序從原來停止處繼續運行x0dx0a //電源管理模板程序 x0dx0a main()x0dx0a{x0dx0a EXT0_Init();x0dx0a while(1) // x0dx0a {x0dx0a if(time.sec==0){time.sec++;PowerOFF();}x0dx0a //x0dx0a } x0dx0a}x0dx0a void EX0ISR(void) interrupt 0x0dx0a{x0dx0a //PCON&=0xfc; //清除之前的掉電(空閑)模式x0dx0a}
㈢ 簡述MCS51單片機中程序狀態寄存器PSW各位的含義。
PSW即程序狀態寄存器,Program Status Word。
PSW各位的定義如下:
Cy(PSW.7):即PSW的D7位,進位、借位標志。進位、借位CY=1;否則CY=0.
AC(PSW.6):即PSW的D6位,輔助進位、借位標志。當D3向D4有借位或進位時,AC=1;否則AC=0.
F0(PSW.5及PSW.1):即PSW的D5位,用戶標志位;
RS1及RS0(PSW.4及PSW.3):即PSW的D4、D3位,寄存器組選擇控制位;
OV(PSW.2):溢出標志。有溢出OV=1,否則OV=0;
F1(PSW·1):保留位,無定義;
P(PSW·0):奇偶校驗標志位,由硬體置位或清0;存在ACC中的運算結果有奇數個1時P=1,否則P=0。
㈣ 51單片機中MOV A,PSW這條指令對么 為什麼請詳細說明……
MOV A,PSW是對的,這個格式是直接定址的形式。在MCS-51單片機中,直接定址方式可以訪問片內RAM低128和所有特殊功能寄存器,PSW屬於特殊功能寄存器
㈤ 51單片機指令
TF1是定時器1溢出標志位,$是取地址。JNB TF1,$ 實現的功能是查詢定時器1溢出標志位,如果為0,跳轉到本條指令繼續執行(即繼續查詢)直到定時時間到,TF1置位,才執行下一條指令。
給你注釋一下:
MOV TMOD,#10H //設置定時器工作方式(定時器1,工作方式2)
SETB TR1 //開啟定時器1
LOOP: MOV TH1,#0D8H //裝初值D8F0H 即55536,定時10mS(晶振12M)時間隨晶振改變
MOV TL1,#0F0H
JNB TF1,$ //查詢等待定時器1中斷
CLR TF1 //定時器溢出標志位清0(定時時間到後硬體自動給TF1置位,需軟體清0)
CPL P1.1 //P1.1取反
SJMP LOOP //跳到LOOP處循環(是個死循環)
該段程序實現的功能是:每隔10mS對P1.1取反一次。(10mS當然是晶振為12M的情況下)
㈥ 單片機 psw是什麼
程序狀態寄存器PSW。
程序狀態寄存器是計算機系統的核心部件——運算器的一部分,PSW用來存放兩類信息:一類是體現當前指令執行結果的各種狀態信息,如有無進位(CY位),有無溢出(OV位),結果正負(SF位),結果是否為零(ZF位),奇偶標志位(P位)等。
另一類是存放控制信息,如允許中斷(IF位),跟蹤標志(TF位)等。有些機器中將PSW稱為標志寄存器FR(Flag
Register)。
51單片機的PSW是一個8位寄存器,用來存放指令執行後的一些的狀態,通常由CPU來填寫,但是用戶也可以改變各狀態位的值。
(6)51單片機保護指令擴展閱讀
單片機技術的開發:
1、CPU開發。開發單片機中的CPU匯流排寬度,能夠有效完善單片機信息處理功能緩慢的問題,提高信息處理效率與速度,開發改進中央處理器的實際結構,能夠做到同時運行2-3個CPU,從而大大提高單片機的整體性能。
2、程序開發。嵌入式系統的合理應用得到了大力推廣,對程序進行開發時要求能夠自動執行各種指令,這樣可以快速准確地採集外部數據,提高單片機的應用效率。
3、存儲器開發。單片機的發展應著眼於內存,加強對基於傳統內存讀寫功能的新內存的探索,使其既能實現靜態讀寫又能實現動態讀寫,從而顯著提高存儲性能。
參考資料來源:網路-psw
㈦ 51單片機如何利用IAP實現數據掉電不丟失相應程序怎麼寫
IAP的方式是寫入到程序Flash區保持數據不丟失
寫之前要保證區域內沒有會被執行到的程序。否則寫入數據後會導致程序死機會不斷重啟。
支持IAP的單片機類型比較多,請提供具體型號
以IAP15F2K61S2為例(STC官方代碼)
//IAP特殊功能寄存器:
sfrIAP_DATA=0xC2;//IAP數據寄存器
sfrIAP_ADDRH=0xC3;//IAP地址寄存器高位元組
sfrIAP_ADDRL=0xC4;//IAP地址寄存器低位元組
sfrIAP_CMD=0xC5;//IAP命令寄存器
sfrIAP_TRIG=0xC6;//IAP命令觸發寄存器
sfrIAP_CONTR=0xC7;//IAP控制寄存器
//IAP工作模式
#defineCMD_IDLE0//空閑模式
#defineCMD_READ1//IAP位元組讀命令
#defineCMD_PROGRAM2//IAP位元組編程命令
#defineCMD_ERASE3//IAP扇區擦除命令
//單片機運行頻率
//#defineENABLE_IAP0x80//ifSYSCLK<30MHz
//#defineENABLE_IAP0x81//ifSYSCLK<24MHz
#defineENABLE_IAP0x82//ifSYSCLK<20MHz
//#defineENABLE_IAP0x83//ifSYSCLK<12MHz
//#defineENABLE_IAP0x84//ifSYSCLK<6MHz
//#defineENABLE_IAP0x85//ifSYSCLK<3MHz
//#defineENABLE_IAP0x86//ifSYSCLK<2MHz
//#defineENABLE_IAP0x87//ifSYSCLK<1MHz
//測試地址
#defineIAP_ADDRESS0x0400
/*----------------------------
扇區擦除
----------------------------*/
voidIapEraseSector(WORDaddr)//擦除扇區是以512位元組為單位
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_ERASE;//設置IAP命令
IAP_ADDRL=addr;//設置IAP低地址
IAP_ADDRH=addr>>8;//設置IAP高地址
IAP_TRIG=0x5a;//寫觸發命令(0x5a)
IAP_TRIG=0xa5;//寫觸發命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
寫一位元組數據到ISP/IAP區域
----------------------------*/
voidIapProgramByte(WORDaddr,BYTEdat)
{
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_PROGRAM;//設置IAP命令
IAP_ADDRL=addr;//設置IAP低地址
IAP_ADDRH=addr>>8;//設置IAP高地址
IAP_DATA=dat;//寫ISP/IAP/EEPROM數據
IAP_TRIG=0x5a;//寫觸發命令(0x5a)
IAP_TRIG=0xa5;//寫觸發命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*----------------------------
從ISP/IAP/EEPROM區域讀取一位元組
----------------------------*/
BYTEIapReadByte(WORDaddr)//由於在程序儲存區內也可以用MOVC指令讀取
{
BYTEdat;//數據緩沖區
IAP_CONTR=ENABLE_IAP;//使能IAP
IAP_CMD=CMD_READ;//設置IAP命令
IAP_ADDRL=addr;//設置IAP低地址
IAP_ADDRH=addr>>8;//設置IAP高地址
IAP_TRIG=0x5a;//寫觸發命令(0x5a)
IAP_TRIG=0xa5;//寫觸發命令(0xa5)
_nop_();//等待ISP/IAP/EEPROM操作完成
dat=IAP_DATA;//讀ISP/IAP/EEPROM數據
IapIdle();//關閉IAP功能
returndat;//返回
}
/*----------------------------
關閉IAP
----------------------------*/
voidIapIdle()
{
IAP_CONTR=0;//關閉IAP功能
IAP_CMD=0;//清除命令寄存器
IAP_TRIG=0;//清除觸發寄存器
IAP_ADDRH=0x80;//將地址設置到非IAP區域
IAP_ADDRL=0;
}
通過以上代碼即可對Flash區進行寫入操作