




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第2章MCS-51單片機(jī)介紹2.1單片機(jī)概述2.2MCS-51單片機(jī)的基本結(jié)構(gòu)2.3MCS-51單片機(jī)的指令2.4MCS-51單片機(jī)的并行接口2.5中斷2.6定時/計數(shù)器2.7串行接口2.8模擬通道接口 2.1單?片?機(jī)?概?述
2.1.1單片機(jī)的含義
單片機(jī)(SingleChipMicroComputer)也稱為微控制器MCU(MicroControllerUnit)。它是采用超大規(guī)模集成電路技術(shù)把中央處理器(CPU)、一定容量的存儲器(RAM/ROM等)、多種輸入/輸出(I/O)接口和中斷系統(tǒng)、定時計數(shù)器等功能電路(可能還包括顯示驅(qū)動電路、脈寬調(diào)制電路、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上而構(gòu)成的一個小而完善的計算機(jī)處理系統(tǒng)。簡單地說,一個單片機(jī)就相當(dāng)于一個微型的計算機(jī)。與計算機(jī)相比,單片機(jī)只缺少了I/O設(shè)備。單片機(jī)具有功能強(qiáng)、體積小、成本低、功耗小、配置靈活等特點(diǎn)。以單片機(jī)為核心構(gòu)成的控制系統(tǒng),成本低廉且能夠適應(yīng)各種現(xiàn)場環(huán)境,具有實(shí)時、快速的外部響應(yīng),因而被廣泛應(yīng)用在工業(yè)控制、智能化儀器儀表、通信、家電、汽車等領(lǐng)域中。事實(shí)上,單片機(jī)是世界上數(shù)量最多的計算機(jī)。現(xiàn)代人類生活中,幾乎所用的每件電子和機(jī)械產(chǎn)品中都會集成有單片機(jī)。手機(jī)、家用電器、電子玩具、掌上電腦以及鼠標(biāo)等電腦配件中會有1~2部單片機(jī);汽車上一般會配備40多部單片機(jī);復(fù)雜的工業(yè)控制系統(tǒng)上甚至可能會有數(shù)百臺單片機(jī)同時工作。2.1.2單片機(jī)的產(chǎn)品分類
根據(jù)應(yīng)用范圍的不同,單片機(jī)可分為通用型單片機(jī)和專用型單片機(jī)兩種。
1.通用型單片機(jī)
通用型單片機(jī)是由單片機(jī)廠家生產(chǎn)的、供廣大用戶選擇使用的、具有基本功能的芯片,其性能全面、適應(yīng)性強(qiáng)、能夠滿足多種控制的需要。但使用時用戶必須進(jìn)行二次開發(fā)設(shè)計,即根據(jù)需要以通用單片機(jī)為核心配以其他外圍電路、芯片,從而構(gòu)成控制系統(tǒng),同時還需要編寫控制程序。目前,世界上通用型單片機(jī)芯片的主要生產(chǎn)廠家有美國Intel公司、Motorola公司、荷蘭Philips公司、德國Siemens公司、日本Toshiba公司、韓國的Samsung公司等。其中,Intel公司的單片機(jī)最具有代表性,應(yīng)用也最廣。自1976年起,Intel公司相繼開發(fā)了MCS-48、MCS-51、MCS-96三大系列產(chǎn)品。此三大系列產(chǎn)品是我國目前的主流系列。在Intel公司對MCS-51系列單片機(jī)實(shí)行技術(shù)開放政策之后,許多公司,如Philips、Siemens、Atmel、華邦、LG等都以MCS-51中的8051為基核推出了許多各具特色且具有優(yōu)異性能的單片機(jī)。以8051為基核推出的各種型號的兼容型單片機(jī)統(tǒng)稱為51系列單片機(jī)。Intel公司MCS-51系列單片機(jī)中的8051是最基礎(chǔ)的單片機(jī)型號。
2.專用型單片機(jī)
專用型單片機(jī)是專門針對某一類產(chǎn)品甚至是某一個產(chǎn)品而設(shè)計制造的單片機(jī)。此類型的單片機(jī)即不需要進(jìn)行二次設(shè)計,也不用進(jìn)行功能開發(fā),一般由廠家與芯片制造商合作生產(chǎn)設(shè)計。例如全自動洗衣機(jī)、來電顯示電話上的單片機(jī)都是專用型單片機(jī)。專用型單片機(jī)通用性差,但由于是專門針對某一控制系統(tǒng)設(shè)計的,因此其結(jié)構(gòu)緊湊、資源優(yōu)化、成本低,在其應(yīng)用領(lǐng)域具有明顯的綜合優(yōu)勢。2.1.3單片機(jī)在汽車電子控制系統(tǒng)中的應(yīng)用
在現(xiàn)代的汽車中,電子設(shè)備比比皆是,均已涉及汽車的各主要部件(見表1-1)。其控制裝置中的單片機(jī)既有功能強(qiáng)大的16位機(jī)或32位機(jī),也有低性能的8位機(jī)。
例如,現(xiàn)代汽車發(fā)動機(jī)的功能越來越完善,其控制系統(tǒng)也越來越復(fù)雜。控制系統(tǒng)需要不斷地采集各個傳感器的信息,并按照預(yù)定的程序進(jìn)行實(shí)時計算,所以對單片機(jī)的運(yùn)算速度、數(shù)據(jù)字長、與外部設(shè)備的接口等方面不斷提出新的要求。目前,發(fā)動機(jī)控制系統(tǒng)內(nèi)單片機(jī)的總線頻率已經(jīng)提高到幾十兆赫,機(jī)型多為16位機(jī)或32位機(jī)。Motorola公司生產(chǎn)的MC68HC912DG128A單片機(jī)就被德爾福等汽車電子企業(yè)選用在自己的電控單元的產(chǎn)品中。再如,車身電子系統(tǒng)大量采用電子技術(shù),其目標(biāo)是提高駕駛舒適程度并為駕駛員提供車況信息。如空調(diào)系統(tǒng)、座椅調(diào)節(jié)系統(tǒng)、電動車窗、電動后視鏡等,這些應(yīng)用系統(tǒng)通常以較低的速率進(jìn)行數(shù)據(jù)傳輸,但要求有大電流驅(qū)動模塊來驅(qū)動電動機(jī)和執(zhí)行機(jī)構(gòu)。由于控制對象的數(shù)目眾多,必須考慮成本,因而廉價的8位控制器就成了首選。
另外,隨著汽車上電子控制單元的增多,為節(jié)省導(dǎo)線、易于布線以及在各控制單元之間快速地傳輸信息,網(wǎng)絡(luò)技術(shù)便成為了有效的手段。 2.2MCS-51單片機(jī)的基本結(jié)構(gòu)
2.2.1MCS-51單片機(jī)的性能介紹
MCS-51單片機(jī)的基本結(jié)構(gòu)如圖2-1所示。其內(nèi)部具有以下硬件資源:
(1)?8位的中央處理器(CPU)。CPU是單片機(jī)的核心,由運(yùn)算器和控制器組成。MCS-51單片機(jī)的CPU能同時處理8位二進(jìn)制數(shù)或代碼,故稱為8位機(jī)。
(2)?256個字節(jié)的內(nèi)部RAM(包括21個SFR)。RAM主要用于存儲可讀寫的數(shù)據(jù),因此又稱為數(shù)據(jù)存儲器。
(3)內(nèi)部ROM。由于ROM通常用于存放程序、原始數(shù)據(jù)、表格等,所以又稱為程序存儲器。8051的內(nèi)部有4K字節(jié)的掩膜ROM和4K字節(jié)的EPROM,而8031無片內(nèi)ROM。
(4)?2個可編程的16位定時/計數(shù)器T0、T1,用于對外部脈沖進(jìn)行計數(shù),也可用來實(shí)現(xiàn)定時操作。
(5)?4個8位的并行I/O口P0、P1、P2、P3,可用來實(shí)現(xiàn)數(shù)據(jù)的并行輸入與輸出。
(6)?1個全雙工異步串行接口,可用來實(shí)現(xiàn)單片機(jī)與其他設(shè)備之間的串行數(shù)據(jù)通信。該串行口功能較強(qiáng),既可作為全雙工異步通信收發(fā)器使用,也可作為同步移位器使用。
(7)?5個中斷源,包括3個內(nèi)部中斷與2個外部中斷,可通過編程將其設(shè)置為兩個優(yōu)先級別。
(8)內(nèi)部時鐘電路,用于產(chǎn)生CPU正常工作所需的時鐘信號。其中,石英晶體振蕩器和微調(diào)電容需外接。圖2-1MCS-51單片機(jī)的內(nèi)部基本結(jié)構(gòu)2.2.2MCS-51單片機(jī)的存儲器
1.存儲器概述
存儲器是計算機(jī)中不可缺少的重要部件,用于儲存二進(jìn)制信息。下面介紹一些有關(guān)存儲器的基本概念。
(1)位:信息的基本單位是位(bit或b),表示一個二進(jìn)制信息“1”或“0”。
(2)字節(jié):在微型機(jī)中信息大多是以字節(jié)(Byte或B)形式存放的,一個字節(jié)由8個位組成(1Byte?=?8bit),通常稱作一個存儲單元。
(3)存儲容量:存儲器芯片的存儲容量是指一片芯片所能存儲的信息位數(shù),例如8K?×?8位的芯片,其存儲容量為8?×?1024?×?8位?=?65?536位信息。
(4)地址:地址表示存儲單元所處的物理空間的位置,用一組二進(jìn)制代碼來表示。地址相當(dāng)于存儲單元的“單元編號”。CPU可以通過地址碼訪問某一存儲單元,一個存儲單元對應(yīng)一個地址碼。例如8051單片機(jī)有16位地址線,能訪問的外部存儲器的最大地址空間為64K(65536)字節(jié),對應(yīng)的16位地址碼為0000H~FFFFH。
(5)存取周期:是指存儲器存放或取出一次數(shù)據(jù)所需的時間。存儲容量和存取周期是存儲器的兩項(xiàng)重要性能指標(biāo)。
2.半導(dǎo)體存儲器的分類
半導(dǎo)體存儲器按讀、寫功能可以分為隨機(jī)讀/寫存儲器RAM(RandomAccessMemory)和只讀存儲器ROM(ReadOnlyMemory)。
RAM可以進(jìn)行多次信息寫入和讀出,每次寫入后,原來的信息將被新寫入的信息所取代。另外,RAM在斷電后再通電時,原存的信息會全部丟失,所以它主要用來存放臨時數(shù)據(jù)。
ROM的信息一旦寫入后,便不能隨機(jī)修改。在使用ROM時,只能讀出信息,而不能寫入,且在掉電后ROM中的信息仍然保留,所以它主要用來存放固定不變的程序和數(shù)據(jù)。ROM按生產(chǎn)工藝又可以分為以下幾種:
(1)掩膜ROM:其存儲的信息在制造過程中采用一道掩膜工藝生成,一旦出廠,信息就不可改變。
(2)可編程只讀存儲器PROM:其存儲的信息可由用戶通過特殊手段一次性寫入,但只能寫入一次。
(3)可擦除只讀存儲器:用戶可以多次擦除其存儲的信息,并可用專用的編程器重新寫入新的信息??刹脸蛔x存儲器又可分為紫外線擦除的EPROM、電擦除的EEPROM和FlashROM。
3.?8051的內(nèi)部數(shù)據(jù)存儲器
8051的內(nèi)部RAM有256個單元,通常在空間上分為兩個區(qū):低128個單元(地址為00H~7FH)的內(nèi)部數(shù)據(jù)RAM塊和高128個單元(地址為80H~0FFH)的專用寄存器SFR塊,見圖2-2。圖2-28051內(nèi)部的RAM配置
(1)工作寄存器區(qū)(00H~1FH)。工作寄存器區(qū)也稱為通用寄存器,該區(qū)域共有4組寄存器,每組由8個寄存單元組成,各組均以R0~R7作寄存器編號。在任一時刻,CPU只能使用其中的一組通用寄存器,稱為當(dāng)前通用寄存器組,具體使用哪組可由程序狀態(tài)寄存器PSW中RS1、RS0位決定,見表2-1。通用寄存器為CPU提供了就近存取數(shù)據(jù)的便利,提高了工作速度,也為編程提供了方便。(2)位尋址區(qū)(20H~2FH)。內(nèi)部RAM的20H~2FH地址段,共16個單元(計16?×?8?=?128位)為位尋址區(qū),位地址為00H~7FH,見表2-2。既可將位尋址區(qū)作為一般的RAM區(qū)進(jìn)行字節(jié)操作,也可對單元的每一位進(jìn)行位操作。(3)用戶RAM區(qū)(30H~7FH)。單元地址為30H~7FH的80個單元為用戶RAM區(qū),在一般應(yīng)用中把堆棧設(shè)置在該區(qū)域中。
(4)專用寄存器區(qū)(80H~0FFH)。內(nèi)部RAM的高128單元中分散有21個專用寄存器。表2-3為21個專用寄存器一覽表。下面介紹幾個常用的專用寄存器。
①累加器A(Accumulator)。累加器是最常用的一個8位專用寄存器,是運(yùn)算器的重要組成部分,大多數(shù)運(yùn)算操作都有它的參與。其既可存放操作數(shù),又可存放運(yùn)算結(jié)果。
②寄存器B。寄存器B是8位寄存器,主要用于乘、除運(yùn)算,同時也可作為一般的寄存器使用。
③程序狀態(tài)字PSW(ProgramStatusWord)。程序狀態(tài)字是8位寄存器,用于指示程序的運(yùn)行狀態(tài)信息。其中有些位是根據(jù)程序執(zhí)行結(jié)果由硬件自動設(shè)置的,而有些位可由用戶通過指令來設(shè)定。PSW中各標(biāo)志位的名稱及定義如下:
?CY—進(jìn)(借)位標(biāo)志位。在加減運(yùn)算中,若操作結(jié)果的最高位有進(jìn)位或有借位時,CY由硬件自動置1,否則清0。在位操作中,CY作為位累加器使用。
AC—輔助進(jìn)(借)位標(biāo)志位。在加減運(yùn)算中,當(dāng)?shù)退奈幌蚋咚奈划a(chǎn)生進(jìn)位或借位時,此標(biāo)志位由硬件自動置1,否則清0。
F0—用戶標(biāo)志位。由用戶通過軟件設(shè)定,用以控制程序轉(zhuǎn)向。
RS1、RS0—寄存器組選擇位。用于設(shè)定當(dāng)前通用寄存器組的組號,具體組號見表2-1。
OV—溢出標(biāo)志位。在有符號數(shù)(補(bǔ)碼數(shù))的加減運(yùn)算中,若OV?=?1,表示加減運(yùn)算的結(jié)果超出了累加器A的八位有符號數(shù)的表示范圍(-128~+127),產(chǎn)生溢出,因此運(yùn)算結(jié)果是錯誤的。若OV?=?0,表示結(jié)果未超出累加器A的符號數(shù)的表示范圍,運(yùn)算結(jié)果正確。
乘法運(yùn)算時,若OV?=?1,表示結(jié)果大于255,結(jié)果分別存在累加器A、寄存器B中。若OV?=?0,表示結(jié)果未超出255,結(jié)果只存在累加器A中。除法運(yùn)算時,若OV?=?1,表示除數(shù)為0。OV?=?0,表示除數(shù)不為0。
P—奇偶標(biāo)志位,表示累加器A中1的個數(shù)的奇偶性。在每個指令周期由硬件根據(jù)累加器A的內(nèi)容的奇偶性對P自動置位或復(fù)位。P?=?1,表示累加器A中的內(nèi)容有奇數(shù)個1。
④數(shù)據(jù)指針DPTR(DataPointer)。數(shù)據(jù)指針DPTR是唯一的一個供用戶使用的16位寄存器,它由兩個8位寄存器DPH與DPL組成。DPTR通常在訪問外部數(shù)據(jù)存儲器時作為地址指針使用,尋址范圍為64KB。
⑤堆棧指針SP(StackPointer)。程序運(yùn)行時需要一個連續(xù)的RAM塊作為數(shù)據(jù)緩沖區(qū),以暫時存放程序運(yùn)行過程中的一些重要數(shù)據(jù),此RAM塊稱為堆棧。堆棧的主要功用是保護(hù)斷點(diǎn)和保護(hù)現(xiàn)場。因?yàn)橛嬎銠C(jī)無論執(zhí)行的是中斷程序還是子程序,最終都要返回主程序。在轉(zhuǎn)去執(zhí)行中斷程序或子程序時,要把主程序的斷點(diǎn)保護(hù)起來,以便能正確的返回。同時,也要將中斷程序或子程序可能要用到的寄存器中的內(nèi)容保護(hù)起來,即保護(hù)現(xiàn)場。
堆棧指針SP用于指示棧頂單元地址,是一個8位寄存器。當(dāng)系統(tǒng)復(fù)位后,SP的內(nèi)容為07H。
堆棧的最大特點(diǎn)是按“后進(jìn)先出”的數(shù)據(jù)操作原則執(zhí)行。MCS-51系列單片機(jī)的堆棧是向上生長型,即數(shù)據(jù)進(jìn)棧時,SP的內(nèi)容先自動加1后再向棧區(qū)寫入數(shù)據(jù);數(shù)據(jù)出棧時,SP所指示的棧區(qū)數(shù)據(jù)先彈出,然后SP的內(nèi)容再自動減1。
4.?8051的內(nèi)部程序存儲器
在介紹8051的內(nèi)部程序存儲器前,先介紹一個重要的專用寄存器——程序計數(shù)器PC。
PC(ProgramCounter)為一個16位的計數(shù)器,其存儲的內(nèi)容為單片機(jī)將要執(zhí)行的指令機(jī)器碼所在的存儲單元的地址。PC具有自動加1的功能,即CPU以PC的當(dāng)前值為地址從ROM中讀取一個字節(jié)指令后,PC自動加1,以指向下一個ROM單元,當(dāng)CPU再次以PC的當(dāng)前值為地址進(jìn)行指令讀取時,讀到的就是下一個ROM單元的內(nèi)容,這樣就實(shí)現(xiàn)了程序的自動按順序執(zhí)行。由于PC是不可尋址的,因此用戶無法對它直接進(jìn)行讀寫操作,但可以通過轉(zhuǎn)移、調(diào)用、返回等指令改變其內(nèi)容,以實(shí)現(xiàn)程序的轉(zhuǎn)移。復(fù)位后,PC=0000H。程序存儲器主要用于存放程序及重要的數(shù)據(jù)。大多數(shù)51系列單片機(jī)的內(nèi)部都配置有一定數(shù)量的程序存儲器ROM,如8051芯片內(nèi)有4KB的掩膜ROM存儲單元,AT89C51芯片內(nèi)部配置了4KB的FlashROM,它們的地址范圍均為0000H~0FFFH。內(nèi)部程序存儲器內(nèi)有如下一些特殊單元,使用時要注意。
0000H單元:系統(tǒng)復(fù)位后,PC?=?0000H,即單片機(jī)從0000H單元開始執(zhí)行程序。如果主程序不是從0000H單元開始存放,就必須在0000H~0002H單元中存放一條無條件轉(zhuǎn)移指令,以便轉(zhuǎn)去執(zhí)行指定的應(yīng)用程序。
0003H單元:外部中斷0的中斷程序入口地址。
000BH單元:定時器/計數(shù)器0的中斷程序入口地址。
0013H單元:外部中斷1的中斷程序入口地址。
001BH單元:定時器/計數(shù)器1的中斷程序入口地址。
0023H單元:串行中斷程序入口地址。
在中斷程序入口地址單元中應(yīng)存放相應(yīng)的中斷服務(wù)程序,但8個單元通常難以存下一個完整的中斷服務(wù)程序,因此往往需要在中斷程序入口地址單元中存放一條無條件轉(zhuǎn)移指令,以便轉(zhuǎn)到中斷服務(wù)程序真正的入口地址。對程序存儲器的操作作以下說明:
(1)程序指令的自主操作。CPU按照PC指針自動地從程序存儲器中取出指令。
(2)用戶使用指令對程序存儲器中的常數(shù)表格進(jìn)行讀操作。此操作可用MOVC指令實(shí)現(xiàn)。圖2-3MCS-51單片機(jī)的引腳圖
5.?8051的外部存儲器
因8051的內(nèi)部程序計數(shù)器PC為16位計數(shù)器,同時8051共有16根地址線引腳,因此在8051單片機(jī)的外部可以分別擴(kuò)展64KB的ROM與64KB的RAM。2.2.3MCS-51單片機(jī)的引腳功能介紹
MCS-51單片機(jī)的引腳圖見圖2-3。下面對各引腳的作用進(jìn)行介紹。
1.主電源引腳VCC和VSS
VCC為電源輸入端,正常操作時接?+5V電源;VSS為接地線。
2.時鐘振蕩電路引腳XTAL1、XTAL2
XTAL1和XTAL2分別用作晶體振蕩電路的反相器輸入端和輸出端。MCS-51單片機(jī)的時鐘電路見圖2-4。圖2-4(a)中采用了芯片內(nèi)部的一個高增益反向放大器、芯片外連的晶體振蕩器和微調(diào)電容構(gòu)成一個穩(wěn)定的自激振蕩器,這就是單片機(jī)的內(nèi)部時鐘電路。時鐘電路產(chǎn)生的振蕩脈沖經(jīng)過二分頻以后,才成為單片機(jī)的時鐘信號。晶振的頻率fosc通常在6MHz~12MHz之間選擇。1個機(jī)器周期=12個振蕩周期?=12/fosc。圖2-4MCS-51單片機(jī)的時鐘電路
4.控制類引腳
(1)?RST/VPD(9腳)。RST為復(fù)位信號輸入端。復(fù)位是單片機(jī)系統(tǒng)的初始化操作,在該引腳上輸入持續(xù)2個機(jī)器周期以上的高電平時,單片機(jī)系統(tǒng)復(fù)位。系統(tǒng)復(fù)位后對專用寄存器的影響情況見表2-3。同時,復(fù)位操作還對單片機(jī)的個別引腳信號有影響,如把ALE和PSEN信號變?yōu)闊o效狀態(tài),即ALE=1,PSEN=1。復(fù)位操作對內(nèi)部RAM不產(chǎn)生影響。復(fù)位電路見圖2-5。圖2-5MCS-51單片機(jī)的復(fù)位電路 2.3MCS-51單片機(jī)的指令
2.3.1單片機(jī)的指令系統(tǒng)概述
指令就是指揮計算機(jī)工作的命令。一臺計算機(jī)能執(zhí)行的全部指令稱為該計算機(jī)的指令系統(tǒng)。指令系統(tǒng)全面描述了CPU的功能。指令系統(tǒng)是由生產(chǎn)廠家確定的,不同的CPU有不同的指令系統(tǒng)。編程語言是人機(jī)對話的工具,按使用層次可分為機(jī)器語言、匯編語言和高級語言。機(jī)器語言(二進(jìn)制代碼)能直接被機(jī)器識別,用其編寫的程序運(yùn)行效率高,但編程效率低,不便于閱讀、書寫和交流。引入助記符將機(jī)器語言符號化后就成為匯編語言,其指令直觀易懂。用匯編語言編寫的程序稱為匯編語言程序。匯編語言程序必須經(jīng)過匯編(機(jī)器匯編或手工匯編)成為機(jī)器語言后才能被機(jī)器執(zhí)行。
例如將累加器A中的數(shù)據(jù)加9的指令,機(jī)器語言為0010010000001001B,而匯編指令為ADDA,#09H。
高級語言的編程效率高,但編寫出的程序運(yùn)行效率低。2.3.2匯編語言的語句格式
匯編語言程序由一系列語句組成,一行為一個語句。匯編語言的語句格式如下:
[標(biāo)號:]操作碼助記符[操作數(shù)][;注釋]
1.標(biāo)號
標(biāo)號表示該指令代碼第一字節(jié)的地址,是用戶根據(jù)程序需要(該指令為子程序入口指令或程序轉(zhuǎn)移的目標(biāo)指令)而設(shè)定的符號地址。標(biāo)號由英文字母、數(shù)字或下劃線組成,但必須以英文字母開頭,以“:”結(jié)束,一般包含1~8個字符。不能使用匯編語言中已經(jīng)定義的符號(如助記符、寄存器符號等)作標(biāo)號,一個標(biāo)號在同一程序中只能定義一次。
2.操作碼助記符
操作碼助記符是表示指令操作功能的英文縮寫,是語句的核心部分。每條語句都必須有操作碼。
3.操作數(shù)
操作數(shù)表示指令的操作對象,其表示形式與尋址方式有關(guān)。一條指令中可以沒有操作數(shù),也可以有多個操作數(shù),操作數(shù)和操作碼之間以空格分隔,操作數(shù)之間以逗號分隔。
4.注釋
注釋是編程者為方便程序的理解、交流而書寫的解釋性文字、符號,不屬于語句的功能部分,既不產(chǎn)生代碼,對匯編過程也不起作用。注釋必須以“;”開始。2.3.3尋址方式
操作數(shù)是指令的一個重要組成部分,所謂的尋址方式就是確定操作數(shù)所在的位置(地址)的方法。MSC-51系列單片機(jī)共有七種尋址方式。
1.立即尋址
立即尋址是指在指令中直接給出操作數(shù)的尋址方式。操作數(shù)作為指令的一個組成部分存放在程序存儲器中。該操作數(shù)稱為立即數(shù)。立即數(shù)前應(yīng)加“#”標(biāo)記,如下面指令中的“#40H”:
MOV
A,#40H
該指令將立即數(shù)40H送累加器A中。
2.直接尋址
直接尋址是在指令中直接給出操作數(shù)地址的尋址方式。這種尋址方式可對內(nèi)部數(shù)據(jù)存儲器進(jìn)行訪問。如下面指令中的“50H”:
MOV
A,50H
該指令把內(nèi)部RAM中地址為50H的單元(直接尋址)中的內(nèi)容送入累加器A中。
3.寄存器尋址
寄存器尋址是指以指令指定的寄存器的內(nèi)容作為操作數(shù)的尋址方式。指定的寄存器有工作寄存器R0~R7、累加器A、數(shù)據(jù)指針DPTR。如下面指令中的“A、R2”:
MOV
A,R2
該指令是將工作寄存器R2的內(nèi)容送給累加器A。
4.寄存器間接尋址方式
寄存器間接尋址是以指令中指定寄存器的內(nèi)容作為地址取得操作數(shù)的方法。指定的寄存器有R0、R1、DPTR,使用時寄存器前面加“@”標(biāo)志。如下面指令中的“@R0”:
MOVA,@R0
該指令的操作為將寄存器R0的內(nèi)容(設(shè)(R0)?=?30H)作為地址,把片內(nèi)RAM地址為30H的單元中的內(nèi)容(設(shè)(30H)?=?48H)送入累加器A,指令執(zhí)行后(A)?=?48H。
5.基址加變址尋址
基址加變址就是以DPTR或PC為基址寄存器,以A為變址寄存器,然后以兩者內(nèi)容相加形成的16位地址作為操作數(shù)地址。例如下面指令中的“@A+DPTR”:
MOVCA,@A+DPTR
該指令是把DPTR的內(nèi)容作為基地址,把A的內(nèi)容作為偏移量,再將兩量相加形成16位地址,然后將該地址的程序存儲器ROM單元中的內(nèi)容送給累加器A。假設(shè)指令執(zhí)行前為:(DPTR)?=?1100H,(A)?=?56H,ROM(1156H)?=?80H,則該指令執(zhí)行后:(A)?=?80H。
基址加變址尋址只能對程序存儲器進(jìn)行尋址。
6.相對尋址
相對尋址方式只用于相對轉(zhuǎn)移指令中。相對轉(zhuǎn)移指令以當(dāng)前PC的值(即本指令下面一條指令的首字節(jié)地址)與指令中給定的相對偏移量rel之和作為程序轉(zhuǎn)移的目標(biāo)地址。偏移量rel是8位二進(jìn)制補(bǔ)碼,轉(zhuǎn)移范圍位于當(dāng)前PC值的-128~+127個字節(jié)單元之間。例如下面的指令:
JZ30H ;當(dāng)(A)?=?0時,則PC←?(PC)?+?2?+?rel,程序轉(zhuǎn)移
;當(dāng)(A)≠0時,則PC←?(PC)?+?2,程序按原順序執(zhí)行
7.位尋址
位尋址是對內(nèi)部RAM及專用寄存器的可尋址位的內(nèi)容進(jìn)行操作的尋址方式??蛇M(jìn)行位尋址的空間有:
(1)片內(nèi)RAM的20H~2FH,共16個單元128位,其位地址編碼為00H~7FH。
(2)字節(jié)地址能被8整除的SFR(11個)。對這些尋址位,可以有以下幾種表示方法:
①直接位地址方式,如:0D5H;
②位名稱方式,如:F0;
③點(diǎn)操作符方式,如PSW.5或0D0H.5;
以上幾種方式指的都是PSW中的第5位。
例如指令:MOVC,07H
該指令屬位操作指令,將內(nèi)部RAM20H單元的D7位(位地址為07H)的內(nèi)容送給位累加器CY。2.3.4指令中符號的約定
下面對匯編指令系統(tǒng)中指令的符號約定進(jìn)行介紹。
Rn:當(dāng)前選中的工作寄存器組的工作寄存器,n?=?0~7。
?@Ri:以R0或R1作寄存器間接尋址,“@”為間址符,i?=?0、1。可以訪問片內(nèi)RAM的低128字節(jié)和片外RAM的低256字節(jié)。
?@DPTR:以數(shù)據(jù)指針DPTR的內(nèi)容為地址的寄存器間接尋址,對外部RAM的64K字節(jié)地址空間進(jìn)行尋址。
direct:8位直接地址,可以是內(nèi)部RAM單元地址(00H~7FH),也可以是特殊功能寄存器地址(80H~FFH)。
addr11:11位地址,短轉(zhuǎn)移(AJMP)及短調(diào)用(ACALL)指令中用于構(gòu)成轉(zhuǎn)移目標(biāo)地址,可在2KB范圍內(nèi)轉(zhuǎn)移。實(shí)際編程時用標(biāo)號代替此指令。
addr16:16位地址,長轉(zhuǎn)移(LJMP)及長調(diào)用(LCALL)指令中為轉(zhuǎn)移目標(biāo)地址,轉(zhuǎn)移范圍為64KB。實(shí)際編程時用標(biāo)號代替此指令。
bit:位地址,可以是內(nèi)部RAM中所有的可尋址位。
rel:用于相對轉(zhuǎn)移指令中,為8位二進(jìn)制補(bǔ)碼,表示偏移量為?-128~+127字節(jié)。實(shí)際編程時用標(biāo)號代替此指令。
?#data:8位立即數(shù)?!埃!睘榱⒓磾?shù)的標(biāo)志。
?#data16:16位立即數(shù)。
/:位操作數(shù)取反操作的前綴,如“/bit”。
(X):X中的內(nèi)容。
((X)):由X間接尋址的單元中的內(nèi)容。
?←:將箭頭右邊的內(nèi)容送到箭頭所指的單元。2.3.5MCS-51單片機(jī)指令系統(tǒng)的分類
MCS-51單片機(jī)的指令系統(tǒng)共有111條指令,按功能分為五大類:數(shù)據(jù)傳送類指令、算術(shù)運(yùn)算類指令、邏輯運(yùn)算類指令、位操作類指令、控制程序轉(zhuǎn)移類指令。
1.數(shù)據(jù)傳送類指令
MSC-51單片機(jī)的數(shù)據(jù)傳送類指令如表2-4所示。表2-4中:
(1)?MOV指令。
MOV目的操作數(shù),源操作數(shù)
該指令的功能是把源操作數(shù)所表示的數(shù)據(jù)傳送到目的操作數(shù)指定的單元中,指令執(zhí)行之后源操作數(shù)不發(fā)生改變。
(2)?PUSH、POP指令為堆棧操作指令。PUSH為入棧指令;POP為出棧指令。
(3)?XCH為字節(jié)交換指令,該指令的功能是將累加器A中的值與另一個操作數(shù)指示的數(shù)據(jù)互換位置。
(4)?XCHD為半字節(jié)交換指令,該指令的功能是將累加器A中內(nèi)容與源操作數(shù)的低4位互換,而高4位不變。
(5)?SWAP指令的功能是將累加器A中的高4位與低4位互換。
(6)?MOVX指令的功能是實(shí)現(xiàn)片外RAM(或擴(kuò)展I/O)與累加器A之間的數(shù)據(jù)傳送。注意:片外RAM只能采用寄存器間接尋址的方式訪問。
(7)?MOVC指令的功能是從程序存儲器中讀取數(shù)據(jù)并送入累加器A,該指令可以訪問片內(nèi)ROM,也可以訪問片外ROM。2.算術(shù)運(yùn)算類指令
表2-5中:
(1)?ADD為加法指令,功能是將源操作數(shù)與累加器A中的內(nèi)容相加,結(jié)果存儲在累加器A中。該操作不改變源操作數(shù),但影響PSW中的CY、AC、OV、P,影響如下:
若最高位有進(jìn)位,則CY置1,否則清0;
若低4位向高4位有進(jìn)位,則AC置1,否則清0;
若第6位有進(jìn)位而第7位無進(jìn)位或第6位無進(jìn)位而第7位有進(jìn)位,則OV置1,否則清0。
(2)?ADDC為帶進(jìn)位加法指令,功能是將源操作數(shù)、累加器A的內(nèi)容、進(jìn)位標(biāo)志CY的值三者相加,結(jié)果存儲在累加器A中。該指令對標(biāo)志位的影響與ADD指令的相同。
(3)?INC為增量指令,功能是將操作數(shù)指示的數(shù)據(jù)加1,結(jié)果仍然存儲在該操作數(shù)指示的單元中。該組指令除“INCA”指令影響P標(biāo)志位外,不影響任何標(biāo)志位。
(4)?SUBB為帶進(jìn)位減法指令,功能為用累加器A中的數(shù)據(jù)減去源操作數(shù),再減去進(jìn)位CY,差存儲在累加器A中,該組指令影響PSW中的CY、AC、OV、P。
(5)?DEC為減量指令,功能是將操作數(shù)減1,結(jié)果仍然存儲在該操作數(shù)指示的單元中。
(6)?MUL為乘法指令,功能是將累加器A與寄存器B中的兩個8位無符號數(shù)相乘,所得16位乘積存儲在BA寄存器對中。
(7)?DIV為除法指令,功能是用累加器A中的數(shù)據(jù)除以寄存器B中的數(shù)據(jù),運(yùn)算后,商存于累加器A中,余數(shù)存于寄存器B中。注意,除數(shù)與被除數(shù)都為無符號數(shù)。
(8)?DA為十進(jìn)制調(diào)整指令,功能是對累加器A中由上一條加法指令(加數(shù)和被加數(shù)均為壓縮BCD碼)所獲得的結(jié)果進(jìn)行調(diào)整。該指令需緊跟在ADD或ADDC指令后使用。3.邏輯運(yùn)算類指令
表2-6中:
(1)?ANL為邏輯與運(yùn)算法指令,功能是將指令中的兩個操作數(shù)指示的數(shù)據(jù)按位與運(yùn)算,運(yùn)算結(jié)果存儲在第一個操作數(shù)指示的單元中。
(2)?ORL為邏輯或運(yùn)算法指令,功能是將指令中的兩個操作數(shù)指示的數(shù)據(jù)按位或運(yùn)算,運(yùn)算結(jié)果存儲在第一個操作數(shù)指示的單元中。
(3)?XRL為邏輯異或運(yùn)算法指令,功能是將指令中的兩個操作數(shù)指示的數(shù)據(jù)按位異或運(yùn)算,運(yùn)算結(jié)果存儲在第一個操作數(shù)指示的單元中。
(4)?CLR、CPL為累加器A的清零、取反指令。
(5)?RL、RR、RLC、RRC為循環(huán)移位指令。4.位操作類指令
表2-7中:
(1)?MOV為位傳送指令,功能為將源操作數(shù)的值(可能為1或0)傳送至目的操作數(shù)中。
(2)?SETB、CLR、CPL分別為置位、清0、取反指令,功能是將操作數(shù)的值置為1、0或者取反。
(3)?ANL、ORL為位邏輯運(yùn)算指令。
5.控制程序轉(zhuǎn)移類指令
表2-8中:
(1)?LJMP、AJMP、SJMP、JMP為無條件轉(zhuǎn)移指令,指令中的操作數(shù)即為轉(zhuǎn)移的目標(biāo)。
(2)?JZ、JNZ指令為條件轉(zhuǎn)移指令,轉(zhuǎn)移的條件為累加器的值是否為0。
(3)?JC、JNC指令為條件轉(zhuǎn)移指令,轉(zhuǎn)移的條件為標(biāo)志位CY的值是為0還是為1。
(4)?JB、JNB、JBC指令為條件轉(zhuǎn)移指令,轉(zhuǎn)移的條件為bit位的值為0還是為1。
(5)?CJNE為比較不相等轉(zhuǎn)移指令,指令的功能是將第1、第2操作數(shù)的值(無符號數(shù)據(jù))進(jìn)行比較,若不相同則轉(zhuǎn)移(轉(zhuǎn)移的目標(biāo)由第3操作數(shù)指示),若相同則順序執(zhí)行。
(6)?DJNZ為減1不為0轉(zhuǎn)移指令,指令的功能是先將第1操作數(shù)的值減1,之后判斷結(jié)果是否為0,若不為0則轉(zhuǎn)移(轉(zhuǎn)移的目標(biāo)由第2操作數(shù)指示),若為0則順序執(zhí)行。
(7)?LCALL、ACALL指令為子程序調(diào)用指令,RET為子程序返回指令,RETI為中斷返回指令。
(8)?NOP是空操作指令。2.3.6匯編偽指令
1.匯編起始地址偽指令ORG(Origin)
格式:ORG
addr16
功能:規(guī)定目標(biāo)程序段的起始地址。ORG后面的16位地址表示此語句后的程序或數(shù)據(jù)塊在程序存儲器中的起始地址。
例如:
ORG
1000H
START:MOV
A,#32H
上述指令說明:START表示的地址為1000H,MOV指令從1000H存儲單元開始存放數(shù)據(jù)。
2.字節(jié)定義偽指令DB(DefineByte)
格式:[標(biāo)號:]
DBdata1,data2,data3,…,dataN
功能:從指定的地址單元開始,存入規(guī)定好的8位數(shù)據(jù)表。
例如:
?ORG
1000H
TAB1:DB
01H,04H,09H,10H
以上偽指令匯編后從1000H單元開始存放4個字節(jié)的數(shù)據(jù)平方表:(1000H)?=?01H,(1001H)?=?04H,(1002H)?=?09H,(1003H)?=?10H。
3.字定義偽指令DW(Defineword)
格式:[標(biāo)號:]
DW
data1,data2,…,dataN
功能:從指定的地址單元開始,存入規(guī)定好的16位數(shù)據(jù)表。每個數(shù)據(jù)(16位)占用兩個存儲單元,其中高8位存入小地址單元,低8位存入大地址單元。常用于定義一個地址表。
例如:
ORG
1000H
TAB2:DW1067H,765AH
匯編后:(1000H)?=?10H,(1001H)?=?67H,(1002H)?=?76H,(1003H)?=?5AH。
4.存儲區(qū)定義偽指令DS(DefineStorage)
格式:[標(biāo)號:]
DS
X
功能:從指定的地址單元開始,預(yù)留X字節(jié)單元作為備用。
例如:
ORG
2000H
DS
07H
L2:MOV
A,#00H
匯編后,從2000H開始保留7個字節(jié)單元,從而MOV指令的地址為2007H。
注意:DB、DW、DS偽指令只能對程序存儲器進(jìn)行賦值和初始化工作,不能用來對數(shù)據(jù)存儲器進(jìn)行賦值和初始化工作。
5.賦值偽指令EQU(Equate)
格式:字符名EQU數(shù)或匯編符號
功能:將右邊的值賦給左邊用戶定義的字符。賦值后,字符在整個程序內(nèi)有效,該偽指令一般放在程序的開始段。
例如:
TEMP
EQU
R0
X
EQU
16
第一條偽指令將TEMP等值為匯編符號R0,此后的指令中TEMP可以代替R0來使用。第二條指令表示指令中可以用X代替16來使用。注意使用EQU命令時必須先賦值后使用,字符名不能和匯編語言的關(guān)鍵字同名,如不能使用A、MOV、B等。
6.位地址定義偽指令BIT
格式:字符名BIT位地址
功能:將位地址賦予所定義的字符名。
7.匯編結(jié)束偽指令END
格式:END
功能:表示匯編語言源程序到此結(jié)束。 2.4MCS-51單片機(jī)的并行接口
1.并行接口的結(jié)構(gòu)
(1)?P0口。P0口的結(jié)構(gòu)見圖2-6。P0口是功能最強(qiáng)的口,即可作為一般的I/O口使用,也可作為單片機(jī)外部數(shù)據(jù)線、低8位地址線使用。當(dāng)P0口作為一般的I/O口輸出時,由于端口各口線的輸出電路是漏極開路電路,因此必須外接上拉電阻才能有高電平輸出。當(dāng)P0口作為一般的I/O口輸入時,必須使電路中的鎖存器寫入高電平“1”,使場效應(yīng)管FET截止、引腳處于“浮空”狀態(tài),才能做到高阻輸入,以保證輸入正確的數(shù)據(jù)。圖2-6P0的內(nèi)部結(jié)構(gòu)
(2)?P1口。P1口的結(jié)構(gòu)見圖2-7。P1口通常作為通用I/O口使用。作為輸出口時,由于P1電路內(nèi)部已經(jīng)帶有上拉電阻,因此無需外接上拉電阻;作為輸入口時,也需先向鎖存器寫入“1”。圖2-7P1的內(nèi)部結(jié)構(gòu)
(3)?P2口。P2口的結(jié)構(gòu)見圖2-8。P2口既可作為通用I/O口使用,也可作為單片機(jī)外部的高8位地址線使用。圖2-8P2的內(nèi)部結(jié)構(gòu)
(4)?P3口。P3口的結(jié)構(gòu)見圖2-9。P3口既可作為通用I/O口使用,也可作為第二功能按需要來使用,見表2-9。圖2-9P3的內(nèi)部結(jié)構(gòu)
(4)?I/O口功能的自動識別。無論是P0、P2口的總線復(fù)用功能,還是P3口的第二復(fù)用功能,單片機(jī)都會自動選擇,不需要用戶通過指令選擇。
(5)?I/O口的驅(qū)動特性。P0口的每一個I/O口可驅(qū)動8個LSTTL輸入,而P1、P2、P3口的每一個I/O口只可驅(qū)動4個LSTTL輸入。在使用時應(yīng)注意口的驅(qū)動能力。
3.并行接口的使用
在MCS-51單片機(jī)中,沒有專門的輸入/輸出指令,而是將I/O接口與存儲器一樣看待,即使用訪問存儲器的指令來實(shí)現(xiàn)I/O接口的輸入/輸出功能。當(dāng)向I/O口寫入數(shù)據(jù)時,即通過相應(yīng)引腳向外輸出,而當(dāng)從I/O口讀入數(shù)據(jù)時,則將通過引腳將外部設(shè)備的狀態(tài)信號輸入到單片機(jī)內(nèi)。
4個I/O口都可以進(jìn)行位尋址,即可通過位操作指令實(shí)現(xiàn)一位口線的輸入/輸出。為了使用方便,用Pm表示某一個并行口,Pm.n表示m口的第n位口線。
1)輸出數(shù)據(jù)
(1)使用MOV指令輸出字節(jié)數(shù)據(jù),這是常用的輸出方法,例如:
MOVPm,#data
MOVPm,A
(2)使用位操作指令輸出各位數(shù)據(jù)。外部設(shè)備的輸入/輸出線往往只有一根,此時使用位操作指令更方便。例如:
MOVPm.n,C
SETBPm.n
CLRPm.n
(3)使用讀—修改—寫指令改變輸出數(shù)據(jù)。有時控制系統(tǒng)的前后輸出是有聯(lián)系的,下一個輸出必須根據(jù)前一個輸出決定,此時需要使用讀—修改—寫指令,例如:
ANLPm,#data
ORLPm,A
CPLPm.n
2)輸入數(shù)據(jù)
執(zhí)行對端口進(jìn)行讀操作的指令時,可以從相應(yīng)的口線上將外部設(shè)備的狀態(tài)信息輸入至單片機(jī)中。例如:
(1)字節(jié)數(shù)據(jù)輸入
MOVPm,#0FFH
MOVA,Pm
該程序段執(zhí)行后將從Pm端口中輸入一個8位數(shù)據(jù),送至A中存放。
(2)位數(shù)據(jù)輸入
SETBPm.n
MOVC,Pm.n
該程序段執(zhí)行后將從Pm端口的第n位口線上輸入一位信息,并送至C中存放。
4.并行接口的應(yīng)用實(shí)例
1)并行接口控制七段LED顯示器
圖2-10為七段LED顯示器,它由8個發(fā)光二極管構(gòu)成各字段,內(nèi)部結(jié)構(gòu)有共陰極與共陽極兩種。圖2-10七段LED顯示器
例1
用8051控制共陽極七段LED顯示器循環(huán)顯示0~9十個數(shù)字,電路見圖2-11。圖2-11共陽極七段LED顯示器的控制電路程序如下:
ORG 0000H
LJMP MAIN
ORG 0100H
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;0~9顯示碼
?? DB 92H,82H,0F8H,80H,90H
MAIN: MOV R0,#0
MOV DPTR,#TAB
LOOP: MOV A,R0
MOVC A,@A+DPTR ;查表取顯示碼
MOV P1,A ;輸出顯示
LCALL DELAY ;定時
INC R0
CJNE R0,#10,LOOP
LJMP MAIN
DELAY: MOV R2,#0C8H ;定時子程序
LOOP1: MOV R3,#0FAH
DJNZ R3,$
DJNZ R2,LOOP1
RET
END
2)并行接口驅(qū)動步進(jìn)電機(jī)
步進(jìn)電機(jī)因其轉(zhuǎn)動角度與轉(zhuǎn)速可精確控制而廣泛應(yīng)用于數(shù)字電路,特別是在計算機(jī)控制系統(tǒng)中作為執(zhí)行機(jī)構(gòu),直接由計算機(jī)的數(shù)字信號驅(qū)動以實(shí)現(xiàn)精確控制。
以三相步進(jìn)電機(jī)為例,步進(jìn)電機(jī)的控制包括以下三個方面。
(1)方向控制。給步進(jìn)電機(jī)的三個勵磁繞組A、B、C按照不同的順序通電、斷電,則可實(shí)現(xiàn)步進(jìn)電機(jī)的正轉(zhuǎn)或反轉(zhuǎn)。步進(jìn)電機(jī)驅(qū)動方式通常有三種:
①三相單三拍方式:A→B→C。
其中,“三相”指A、B、C三個繞組,“單”指每次只有一相繞組通電,“拍”指從一種通電狀態(tài)轉(zhuǎn)到另一種通電狀態(tài)。
②三相雙三拍方式:AB→BC→CA。
③三相六拍方式:A→AB→B→BC→C→CA。
假設(shè)按以上順序通電,步進(jìn)電機(jī)正轉(zhuǎn);若按相反方向通電,則步進(jìn)電機(jī)反轉(zhuǎn)。
例如用單片機(jī)的P1.0、P1.1、P1.2分別控制步進(jìn)電機(jī)的A、B、C相繞組(見圖2-12),則各種驅(qū)動方式下的控制代碼見表2-10~表2-12。圖2-12單片機(jī)控制三相步進(jìn)電機(jī)的硬件電路
(2)角度控制。步進(jìn)電機(jī)每一拍前進(jìn)一步,對應(yīng)一個脈沖。通過控制通電脈沖數(shù)可精確控制電機(jī)轉(zhuǎn)過的角度。
(3)速度控制。步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)速度由輸入到A、B、C三相繞組脈沖的頻率控制。
例2
編程控制步進(jìn)電機(jī),控制電路見圖2-12。對步進(jìn)電機(jī)的要求如下:
①步進(jìn)電機(jī)以三相六拍方式工作。
②步進(jìn)電機(jī)轉(zhuǎn)動的總步數(shù)存儲在內(nèi)部RAM的0FFH單元中。
③轉(zhuǎn)向標(biāo)志存放在程序狀態(tài)寄存器用戶標(biāo)志位F0(D5H)中,當(dāng)F0為“0”時,步進(jìn)機(jī)正轉(zhuǎn),反之步進(jìn)機(jī)反轉(zhuǎn)。
④步進(jìn)電機(jī)工作脈沖的頻率為100Hz。
⑤系統(tǒng)晶振頻率fosc為12MHz。
解步進(jìn)電機(jī)的控制流程如圖2-13所示。圖2-13步進(jìn)電機(jī)的控制流程程序清單如下:
ORG 0000H
LJMP MAIN
ORG 0100H
TAB6: DB 01H,03H,02H,06H,04H,05H ;正轉(zhuǎn)控制代碼
TAB_6: DB 05H,04H,06H,02H,03H,01H ;反轉(zhuǎn)控制代碼
DELAY: MOV R0,#100 ;延時0.01s
D_1: MOV R1,#48
NOP
DJNZ R1,$
DJNZ R0,D_1
RET
MAIN: JNB F0,CLW ;判斷轉(zhuǎn)向
MOV DPTR,#TAB_6 ;設(shè)置反轉(zhuǎn)控制代碼首地址
LJMP CON
CLW: MOV DPTR,#TAB6 ;設(shè)置正轉(zhuǎn)控制代碼首地址
CON: MOV A,#0 ;設(shè)置控制代碼偏移量
LOOP: PUSH ACC ;保護(hù)控制代碼偏移量
MOVC A,@A+DPTR ;取控制代碼
MOV P1,A ;輸出控制代碼
LCALL DELAY ;延時0.01s
DJNZ 0FFH,NEXT ;判斷轉(zhuǎn)動步數(shù)是否達(dá)到要求
LJMP FINISH ;控制完成
NEXT: POP ACC ;取控制代碼偏移量
INC A ;偏移量加1
CJNE A,#6,LOOP ;偏移量?=?6?不等則繼續(xù)
LJMP CON ;偏移量?=?6時開始新一次循環(huán)
FINISH: NOP ;程序結(jié)束
END 2.5中斷
中斷是日常生活中常見的現(xiàn)象。如你正在看書,突然電話鈴響了,你首先會看完這一句并在書上做個標(biāo)記,再放下書本去接電話,和來電話的人交談完畢之后,放下電話,回來接著從做標(biāo)記處繼續(xù)看書。這就是生活中的“中斷”現(xiàn)象,即正常的工作過程被外部的事件打斷了。
仔細(xì)研究一下生活中的中斷,我們發(fā)現(xiàn)要實(shí)現(xiàn)中斷需滿足以下幾點(diǎn):
第一,需要有能夠引起中斷處理的事件,即中斷源。如:門鈴響了,鬧鐘叫了,你燒的水開了……,等等諸如此類的事件。第二,對中斷事件的緊急狀態(tài)進(jìn)行判斷。設(shè)想一下,你正在看書,有客來訪,同時電話又響了,你該怎么辦呢?如果你在等一個重要的客人,你可能會先會見訪客;如果你在等一個重要的電話,你一般會讓訪客稍等。這里涉及一個優(yōu)先級的問題。優(yōu)先級的問題不僅僅發(fā)生在兩個中斷同時產(chǎn)生的情況。也發(fā)生在一個中斷已正在處理,又有一個中斷產(chǎn)生的情況。若你正在接待訪客時,電話又響了,你又該怎么辦?第三,中斷的響應(yīng)與處理。當(dāng)有事件發(fā)生(如電話響了,訪客來訪)時,進(jìn)行處理之前你需要記住書看到第幾頁第幾行了,并做一下標(biāo)記,然后再去處理不同的事情(因?yàn)樘幚硗炅?,我們還要回來繼續(xù)看書)。而且,電話鈴響我們要到放電話的地方去,門鈴響我們要到門那邊去。也就是說不同的中斷,我們要在不同的地點(diǎn)處理,而這個地點(diǎn)通常是固定的。單片機(jī)中的中斷過程也是如此。一個完整的中斷過程包括以下幾個步驟:
(1)由中斷源提出中斷申請。MCS-51單片機(jī)中一共有5個事件可引起CPU中斷處理。
(2)中斷判優(yōu)。當(dāng)幾個中斷源同時向CPU提出請求時,CPU通常根據(jù)中斷源的輕重緩急進(jìn)行排隊(duì),優(yōu)先處理最緊急的中斷請求源,暫時不被響應(yīng)的中斷請求則被掛起。MCS-51單片機(jī)的中斷事件可以編程設(shè)置為兩個優(yōu)先級別,即同時可以實(shí)現(xiàn)兩級中斷嵌套。中斷嵌套即為當(dāng)CPU正在處理一個中斷請求的時候,又發(fā)生了另一個優(yōu)先級更高的中斷請求,則CPU能夠暫時中止原來的中斷源的處理程序,而去處理優(yōu)先級更高的中斷請求;待處理完畢后,再回到原來的低優(yōu)先級中斷處理程序,這個過程稱為中斷嵌套。
(3)中斷響應(yīng)。當(dāng)把最緊急的事件發(fā)送給CPU后,CPU將自動保護(hù)斷點(diǎn)(即保存下一條將要執(zhí)行的指令的地址,通常是把這個地址送入堆棧)、尋找中斷入口(5個中斷源的處理程序有各自不同的且固定的入口地址)并跳轉(zhuǎn)到該位置。以上工作是由計算機(jī)自動完成的,與編程者無關(guān),但要求編程者將中斷處理程序放在入口地址處,如果沒把中斷程序放在那兒,中斷程序就不能被執(zhí)行。
(4)執(zhí)行中斷處理程序。
(5)中斷返回。完成中斷處理后,就從中斷處返回到主程序斷點(diǎn),繼續(xù)執(zhí)行原來的程序。圖2-14MCS-51單片機(jī)的中斷系統(tǒng)結(jié)構(gòu)
?IE0:外部中斷0的中斷申請標(biāo)志位,由計算機(jī)根據(jù)情況自動置1或清0。
IT0:外部中斷0的觸發(fā)方式控制位,可由軟件進(jìn)行置位和復(fù)位。2)中斷允許寄存器IE(0A8H)
?EA:中斷允許總控制位。EA?=?1,CPU開放中斷;EA?=?0,CPU屏蔽所有的中斷請求。
ES:串行中斷允許位。ES?=?1,允許串口中斷;ES?=?0,禁止串口中斷。
ET1:定時/計數(shù)器T1的中斷允許位。ET1?=?1時,允許T1中斷;ET1?=?0時,禁止T1中斷。
EX1:外部中斷1的中斷允許位。EX1?=?1時,允許外部中斷1中斷;EX1?=?0時,禁止外部中斷1中斷。
ET0:定時/計數(shù)器T0的中斷允許位。ET0?=?1時,允許T0中斷;ET0?=?0時,禁止T0中斷。
EX0:外部中斷0的中斷允許位。EX0?=?1時,允許外部中斷0中斷;EX0?=?0時,禁止外部中斷0中斷。
2.中斷優(yōu)先級控制
MCS-51單片機(jī)的5個中斷源的優(yōu)先級別由中斷優(yōu)先級寄存器IP進(jìn)行設(shè)定。中斷優(yōu)先級寄存器IP(0B8H)的各位含義如下。
?PS:串行中斷的優(yōu)先級設(shè)定位。PS=1時,串口為高級中斷;PS?=?0,串口為低級中斷。
PT1:定時/計數(shù)器T1的中斷優(yōu)先級設(shè)定位。PT1?=?1時,T1為高級中斷;PT1?=?0時,T1為低級中斷。
PX1:外部中斷1的中斷優(yōu)先級設(shè)定位。PX1?=?1時,外部中斷1為高級中斷;PX1?=?0時,外部中斷1為低級中斷。
PT0:定時/計數(shù)器T0的中斷優(yōu)先級設(shè)定位。PT0?=?1時,T0為高級中斷;PT0?=?0時,T0為低級中斷。
PX0:外部中斷0的中斷優(yōu)先級設(shè)定位。PX0?=?1時,外部中斷0為高級中斷;PX0?=?0時,外部中斷0為低級中斷。
如果有多個中斷源同時向CPU提出中斷申請,則按照IP的設(shè)定,CPU先響應(yīng)高級中斷,再響應(yīng)低級中斷;如有幾個同優(yōu)先級的中斷源同時向CPU提出中斷申請,則按照自然優(yōu)先級的順序進(jìn)行響應(yīng)。自然優(yōu)先級的順序?yàn)椋和獠恐袛?(級別最高)→定時/計數(shù)器T0→外部中斷1→定時/計數(shù)器T1→串口中斷(級別最低)。
3.中斷響應(yīng)
MCS-51單片機(jī)工作時,CPU在每個機(jī)器周期中都會去查詢一下各個中斷標(biāo)記,看它們是否是“1”,如果是1,就說明有中斷請求了,之后按照優(yōu)先級的順序進(jìn)行中斷處理。但是當(dāng)出現(xiàn)下列情況之一時,中斷申請將被暫時封鎖。
(1)?CPU正在處理一個同級或更高級別的中斷請求。
(2)現(xiàn)行的機(jī)器周期不是當(dāng)前正在執(zhí)行指令的最后一個周期,即要保證把當(dāng)前的指令執(zhí)行完才能響應(yīng)中斷。
(3)若當(dāng)前正在執(zhí)行的指令是返回指令(RETI)或訪問IP、IE寄存器的指令,則CPU執(zhí)行該指令后至少再執(zhí)行一條指令才響應(yīng)中斷。如果正在訪問IP、IE,則可能會開、關(guān)中斷或改變中斷的優(yōu)先級,而中斷返回指令則說明本次中斷還沒有處理完,所以都要等本指令處理結(jié)束再執(zhí)行一條指令才可以響應(yīng)中斷。中斷響應(yīng)的過程如下:
(1)?CPU響應(yīng)中斷時,首先設(shè)置優(yōu)先級狀態(tài)觸發(fā)器,封鎖同級中斷與低級中斷,同時中斷標(biāo)志位自動清0,如邊沿觸發(fā)方式下的外部中斷標(biāo)志IE0、IE1和定時器溢出標(biāo)志TF0、TF1。但是串口的接收發(fā)送中斷標(biāo)志TI、RI只能由用戶在中斷程序中用指令清0。電平觸發(fā)方式下的外部中斷標(biāo)志IE0、IE1是根據(jù)、引腳的電平變化而變化的,CPU無法直接干預(yù),因此需在引腳外加硬件(如D觸發(fā)器)使其自動撤銷外部中斷。
(2)將當(dāng)前程序計數(shù)器PC的內(nèi)容(即斷點(diǎn)位置指令的地址)壓入堆棧,然后將相應(yīng)的中斷入口地址送入PC,使程序跳轉(zhuǎn)到中斷入口處繼續(xù)執(zhí)行。中斷程序的入口地址如表2-13所示。
4.中斷處理
中斷響應(yīng)后,CPU將轉(zhuǎn)入中斷處理程序繼續(xù)工作。中斷處理程序的流程圖見圖2-15。
編寫中斷服務(wù)程序時應(yīng)注意以下幾點(diǎn):
(1)中斷服務(wù)程序必須定位在該中斷源對應(yīng)的入口地址上,或者可以在中斷入口地址單元內(nèi)放入一條無條件轉(zhuǎn)移指令使CPU跳轉(zhuǎn)到中斷服務(wù)程序處(此時中斷服務(wù)程序可靈活地安排在64KB的程序存儲器的任意位置)。
(2)在中斷服務(wù)程序中,要注意使用軟件保護(hù)現(xiàn)場,以免中斷返回后,原寄存器、累加器中的信息已經(jīng)丟失。
(3)要在執(zhí)行當(dāng)前中斷程序時禁止更高優(yōu)先級中斷,可以先用軟件關(guān)閉CPU中斷或禁止某中斷源的中斷,在中斷返回前再開放中斷。圖2-15中斷程序的一般結(jié)構(gòu)
5.中斷返回
在中斷服務(wù)程序的最后一行,應(yīng)寫上中斷返回指令RETI。執(zhí)行該指令時,將首先清除優(yōu)先級狀態(tài)觸發(fā)器,開放同級與低級中斷,然后從堆棧中取出斷點(diǎn)地址送給PC,最終讓CPU跳回到主程序斷點(diǎn)位置繼續(xù)運(yùn)行。
6.中斷舉例
例3
某汽車電子控制系統(tǒng)中,當(dāng)冷卻水溫過高、過低或燃油液面高度過低、潤滑油油壓過低以及倒車時均要報警,其具體要求如下:
①當(dāng)水溫過高時,應(yīng)啟動冷卻風(fēng)扇,點(diǎn)亮水溫報警燈;
②當(dāng)水溫過低時,風(fēng)扇停轉(zhuǎn),水溫報警燈熄滅;
③當(dāng)燃油液面高度過低時,點(diǎn)亮燃油報警燈;
④當(dāng)潤滑油油壓過低時,報警喇叭鳴叫,油壓過低報警燈點(diǎn)亮,且該報警優(yōu)先級最高;
⑤當(dāng)?shù)管嚂r,倒車指示燈點(diǎn)亮。圖2-16汽車電子控制報警系統(tǒng)程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
SETB P1.3 ;油壓過低報警
SETB P1.4
RETI
ORG 0013H
LJMP INT
ORG 0100H ;主程序
MAIN: MOV P1,#0 ;令所有報警燈熄滅
CLR IT0 ;中斷初始化
CLR IT1
MOV IE,#10000101B
SETB PX0
;省略電子控制系統(tǒng)的其他功能部分
INT: MOV P0,#0FFH ;輸入腳鎖存器置1
MOV C,P0.3 ;倒車報警
CPL C
MOV P1.2,C
MOV C,P0.2 ;燃油報警
CPL C
MOV P1.1,C
JNB P0.0,TEM_HIGH ;判斷水溫是否過高
JNB P0.1,TEM_LOW ;判斷水溫是否過低
RETI…TEM_HIGH:SETB P1.0 ;水溫過高報警
SETB P1.5
RETI
TEM_LOW:CLR P1.0 ;水溫過低報警
CLR P1.5
RETI
END 2.6定時/計數(shù)器
1.定時/計數(shù)器的結(jié)構(gòu)及工作原理
MCS-51單片機(jī)中的兩個定時/計數(shù)器的結(jié)構(gòu)功能類似,下面以T0為例說明定時/計數(shù)器的結(jié)構(gòu)及工作原理。T0的結(jié)構(gòu)如圖2-17所示。圖2-17方式0、方式1下定時/計數(shù)器T0的結(jié)構(gòu)示意圖定時/計數(shù)器T0(T1)的核心部件為16位的、可預(yù)置初值的加1計數(shù)器,它實(shí)際上由兩個獨(dú)立的RAM單元TH0、TL0(TH1、TL1)組成。工作之前,需由用戶對其預(yù)置一個初值,工作時在脈沖觸發(fā)下將會自動加1計數(shù)。當(dāng)計數(shù)器加滿溢出時,其值突變?yōu)?,其溢出信號會使其中斷標(biāo)志位TF0(TF1)置1,從而向CPU提出中斷申請。
注意:不同的工作方式下加1計數(shù)器的工作長度不同。
1)計數(shù)功能
圖中,當(dāng)C/T=1時,計數(shù)器與單片機(jī)的引腳T0即P3.4(T1即P3.5)接通,計數(shù)器對T0(T1)引腳輸入的脈沖信號進(jìn)行計數(shù)(下降沿觸發(fā)),即定時器/計數(shù)器以計數(shù)方式工作。
當(dāng)工作在計數(shù)方式下時,CPU在每個機(jī)器周期會檢測一次輸入引腳。為確保外來信號被檢測到,要求輸入脈沖的高、低電平狀態(tài)各要維持一個機(jī)器周期以上的時間。
2)定時功能
圖中,當(dāng)C/T=0時,計數(shù)器的計數(shù)脈沖來自于單片機(jī)內(nèi)部。每經(jīng)過1個機(jī)器周期,計數(shù)器加1,這樣就可以根據(jù)計數(shù)器中設(shè)置的初值計算出定時時間。
2.定時/計數(shù)器的控制
定時/計數(shù)器的功能以及工作方式是由TCON及TMOD控制的。
1)定時器的方式控制寄存器TMOD(89H)圖2-19方式2下的T0結(jié)構(gòu)
2)定時器的控制寄存器TCON(88H)
3)定時器的初始化步驟
(1)根據(jù)控制要求設(shè)定TMOD,確定定時/計數(shù)器的功能、工作方式、啟動方式。
(2)根據(jù)選定的工作方式與控制要求,計算加1計數(shù)器的初值。定時條件下,加1計數(shù)器的初值計算式為其中,n取決于工作方式。方式0時,n?=?13;方式1時,n?=?16;方式2時,n?=?8。t為定時時間。
(3)在中斷處理方式下,對定時/計數(shù)器開放中斷,并設(shè)置優(yōu)先級別。
(4)啟動定時器工作。
3.應(yīng)用舉例
例4
設(shè)單片機(jī)的晶振頻率fosc為6MHz,使用T0產(chǎn)生周期為2ms的方波,由P1.0輸出。試分別用方式0(查詢方式)和方式1(中斷方式)來實(shí)現(xiàn)。
解
(1)方式0—查詢方式。
要產(chǎn)生1ms的方波,只需在P1.0腳交替輸出寬度為1ms的高、低電平即可。
定時器的初始化過程如下:
①設(shè)置TMOD。因?yàn)門0的工作方式為方式0,功能為定時,并由軟件啟動,所以
TMOD?=?00000000B。②計算初值。晶振頻率fosc為6MHz,則取計算出的初值的低5位送入TL0的低5位,其余送入TH0,則③令TR0?=?1,啟動工作。
參考程序如下:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV TMOD,#00H ;設(shè)置T0為定時功能、工作方式0
MOV TL0,#0CH ;設(shè)置初值
MOV TH0,#0F0H
SETB TR0 ;啟動定時器
LOOP: JNB TF0,LOOP ;查詢是否溢出
CPL P1.0 ;輸出取反
MOV TL0,#0CH ;重新設(shè)置計數(shù)初值
MOV TH0,#0F0H
CLR TF0 ;清除溢出標(biāo)志
LJMP LOOP
END
(2)方式1—中斷方式。
定時器的初始化過程如下:
①設(shè)置TMOD。因?yàn)門0的工作方式為方式1,功能為定時,且由軟件啟動,所以TMOD?=?00000001B。②計算初值。則③開放中斷,即EA=1,ET0=1。
④啟動工作,即令TR0?=?1。
參考程序如下:
ORG 0000H
LJMP MAIN
ORG 000BH
CPL P1.0 ;中斷處理程序
MOV TL0,#0CH ;重新設(shè)置計數(shù)初值
MOV TH0,#0F0H
RETI
ORG 0100H
MAIN: MOV TMOD,#01H ;設(shè)置T0為定時功能、工作方式1
MOV TL0,#0CH ;設(shè)置初值
MOV TH0,#0FEH
SETB EA ;開放中斷
SETB ET0
SETB TR0 ;啟動定時器
LJMP $
END
例5
利用定時器測定外部脈沖的頻率。設(shè)被測脈沖的頻率在10kHz~100kHz之間。系統(tǒng)的晶振頻率fosc為6MHz。檢測結(jié)果存入片內(nèi)RAM的20H單元。
解將被測脈沖送至單片機(jī)的T0引腳,由T0進(jìn)行計數(shù),其工作方式為方式1,并進(jìn)行查詢處理。而T1選擇為定時功能,定時時間為1ms,工作方式為方式1,并執(zhí)行中斷處理。
參考程序:
ORG 0000H
LJMP MAIN
ORG 001BH
CLR TR0
MOV IE,#0
MOV 20H,TL0;將頻率(單位為kHz)存入緩沖單元20H單元
RETI
ORG 0100H
MAIN: MOV TMOD,#00010101B ;T0為計數(shù)方式1,T1為定時方式1
MOV TL1,#0CH ;fosc?=?6?MHz,定時1?ms
MOV TH1,#0FEH
MOV TL0,#0
MOV IE,#10001000B ;開放T1中斷
MOV TCON,#01010000B ;啟動T0、T1工作
LJMP $
END 2.7串行接口
1.串行通信與并行通信
計算機(jī)與外界的信息交換稱為通信。常用通信方式有兩種:并行通信與串行通信,見圖2-20。圖2-20串行通信與并行通信并行通信的傳送速度快、效率高,但傳送多少數(shù)據(jù)位就需要多少根數(shù)據(jù)線,故成本高,適合于近距離通信;串行通信是逐位按順序傳送,最少僅需要一根傳輸線即可完成,成本低、速度慢,適合于遠(yuǎn)距離傳送。
MCS-51單片機(jī)中有一個全雙工的異步通信接口,可以同時完成數(shù)據(jù)的串行發(fā)送與串行接收,其數(shù)據(jù)傳輸格式見圖2-21。圖2-21異步通信格式
MCS-51
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 美團(tuán)HRBP面試攻略與題庫精 編
- 大學(xué)秋季田徑運(yùn)動會策劃方案
- 大學(xué)生軍訓(xùn)動員大會發(fā)言稿
- 大學(xué)畢業(yè)生求職面試技巧
- 培訓(xùn)師年終個人工作總結(jié)
- 小兒腸炎伴脫水課件
- 餐飲加盟賠錢轉(zhuǎn)讓合同范本
- 出租車租賃合同補(bǔ)充協(xié)議
- 國際物流客戶托運(yùn)合同范本
- 蚊香品牌代理加盟合同范本
- GB/T 21837-2023鐵磁性鋼絲繩電磁檢測方法
- 15D500-15D505 防雷與接地圖集(合訂本)
- 帶狀皰疹護(hù)理查房
- SX-22163-QR345工裝維護(hù)保養(yǎng)記錄
- 中國重癥加強(qiáng)治療病房建設(shè)與管理指南
- MBA培訓(xùn)進(jìn)修協(xié)議
- p型半導(dǎo)體和n型半導(dǎo)體課件
- LY/T 2501-2015野生動物及其產(chǎn)品的物種鑒定規(guī)范
- GB/T 748-2005抗硫酸鹽硅酸鹽水泥
- GB 15763.1-2001建筑用安全玻璃防火玻璃
- 民間文學(xué)(全套課件)
評論
0/150
提交評論