




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
單片機(jī)原理、接口及應(yīng)用51系列單片機(jī)內(nèi)部結(jié)構(gòu)如圖1-1所示。1.1.2CPUCPU是單片機(jī)的核心部件。它由運(yùn)算器和控制器等部件組成。1.運(yùn)算器 運(yùn)算器的功能是進(jìn)行算術(shù)運(yùn)算:加、減、乘、除、加1、減1、比較、BCD碼十進(jìn)制調(diào)整等 邏輯運(yùn)算:與、或、異或、求反、循環(huán)等邏輯操作 位操作:內(nèi)部有布爾處理器,它以進(jìn)位標(biāo)志位C為位累加器,用來處理位操作??蓪?duì)位置“1”、對(duì)位清零、位判斷等。 操作結(jié)果的狀態(tài)信息送至狀態(tài)寄存PSW。2.程序計(jì)數(shù)器PC
程序計(jì)數(shù)器PC是16位的寄存器,用來存放即將要執(zhí)行的指令地址,可對(duì)64KB程序存儲(chǔ)器直接尋址。執(zhí)行指令時(shí),PC內(nèi)容的低8位經(jīng)P0口輸出,高8位經(jīng)P2口輸出。
3.指令寄存器
指令寄存器中存放指令代碼。CPU執(zhí)行指令時(shí),由程序存儲(chǔ)器中讀取的指令代碼送入指令存儲(chǔ)器,經(jīng)指令譯碼器譯碼后由定時(shí)與控制電路發(fā)出相應(yīng)的控制信號(hào),完成指令功能。
1.2存儲(chǔ)器MCS-51的儲(chǔ)存器結(jié)構(gòu)與常見的微型計(jì)算機(jī)的配置方法不同,它將程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器分開,各有自己的尋址方式、控制信號(hào)和功能。程序存儲(chǔ)器用來存放程序和始終要保留的常數(shù)。數(shù)據(jù)存儲(chǔ)器存放程序運(yùn)行中所需要的常數(shù)和變量。從物理空間看,MCS-51有四個(gè)存儲(chǔ)器地址空間:片內(nèi)數(shù)據(jù)存儲(chǔ)器、片外數(shù)據(jù)存儲(chǔ)器片內(nèi)程序存儲(chǔ)器、片外程序存儲(chǔ)器MCS-51存儲(chǔ)器物理結(jié)構(gòu)見下圖所示:引腳EA的接法決定了程序儲(chǔ)存器的0000~0FFFH4KB地址范圍是在單片機(jī)片內(nèi)還是片外。1.2.1程序儲(chǔ)存器程序存儲(chǔ)器用來存放編制好的始終保留的固定程序和表格常數(shù)。程序儲(chǔ)存器以程序計(jì)數(shù)器PC作為地址指針,通過16位地址總線,可尋址的地址空間為64KB。在8051/8751/89C51片內(nèi),分別內(nèi)置最低地址空間的4KBROM/EPROM程序儲(chǔ)存器(內(nèi)部程序儲(chǔ)存器),而在8031片內(nèi),則無內(nèi)部程序儲(chǔ)存器,必須外部擴(kuò)展EPROM。MCS-51單片機(jī)中64KB內(nèi)、外程序儲(chǔ)存器的地址是統(tǒng)一編排的。8031單片機(jī)無內(nèi)部程序存儲(chǔ)器,地址從0000H~FFFFH都是外部程序存儲(chǔ)空間。應(yīng)始終接地,對(duì)于內(nèi)部有ROM的單片機(jī)(51、52系列),引腳接高電平,使程序從內(nèi)部ROM開始執(zhí)行。當(dāng)PC值超出內(nèi)部ROM的容量時(shí),會(huì)自動(dòng)轉(zhuǎn)向外部程序存儲(chǔ)器空間。外部程序存儲(chǔ)器地址空間為1000H~FFFFH。訪問程序存儲(chǔ)器使用MOVC指令。程序存儲(chǔ)器中的幾個(gè)特殊地址的使用:地址用途0000H復(fù)位操作后的程序入口0003H外部中斷0服務(wù)程序入口000BH定時(shí)器0中斷服務(wù)程序入口0013H外部中斷1服務(wù)程序入口001BH定時(shí)器1中斷服務(wù)程序入口0023H串行口中斷服務(wù)程序入口由于兩入口地址之間的存儲(chǔ)空間有限,因此在編程時(shí),通常在這些入口地址開始的兩三個(gè)地址單元中,放入一條轉(zhuǎn)移類指令,已使相應(yīng)的程序轉(zhuǎn)到指定的程序存儲(chǔ)器區(qū)域中執(zhí)行。1.2.2外部數(shù)據(jù)存儲(chǔ)器 用于存放隨機(jī)讀寫的數(shù)據(jù)。 外部I/O口地址影像區(qū)。MCS-51單片機(jī)的外部數(shù)據(jù)存儲(chǔ)器和外部I/O口實(shí)行統(tǒng)一編址,并使用相同的作選通控制信號(hào),均使用MOVX指令訪問。 MCS-51單片機(jī)最多可擴(kuò)展64KB外部數(shù)據(jù)存儲(chǔ)器1.2.3內(nèi)部數(shù)據(jù)儲(chǔ)存器內(nèi)部數(shù)據(jù)存儲(chǔ)器是使用最多的地址空間,存放隨機(jī)讀寫的數(shù)據(jù) 通用寄存器區(qū)堆棧區(qū)運(yùn)算操作數(shù)存放區(qū)指令(算術(shù)運(yùn)算、邏輯運(yùn)算、位操作運(yùn)算等)的操作數(shù)只能在此地址空間或功能寄存器地址空間。內(nèi)部數(shù)據(jù)存儲(chǔ)器的地址分配51系列單片機(jī)內(nèi)部數(shù)據(jù)存儲(chǔ)器地址范圍為00~7FH。各區(qū)域地址見下表。(1)地址0~1FH的前32個(gè)單元稱為寄存器區(qū)用途:①作通用寄存器R0~R7。②R0與R1可作間址寄存器使用。使用時(shí)應(yīng)注意:32個(gè)單元的寄存器區(qū)分為四組,使用時(shí)只能選其中一組寄存器。寄存器的選組由程序狀態(tài)字PSW的RS1和RS0位定。RS1RS0選寄存器組000組011組102組113組初始化時(shí)或復(fù)位時(shí),自動(dòng)選中0組。一旦選中一組,其它三組只能作為數(shù)據(jù)存儲(chǔ)器使用,而不能作為寄存器使用。設(shè)置多組寄存器可以方便保護(hù)現(xiàn)場。(2)20H~2FH為位地址區(qū)共16個(gè)單元,每單元有八個(gè)位,每位有一個(gè)位地址,共128位,位地址范圍為00H~7FH,該區(qū)既可位尋址,又可字節(jié)尋址。如MOV20H,C(這里C是Cy進(jìn)位標(biāo)志位),該指令是將Cy內(nèi)容送20H位,如果Cy=1,位20H值為“1”。(3)除選中的寄存組以外的存儲(chǔ)器均可以作為通用RAM區(qū)。(4)堆棧區(qū)8XX51單片機(jī)的堆棧設(shè)在內(nèi)部RAM區(qū),深度不大于128字節(jié),初始化時(shí)SP指向07H。 注:對(duì)51基本型單片機(jī)只有00H-7FH單元128字節(jié)的RAM區(qū)。對(duì)52增強(qiáng)型的單片機(jī)還有80H-FFH組成的高128字節(jié)RAM區(qū)(共256字節(jié)RAM)。1.3特殊功能寄存器MCS-51單片機(jī)共有21個(gè)字節(jié)的特殊功能寄存器用英文縮寫SFR(SpecialFuctionRegister)表示。1.用途: A累加器、狀態(tài)標(biāo)志寄存器 單片機(jī)內(nèi)部各部件專用的控制、狀態(tài)寄存器 并行口、串行口影射寄存器2.地址空間: 21個(gè)特殊功能器不連續(xù)的分布在80H~FFH128個(gè)字節(jié)地址空間,見表1-2。地址為X0H和X8H是可位尋址的寄存器,表1-2中用“*”表示。表1-2中還標(biāo)注了各SFR的名稱、字節(jié)地址、可尋址位的位地址和位名稱。21個(gè)特殊功能寄存器的名稱及主要功能介紹如下,詳細(xì)的用法見后面各節(jié)的內(nèi)容。A—累加器,自帶有全零標(biāo)志Z,A=0則Z=1;A≠0則Z=0。該標(biāo)志常用于程序分支轉(zhuǎn)移的判斷條件。B—寄存器,常用于乘除法運(yùn)算(見第2章)。PSW—程序狀態(tài)字。主要起著標(biāo)志寄存器的作用,其8位定義見表1-3。其中CY:進(jìn)/借位標(biāo)志反映最高位的進(jìn)位借位情況,加法為進(jìn)位、減法為借位。CY=1,有進(jìn)/借位;CY=0,無進(jìn)/借位。AC:輔助進(jìn)/借位標(biāo)志反映高半字節(jié)與低半字節(jié)之間的進(jìn)/借位,AC=1有進(jìn)/借位;AC=0無進(jìn)/借位。FO:用戶標(biāo)志位??捎捎脩粼O(shè)定其含義。RS1,RS0:工作寄存器組選擇位。OV:溢出標(biāo)志反映補(bǔ)碼運(yùn)算的運(yùn)算結(jié)果有無溢出有溢出OV=1,無溢出OV=0。-:無效位。P:奇偶標(biāo)志運(yùn)算結(jié)果有奇?zhèn)€“1”,P=1;運(yùn)算結(jié)果有偶個(gè)“1”,P=0。影響標(biāo)志位的指令及其影響方式見第2章。SP—堆棧指針。8XX51單片機(jī)的堆棧設(shè)在片內(nèi)RAM,對(duì)堆棧的操作包括壓入(PUSH)和彈出(POP)兩種方式,并且遵循后進(jìn)先出的原則,但在堆棧生成的方向上,與8086正好相反8XX51單片機(jī)的堆棧操作遵循先加后壓,先彈后減的順序,按字節(jié)進(jìn)行操作。此外還有如下寄存器,它們將在后面章節(jié)介紹:IP——中斷優(yōu)先級(jí)控制寄存器。IE——中斷允許控制寄存器。TMOD——定時(shí)器/計(jì)數(shù)器方式控制寄存器。TCON——定時(shí)器/計(jì)數(shù)器控制寄存器。TH0,TL0——定時(shí)器/計(jì)數(shù)器0。TH1,TH1——定時(shí)器/計(jì)數(shù)器1。SCON——串行端口控制寄存器。SBUF——串行數(shù)據(jù)緩沖器。PCON——電源控制寄存器。注:在52子系列中,高128字節(jié)RAM和SFR的地址是重疊的,究竟訪問哪一塊可通過不同的尋址方式加以區(qū)分,訪問高128字節(jié)RAM采用寄存器間址,訪問SFR則只能采用直接尋址,訪問低128字節(jié)RAM時(shí),兩種尋址均可采用。1.4時(shí)鐘電路與復(fù)位電路
內(nèi)部振蕩方式:在引腳XTAL1和XTAL2外接晶體振蕩器(簡稱晶振)如圖1-3所示。由于單片機(jī)內(nèi)部有一個(gè)高增益運(yùn)算放大器,當(dāng)外接晶振后,就構(gòu)成了自激振蕩器并產(chǎn)生振蕩時(shí)鐘脈沖。1.4.2基本時(shí)序單位單片機(jī)的時(shí)序單位有:。狀態(tài)周期:振蕩頻率經(jīng)單片機(jī)內(nèi)的二分頻器分頻后提供給片內(nèi)CPU的時(shí)鐘周期。因此,一個(gè)狀態(tài)周期包含2個(gè)振蕩周期。機(jī)器周期(MC):1個(gè)機(jī)器周期由6個(gè)狀態(tài)周期及12個(gè)振蕩周期組成。是計(jì)算機(jī)執(zhí)行一種基本操作的時(shí)間單位。4種時(shí)序單位中,振蕩周期和機(jī)器周期是單片機(jī)內(nèi)計(jì)算其他時(shí)間值(例如,波特率、定時(shí)器的定時(shí)時(shí)間等)的基本時(shí)序單位。例:單片機(jī)外接晶振頻率12MHZ時(shí)的各種時(shí)序單位:振蕩周期=1/fosc=1/12MHZ=0.0833us狀態(tài)周期=2/fosc=2/12MHZ=0.167us機(jī)器周期=12/fosc=12/12MHZ=1us指令周期=(1~4)機(jī)器周期=1~4us上電后,由于電容充電,使RST持續(xù)一段高電平時(shí)間。當(dāng)單片機(jī)已在運(yùn)行過程中時(shí),按下復(fù)位鍵也能使RST持續(xù)一段時(shí)間的高電平,從而實(shí)現(xiàn)上電且開關(guān)復(fù)位的操作。通常選擇C=10f,R=10K單片機(jī)的復(fù)位操作是使SFR寄存器進(jìn)入初始化,不改變片內(nèi)RAM區(qū)中的內(nèi)容。幾個(gè)主要特殊功能寄存器復(fù)位狀態(tài)歸納如下:PC=0000H程序計(jì)數(shù)器為零表明單片機(jī)復(fù)位后程序從0000H地址單元開始執(zhí)行。A=00H表明累加器已被清零。PSW=00H表明選寄存器0組為工作寄存器組。SP=07H表明堆棧指針指向片內(nèi)RAM07H單元,根據(jù)堆棧操作的先加后壓法則,第一個(gè)被壓入的數(shù)據(jù)被寫入08H單元中。P0~P3=FFH表明已向各端口線寫入1,各端口既可用于輸入又可用于輸出。記住一些特殊功能寄存器復(fù)位后的主要狀態(tài),對(duì)于熟悉單片機(jī)操作,減短應(yīng)用程序中的初始化部分是十分必要的。其它的特殊功能寄存器復(fù)位后的狀態(tài)見教材表1-4。1.5引腳功能各個(gè)引腳的功能說明如下:Vss:接地端。Vcc:電源端,接+5V。XTAL1,XTAL2:接外部晶體或外部時(shí)鐘。RST/VPD:①復(fù)位信號(hào)輸入。②接備用電源,當(dāng)VCC掉電后,在低功耗條件下保持內(nèi)部RAM中的數(shù)據(jù)。ALE/PROG:①ALE地址鎖存允許。ALE輸出脈沖的頻率為振蕩頻率的1/6。②PROG對(duì)8751單片機(jī)片內(nèi)EPROM編程時(shí),編程脈沖由該引腳引入。PSEN:程序存儲(chǔ)器允許。輸出讀外部程序存儲(chǔ)器的選通信號(hào)。EA/VPP:①EA=0,單片機(jī)只訪問外部程序存儲(chǔ)器。EA=1,單片機(jī)訪問內(nèi)部程序存儲(chǔ)器。②在8751單片機(jī)片內(nèi)EPROM編程期間,此引腳引入21V編程電源VPP。在增強(qiáng)型的52系列單片機(jī)中,P1.0、P1.1除為端口線外,還為定時(shí)/計(jì)數(shù)器2的外部引腳T2和T2EX。P0.0~P0.7:P0口,數(shù)據(jù)/低八位地址復(fù)用總線端口。P1.0~P1.7:P1口,靜態(tài)通用端口。P2.0~P2.7:P2口,高八位地址總線端口。P3.0~P3.7:P3口,雙功能靜態(tài)端口。1.6小單片機(jī)是集CPU、存儲(chǔ)器、I/O接口于一體的大規(guī)模集成電路芯片。MCS-51系列單片機(jī)是目前市場上應(yīng)用最廣泛的單片機(jī)機(jī)型。本章重點(diǎn)是單片機(jī)的內(nèi)部結(jié)構(gòu)和存儲(chǔ)器結(jié)構(gòu)51系列單片機(jī)內(nèi)部包含:一個(gè)8位的CPU。4KB程序存儲(chǔ)器ROM(視不同產(chǎn)品型號(hào)不同:8031內(nèi)部無ROM;8051內(nèi)部為掩模式ROM;8751為EPROM;89C51內(nèi)部為FLASHEEPROM)。128字節(jié)RAM數(shù)據(jù)存儲(chǔ)器。兩個(gè)16位定時(shí)器/計(jì)數(shù)器??蓪ぶ?4KB外部數(shù)據(jù)存儲(chǔ)器和64KB外部程序存儲(chǔ)器空間的控制電路。32條可編程的I/O線(四個(gè)8位并行I/O端口)。一個(gè)可編程全雙工串行口。具有兩個(gè)優(yōu)先級(jí)嵌套中斷結(jié)構(gòu)的五個(gè)中斷源?!镎莆?1系列單片機(jī)各存儲(chǔ)空間的地址分配,使用特點(diǎn)及數(shù)據(jù)操作方法?,F(xiàn)將此內(nèi)容歸納于教材表1-5中,此表是編程和硬件擴(kuò)展的基礎(chǔ),相當(dāng)重要,務(wù)必要熟記和掌握。MCS-51單片機(jī)的編程語言可以是匯編語言也可以是高級(jí)語言(如C語言),高級(jí)語言編程快捷,但程序長,占用存儲(chǔ)空間大,執(zhí)行慢;匯編語言產(chǎn)生的目標(biāo)程序簡短,占用存儲(chǔ)空間小,執(zhí)行快,能充分發(fā)揮計(jì)算機(jī)的硬件功能。無論是高級(jí)語言還是匯編語言,源程序都要轉(zhuǎn)換成目標(biāo)程序(機(jī)器語言)單片機(jī)才能執(zhí)行。
目前很多公司將編輯器、匯編器、編譯器、連接/定位器、符號(hào)轉(zhuǎn)換程序做成集成軟件包,用戶進(jìn)入該集成環(huán)境,編輯好程序后,只需點(diǎn)擊相應(yīng)菜單就可以完成上述的各步,如WAVE、KEIL,WAVE集成軟件的使用見附錄。匯編的方法:匯編的方法有兩種1.手工匯編:人工查指令表,查出程序中每條指令對(duì)應(yīng)的機(jī)器代碼。早期的計(jì)算機(jī)使用。2.機(jī)器匯編:用計(jì)算機(jī)中的匯編程序?qū)τ脩粼闯绦蜻M(jìn)行匯編。用機(jī)器匯編要提供給匯編一些信息,遵循匯編程序的一些約定。這些由偽指令指定。1)確定程序中每條匯編語言指令的指令機(jī)器碼2)確定每條指令在存儲(chǔ)器中的存放地址3)提供錯(cuò)誤信息 4)提供目標(biāo)執(zhí)行文件(*.OBJ/*.HEX)和列表文件(*.LST)二.偽指令常用偽指令及功能:1.起始指令ORGnn功能:定義程序或數(shù)據(jù)塊的起始地址。指示此語句后面的程序或數(shù)據(jù)塊以nn為起始地址,連續(xù)存放在程序存儲(chǔ)器中。指令地址機(jī)器碼 源程序 ORG 2000H 2000H7830 MAIN: MOVR0,#30H2002HE6 MOVA,@R0 …3.字定義標(biāo)號(hào):DW(字常數(shù)或表達(dá)式)作用:指示在程序存儲(chǔ)器中以標(biāo)號(hào)為起始地址的單元里存放的數(shù)為字?jǐn)?shù)據(jù)(即16位的二進(jìn)制數(shù)),例如:GH:DW1234H,5678H,085.等值指令標(biāo)號(hào)EQU(數(shù)值表達(dá)式)
表示EQU兩邊的量等值,用于為標(biāo)號(hào)或標(biāo)識(shí)符賦值。
例如:X1 EQU2000H
X2 EQU0FH
…
MAIN:MOVDPTR,#X1;DPTR=2000H ADDA,#X2;A=A+0FH6.位定義標(biāo)號(hào)BIT[位地址]作用:同EQU指令,不過定義的是位操作地址。例如AICBITP1.1。匯編語言程序設(shè)計(jì)步驟一.確定方案和計(jì)算方法二.了解應(yīng)用系統(tǒng)的硬件配置、性能指標(biāo)三.建立系統(tǒng)數(shù)學(xué)模型,確定控制算法和操作步驟四.合理分配存儲(chǔ)器單元和了解I/O接口地址常用程序結(jié)構(gòu)
順序程序、分支程序、
循環(huán)程序、子程序順序程序設(shè)計(jì)例3-1編程將外部數(shù)據(jù)存儲(chǔ)器的000EH和000FH單元的內(nèi)容相換。ORG0000HMOVP2,#0H;送地址高八位至P2口MOVR0,#0EH;R0=0EHMOVR1,#0FH;R1=OFHMOVXA,@R0;A=(000EH)MOV20H,A;(20H)=(000EH)MOVXA,@R1;A=(000FH)XCHA,20H;A=(000EH),(20H)=(000FH)MOVX@R1,AMOVA,20HMOVX@R0,A;交換后的數(shù)送各單元SJMP$END3.3順序程序設(shè)計(jì)順序程序(簡單程序),程序走向只有一條路徑例3-3分解壓縮式BCD碼,使其成為非壓縮式BCD碼。ORG0000HMOV R0,#40H ;設(shè)指針MOV A,@R0 ;取一個(gè)字節(jié)MOV R2,A ;暫存ANL A,#0FH ;清0高半字節(jié)INC R0MOV @R0,A ;保存數(shù)據(jù)個(gè)位例2用單片機(jī)加重力傳感器作磅秤,秤出重量后算出行李運(yùn)費(fèi)價(jià)格,其秤出的重量以10kg為1個(gè)計(jì)價(jià)單位G,G已存入40H單元。計(jì)價(jià)方法
為50kg以內(nèi)按3元,50kg以上
分段計(jì)價(jià):50kg按3元計(jì)價(jià)
,超過部分按2元計(jì)價(jià)。
由此列出算式:1.利用轉(zhuǎn)移地址表實(shí)現(xiàn)轉(zhuǎn)移例3-7根據(jù)R3的內(nèi)容轉(zhuǎn)向?qū)?yīng)的程序,R3的內(nèi)容為0~n,處理程序的入口符號(hào)地址分別為PR0~PRn(n<128)。分析:將PR0—PRn入口地址列在表格中,每一項(xiàng)占兩個(gè)單元,PRn在表中的偏移量為2n,因此將R3的內(nèi)容乘2即得PRn在表中的偏移地址,從偏移地址2n和2n+1兩個(gè)單元分別取出PRn的高八位地址和低八位地址送DPTR寄存器,用JMP@A+DPTR指令(A先清零)即轉(zhuǎn)移到PRn入口執(zhí)行。ORG0000HMOVA,R3;R3→AADDA,ACC;A*2MOVDPTR,#TABPUSHACCMOVCA,@A+DPTR;取地址表中高字節(jié)MOVB,A;暫存于BINCDPLPOPACCMOVCA,@A+DPTR;取地址表中低字節(jié)MOVDPL,AMOVDPH,B;DPTR為表中地址CLRA;A=0JMP@A+DPTR;轉(zhuǎn)移TAB:DWPR0,PR1,PR2,…..,PRn;轉(zhuǎn)移地址表END2.利用轉(zhuǎn)移指令表實(shí)現(xiàn)轉(zhuǎn)移例3-8設(shè)有五個(gè)按鍵0、1、2、3、4其編碼分別為3AH、47H、65H、70H、8BH,要求根據(jù)按下的鍵轉(zhuǎn)向不同的處理程序,分別為PR0、PR1//PR2、PR3、PR4,設(shè)按鍵的編碼已在B寄存器中,編出程序。AJMPPR0的機(jī)器碼為2110H,PR1入口地址為0220HAJMPPR1的機(jī)器碼為4120H,轉(zhuǎn)移指令表JPT的內(nèi)容如下所示。設(shè)B=65H,鍵值為2:ORG0000HMOVDPTR,#TAB;置鍵碼表首址MOVA,#0;表的起始位的偏移量為0NEXT:PUSHACCMOVCA,@A+DPTR;A=鍵碼表的編碼CJNEA,B,AGAN;將B中值和鍵碼表的值比較POPACCRLA;如相等,序號(hào)乘2得分支表內(nèi)偏移量MOVDPTR,#JPT;置分支表首址JMP@A+DPTRAGAN:POPACC;不相等比較下一個(gè)INCA;序號(hào)加1CJNEA,#5,NEXTSJMP$;鍵碼查完還沒有B中按鍵編碼程序結(jié)束JPT:AJMPPR0;分支轉(zhuǎn)移表AJMPPR1AJMPPR2AJMPPR3AJMPPR4TAB:DB3AH,47H,65H,70H,8BH;鍵碼表END例3-9設(shè)計(jì)一個(gè)延時(shí)10ms的延時(shí)子程序,已知單片機(jī)使用的晶振為6MHz。分析:延時(shí)時(shí)間與兩個(gè)因素有關(guān):晶振頻率和循環(huán)次數(shù)。由于晶振采用6MHz,一個(gè)機(jī)器周期是2μs,用單循環(huán)可以實(shí)現(xiàn)1ms延時(shí),外循環(huán)10次即可達(dá)10ms延時(shí)。內(nèi)循環(huán)如何實(shí)現(xiàn)1ms延時(shí)呢,程序中可先以未知數(shù)MT代替,從附錄A查每條指令機(jī)器周期計(jì)算程序的執(zhí)行時(shí)間。ORG0020HMOVR0,#0AH;外循環(huán)10次DL2:MOVR1,#MT;內(nèi)循環(huán)MT次DL1:NOPNOP;空操作指令DJNZR1,DL1DJNZR0,DL2
RET例3-10編寫多字節(jié)數(shù)×10程序。
內(nèi)部RAM以20H為首址的一片單元中存放著一個(gè)多字節(jié)符號(hào)數(shù),字節(jié)數(shù)存放在R7中,存放方式為低位字節(jié)在低地址,高位字節(jié)在高地址,要求乘10后的積仍存放在這一片單元中。
分析用R1作該多字節(jié)的
地址指針,部分積的低位仍
存放于本單元,部分積的高
位存放于R2,以便和下一
位的部分積的低位相加。
以R7作字節(jié)數(shù)計(jì)數(shù)。
編程如下:
ORG0000HCLRC;清進(jìn)位位CMOVR1,#20H;R1指示地址MOVR2,#00H;存積的高八位寄存器R2清0S10:MOVA,@R1;取一字節(jié)送AMOVB,#0AH;10送BPUSHPSWMULAB;字節(jié)乘10POPPSWADDCA,R2;上次積高八位加本次積低八位MOV@R1,A;送原存儲(chǔ)單元MOVR2,B;積的高八位送R2INCR1;指向下一字節(jié)DJNZR7,S10;未乘完去SH10,否則向下執(zhí)行MOV@R1,B;存最高字節(jié)積的高位SJMP$例如1223650989比較大小MCS-51單片機(jī)有著優(yōu)異的位邏輯功能,可以方便的實(shí)現(xiàn)各種復(fù)雜的邏輯運(yùn)算.這種用軟件替代硬件的方法,可以大大簡化甚至完全不用硬件,但比硬件要多花運(yùn)算時(shí)間。例3-17編寫一程序,以實(shí)現(xiàn)圖3-4中的邏輯運(yùn)算電路.程序如下:START:MOVC,P2.2ORLC,TF0ANLC,P1.1MOVF0,CMOVC,IE1ORLC,/25HANLC,F0ANLC,/26HMOVP1.3,CSJMP$例3-18設(shè)累加器A的各位ACC.0~ACC.7分別記為X0~X7,編制程序用軟件實(shí)現(xiàn)下式:
Y=X0X1X2+X0X1X2+X0X1X2X3+X4X5X6X7X0BITACC.0X1BITACC.1X2BITACC.2X3BITACC.3X4BITACC.4X5BITACC.5X6BITACC.6X7BITACC.7ORG0000HMOVC,X0ANLC,X1ANLC,X2MOV00H,C;X0X1X2MOVC,X0ANLC,/X1MOV01H,C;X0X1ANLC,/X2ORLC,00HMOV00H,CMOVC,X2ANLC,01HANLC,X3;X0X1X2X3ORLC,/00HMOV00H,CMOVC,X7ANLC,/X6ANLC,/X5ANLC,/X4;X4X5X6X7ORLC,00H;最終結(jié)果Y→CSJMP$子程序是構(gòu)成單片機(jī)應(yīng)用程序必不可少的部分,通過ACALL和LCALL兩條子程序調(diào)用指令,可以十分方便地用來調(diào)用任何地址處的子程序。子程序節(jié)省占用的存儲(chǔ)單元,使程序簡短、清晰,善于靈活的使用子程序,是程序設(shè)計(jì)的重要技巧之一。子程序必須以RET指令結(jié)尾.在調(diào)用子程序時(shí),有以下幾點(diǎn)應(yīng)注意:1)保護(hù)現(xiàn)場。如果在調(diào)用前主程序已經(jīng)使用了某些存儲(chǔ)單元或寄存器,在調(diào)用時(shí),這些寄存器和存儲(chǔ)單元又有其他用途,就應(yīng)先把這些單元或寄存器中的內(nèi)容壓入堆棧保護(hù),調(diào)用完后再從堆棧中彈出以便加以恢復(fù)。如果有較多的寄存器要保護(hù),應(yīng)使主、子程序使用不同的寄存器組。2)設(shè)置入口參數(shù)和出口參數(shù)。用之前主程序要按子程序的要求設(shè)置好地址單元或存儲(chǔ)器(稱為入口參數(shù)),以便子程序從指定的地址單元或存儲(chǔ)器獲得輸入數(shù)據(jù);子程序經(jīng)運(yùn)算或處理后的結(jié)果存放到指定的地址單元或寄存器(稱為出口參數(shù)),主程序調(diào)用后從指定的地址單元或寄存器讀取運(yùn)算或處理后的結(jié)果,只有這樣,才能完成子程序和主程序間的數(shù)據(jù)的正確傳遞。3)子程序中可包括對(duì)另外子程序的調(diào)用,稱為子程序嵌套。主程序:ORG0000HMOVSP,#3FHMOVA,31H;取aLCALLSQR;求a方MOVR1,AMOVA,32H;取bLCALLSQR;求b方ADDA,R1;求和DAA;調(diào)整MOV33H,AMOVA,#0ADDCA,#0MOV34H,ASJMP$子程序:ORG0030HSQR:INCAMOVCA,@A+PCRETTAB:DB00H,01H,04HDB09H16H,25H,DB36H,49H64H,81HEND3.8小結(jié)1、程序設(shè)計(jì)的關(guān)鍵在于指令熟悉和算法(思路)正確、清晰,對(duì)復(fù)雜的程序應(yīng)先畫出流程圖。只有多做練習(xí)多上機(jī)調(diào)試,熟能生巧,才能編出高質(zhì)量的程序。2、偽指令是非執(zhí)行指令,提供匯編程序以匯編信息,應(yīng)正確使用。3、本章應(yīng)掌握順序程序、分支程序、循環(huán)程序、子程序等各類程序的設(shè)計(jì)方法,并能熟練應(yīng)用查表技術(shù)簡化程序的設(shè)計(jì)。PO口—1.作為輸入/輸出口。2.作為地址/數(shù)據(jù)總線,接外圍芯片時(shí)PO口分時(shí)輸出低8位地址與數(shù)據(jù)信號(hào)。P1口—1.作為輸入/輸出口。2.在增強(qiáng)型(52系列)和ISP型(在系統(tǒng)編程型)中有如下功能:4.1.1.2端口的內(nèi)部結(jié)構(gòu)四個(gè)端口的一位結(jié)構(gòu)見圖5.1,同一個(gè)端口的各位具有相同的結(jié)構(gòu)。由圖可見,四個(gè)端口的結(jié)構(gòu)有相同之處:PO作I/O口使用CPU發(fā)控制電平“0”封鎖與門,使T1管截止,同時(shí)使MUX開關(guān)同下面的觸點(diǎn)接通,使鎖存器的Q與T2柵極接通。當(dāng)CPU向端口輸出數(shù)據(jù)時(shí),寫脈沖加在鎖存器的CL上、內(nèi)部總線的數(shù)據(jù)經(jīng)反相,再經(jīng)T2管反相,PO口的這一位引腳上出現(xiàn)正好和內(nèi)部總線同相的數(shù)據(jù)。由于輸出驅(qū)動(dòng)級(jí)是漏極開路電路(因T1截止),在作I/O口使用時(shí)應(yīng)外接10K的上拉電阻。當(dāng)輸入操作時(shí),端口中兩個(gè)三態(tài)緩沖器用于讀操作。緩沖器2用于讀端口引腳的數(shù)據(jù)。當(dāng)執(zhí)行端口讀指令時(shí),讀引腳脈沖打開三態(tài)緩沖器2,于是端口引腳數(shù)據(jù)經(jīng)三態(tài)緩沖器2送到內(nèi)部總線。緩沖器1用于讀取鎖存器Q端的數(shù)據(jù)。當(dāng)執(zhí)行“讀-修改-寫”指令(即讀端口信息,在片內(nèi)加以運(yùn)算修改后,再輸出到該端口的某些指令如:ANLPO,A指令),即是讀的鎖存器Q的數(shù)據(jù)。這是為了避免錯(cuò)讀引腳的電平信號(hào),例如用一根口線去驅(qū)動(dòng)一個(gè)晶體管基極,當(dāng)向口線寫“1”,晶體管導(dǎo)通,導(dǎo)通的PN結(jié)會(huì)把引腳的電平拉低,如讀引腳數(shù)據(jù),則會(huì)讀為0,而實(shí)際上原口線的數(shù)據(jù)為1。因而采用讀鎖存器Q的值而避免了錯(cuò)讀。究竟是讀引腳還是讀鎖存器,CPU內(nèi)部會(huì)自行判斷是發(fā)讀引腳脈沖還是讀鎖存器脈沖,讀者不必在意。應(yīng)注意,當(dāng)作輸入端口使用時(shí),應(yīng)先對(duì)該口寫入“1”使場效應(yīng)管T2截止,再進(jìn)行讀入操作,以防場效應(yīng)管處于導(dǎo)通狀態(tài),使引腳箝位到零,而引起誤讀。當(dāng)PO口作地址/數(shù)據(jù)線使用時(shí),CPU及內(nèi)部控制信號(hào)為“1”,轉(zhuǎn)換開關(guān)MUX打向上面的觸點(diǎn),使反相器的輸出端和T2管柵極接通,輸出的地址或數(shù)據(jù)信號(hào)通過與門驅(qū)動(dòng)T1管,同時(shí)通過反相器驅(qū)動(dòng)T2管完成信息傳送,數(shù)據(jù)輸入時(shí),通過緩沖器進(jìn)入內(nèi)部總線。當(dāng)擴(kuò)展片外存貯器時(shí),MUX開關(guān)打向右,P2口作高八位地址線輸出高八位地址信號(hào)。其MUX的的倒向是受CPU內(nèi)部控制的。應(yīng)當(dāng)注意:當(dāng)P2口的幾位作地址線使用時(shí),剩下的P2口線不能作I/O口線使用。歸納四個(gè)并行口使用的注意事項(xiàng)如下:1.如果單片機(jī)內(nèi)部有程序存貯器,不需要擴(kuò)展外部存貯器和I/O接口,單片機(jī)的四個(gè)口均可作I/O口使用。2.四個(gè)口在作輸入口使用時(shí),均應(yīng)先對(duì)其寫“1”3.P0口作I/O口使用時(shí)應(yīng)外接10K的上拉電阻,其它口則可不必。4.P2可某幾根線作地址使用時(shí),剩下的線不能作I/O口線使用。5.P3口的某些口線作第二功能時(shí),剩下的口線可以單獨(dú)作I/O口線使用。4.1.2編程舉例下面舉例說明端口的輸入、輸出功能,其他功能的應(yīng)用實(shí)例在后面章節(jié)說明。例4-1.設(shè)計(jì)一電路,監(jiān)視某開關(guān)K,用發(fā)光二極管LED顯示開關(guān)狀態(tài),如果開關(guān)合上,LED亮、開關(guān)打開,LED熄滅。分析:設(shè)計(jì)電路如圖5.2如示。開關(guān)接在P1.1口線,LED接P1.0口線,當(dāng)開關(guān)斷開時(shí),P1.1為+5V,對(duì)應(yīng)數(shù)字量為“1”,開關(guān)合上時(shí)P1.1電平為0V,對(duì)應(yīng)數(shù)字量為“0”,這樣就可以用JB指令對(duì)開關(guān)狀態(tài)進(jìn)行檢測(cè)。編程如下:CLRP1.0;使發(fā)光二極管滅AGA:SETBP1.1;先對(duì)P1口寫入“1”JBP1.1,LIG;開關(guān)開,轉(zhuǎn)LIGSETBP1.0;開關(guān)合上,二極管亮SJMPAGALIG:CLRP1.0;開關(guān)開,二極管滅SJMPAGA例4-2.在下圖中P1.4~P1.7接四個(gè)發(fā)光二極管LED,P1.0~P1.3接四個(gè)開關(guān),編程將開關(guān)的狀態(tài)反映到發(fā)光二極管上。上述程序中每次讀開關(guān)之前,輸入位都先置“1”,保證了開關(guān)狀態(tài)的正確讀入。編程如下:ORG0000HABC:MOVP1,#0FFH;高四位滅,低四位送“1MOVA,P1;讀P1口引腳開關(guān)狀態(tài)至ASWAPA;低四位開關(guān)狀態(tài)轉(zhuǎn)換到高四位ANLA,#0F0H;保留高四位MOVP1,A;從P1口輸出SJMPABC;循環(huán)例3.用P1.0輸出1KHz和500Hz的音頻信號(hào)驅(qū)動(dòng)揚(yáng)聲器,作報(bào)警信號(hào),要求1KHz信號(hào)響100ms,500Hz信號(hào)響200ms,交替進(jìn)行,P1.7接一開關(guān)進(jìn)行控制,當(dāng)開關(guān)合上響報(bào)警信號(hào),當(dāng)開關(guān)斷開告警信號(hào)停止,編出程序。分析:500Hz信號(hào)周期為2ms,信號(hào)電平為每1ms變反1次。1KHz的信號(hào)周期為1ms,信號(hào)電平每500μS變反1次,編一個(gè)延時(shí)500μS子程序,延時(shí)1ms只需調(diào)用2次。用R2控制音響時(shí)間長短,A作音響頻率的交換控制的標(biāo)志。A=FF時(shí)產(chǎn)生1KHz信號(hào),A=0時(shí)產(chǎn)生500Hz信號(hào)。ORG0000HCLRA;A作1KHz,500Hz轉(zhuǎn)換控制BEG:JBP1.7,$;檢測(cè)P1.7的開關(guān)狀態(tài)MOVR2,#200;開關(guān)閉合報(bào)警,R2控制音響時(shí)間DV:CPLP1.0CJNEA,#0FFH,N1;A≠FFH,延時(shí)500μSACALLD500;A=FFH;延時(shí)1msP1.0變反N1:ACALLD500DJNZR2,DVCPLASJMPBEGD500:MOVR7,#250;延時(shí)500μS子程序DJNZR7,$RETEND4.1.3用并行口設(shè)計(jì)LED數(shù)碼顯示器和鍵盤電路鍵盤和顯示器是單片機(jī)應(yīng)用系統(tǒng)中常用的輸入輸出裝置。LED數(shù)碼顯示器是常用的顯示器之一,下面介紹用單片機(jī)并行口設(shè)計(jì)LED數(shù)碼顯示電路和鍵盤電路的方法。4.1.3.1用并行口設(shè)計(jì)LED顯示電路1.LED顯示器及其原理LED有著顯示亮度高,響應(yīng)速度快的特點(diǎn),最常用的是七段式LED顯示器,又稱數(shù)碼管。七段LED顯示器內(nèi)部由七個(gè)條形發(fā)光二極管和一個(gè)小圓點(diǎn)發(fā)光二極管組成,根據(jù)各管的亮暗組合成字符。常見LED的管腳排列見圖4(a)。其中COM為公共點(diǎn),根據(jù)內(nèi)部發(fā)光二極管的接線形式,可分成共陰極型圖4(b)和共陽極型圖4(c)。LED數(shù)碼管的g~a七個(gè)發(fā)光二極管因加正電壓而發(fā)亮,因加零電壓而不能發(fā)亮,不同亮暗的組合就能形成不同的字形,這種組合稱之為字形碼,顯然共陽極和共陰極的字形碼是不同的,其字形碼見下表。LED數(shù)碼管每段需10~20ma的驅(qū)動(dòng)電流,可用TTL或CMOS器件驅(qū)動(dòng)。字形碼的控制輸出可采用硬件譯碼方式,如采用BCD7段譯碼/驅(qū)動(dòng)器74LS48、74LS49、CD4511(共陰極)或74LS46、74LS47、CD4513(其陽極)也可用軟件查表方式輸出。2.LED數(shù)碼管的接口數(shù)碼管的接口有靜態(tài)接口和動(dòng)態(tài)接口。靜態(tài)接口為固定顯示方式,無閃爍,其電路可采用一個(gè)并行口接一個(gè)數(shù)據(jù)管,數(shù)碼管的公共端按共陰或共陽分別接地或Vcc。這種接法占用接口多,如果PO口和P2口要用作數(shù)據(jù)線和地址線,僅用單片機(jī)的并行口就只能接二個(gè)數(shù)碼管。也可以用串行接口的方法接多個(gè)數(shù)碼管,使之靜態(tài)顯示.動(dòng)態(tài)接口采用各數(shù)碼管循環(huán)輪流顯示的方法,當(dāng)循環(huán)顯示頻率較高時(shí),利用人眼的暫留特性,看不出閃爍顯示現(xiàn)象,這種顯示需要一個(gè)接口完成字形碼的輸出(字形選擇),另一接口完成各數(shù)碼管的輪流點(diǎn)亮(數(shù)位選擇)。例如圖5是接有五個(gè)共陰極數(shù)碼管的動(dòng)態(tài)顯示接口電路,用74LS373接成直通的方式作驅(qū)動(dòng)電路,陰極用非門74LS04反相門驅(qū)動(dòng),字形選擇由P1口提供,位選擇由P3口控制。當(dāng)P3.0~P3.4輪流輸出1時(shí),五個(gè)數(shù)碼管輪流顯示。P1.7接開關(guān),當(dāng)開關(guān)打向位置“1”時(shí),顯示“12345”字樣,當(dāng)開關(guān)打向“2”時(shí),顯示“HELLO”字樣,程序清單如下:用匯編語言編程ORG0000HMOVP3,#0;清顯示TEST:SETBP1.7JBP1.7,DIR1;檢測(cè)開關(guān)MOVDPTR,#TAB1;開關(guān)置于1,‘12345’SJMPDIRDIR1:MOVDPTR,#TAB2;開關(guān)置于2,“HELLO”字形表頭DIR:MOVR0,#0;R0存字形表偏移量MOVR1,#01;R1置數(shù)碼表位選代碼NEXT:MOVA,R0MOVCA,@A+DPTR;查字形碼表1MOVP1,A;送P1口輸出MOVA,R1MOVP3,A;輸出位選碼ACALLDAY;延時(shí)INCR0;指向下一位字形RLA;指向下一位MOVR1,ACJNER1,#20H,NEXT;五個(gè)數(shù)碼管顯示完?SJMPTESTDAY:MOVR6,#20;延時(shí)20ms子程序DL2:MOVR7,#7DHDL1:NOPNOP4.1.3.2用并行口設(shè)計(jì)鍵盤電路鍵盤是計(jì)算機(jī)系統(tǒng)中不可缺少的輸入設(shè)備,當(dāng)按鍵少時(shí)可接成線性鍵盤(如圖5.3中的按鍵),當(dāng)按鍵較多時(shí),這樣的接法占用口線較多。將按鍵接成矩陣的形式,可以節(jié)省口線,例如兩個(gè)接口可按8*8的形式接64個(gè)按鍵。每個(gè)按鍵有它的行值和列值,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和CPU通信。每個(gè)按鍵的狀態(tài)同樣需變成數(shù)字量“0”和“1”,開關(guān)的一端通過電阻接Vcc(列)、而接地是通過程序輸出數(shù)字“0”實(shí)現(xiàn)的。鍵盤處理程序的任務(wù)是: 確定有無鍵按下; 判哪一個(gè)鍵按下, 鍵的功能是什么; 還要消除按鍵在閉合或斷開時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地(稱行掃描),另一個(gè)并行口輸入按鍵狀態(tài)(稱回饋信號(hào),鍵盤的列值),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵、通過軟件查表,查出該鍵的功能。也可由硬件編碼器完成鍵的編碼。下圖中,用8XX51的并行口P1接4×4矩陣鍵盤,以P1.0~P1.3作輸出線,以P1.4~P1.7作輸入線,鍵盤掃描程序的流程如圖5.7所示。對(duì)鍵盤的程序流程圖5.7說明如下:當(dāng)P1.0~P1.3輸出0時(shí),如無鍵按下,P1.4~P1.7的輸入值均為“1”,如果其中有一個(gè)不是“1”,說明有鍵按下,再使P1.0~P1.3逐個(gè)輸出零(行掃描),檢查P1.4~P1.7的輸入值有無零,從而查出是哪行哪列的鍵按下。在判按鍵時(shí),按鍵有抖動(dòng),可采用延時(shí)后再重讀以跳過抖動(dòng)時(shí)段(也可用R-S觸發(fā)器閂鎖電路硬件消抖,但這樣電路復(fù)雜,在矩陣鍵盤中不采用)。程序清單如下:ORG0000HTEST:MOVP1,#0F0H;P1.0~P1.3輸出0,P1.4~P1.7輸出1,作輸入位MOVA,P1;讀鍵盤,檢測(cè)有無鍵按下ANLA,#0F0H;屏蔽P1.0~P1.3,檢測(cè)P1.4~P1.是否全為1CJNEA,#0F0H,HAVE;P1.4~P1.7不全為1,有鍵按下SJMPTEST;P1.4~P1.7全為1,無鍵按下,重檢測(cè)鍵盤HAVE:MOVA,#0FE;有鍵按下,逐行掃描鍵盤,置掃描初值A(chǔ)READ:MOVA,P1;再讀鍵盤ANLA,#0F0H;屏蔽P1.0~P1.3,保留P1.4~P1.7(列碼)MOVR2,A;暫存列碼MOVA,BANLA,#0FH;取行掃描碼ORLA,R2;行碼、列碼合并為鍵編碼YES1:MOVB,A;鍵編碼存于BLJMPSAM38;轉(zhuǎn)鍵分析處理程序(見例3-8)…例如圖5-6中的“a”鍵,當(dāng)行掃描值sccode=feH=11111110B,讀入列值到P1口和f0H相與即保留高四位讀入值,屏蔽了低四位,再和0fh相或得recole=dfH=11011111B.sccode+recode=00100001B,所以“a”鍵的編碼21H,此值是A的鍵碼,同樣可得“5”鍵編碼為01000100B即44H,由此可將每個(gè)按鍵的編碼排出來,通過查表程序轉(zhuǎn)不同的按鍵處理程序。此程序部分請(qǐng)讀者自行編出。該程序同樣可用匯編語言編出。4.1.4并行接口小結(jié)1.四個(gè)并行口均可作為輸入輸出接口使用,但又有各自的特點(diǎn)。因PO口是數(shù)據(jù)線和低八位的地址線,因此不用它作輸入/輸出接口,而是用它傳輸數(shù)據(jù)和低八位的地址信息,除非在不接其他外圍芯片的情況下才作I/O接口使用,此時(shí)由于內(nèi)部漏極開路,需外接上拉電阻。四個(gè)口的使用特點(diǎn)是本章的重點(diǎn)。3.在應(yīng)用設(shè)計(jì)中應(yīng)理解,計(jì)算機(jī)內(nèi)由數(shù)字電路組成只存在兩種TTL電平,高電平3.5~5V和低電平0V,對(duì)應(yīng)著的數(shù)字為“1”和“0” 外設(shè)的狀態(tài)要通過電路轉(zhuǎn)換成高、低電平,計(jì)算機(jī)才能識(shí)別(如開關(guān)電路)。 計(jì)算機(jī)輸出數(shù)據(jù)“1”即輸出3.5V~5V,輸出數(shù)據(jù)“0”即輸出0V,根據(jù)外設(shè)需要的電平要求輸出“1”或“0”數(shù)據(jù),這就是程序控制外設(shè)的本質(zhì)。4.2.2.2中斷控制的有關(guān)寄存器(3)中斷優(yōu)先級(jí)管理寄存器IPMCS_51系列單片機(jī)的中斷結(jié)構(gòu)如圖所示。4.2.2中斷響應(yīng)過程4.2.3中斷的程序設(shè)計(jì)5.2串行接口★51系列單片機(jī)片內(nèi)有二個(gè)十六位定時(shí)/計(jì)數(shù)器:定時(shí)器0(T0)和定時(shí)器1(T1)?!飪蓚€(gè)定時(shí)器都有定時(shí)或事件計(jì)數(shù)的功能,可用于定時(shí)控制、延時(shí)、對(duì)外部事件計(jì)數(shù)和檢測(cè)等場合★定時(shí)/計(jì)數(shù)器實(shí)際上是16位加1計(jì)數(shù)器。T0由2個(gè)8位持殊功能寄存器TH0和TL0構(gòu)成,T1由2個(gè)8位持殊功能寄存器TH1和TL1構(gòu)成?!锩總€(gè)定時(shí)器都可由軟件設(shè)置為定時(shí)工作方式或計(jì)數(shù)工作方式。★T0和T1受特殊功能寄存器TMOD和TCON控制。1.定時(shí)工作方式★設(shè)置為定時(shí)工作方式時(shí),定時(shí)器計(jì)數(shù)的脈沖是由51單片機(jī)片內(nèi)振蕩器經(jīng)12分頻后產(chǎn)生的?!锩拷?jīng)過一個(gè)機(jī)器周期定時(shí)器(T0或T1)的數(shù)值加1直至計(jì)數(shù)滿產(chǎn)生溢出。如:當(dāng)8051采用12MHz晶體時(shí),每個(gè)機(jī)器周期為1μs,計(jì)5個(gè)機(jī)器周期即為5μs,即定時(shí)5μs。2.計(jì)數(shù)工作方式★設(shè)置為計(jì)數(shù)工作方式時(shí),通過引腳T0(P3.4)和T1(P3.5)對(duì)外部脈沖信號(hào)計(jì)數(shù)。★當(dāng)輸入脈沖信號(hào)產(chǎn)生由1至0的下降沿時(shí),定時(shí)器的值加1,在每個(gè)機(jī)器周期CPU采樣T0和T1的輸入電平。若前一個(gè)機(jī)器周期采樣值為高,下一個(gè)機(jī)器周期采樣值為低,則計(jì)數(shù)器加1。★由于檢測(cè)一個(gè)1至0的跳變需要二個(gè)機(jī)器周期,故最高計(jì)數(shù)頻率為振蕩頻率的二十四分之一?!镫m然對(duì)輸入信號(hào)的占空比無特殊要求,但為了確保某個(gè)電平在變化之前至少被采樣一次,要求電平保持時(shí)間至少是一個(gè)完整的機(jī)器周期。★GATE:門控信號(hào)GATE=0,TRx=1時(shí)即可啟動(dòng)定時(shí)器工作;GATE=1,INTx=1才可啟動(dòng)定時(shí)器工作?!顲/T:定時(shí)器/計(jì)數(shù)器選擇位C/T=1,為計(jì)數(shù)器方式;C/T=0,為定時(shí)器方式?!颩1M0工作模式選擇位M1M0=00工作方式0(13位方式)。M1M0=01工作方式1(16位方式)。M1M0=10工作方式2(8位自動(dòng)再裝入方式)。M1M0=11工作方式3(T0為2個(gè)8位方式)。★TF0:T0溢出中斷請(qǐng)求標(biāo)志。TF0=1,T0有溢出中斷請(qǐng)求。TF0=0,T0無溢出中斷請(qǐng)求。★TR0:T0運(yùn)行控制位。TR0=1,啟動(dòng)T0工作。TR0=0,停止T0工作?!锒〞r(shí)、計(jì)數(shù)溢出否可查詢TF0是否置位,如果開中斷則產(chǎn)生溢出中斷。ORG0000HMAIN:CLRP1.7SETBP1.0MOVTMOD,#61HMOVTH1,#0FBHMOVTL1,#0FBHSETBTR1LOOP1:CPLP1.7LOOP2:MOVTH0,#3CHMOVTL0,#0B0HSETBTR0LOOP3:JBCTF0,LOOP4SJMPLOOP3LOOP4:CPLP1.0JBCTF1,LOOP1AJMPLOOP2END方法2:T0每隔100ms中斷一次,利用軟件對(duì)T0的中斷次數(shù)進(jìn)行計(jì)數(shù),中斷10次即實(shí)現(xiàn)了1秒的定時(shí)。ORG000BH;T0中斷服務(wù)程序入口AJMPIP0ORG0030H;主程序開始MAIN:CLRP1.7;T0定時(shí)100msMOVTMOD,#01HMOVTH0,#3CHMOVTL0,#0B0HSETBET0SETBEAMOVR4,#0AH;中斷10次計(jì)數(shù)SETBTR0SJMP$;等待中斷IP0:DJNZR4,RET0;MOVR4,#0AHCPLP1.7RET0:MOVTH0,#3CHMOVTL0,#0B0HSETBTR0RETI例5-3有P3.4引腳(T0)輸入一低頻信號(hào)(其小于0.5kHZ),要求P3.4每發(fā)生一次負(fù)跳變時(shí),P1.0輸出一個(gè)500us同步負(fù)脈沖,同時(shí)P1.1輸出一個(gè)1ms的同步正脈沖。已知晶振頻率為6MHZ。MOVTH0,#06H;重置定時(shí)初值MOVTL0,#06HSETBP1.1;P1.1置1CLRP1.0;P1.0清0SETBTR0;啟動(dòng)定時(shí)計(jì)數(shù)器DEL2:JBCTF0,RESP2;檢測(cè)第一次500us到否AJMPDEL2RESP:SETBP1.0;P1.0恢復(fù)1DEL3:JBCTF0,RESP3;檢測(cè)第二次500us到否AJMPDEL3RESP3:CLRP1.1;P1.1復(fù)0CLRTR0AJMPBEGIN5.1.4.4門控位的應(yīng)用門控位GATE為1時(shí),TRx=1,INTx=1才能啟動(dòng)定時(shí)器。利用這個(gè)特性可以測(cè)量外部輸入脈沖的寬度。例7-4利用T0門控位測(cè)試INT0引腳上出現(xiàn)的正脈沖寬度,已知晶振頻率為12MHz,將所測(cè)得值最高位存入片內(nèi)71H單元,低位存入70H單元。解:設(shè)外部脈沖由(P3.2)輸入,T0工作于定時(shí)方式1(16位計(jì)數(shù)),GATE設(shè)為1。測(cè)試時(shí),應(yīng)在INT0低電平時(shí),設(shè)置TR0為1(16位計(jì)數(shù));當(dāng)INT0變?yōu)楦唠娖綍r(shí),就啟動(dòng)計(jì)數(shù);再次變低時(shí),停止計(jì)數(shù)。此計(jì)數(shù)值與機(jī)器周期的乘積即為被測(cè)正脈沖的寬度。因fosc=12MHZ,機(jī)器周期為1us,測(cè)試過程如下。源程序如下:MOVTMOD,#09H;設(shè)T0為方式1MOVTL0,#00H;設(shè)計(jì)初值取最大值MOVTH0,#00HMOVR0,#70HJBP3.2,$;等P3.2(INT0)變低SETBTR0;啟動(dòng)T0準(zhǔn)備工作JNBP3.2,$;等待P3.2(INT0)JBP3.2,$;等待P3.2(INT0)CLRTR0;停止計(jì)數(shù)MOV@R0,TL0;存放結(jié)果INCR0MOV@R0,TH0SJMP$讀者不難編出C語言程序。這種方案被測(cè)脈沖的寬度最大為65535個(gè)機(jī)器周期。由于靠軟件啟動(dòng)和停止計(jì)數(shù),有一定的測(cè)量誤差。其可能的最大誤差與指令的執(zhí)行時(shí)間有關(guān)。此例中,在讀取定時(shí)器的計(jì)數(shù)之前,已把它停住。但在某些情況下,不希望在讀計(jì)數(shù)值時(shí)打斷定時(shí)的過程,由于我們不可能在同一時(shí)刻讀取THX和TLX的內(nèi)容。讀取一個(gè)時(shí)恰好另一個(gè)產(chǎn)生溢出,在這種情況下,讀取的計(jì)數(shù)值有可能是錯(cuò)的。可以解決錯(cuò)讀的方法是:先讀THX后讀TLX,若兩次讀得的THx沒有發(fā)生變化,則可確定讀到的內(nèi)容是正確的。若前后兩次讀到的THx有變化,則再重復(fù)上述過程,重復(fù)讀到的內(nèi)容就應(yīng)該是正確的了。下面是按此?-思路編寫的程序段,讀到的TH0和TL0放在R1和R0內(nèi): RP:MOVA,TH0;MOVR0,TL0;CJNEA,TH0,RP;MOVR1,A5.1.5小定時(shí)計(jì)數(shù)器應(yīng)用非常廣泛,如定時(shí)采樣、時(shí)間測(cè)量、產(chǎn)生音響、作脈沖源、制作日歷時(shí)鐘、測(cè)量波形的頻率和占空比、檢測(cè)電機(jī)轉(zhuǎn)速等。因此應(yīng)很好掌握。★51系列單片機(jī)既有兩個(gè)16位的定時(shí)計(jì)數(shù)器,有四種不同的工作方式,歸納于下表:5.2.1概述
單片機(jī)應(yīng)用與數(shù)據(jù)采集或工業(yè)控制時(shí),往往作為前端機(jī)安裝在工業(yè)現(xiàn)場,遠(yuǎn)離主機(jī),現(xiàn)場數(shù)據(jù)采用串行通信方式發(fā)往主機(jī)進(jìn)行處理,以降低通信成本,提高通信可靠性。如下圖所示。★串行通信的分類:同步串行通信和異步串行通信
一、異步通信:通信的雙方應(yīng)該有一個(gè)約定,什么時(shí)候開始發(fā)送,什么時(shí)候發(fā)送完畢;接收方收到的信息是否正確等,這就是通信協(xié)議。異步串行通信一幀數(shù)據(jù)格式:一個(gè)起始位“0”,表示字符的開始,然后是5~8位數(shù)據(jù)即該字符的代碼,規(guī)定低位在前,高位在后,接下來是奇偶校驗(yàn)位(可省略),最后以停止位“1”表示字符的結(jié)束。優(yōu)點(diǎn):硬件結(jié)構(gòu)簡單。缺點(diǎn):傳輸速度慢。三、單工、半雙工、全雙工通信方式1.實(shí)現(xiàn)數(shù)據(jù)格式化
因?yàn)镃PU發(fā)出的數(shù)據(jù)是并行數(shù)據(jù),接口電路應(yīng)實(shí)現(xiàn)不同串行通信方式下的數(shù)據(jù)格式化任務(wù),如自動(dòng)生成起止方式的幀數(shù)據(jù)格式(異步方式)或在待傳送的數(shù)據(jù)塊前加上同步字符等。51系列單片機(jī)內(nèi)有一個(gè)全雙工的異步通信接口,通過對(duì)串行接口寫控制字可以選擇其數(shù)據(jù)格式,同時(shí)內(nèi)部有波特率發(fā)生器,提供可選的波特率,可完成雙機(jī)通信或多機(jī)通信。(一)通信線的連接
通信速率和通信距離這兩個(gè)方面是相互制約的,降低通信速率,可以提高通信距離.
不同的通信距離,串行通信電路有不同的連接方法。(二)串行通信接口總線標(biāo)準(zhǔn)(三)RS-232CMCS—51之間的雙機(jī)通信單片機(jī)串行口的結(jié)構(gòu)與工作原理串行控制寄存器SCON用以存放串行口的控制和狀態(tài)信息。8XX51串行口正是通過對(duì)上述專用寄存器的設(shè)置、檢測(cè)與讀取來管理串行通信的。特殊功能寄存器PCON的最高位SMOD為串行口波特率的倍增控制位。波特率發(fā)生器可以有兩種選擇:1.定時(shí)器T1作波特率發(fā)生器,改變計(jì)數(shù)初值就可以改變串行通信的速率,稱為可變波特率。2.以內(nèi)部時(shí)鐘的分頻器作波特率發(fā)生器,因內(nèi)部時(shí)鐘頻率一定,稱為固定波特率5.2.5串行口的應(yīng)用編程串行口的波特率有兩種方式:固定波特率可變波特率注意:使用可變波特率時(shí),先確定TI的計(jì)數(shù)初值,并對(duì)TI進(jìn)行初始化。串行通信的編程方式:查詢方式:查C是否為“1”。中斷方式:如果預(yù)先開了中斷,當(dāng)TI、RI為“1”,會(huì)自動(dòng)產(chǎn)生中斷。注意:兩種方式中當(dāng)發(fā)送或接受數(shù)據(jù)后都要注意清TI或RI。5.2.5.1查詢方式查詢方式發(fā)送流程圖和接收流程圖見下頁5.2.5.2中斷方式中斷方式的初始化編程同查詢方式,不同的是要開中斷,即置位EA和ES,編寫中斷服務(wù)程序。匯編語言編程 MOVTMOD MOVTH1,#0CCH MOVTL1,#0CCH;設(shè)定波特率 SETBTR1 MOVSCON,#50HABC:CLRTIMOVP1,#0FEH;LED滅ACALLDAY;延時(shí) MOVA,#OFFHMOVSBUF,A;發(fā)送數(shù)據(jù)FFH JNBRI,$;RI=1等待MCS51系列單片機(jī)的特點(diǎn)就是體積小,功能全,系統(tǒng)結(jié)構(gòu)緊湊,硬件設(shè)計(jì)靈活。對(duì)于簡單的應(yīng)用,最小系統(tǒng)即能滿足要求。所謂最小系統(tǒng)是指在最少的外部電路條件下,形成一個(gè)可獨(dú)立工作的單片機(jī)應(yīng)用系統(tǒng)。一片89C51,或者一片8031外接一片EPROM就構(gòu)成了一個(gè)單片機(jī)最小系統(tǒng)。在很多復(fù)雜的應(yīng)用情況下,單片機(jī)內(nèi)的RAM,ROM和I/O接口數(shù)量有限,不夠使用,這種情況下就需要進(jìn)行擴(kuò)展。因此單片機(jī)的系統(tǒng)擴(kuò)展主要是指外接數(shù)據(jù)存貯器、程序存貯器或I/O接口等,以滿足應(yīng)用系統(tǒng)的需要。6.1單片機(jī)系統(tǒng)總線和系統(tǒng)擴(kuò)展方法單片機(jī)是通過地址總線,數(shù)據(jù)總線和控制總線與外部交換信息的。MCS-51單片機(jī)的總線接口信號(hào)見圖由圖可見:1)由于Po分時(shí)傳送地址/數(shù)據(jù)信息,在接口電路中,通常配置地址鎖存器,有ALE信號(hào)鎖存低8位地址Ao~A7,以分離地址和數(shù)據(jù)信息。2)P2口傳送高8位地址A8~A15。3)PSEN為程序存儲(chǔ)器的控制信號(hào),是在取指令碼時(shí)或執(zhí)行MOVC指令時(shí)變?yōu)橛行?。RD、WR為數(shù)據(jù)存儲(chǔ)器和I/O口的讀、寫控制信號(hào)。是執(zhí)行MOVX指令時(shí)變?yōu)橛行А?.2程序存儲(chǔ)器的擴(kuò)展6.2.1EPROM的擴(kuò)展根據(jù)以上取指時(shí)序的要求,8XX51單片機(jī)擴(kuò)展程序存儲(chǔ)器2732的電路圖見圖6.2.2EEPROM的擴(kuò)展6.3數(shù)據(jù)存儲(chǔ)器的擴(kuò)展在ALE的上升沿,把外部程序存儲(chǔ)器的指令讀入后就開始了對(duì)片外RAM的讀過程。ALE高電平期間,在P0處于高阻三態(tài)后,根據(jù)指令間址提供的地址,P2口輸出外部RAM的高8位地址A15~A8,P0端口輸出低8位地址A7~A0;在ALE下跳沿,P0輸出的低8位地址被鎖存在鎖存器中,隨后P0又進(jìn)入高阻三態(tài),RD信號(hào)有效后,被選中的RAM的數(shù)據(jù)出現(xiàn)在數(shù)據(jù)總線上,P0處于輸入狀態(tài),CPU從P0讀入外部RAM的數(shù)據(jù)。7.1并行I/O接口的擴(kuò)展MCS-51單片機(jī)共有4個(gè)8位并行I/O口,在外部擴(kuò)展時(shí),P0和P2口做為總線使用,因而提供給用戶的I/O口就只有P1或P3口的部分口線所接的外設(shè)較多時(shí),就必須擴(kuò)展I/O接口。MCS-51單片機(jī)擴(kuò)展的I/O口和外部數(shù)據(jù)存儲(chǔ)器統(tǒng)一編址、采用相同的控制信號(hào)、相同的尋址方式和相同的指令。擴(kuò)展I/O所用的芯片有通用可編程芯片(如8251,8155,8255等)和TTL,CMOS鎖存器,緩沖器(如273,377,244,245等),用戶可根據(jù)系統(tǒng)對(duì)輸入輸出的要求適當(dāng)選擇芯片。圖9-24為8XX51擴(kuò)展一個(gè)輸入接口244和一個(gè)輸出接口273的電路.
244的選通信號(hào)由RD和P2.0相或產(chǎn)生,當(dāng)執(zhí)行讀該片的指令時(shí),RD和P2.0有效,打開244控制門,從而把數(shù)據(jù)通過244讀入8XX51。273的選通信號(hào)由WR和P2.0相或產(chǎn)生,通過執(zhí)行對(duì)該片的寫指令,WR和P2.0有效,使8XX51的數(shù)據(jù)往273輸出。8XX51內(nèi)部有ROM/EPROM,不用擴(kuò)展外部程序存儲(chǔ)器,所以P0口作為雙向數(shù)據(jù)線連在的數(shù)據(jù)端。273、244有相同的地址FEFFH(實(shí)際上只要保證P2.0=0,其他地址位無關(guān)緊要),然而由于使用不同的控制信號(hào)RD或WR,它們地址相同卻不會(huì)發(fā)生數(shù)據(jù)傳送沖突。00000000000000000000H000001111111111107FFH00110000000000003000H001101111111111137FFH00101000000000002800H00101111111111112FFFH00011000000000001800H00011000000000111803H8255為可編程并行接口芯片,它有3個(gè)8位數(shù)據(jù)口:A口,B口,C口(其中C口可作為兩個(gè)四位口),一個(gè)控制口,口地址由A1,A0決定。圖中8255的三個(gè)數(shù)據(jù)口地址分別為1800H~1802H,控制口地址為1803H。8255有三種工作方式:方式0(基本方式),方式1(選通方式,此
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店加盟合作協(xié)議合同
- 房地產(chǎn)經(jīng)紀(jì)服務(wù)合同書
- 13《花鐘》教學(xué)設(shè)計(jì)-2024-2025學(xué)年語文三年級(jí)下冊(cè)統(tǒng)編版
- 辦公家具定制合同協(xié)議書
- 房屋租賃合同延期協(xié)議
- 新房購買合同范本詳解
- 5《草船借箭》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年統(tǒng)編版語文五年級(jí)下冊(cè)
- 4 升華和凝華 教學(xué)設(shè)計(jì)-2024-2025學(xué)年教科版物理八年級(jí)上冊(cè)
- 企業(yè)高層管理人員勞動(dòng)合同
- 1《場景歌》教學(xué)設(shè)計(jì)-2024-2025學(xué)年二年級(jí)上冊(cè)語文統(tǒng)編版
- 微信視頻號(hào)運(yùn)營技巧攻略詳解全套
- 2023CSCO非小細(xì)胞肺癌診療指南解讀
- 利息理論期末考試模擬測(cè)試試題含參考答案
- 干部選拔任用程序
- 部編人教版五年級(jí)下冊(cè)道德與法治簡答題歸納總結(jié)
- 2023高二開學(xué)第一課《蛻變》-主題班會(huì)
- 口服降糖藥物分類詳解課件
- 二級(jí)生物安全實(shí)驗(yàn)室設(shè)計(jì)建造與運(yùn)行管理指南
- 圍手術(shù)期疼痛護(hù)理課件
- 外國新聞傳播史-張昆課件
- 圓圈正義:作為自由前提的信念
評(píng)論
0/150
提交評(píng)論