




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(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í)/計(jì)數(shù)器2.7串行接口2.8模擬通道接口單片機(jī)具有功能強(qiáng)、體積小、本錢低、功耗小、配置靈活等特點(diǎn)。以單片機(jī)為核心構(gòu)成的控制系統(tǒng),本錢低廉且能夠適應(yīng)各種現(xiàn)場環(huán)境,具有實(shí)時(shí)、快速的外部響應(yīng),因而被廣泛應(yīng)用在工業(yè)控制、智能化儀器儀表、通信、家電、汽車等領(lǐng)域中。事實(shí)上,單片機(jī)是世界上數(shù)量最多的計(jì)算機(jī)?,F(xiàn)代人類生活中,幾乎所用的每件電子和機(jī)械產(chǎn)品中都會(huì)集成有單片機(jī)。、家用電器、電子玩具、掌上電腦以及鼠標(biāo)等電腦配件中會(huì)有1~2部單片機(jī);汽車上一般會(huì)配備40多部單片機(jī);復(fù)雜的工業(yè)控制系統(tǒng)上甚至可能會(huì)有數(shù)百臺(tái)單片機(jī)同時(shí)工作。2.1.2單片機(jī)的產(chǎn)品分類
根據(jù)應(yīng)用范圍的不同,單片機(jī)可分為通用型單片機(jī)和專用型單片機(jī)兩種。
1.通用型單片機(jī)
通用型單片機(jī)是由單片機(jī)廠家生產(chǎn)的、供廣闊用戶選擇使用的、具有根本功能的芯片,其性能全面、適應(yīng)性強(qiáng)、能夠滿足多種控制的需要。但使用時(shí)用戶必須進(jìn)行二次開發(fā)設(shè)計(jì),即根據(jù)需要以通用單片機(jī)為核心配以其他外圍電路、芯片,從而構(gòu)成控制系統(tǒng),同時(shí)還需要編寫控制程序。2.專用型單片機(jī)
專用型單片機(jī)是專門針對(duì)某一類產(chǎn)品甚至是某一個(gè)產(chǎn)品而設(shè)計(jì)制造的單片機(jī)。此類型的單片機(jī)即不需要進(jìn)行二次設(shè)計(jì),也不用進(jìn)行功能開發(fā),一般由廠家與芯片制造商合作生產(chǎn)設(shè)計(jì)。例如全自動(dòng)洗衣機(jī)、來電顯示上的單片機(jī)都是專用型單片機(jī)。專用型單片機(jī)通用性差,但由于是專門針對(duì)某一控制系統(tǒng)設(shè)計(jì)的,因此其結(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ā)動(dòng)機(jī)的功能越來越完善,其控制系統(tǒng)也越來越復(fù)雜??刂葡到y(tǒng)需要不斷地采集各個(gè)傳感器的信息,并按照預(yù)定的程序進(jìn)行實(shí)時(shí)計(jì)算,所以對(duì)單片機(jī)的運(yùn)算速度、數(shù)據(jù)字長、與外部設(shè)備的接口等方面不斷提出新的要求。目前,發(fā)動(dòng)機(jī)控制系統(tǒng)內(nèi)單片機(jī)的總線頻率已經(jīng)提高到幾十兆赫,機(jī)型多為16位機(jī)或32位機(jī)。Motorola公司生產(chǎn)的MC68HC912DG128A單片機(jī)就被德爾福等汽車電子企業(yè)選用在自己的電控單元的產(chǎn)品中。 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能同時(shí)處理8位二進(jìn)制數(shù)或代碼,故稱為8位機(jī)。
(2)?256個(gè)字節(jié)的內(nèi)部RAM(包括21個(gè)SFR)。RAM主要用于存儲(chǔ)可讀寫的數(shù)據(jù),因此又稱為數(shù)據(jù)存儲(chǔ)器。
(3)內(nèi)部ROM。由于ROM通常用于存放程序、原始數(shù)據(jù)、表格等,所以又稱為程序存儲(chǔ)器。8051的內(nèi)部有4K字節(jié)的掩膜ROM和4K字節(jié)的EPROM,而8031無片內(nèi)ROM。(4)?2個(gè)可編程的16位定時(shí)/計(jì)數(shù)器T0、T1,用于對(duì)外部脈沖進(jìn)行計(jì)數(shù),也可用來實(shí)現(xiàn)定時(shí)操作。
(5)?4個(gè)8位的并行I/O口P0、P1、P2、P3,可用來實(shí)現(xiàn)數(shù)據(jù)的并行輸入與輸出。
(6)?1個(gè)全雙工異步串行接口,可用來實(shí)現(xiàn)單片機(jī)與其他設(shè)備之間的串行數(shù)據(jù)通信。該串行口功能較強(qiáng),既可作為全雙工異步通信收發(fā)器使用,也可作為同步移位器使用。
(7)?5個(gè)中斷源,包括3個(gè)內(nèi)部中斷與2個(gè)外部中斷,可通過編程將其設(shè)置為兩個(gè)優(yōu)先級(jí)別。
(8)內(nèi)部時(shí)鐘電路,用于產(chǎn)生CPU正常工作所需的時(shí)鐘信號(hào)。其中,石英晶體振蕩器和微調(diào)電容需外接。圖2-1MCS-51單片機(jī)的內(nèi)部根本結(jié)構(gòu)2.2.2MCS-51單片機(jī)的存儲(chǔ)器
1.存儲(chǔ)器概述
存儲(chǔ)器是計(jì)算機(jī)中不可缺少的重要部件,用于儲(chǔ)存二進(jìn)制信息。下面介紹一些有關(guān)存儲(chǔ)器的根本概念。
(1)位:信息的根本單位是位(bit或b),表示一個(gè)二進(jìn)制信息“1〞或“0〞。
(2)字節(jié):在微型機(jī)中信息大多是以字節(jié)(Byte或B)形式存放的,一個(gè)字節(jié)由8個(gè)位組成(1Byte?=?8bit),通常稱作一個(gè)存儲(chǔ)單元。
(3)存儲(chǔ)容量:存儲(chǔ)器芯片的存儲(chǔ)容量是指一片芯片所能存儲(chǔ)的信息位數(shù),例如8K?×?8位的芯片,其存儲(chǔ)容量為8?×?1024?×?8位?=?65?536位信息。(4)地址:地址表示存儲(chǔ)單元所處的物理空間的位置,用一組二進(jìn)制代碼來表示。地址相當(dāng)于存儲(chǔ)單元的“單元編號(hào)〞。CPU可以通過地址碼訪問某一存儲(chǔ)單元,一個(gè)存儲(chǔ)單元對(duì)應(yīng)一個(gè)地址碼。例如8051單片機(jī)有16位地址線,能訪問的外部存儲(chǔ)器的最大地址空間為64K(65536)字節(jié),對(duì)應(yīng)的16位地址碼為0000H~FFFFH。
(5)存取周期:是指存儲(chǔ)器存放或取出一次數(shù)據(jù)所需的時(shí)間。存儲(chǔ)容量和存取周期是存儲(chǔ)器的兩項(xiàng)重要性能指標(biāo)。2.半導(dǎo)體存儲(chǔ)器的分類
半導(dǎo)體存儲(chǔ)器按讀、寫功能可以分為隨機(jī)讀/寫存儲(chǔ)器RAM(RandomAccessMemory)和只讀存儲(chǔ)器ROM(ReadOnlyMemory)。
RAM可以進(jìn)行屢次信息寫入和讀出,每次寫入后,原來的信息將被新寫入的信息所取代。另外,RAM在斷電后再通電時(shí),原存的信息會(huì)全部喪失,所以它主要用來存放臨時(shí)數(shù)據(jù)。
ROM的信息一旦寫入后,便不能隨機(jī)修改。在使用ROM時(shí),只能讀出信息,而不能寫入,且在掉電后ROM中的信息仍然保存,所以它主要用來存放固定不變的程序和數(shù)據(jù)。ROM按生產(chǎn)工藝又可以分為以下幾種:(1)掩膜ROM:其存儲(chǔ)的信息在制造過程中采用一道掩膜工藝生成,一旦出廠,信息就不可改變。
(2)可編程只讀存儲(chǔ)器PROM:其存儲(chǔ)的信息可由用戶通過特殊手段一次性寫入,但只能寫入一次。
(3)可擦除只讀存儲(chǔ)器:用戶可以屢次擦除其存儲(chǔ)的信息,并可用專用的編程器重新寫入新的信息。可擦除只讀存儲(chǔ)器又可分為紫外線擦除的EPROM、電擦除的EEPROM和FlashROM。3.?8051的內(nèi)部數(shù)據(jù)存儲(chǔ)器
8051的內(nèi)部RAM有256個(gè)單元,通常在空間上分為兩個(gè)區(qū):低128個(gè)單元(地址為00H~7FH)的內(nèi)部數(shù)據(jù)RAM塊和高128個(gè)單元(地址為80H~0FFH)的專用存放器SFR塊,見圖2-2。圖2-28051內(nèi)部的RAM配置(1)工作存放器區(qū)(00H~1FH)。工作存放器區(qū)也稱為通用存放器,該區(qū)域共有4組存放器,每組由8個(gè)存放單元組成,各組均以R0~R7作存放器編號(hào)。在任一時(shí)刻,CPU只能使用其中的一組通用存放器,稱為當(dāng)前通用存放器組,具體使用哪組可由程序狀態(tài)存放器PSW中RS1、RS0位決定,見表2-1。通用存放器為CPU提供了就近存取數(shù)據(jù)的便利,提高了工作速度,也為編程提供了方便。(2)位尋址區(qū)(20H~2FH)。內(nèi)部RAM的20H~2FH地址段,共16個(gè)單元(計(jì)16?×?8?=?128位)為位尋址區(qū),位地址為00H~7FH,見表2-2。既可將位尋址區(qū)作為一般的RAM區(qū)進(jìn)行字節(jié)操作,也可對(duì)單元的每一位進(jìn)行位操作。(3)用戶RAM區(qū)(30H~7FH)。單元地址為30H~7FH的80個(gè)單元為用戶RAM區(qū),在一般應(yīng)用中把堆棧設(shè)置在該區(qū)域中。
(4)專用存放器區(qū)(80H~0FFH)。內(nèi)部RAM的高128單元中分散有21個(gè)專用存放器。表2-3為21個(gè)專用存放器一覽表。下面介紹幾個(gè)常用的專用存放器。
①累加器A(Accumulator)。累加器是最常用的一個(gè)8位專用存放器,是運(yùn)算器的重要組成局部,大多數(shù)運(yùn)算操作都有它的參與。其既可存放操作數(shù),又可存放運(yùn)算結(jié)果。
②存放器B。存放器B是8位存放器,主要用于乘、除運(yùn)算,同時(shí)也可作為一般的存放器使用。
③程序狀態(tài)字PSW(ProgramStatusWord)。程序狀態(tài)字是8位存放器,用于指示程序的運(yùn)行狀態(tài)信息。其中有些位是根據(jù)程序執(zhí)行結(jié)果由硬件自動(dòng)設(shè)置的,而有些位可由用戶通過指令來設(shè)定。PSW中各標(biāo)志位的名稱及定義如下:?CY—進(jìn)(借)位標(biāo)志位。在加減運(yùn)算中,假設(shè)操作結(jié)果的最高位有進(jìn)位或有借位時(shí),CY由硬件自動(dòng)置1,否那么清0。在位操作中,CY作為位累加器使用。
?AC—輔助進(jìn)(借)位標(biāo)志位。在加減運(yùn)算中,當(dāng)?shù)退奈幌蚋咚奈划a(chǎn)生進(jìn)位或借位時(shí),此標(biāo)志位由硬件自動(dòng)置1,否那么清0。
?F0—用戶標(biāo)志位。由用戶通過軟件設(shè)定,用以控制程序轉(zhuǎn)向。
?RS1、RS0—存放器組選擇位。用于設(shè)定當(dāng)前通用存放器組的組號(hào),具體組號(hào)見表2-1。?OV—溢出標(biāo)志位。在有符號(hào)數(shù)(補(bǔ)碼數(shù))的加減運(yùn)算中,假設(shè)OV?=?1,表示加減運(yùn)算的結(jié)果超出了累加器A的八位有符號(hào)數(shù)的表示范圍(-128~+127),產(chǎn)生溢出,因此運(yùn)算結(jié)果是錯(cuò)誤的。假設(shè)OV?=?0,表示結(jié)果未超出累加器A的符號(hào)數(shù)的表示范圍,運(yùn)算結(jié)果正確。
乘法運(yùn)算時(shí),假設(shè)OV?=?1,表示結(jié)果大于255,結(jié)果分別存在累加器A、存放器B中。假設(shè)OV?=?0,表示結(jié)果未超出255,結(jié)果只存在累加器A中。除法運(yùn)算時(shí),假設(shè)OV?=?1,表示除數(shù)為0。OV?=?0,表示除數(shù)不為0。?P—奇偶標(biāo)志位,表示累加器A中1的個(gè)數(shù)的奇偶性。在每個(gè)指令周期由硬件根據(jù)累加器A的內(nèi)容的奇偶性對(duì)P自動(dòng)置位或復(fù)位。P?=?1,表示累加器A中的內(nèi)容有奇數(shù)個(gè)1。
④數(shù)據(jù)指針DPTR(DataPointer)。數(shù)據(jù)指針DPTR是唯一的一個(gè)供用戶使用的16位存放器,它由兩個(gè)8位存放器DPH與DPL組成。DPTR通常在訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)作為地址指針使用,尋址范圍為64KB。
⑤堆棧指針SP(StackPointer)。程序運(yùn)行時(shí)需要一個(gè)連續(xù)的RAM塊作為數(shù)據(jù)緩沖區(qū),以暫時(shí)存放程序運(yùn)行過程中的一些重要數(shù)據(jù),此RAM塊稱為堆棧。堆棧的主要功用是保護(hù)斷點(diǎn)和保護(hù)現(xiàn)場。因?yàn)橛?jì)算機(jī)無論執(zhí)行的是中斷程序還是子程序,最終都要返回主程序。在轉(zhuǎn)去執(zhí)行中斷程序或子程序時(shí),要把主程序的斷點(diǎn)保護(hù)起來,以便能正確的返回。同時(shí),也要將中斷程序或子程序可能要用到的存放器中的內(nèi)容保護(hù)起來,即保護(hù)現(xiàn)場。
堆棧指針SP用于指示棧頂單元地址,是一個(gè)8位存放器。當(dāng)系統(tǒng)復(fù)位后,SP的內(nèi)容為07H。
堆棧的最大特點(diǎn)是按“后進(jìn)先出〞的數(shù)據(jù)操作原那么執(zhí)行。MCS-51系列單片機(jī)的堆棧是向上生長型,即數(shù)據(jù)進(jìn)棧時(shí),SP的內(nèi)容先自動(dòng)加1后再向棧區(qū)寫入數(shù)據(jù);數(shù)據(jù)出棧時(shí),SP所指示的棧區(qū)數(shù)據(jù)先彈出,然后SP的內(nèi)容再自動(dòng)減1。4.?8051的內(nèi)部程序存儲(chǔ)器
在介紹8051的內(nèi)部程序存儲(chǔ)器前,先介紹一個(gè)重要的專用存放器——程序計(jì)數(shù)器PC。
PC(ProgramCounter)為一個(gè)16位的計(jì)數(shù)器,其存儲(chǔ)的內(nèi)容為單片機(jī)將要執(zhí)行的指令機(jī)器碼所在的存儲(chǔ)單元的地址。PC具有自動(dòng)加1的功能,即CPU以PC的當(dāng)前值為地址從ROM中讀取一個(gè)字節(jié)指令后,PC自動(dòng)加1,以指向下一個(gè)ROM單元,當(dāng)CPU再次以PC的當(dāng)前值為地址進(jìn)行指令讀取時(shí),讀到的就是下一個(gè)ROM單元的內(nèi)容,這樣就實(shí)現(xiàn)了程序的自動(dòng)按順序執(zhí)行。由于PC是不可尋址的,因此用戶無法對(duì)它直接進(jìn)行讀寫操作,但可以通過轉(zhuǎn)移、調(diào)用、返回等指令改變其內(nèi)容,以實(shí)現(xiàn)程序的轉(zhuǎn)移。復(fù)位后,PC=0000H。程序存儲(chǔ)器主要用于存放程序及重要的數(shù)據(jù)。大多數(shù)51系列單片機(jī)的內(nèi)部都配置有一定數(shù)量的程序存儲(chǔ)器ROM,如8051芯片內(nèi)有4KB的掩膜ROM存儲(chǔ)單元,AT89C51芯片內(nèi)部配置了4KB的FlashROM,它們的地址范圍均為0000H~0FFFH。內(nèi)部程序存儲(chǔ)器內(nèi)有如下一些特殊單元,使用時(shí)要注意。
?0000H單元:系統(tǒng)復(fù)位后,PC?=?0000H,即單片機(jī)從0000H單元開始執(zhí)行程序。如果主程序不是從0000H單元開始存放,就必須在0000H~0002H單元中存放一條無條件轉(zhuǎn)移指令,以便轉(zhuǎn)去執(zhí)行指定的應(yīng)用程序。?0003H單元:外部中斷0的中斷程序入口地址。
?000BH單元:定時(shí)器/計(jì)數(shù)器0的中斷程序入口地址。
?0013H單元:外部中斷1的中斷程序入口地址。
?001BH單元:定時(shí)器/計(jì)數(shù)器1的中斷程序入口地址。
?0023H單元:串行中斷程序入口地址。
在中斷程序入口地址單元中應(yīng)存放相應(yīng)的中斷效勞程序,但8個(gè)單元通常難以存下一個(gè)完整的中斷效勞程序,因此往往需要在中斷程序入口地址單元中存放一條無條件轉(zhuǎn)移指令,以便轉(zhuǎn)到中斷效勞程序真正的入口地址。對(duì)程序存儲(chǔ)器的操作作以下說明:
(1)程序指令的自主操作。CPU按照PC指針自動(dòng)地從程序存儲(chǔ)器中取出指令。
(2)用戶使用指令對(duì)程序存儲(chǔ)器中的常數(shù)表格進(jìn)行讀操作。此操作可用MOVC指令實(shí)現(xiàn)。圖2-3MCS-51單片機(jī)的引腳圖5.?8051的外部存儲(chǔ)器
因8051的內(nèi)部程序計(jì)數(shù)器PC為16位計(jì)數(shù)器,同時(shí)8051共有16根地址線引腳,因此在8051單片機(jī)的外部可以分別擴(kuò)展64KB的ROM與64KB的RAM。2.2.3MCS-51單片機(jī)的引腳功能介紹
MCS-51單片機(jī)的引腳圖見圖2-3。下面對(duì)各引腳的作用進(jìn)行介紹。
1.主電源引腳VCC和VSS
VCC為電源輸入端,正常操作時(shí)接?+5V電源;VSS為接地線。2.時(shí)鐘振蕩電路引腳XTAL1、XTAL2
XTAL1和XTAL2分別用作晶體振蕩電路的反相器輸入端和輸出端。MCS-51單片機(jī)的時(shí)鐘電路見圖2-4。圖2-4(a)中采用了芯片內(nèi)部的一個(gè)高增益反向放大器、芯片外連的晶體振蕩器和微調(diào)電容構(gòu)成一個(gè)穩(wěn)定的自激振蕩器,這就是單片機(jī)的內(nèi)部時(shí)鐘電路。時(shí)鐘電路產(chǎn)生的振蕩脈沖經(jīng)過二分頻以后,才成為單片機(jī)的時(shí)鐘信號(hào)。晶振的頻率fosc通常在6MHz~12MHz之間選擇。1個(gè)機(jī)器周期=12個(gè)振蕩周期?=12/fosc。圖2-4MCS-51單片機(jī)的時(shí)鐘電路4.控制類引腳
(1)?RST/VPD(9腳)。RST為復(fù)位信號(hào)輸入端。復(fù)位是單片機(jī)系統(tǒng)的初始化操作,在該引腳上輸入持續(xù)2個(gè)機(jī)器周期以上的高電平時(shí),單片機(jī)系統(tǒng)復(fù)位。系統(tǒng)復(fù)位后對(duì)專用存放器的影響情況見表2-3。同時(shí),復(fù)位操作還對(duì)單片機(jī)的個(gè)別引腳信號(hào)有影響,如把ALE和PSEN信號(hào)變?yōu)闊o效狀態(tài),即ALE=1,PSEN=1。復(fù)位操作對(duì)內(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ī)工作的命令。一臺(tái)計(jì)算機(jī)能執(zhí)行的全部指令稱為該計(jì)算機(jī)的指令系統(tǒng)。指令系統(tǒng)全面描述了CPU的功能。指令系統(tǒng)是由生產(chǎn)廠家確定的,不同的CPU有不同的指令系統(tǒng)。編程語言是人機(jī)對(duì)話的工具,按使用層次可分為機(jī)器語言、匯編語言和高級(jí)語言。機(jī)器語言(二進(jìn)制代碼)能直接被機(jī)器識(shí)別,用其編寫的程序運(yùn)行效率高,但編程效率低,不便于閱讀、書寫和交流。引入助記符將機(jī)器語言符號(hào)化后就成為匯編語言,其指令直觀易懂。用匯編語言編寫的程序稱為匯編語言程序。匯編語言程序必須經(jīng)過匯編(機(jī)器匯編或手工匯編)成為機(jī)器語言后才能被機(jī)器執(zhí)行。
例如將累加器A中的數(shù)據(jù)加9的指令,機(jī)器語言為0010010000001001B,而匯編指令為ADDA,#09H。
高級(jí)語言的編程效率高,但編寫出的程序運(yùn)行效率低。2.3.2匯編語言的語句格式
匯編語言程序由一系列語句組成,一行為一個(gè)語句。匯編語言的語句格式如下:
[標(biāo)號(hào):]操作碼助記符[操作數(shù)][;注釋]
1.標(biāo)號(hào)
標(biāo)號(hào)表示該指令代碼第一字節(jié)的地址,是用戶根據(jù)程序需要(該指令為子程序入口指令或程序轉(zhuǎn)移的目標(biāo)指令)而設(shè)定的符號(hào)地址。標(biāo)號(hào)由英文字母、數(shù)字或下劃線組成,但必須以英文字母開頭,以“:〞結(jié)束,一般包含1~8個(gè)字符。不能使用匯編語言中已經(jīng)定義的符號(hào)(如助記符、存放器符號(hào)等)作標(biāo)號(hào),一個(gè)標(biāo)號(hào)在同一程序中只能定義一次。2.操作碼助記符
操作碼助記符是表示指令操作功能的英文縮寫,是語句的核心局部。每條語句都必須有操作碼。
3.操作數(shù)
操作數(shù)表示指令的操作對(duì)象,其表示形式與尋址方式有關(guān)。一條指令中可以沒有操作數(shù),也可以有多個(gè)操作數(shù),操作數(shù)和操作碼之間以空格分隔,操作數(shù)之間以逗號(hào)分隔。
4.注釋
注釋是編程者為方便程序的理解、交流而書寫的解釋性文字、符號(hào),不屬于語句的功能局部,既不產(chǎn)生代碼,對(duì)匯編過程也不起作用。注釋必須以“;〞開始。2.3.3尋址方式
操作數(shù)是指令的一個(gè)重要組成局部,所謂的尋址方式就是確定操作數(shù)所在的位置(地址)的方法。MSC-51系列單片機(jī)共有七種尋址方式。
1.立即尋址
立即尋址是指在指令中直接給出操作數(shù)的尋址方式。操作數(shù)作為指令的一個(gè)組成局部存放在程序存儲(chǔ)器中。該操作數(shù)稱為立即數(shù)。立即數(shù)前應(yīng)加“#〞標(biāo)記,如下面指令中的“#40H〞:
MOVA,#40H
該指令將立即數(shù)40H送累加器A中。2.直接尋址
直接尋址是在指令中直接給出操作數(shù)地址的尋址方式。這種尋址方式可對(duì)內(nèi)部數(shù)據(jù)存儲(chǔ)器進(jìn)行訪問。如下面指令中的“50H〞:
MOVA,50H
該指令把內(nèi)部RAM中地址為50H的單元(直接尋址)中的內(nèi)容送入累加器A中。3.存放器尋址
存放器尋址是指以指令指定的存放器的內(nèi)容作為操作數(shù)的尋址方式。指定的存放器有工作存放器R0~R7、累加器A、數(shù)據(jù)指針DPTR。如下面指令中的“A、R2〞:
MOVA,R2
該指令是將工作存放器R2的內(nèi)容送給累加器A。4.存放器間接尋址方式
存放器間接尋址是以指令中指定存放器的內(nèi)容作為地址取得操作數(shù)的方法。指定的存放器有R0、R1、DPTR,使用時(shí)存放器前面加“@〞標(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位地址,然后將該地址的程序存儲(chǔ)器ROM單元中的內(nèi)容送給累加器A。假設(shè)指令執(zhí)行前為:(DPTR)?=?1100H,(A)?=?56H,ROM(1156H)?=?80H,那么該指令執(zhí)行后:(A)?=?80H。
基址加變址尋址只能對(duì)程序存儲(chǔ)器進(jìn)行尋址。6.相對(duì)尋址
相對(duì)尋址方式只用于相對(duì)轉(zhuǎn)移指令中。相對(duì)轉(zhuǎn)移指令以當(dāng)前PC的值(即本指令下面一條指令的首字節(jié)地址)與指令中給定的相對(duì)偏移量rel之和作為程序轉(zhuǎn)移的目標(biāo)地址。偏移量rel是8位二進(jìn)制補(bǔ)碼,轉(zhuǎn)移范圍位于當(dāng)前PC值的-128~+127個(gè)字節(jié)單元之間。例如下面的指令:
JZ30H ;當(dāng)(A)?=?0時(shí),那么PC←?(PC)?+?2?+?rel,程序轉(zhuǎn)移
;當(dāng)(A)≠0時(shí),那么PC←?(PC)?+?2,程序按原順序執(zhí)行7.位尋址
位尋址是對(duì)內(nèi)部RAM及專用存放器的可尋址位的內(nèi)容進(jìn)行操作的尋址方式??蛇M(jìn)行位尋址的空間有:
(1)片內(nèi)RAM的20H~2FH,共16個(gè)單元128位,其位地址編碼為00H~7FH。
(2)字節(jié)地址能被8整除的SFR(11個(gè))。對(duì)這些尋址位,可以有以下幾種表示方法:
①直接位地址方式,如:0D5H;
②位名稱方式,如:F0;
③點(diǎn)操作符方式,如PSW.5或0D0H.5;
以上幾種方式指的都是PSW中的第5位。
例如指令:MOVC,07H
該指令屬位操作指令,將內(nèi)部RAM20H單元的D7位(位地址為07H)的內(nèi)容送給位累加器CY。2.3.4指令中符號(hào)的約定
下面對(duì)匯編指令系統(tǒng)中指令的符號(hào)約定進(jìn)行介紹。
?Rn:當(dāng)前選中的工作存放器組的工作存放器,n?=?0~7。
?@Ri:以R0或R1作存放器間接尋址,“@〞為間址符,i?=?0、1??梢栽L問片內(nèi)RAM的低128字節(jié)和片外RAM的低256字節(jié)。
?@DPTR:以數(shù)據(jù)指針DPTR的內(nèi)容為地址的存放器間接尋址,對(duì)外部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í)際編程時(shí)用標(biāo)號(hào)代替此指令。
?addr16:16位地址,長轉(zhuǎn)移(LJMP)及長調(diào)用(LCALL)指令中為轉(zhuǎn)移目標(biāo)地址,轉(zhuǎn)移范圍為64KB。實(shí)際編程時(shí)用標(biāo)號(hào)代替此指令。
?bit:位地址,可以是內(nèi)部RAM中所有的可尋址位。
?rel:用于相對(duì)轉(zhuǎn)移指令中,為8位二進(jìn)制補(bǔ)碼,表示偏移量為?-128~+127字節(jié)。實(shí)際編程時(shí)用標(biāo)號(hào)代替此指令。?#data:8位立即數(shù)?!埃(暈榱⒓磾?shù)的標(biāo)志。
?#data16:16位立即數(shù)。
?/:位操作數(shù)取反操作的前綴,如“/bit〞。
?(X):X中的內(nèi)容。
?((X)):由X間接尋址的單元中的內(nèi)容。
?←:將箭頭右邊的內(nèi)容送到箭頭所指的單元。表2-4中:
(1)?MOV指令。
MOV目的操作數(shù),源操作數(shù)
該指令的功能是把源操作數(shù)所表示的數(shù)據(jù)傳送到目的操作數(shù)指定的單元中,指令執(zhí)行之后源操作數(shù)不發(fā)生改變。
(2)?PUSH、POP指令為堆棧操作指令。PUSH為入棧指令;POP為出棧指令。
(3)?XCH為字節(jié)交換指令,該指令的功能是將累加器A中的值與另一個(gè)操作數(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指令的功能是從程序存儲(chǔ)器中讀取數(shù)據(jù)并送入累加器A,該指令可以訪問片內(nèi)ROM,也可以訪問片外ROM。表2-5中:
(1)?ADD為加法指令,功能是將源操作數(shù)與累加器A中的內(nèi)容相加,結(jié)果存儲(chǔ)在累加器A中。該操作不改變?cè)床僮鲾?shù),但影響PSW中的CY、AC、OV、P,影響如下:
假設(shè)最高位有進(jìn)位,那么CY置1,否那么清0;
假設(shè)低4位向高4位有進(jìn)位,那么AC置1,否那么清0;
假設(shè)第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é)果存儲(chǔ)在累加器A中。該指令對(duì)標(biāo)志位的影響與ADD指令的相同。
(3)?INC為增量指令,功能是將操作數(shù)指示的數(shù)據(jù)加1,結(jié)果仍然存儲(chǔ)在該操作數(shù)指示的單元中。該組指令除“INCA〞指令影響P標(biāo)志位外,不影響任何標(biāo)志位。
(4)?SUBB為帶進(jìn)位減法指令,功能為用累加器A中的數(shù)據(jù)減去源操作數(shù),再減去進(jìn)位CY,差存儲(chǔ)在累加器A中,該組指令影響PSW中的CY、AC、OV、P。
(5)?DEC為減量指令,功能是將操作數(shù)減1,結(jié)果仍然存儲(chǔ)在該操作數(shù)指示的單元中。(6)?MUL為乘法指令,功能是將累加器A與存放器B中的兩個(gè)8位無符號(hào)數(shù)相乘,所得16位乘積存儲(chǔ)在BA存放器對(duì)中。
(7)?DIV為除法指令,功能是用累加器A中的數(shù)據(jù)除以存放器B中的數(shù)據(jù),運(yùn)算后,商存于累加器A中,余數(shù)存于存放器B中。注意,除數(shù)與被除數(shù)都為無符號(hào)數(shù)。
(8)?DA為十進(jìn)制調(diào)整指令,功能是對(duì)累加器A中由上一條加法指令(加數(shù)和被加數(shù)均為壓縮BCD碼)所獲得的結(jié)果進(jìn)行調(diào)整。該指令需緊跟在ADD或ADDC指令后使用。3.邏輯運(yùn)算類指令
表2-6中:
(1)?ANL為邏輯與運(yùn)算法指令,功能是將指令中的兩個(gè)操作數(shù)指示的數(shù)據(jù)按位與運(yùn)算,運(yùn)算結(jié)果存儲(chǔ)在第一個(gè)操作數(shù)指示的單元中。
(2)?ORL為邏輯或運(yùn)算法指令,功能是將指令中的兩個(gè)操作數(shù)指示的數(shù)據(jù)按位或運(yùn)算,運(yùn)算結(jié)果存儲(chǔ)在第一個(gè)操作數(shù)指示的單元中。
(3)?XRL為邏輯異或運(yùn)算法指令,功能是將指令中的兩個(gè)操作數(shù)指示的數(shù)據(jù)按位異或運(yùn)算,運(yùn)算結(jié)果存儲(chǔ)在第一個(gè)操作數(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ù)的值(無符號(hào)數(shù)據(jù))進(jìn)行比較,假設(shè)不相同那么轉(zhuǎn)移(轉(zhuǎn)移的目標(biāo)由第3操作數(shù)指示),假設(shè)相同那么順序執(zhí)行。
(6)?DJNZ為減1不為0轉(zhuǎn)移指令,指令的功能是先將第1操作數(shù)的值減1,之后判斷結(jié)果是否為0,假設(shè)不為0那么轉(zhuǎn)移(轉(zhuǎn)移的目標(biāo)由第2操作數(shù)指示),假設(shè)為0那么順序執(zhí)行。
(7)?LCALL、ACALL指令為子程序調(diào)用指令,RET為子程序返回指令,RETI為中斷返回指令。
(8)?NOP是空操作指令。2.3.6匯編偽指令
1.匯編起始地址偽指令ORG(Origin)
格式:ORGaddr16
功能:規(guī)定目標(biāo)程序段的起始地址。ORG后面的16位地址表示此語句后的程序或數(shù)據(jù)塊在程序存儲(chǔ)器中的起始地址。
例如:
ORG
1000H
START:MOV
A,#32H
上述指令說明:START表示的地址為1000H,MOV指令從1000H存儲(chǔ)單元開始存放數(shù)據(jù)。2.字節(jié)定義偽指令DB(DefineByte)
格式:[標(biāo)號(hào):]DBdata1,data2,data3,…,dataN
功能:從指定的地址單元開始,存入規(guī)定好的8位數(shù)據(jù)表。
例如:
?ORG1000H
TAB1:DB01H,04H,09H,10H
以上偽指令匯編后從1000H單元開始存放4個(gè)字節(jié)的數(shù)據(jù)平方表:(1000H)?=?01H,(1001H)?=?04H,(1002H)?=?09H,(1003H)?=?10H。3.字定義偽指令DW(Defineword)
格式:[標(biāo)號(hào):]
DW
data1,data2,…,dataN
功能:從指定的地址單元開始,存入規(guī)定好的16位數(shù)據(jù)表。每個(gè)數(shù)據(jù)(16位)占用兩個(gè)存儲(chǔ)單元,其中高8位存入小地址單元,低8位存入大地址單元。常用于定義一個(gè)地址表。
例如:
ORG1000H
TAB2:DW1067H,765AH
匯編后:(1000H)?=?10H,(1001H)?=?67H,(1002H)?=?76H,(1003H)?=?5AH。4.存儲(chǔ)區(qū)定義偽指令DS(DefineStorage)
格式:[標(biāo)號(hào):]DSX
功能:從指定的地址單元開始,預(yù)留X字節(jié)單元作為備用。
例如:
ORG2000H
DS07H
L2:MOVA,#00H
匯編后,從2000H開始保存7個(gè)字節(jié)單元,從而MOV指令的地址為2007H。
注意:DB、DW、DS偽指令只能對(duì)程序存儲(chǔ)器進(jìn)行賦值和初始化工作,不能用來對(duì)數(shù)據(jù)存儲(chǔ)器進(jìn)行賦值和初始化工作。5.賦值偽指令EQU(Equate)
格式:字符名EQU數(shù)或匯編符號(hào)
功能:將右邊的值賦給左邊用戶定義的字符。賦值后,字符在整個(gè)程序內(nèi)有效,該偽指令一般放在程序的開始段。
例如:
TEMPEQUR0
XEQU16
第一條偽指令將TEMP等值為匯編符號(hào)R0,此后的指令中TEMP可以代替R0來使用。第二條指令表示指令中可以用X代替16來使用。注意使用EQU命令時(shí)必須先賦值后使用,字符名不能和匯編語言的關(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口輸出時(shí),由于端口各口線的輸出電路是漏極開路電路,因此必須外接上拉電阻才能有高電平輸出。當(dāng)P0口作為一般的I/O口輸入時(shí),必須使電路中的鎖存器寫入高電平“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口使用。作為輸出口時(shí),由于P1電路內(nèi)部已經(jīng)帶有上拉電阻,因此無需外接上拉電阻;作為輸入口時(shí),也需先向鎖存器寫入“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口功能的自動(dòng)識(shí)別。無論是P0、P2口的總線復(fù)用功能,還是P3口的第二復(fù)用功能,單片機(jī)都會(huì)自動(dòng)選擇,不需要用戶通過指令選擇。
(5)?I/O口的驅(qū)動(dòng)特性。P0口的每一個(gè)I/O口可驅(qū)動(dòng)8個(gè)LSTTL輸入,而P1、P2、P3口的每一個(gè)I/O口只可驅(qū)動(dòng)4個(gè)LSTTL輸入。在使用時(shí)應(yīng)注意口的驅(qū)動(dòng)能力。3.并行接口的使用
在MCS-51單片機(jī)中,沒有專門的輸入/輸出指令,而是將I/O接口與存儲(chǔ)器一樣看待,即使用訪問存儲(chǔ)器的指令來實(shí)現(xiàn)I/O接口的輸入/輸出功能。當(dāng)向I/O口寫入數(shù)據(jù)時(shí),即通過相應(yīng)引腳向外輸出,而當(dāng)從I/O口讀入數(shù)據(jù)時(shí),那么將通過引腳將外部設(shè)備的狀態(tài)信號(hào)輸入到單片機(jī)內(nèi)。
4個(gè)I/O口都可以進(jìn)行位尋址,即可通過位操作指令實(shí)現(xiàn)一位口線的輸入/輸出。為了使用方便,用Pm表示某一個(gè)并行口,Pm.n表示m口的第n位口線。1)輸出數(shù)據(jù)
(1)使用MOV指令輸出字節(jié)數(shù)據(jù),這是常用的輸出方法,例如:
MOVPm,#data
MOVPm,A
(2)使用位操作指令輸出各位數(shù)據(jù)。外部設(shè)備的輸入/輸出線往往只有一根,此時(shí)使用位操作指令更方便。例如:
MOVPm.n,C
SETBPm.n
CLRPm.n(3)使用讀—修改—寫指令改變輸出數(shù)據(jù)。有時(shí)控制系統(tǒng)的前后輸出是有聯(lián)系的,下一個(gè)輸出必須根據(jù)前一個(gè)輸出決定,此時(shí)需要使用讀—修改—寫指令,例如:
ANLPm,#data
ORLPm,A
CPLPm.n2)輸入數(shù)據(jù)
執(zhí)行對(duì)端口進(jìn)行讀操作的指令時(shí),可以從相應(yīng)的口線上將外部設(shè)備的狀態(tài)信息輸入至單片機(jī)中。例如:
(1)字節(jié)數(shù)據(jù)輸入
MOVPm,#0FFH
MOVA,Pm
該程序段執(zhí)行后將從Pm端口中輸入一個(gè)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個(gè)發(fā)光二極管構(gòu)成各字段,內(nèi)部結(jié)構(gòu)有共陰極與共陽極兩種。圖2-10七段LED顯示器
例1用8051控制共陽極七段LED顯示器循環(huán)顯示0~9十個(gè)數(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,#TABLOOP: MOV A,R0
MOVC A,@A+DPTR ;查表取顯示碼
MOV P1,A ;輸出顯示
LCALL DELAY ;定時(shí)
INC R0
CJNE R0,#10,LOOP
LJMP MAIN
DELAY: MOV R2,#0C8H ;定時(shí)子程序
LOOP1: MOV R3,#0FAH
DJNZ R3,$
DJNZ R2,LOOP1
RET
END2)并行接口驅(qū)動(dòng)步進(jìn)電機(jī)
步進(jìn)電機(jī)因其轉(zhuǎn)動(dòng)角度與轉(zhuǎn)速可精確控制而廣泛應(yīng)用于數(shù)字電路,特別是在計(jì)算機(jī)控制系統(tǒng)中作為執(zhí)行機(jī)構(gòu),直接由計(jì)算機(jī)的數(shù)字信號(hào)驅(qū)動(dòng)以實(shí)現(xiàn)精確控制。
以三相步進(jìn)電機(jī)為例,步進(jìn)電機(jī)的控制包括以下三個(gè)方面。
(1)方向控制。給步進(jìn)電機(jī)的三個(gè)勵(lì)磁繞組A、B、C按照不同的順序通電、斷電,那么可實(shí)現(xiàn)步進(jìn)電機(jī)的正轉(zhuǎn)或反轉(zhuǎn)。步進(jìn)電機(jī)驅(qū)動(dòng)方式通常有三種:
①三相單三拍方式:A→B→C。
其中,“三相〞指A、B、C三個(gè)繞組,“單〞指每次只有一相繞組通電,“拍〞指從一種通電狀態(tài)轉(zhuǎn)到另一種通電狀態(tài)。
②三相雙三拍方式:AB→BC→CA。
③三相六拍方式:A→AB→B→BC→C→CA。
假設(shè)按以上順序通電,步進(jìn)電機(jī)正轉(zhuǎn);假設(shè)按相反方向通電,那么步進(jìn)電機(jī)反轉(zhuǎn)。
例如用單片機(jī)的P1.0、P1.1、P1.2分別控制步進(jìn)電機(jī)的A、B、C相繞組(見圖2-12),那么各種驅(qū)動(dòng)方式下的控制代碼見表2-10~表2-12。圖2-12單片機(jī)控制三相步進(jìn)電機(jī)的硬件電路(2)角度控制。步進(jìn)電機(jī)每一拍前進(jìn)一步,對(duì)應(yīng)一個(gè)脈沖。通過控制通電脈沖數(shù)可精確控制電機(jī)轉(zhuǎn)過的角度。
(3)速度控制。步進(jìn)電機(jī)的運(yùn)轉(zhuǎn)速度由輸入到A、B、C三相繞組脈沖的頻率控制。例2編程控制步進(jìn)電機(jī),控制電路見圖2-12。對(duì)步進(jìn)電機(jī)的要求如下:
①步進(jìn)電機(jī)以三相六拍方式工作。
②步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的總步數(shù)存儲(chǔ)在內(nèi)部RAM的0FFH單元中。
③轉(zhuǎn)向標(biāo)志存放在程序狀態(tài)存放器用戶標(biāo)志位F0(D5H)中,當(dāng)F0為“0〞時(shí),步進(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 ;延時(shí)0.01s
D_1: MOV R1,#48
NOP
DJNZ R1,$
DJNZ R0,D_1
RETMAIN: 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 ;延時(shí)0.01s
DJNZ 0FFH,NEXT ;判斷轉(zhuǎn)動(dòng)步數(shù)是否到達(dá)要求
LJMP FINISH ;控制完成
NEXT: POP ACC ;取控制代碼偏移量
INC A ;偏移量加1
CJNE A,#6,LOOP ;偏移量?=?6?不等那么繼續(xù)
LJMP CON ;偏移量?=?6時(shí)開始新一次循環(huán)
FINISH: NOP ;程序結(jié)束
END 2.5中斷
中斷是日常生活中常見的現(xiàn)象。如你正在看書,突然鈴響了,你首先會(huì)看完這一句并在書上做個(gè)標(biāo)記,再放下書本去接,和來的人交談完畢之后,放下,回來接著從做標(biāo)記處繼續(xù)看書。這就是生活中的“中斷〞現(xiàn)象,即正常的工作過程被外部的事件打斷了。
仔細(xì)研究一下生活中的中斷,我們發(fā)現(xiàn)要實(shí)現(xiàn)中斷需滿足以下幾點(diǎn):
第一,需要有能夠引起中斷處理的事件,即中斷源。如:門鈴響了,鬧鐘叫了,你燒的水開了……,等等諸如此類的事件。第二,對(duì)中斷事件的緊急狀態(tài)進(jìn)行判斷。設(shè)想一下,你正在看書,有客來訪,同時(shí)又響了,你該怎么辦呢?如果你在等一個(gè)重要的客人,你可能會(huì)先會(huì)見訪客;如果你在等一個(gè)重要的,你一般會(huì)讓訪客稍等。這里涉及一個(gè)優(yōu)先級(jí)的問題。優(yōu)先級(jí)的問題不僅僅發(fā)生在兩個(gè)中斷同時(shí)產(chǎn)生的情況。也發(fā)生在一個(gè)中斷已正在處理,又有一個(gè)中斷產(chǎn)生的情況。假設(shè)你正在接待訪客時(shí),又響了,你又該怎么辦?第三,中斷的響應(yīng)與處理。當(dāng)有事件發(fā)生(如響了,訪客來訪)時(shí),進(jìn)行處理之前你需要記住書看到第幾頁第幾行了,并做一下標(biāo)記,然后再去處理不同的事情(因?yàn)樘幚硗炅?,我們還要回來繼續(xù)看書)。而且,鈴響我們要到放的地方去,門鈴響我們要到門那邊去。也就是說不同的中斷,我們要在不同的地點(diǎn)處理,而這個(gè)地點(diǎn)通常是固定的。單片機(jī)中的中斷過程也是如此。一個(gè)完整的中斷過程包括以下幾個(gè)步驟:
(1)由中斷源提出中斷申請(qǐng)。MCS-51單片機(jī)中一共有5個(gè)事件可引起CPU中斷處理。
(2)中斷判優(yōu)。當(dāng)幾個(gè)中斷源同時(shí)向CPU提出請(qǐng)求時(shí),CPU通常根據(jù)中斷源的輕重緩急進(jìn)行排隊(duì),優(yōu)先處理最緊急的中斷請(qǐng)求源,暫時(shí)不被響應(yīng)的中斷請(qǐng)求那么被掛起。MCS-51單片機(jī)的中斷事件可以編程設(shè)置為兩個(gè)優(yōu)先級(jí)別,即同時(shí)可以實(shí)現(xiàn)兩級(jí)中斷嵌套。中斷嵌套即為當(dāng)CPU正在處理一個(gè)中斷請(qǐng)求的時(shí)候,又發(fā)生了另一個(gè)優(yōu)先級(jí)更高的中斷請(qǐng)求,那么CPU能夠暫時(shí)中止原來的中斷源的處理程序,而去處理優(yōu)先級(jí)更高的中斷請(qǐng)求;待處理完畢后,再回到原來的低優(yōu)先級(jí)中斷處理程序,這個(gè)過程稱為中斷嵌套。(3)中斷響應(yīng)。當(dāng)把最緊急的事件發(fā)送給CPU后,CPU將自動(dòng)保護(hù)斷點(diǎn)(即保存下一條將要執(zhí)行的指令的地址,通常是把這個(gè)地址送入堆棧)、尋找中斷入口(5個(gè)中斷源的處理程序有各自不同的且固定的入口地址)并跳轉(zhuǎn)到該位置。以上工作是由計(jì)算機(jī)自動(dòng)完成的,與編程者無關(guān),但要求編程者將中斷處理程序放在入口地址處,如果沒把中斷程序放在那兒,中斷程序就不能被執(zhí)行。
(4)執(zhí)行中斷處理程序。
(5)中斷返回。完成中斷處理后,就從中斷處返回到主程序斷點(diǎn),繼續(xù)執(zhí)行原來的程序。圖2-14MCS-51單片機(jī)的中斷系統(tǒng)結(jié)構(gòu)
?IE0:外部中斷0的中斷申請(qǐng)標(biāo)志位,由計(jì)算機(jī)根據(jù)情況自動(dòng)置1或清0。
?IT0:外部中斷0的觸發(fā)方式控制位,可由軟件進(jìn)行置位和復(fù)位。2)中斷允許存放器IE(0A8H)
?EA:中斷允許總控制位。EA?=?1,CPU開放中斷;EA?=?0,CPU屏蔽所有的中斷請(qǐng)求。
?ES:串行中斷允許位。ES?=?1,允許串口中斷;ES?=?0,禁止串口中斷。
?ET1:定時(shí)/計(jì)數(shù)器T1的中斷允許位。ET1?=?1時(shí),允許T1中斷;ET1?=?0時(shí),禁止T1中斷。
?EX1:外部中斷1的中斷允許位。EX1?=?1時(shí),允許外部中斷1中斷;EX1?=?0時(shí),禁止外部中斷1中斷。
?ET0:定時(shí)/計(jì)數(shù)器T0的中斷允許位。ET0?=?1時(shí),允許T0中斷;ET0?=?0時(shí),禁止T0中斷。
?EX0:外部中斷0的中斷允許位。EX0?=?1時(shí),允許外部中斷0中斷;EX0?=?0時(shí),禁止外部中斷0中斷。2.中斷優(yōu)先級(jí)控制
MCS-51單片機(jī)的5個(gè)中斷源的優(yōu)先級(jí)別由中斷優(yōu)先級(jí)存放器IP進(jìn)行設(shè)定。中斷優(yōu)先級(jí)存放器IP(0B8H)的各位含義如下。
?PS:串行中斷的優(yōu)先級(jí)設(shè)定位。PS=1時(shí),串口為高級(jí)中斷;PS?=?0,串口為低級(jí)中斷。
?PT1:定時(shí)/計(jì)數(shù)器T1的中斷優(yōu)先級(jí)設(shè)定位。PT1?=?1時(shí),T1為高級(jí)中斷;PT1?=?0時(shí),T1為低級(jí)中斷。?PX1:外部中斷1的中斷優(yōu)先級(jí)設(shè)定位。PX1?=?1時(shí),外部中斷1為高級(jí)中斷;PX1?=?0時(shí),外部中斷1為低級(jí)中斷。
?PT0:定時(shí)/計(jì)數(shù)器T0的中斷優(yōu)先級(jí)設(shè)定位。PT0?=?1時(shí),T0為高級(jí)中斷;PT0?=?0時(shí),T0為低級(jí)中斷。
?PX0:外部中斷0的中斷優(yōu)先級(jí)設(shè)定位。PX0?=?1時(shí),外部中斷0為高級(jí)中斷;PX0?=?0時(shí),外部中斷0為低級(jí)中斷。
如果有多個(gè)中斷源同時(shí)向CPU提出中斷申請(qǐng),那么按照IP的設(shè)定,CPU先響應(yīng)高級(jí)中斷,再響應(yīng)低級(jí)中斷;如有幾個(gè)同優(yōu)先級(jí)的中斷源同時(shí)向CPU提出中斷申請(qǐng),那么按照自然優(yōu)先級(jí)的順序進(jìn)行響應(yīng)。自然優(yōu)先級(jí)的順序?yàn)椋和獠恐袛?(級(jí)別最高)→定時(shí)/計(jì)數(shù)器T0→外部中斷1→定時(shí)/計(jì)數(shù)器T1→串口中斷(級(jí)別最低)。3.中斷響應(yīng)
MCS-51單片機(jī)工作時(shí),CPU在每個(gè)機(jī)器周期中都會(huì)去查詢一下各個(gè)中斷標(biāo)記,看它們是否是“1〞,如果是1,就說明有中斷請(qǐng)求了,之后按照優(yōu)先級(jí)的順序進(jìn)行中斷處理。但是當(dāng)出現(xiàn)以下情況之一時(shí),中斷申請(qǐng)將被暫時(shí)封鎖。
(1)?CPU正在處理一個(gè)同級(jí)或更高級(jí)別的中斷請(qǐng)求。
(2)現(xiàn)行的機(jī)器周期不是當(dāng)前正在執(zhí)行指令的最后一個(gè)周期,即要保證把當(dāng)前的指令執(zhí)行完才能響應(yīng)中斷。(3)假設(shè)當(dāng)前正在執(zhí)行的指令是返回指令(RETI)或訪問IP、IE存放器的指令,那么CPU執(zhí)行該指令后至少再執(zhí)行一條指令才響應(yīng)中斷。如果正在訪問IP、IE,那么可能會(huì)開、關(guān)中斷或改變中斷的優(yōu)先級(jí),而中斷返回指令那么說明本次中斷還沒有處理完,所以都要等本指令處理結(jié)束再執(zhí)行一條指令才可以響應(yīng)中斷。中斷響應(yīng)的過程如下:
(1)?CPU響應(yīng)中斷時(shí),首先設(shè)置優(yōu)先級(jí)狀態(tài)觸發(fā)器,封鎖同級(jí)中斷與低級(jí)中斷,同時(shí)中斷標(biāo)志位自動(dòng)清0,如邊沿觸發(fā)方式下的外部中斷標(biāo)志IE0、IE1和定時(shí)器溢出標(biāo)志TF0、TF1。但是串口的接收發(fā)送中斷標(biāo)志TI、RI只能由用戶在中斷程序中用指令清0。電平觸發(fā)方式下的外部中斷標(biāo)志IE0、IE1是根據(jù)、引腳的電平變化而變化的,CPU無法直接干預(yù),因此需在引腳外加硬件(如D觸發(fā)器)使其自動(dòng)撤銷外部中斷。
(2)將當(dāng)前程序計(jì)數(shù)器PC的內(nèi)容(即斷點(diǎn)位置指令的地址)壓入堆棧,然后將相應(yīng)的中斷入口地址送入PC,使程序跳轉(zhuǎn)到中斷入口處繼續(xù)執(zhí)行。中斷程序的入口地址如表2-13所示。4.中斷處理
中斷響應(yīng)后,CPU將轉(zhuǎn)入中斷處理程序繼續(xù)工作。中斷處理程序的流程圖見圖2-15。
編寫中斷效勞程序時(shí)應(yīng)注意以下幾點(diǎn):
(1)中斷效勞程序必須定位在該中斷源對(duì)應(yīng)的入口地址上,或者可以在中斷入口地址單元內(nèi)放入一條無條件轉(zhuǎn)移指令使CPU跳轉(zhuǎn)到中斷效勞程序處(此時(shí)中斷效勞程序可靈活地安排在64KB的程序存儲(chǔ)器的任意位置)。
(2)在中斷效勞程序中,要注意使用軟件保護(hù)現(xiàn)場,以免中斷返回后,原存放器、累加器中的信息已經(jīng)喪失。
(3)要在執(zhí)行當(dāng)前中斷程序時(shí)禁止更高優(yōu)先級(jí)中斷,可以先用軟件關(guān)閉CPU中斷或禁止某中斷源的中斷,在中斷返回前再開放中斷。圖2-15中斷程序的一般結(jié)構(gòu)5.中斷返回
在中斷效勞程序的最后一行,應(yīng)寫上中斷返回指令RETI。執(zhí)行該指令時(shí),將首先去除優(yōu)先級(jí)狀態(tài)觸發(fā)器,開放同級(jí)與低級(jí)中斷,然后從堆棧中取出斷點(diǎn)地址送給PC,最終讓CPU跳回到主程序斷點(diǎn)位置繼續(xù)運(yùn)行。6.中斷舉例
例3某汽車電子控制系統(tǒng)中,當(dāng)冷卻水溫過高、過低或燃油液面高度過低、潤滑油油壓過低以及倒車時(shí)均要報(bào)警,其具體要求如下:
①當(dāng)水溫過高時(shí),應(yīng)啟動(dòng)冷卻風(fēng)扇,點(diǎn)亮水溫報(bào)警燈;
②當(dāng)水溫過低時(shí),風(fēng)扇停轉(zhuǎn),水溫報(bào)警燈熄滅;
③當(dāng)燃油液面高度過低時(shí),點(diǎn)亮燃油報(bào)警燈;
④當(dāng)潤滑油油壓過低時(shí),報(bào)警喇叭鳴叫,油壓過低報(bào)警燈點(diǎn)亮,且該報(bào)警優(yōu)先級(jí)最高;
⑤當(dāng)?shù)管嚂r(shí),倒車指示燈點(diǎn)亮。圖2-16汽車電子控制報(bào)警系統(tǒng)程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
SETB P1.3 ;油壓過低報(bào)警
SETB P1.4
RETI
ORG 0013H
LJMP INT
ORG 0100H ;主程序
MAIN: MOV P1,#0 ;令所有報(bào)警燈熄滅
CLR IT0 ;中斷初始化 CLR IT1
MOV IE,#10000101B
SETB PX0
;省略電子控制系統(tǒng)的其他功能局部
INT: MOV P0,#0FFH ;輸入腳鎖存器置1
MOV C,P0.3 ;倒車報(bào)警
CPL C
MOV P1.2,C
MOV C,P0.2 ;燃油報(bào)警
CPL C
MOV P1.1,C
JNB P0.0,TEM_HIGH ;判斷水溫是否過高
JNB P0.1,TEM_LOW ;判斷水溫是否過低
RETI…TEM_HIGH:SETB P1.0 ;水溫過高報(bào)警
SETB P1.5
RETI
TEM_LOW:CLR P1.0 ;水溫過低報(bào)警
CLR P1.5
RETI
END 2.6定時(shí)/計(jì)數(shù)器
1.定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)及工作原理
MCS-51單片機(jī)中的兩個(gè)定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)功能類似,下面以T0為例說明定時(shí)/計(jì)數(shù)器的結(jié)構(gòu)及工作原理。T0的結(jié)構(gòu)如圖2-17所示。圖2-17方式0、方式1下定時(shí)/計(jì)數(shù)器T0的結(jié)構(gòu)示意圖定時(shí)/計(jì)數(shù)器T0(T1)的核心部件為16位的、可預(yù)置初值的加1計(jì)數(shù)器,它實(shí)際上由兩個(gè)獨(dú)立的RAM單元TH0、TL0(TH1、TL1)組成。工作之前,需由用戶對(duì)其預(yù)置一個(gè)初值,工作時(shí)在脈沖觸發(fā)下將會(huì)自動(dòng)加1計(jì)數(shù)。當(dāng)計(jì)數(shù)器加滿溢出時(shí),其值突變?yōu)?,其溢出信號(hào)會(huì)使其中斷標(biāo)志位TF0(TF1)置1,從而向CPU提出中斷申請(qǐng)。
注意:不同的工作方式下加1計(jì)數(shù)器的工作長度不同。1)計(jì)數(shù)功能
圖中,當(dāng)C/T=1時(shí),計(jì)數(shù)器與單片機(jī)的引腳T0即P3.4(T1即P3.5)接通,計(jì)數(shù)器對(duì)T0(T1)引腳輸入的脈沖信號(hào)進(jìn)行計(jì)數(shù)(下降沿觸發(fā)),即定時(shí)器/計(jì)數(shù)器以計(jì)數(shù)方式工作。
當(dāng)工作在計(jì)數(shù)方式下時(shí),CPU在每個(gè)機(jī)器周期會(huì)檢測一次輸入引腳。為確保外來信號(hào)被檢測到,要求輸入脈沖的高、低電平狀態(tài)各要維持一個(gè)機(jī)器周期以上的時(shí)間。
2)定時(shí)功能
圖中,當(dāng)C/T=0時(shí),計(jì)數(shù)器的計(jì)數(shù)脈沖來自于單片機(jī)內(nèi)部。每經(jīng)過1個(gè)機(jī)器周期,計(jì)數(shù)器加1,這樣就可以根據(jù)計(jì)數(shù)器中設(shè)置的初值計(jì)算出定時(shí)時(shí)間。2.定時(shí)/計(jì)數(shù)器的控制
定時(shí)/計(jì)數(shù)器的功能以及工作方式是由TCON及TMOD控制的。
1)定時(shí)器的方式控制存放器TMOD(89H)圖2-19方式2下的T0結(jié)構(gòu)2)定時(shí)器的控制存放器TCON(88H)3)定時(shí)器的初始化步驟
(1)根據(jù)控制要求設(shè)定TMOD,確定定時(shí)/計(jì)數(shù)器的功能、工作方式、啟動(dòng)方式。
(2)根據(jù)選定的工作方式與控制要求,計(jì)算加1計(jì)數(shù)器的初值。定時(shí)條件下,加1計(jì)數(shù)器的初值計(jì)算式為其中,n取決于工作方式。方式0時(shí),n?=?13;方式1時(shí),n?=?16;方式2時(shí),n?=?8。t為定時(shí)時(shí)間。(3)在中斷處理方式下,對(duì)定時(shí)/計(jì)數(shù)器開放中斷,并設(shè)置優(yōu)先級(jí)別。(4)啟動(dòng)定時(shí)器工作。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í)器的初始化過程如下:
①設(shè)置TMOD。因?yàn)門0的工作方式為方式0,功能為定時(shí),并由軟件啟動(dòng),所以
TMOD?=?00000000B。②計(jì)算初值。晶振頻率fosc為6MHz,那么取計(jì)算出的初值的低5位送入TL0的低5位,其余送入TH0,那么③令TR0?=?1,啟開工作。
參考程序如下:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV TMOD,#00H ;設(shè)置T0為定時(shí)功能、工作方式0
MOV TL0,#0CH ;設(shè)置初值
MOV TH0,#0F0H
SETB TR0 ;啟動(dòng)定時(shí)器LOOP: JNB TF0,LOOP ;查詢是否溢出
CPL P1.0 ;輸出取反
MOV TL0,#0CH ;重新設(shè)置計(jì)數(shù)初值
MOV TH0,#0F0H
CLR TF0 ;去除溢出標(biāo)志
LJMP LOOP
END(2)方式1—中斷方式。
定時(shí)器的初始化過程如下:
①設(shè)置TMOD。因?yàn)門0的工作方式為方式1,功能為定時(shí),且由軟件啟動(dòng),所以TMOD?=?00000001B。②計(jì)算初值。那么③開放中斷,即EA=1,ET0=1。
④啟開工作,即令TR0?=?1。
參考程序如下:
ORG 0000H
LJMP MAIN
ORG 000BH
CPL P1.0 ;中斷處理程序
MOV TL0,#0CH ;重新設(shè)置計(jì)數(shù)初值
MOV TH0,#0F0H
RETIORG 0100H
MAIN: MOV TMOD,#01H ;設(shè)置T0為定時(shí)功能、工作方式1
MOV TL0,#0CH ;設(shè)置初值
MOV TH0,#0FEH
SETB EA ;開放中斷
SETB ET0
SETB TR0 ;啟動(dòng)定時(shí)器
LJMP $
END
例5利用定時(shí)器測定外部脈沖的頻率。設(shè)被測脈沖的頻率在10kHz~100kHz之間。系統(tǒng)的晶振頻率fosc為6MHz。檢測結(jié)果存入片內(nèi)RAM的20H單元。
解將被測脈沖送至單片機(jī)的T0引腳,由T0進(jìn)行計(jì)數(shù),其工作方式為方式1,并進(jìn)行查詢處理。而T1選擇為定時(shí)功能,定時(shí)時(shí)間為1ms,工作方式為方式1,并執(zhí)行中斷處理。
參考程序:
ORG 0000H
LJMP MAIN
ORG 001BH
CLR TR0MOV IE,#0
MOV 20H,TL0;將頻率(單位為kHz)存入緩沖單元20H單元
RETI
ORG 0100H
MAIN: MOV TMOD,#00010101B ;T0為計(jì)數(shù)方式1,T1為定時(shí)方式1
MOV TL1,#0CH ;fosc?=?6?MHz,定時(shí)1?ms
MOV TH1,#0FEH
MOV TL0,#0
MOV IE,#10001000B ;開放T1中斷
MOV TCON,#01010000B ;啟動(dòng)T0、T1工作
LJMP $
END 2.7串行接口
1.串行通信與并行通信
計(jì)算機(jī)與外界的信息交換稱為通信。常用通信方式有兩種:并行通信與串行通信,見圖2-20。圖2-20串行通信與并行通信并行通信的傳送速度快、效率高,但傳送多少數(shù)據(jù)位就需要多少根數(shù)據(jù)線,故本錢高,適合于近距離通信;串行通信是逐位按順序傳送,最少僅需要一根傳輸線即可完成,本錢低、速度慢,適合于遠(yuǎn)距離傳送。
MCS-51單片機(jī)中有一個(gè)全雙工的異步通信接口,可以同時(shí)完成數(shù)據(jù)的串行發(fā)送與串行接收,其數(shù)據(jù)傳輸格式見圖2-21。圖2-21異步通信格式MCS-51單片機(jī)的異步通信按字符傳送,各字符傳送的間隙為空閑位“1〞,無固定的間隙長度。每個(gè)字符包括1個(gè)起始位0、8位或9位數(shù)據(jù)位(低位在前、高位在后)、1個(gè)停止位“1〞。串行通信中,用每秒傳送二進(jìn)制數(shù)據(jù)位的數(shù)量表示傳送速率,稱為波特率。1波特?=?1b/s(位/秒)。2.MCS-51單片機(jī)的串口結(jié)構(gòu)及控制存放器
MCS-51單片機(jī)的串口結(jié)構(gòu)如圖2-22所示。圖2-22MCS-51單片機(jī)的串口結(jié)構(gòu)串口有兩個(gè)緩沖存放器SBUF(99H),一個(gè)是發(fā)送存放器(用戶只能寫入),一個(gè)是接收存放器(用戶只能讀出)。串行發(fā)送時(shí),CPU向發(fā)送SBUF中寫入數(shù)據(jù),發(fā)送SBUF在移位時(shí)鐘脈沖的作用下,由串行輸出引腳TXD(P3.1)逐位輸出。當(dāng)該字符發(fā)送完畢后,自動(dòng)將TI置1,以向CPU提出串行中斷申請(qǐng)。
串行輸入時(shí),數(shù)據(jù)通過RXD(P3.0)引腳在移位時(shí)鐘的控制下逐位輸入到輸入移位存放器中;接收完畢后,將數(shù)據(jù)送入接收SBUF,并將RI置1,同樣向CPU提出串行中斷申請(qǐng)。
與串行通信有關(guān)的控制存放器主要有串行控制存放器SCON、電源控制存放器PCON及IE、IP等。
?SM0、SM1:串口工作方式選擇位。串口工作方式的具體信息見表2-15。?RB8:接收數(shù)據(jù)的第9位(D8)。在方式2和方式3中,由發(fā)送方發(fā)送的TB8的值將被接收方存儲(chǔ)在RB8位中,其含義與TB8的相同。
?TI:發(fā)送中斷標(biāo)志。當(dāng)在方式0時(shí),發(fā)送完第8位數(shù)據(jù)后,該位由硬件置位。在其他方式下,于發(fā)送停止位之前由硬件置位。因此TI?=?1表示“發(fā)送緩沖器SBUF已空〞,幀發(fā)送結(jié)束。其狀態(tài)既可供軟件查詢使用,也可用于請(qǐng)求中斷。TI位必由軟件清0。
?RI:接收中斷標(biāo)志。當(dāng)接收方接收到有效數(shù)據(jù)后,該位由硬件置位。因此RI?=?1表示幀接收結(jié)束。其狀態(tài)既可供軟件查詢使用,也可以用于請(qǐng)求中斷。RI位由軟件清0。2)電源控制存放器PCON(87H)?SMOD:波特率倍增位。假設(shè)SMOD?=?1,那么串行口波特率加倍。?GF0、GF1:通用標(biāo)志位,供用戶使用。?PD:掉電保護(hù)位。假設(shè)PD?=?1,那么進(jìn)入掉電保護(hù)方式。此時(shí),只有內(nèi)部RAM單元的內(nèi)容被保存,其他包括中斷系統(tǒng)在內(nèi)的所有電路停止工作。只有復(fù)位的方法才可以使單片機(jī)由掉電方式恢復(fù)到正常的工作狀態(tài)。?IDL:待機(jī)方式位。假設(shè)IDL=1,那么進(jìn)入待機(jī)方式。此時(shí),時(shí)鐘電路仍然運(yùn)行,并向中斷系統(tǒng)、I/O接口和定時(shí)/計(jì)數(shù)器提供時(shí)鐘,但不向CPU提供時(shí)鐘,所以CPU不能工作。在待機(jī)方式下,可采取中斷方法退出待機(jī)方式。在單片機(jī)響應(yīng)中斷時(shí),IDL位被硬件自動(dòng)清0。3.MCS-51單片機(jī)串口的工作方式
1)串行工作方式0
方式0下,串行口作為同步移位存放器使用,主要用于I/O口擴(kuò)展等。方式0的波特率固定為fosc/12,串行數(shù)據(jù)由RXD(P3.0)端輸入或輸出,而TXD(P3.1)此時(shí)僅作為同步移位脈沖發(fā)生器輸出移位脈沖。串行數(shù)據(jù)的發(fā)送和接收以8位為一幀,不設(shè)起始位和停止位,其格式為:方式0下輸出數(shù)據(jù)時(shí),向SBUF寫入數(shù)據(jù)的指令為
MOVSBUF,A
此指令執(zhí)行后,即可啟動(dòng)數(shù)據(jù)輸出。當(dāng)8位數(shù)據(jù)全部輸出后,TI自動(dòng)置1。
方式0下輸入數(shù)據(jù)時(shí),使SCON中REN位置1的指令為
SETBREN
此指令執(zhí)行后,即可啟動(dòng)數(shù)據(jù)輸入。當(dāng)接收到8位數(shù)據(jù)后,RI自動(dòng)置1。
在方式0工作時(shí),往往需要外部有串入并出存放器或并入串出存放器配合使用,其多用于將串行口轉(zhuǎn)變?yōu)椴⑿锌诘氖褂脠龊?,如圖2-23所示。圖2-23串口方式0的電路連接方法示意圖
例6按圖2-23(a)連接電路,試將A中數(shù)據(jù)從CD4094并行輸出。
解參考程序如下:
MOV SCON,#00H ;串行口工作方式0
CLR P1.0 ;設(shè)置CD4094串行輸入狀態(tài)
MOV SBUF,A ;啟動(dòng)串行輸出
JNB TI,$ ;等待串行輸出完畢
CLR TI
SETB P1.0 ;開啟并行輸出2)串行工作方式1
方式1下的串口作為10位的異步通信接口使用,TXD為數(shù)據(jù)輸出端,RXD為數(shù)據(jù)輸入端。
(1)數(shù)據(jù)格式。方式1的串口數(shù)據(jù)格式如下:一幀有10個(gè)位,包括1位起始位“0〞、8位數(shù)據(jù)位和1位停止位“1〞。(2)波特率。方式1的波特率是可變的,計(jì)算公式為式中,SMOD—PCON的最高位,可使用軟件設(shè)定其值為1或?yàn)?;T1溢出頻率—就是T1在單位時(shí)間內(nèi)溢出的次數(shù)。為減少誤差及保證在通信期間波特率固定不變,通常將T1設(shè)定為工作方式2、定時(shí)功能,那么T1的溢出周期為由此可得波特率的計(jì)算公式為實(shí)際使用時(shí)總是先確定波特率,再計(jì)算定時(shí)器T1的初值,然后進(jìn)行T1的初始化。根據(jù)上述波特率的計(jì)算公式,可得T1初值的計(jì)算公式為(3)方式1下數(shù)據(jù)的發(fā)送和接收。向發(fā)送SBUF寫入發(fā)送數(shù)據(jù)的指令即可啟動(dòng)數(shù)據(jù)發(fā)送。在串行口由硬件自動(dòng)在8位數(shù)據(jù)的前后參加起始位和停止位以組成一個(gè)完整的幀。在內(nèi)部移位脈沖的作用下,數(shù)據(jù)由TXD端串行輸出。發(fā)送完一幀數(shù)據(jù)后,TXD端維持空閑“1〞狀態(tài),并將TI置1,以產(chǎn)生串行中斷申請(qǐng)。
接收數(shù)據(jù)從將SCON中的REN置1開始。當(dāng)串行口采樣到RXD端的電平從1向0跳變時(shí),就認(rèn)定這個(gè)0為起始位,隨后在移位脈沖的控制下,把從RXD端輸入的8位數(shù)據(jù)依次送入移位存放器。當(dāng)滿足RI?=?0、SM2?=?0或接收到的停止位為1時(shí),將接收到的8位數(shù)據(jù)送入接收SBUF中,停止位1送入RB8中,并使RI置1,以產(chǎn)生串口中斷申請(qǐng);否那么,此次接收無效,也不置位RI。
例7利用單片機(jī)的串行口方式1,讓甲機(jī)連接的開關(guān)控制乙機(jī)所連接的發(fā)光二極管,并實(shí)現(xiàn)雙機(jī)通訊。電路見圖2-24,fosc=6MHz,要求波特率為1200b/s。圖2-24雙機(jī)通信解波特率約定為1200b/s,SMOD值取0,T1選擇工作方式2、定時(shí)功能,那么T1的初值為雙方串口選擇方式1、查詢方式,那么發(fā)送方SCON=40H,接收方SCON=50H。發(fā)送方程序如下:ORG 0000H LJMP MAINORG 0100HMAIN: MOV TMOD,#20H ;設(shè)置波特率及串口初始化
MOV TL1,#243
MOV TH1,#243
SETB TR1
MOV SCON,#40H
LOOP: MOV P1,#0FFH ;讀入開關(guān)狀態(tài)
MOV SBUF,P1 ;發(fā)送
WAIT:JNB TI,WAIT ;發(fā)送完畢否
CLR TI
LJMP LOOP
END接收方程序如下:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: MOV TMOD,#20H ;設(shè)置波特率及串口初始化
MOV TL1,#243
MOV TH1,#243
SETB TR1
MOV SCON,#50H
WAIT: JNB RI,WAIT ;等待接收
CLR RI
MOV P1,SBUF ;二極管顯示
LJMP WAIT
END3)串行工作方式2
方式2下的串口作為11位的異步通信接口使用。串口的數(shù)據(jù)格式如下:一幀數(shù)據(jù)有11個(gè)位,包括1位起始位“0〞、8位數(shù)據(jù)位、1個(gè)附加第9位(D8)和1位停止位“1〞。附加第9位(D8)由軟件置1或清零。發(fā)送前,先根據(jù)通信協(xié)議用軟件設(shè)置TB8(如作奇偶校驗(yàn)位或地址幀/數(shù)據(jù)幀標(biāo)志),然后將要發(fā)送的數(shù)據(jù)寫入發(fā)送SBUF,啟動(dòng)發(fā)送(單片機(jī)能自動(dòng)將TB8取出并作為第9位數(shù)據(jù)進(jìn)行發(fā)送),發(fā)送完畢使TI置1。接收時(shí),使SCON中的REN置1即啟動(dòng)接收。當(dāng)檢測到RXD端有從1到0的跳變,便開始接收9位數(shù)據(jù),并送入移位存放器。當(dāng)滿足RI?=?0、SM2?=?0或接收到的第9位為1時(shí),前8位數(shù)據(jù)送入SBUF,附加的第9位數(shù)據(jù)送入SCON中的RB8,RI置1;否那么,這次接收無效,也不置位RI。
方式2下波特率的計(jì)算方式為波特率?=?2SMOD?×?fosc/64。
4)串行工作方式3
方式3的波特率的計(jì)算方法與方式1的相同,其余計(jì)算過程與方式2的相同。4.多機(jī)通信原理
單片機(jī)多機(jī)通信是指一臺(tái)主機(jī)和多臺(tái)從機(jī)之間的通信。MCS-51單片機(jī)的SCON中設(shè)有多機(jī)通信控制位SM2。當(dāng)串行口以方式2或方式3工作時(shí),假設(shè)SM2=1,那么僅當(dāng)接收到的第9位數(shù)據(jù)為1時(shí),才將數(shù)據(jù)送入接收緩沖器SBUF,并置位RI發(fā)出中斷請(qǐng)求信號(hào),否那么將喪失信息;而當(dāng)SM2=0時(shí),無論第9位是0還是1,都能將數(shù)據(jù)裝入SBUF,并產(chǎn)生中斷請(qǐng)求信號(hào)。根據(jù)這個(gè)特性,便可實(shí)現(xiàn)主機(jī)與多個(gè)從機(jī)之間的串行通信。
圖2-25為MCS-51單片機(jī)多機(jī)通信系統(tǒng)的邏輯示意圖。多機(jī)通信中,主機(jī)與各從機(jī)之間可實(shí)現(xiàn)全雙工通信,而各從機(jī)只能與主機(jī)交換信息。圖2-25MCS-51單片機(jī)的多機(jī)通信系統(tǒng)多機(jī)通信的過程如下:
(1)所有從機(jī)串口設(shè)為方式2或方式3,SM2=1,串行中斷開放。
(2)主機(jī)中設(shè)置TB8=1,然后先發(fā)送一幀地址信息,即希望與之通信的從機(jī)地址。
(3)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國套裝油漆工具數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國丁腈涂層手套數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025年中國草編手工藝品市場調(diào)查研究報(bào)告
- 2025年中國胡須套市場調(diào)查研究報(bào)告
- 2025年中國絎縫白棉布棉被市場調(diào)查研究報(bào)告
- 2025年中國硅橡膠微波熱療管市場調(diào)查研究報(bào)告
- 學(xué)校結(jié)對(duì)共建合同范本
- 農(nóng)夫山泉自動(dòng)販賣機(jī)投放合同范本
- 2025年度辦事處設(shè)立與金融服務(wù)平臺(tái)合作協(xié)議
- 食品行業(yè)銷售代理合同范文
- 四川省公務(wù)員考試行測真題
- 2024年廣東省初中學(xué)業(yè)水平考試中考英語試卷(真題+答案解析)
- DL-T-255-2012燃煤電廠能耗狀況評(píng)價(jià)技術(shù)規(guī)范
- 家庭教育家長會(huì)教案及反思(3篇模板)
- 職業(yè)培訓(xùn)師三級(jí)操作技能鑒定卷庫及答案
- 【視頻號(hào)運(yùn)營】視頻號(hào)運(yùn)營108招
- 新能源客車安全應(yīng)急處理指南
- (正式版)JTT 421-2024 港口固定式起重機(jī)安全要求
- 地連墻施工MJS工法樁施工方案
- 《電力建設(shè)施工技術(shù)規(guī)范 第2部分:鍋爐機(jī)組》DLT 5190.2
- 教案設(shè)計(jì)常見問題及解決措施
評(píng)論
0/150
提交評(píng)論