新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > MCS-51單片機(jī)匯編指令詳解

        MCS-51單片機(jī)匯編指令詳解

        作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏

           位及位操作指令

              通過(guò)前面那些流水燈的例子,我們已經(jīng)習(xí)慣了“位”一位就是一盞燈的亮和滅,而我們學(xué)的指令卻全都是用“字節(jié)”來(lái)介紹的:字節(jié)的移動(dòng)、加法、減法、邏輯運(yùn)算、移位等等。用字節(jié)來(lái)處理一些數(shù)學(xué)問(wèn)題,比如說(shuō):控制冰箱的溫度、電視的音量等等很直觀,可以直接用數(shù)值來(lái)表在。可是如果用它來(lái)控制一些開關(guān)的打開和合上,燈的亮和滅,就有些不直接了,記得我們上次課上的流水燈的例子嗎?我們知道送往P1口的數(shù)值后并不能馬上知道哪個(gè)燈亮和來(lái)滅,而是要化成二進(jìn)制才知道。工業(yè)中有很多場(chǎng)合需要處理這類開關(guān)輸出,繼電器吸合,用字節(jié)來(lái)處理就顯示有些麻煩,所以在8031單片機(jī)中特意引入一個(gè)位處理機(jī)制。

            一、.位尋址區(qū)

              在8031中,有一部份RAM和一部份SFR是具有位尋址功能的,也就是說(shuō)這些RAM的每一個(gè)位都有自已的地址,可以直接用這個(gè)地址來(lái)對(duì)此進(jìn)行操作。

        字節(jié)地址

        位地址

        2FH

        7FH

         

         

         

         

         

         

        78H

        2EH

        77H

         

         

         

         

         

         

        70

        2DH

        6FH

         

         

         

         

         

         

        68H

        2CH

        67H

         

         

         

         

         

         

        60H

        2BH

        5FH

         

         

         

         

         

         

        58H

        2AH

        57H

         

         

         

         

         

         

        50H

        29H

        4FH

         

         

         

         

         

         

        48H

        28H

        47H

         

         

         

         

         

         

        40H

        27H

        3FH

         

         

         

         

         

         

        38H

        26H

        37H

         

         

         

         

         

         

        30H

        25H

        2FH

         

         

         

         

         

         

        28H

        24H

        27H

         

         

         

         

         

         

        20H

        23H

        1FH

         

         

         

         

         

         

        18H

        22H

        17H

         

         

         

         

         

         

        10H

        21H

        0FH

         

         

         

         

         

         

        08H

        20H

        07H

        06H

        05H

        04H

        03H

        02H

        01H

        00H

        圖1

                內(nèi)部RAM的20H-2FH這16個(gè)字節(jié),就是8031的位尋址區(qū)。看圖1。可見這里面的每一個(gè)RAM中的每個(gè)位我們都可能直接用位地址來(lái)找到它們,而不必用字節(jié)地址,然后再用邏輯指令的方式。

            二、可以位尋址的特殊功能寄存器

              8031中有一些SFR是可以進(jìn)行位尋址的,這些SFR的特點(diǎn)是其字節(jié)地址均可被8整除,如A累加器,B寄存器、PSW、IP(中斷優(yōu)先級(jí)控制寄存器)、IE(中斷允許控制寄存器)、SCON(串行口控制寄存器)、TCON(定時(shí)器/計(jì)數(shù)器控制寄存器)、P0-P3(I/O端口鎖存器)。以上的一些SFR我們還不熟,等我們講解相關(guān)內(nèi)容時(shí)再作詳細(xì)解釋。

            三、位操作指令

              MCS-51單片機(jī)的硬件結(jié)構(gòu)中,有一個(gè)位處理器(又稱布爾處理器),它有一套位變量處理的指令集。在進(jìn)行位處理時(shí),CY(就是我們前面講的進(jìn)位位)稱“位累加器”。有自已的位RAM,也就是我們剛講的內(nèi)部RAM的20H-2FH這16個(gè)字節(jié)單元即128個(gè)位單元,還有自已的位I/O空間(即 P0.0…..P0.7,P1.0…….P1.7,P2.0……..P2.7,P3.0……..P3.7)。當(dāng)然在物理實(shí)體上它們與原來(lái)的以字節(jié)尋址用的 RAM,及端口是完全相同的,或者說(shuō)這些RAM及端口都可以有兩種用法。

                1..位傳送指令

                  MOV C,BIT

                  MOV BIT,C

                  這組指令的功能是實(shí)現(xiàn)位累加器(CY)和其它位地址之間的數(shù)據(jù)傳遞。

                例:MOV P1.0,CY ;將CY中的狀態(tài)送到P1.0引腳上去(如果是做算術(shù)運(yùn)算,我們就可以通過(guò)觀察知道現(xiàn)在CY是多少啦)。

                  MOV P1.0,CY ;將P1.0的狀態(tài)送給CY。

              2..位修正指令

                  位清0指令

                  CLR C ;使CY=0

                  CLR bit ;使指令的位地址等于0。例:CLR P1.0 ;即使P1.0變?yōu)?

                  位置1指令

                    SETB C ;使CY=1

                    SETB bit ;使指定的位地址等于1。例:SETB P1.0 ;使P.0變?yōu)?

                  位取反指令

                    CPL C ;使CY等于原來(lái)的相反的值,由1變?yōu)?,由0變?yōu)?。

                    CPL bit ;使指定的位的值等于原來(lái)相反的值,由0變?yōu)?,由1變?yōu)?。

                    例:CPL P1.0

                    以我們做過(guò)的實(shí)驗(yàn)為例,如果原來(lái)燈是亮的,則執(zhí)行本指令后燈滅,反之原來(lái)燈是滅的,執(zhí)行本指令后燈亮。

            四、位邏輯運(yùn)算指令

            1..位與指令

              ANL C,bit ;CY與指定的位地址的值相與,結(jié)果送回CY

              ANL C,/bit ;先將指定的位地址中的值取出后取反,再和CY相與,結(jié)果送回CY,但注意,指定的位地址中的值本身并不發(fā)生變化。

              例:ANL C,/P1.0

              設(shè)執(zhí)行本指令前,CY=1,P1.0等于1(燈滅),則執(zhí)行完本指令后CY=0,而P1.0也是等于1。

              可用下列程序驗(yàn)證:

                ORG 0000H

                AJMP START

                ORG 30H

                START: MOV SP,#5FH

                MOV P1,#0FFH

                SETB C

                ANL C,/P1.0

                MOV P1.1,C ;將做完的結(jié)果送P1.1,結(jié)果應(yīng)當(dāng)是P1.1上的燈亮,而P1.0上的燈還是不亮。

            2..位或指令

              ORL C,bit

              ORL C,/bit

              這個(gè)的功能大家自行分析吧,然后對(duì)照上面的例程,編一個(gè)驗(yàn)證程序,看看你相得對(duì)嗎?

            五、位條件轉(zhuǎn)移指令

            1..判CY轉(zhuǎn)移指令

              JC rel

              JNC rel

              第一條指令的功能是如果CY等于1就轉(zhuǎn)移,如果不等于1就順序執(zhí)行。那么轉(zhuǎn)移到什么地方去呢?我們可以這樣理解:JC 標(biāo)號(hào),如果等于1就轉(zhuǎn)到標(biāo)號(hào)處執(zhí)行。這條指令我們?cè)谏瞎?jié)課中已講到,不再重復(fù)。

              第二條指令則和第一條指令相反,即如果CY=0就轉(zhuǎn)移,不等于0就順序執(zhí)行,當(dāng)然,我們也同樣理解: JNC 標(biāo)號(hào)

            2..判位變量轉(zhuǎn)移指令

              JB bit,rel

              JNB bit,rel

              第一條指令是如果指定的bit位中的值是1,則轉(zhuǎn)移,否則順序執(zhí)行。同樣,我們可以這樣理解這條指令:JB bit,標(biāo)號(hào)

              第二條指令請(qǐng)大家先自行分析

              下面我們舉個(gè)例子說(shuō)明:

                ORG 0000H

                LJMP START

                ORG 30H

                START:MOV SP,#5FH

                MOV P1,#0FFH

                MOV P3,#0FFH

                L1: JNB P3.2,L2 ;P3.2上接有一只按鍵,它按下時(shí),P3.2=0

                JNB P3.3,L3 ;P3.3上接有一只按鍵,它按下時(shí),P3.3=0

                LJM P L1

                L2: MOV P1,#00H

                LJMP L1

                L3: MOV P1,#0FFH

                LJMP L1

                END

                把上面的例子寫入片子,看看有什么現(xiàn)象………

                按下接在P3.2上的按鍵,P1口的燈全亮了,松開或再按,燈并不熄滅,然后按下接在P3.3上的按鍵,燈就全滅了。這像什么?這不就是工業(yè)現(xiàn)場(chǎng)經(jīng)常用到的“啟動(dòng)”、“停止”的功能嗎?

                怎么做到的呢?一開始,將0FFH送入P3口,這樣,P3的所有引線都處于高電平,然后執(zhí)行L1,如果P3.2是高電平(鍵沒(méi)有按下),則順序執(zhí)行JNB P3.3,L3語(yǔ)句,同樣,如果P3.3是高電平(鍵沒(méi)有按下),則順序執(zhí)行LJMP L1語(yǔ)句。這樣就不停地檢測(cè)P3.2、P3.3,如果有一次P3.2上的按鍵按下去了,則轉(zhuǎn)移到L2,執(zhí)行MOV P1,#00H,使燈全亮,然后又轉(zhuǎn)去L1,再次循環(huán),直到檢測(cè)到P3.3為0,則轉(zhuǎn)L3,執(zhí)行MOV P1,#0FFH,例燈全滅,再轉(zhuǎn)去L1,如此循環(huán)不已


        上一頁(yè) 1 2 3 4 下一頁(yè)

        關(guān)鍵詞: MCS-51單片機(jī)匯編指

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 咸阳市| 泸州市| 茌平县| 章丘市| 泰宁县| 建瓯市| 迁安市| 丹棱县| 阜新市| 高青县| 无棣县| 金乡县| 会东县| 盈江县| 都兰县| 呼伦贝尔市| 治多县| 仪陇县| 平顺县| 武安市| 同心县| 贵港市| 友谊县| 台东市| 柯坪县| 汕尾市| 长治市| 富民县| 南城县| 河北区| 阿坝县| 安溪县| 鄯善县| 额尔古纳市| 特克斯县| 榆树市| 马山县| 城口县| 安泽县| 额尔古纳市| 洪泽县|