完整教學(xué)課件:基于匯編與C語言的單片機(jī)原理及應(yīng)用_第1頁
完整教學(xué)課件:基于匯編與C語言的單片機(jī)原理及應(yīng)用_第2頁
完整教學(xué)課件:基于匯編與C語言的單片機(jī)原理及應(yīng)用_第3頁
完整教學(xué)課件:基于匯編與C語言的單片機(jī)原理及應(yīng)用_第4頁
完整教學(xué)課件:基于匯編與C語言的單片機(jī)原理及應(yīng)用_第5頁
已閱讀5頁,還剩781頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第2章MCS-51系列單片機(jī)的硬件結(jié)構(gòu)本章學(xué)習(xí)目標(biāo)MCS-51單片機(jī)的內(nèi)部結(jié)構(gòu)、引腳功能、工作方式和時(shí)序。掌握MCS-51單片機(jī)的內(nèi)部結(jié)構(gòu)特點(diǎn)了解單片機(jī)并行I/O口的結(jié)構(gòu)特點(diǎn)掌握MCS-51單片機(jī)的基本工作原理掌握單片機(jī)最小系統(tǒng)的設(shè)計(jì)方法掌握單片機(jī)存儲(chǔ)器的擴(kuò)展方法

MCS-51系列單片機(jī)分類

資源

配置子

系列

片內(nèi)ROM形式

內(nèi)

ROM

內(nèi)RAM

量定時(shí)/計(jì)數(shù)器中斷源

無ROMEPROME2PROM51子系列80318051875189514KB128B2×16552子系列80328052875289528KB256B3×166①具有8位CPU。②具有片內(nèi)振蕩器,振蕩頻率fosc范圍為1.2~12MHz,可以有時(shí)鐘輸出。③具有128B片內(nèi)RAM和具有21個(gè)字節(jié)專用寄存器。④具有4KB片內(nèi)EPROM(8031單片機(jī)中無)。⑤具有4個(gè)8位并行I/O接口:P0、P1、P2、P3。⑥具有1個(gè)全雙串行I/O。⑦具有2個(gè)16位定時(shí)/計(jì)數(shù)器。2.1MCS-51單片機(jī)的主要性能特點(diǎn)⑧中斷系統(tǒng)有5個(gè)中斷源,可編程為兩個(gè)優(yōu)先級(jí)。⑨具有111條指令(含乘法指令和除法指令)。⑩有較強(qiáng)的位尋址、位處理能力。?片內(nèi)采用單總線結(jié)構(gòu)。?采用單一+5V電源。?可尋址64KB外部程序存儲(chǔ)器空間。?可尋址64KB外部數(shù)據(jù)存儲(chǔ)器空間。微計(jì)算機(jī)組成微處理器CPUROMRAMI/O接口外設(shè)地址總線AB數(shù)據(jù)總線DB控制總線CB微型機(jī)組成框圖2.2MCS-51單片機(jī)的基本結(jié)構(gòu)單片機(jī)的內(nèi)部結(jié)構(gòu)1.CPU

CPU也叫中央處理器,是單片機(jī)的核心部件,主要完成單片機(jī)的運(yùn)算和控制功能。(1)運(yùn)算器:包括算術(shù)邏輯單元ALU、布爾處理器、累加器ACC、寄存器B、暫存器TMP1和TMP2、程序狀態(tài)字PSW寄存器及十進(jìn)制調(diào)整電路等。(2)控制器:包括定時(shí)控制邏輯、指令寄存器、譯碼器以及信息傳送控制部件等,以實(shí)現(xiàn)控制功能。

2.片內(nèi)存儲(chǔ)器

單片機(jī)內(nèi)的存儲(chǔ)器包括程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器,它們是相互獨(dú)立。(1)程序存儲(chǔ)器(ROM):為只讀存儲(chǔ)器,用于存放程序指令,常數(shù)及數(shù)據(jù)表格。(2)數(shù)據(jù)存儲(chǔ)器(RAM):為隨機(jī)存儲(chǔ)器,用于存放數(shù)據(jù)。數(shù)據(jù)存儲(chǔ)器又可分為內(nèi)部數(shù)據(jù)存儲(chǔ)器和外部數(shù)據(jù)存儲(chǔ)器。在單片機(jī)內(nèi)部有256個(gè)RAM單元來存放可讀寫的數(shù)據(jù),其中,后128單元被專用寄存器占用,作為寄存器供用戶使用的只是前128單元。

3.特殊功能寄存器SFR

在51單片機(jī)內(nèi)部有21/26個(gè)SFR,它們與內(nèi)部RAM統(tǒng)一編址,離散地分別在80H~FFH的地址單元中。

4.并行I/O口

MCS-51單片機(jī)內(nèi)部共有四個(gè)8位的并行I/O口(P0、P1、P2、P3),以實(shí)現(xiàn)數(shù)據(jù)的并行輸入和輸出。5.全雙工串行口

MCS-51單片機(jī)還有一個(gè)全雙工的串行口,以實(shí)現(xiàn)單片機(jī)與外部之間的串行數(shù)據(jù)傳送。6.定時(shí)/計(jì)數(shù)器

MCS-51單片機(jī)內(nèi)部有2個(gè)16位的定時(shí)器/計(jì)數(shù)器,用于實(shí)現(xiàn)內(nèi)部定時(shí)或外部計(jì)數(shù)的功能;并以其定時(shí)或計(jì)數(shù)的結(jié)果(查詢或中斷方式)來實(shí)現(xiàn)控制功能。7.中斷系統(tǒng)

MCS-51單片機(jī)具有中斷功能,以滿足控制應(yīng)用的需要。MCS-51共有5個(gè)中斷源(52系列有6個(gè)中斷源),即外部中斷2個(gè),定時(shí)/計(jì)數(shù)器中斷2個(gè),串行口中斷1個(gè)。全部中斷可分為高級(jí)和低級(jí)兩個(gè)優(yōu)先級(jí)別。

引腳定義及功能805112345678910111213141516171819204039383736353433323130292827262524232221

P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7RST/VPDRXD/P3.0TXD/P3.1INT0/P3.2INT1/P3.3T0/P3.4T1/P3.5WR/P3.6RD/P3.7XTAL2XTAL1VssVccP0.0P0.1P0.2P0.3P0.4P0.5P0.6P0.7EA/VppALE/PROGPSENP2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0單片機(jī)引腳說明

(1)P0口(32腳~39腳)有三種使用方法:作為與外部傳送數(shù)據(jù)的8位數(shù)據(jù)總線(D0~D7)。作為擴(kuò)展外部存儲(chǔ)器時(shí)的低8位地址總線(A0~A7)。(2)P1口(1腳~8腳):作為普通I/O口使用,無須外接上拉電阻。(3)P2口(21腳~28腳)有兩種使用方法:作為普通I/O口使用,無須外接上拉電阻。作為擴(kuò)展外部存儲(chǔ)器時(shí)的高8位地址總線(A8~A15)。(4)P3口(10腳~17腳)有兩種使用方法。作為普通I/O口使用,無須外接上拉電阻。(5)VDD(40腳):+5V電源。(6)VSS(20腳):GNDP3口的特殊功能

單片機(jī)引腳說明(7)XTAL1(19腳)

XTAL2(18腳):接外部石英晶振的引腳,也可引入外部時(shí)鐘。(8)RESET(9腳):復(fù)位信號(hào)引腳。必須在此引腳上出現(xiàn)兩個(gè)機(jī)器周期的高電平,才能保證單片機(jī)可靠的復(fù)位。復(fù)位后,單片機(jī)內(nèi)部各寄存器的狀態(tài)見表2-9所示。(9)ALE/PROG(30腳):地址鎖存允許信號(hào)。有以下三個(gè)作用:當(dāng)外接存儲(chǔ)器(RAM/ROM)時(shí),ALE(允許地址鎖存)的輸出用于鎖存地址的低8位。一般ALE接鎖存器的EN端。當(dāng)沒有外部存儲(chǔ)器時(shí),ALE端可輸出脈沖信號(hào),此頻率為石英振蕩頻率的1/6。因此,它可用作對(duì)外部芯片提供輸出的時(shí)鐘,或用于定時(shí)的目的。復(fù)位后單片機(jī)寄存器的內(nèi)容

單片機(jī)引腳(10)(29腳):外部程序存儲(chǔ)器的讀選通信號(hào)。(11)/VPP(腳31):訪問程序存儲(chǔ)器控制信號(hào)。當(dāng)信號(hào)接低電平時(shí),對(duì)ROM的讀操作(執(zhí)行程序)限定在外部程序儲(chǔ)器。當(dāng)接高電平時(shí),對(duì)ROM的讀操作(執(zhí)行程序)從內(nèi)部開始。在使用內(nèi)部帶程序存儲(chǔ)器的單片機(jī)時(shí),應(yīng)接高電平。

2.3單片機(jī)的存儲(chǔ)器配置

(1)內(nèi)部程序存儲(chǔ)器(ROM):用來存放程序和表格常數(shù)。8051為4KB、8052為8KB。(2)內(nèi)部數(shù)據(jù)存儲(chǔ)器(RAM):用來存放運(yùn)算過程中的數(shù)據(jù)。包括寄存器在內(nèi),8051/31為128字節(jié)、8052/32為256字節(jié)。(3)外部程序存儲(chǔ)器(ROM):用來存放程序。最大可擴(kuò)展64KB空間(包括內(nèi)部ROM)。(4)外部數(shù)據(jù)存儲(chǔ)器(RAM):在數(shù)據(jù)采集系統(tǒng)中可存放大量的數(shù)據(jù)。最大可擴(kuò)展64KB空間(不包括內(nèi)部RAM)。內(nèi)部數(shù)據(jù)存儲(chǔ)器及專用寄存器1.內(nèi)部數(shù)據(jù)存儲(chǔ)器

內(nèi)部數(shù)據(jù)存儲(chǔ)器在結(jié)構(gòu)上可分為兩個(gè)不同的存儲(chǔ)空間,即低128單元的數(shù)據(jù)存儲(chǔ)器空間(00H~7FH)和高128單元的具有特殊功能的專用寄存器存貯器空間(80H~0FFH)。2.專用寄存器SFR

專用寄存器(SpecialFunctionRegisters)也叫特殊功能寄存器,就是將內(nèi)部RAM的高128單元作為特殊功能寄存器使用。其單元地址為80H~FFH。

(1)B寄存器

B寄存器是一個(gè)8位寄存器,即可作為一般寄存器使用,也可用于乘除運(yùn)算。做乘法運(yùn)算時(shí),B是乘數(shù)。乘法操作后,乘積的高8位存于B中。做除法運(yùn)算時(shí),B存放除數(shù)。除法操作后,余數(shù)存放在B中。(2)累加器ACC(Accumulator)

累加器A是在編程操作中最常用的專用寄存器,功能較多,可按位尋址。(3)定時(shí)器2寄存器(52系列單片機(jī)獨(dú)有)

T2CON:定時(shí)器2控制寄存器。

T2MOD:定時(shí)器2方式寄存器。

TL2、TH2:定時(shí)器2寄存器。(4)程序狀態(tài)字PSW(ProgramStatusWord)CY:進(jìn)位標(biāo)志。

加減運(yùn)算時(shí),保存最高位進(jìn)位、借位狀態(tài)。

AC:半進(jìn)位標(biāo)志。

例:78H+97H01111000+10010111100001111有進(jìn)位CY=1沒有半進(jìn)位AY=0(5)IP寄存器(6)IE寄存器(7)SCON寄存器(8)SBUF寄存器(9)定時(shí)器0和定時(shí)器1寄存器

TCON:定時(shí)器控制寄存器。

TMOD:定時(shí)器方式寄存器。

TL0、TH0:定時(shí)器0寄存器。

TL1、TH1:定時(shí)器1寄存器。(10)P0~P3端口寄存器(11)棧指針SP寄存器

棧指針SP寄存器指示出堆棧頂部在內(nèi)部數(shù)據(jù)存儲(chǔ)器中的位置。系統(tǒng)復(fù)位后,SP初始化為07H,如果不重新設(shè)置,就使得堆棧由08H單元開始。但08H~1FH單元屬于工作寄存器區(qū),所以在程序設(shè)計(jì)中,最好把SP的值設(shè)置的大一些,一般將堆棧開辟在30H~7FH區(qū)域中。SP的值越小,堆棧容量就越大,但最大為128字節(jié)。(12)數(shù)據(jù)指針DPTR寄存器

數(shù)據(jù)指針DPTR由兩個(gè)8位寄存器DPH和DPL組合而成一個(gè)16位專用寄存器,其中DPH為DPTR的高8位,DPL為DPTR的低8位。

3.程序計(jì)數(shù)器PC程序計(jì)數(shù)器PC中存儲(chǔ)的是將要執(zhí)行的指令地址,是一個(gè)16位的計(jì)數(shù)器。尋址范圍達(dá)64KB。外部數(shù)據(jù)存儲(chǔ)器

程序計(jì)數(shù)器PC中存儲(chǔ)的是將要執(zhí)行的指令地址,是一個(gè)16位的計(jì)數(shù)器。尋址范圍達(dá)64KB。

程序存儲(chǔ)器2.4

MCS-51單片機(jī)的并行I/O端口

51單片機(jī)有4個(gè)I/O端口,每個(gè)端口都是8位準(zhǔn)雙向口,共占32根引腳。每個(gè)端口都包括一個(gè)鎖存器(即專用寄存器P0~P3)、一個(gè)輸出驅(qū)動(dòng)器和輸入緩沖器。通常把4個(gè)端口籠統(tǒng)地表示為P0~P3。P0口的結(jié)構(gòu)及特點(diǎn)P0口的某位P0.n(n=0~7)結(jié)構(gòu)圖,它由一個(gè)輸出鎖存器、兩個(gè)三態(tài)輸入緩沖器和輸出驅(qū)動(dòng)電路及控制電路組成。從圖中可以看出,P0口既可以作為I/O用,也可以作為地址/數(shù)據(jù)線用。DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳1

P0口作為普通I/O口①輸出時(shí):CPU發(fā)出控制電平“0”封鎖“與”門,將輸出上拉場效應(yīng)管T1截止,同時(shí)使多路開關(guān)MUX把鎖存器與輸出驅(qū)動(dòng)場效應(yīng)管T2柵極接通。故內(nèi)部總線與P0口同相。由于輸出驅(qū)動(dòng)級(jí)是漏極開路電路,若驅(qū)動(dòng)NMOS或其它拉流負(fù)載時(shí),需要外接上拉電阻。P0的輸出級(jí)可驅(qū)動(dòng)8個(gè)LSTTL負(fù)載。DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳②輸入時(shí):分讀引腳或讀鎖存器讀引腳:由傳送指令(MOV)實(shí)現(xiàn);

下面一個(gè)緩沖器用于讀端口引腳數(shù)據(jù),當(dāng)執(zhí)行一條由端口輸入的指令時(shí),讀脈沖把該三態(tài)緩沖器打開,這樣端口引腳上的數(shù)據(jù)經(jīng)過緩沖器讀入到內(nèi)部總線。DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳②輸入時(shí):分讀引腳或讀鎖存器讀鎖存器:有些指令如:ANLP0,A稱為“讀-改-寫”

指令,需要讀鎖存器。上面一個(gè)緩沖器用于讀端口鎖存器數(shù)據(jù)。DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳**原因:如果此時(shí)該端口的負(fù)載恰是一個(gè)晶體管基極,且原端口輸出值為1,那么導(dǎo)通了的PN結(jié)會(huì)把端口引腳高電平拉低;若此時(shí)直接讀端口引腳信號(hào),將會(huì)把原輸出的“1”電平誤讀為“0”電平?,F(xiàn)采用讀輸出鎖存器代替讀引腳,圖中,上面的三態(tài)緩沖器就為讀鎖存器Q端信號(hào)而設(shè),讀輸出鎖存器可避免上述可能發(fā)生的錯(cuò)誤。**DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳準(zhǔn)雙向口:

從圖中可以看出,在讀入端口數(shù)據(jù)時(shí),由于輸出驅(qū)動(dòng)FET并接在引腳上,如果T2導(dǎo)通,就會(huì)將輸入的高電平拉成低電平,產(chǎn)生誤讀。所以在端口進(jìn)行輸入操作前,應(yīng)先向端口鎖存器寫“1”,使T2截止,引腳處于懸浮狀態(tài),變?yōu)楦咦杩馆斎搿_@就是所謂的準(zhǔn)雙向口。

DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳2

P0作為地址/數(shù)據(jù)總線在系統(tǒng)擴(kuò)展時(shí),P0端口作為地址/數(shù)據(jù)總線使用時(shí),分為:

P0引腳輸出地址/數(shù)據(jù)信息。CPU發(fā)出控制電平“1”,打開“與”門,又使多路開關(guān)MUX把CPU的地址/數(shù)據(jù)總線與T2柵極反相接通,輸出地址或數(shù)據(jù)。由圖上可以看出,上下兩個(gè)FET處于反相,構(gòu)成了推拉式的輸出電路,其負(fù)載能力大大增強(qiáng)。DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳P0引腳輸出地址/輸入數(shù)據(jù)

輸入信號(hào)是從引腳通過輸入緩沖器進(jìn)入內(nèi)部總線。此時(shí),CPU自動(dòng)使MUX向下,并向P0口寫“1”,“讀引腳”控制信號(hào)有效,下面的緩沖器打開,外部數(shù)據(jù)讀入內(nèi)部總線。真正的雙向口——DQCLKQMUXP0.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址/數(shù)據(jù)控制VCCT1T2P0口引腳P1口的結(jié)構(gòu)及特點(diǎn)

它由一個(gè)輸出鎖存器、兩個(gè)三態(tài)輸入緩沖器和輸出驅(qū)動(dòng)電路組成----準(zhǔn)雙向口。DQCLKQP1.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳VCCRTP1口引腳P2口的結(jié)構(gòu)及特點(diǎn)1

P2口作為普通I/O口CPU發(fā)出控制電平“0”

,使多路開關(guān)MUX倒向鎖存器輸出Q端,構(gòu)成一個(gè)準(zhǔn)雙向口。其功能與P1相同。DQCLKQMUXP2.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址控制VCCRTP2口引腳

2

P2口作為地址總線在系統(tǒng)擴(kuò)展片外程序存儲(chǔ)器擴(kuò)展數(shù)據(jù)存儲(chǔ)器且容量超過256B(用MOVX@DPTR指令)時(shí),CPU發(fā)出控制電平“1”,使多路開關(guān)MUX倒內(nèi)部地址線。此時(shí),P2輸出高8位地址。DQCLKQMUXP2.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳地址控制VCCRTP2口引腳

P3口的結(jié)構(gòu)及特點(diǎn)DQCLKQP3.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳VCCRTP3口引腳第二輸入功能第二輸出功能1作為通用I/O口與P1口類似----準(zhǔn)雙向口(W=1)W2P3第二功能(Q=1)此時(shí)引腳部分輸入(Q=1、W=1)

,部分輸出(Q=1、W輸出)

。DQCLKQP3.n讀鎖存器內(nèi)部總線寫鎖存器讀引腳VCCRTP3口引腳第二輸入功能第二輸出功能WP3第二功能各引腳功能定義:P3.0:RXD串行口輸入P3.1:TXD串行口輸出P3.2:INT0外部中斷0輸入P3.3:INT1外部中斷1輸入P3.4:T0定時(shí)器0外部輸入P3.5:T1定時(shí)器1外部輸入P3.6:WR外部寫控制P3.7:RD外部讀控制2.5

MCS-51單片機(jī)的時(shí)鐘電路和時(shí)序MCS-51包括4個(gè)定時(shí)單位,它們分別是:振蕩周期(節(jié)拍)、時(shí)鐘周期(狀態(tài)周期)、機(jī)器周期和指令周期。單片機(jī)兩種常用晶振的4個(gè)周期信號(hào)的對(duì)比如下表所示。

1

振蕩周期

振蕩周期也叫節(jié)拍,用P表示,振蕩周期是指為單片機(jī)提供定時(shí)信號(hào)的振蕩源的周期。是時(shí)序中最小的時(shí)間單位。例如:若某單片機(jī)時(shí)鐘頻率為2MHz,則它的振蕩周期應(yīng)為0.5μs。2.時(shí)鐘周期

時(shí)鐘周期又叫做狀態(tài)周期,用S表示。是振蕩周期的二倍,其前半周期對(duì)應(yīng)的節(jié)拍叫P1拍,后半周期對(duì)應(yīng)的節(jié)拍叫P2。P1節(jié)拍通常完成算術(shù)、邏輯運(yùn)算,P2節(jié)拍通常完成傳送指令。

3.機(jī)器周期機(jī)器周期是實(shí)現(xiàn)特定功能所需的時(shí)間周期,通常有若干時(shí)鐘周期構(gòu)成。MCS-51的一個(gè)機(jī)器周期是固定不變的,寬度均由6個(gè)狀態(tài)周期(12個(gè)振蕩周期)組成,并依次表示為S1~S6,分別記作S1P1、S1P2~S6P1、S6P2。4.指令周期指令周期是最大的時(shí)序定時(shí)單位,指令周期是指執(zhí)行一條指令需要的時(shí)間。通常MCS-51的指令周期可以包含有1~4個(gè)機(jī)器周期。MCS-51的幾種典型的指令時(shí)序如下圖所示,每個(gè)機(jī)器周期內(nèi)地址鎖存信號(hào)(ALE)產(chǎn)生兩次有效信號(hào),分別出現(xiàn)在S1P2、S2P1期間與S4P2、S5P1期間。

2.5

MCS-51單片機(jī)的工作方式單片機(jī)的工作方式主要有:1.復(fù)位方式

2.程序執(zhí)行方式

3.節(jié)電方式復(fù)位方式(1)復(fù)位條件

為了實(shí)現(xiàn)單片機(jī)的復(fù)位,在時(shí)鐘電路工作后,必須在單片機(jī)的RESET端至少維持2個(gè)機(jī)器周期以上的高電平,單片機(jī)進(jìn)入復(fù)位狀態(tài)(即程序從0000H地址開始執(zhí)行)。

時(shí)鐘頻率為12MHZ,機(jī)器周期為1μs,則在單片機(jī)的RESET端只需持續(xù)2μs以上時(shí)間的高電就能進(jìn)入復(fù)位狀態(tài)。

(2)復(fù)位后的狀態(tài)

單片機(jī)復(fù)位后,片內(nèi)RAM中低128B的內(nèi)容不會(huì)改變,但特殊功能寄存器(SFR)的值被初始化。復(fù)位期間單片機(jī)的ALE和端輸出高電平。節(jié)電工作方式

MCS-51單片機(jī)中有HMOS和CHMOS兩種工藝芯片,它們的節(jié)電運(yùn)行方式不同,HMOS單片機(jī)的節(jié)電方式只有掉電方式,CHMOS單片機(jī)的節(jié)電工作方式有掉電方式和空閑方式兩種。程序執(zhí)行方式1.連續(xù)執(zhí)行方式

2.單步運(yùn)行方式

1

HMOS的掉電工作方式(1)掉電工作方式是指由于電源的故障使電源電壓丟失或工作電壓低于正常值,使單片機(jī)系統(tǒng)不能正常運(yùn)行,若不采取保護(hù)措施,將丟失RAM和寄存器中的全部數(shù)據(jù),后果嚴(yán)重。為此MCS-51系列單片機(jī)設(shè)置有掉電保護(hù)措施,進(jìn)行掉電保護(hù)處理。(2)具體做法:檢測電路一旦發(fā)現(xiàn)掉電,通過外部中斷源向CPU發(fā)出中斷請(qǐng)求,CPU響應(yīng)此中斷請(qǐng)求,調(diào)用中斷服務(wù)子程序,由中斷服務(wù)子程序?qū)⒅匾獢?shù)據(jù)送內(nèi)部RAM轉(zhuǎn)存,立即先把程序運(yùn)行過程中有用信息轉(zhuǎn)存到RAM,然后啟用備用電源維持RAM供電。

2

CHMOS的節(jié)電工作方式單片機(jī)還設(shè)計(jì)有待機(jī)和掉電兩種節(jié)電工作方式,特別適宜于低功耗場合。

內(nèi)部控制電路

*PCON控制寄存器的格式如下*PCON各位的說明如下:1.SMOD:串行口波特率加倍控制位。SMOD=1,波特率加倍。2.GF1、GF0:通用標(biāo)志位,由用戶置位或復(fù)位。3.PD:掉電方式位,若PD=1,進(jìn)入掉電工作方式。4.IDL:待機(jī)方式位,若IDL=1,進(jìn)入待機(jī)工作方式。若PD和IDL同時(shí)為1,則進(jìn)入掉電工作方式。待機(jī)工作方式是將PCON寄存器的IDL位置“1”,即進(jìn)入待機(jī)工作方式。

退出待機(jī)方式的方法有兩種,一種是激活中斷,另一種是硬件復(fù)位。掉電保護(hù)方式是將PCON中的PD位置“1”使單片機(jī)進(jìn)入掉電保護(hù)方式。80C51單片機(jī)一旦檢測到電源掉電,即將有用信息轉(zhuǎn)存到片內(nèi)數(shù)據(jù)存儲(chǔ)器RAM中的低128字節(jié)內(nèi),并使PCON.1的PD位置“1”,單片機(jī)進(jìn)入掉電方式。掉電方式下送入時(shí)鐘電路的振蕩信號(hào)被封鎖,不產(chǎn)生時(shí)鐘信號(hào),片內(nèi)的一切工作都停止,只有片內(nèi)RAM的數(shù)據(jù)保留。

只要電源恢復(fù)正常值,單片機(jī)就可以退出掉電方式,進(jìn)入正常工作方式,但硬件復(fù)位須維持10ms時(shí)間。

MCS-51單片機(jī)的指令和匯編語言程序設(shè)計(jì)

——匯編程序本章學(xué)習(xí)目標(biāo)

MCS-51單片機(jī)匯編語言編程的基本方法偽指令的使用及匯編語言程序的完整格式應(yīng)用MCS-51單片機(jī)指令系統(tǒng)進(jìn)行編程MCS-51單片機(jī)匯編語言程序設(shè)計(jì)的步驟循環(huán)程序和分支程序的結(jié)構(gòu)及使用方法延時(shí)程序的使用方法查表程序設(shè)計(jì)

雖然單片機(jī)的每—條指令能使計(jì)算機(jī)完成一種特定的操作。但要完成某一特定的任務(wù)還需要將這些指令按工作要求有序組合為一段完整的程序。

程序?qū)嶋H上是一系列計(jì)算機(jī)指令的有序集合。我們把利用計(jì)算機(jī)的指令系統(tǒng)來合理地編寫出解決某個(gè)問題的程序的過程,稱之為程序設(shè)計(jì)。3.2簡單匯編語言程序設(shè)計(jì)1.編制程序的步驟(1)任務(wù)分析(硬件、軟件系統(tǒng)分析)(2)確定算法和工作步驟;(3)程序總體設(shè)計(jì)和流程圖繪制(4)分配內(nèi)存,確定程序與數(shù)據(jù)區(qū)存放地址;(5)編寫源程序;(6)調(diào)試、修改,最終確定程序。2.方法技巧(1)模塊化設(shè)計(jì)(按功能分:顯示、打印、輸入、發(fā)送等)(2)盡量采用循環(huán)及子程序結(jié)構(gòu)(節(jié)省內(nèi)存)關(guān)于流程圖符號(hào):開始、結(jié)束----圓角矩形工作任務(wù)----矩形判斷分支----菱形程序流向----程序連接----開始結(jié)束3.匯編語言的規(guī)范(1)匯編語言源程序由以下兩種指令構(gòu)成:匯編語句(指令性語句)偽指令(指示性語句)(2)匯編語句的格式:

標(biāo)號(hào):

操作碼操作數(shù) ;注釋數(shù)據(jù)表示形式:

二進(jìn)制(B)、十六進(jìn)制(H)、十進(jìn)制(D或省略)、ASCII碼(以單引號(hào)標(biāo)識(shí))(3)偽指令:控制匯編用的特殊指令,這些指令不屬于指令系統(tǒng),不產(chǎn)生機(jī)器代碼。小程序

org1000hstart:movdptr,#tablemova,20hmovca,@a+dptrmov21h,asjmp$org2000htable:db0,1,4,9,16,25end例:變量存在內(nèi)部RAM的20H單元中,其取值范圍:0~5,編成,查表法求其平方值分支程序分支程序可根據(jù)要求無條件或有條件的改變程序執(zhí)行流向。編寫分支程序主要在于正確使用轉(zhuǎn)移指令。

分支程序有:單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)、多分支(散轉(zhuǎn))結(jié)構(gòu)。條件成立?下條指令程序段A單分支結(jié)構(gòu)YN條件成立?程序段AYN程序段A雙分支結(jié)構(gòu)K=?程序段nn0程序段1多分支結(jié)構(gòu)程序段01……1.比較數(shù)的大小

入口條件:兩個(gè)帶符號(hào)數(shù)分別存在內(nèi)部RAM30H和31H單元中,試比較它們的大小,將較大的數(shù)存入32H單元中。X-Y為正:OV=0,則X>YOV=1,則X<YX-Y為負(fù):OV=0,則X<YOV=1,則X>YORG 0100H MOV A,30H ;取初值

CLR C SUBB A,31H ;X-Y JZ DZ1 ;X=Y?

JBOV,EB1 ;X-Y>0,

OV=1,X<Y AJMPDZ1 ;X-Y>0,

OV=0,X>Y JBOV,DZ1 ;X-Y<0,

OV=1,X>YEB1:MOV A,31H ;X<Y AJMPJS0DZ1:MOVA,30H ;X>YJS0:MOV32H,A END例:設(shè)變量x以補(bǔ)碼形式存放在片內(nèi)RAM30H單元中,變量y與x的關(guān)系是:編程根據(jù)x的值求y值并放回原單元。2.函數(shù)運(yùn)算

A=?y=x+5<0>0y=20Hy=x0取x即(30h)A開始存y即y20h結(jié)束ORG1000HSTART:MOVA,30HJZNEXT;x=0,轉(zhuǎn)移

ANLA,#80H;保留符號(hào)位

JZED;x>0,轉(zhuǎn)移

MOVA,#05H;x<0,不轉(zhuǎn)移

ADDA,30HMOV30H,ASJMPEDNEXT:MOV30H,#20HED:SJMP$START:MOVDPTR,#TABMOVA,R7ADDA,R7;R7×2AMOVR3,A;暫存R3MOVCA,@A+DPTR;取高位地址

XCHA,R3INCAMOVCA,@A+DPTR;取低位地址

MOVDPL,AMOVDPH,R3;轉(zhuǎn)移地址送入DPTRCLRAJMP@A+DPTRTAB:DWP0

DWP1

DWPN例:根據(jù)R7的內(nèi)容,轉(zhuǎn)至對(duì)應(yīng)的分支程序。設(shè)R7的內(nèi)容為0~N,對(duì)應(yīng)的處理程序地址分別為P0~P7。P0高位P0低位TABP1高位P1低位TAB+2循環(huán)程序循環(huán)程序一般由:初始化部分循環(huán)體部分:處理部分、修改部分、控制部分結(jié)束部分其結(jié)構(gòu)一般有兩種:先進(jìn)入處理部分,再控制循環(huán)至少執(zhí)行一次循環(huán)體先控制循環(huán),再進(jìn)入處理部分循環(huán)體是否執(zhí)行,取決于判斷結(jié)果。開始設(shè)置循環(huán)初值循環(huán)處理循環(huán)修改結(jié)束處理結(jié)束循環(huán)結(jié)束?開始設(shè)置循環(huán)初值循環(huán)處理循環(huán)修改結(jié)束處理結(jié)束循環(huán)結(jié)束?NYYN循環(huán)控制的一般方法:循環(huán)次數(shù)已知利用循環(huán)次數(shù)控制循環(huán)次數(shù)未知利用關(guān)鍵字控制利用“邏輯尺”根據(jù)“邏輯尺”的內(nèi)容,進(jìn)行控制。例:統(tǒng)計(jì)數(shù)據(jù)塊的長度

入口條件:內(nèi)部RAM30H開始的存儲(chǔ)區(qū)有若干個(gè)數(shù)據(jù),最后一個(gè)數(shù)據(jù)為字符FFH,結(jié)果存入40H單元。

ORG 0100HMAIN:MOVR1,#30H ;R1作為地址指針

CLR A ;累加器A作為計(jì)數(shù)器LOOP:CJNE @R1,#0FFH,NEXT ;與數(shù)據(jù)FF比較,不等轉(zhuǎn)移

SJMP JSH1 ;找到結(jié)束符號(hào),結(jié)束循環(huán)NEXT:INC A ;計(jì)數(shù)器加1

INC R1 ;指針加lSJMPL00P ;循環(huán)JSHl:INC A ;再加入l個(gè)字符

MOV 30H,A ;存結(jié)果

END

延時(shí)程序

1.0.1s延時(shí)程序(晶振為12M)

ORG 0100H

MOVR2,#200

LOOP:MOVR3,#250

DJNZR3,$

DJNZR2,LOOP

RET由于采用12M晶振,機(jī)器周期為1μs,DJNZ的指令周期為2,整個(gè)程序的執(zhí)行時(shí)間為250×200×2×1μs=100000μs=0.1s

2.1s延時(shí)程序(晶振為12M)ORG 0100HMOV R1,#10LOOP1:MOV R2,#200LOOP:MOV R3,#250 DJNZ R3,$ DJNZ R2,LOOP DJNZ R1,LOOP1 RET例:50ms延時(shí)子程序。設(shè)晶振頻率為12MHz,則機(jī)器周期為1us。DEL:MOVR7,#200;1MCDEL1:MOVR6,#123;1MCNOP;1MCDJNZR6,$;2MCDJNZR7,DEL1;2MCRET;2MC延時(shí)時(shí)間:t=1+200[(1+1+2*123)+2]+2≈50000us=50msMCS-51常用子程序子及問題子程序設(shè)計(jì)時(shí)注意事項(xiàng):1.給子程序賦一個(gè)名字。實(shí)際為入口地址代號(hào)。2.要能正確傳遞參數(shù):入口條件:子程序中要處理的數(shù)據(jù)如何給予。出口條件:子程序處理結(jié)果如何存放。(寄存器、存儲(chǔ)器、堆棧方式)3.保護(hù)與恢復(fù)現(xiàn)場:

保護(hù)現(xiàn)場:壓棧指令PUSH

恢復(fù)現(xiàn)場:彈出指令POP4.子程序可以嵌套1.代碼轉(zhuǎn)換類程序設(shè)計(jì)

(1)單字節(jié)十六進(jìn)制數(shù)轉(zhuǎn)換成雙字節(jié)ASCII碼

十六進(jìn)制數(shù)與ASCII碼之間的關(guān)系十六進(jìn)制數(shù)十六進(jìn)制數(shù)十六進(jìn)制數(shù)十六進(jìn)制數(shù)030H434H838HC43H131H535H939HD44H232H636HA41HE45H333H737HB42HF46H入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù)在寄存器R2中。出口:高四位的ASCII碼在A中,低四位的ASCII碼在B中。

ORG 0100HMOV A,R2MOV B,A ;暫存待轉(zhuǎn)換的單字節(jié)十六進(jìn)制數(shù)

LCALL MS1 ;轉(zhuǎn)換低四位

XCH A,B ;存放低四位的ASCII碼

SWAP A ;準(zhǔn)備轉(zhuǎn)換高四位

LCALL MS1 ;轉(zhuǎn)換高四位

SJMP $MS1:ANL A,#0FH;將累加器的低四位轉(zhuǎn)換成ASCII碼

ADD A,#90HDA AADDC A,#40HDA ARET例:將多位十六進(jìn)制數(shù)轉(zhuǎn)換成ASCII碼,設(shè)R0指向十六進(jìn)制數(shù)低位,R2存放字節(jié)數(shù),轉(zhuǎn)換后R1指向ASCII碼高位。HTASC:MOVA,@R0;取十六進(jìn)制數(shù)

ANLA,#0FH;取低四位

ADDA,#15;偏移修正

MOVCA,@A+PC;查表得ASCII碼

MOV@R1,A;保存

INCR1MOVA,@R0;取十六進(jìn)制數(shù)高四位

SWAPA;ANLA,#0F0HADDA,#06H;偏移修正

MOVCA,@A+PC;查表

MOV@R1,A;保存

INCR0;指向下一單元

INCR1DJNZR2,HTASCRETASCTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H2.ASCII碼轉(zhuǎn)換成十六進(jìn)制數(shù)入口條件:待轉(zhuǎn)換的

ASCII碼在R2中。出口:轉(zhuǎn)換后的十六進(jìn)制數(shù)在R3中。

ORG 0100H MOV A,R2

SUBBA,#30H

CLR C

JNB ACC.4,M1

SUBBA,#7M1:MOVR3,A

SJMP $ END3.十六進(jìn)制整數(shù)轉(zhuǎn)換成單字節(jié)BCD碼整數(shù)入口條件:待轉(zhuǎn)換的單字節(jié)十六進(jìn)制整數(shù)在R2中。出口:轉(zhuǎn)換后的BCD碼整數(shù)(十位和個(gè)位)在R5中,百位在R3中。

MOVA,R2HBCD:MOVB,#100;分離出百位,存放在

R3中

DIVABMOVR3,AMOVA,#10 ;余數(shù)繼續(xù)分離十位和個(gè)位

XCHA,B DIVABSWAPAORL A,B ;將十位和個(gè)位拼裝成BCD碼

MOVR5,ASJMP$ END4.雙字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)

入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在R6、R7中。

出口:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。

ORG 0100H

HB2:CLR A ;BCD碼初始化

MOVR3,A

MOVR4,A

MOVR5,A

MOVR2,#10H ;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù)

HB3:MOVA,R7;從高端移出待轉(zhuǎn)換數(shù)的一位到CY

RLC A

MOVR7,A

MOV A,R6

RLC A

MOVR6,A

MOVA,R5;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2ADDCA,R5

DA A ;十進(jìn)制調(diào)整

MOVR5,AMOVA,R4ADDCA,R4DA AMOVR4,AMOVA,R3ADDCA,R3MOVR3,A;雙字節(jié)16進(jìn)制數(shù)的萬位數(shù)不超過6,不用調(diào)整

DJNZR2,HB3 ;判斷16位處理完?

SJMP$END5.雙字節(jié)BCD碼整數(shù)轉(zhuǎn)換成雙字節(jié)16進(jìn)制整數(shù)入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼整數(shù)在R2、R3中。出口:轉(zhuǎn)換后的雙字節(jié)十六進(jìn)制整數(shù)仍在R2、R3中。

ORG 0100HBH2:MOVA,R3;將低字節(jié)轉(zhuǎn)換成16進(jìn)制

LCALLBCD1MOVR3,AMOVA,R2;將高字節(jié)轉(zhuǎn)換成16進(jìn)制

LCALLBCD1MOVB,#100;擴(kuò)大一百倍

MULABADDA,R3;和低字節(jié)按十六進(jìn)制相加

MOVR3,A

CLRA

ADDCA,BMOVR2,ASJMP$BCD1:MOVB,#10H;分離十位和個(gè)位

DIVABMOVR4,B ;暫存?zhèn)€位

MOVB,#10;將十位轉(zhuǎn)換成16進(jìn)制

MULABADDA,R4 ;16進(jìn)制加上個(gè)位

RET END查表程序設(shè)計(jì)

MOVC A,@A+DPTRMOVC A,@A+PC1.查表求ASCII碼入口條件:R0低四位有一個(gè)16進(jìn)制數(shù)(0~F)。出口:將查表找出的相應(yīng)ASCII碼并送回R0中。

ORG 0100HMOVA,R0 ANL A,#0FH ;屏蔽高4位ADDA,#03H ;查表指令PC值與表格

;PC值相差3字節(jié)MOVCA,@A+PC ;查表MOVR0,A ;存結(jié)果SJMP$ASCTAB:DB '0','1','2','3','4','5','6','7'DB '8','9','A','B','C','D','E','F’定點(diǎn)數(shù)運(yùn)算子程序

1.多字節(jié)BCD碼加法入口條件:字節(jié)數(shù)在R7中,被加數(shù)在30H起始單元中,加數(shù)在40H起始單元中。出口:和在30H起始單元中,最高位進(jìn)位在CY中。

ORG 0100H MOV R7,#03H MOV R0,#30H MOV R1,#40H MOV A,R7;取字節(jié)數(shù)至

R2中

MOV R2,A ADD A,R0 ;初始化數(shù)據(jù)指針

MOV R0,A MOV A,R2 ADD A,R1 MOV R1,A CLR CBB1: DEC R0 ;調(diào)整數(shù)據(jù)指針

DEC R1 MOV A,@R0

ADDC A,@R1 ;按字節(jié)相加

DA A ;十進(jìn)制調(diào)整

MOV @R0,A ;和存回[R0]中

DJNZ R2,BB1 ;處理完所有字節(jié)

END2.多字節(jié)BCD碼減法入口條件:字節(jié)數(shù)在

R7中,被減數(shù)在[R0]中,減數(shù)在

[R1]中。出口:差在

[R0]中,最高位借位在CY中。ORG 0100HBCDB:LCALLMN1;減數(shù)[R1]十進(jìn)制取補(bǔ)LCALLBCDA;按多字節(jié)BCD碼加法處理CPLC;將補(bǔ)碼加法的進(jìn)位標(biāo)志轉(zhuǎn)換成借位標(biāo)志MOV F0,CLCALLMN1

;恢復(fù)減數(shù)[R1]的原始值MOV C,F(xiàn)0 ;恢復(fù)借位標(biāo)志RETMN1:MOV A,R0;[R1]十進(jìn)制取補(bǔ)子程序入口

XCH A,R1 ;交換指針

XCH A,R0

LCALL NEG ;通過[R0]實(shí)現(xiàn)[R1]取補(bǔ)

MOV A,R0XCH A,R1 ;換回指針

XCH A,R0RETBCDA:MOV A,R7;取字節(jié)數(shù)至R2中

MOV R2,AADD A,R0 ;初始化數(shù)據(jù)指針

MOV R0,AMOV A,R2

ADD A,R1MOV R1,ACLR CBCD1:DEC R0 ;調(diào)整數(shù)據(jù)指針

DEC R1MOV A,@R0ADDC A,@R1 ;按字節(jié)相加

DA A ;十進(jìn)制調(diào)整

MOV @R0,A ;和存回

[R0]中

DJNZ R2,BCD1 ;處理完所有字節(jié)

RETNEG:MOV A,R7 ;BCD碼取補(bǔ)子程序

DEC AMOV R2,AMOV A,R0MOV R3,ANEG0:

CLR CMOV A,#99HSUBB A,@R0 ;按字節(jié)十進(jìn)制取補(bǔ)MOV @R0,A ;存回

[R0]中INC R0 ;調(diào)整數(shù)據(jù)指針DJNZ R2,NEG0 ;處理完(

R2)字節(jié)MOV A,#9AH ;最低字節(jié)單獨(dú)取補(bǔ)SUBB A,@R0MOV @R0,AMOV A,R3 ;恢復(fù)指針MOV R0,ARET

4.雙字節(jié)二進(jìn)制無符號(hào)數(shù)乘法子程序入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。出口:乘積在

R2、

R3、

R4、

R5中。

ORG 0100HMULD:MOV A,R3 ;計(jì)算R3乘R7MOV B,R7MUL ABMOV R4,B ;暫存部分積MOV R5,AMOV A,R3 ;計(jì)算R3乘R6MOV B,R6MUL ABADD A,R4 ;累加部分積MOV R4,ACLR A

ADDC A,BMOV R3,AMOV A,R2 ;計(jì)算R2乘R7MOV B,R7MUL ABADD A,R4 ;累加部分積MOV R4,AMOV A,R3ADDC A,BMOV R3,ACLR ARLC AXCH A,R2 ;計(jì)算R2乘R6MOV B,R6MUL ABADD A,R3 ;累加部分積MOV R3,AMOV A,R2ADDC A,BMOV R2,ARET6.雙字節(jié)二進(jìn)制無符號(hào)數(shù)除法子程序入口條件:被除數(shù)在

R2、

R3、

R4、

R5中,除數(shù)在

R6、

R7中。出口:

OV=0時(shí),雙字節(jié)商在

R2、

R3中,

OV=1時(shí)溢出。

ORG 0100HDIVD:CLR C ;比較被除數(shù)和除數(shù)MOV A,R3SUBB A,R7MOV A,R2SUBB A,R6JC DVD1SETB OV ;溢出RETDVD1:MOV B,#10H ;計(jì)算雙字節(jié)商DVD2:CLR C ;部分商和余數(shù)同時(shí)左移一位MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AXCH A,R2RLC AXCH A,R2MOV F0,C ;保存溢出位CLR CSUBB A,R7 ;計(jì)算(R2R3-R6R7)MOV R1,AMOV A,R2SUBB A,R6ANL C,/F0 ;結(jié)果判斷JC DVD3MOV R2,A ;夠減,存放新的余數(shù)MOV A,R1MOV R3,AINC R5 ;商的低位置一DVD3:DJNZ B,DVD2 ;計(jì)算完十六位商(

R4R5)MOV A,R4 ;將商移到

R2R3中MOV R2,AMOV A,R5MOV R3,ACLR OV ;設(shè)立成功標(biāo)志RET浮點(diǎn)數(shù)運(yùn)算子程序1.浮點(diǎn)數(shù)的表示(1)二進(jìn)制浮點(diǎn)操作數(shù)

用三個(gè)字節(jié)表示,第一個(gè)字節(jié)的最高位為數(shù)符,其余七位為階碼(補(bǔ)碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié)純小數(shù)(原碼)來表示。當(dāng)尾數(shù)的最高位為1時(shí),便稱為規(guī)格化浮點(diǎn)數(shù),簡稱操作數(shù)。(2)十進(jìn)制浮點(diǎn)操作數(shù)用三個(gè)字節(jié)表示,第一個(gè)字節(jié)的最高位為數(shù)符,用來表示正負(fù)數(shù)(0表示正數(shù),1表示負(fù)數(shù))其余七位為階碼(二進(jìn)制補(bǔ)碼形式),第二字節(jié)為尾數(shù)的高字節(jié),第三字節(jié)為尾數(shù)的低字節(jié),尾數(shù)用雙字節(jié)BCD碼純小數(shù)(原碼)來表示。當(dāng)十進(jìn)制數(shù)的絕對(duì)值大于1時(shí),階碼就等于整數(shù)部分的位數(shù)。例如:156.6的階碼是03H,-156.6的階碼是

83H;當(dāng)十進(jìn)制數(shù)的絕對(duì)值小于

1時(shí),階碼就等于

80H減去小數(shù)點(diǎn)后面零的個(gè)數(shù)。例如

:0.00362的階碼是

7EH,-0.00362的階碼是

0FEH。例如:有一個(gè)十進(jìn)制浮點(diǎn)操作數(shù)存放在30H、31H、32H中,數(shù)值是-0.07315,即-0.7315乘以10的-1次方,則階碼為7FH,若加上數(shù)符(30H)=0FFH,31H=73H,(32H)=15H。

(3)運(yùn)算精度單次定點(diǎn)運(yùn)算精度為結(jié)果最低位的當(dāng)量值;單次二進(jìn)制浮點(diǎn)算術(shù)運(yùn)算的精度優(yōu)于十萬分之三;單次二進(jìn)制浮點(diǎn)超越函數(shù)運(yùn)算的精度優(yōu)于萬分之一;BCD碼浮點(diǎn)數(shù)本身的精度比較低(萬分之一到千分之一),不宜作為運(yùn)算的操作數(shù),僅用于輸入或輸出時(shí)的數(shù)制轉(zhuǎn)換。不管那種數(shù)據(jù)格式,隨著連續(xù)運(yùn)算的次數(shù)增加,精度都會(huì)下降。

2.浮點(diǎn)數(shù)加減法子程序入口條件:被加數(shù)在

[R0]中,加數(shù)在

[R1]中。被減數(shù)在

[R0]中,減數(shù)在

[R1]中。當(dāng)F0=0時(shí),程序作浮點(diǎn)數(shù)加法運(yùn)算;當(dāng)F0=1時(shí),程序作浮點(diǎn)數(shù)減法運(yùn)算。出口:

OV=0時(shí),和(差)仍在

[R0]中,

OV=1時(shí),溢出。ORG0100HFADD:CLR F0 ;設(shè)立加法標(biāo)志

SJMPAS;計(jì)算代數(shù)和FSUB:SETBF0 ;設(shè)立減法標(biāo)志AS:LCALL MVR1;計(jì)算代數(shù)和。先將[R1];傳送到第二工作區(qū)

MOVC,F(xiàn)0;用加減標(biāo)志來校正;第二操作數(shù)的有效符號(hào)

RRC A XRL A,@R1

MOV C,ACC.7

ASN:MOV 1EH,C;將第二操作數(shù)的有效符號(hào);存入位1EH中

XRL A,@R0 ;與第一操作數(shù)的符號(hào)比較

RLC A

MOV F0,C ;保存比較結(jié)果

LCALLMVR0

;將[R0]傳送到第一工作區(qū)中

LCALL

AS1;在工作寄存器中完成代數(shù)運(yùn)算

MOV0:INCR0;將結(jié)果傳回到[R0]中的子程序入口

INC

R0

MOV A,R4;傳回尾數(shù)的低字節(jié)

MOV @R0,A

DEC R0

MOV A,R3;傳回尾數(shù)的高字節(jié)

MOV@R0,A

DECR0

MOVA,R2 ;取結(jié)果的階碼

MOVC,1FH ;取結(jié)果的數(shù)符

MOVACC.7,C ;拼入階碼中

MOV@R0,A

CLRACC.7 ;不考慮數(shù)符

CLROV ;清除溢出標(biāo)志

CJNEA,#3FH,MV01;階碼是否上溢?

SETBOV ;設(shè)立溢出標(biāo)志

MV01:MOVA,@R0;取出帶數(shù)符的階碼

RET

MVR0:MOVA,@R0;將[R0]傳送到第一;工作區(qū)中的子程序

MOVC,ACC.7;將數(shù)符保存在位1FH中

MOV1FH,CMOVC,ACC.6;將階碼擴(kuò)充為8bit補(bǔ)碼

MOV ACC.7,C

MOV R2,A ;存放在

R2中

INC R0

MOVA,@R0 ;將尾數(shù)高字節(jié)存放在

R3中

MOV R3,A

INC R0

MOVA,@R0 ;將尾數(shù)低字節(jié)存放在

R4中

MOVR4,A

DEC R0 ;恢復(fù)數(shù)據(jù)指針

DEC R0

RET

MVR1:MOVA,@R1;將

[R1]傳送到第二工作;區(qū)中的子程序

MOV C,ACC.7 ;將數(shù)符保存在位

1EH中

MOV 1EH,C

MOVC,ACC.6;將階碼擴(kuò)充為8bit補(bǔ)碼

MOVACC.7,C

MOVR5,A;存放在

R5中

INC

R1

MOV A,@R1;將尾數(shù)高字節(jié)存放在

R6中

MOV R6,A

INC R1

MOV A,@R1;將尾數(shù)低字節(jié)存放在

R7中

MOV R7,A

DEC R1 ;恢復(fù)數(shù)據(jù)指針

DEC R1

RETAS1:MOVA,R6;讀取第二操作數(shù)尾數(shù)高字節(jié)

ORL A,R7

JZ AS2 ;第二操作數(shù)為零,不必運(yùn)算

MOV A,R3;讀取第一操作數(shù)尾數(shù)高字節(jié)

ORL A,R4

JNZ EQ

MOV A,R6;第一操作數(shù)為零,結(jié)果以;第二操作數(shù)為準(zhǔn)

MOVR3,AMOVA,R7MOVR4,AMOVA,R5MOVR2,AMOVC,1EHMOV 1FH,CAS2:

RETEQ:MOV A,R2;對(duì)階,比較兩個(gè)操作數(shù)的階碼XRL A,R5JZ AS4 ;階碼相同,對(duì)階結(jié)束JB ACC.7,EQ3 ;階符互異MOV A,R2 ;階符相同,比較大小CLR

CSUBB A,R5JC EQ4EQ2:CLR C ;第二操作數(shù)右規(guī)一次

MOV A,R6 ;尾數(shù)縮小一半

RRC A

MOV R6,A

MOV A,R7RRC A

MOV R7,A

INC R5 ;階碼加一

ORL A,R6 ;尾數(shù)為零否?

JNZ EQ ;尾數(shù)不為零,繼續(xù)對(duì)階

MOV A,R2 ;尾數(shù)為零,提前結(jié)束對(duì)階MOV R5,ASJMP

AS4EQ3:

MOV A,R2 ;判斷第一操作數(shù)階符

JNB ACC.7,EQ2 ;如為正,右規(guī)第二操作數(shù)

EQ4:

CLR C

LCALL RR1 ;第一操作數(shù)右規(guī)一次

ORL A,R3 ;尾數(shù)為零否?

JNZ EQ ;不為零,繼續(xù)對(duì)階

MOV A,R5 ;尾數(shù)為零,提前結(jié)束對(duì)階

MOV R2,AAS4:

JB F0,AS5 ;尾數(shù)加減判斷

MOV A,R4 ;尾數(shù)相加

ADD A,R7

MOV R4,A

MOV A,R3

ADDC A,R6

MOV R3,AJNC AS2

LJMP RR1;有進(jìn)位,右規(guī)一次

AS5:CLR

C

;比較絕對(duì)值大小

MOV

A,R4

SUBBA,R7

MOV

B,A

MOV

A,R3

SUBBA,R6

JC AS6

MOVR4,B ;第一尾數(shù)減第二尾數(shù)

MOVR3,A

LJMPRLN

;結(jié)果規(guī)格化

AS6:CPL 1FH ;結(jié)果的符號(hào)與第一操作數(shù)相反

CLR C;結(jié)果的絕對(duì)值為第二尾數(shù)減第一尾數(shù)

MOV A,R7

SUBBA,R4

MOV R4,A

MOV A,R6

SUBB A,R3

MOV R3,A

RLN:

MOV A,R3 ;浮點(diǎn)數(shù)規(guī)格化

ORL A,R4 ;尾數(shù)為零否?

JNZ RLN1

MOV R2,#0C1H ;階碼取最小值

RET

RLN1:MOV A,R3

JB ACC.7,RLN2 ;尾數(shù)最高位為一否?

CLR C ;不為一,左規(guī)一次

LCALL RL1

SJMP RLN;繼續(xù)判斷RLN2:CLR OV ;規(guī)格化結(jié)束RET

RL1:

MOV A,R4 ;第一操作數(shù)左規(guī)一次

RLC A ;尾數(shù)擴(kuò)大一倍

MOV R4,A MOV A,R3

RLC

A

MOV R3,A

DEC R2 ;階碼減一

CJNE R2,#0C0H,RL1E;階碼下溢否?

CLR A

MOV R3,A ;階碼下溢,操作數(shù)以零計(jì)

MOV R4,A

MOV R2,#0C1H

RL1E:CLR

OV RET

RR1:MOV A,R3 ;第一操作數(shù)右規(guī)一次

RRCA ;尾數(shù)縮小一半

MOVR3,A

MOVA,R4

RRC

A

MOVR4,A

INC

R2

;階碼加一

CLR

OV

;清溢出標(biāo)志

CJNER2,#40H,RR1E;階碼上溢否?

MOVR2,#3FH ;階碼溢出

SETBOV

RR1E:RETMCS-51單片機(jī)的指令和匯編語言程序設(shè)計(jì)

——指令系統(tǒng)本章學(xué)習(xí)目標(biāo)

MCS-51單片機(jī)的指令格式及尋址方式匯編語言的指令類型偽指令的使用難點(diǎn)在于控制轉(zhuǎn)移指令和位操作指令的理解及各種指令的靈活應(yīng)用3.1MCS-51單片機(jī)的指令系統(tǒng)指令格式MCS-51單片機(jī)指令格式采用了單地址指令格式。一條匯編語句是由標(biāo)號(hào)、操作碼、目的操作數(shù)、源操作數(shù)和注釋等5部分組成的,其中方括號(hào)中的部分是可以選擇的。指令的具體格式為:[標(biāo)號(hào)]:操作碼

[目的操作數(shù)],[源操作數(shù)];[注釋]例如:

HY1:MOVR3,

#08H;執(zhí)行數(shù)據(jù)傳送操作

指令符號(hào)A:累加器,用于運(yùn)算及存放數(shù)據(jù)。B:專用寄存器,用于MUL和DIV指令中,存放第二操作數(shù)、乘積高位字節(jié)。CY:進(jìn)位標(biāo)志位,或布爾處理器中的累加器。bit:內(nèi)部RAM或?qū)S眉拇嫫髦械闹苯訉ぶ肺弧?bit:位地址單元內(nèi)容取反。DPTR:16位數(shù)據(jù)指針,也可作為16位地址寄存器。Rn:工作寄存器中的寄存器Rn、R1…R7之一Ri:工作寄存器中的寄存器R0或R1#data:8位立即數(shù)#data16:16位立即數(shù)direct:片內(nèi)RAM或SFR的地址(8位)。@:間接尋址寄存器。Bit:片內(nèi)RAM或SFR的位地址。addr11:11位目的地址。addr16:16位目的地址。rel:補(bǔ)碼形式的8位地址偏移量。偏移范圍為-128~127。/:位操作指令中,該位求反后參與操作,不影響該位。X:片內(nèi)RAM的直接地址或寄存器。(X):相應(yīng)地址單元中的內(nèi)容?!杭^左邊的內(nèi)容送入箭頭右邊的單元內(nèi)。功能數(shù)據(jù)傳送類:29條算術(shù)運(yùn)算類:24條邏輯運(yùn)算類:24條控制轉(zhuǎn)移類:17條位操作類:17條指令分類

MCS-51單片機(jī)共有111條指令,可以實(shí)現(xiàn)51種基本操作。1.按指令功能分類2.按指令字節(jié)分類

單片機(jī)中的指令并不是固定的長度,對(duì)于不同的指令,指令的字節(jié)數(shù)不同。MCS-51單片機(jī)用機(jī)器語言表示的指令格式按字節(jié)劃分,有一字節(jié)指令、兩字節(jié)指令和三字節(jié)指令等三種。(1)一字節(jié)指令中的8位二進(jìn)制代碼既包含操作碼的信息,也包含操作數(shù)的信息。例如指令: INC A MOV A,Rn XCH A,RnADD A,@RiDEC Rn

(2)二字節(jié)指令中的第一個(gè)字節(jié)表示操作碼,第二個(gè)字節(jié)表示操作數(shù),操作數(shù)既可能是立即數(shù),也可能是地址。其指令格式如右所示:例如:ANL A,#90H ADD A,#06HDEC 30HMOV R2,#0F0H(3)三字節(jié)指令中,第一字節(jié)表示操作碼,另兩個(gè)字節(jié)是操作數(shù),其指令格式如右所示:例如:ANL30H,#66H MOVDPTR,#1000H LJMP0300H CJNEA,20H,HL53.按指令執(zhí)行時(shí)間分類MCS-51系列單片機(jī)按指令的機(jī)器周期數(shù)可以分為單周期指令57條,雙周期指令52條和四周期指令2條等。(1)單周期指令的執(zhí)行指令時(shí)間為一個(gè)機(jī)器周期。例如:

XCH A,@R1

ADD A,R1

CLR A

MOV R3,#0F0H (2)雙周期指令的執(zhí)行指令時(shí)間為2個(gè)機(jī)器周期。例如:

MOV Rn,30H

DJNZ R3,LOOP

JMP @a+dptr(3)四周期指令的執(zhí)行指令時(shí)間為4個(gè)機(jī)器周期。例如:DIV ABMUL AB

立即尋址(ImmediateAddressing)

操作數(shù)就包含在指令代碼中,在操作碼之后,稱為立即數(shù),用“?!北硎?。

MCS-51

如:MOVP1,#80HMOVR7,#0F5HMOV

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論