在講指令系統(tǒng)前我們先來(lái)復(fù)習(xí)一下數(shù)制的概念。
1.十進(jìn)制(Decimal)
基數(shù)是10,它有10個(gè)數(shù)字符號(hào),即0,l,2,3,4,5,6,7,8,9。其中最大數(shù)碼是基數(shù)減1,即9,最小數(shù)碼是0。
2.二進(jìn)制(Binary)
基數(shù)是2,它只有兩個(gè)數(shù)字符號(hào),即0和1。這就是說(shuō),如果在給定的數(shù)中,除0和1外還有其它數(shù),例如 1012,它就決不會(huì)是一個(gè)二進(jìn)制數(shù)。
3、十六進(jìn)制(Hexadecilnal)
基數(shù)是16,它有16個(gè)數(shù)字符號(hào),除了十進(jìn)制中的10個(gè)數(shù)可用外,還使用了6個(gè)英文字母。它的16個(gè)數(shù)字依次是0,l,2,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn)。其中A至F分別代表十進(jìn)制數(shù)的10至15,最大的數(shù)字也是基數(shù)減1。
4、二進(jìn)制數(shù)與十六進(jìn)制數(shù)的相互轉(zhuǎn)換。
(1)、二進(jìn)制轉(zhuǎn)換為十六進(jìn)制:
整數(shù)部分,從低位開始,小數(shù)部分,從高位開始,每四位一組(不夠四位的補(bǔ)0),轉(zhuǎn)換為對(duì)應(yīng)的十六進(jìn)制數(shù)。
例:(1 0001 0011.1100 0111)2=(113.C7)H
(2)、十六進(jìn)制轉(zhuǎn)換為二進(jìn)制:
將十六進(jìn)制數(shù)的每一位分別轉(zhuǎn)換為對(duì)應(yīng)的四位二進(jìn)制數(shù)。
例:(3E9D)H=(11 1110 1001 1101)B
例:( 2ABE)H= 0010 1010 1011 1110B
以后我們?cè)?a target="_blank">單片機(jī)編程方面采用十六進(jìn)制,這個(gè)請(qǐng)大家注意了!
MCS-51系列單片機(jī)的指令系統(tǒng)共有111條指令,其中49條是單字節(jié)指令,45條是雙字節(jié)指令,17條是三字節(jié)指令。
MCS-51的指令系統(tǒng)共有33個(gè)功能,用匯編編程時(shí)只需要42個(gè)助記符就能指明這33個(gè)功能操作。
1、 指令格式:MCS-51匯編語(yǔ)言指令格式與其他微機(jī)的指令格式一樣,均由以下幾部分組成:[標(biāo)號(hào):]操作碼 [操作數(shù)][,操作數(shù)][;注釋]
標(biāo)號(hào):又稱為指令地址符號(hào),地址的符號(hào)化,一般由1到6個(gè)字符組成,以字母開頭的字母數(shù)字串,與操作碼之間用冒號(hào)分開。
操作碼:是由助記符表示的字符串,它規(guī)定了指令的操作功能。
操作數(shù):是指參加操作的數(shù)據(jù)和數(shù)據(jù)的地址。
注釋:是為該條指令作說(shuō)明,以便于閱讀。
注意:[ ]中表示為可選項(xiàng)。操作數(shù)可以為1、2、3個(gè),也可以沒有。
不同功能的指令,操作數(shù)作用不同,如:傳送指令多數(shù)有兩個(gè)操作數(shù),寫在左面的是目的操作數(shù)(表示操作結(jié)果存放的單元地址),寫在右面的稱為源操作數(shù)(指出操作數(shù)的來(lái)源)。操作碼和操作數(shù)之間必須用空格分隔,操作數(shù)與操作數(shù)之間必須用逗號(hào)“,”分隔。帶方括號(hào)項(xiàng)可有可無(wú),稱為可選項(xiàng)。操作碼是指令的核心不可缺少。
2、 指令分類
MCS-51的111條指令分為下面5類:
(1) 數(shù)據(jù)傳送類指令29條,分為片內(nèi)RAM,片外RAM、程序存儲(chǔ)器的傳送指令,交換及堆棧操作指令。
(2) 算術(shù)運(yùn)算類24條,分為加,帶進(jìn)位加,減,乘,除,加1,減1指令。
(3) 邏輯運(yùn)算類24條,分為邏輯與、或、異或、移位指令。
(4) 控制程序轉(zhuǎn)移類17條,分為無(wú)條件轉(zhuǎn)移與調(diào)用,條件轉(zhuǎn)移,空操作指令。
(5) 布爾變量操作類17條,分為數(shù)據(jù)傳送、位與、位或,位轉(zhuǎn)移指令。
3. 指令代碼:
(1) 數(shù)據(jù)傳送類
MOV 傳送數(shù)據(jù)
指令格式:MOV A,#DATA;將立即數(shù)DATA送到累加器A中。
例:
MOV P1,#11111110B;把立即數(shù)11111110B傳送到P1口。
MOVX 片外數(shù)據(jù)存儲(chǔ)器傳送數(shù)據(jù)
指令格式:MOVX A,@DPTR;將DPTR指向的地址單元中的內(nèi)容傳送至A中。
例:MOV DPTR,#1000H;將地址1000H傳送到數(shù)據(jù)指針DPTR中。
MOVX A,@DPTR;將DPTR指向的地址單元(1110H)中的內(nèi)容傳送至A中。
MOVC 程序存儲(chǔ)器傳送數(shù)據(jù)
指令格式: MOVC A,@A+DPTR;
例:MOV A,#00H
MOV DPTR,#1000H;將地址1000H傳送到數(shù)據(jù)指針DPTR中。
MOVC A,@A+DPTR;把累加器A的值和DPTR的值相加得到值作為地址,把這個(gè)程序存儲(chǔ)器的地址單元中的內(nèi)容傳送到A中。
(2) 算術(shù)運(yùn)算指令
ADD 不帶進(jìn)位的加法類指令
指令格式:ADD A,#DATA;把立即數(shù)DATA和累加器A的內(nèi)容相加得到的值存放到累加器A中。A+DATA→A
例:
SETB C;讓累加器C置1
MOV A,#01H;A=01H
ADD A,#01H;A=02H
ADDC 帶進(jìn)位的加法類指令
指令格式:ADDC A,#DATA;把立即數(shù)DATA和累加器A的內(nèi)容相加,再加上進(jìn)位標(biāo)志C得到的值存放到累加器A中。A+DATA+C→A
例:
SETB C; 把累加器C置1
MOV A,#01H ; A=01H
ADDC A,#01H; A+DATA+C→A ,A=03H
SUBB帶借位的減法類指令
指令格式:SUBB A,#DATA;把累加器A的內(nèi)容減去立即數(shù)DATA再減去進(jìn)位標(biāo)志C得到的值存放到累加器A中。A-DATA-C→A
例:
SETB C; 讓累加器C置1
MOV A,#03H; A=03H
SUBB A,#01H; A=01H
INC加一指令
指令格式:INC A ;把A的內(nèi)容加1再存儲(chǔ)到A中。
例:
MOV A,#01H;A=01H
INC A ;A=02H
DEC 減1指令
指令格式:DEC A ;把A的內(nèi)容減1再存儲(chǔ)到A中。
例:
MOV A,#03H ;A=03H
DEC A ;A=02H
(3) 邏輯運(yùn)算指令
CLR 清零指令
指令格式:CLR A ;把A的內(nèi)容清零再存儲(chǔ)到A中,A=00H。
MOV A,#00000001B;A=00000001B
CLR A ;A=00000000B
CPL 按位取反
指令格式:CPL A ;把A的內(nèi)容按位取反后再存儲(chǔ)到A中。
例:
MOV A,#00000001B;A=00000001B
CPL A ;A=11111110B
ANL 按位取與
指令格式:ANL A ;把A的內(nèi)容按位取與后再存儲(chǔ)到A中。
例:
MOV A,#01000001B ; A=00000001B
ANL A,#01001111B ; A=01000001B
ORL 按位取或
指令格式:ORL A ;把A的內(nèi)容按位取或后再存儲(chǔ)到A中。
例:
MOV A,#00000001B ;A=00000001B
ORL A,#10001111B ;A=10001111B
XRL 按位取異或,相同為0,不同為1。
指令格式:XRL A ;把A的內(nèi)容按位取異或后再存儲(chǔ)到A中。
例:
MOV A,#00000001B;A=00000001B
XRL A,#00001111B ;A=00001110B
RL左移位指令
指令格式:RL A ;把A的內(nèi)容按位左移后再存儲(chǔ)到A中。
例:
MOV A,#00000001B;A=00000001B
RL A ;A=00000010B
RL A ;A=00000100B
RL A;A=00001000B
RR右移位指令
指令格式:RR A ;把A的內(nèi)容按位右移后再存儲(chǔ)到A中。
例:
MOV A,#00000001B ;A=10000000B
RR A ;A=01000000B
RR A ;A=00100000B
RR A ;A=00010000B
(4) 位操作指令
SETB 置1指令,只能對(duì)位操作,不可以對(duì)字節(jié)操作。
指令格式:SETB BIT ;對(duì)位BIT置1。
例:
SETB P1.0 ;P1.0=1
CLR 清零指令,可對(duì)位操作,也可對(duì)字節(jié)操作。
指令格式:CLR BIT ;對(duì)位BIT置0。
SETB C
MOV A,#11110000B
CLR C
CLR A
CPL 取反,可對(duì)位操作,也可對(duì)字節(jié)操作。
指令格式:CPL BIT ;對(duì)位BIT取反。
SETB C
MOV A,#11110000B
CPL C
CPL A
(5) 控制及轉(zhuǎn)移指令
LJMP 長(zhǎng)跳轉(zhuǎn)指令
指令格式: LJMP 標(biāo)號(hào);程序?qū)⑻D(zhuǎn)到標(biāo)號(hào)處執(zhí)行。
LCALL長(zhǎng)調(diào)用子程序指令,常與RET配合使用。
指令格式: LCALL 標(biāo)號(hào);調(diào)用為標(biāo)號(hào)的子程序去執(zhí)行。
RET子程序返回指令。
DJNZ 條件轉(zhuǎn)移類指令(自減一指令)
指令格式: LOOP:DJNZ R7,LOOP
執(zhí)行分兩步:
(1) 將R7的內(nèi)容減一后再送到R7中。
(2) 判斷R7是不是等于0
如果是等于0,順序執(zhí)行下面的程序。
如果不等于0,跳轉(zhuǎn)到標(biāo)號(hào)為L(zhǎng)OOP的地方去執(zhí)行。
例:
MOV R7,#3;送循環(huán)次數(shù)。
CLR A;對(duì)A清零。
LOOP:INC A;對(duì)A加1。
DJNZ R7,LOOP;先讓R7自減1,后判斷是否等于0。
;不等于0跳轉(zhuǎn),等于零往下執(zhí)行。
END
運(yùn)行上面的程序后累加器A的值是多少?
答案:A=03H
學(xué)完了指令系統(tǒng)現(xiàn)在我們來(lái)實(shí)戰(zhàn)一下,一個(gè)單片機(jī)最小系統(tǒng)的制作
單片機(jī)最小系統(tǒng)制作
一、確定任務(wù)
開發(fā)單片機(jī)最小系統(tǒng)
二、任務(wù)分析:
該系統(tǒng)具有的功能:
(1)具有2位LED數(shù)碼管顯示功能。
(2)具有八路發(fā)光二極管顯示各種流水燈。
(3)可以完成各種奏樂(lè),報(bào)警等發(fā)聲音類實(shí)驗(yàn)。
(4)具有復(fù)位功能。
三、功能分析
(1)兩位LED數(shù)碼管顯示功能,我們可以利用單片機(jī)的P0口接兩個(gè)數(shù)碼管來(lái)現(xiàn)這個(gè)功能;
(2)八路發(fā)光二極管顯示可以利用P1口接八個(gè)發(fā)光二極管實(shí)現(xiàn)這個(gè)功能;
(3)各種奏樂(lè)、報(bào)警等發(fā)聲功能可以采用P2.0這個(gè)引腳接一蜂鳴器來(lái)實(shí)現(xiàn)。
(4)利用單片機(jī)的第9腳可以設(shè)計(jì)成復(fù)位系統(tǒng),我們采用按鍵復(fù)位;利用單片機(jī)的18、19腳可以設(shè)計(jì)成時(shí)鐘電路,我們利用單片機(jī)的內(nèi)部振蕩方式設(shè)計(jì)的。
四、設(shè)計(jì)框圖
根據(jù)本系統(tǒng)的功能,和單片機(jī)的工作條件,我們?cè)O(shè)計(jì)出下面的電路圖。
六、元件清單的確定:
數(shù)碼管:共陰極2只(分立)
電解電容:10UF的一只
30PF的電容2只
220歐的電阻9只
4.7K的電阻一只
1.2K的電阻一只
4.7K的排阻一只,
12MHZ的晶振一只
有源5V蜂名器一只
AT89S51單片機(jī)一片
常開按鈕開關(guān)1只
緊鎖座一只(方便芯取下來(lái)的,綠色的)
發(fā)光二極管(5MM紅色)8只
萬(wàn)能板電路版15*17CM
S8550三極管一只
4.5V電池盒一只,導(dǎo)線若干。
七、硬件電路的焊接
按照原理圖把上面的元件焊接好,詳細(xì)步驟省略。
八、相關(guān)程序編寫
針對(duì)上面的電路原理圖,設(shè)計(jì)出本系統(tǒng)的詳細(xì)功能:
(1)、第一個(gè)發(fā)光二極管點(diǎn)亮,同時(shí)數(shù)碼管顯示“1”。
(2)、第二個(gè)發(fā)光二極管點(diǎn)亮,同時(shí)數(shù)碼管顯示“2”。
(3)、依次類推到第八個(gè)發(fā)光二極管點(diǎn)亮,同時(shí)數(shù)碼管顯示“8”。
以上出現(xiàn)的是流水燈的效果
(4)、所有的發(fā)光二極管滅了,同時(shí)數(shù)碼管現(xiàn)實(shí)“0”。
(5)、數(shù)碼管顯示“1”。
(6)、數(shù)碼管顯示“2、……”直到“9、A、B、C、D、E、F、Y”。
(7)、蜂鳴器發(fā)出九聲報(bào)警聲后重復(fù)上面所有步驟。
(8)程序如下:
ORG 0000H;偽指令,定義下面的程序代碼(機(jī)器代碼)從地址為0000H的單元存放。
LJMP START;跳轉(zhuǎn)到標(biāo)號(hào)為START的地方去執(zhí)行。
ORG 0030H;偽指令,定義下面的程序代碼(機(jī)器代碼)從地址為0030H的單元存放。
START:MOV P1,#0FEH ;點(diǎn)亮第一個(gè)發(fā)光二極管。
CLR P2.7 ;送低電平到第一個(gè)數(shù)碼管,開啟數(shù)碼管。
CLR P2.6 ;送低電平到第二個(gè)數(shù)碼管,開啟數(shù)碼管。
MOV P0,#06H;讓數(shù)碼管顯示“1” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#0FDH;點(diǎn)亮第二個(gè)發(fā)光二極管。
MOV P0,#5bH;讓數(shù)碼管顯示“2” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#0FBH;點(diǎn)亮第三個(gè)發(fā)光二極管。
MOV P0,#4fH;讓數(shù)碼管顯示“3” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#0F7H;點(diǎn)亮第四個(gè)發(fā)光二極管。
MOV P0,#66H;讓數(shù)碼管顯示“4” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#0EFH;點(diǎn)亮第五個(gè)發(fā)光二極管。
MOV P0,#6dH;讓數(shù)碼管顯示“5” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#0DFH;點(diǎn)亮第六個(gè)發(fā)光二極管。
MOV P0,#7dH;讓數(shù)碼管顯示“6” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#0BFH;點(diǎn)亮第七個(gè)發(fā)光二極管。
MOV P0,#07H;讓數(shù)碼管顯示“7” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#7FH;點(diǎn)亮第八個(gè)發(fā)光二極管。
MOV P0,#7fH;讓數(shù)碼管顯示“8” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P1,#00H;滅了所有的發(fā)光二極管。
MOV P0,#3FH;讓數(shù)碼管顯示“0” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#06H;讓數(shù)碼管顯示“1” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#5bH;讓數(shù)碼管顯示“2” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#4fH;讓數(shù)碼管顯示“3” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#66H;讓數(shù)碼管顯示“4” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#6dH;讓數(shù)碼管顯示“5” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7dH;讓數(shù)碼管顯示“6” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#07H;讓數(shù)碼管顯示“7” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“8” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#6fH;讓數(shù)碼管顯示“9” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“A” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“b” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“C” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“d” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“E” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“F” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV P0,#7fH;讓數(shù)碼管顯示“Y” 。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
MOV R4,#9;送蜂鳴器的報(bào)警次數(shù)。
LOOP:SETB P2.0;不發(fā)聲
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
CLR P2.0;發(fā)聲。
LCALL DELAY;調(diào)用延時(shí)子程序,起到延時(shí)的目的。
DJNZ R4,LOOP;發(fā)聲九次后向下執(zhí)行。
SETB P2.0;關(guān)閉發(fā)聲
LJMP START;跳轉(zhuǎn)到標(biāo)號(hào)為START處執(zhí)行,循環(huán)本程序。
DELAY:MOV R7,#200;這是延時(shí)子程序。
D1:MOV R6,#200
D2:MOV R5,#200
D3:DJNZ R5,D3
DJNZ R6,D2
DJNZ R7,D1
RET;延時(shí)子程序返回指令。
END;結(jié)束偽指令。
九、利用KEIL C51 軟件對(duì)上面的程序進(jìn)行調(diào)試和編譯,產(chǎn)生*.HEX文件,以便用編程器寫入單片機(jī)芯片中。
十、編程器的使用:用編程器把電腦里生成的*.HEX文件寫到芯片中。
十一、產(chǎn)品調(diào)試:通上4.5V(三節(jié)電池)的電源,可以調(diào)試本系統(tǒng),如果沒有錯(cuò)誤就可以正常工作了。
-
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7435瀏覽量
163522 -
51單片機(jī)
+關(guān)注
關(guān)注
273文章
5697瀏覽量
122997 -
指令系統(tǒng)
+關(guān)注
關(guān)注
1文章
81瀏覽量
15633
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論