《單片機原理與應(yīng)用技術(shù)》課件1第4章_第1頁
《單片機原理與應(yīng)用技術(shù)》課件1第4章_第2頁
《單片機原理與應(yīng)用技術(shù)》課件1第4章_第3頁
《單片機原理與應(yīng)用技術(shù)》課件1第4章_第4頁
《單片機原理與應(yīng)用技術(shù)》課件1第4章_第5頁
已閱讀5頁,還剩182頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章單片機輸入/輸出與中斷控制技術(shù)4.1片內(nèi)并行I/O端口4.2片內(nèi)串行通信接口4.3片內(nèi)定時計數(shù)器4.4片內(nèi)中斷系統(tǒng)4.5小結(jié)習(xí)題與思考題4.1片內(nèi)并行I/O端口4.1.1P0~P3口結(jié)構(gòu)與功能

1.P0口

P0口是一個低8位地址線/數(shù)據(jù)線分時復(fù)用端口。它有兩個用途:作通用I/O口使用;作低8位地址線/數(shù)據(jù)線使用。在無片外存儲器(包括片外程序ROM和片外數(shù)據(jù)RAM)的單片機系統(tǒng)中,作通用I/O口用;在需要片外擴展存儲器的單片機系統(tǒng)中,作低8位地址線/數(shù)據(jù)線用。

P0口是一個具有雙向傳送功能的三態(tài)端口。輸入的信息有讀端口引腳和讀端口鎖存器兩種;輸出的信息無鎖存功能。P0端口8位中的每一位具有相同的結(jié)構(gòu),都由鎖存器、多路開關(guān)、控制門電路、場效應(yīng)管反相器、輸入緩沖器等幾部分構(gòu)成,位結(jié)構(gòu)如圖4-1所示。圖4-1P0口位結(jié)構(gòu)

1)?P0口作I/O端口使用

P0口作I/O端口使用時要求多路開關(guān)的控制信號為0,使多路開關(guān)S撥向鎖存器位置;與此同時g3輸出0,V1截止。

(1)?P0口作輸出使用。P0口作輸出使用時的特征是“讀鎖存器”信號=“讀引腳”信號=0,從而三態(tài)門g1、g2斷開。相應(yīng)的電路及數(shù)據(jù)信號流向如圖4-2所示。圖4-2P0口作輸出使用如果內(nèi)部總線上的數(shù)據(jù)是0信息,則D=0。CLK脈沖到來后,

=1,V2導(dǎo)通使P0.X=0,從P0.X輸出0信息。如果內(nèi)部總線上的數(shù)據(jù)是1信息,則D=1。CLK脈沖到來后,=0,V2截止使P0.X=1,從P0.X輸出1信息。為了使P0.X出現(xiàn)正確的邏輯電平,在P0.X引腳處需外接上拉電阻,此時V2成為漏極開路OC門。

P0口的上述動作特征是在輸出指令的作用下實現(xiàn)的,輸出指令有兩條,其中任意一條都能實現(xiàn)P0的輸出功能:MOV P0,A

;A累加器的狀態(tài)經(jīng)內(nèi)部總線從P0口輸出MOV P0,#0FH

;從P0.0~P0.3輸出1,從P0.4~P0.7輸出0

(2)?P0口作輸入使用。此時,數(shù)據(jù)流向如圖4-3所示,數(shù)據(jù)從P0.X引腳進入,為了不致于被V2旁路,務(wù)必要求V2截止,只有V2截止,從P0.X進入單片機的數(shù)據(jù)才能到達g2門。這時還要求“讀引腳”信號=1,開啟g2門;“讀鎖存器”信號=0,斷開g1門。有了這些條件,外界進入單片機的信號就能順利進入內(nèi)部總線。圖4-3P0口作輸入使用在數(shù)據(jù)輸入之前,必須要求V2截止,即要求鎖存器的=0、Q=1。但鎖存器不可能自己成為“1”狀態(tài),必須用指令將P0.X寫“1”,使鎖存器成為“1”狀態(tài)。由此可見,P0口作輸入使用在書寫指令時必須分兩步進行:第一步:作輸出使用,使=0,V2斷開,P0.X=1。第二步:作輸入使用,從P0.X輸入數(shù)據(jù),使其順利到達內(nèi)部總線。在編程時使用兩條指令才能達到上述目的:MOVP0,#11111111B

;使P0.7~P0.0=11111111,八個V2全截止MOVA,P0 ;將P0處送來的數(shù)據(jù)輸入到A中或者使用如下兩條指令也能達到上述目的:ORLP0,#0FH ;使P0.3~P0.0=1111,P0.7~P0.4=0000MOVA,P0 ;將P0.3~P0.0的狀態(tài)輸入到A中

【例4-1】電路如圖4-4,執(zhí)行下述語句后,A=?MOV P0,#FFHMOV A,P0

解:執(zhí)行MOVP0,#FFH后,P0=FFH,P0口的8個V2全部截止。執(zhí)行MOVA,P0后,P0口作輸入使用,將單片機外的8位狀態(tài)00111010送入A中,則A=00111010B。圖4-4例4-1用圖

2)?P0口作低8位地址線/數(shù)據(jù)線使用

P0口的這種運用要求多路開關(guān)的控制信號為1,與門g3的輸出為:

g3=(地址/數(shù)據(jù)信號)×控制信號?? =地址/數(shù)據(jù)信號g3的輸出用于控制場效應(yīng)管V1的導(dǎo)通與截止。這時多路開關(guān)與反相器T相連。

(1)?P0口作低8位地址線使用。此時地址信號從“地址/數(shù)據(jù)”線經(jīng)反相器T、場效應(yīng)管V2,最后從P0.X輸出到單片機外,如圖4-5所示,該圖畫出了地址信號為0時各處邏輯電平值。如果地址信號為0,則g3輸出0使V1截止,反相器T輸出1使V2導(dǎo)通,從而使P0.X輸出0。反之,如果地址信號為1,與g3輸出1使V1導(dǎo)通,反相器T輸出0使V2截止,從而使P0.X輸出1。圖4-5P0口作低8位地址線使用

(2)?P0口作數(shù)據(jù)線使用。P0口在輸出低8位地址信號后,將自動變成數(shù)據(jù)線來傳送數(shù)據(jù)。數(shù)據(jù)線的使用過程分為兩步:第一步,讀取指令碼,作輸入線用。這時,g3的“控制”信號為0,輸出0使V1截止,多路開關(guān)與鎖存器接通。單片機用兩個操作完成第一步:第一個操作,單片機自動將FFH寫入P0口,使各P0.X的V2截止;第二個操作,指令碼從P0.X引腳進入,因“讀引腳”信號=1,使g2合上,指令碼從P0.X經(jīng)g2進入內(nèi)部總線,信號流程如圖4-6所示。第二步,在讀取指令碼后,依據(jù)指令碼輸入或輸出數(shù)據(jù)。如果是輸入數(shù)據(jù),則第二步的操作過程同于第一步讀取指令碼;如果是輸出數(shù)據(jù),操作過程同于P0口作I/O端口使用中的作輸出使用。圖4-6第一步使用中的第二個操作表4-1給出了P0口在作I/O端口使用和作低8位地址線/數(shù)據(jù)線使用時的指令特征。

2.P1口

P1口是一個8位準(zhǔn)雙向靜態(tài)口,輸入數(shù)據(jù)有讀引腳和讀鎖存器之分,輸出數(shù)據(jù)有鎖存,電路結(jié)構(gòu)如圖4-7所示。輸出驅(qū)動部分有上拉電阻。輸入、輸出數(shù)據(jù)操作過程同于P0口,使用輸入指令前,也需要先用指令對該口寫“1”。圖4-7P1口位結(jié)構(gòu)

3.P2口

P2口是一個兼有P0、P1功能的準(zhǔn)雙向端口,它的使用特點如下:

(1)執(zhí)行MOV指令時,作通用I/O口輸入或輸出數(shù)據(jù);

(2)執(zhí)行MOVX指令時,提供片外RAM高8位地址;

(3)執(zhí)行MOVC指令時,提供片外ROM高8位地址。

P2口的一位結(jié)構(gòu)如圖4-8所示。其內(nèi)部既有片內(nèi)上拉電阻,又有多路開關(guān)S,以滿足用作通用I/O口及高8位地址線的需要。輸入、輸出時的指令使用同于P0口。圖4-8P2口位結(jié)構(gòu)

4.P3口

P3口是一個雙功能的靜態(tài)I/O口,它的結(jié)構(gòu)如圖4-9所示,與其它各端口不同的是,“雙功能”僅受“第二功能控制線”的控制。當(dāng)“第二功能控制線”為1時,與非門g5輸出VG2=,這時P3口工作于通用I/O口方式,輸入、輸出數(shù)據(jù)及指令使用同于P1口。當(dāng)“第二功能控制線”為0時,作第二功能使用。

P3口第二功能如表4-2所示,操作過程由位操作指令實現(xiàn)。圖4-9P3口位結(jié)構(gòu)4.1.2編程實例

【例4-2】使用P0口和P1口控制十字路口交通信號燈,控制電路如圖4-10所示。假設(shè)十字路口的紅、黃、綠燈分配如圖4-11所示。設(shè)4個路口的紅燈由P1.0~P1.3控制,其中P1.0、P1.1控制南北向紅燈,東西向紅燈由P1.2和P1.3控制。

4個路口的黃燈由P0.0~P0.3控制,其中南北向由P0.0、P0.1控制,東西向由P0.2、P0.3控制。

4個路口的綠燈由P0.4~P0.7控制,其中南北向由P0.4、P0.5控制,東西向由P0.6、P0.7控制。圖4-10用P0口與P1口控制交通燈圖4-11控制方案要求初始情況為4個方向的紅燈全亮、黃燈和綠燈全滅。隨后當(dāng)南北通行,即綠燈亮?xí)r,東西方向的紅燈亮,禁止東西向通行。在南北通行了一段時間后,南北方向綠燈滅,黃燈亮且閃爍,當(dāng)閃爍若干次后東西向綠燈亮即允許通行,南北方向紅燈亮禁止通行。重復(fù)上述過程便能順利完成南北向、東西向的交替通行。由此編制的程序如下:START: MOV R7,#0AH ;設(shè)置黃燈閃爍次數(shù)

MOV A,#00H ;A清零

MOV P0,A ;黃、綠燈全滅

MOV A,#FFH MOV P1,A ;紅燈全亮

LCALL DELAY1 ;紅燈全亮延時

CLR P1.0 CLR P1.1 ;南北紅燈滅LOOP: SETB P0.4 SETB P0.5 ;南北綠燈亮

LCALL DELAY1 ;南北綠燈亮延時

CLR P0.4 ;南北綠燈滅

CLR P0.5 LOOP1: SETB P0.2 ;東西黃燈亮

SETB P0.3 LCALL DELAY2 ;東西黃燈延時

CLR P0.2 CLR P0.3 ;東西黃燈滅

DJNZ R7,LOP1 ;閃爍10次才能退出

MOV R7,#0AH ;恢復(fù)閃爍次數(shù)

SETB P1.0 SETB P1.1 ;南北紅燈亮

SETB P0.6 SETB P0.7 ;東西綠燈亮

LCALL DELAY1 ;東西綠燈亮延時

CLR P0.6 CLR P0.7 ;東西綠燈滅LOOP2:

SETB P0.0 SETB P0.1 ;南北黃燈亮

LCALL DELAY2 ;南北黃燈延時

CLR P0.0 CLR P0.1 ;南北黃燈滅

DJNZ R7,LOP2 MOV R7,#0AH ;恢復(fù)閃爍次數(shù)

SETB P1.2 SETB P1.3 ;東西紅燈亮

AJMP LOOP ;循環(huán)顯示

【例4-3】基本輸入/輸出控制,電路如圖4-12所示。

(1)開關(guān)數(shù)據(jù)控制電路。有4個開關(guān)S0~S3接入P0.0~P0.3,開關(guān)狀態(tài)輸入到單片機后,從P0.4~P0.7輸出驅(qū)動負載,開關(guān)狀態(tài)每修改一次需要讀一次。圖4-12開關(guān)數(shù)據(jù)控制電路將S0~S3的狀態(tài)從P0.0~P0.3讀入,再從P0.4~P0.7輸出,開關(guān)S0~S3的撥動狀態(tài)將直接驅(qū)動LED4、LED5、L6、L7的亮滅。程序如下:START:

MOV A,#FFH MOV P0,A ;所有燈全滅

MOV A,P0 ;輸入開關(guān)S0~S3的狀態(tài)

SWAP A ;將低4位轉(zhuǎn)到高4位

MOV P0,A ;高4位燈是否亮由S0~S3決定

LCALLDELAY ;延時

SJMP START ;重讀S0~S3狀態(tài)

(2)輸出燈循環(huán)點亮。這時不用開關(guān)S0~S3控制,各燈依次點亮,程序如下:START: MOV A,#FFH MOV P0,A ;所有燈全滅

ANL A,#EFH ;指向P0.4 SETB C ;進位位CY預(yù)置1LOOP: MOV P0,A ;使相應(yīng)位燈亮

LCALLDELAY ;燈亮延時

RLC A ;左移一位

JC LOP ;到第4個燈么?

MOV P0,A ;到了,使所有燈全滅

LCALL DELAY ;延時

AJMP START 4.1.3鍵盤和顯示器電路設(shè)計

【例4-4】行列式鍵盤與MCS-51接口電路。電路如圖4-13所示,用P0口作鍵盤接口,P0.0~P0.3作鍵盤行掃描輸出線,P0.4~P0.7作列檢測輸入線。對程序的要求是:由CPU判斷是否有鍵按下?是哪一個鍵按下?用ASCII碼或其它特征碼記錄按下的鍵信息。圖4-134×4鍵盤與單片機連接掃描程序按如下要求編制:

(1)查詢有無鍵按下。先從P0.0~P0.3輸出“0”(向P0口輸出F0H),然后從P0.4~P0.7輸入鍵信號,當(dāng)輸入的值不為F0H時,表示有鍵按下。

(2)查詢按下鍵的行列位置。逐行掃描,先從P0.0為“0”、P0.1~P0.7為“1”開始(向P0口輸出FEH),然后輸入P0口信號,若全為“1”,則不在第0行,轉(zhuǎn)至P0.1為“0”,P0.0、P0.2~P0.7為“1”(向P0口輸出FDH),……,直至找到行列位置為止。

(3)對按下鍵行列號譯碼、保存鍵值。

(4)抖動處理。#include<>#defineucharunsignedchar#defineuintunsignedintvoiddlms(void);ucharkbscan(void);voidmain(void){ucharkey;

while(1){ key=kbscan();

dlms();

}}voiddlms(void){ucharI;;for(i=200;i>0;i…){}}ucharkbscan(void) /*鍵掃描*/{ucharsccode,recode;P0=0×f0; /*發(fā)'0'行掃描碼,列輸入*/if((P0&0×f0)!=0×f0){dlms()if((P0&0×f0)!=0×f0){sccode=0×fe;/*有鍵按下*//*抖動處理*//*逐行掃描初值*/while((sccode&0×10)!=0){P0=sccode;

if((P0&0×f0)!=0×f0)

{recode=(P0&0×f0)|0×0f;

return((~sccode)+(~recode))}/*輸出行掃描碼*//*本行有鍵按下*//*返回*/ elsesccode=(sccode<<1)|0×01;}??}}return(0)}/*行掃描碼左移一位*//*無鍵按下,返回值為0*/

【例4-5】LED靜態(tài)顯示和動態(tài)顯示接口。數(shù)碼顯示有靜態(tài)顯示和動態(tài)顯示兩種方式。數(shù)碼顯示器有發(fā)光二極管LED和液晶顯示器LCD兩種。

LED作靜態(tài)顯示使用時,各管陽極(或陰極)連在一起接+5V(或接地),每一條段選線a、b、c、d、e、f、g、dp分別與一個8位I/O口相連,當(dāng)I/O口輸出0(或1)時,該段點燃,輸出數(shù)字按段選線組成。靜態(tài)顯示需要的I/O口太多,資源浪費大。當(dāng)顯示數(shù)字較多時,一般采用動態(tài)顯示。LED作動態(tài)顯示通常使用兩個I/O口,一個用來輸出被顯示字符的段選碼,一個用來輸出位選碼。一個一個輪流點燃顯示器的各位,利用視覺效應(yīng)和LED的余輝,就能看到多個字符在同時顯示。圖4-14和圖4-15分別是靜態(tài)顯示和動態(tài)顯示的接口電路。在靜態(tài)顯示接口電路中,一個I/O口只能接一只LED。在動態(tài)顯示電路中,使用P0口作段選碼端口,經(jīng)7407驅(qū)動連接LED的段,P1.0~P1.5作位選碼端口,經(jīng)7404驅(qū)動連接LED的位,待顯示的字符存放在片內(nèi)RAM從BUFFER開始的6個單元中,字符0~9、A~F的段碼存放在從SEGSELECT開始的數(shù)據(jù)段中,依次顯示6位字符的程序如下:圖4-14二位靜態(tài)共陽極LED接口圖4-15六位動態(tài)共陰極LED接口START:

MOV R0,#BUFFER MOV R2,#FEH ;使顯示器最左邊位亮

MOV A,R2 LOOP: MOV P1,A ;送掃描值

MOV A,@R0 ;取各個顯示段選碼

MOV P0,A ;輸出段選碼

ACALL DELAY ;延時5~10ms INC R0 ;指向下一段選碼地址

MOV A,R2 JB ACC.5,RETUN ;檢查6位是否顯示完?

RL A MOV R2,A AJMP LOOP ;未完繼續(xù)RETUN: RET SEGSELECT:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HSEGSELECT1:DB7FH,67H,77H,7CH,39H,5EH,79H,71H4.2片內(nèi)串行通信接口

MCS-51單片機內(nèi)的串行通信接口是一個能同時發(fā)送和接收的全雙工接口,它既可用于通用異步接收和發(fā)送(簡稱UART),又能用作同步移位寄存器。波特率和幀格式能通過編程自由設(shè)置。對外通信能通過引腳RXD(P3.0)和TXD(P3.1)實現(xiàn)。4.2.1可編程串行通信接口的結(jié)構(gòu)

1.幀和波特率在串行通信中,數(shù)據(jù)是以幀的格式發(fā)送或接收的。一幀數(shù)據(jù)由8~11位二進制數(shù)組成:起始位1位,常用“0”表示數(shù)據(jù)的開始;數(shù)據(jù)常有5~8位二進制數(shù),并且規(guī)定低位在前,高位在后。數(shù)據(jù)后有奇偶校驗位P(可不要),最后一位是停止位,以“1”結(jié)束,如圖4-16所示。圖4-16一幀數(shù)據(jù)波特率(BaudRate)是數(shù)據(jù)傳送的速率,定義為每秒傳送的二進制數(shù)位數(shù)。例如異步通信傳送數(shù)據(jù)每秒100幀,每幀11位,則該通信的波特率為100幀/s×11位/幀=1100位/s=1100波特波特率的倒數(shù)是傳送1位二進制數(shù)所需的時間:T=1/(1100位/s)=0.91ms/位

2.片內(nèi)串行口單片機的串行口主要由一個數(shù)據(jù)緩沖器SBUF、兩個控制寄存器SCON和PCON、波特率發(fā)生器T1、發(fā)送/接收控制器和輸入移位寄存器等組成,典型結(jié)構(gòu)如圖4-17所示。串行口數(shù)據(jù)緩沖器SBUF既可以用于發(fā)送,又可以用于接收,由讀寫指令區(qū)分。例如,執(zhí)行讀指令MOVA,SBUF用于接收;執(zhí)行寫指令MOVSBUF,A用于發(fā)送。在指令中既可以用緩沖器名SBUF,又可以用它的字節(jié)地址99H。串行口控制寄存器SCON的字節(jié)地址為98H,用于規(guī)定串行口的工作狀態(tài)及存放狀態(tài)信息。電源控制寄存器PCON的字節(jié)地址為87H,用于規(guī)定波特率的大小。圖4-17MCS-51片內(nèi)串行口當(dāng)需要從串行口RXD端接收數(shù)據(jù)時,首先應(yīng)當(dāng)使用指令使SCON的REN位置1,表明CPU允許接收。這時,片外數(shù)據(jù)串行從RXD進入單片機,數(shù)據(jù)最低位首先進入,最高位最后進入。進入的數(shù)據(jù)先在輸入移位控制器暫存,等一幀數(shù)據(jù)進入完畢后再從輸入移位控制器并行送入緩沖器SBUF,并經(jīng)片內(nèi)總線送到累加器A。與此同時將中斷標(biāo)志RI置位并提出片內(nèi)串行口中斷申請。CPU響應(yīng)中斷后,需要用指令將RI復(fù)位,接著進行下一幀數(shù)據(jù)的接收。當(dāng)需要從串行口TXD端發(fā)送數(shù)據(jù)時,先將數(shù)據(jù)從累加器A并行寫入到SBUF中,再經(jīng)控制門串行從TXD送到單片機外。一幀數(shù)據(jù)發(fā)送完畢,SBUF內(nèi)空,引起中斷標(biāo)志位TI置位發(fā)出片內(nèi)串行口中斷申請。CPU響應(yīng)中斷后,需要用指令將TI復(fù)位,接著進行下一幀數(shù)據(jù)的發(fā)送。

3.異步通信和同步通信通信雙方按事先約定的幀格式完成數(shù)據(jù)發(fā)送和接收的全過程,稱為異步通信。由于一幀數(shù)據(jù)采用固定格式,發(fā)送方只要有數(shù)據(jù)從起始位發(fā)出,接收方就能接收到,因此異步通信不需要專門的同步字符。通信雙方使用同步字符實現(xiàn)數(shù)據(jù)發(fā)送和接收的全過程,稱為同步通信。通信前,發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的雙方共同約定好同步字符。發(fā)送方先發(fā)送同步字符,隨后是一組數(shù)據(jù)(含有n個數(shù)據(jù))。接收方只要接收到同步字符,就把同步字符后面出現(xiàn)的數(shù)據(jù)塊當(dāng)作有用數(shù)據(jù)一并接收。發(fā)送端發(fā)送的同步字符與數(shù)據(jù)塊如圖4-18所示。同步通信允許使用1~2個同步字符,每個字符占1個字節(jié)。圖4-18同步通信數(shù)據(jù)格式4.2.2串行口控制器SCON和電源控制器PCON

1.SCON

SCON用于選擇通信方式、波特率、串行口狀態(tài)信息等,各位定義如下:

●SM0、SM1位,位地址分別為9FH、9EH,串行通信工作方式選擇位。

●SM2位,多機通信控制位。對于方式0,SM2位應(yīng)為0。在方式1中,如果SM2=0,表明RB8是接收到的停止位;如果SM2=1,表明只有接收到有效停止位才能激活RI,將RI置1。在方式2和方式3中,如果SM2=1,則接收到的第9位數(shù)據(jù)RB8必須是1,接收中斷RI才有效。

●REN,位地址為9CH,串行接收允許位:REN=0禁止接收;REN=1允許接收。

●TB8,位地址為9BH,方式2、3中是發(fā)送端發(fā)送的第9位數(shù)據(jù),可用位指令置0或置1。

●RB8,位地址為9AH,方式2、3中是接收端接收的第9位數(shù)據(jù),TB8、TB9可用作奇偶校驗位用。

●TI,位地址為99H,發(fā)送中斷標(biāo)志位,發(fā)送前用指令清零,發(fā)送過程中TI維持0不變,發(fā)送完一幀數(shù)據(jù)后被硬件電路自動置1。要想再發(fā)送,必須再用指令清零。

●RI,位地址為98H,接收中斷標(biāo)志位,接收前用指令清零,接收過程中RI維持0不變,接收完一幀數(shù)據(jù)后被硬件電路自動置1。要想再接收,必須再用指令清零。

2.PCON

PCON用于波特率是否需要加倍,它的字節(jié)地址為87H,無位地址,各位定義如下:

SMOD,D7位,波特率加倍控制位,在方式1、2、3中,0表示不加倍,1表示加倍。

3.波特率設(shè)置串行口通信有方式0~方式3共4種不同的通信方式,每種方式下波特率的設(shè)置有所不同:方式0和方式2的波特率固定;方式1和方式3的波特率可改變。

(1)方式0的波特率固定為fosc/12,fosc是單片機外接石英晶體振蕩器的頻率,通常使用12MHz或6MHz,相應(yīng)波特率分別是1×106位/s和0.5×106位/s。

(2)方式1的波特率由定時器T1的溢出率決定: 波特率=式中SMOD是PCON的D7位,當(dāng)SMOD選擇0時, 波特率=當(dāng)SMOD選擇1時, 波特率=定時計數(shù)器T1有4種不同的工作方式,其中的方式2是自動重裝初值的8位計數(shù)器方式。方式2的工作特點是,T1由低8位計數(shù)器TL1和高8位計數(shù)器TH1組成,TL1作8位計數(shù)器使用,TH1存放計數(shù)初值。當(dāng)TL1計滿溢出時,TH1的值自動重新送入到TL1中又重新開始計數(shù)。如果設(shè)T1的計數(shù)初值為X,定時計數(shù)工作寄存器TMOD(字節(jié)地址89H)的C/=0(定時方式),則每計滿28-X個時鐘脈沖,T1就發(fā)生一次計滿溢出,因此,

T1溢出率=

SMOD選擇0時的波特率為 波特率=計數(shù)初值X也可以由此式推出

X=256-

SMOD選擇1時的波特率為 波特率=此時的X為

X=256-

【例4-6】選擇MCS-51串行通信口工作于方式1,設(shè)置定時計數(shù)器T1作波特率發(fā)生器(工作于方式2),設(shè)波特率為1200波特,fosc=12MHz,取波特率控制位SMOD=1,計算定時計數(shù)器初值X。

解:

X=256-=BBH在程序初始化中使用MOVTL1,#BBH和MOVTH1,#BBH,分別將TL1和TH1預(yù)置成BBH。

(3)方式2的波特率受PCON中SMOD位的控制: 波特率=T1溢出率的計算方法同于方式1。

(4)方式3的波特率表達式與方式1完全相同。4.2.3串行口編程實例

1.方式0方式0稱為同步移位寄存器式輸入/輸出,RXD(P3.0)引腳用于輸入/輸出8位二進制數(shù);TXD(P3.1)引腳用于輸出移位脈沖使系統(tǒng)同步,傳輸速率為每一個機器周期輸入或輸出一位數(shù)據(jù),波特率為fosc/12。方式0多用于擴展I/O接口,在單片機系統(tǒng)并行端口不夠用時,通過外接串入并出移位寄存器擴展輸出接口;通過外接并入串出移位寄存器擴展輸入接口。

1)方式0發(fā)送方式0發(fā)送過程從寫SBUF緩沖器開始,數(shù)據(jù)發(fā)送完需用指令清除TI,保證下一次發(fā)送。相應(yīng)電路及時序如圖4-19所示。電路圖中所用74LS164是一片串入并出移位寄存器。圖4-19方式0發(fā)送單片機的8位數(shù)據(jù)用指令MOVSBUF,A從引腳RXD輸出到74LS164的串入端D1和D2,TXD輸出單片機移位時鐘,接至74LS164的CP端,給74LS164作時鐘用。74LS164的選通信號CLR由P0.0控制。設(shè)待發(fā)送數(shù)據(jù)位于片內(nèi)某存儲單元,地址用R0間址。方式0發(fā)送數(shù)據(jù)的程序如下:MOV SCON,#00H SETB P0.0 ;選通74LS164MOV A,@R0 ;取出待發(fā)送數(shù)MOV SBUF,A ;發(fā)送JNB T1,$ CLR TICLR P0.0

2)方式0接收方式0接收過程從讀SBUF緩沖器開始,所用指令為MOVA,SBUF。在接收數(shù)據(jù)前要完成初始化工作,主要有SCON設(shè)初值、單片機片外芯片的選通等。使用并入串出移位寄存器74LS165作片外芯片,從RXD端輸入串行數(shù)據(jù),TXD端用于輸出移位時鐘到74LS165。單片機的P0.0接至74LS165的接收/移位控制端S/,S/的功能是:為0時允許外界數(shù)據(jù)并行進入74LS165;為1時允許74LS165輸出串行數(shù)據(jù)。這一過程可以用兩條指令實現(xiàn):

CLR P0.0 ;允許外界數(shù)據(jù)進入74LS165 SETB P0.0 ;允許輸出串行數(shù)據(jù)接收數(shù)據(jù)的程序如下:

MOV R3,#DATA ;記錄接收字節(jié)個數(shù)LOOP:MOV SCON,#10H

;設(shè)串口工作于方式0,REN=1、RI=0允許接收

CLR P0.0SETB P0.0WAIT:JNB RI,WAIT CLR RI MOV A,SBUF MOV @R0,A ;將接收的數(shù)據(jù)放入存儲器

INC R0 DJNZ R3,LOOP

2.方式1方式1又稱為10位異步通信方式,1幀數(shù)據(jù)的10位分配為起始位1位(0)、數(shù)據(jù)位8位(從低向高)、停止位1位(1)。波特率由T1溢出率和SMOD位決定。

CPU向SBUF寫入一個數(shù)據(jù)就能啟動發(fā)送過程,在由波特率確定的移位脈沖作用下,從TXD送出1幀數(shù)據(jù)。10位數(shù)據(jù)送完后,中斷標(biāo)志TI被置位為中斷申請信號,TXD被置位為停止位。接收過程依靠以下兩個條件啟動:

(1)?REN=1允許接收;

(2)?RXD出現(xiàn)由1至0的負跳變。

RXD端輸入一個由1至0的負跳變被當(dāng)成1幀數(shù)據(jù)的起始位。當(dāng)1幀數(shù)據(jù)接收完,即最后一位停止位(1)被檢測到了以后,就把接收到的8位數(shù)據(jù)送入BUF,并置位RI,接收過程結(jié)束。發(fā)送和接收時序如圖4-20所示。圖4-20方式1發(fā)送與接收(a)發(fā)送時序;(b)接收時序

3.方式2和方式3方式2和方式3都可以稱為11位異步通信方式,除波特率不同外,其它各種性能完全相同。1幀數(shù)據(jù)的11位分別是:1位起始位0、8位數(shù)據(jù)位(從低到高)、一個附加的第9位、1位停止位。發(fā)送/接收時序如圖4-21所示。圖4-21方式2和方式3時序(a)發(fā)送時序;(b)接收時序

【例4-7】串行口方式2用于發(fā)送,串行發(fā)送的數(shù)據(jù)在片內(nèi)RAM中的30H~3FH單元中,SCON的TB8用作奇偶校驗。

【例4-8】串行口外接LED靜態(tài)顯示。顯示的原理是:先把要顯示的字符轉(zhuǎn)換成相應(yīng)的字形碼,通過單片機的串行口送到片外74LS164,再由74LS164并行輸出到數(shù)碼管上。相應(yīng)連接電路如圖4-22所示。顯示程序由三大塊組成:在初始化階段,要設(shè)置重復(fù)顯示的次數(shù)并置地址指針;主體程序使用查表方式查字形碼,再用MOVSBUF,A完成顯示,最后改變地址指針并檢查重復(fù)循環(huán)的條件是否滿足。使用DB偽指令建立一個字形表TABLE,表格中以十六進制秩序存放相應(yīng)的字形碼。圖4-22串口輸出LED電路顯示片內(nèi)RAM以50H為首地址的8位字形碼程序段如下:

【例4-9】串行口外接鍵盤、顯示器接口。接口電路如圖4-23所示。鍵盤采用行列結(jié)構(gòu),行列線分別由并行口P0.0、P0.1及74LS164引出。所用LED采用共陽極管,輸出“0”時LED點燃,輸出“1”時LED熄滅。本例從串行口串行輸出的數(shù)據(jù)經(jīng)74LS164后改成并行輸出。圖4-23串行口外接鍵盤顯示器接口鍵盤掃描和顯示字程序如下:4.2.4單片機與PC機的串行通信編程單片機和PC機組合在一起,能構(gòu)成主從分布式多微機系統(tǒng):單片機用作從機,在生產(chǎn)第一線完成智能傳感、數(shù)據(jù)采集、實時控制、就地自動化并遠傳;PC機用作主機,位于中央控制室,實現(xiàn)集中管理、數(shù)據(jù)分析及數(shù)據(jù)處理。

1.單片機串行口初始化

PC機要想與單片機交換數(shù)據(jù),必須使用中斷指令I(lǐng)NT14H,功能號分別為0~3(置于AH中),分別實現(xiàn)初始化、數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、讀取串行口狀態(tài)及Modem狀態(tài)等4種功能,如表4-3所示。表4-3PC機中斷指令I(lǐng)NT14H部分功能設(shè)單片機串行口端口地址50H,PC機以2400波特/s發(fā)送字符0A0H,相應(yīng)代碼段程序如下:使用C語言實現(xiàn)上述發(fā)送字符功能的函數(shù)形式為:

2.單片機與PC機間的串行通信單片機與PC機的連接如圖4-24所示,圖中MC1488和MC1489是邏輯電平轉(zhuǎn)換器。MC1488的功能是將TTL電平(“1”=2.4~5V,“0”=0.4~0V)轉(zhuǎn)換成RS232電平(“1”=-5~-15V,“0”=+5~+15V)。MC1489的功能是將RS232電平轉(zhuǎn)換成TTL電平。圖4-24單片機與PC機間連接

RS-232是美國電子工業(yè)聯(lián)合會EIA與BELL等公司在1969年一起開發(fā)的接口標(biāo)準(zhǔn),專門用于0~20000波特傳輸速率的通信,電纜傳輸最大物理距離50英尺(15m)。該標(biāo)準(zhǔn)有25線插件和9線插件兩種,以9線插件應(yīng)用較多。

(1)?PC機發(fā)送,單片機接收。

PC機連續(xù)發(fā)送100個字節(jié)數(shù)據(jù)80H的程序如下:

5OPEN"COM:1200,n,8,1,RS,CS,DS,CD"AS#1

10FORI=1TO100

15PRINT#1,CHR$(80)

20NEXT

25CLOSE:END單片機串行口工作于方式1,速率為1200波特/s,接收后放入起始地址為10H的片內(nèi)RAM,相應(yīng)接收程序為:單片機串行中斷接收程序為:

(2)單片機發(fā)送,PC機接收。單片機使用晶振頻率6MHz的發(fā)送程序如下:

PC機接收程序如下:#include<io.h>#include<dos.h>#include<stdio.h>#include<conio.h>#definetbr0x3f8#definebaudlow0x3f8#definebaudhigh0x3f9#defineInter0x3f9#definemodern0x3fc#definelconr0x3fb#definelsr0x3fdmain(){outportb(lconr,0x80); /*給波特率寄存器賦值*/outportb(baudlow0x60);outportb(baudhigh,0x00);/*1200波特*/outportb(lconr,0x03); /*數(shù)據(jù)位8位,停止位1位*/outportb(Inter,0x00); /*禁止中斷*/outportb(modern,0x00); /*無應(yīng)答*/inportb(tbr); /*串入數(shù)據(jù)*/}4.3片內(nèi)定時計數(shù)器

MCS-51單片機內(nèi)有兩個16位可編程定時計數(shù)器,用T0和T1命名;MCS-51單片機除T0和T1外,還有一個定時計數(shù)器T2。本節(jié)以MCS-51單片機為例介紹定時計數(shù)器的結(jié)構(gòu)、工作原理、工作方式及編程使用。4.3.1定時計數(shù)器結(jié)構(gòu)定時計數(shù)器的邏輯結(jié)構(gòu)由如下功能部件組成,如圖4-25所示。

●計數(shù)器T0和T1:兩個16位的計數(shù)器,每個又分為低8位計數(shù)器TL0和TL1及高8位計數(shù)器TH0和TH1,它們各有自己的字節(jié)地址,且都能賦以初值并實現(xiàn)加1計數(shù)。

●TCON:定時計數(shù)控制寄存器,用于啟停定時計數(shù)器。

●TMOD:方式控制寄存器,用于設(shè)置定時計數(shù)方式。圖4-25定時計數(shù)器結(jié)構(gòu)定時計數(shù)器有兩種工作方式:定時方式和計數(shù)方式。TMOD的D6位用于決定T1的工作方式;D2位用于決定T0的工作方式。

(1)?D6=0或D2=0時作定時用。定時器的計數(shù)輸入脈沖由單片機內(nèi)的時鐘提供,此時T0或T1對機器周期數(shù)實現(xiàn)加1計數(shù)。考慮到1個機器周期等于12個時鐘周期,因此定時器的計數(shù)頻率等于機內(nèi)振蕩頻率的1/12。如果晶振頻率fosc=6MHz,則計數(shù)頻率等于500kHz。計數(shù)器的位數(shù)有8位、13位和16位可供選擇,選擇不同的位數(shù)及計數(shù)初值,將有不同的定時時間。

(2)?D6=1或D2=1時作計數(shù)用。計數(shù)器的計數(shù)輸入脈沖由單片機外的設(shè)備提供,從單片機的引腳T0或T1送入,片外輸入信號在由1變0時使計數(shù)器計數(shù)。計數(shù)輸入脈沖的頻率有限制,最高計數(shù)頻率不超過晶振頻率fosc的1/24,即最高計數(shù)頻率fmax≤fosc/24。這是因為采樣T0、T1引腳上的信號電平變化需時2個機器周期(24個時鐘周期)。單片機在每個機器周期的S5P2期間采樣T0、T1腳,如果采樣到“1”,在下一個S5P2期間采樣到“0”,那么在第三個機器周期的S3P1期間計數(shù)器加1計數(shù)。對計數(shù)輸入脈沖的占空比要求是:輸入脈沖高、低電平的持續(xù)時間均要超過一個機器周期。4.3.2定時計數(shù)器的工作寄存器TMOD和TCON

MCS-51單片機的定時計數(shù)器在正常工作之前,需要向TMOD和TCON賦予初值,用于確定定時計數(shù)器的工作方式、操作方式、啟動要求、計數(shù)初值等。

1.計數(shù)方式寄存器TMOD

TMOD是一個8位專用寄存器,字節(jié)地址為89H,基本格式及各位意義如下:

MCS-51的兩個定時計數(shù)器T0和T1分別使用TMOD的4位作初始化定義,它們的工作方式除方式3外,方式0、1、2完全相同。即

T0有4種工作方式:方式0、1、2、3;

T1有3種工作方式:方式0、1、2。由于TMOD不能進行位尋址,只能用MOV指令一次完成初始化,例如設(shè)置T1為計數(shù)方式,工作于方式1,軟件啟動(不受外界中斷申請控制);T0為定時方式,工作于方式0,外界中斷申請啟動,則TMOD各位設(shè)置為:

01011000B=58H使用指令MOVTMOD,#58H就可以完成初始化操作。

2.控制寄存器TCON

TCON的字節(jié)地址為88H,用于控制定時計數(shù)器的啟停、溢出以及外部中斷觸發(fā)方式等。與TMOD不同的是,TCON的各位有位地址,能進行位尋址,復(fù)位時各位清零。TCON的基本格式及各位意義如下:

3.啟動用指令定時計數(shù)器T0、T1的功能結(jié)構(gòu)如圖4-26所示。圖4-26T0的功能結(jié)構(gòu)(T1相同)無論是處于定時還是計數(shù)方式,計數(shù)脈沖都需要通過控制門才能進入計數(shù)器。控制門的控制端G=1時,控制門導(dǎo)通,計數(shù)脈沖可進入計數(shù)器;G=0時斷開??刂崎T電路邏輯關(guān)系如下:

4.計算計數(shù)器初值定時計數(shù)器在不同工作方式下的計數(shù)初值是不同的。計數(shù)器初值與計數(shù)最大值、機內(nèi)晶振頻率fosc、定時時間t都有密切的關(guān)系。

(1)最大值M。各種操作方式下的最大值分別為:

方式0:M=213=8192;

方式1:M=216=65536;

方式2:M=28=256;

方式3:M=28=256。

(2)計數(shù)工作時的初值N。計數(shù)脈沖由外部輸入,加1計數(shù),因此初值N=M-計數(shù)值。例如要求每計滿64個脈沖就計滿歸零,則預(yù)置的初值為N=M-64。

(3)定時工作時的初值N。計數(shù)脈沖由機內(nèi)晶振供給,設(shè)振蕩器頻率為fosc,計數(shù)脈沖頻率為fosc/12,定時時間為t,計數(shù)值為t×fosc÷12,計數(shù)初值N為例如單片機主頻為12MHz,要求產(chǎn)生10ms定時,定時計數(shù)器工作于方式1,計數(shù)初值為

【例4-10】

設(shè)T0作定時器用,定時8ms,工作于方式0,允許中斷,軟啟動;T1為計數(shù)方式,計100個外部輸入脈沖,硬啟動,禁止中斷,工作于方式2,機內(nèi)晶振頻率fosc=12MHz,編制初始化程序。

解:T0的計數(shù)初值為擴展成13位為0000011000000B。TL0使用了其中的低5位00000B,高3位補0后初值為00H;TH0使用高8位,其初值為00000110B。

T1的計數(shù)初值為N1=256-100=9CH

TMOD的初始值為E0H。初始化程序如下:MOV TMOD,#E0H MOV TH1,#9CHMOV TL1,#9CH ;滿足方式2的T1初值MOV TH0,#06H ;滿足方式0的TH0初值MOV TL0,#00H ;滿足方式0的TL0初值MOV IE,#1xxx0010B ;允許CPU開放中斷,允許T0中斷SETB TR0 ;啟動T0SETB TR1 ;使TR1=1,待=1時啟動T14.3.3定時計數(shù)器的工作方式這里以T0為例說明定時計數(shù)器的工作方式。對于T1,方式0、1、2的計算方法完全相同。

1.工作方式0方式0又稱為13位方式,產(chǎn)生條件是TMOD的M1M0設(shè)置為00,13位計數(shù)器由TL0的低5位和TH0的8位構(gòu)成,結(jié)構(gòu)見圖4-27。圖4-27T0的工作方式0當(dāng)G=1時控制門接通,計數(shù)脈沖先進入TL0低5位,再進入TH0,共13位計數(shù)器,T0的初始值設(shè)置好后,計滿歸零時使TF0為1發(fā)出中斷申請。用于定時的定時時間t為式中N0為計數(shù)初值,fosc的單位為Hz。計數(shù)初值的計算公式為

【例4-11】T1作定時器,工作于方式0,從P0.0輸出周期10ms的方波,機內(nèi)晶振fosc=12MHz。

解:P0.0輸出周期10ms的方波,只需定時5ms將P0.0取反就可以獲得,即t=5ms,相應(yīng)計數(shù)初值為:

13位方式只保留13位二進制數(shù),TL1賦值18H,TH1賦值63H。TMOD初值為0000xxxxB,但上電復(fù)位能使TMOD成為00H,因此不寫入。符合題意的程序段為:LOOP: MOV TL1,#18H MOV TH1,#63H SETB TR1 ;啟動T1

JNB TF0,$ ;未計滿等待

CPL P0.0 ;計滿,定時到,將P0.0求反

SJMP LOOP ;無條件轉(zhuǎn)去重置計數(shù)初值

2.工作方式1方式1又稱16位方式,和方式0的區(qū)別僅在于TL0和TH0組成了16位計數(shù)器,如圖4-28所示。方式1下用于定時的定時時間t為式中N0為計數(shù)初值,fosc的單位為Hz。N0的計算公式為圖4-28T0的工作方式1

【例4-12】T1作定時器,工作于方式1,從P0.0輸出周期20ms的方波,機內(nèi)晶振fosc=12MHz。

解:T1定時10ms,用t=10ms代入N1的計算公式,得計數(shù)器初值D8F0H。程序如下:

3.工作方式2方式2又稱為8位自動裝入計數(shù)初值方式。計數(shù)前TL和TH的初值相同,計數(shù)過程只有TL參加計數(shù),TH中內(nèi)容不變。TL計滿歸零發(fā)出TF=1的信號申請中斷時,TH中的初值自動裝入到TL中,又從頭開始加1計數(shù)。結(jié)構(gòu)見圖4-29。方式2下用于定時的定時時間t為式中N0為計數(shù)初值,fosc的單位為Hz。N0的計算公式為圖4-29T0的工作方式2

【例4-13】T1作定時器,工作于方式2,從P0.0輸出0.2ms的方波,機內(nèi)振蕩fosc=12MHz。

解:T1定時0.1ms,計數(shù)器初值為N1=9CH。程序如下:

4.工作方式3方式3又稱為兩個獨立的8位計數(shù)器方式。當(dāng)T0工作于方式3時,它的高8位TH0要占用T1的TR1和TF1。因此,這時要想T1工作(T1也能工作在方式0、1、2),就只能用于不需要中斷的場合,例如將它作串口波特率發(fā)生器用。如果用MOV指令將T1設(shè)置成方式3,T1將自行關(guān)閉。圖4-30方式3下的T0和T1(a)TL0;(b)TH0;(c)TL1和TH1圖4-30方式3下的T0和T1(a)TL0;(b)TH0;(c)TL1和TH1

【例4-14】設(shè)置T0工作于方式3,其中TL0作五進制計數(shù)器使用,片外計數(shù)脈沖從引腳T0(P3.4)接入。T0的另一個8位定時計數(shù)器TH0作8位定時器使用,控制P0.0輸出10kHz的方波信號。又設(shè)置T1工作于方式2,作串行口波特率發(fā)生器使用。單片機機內(nèi)晶振頻率fosc=12MHz。

解:TL0作計數(shù)器時的初值為N0L=FBH

TH0作計數(shù)器時的初值為N0L=CEH要求方波周期T=1/10kHz,定時時間為50μs,每50μs使P0.0反向一次,相應(yīng)程序如下:4.3.4定時計數(shù)器程序設(shè)計

【例4-15】

設(shè)機內(nèi)晶振頻率為6MHz,編寫利用T0產(chǎn)生定時1s的程序。

解:T0工作于方式0時的最長定時 =8192×12÷(6×106)=16.384ms;

T0工作于方式1時的最長定時 =65536×12÷(6×106)=131.072ms;

T0工作于方式2時的最長定時=256×12÷(6×106)=512μs;

T0工作于方式3時的最長定時=256×12÷(6×106)=512μs。選擇T0工作于方式1,每100ms中斷一次,中斷10次為1s。由此算得計數(shù)初值N0=3CB0H。TMOD的初值為xxxx0001B。延時1s的程序如下:相應(yīng)程序如下:圖4-31測試引腳(a)測量示意圖;(b)流程圖4.4片內(nèi)中斷系統(tǒng)

MCS-51單片機片內(nèi)中斷管理系統(tǒng)具有如下基本特征:

(1)有5個固定的可屏蔽中斷源,2個在片外,3個在片內(nèi)。

(2)在程序存儲器的低地址處(0003H~002AH)有5個中斷服務(wù)程序的入口地址,每個入口地址占8個單元,共40個單元。

(3)?5個中斷源分成2個中斷優(yōu)先級,可形成中斷嵌套。

(4)用于中斷控制和優(yōu)先級設(shè)置的中斷寄存器有4個:TCON、SCON、IE和IP。4.4.1中斷的概念與中斷服務(wù)程序入口地址

1.中斷的概念通常CPU的工作速度快,I/O設(shè)備工作速度慢,如果讓CPU和I/O設(shè)備同步工作,必然會出現(xiàn)CPU等待I/O設(shè)備的情況,這對CPU無疑是一種浪費。引入了中斷的概念就能解決這一問題。讓CPU和I/O設(shè)備各自獨立工作,待I/O準(zhǔn)備好了以后,向CPU發(fā)出申請,請求CPU中斷自己正在執(zhí)行的主程序,轉(zhuǎn)去為I/O設(shè)備服務(wù),為I/O設(shè)備服務(wù)完了以后,再去繼續(xù)執(zhí)行主程序。這一過程就稱為中斷。有了中斷的概念,就能使單片機靈活自如地實現(xiàn)如下一些操作:

(1)實時控制:有了中斷系統(tǒng),CPU就能隨時響應(yīng)I/O設(shè)備的隨機要求,即刻處理。

(2)分時操作:CPU和多個I/O設(shè)備同時工作,互不干擾,哪個I/O設(shè)備準(zhǔn)備好了就為哪個I/O設(shè)備服務(wù),CPU還能做自己的事,極大提高了CPU的使用效率。

(3)故障處理:運行中出現(xiàn)的一些故障,如斷電、除法錯誤、奇偶校驗出錯,CPU能及時處理,不必事先知道。能夠發(fā)出中斷申請的來源,稱為中斷源。中斷源通常有硬件中斷源和軟件中斷源兩大類。處理中斷的系統(tǒng)稱為中斷管理系統(tǒng)。由硬件電路和軟件處理程序組成,它們位于CPU內(nèi)。中斷管理系統(tǒng)的基本職責(zé)是:

(1)實現(xiàn)中斷并正確返回。

(2)按優(yōu)先權(quán)對多個中斷源排隊。

(3)實現(xiàn)中斷嵌套。

CPU要想響應(yīng)中斷,必須處于開中斷狀態(tài)(片內(nèi)的中斷允許觸發(fā)器為“1”狀態(tài)),且在現(xiàn)行指令執(zhí)行完畢以后。CPU處理中斷的過程通常分成4步:

(1)判斷中斷申請與CPU正在執(zhí)行的主程序誰更重要。如果中斷申請重要一些,就響應(yīng)中斷;如果正在執(zhí)行的主程序更重要,就暫緩受理中斷申請。

(2)一旦響應(yīng)中斷,就保護主程序斷點,將一些寄存器值推入堆棧。

(3)尋找中斷服務(wù)程序入口地址轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。

(4)中斷返回,恢復(fù)現(xiàn)場。圖4-32畫出了5個入口地址在片內(nèi)4KBROM中的分布及中斷管理系統(tǒng)所要用到的5個特殊功能寄存器。圖4-32中斷管理系統(tǒng)(a)中斷服務(wù)程序入口地址;(b)與中斷有關(guān)的特殊功能寄存器4.4.2中斷控制寄存器TCON、SCON、IE和IP

1.定時計數(shù)控制寄存器TCON

TCON的D7位(TF1)、D5位(TF0)分別是定時計數(shù)器T1、T0的計滿溢出標(biāo)志,計滿歸零時TF1(TF0)=1,發(fā)出中斷申請。其基本格式如下:

2.串行口控制寄存器SCON

SCON的D1位(TI)、D0位(RI)是發(fā)送、接收中斷標(biāo)志位,TI是發(fā)送標(biāo)志位,RI是接收標(biāo)志位。它們在發(fā)送/接收前都需要用指令清零;在整個發(fā)送/接收過程中,TI/RI維持“0”不變;發(fā)送/接收完一幀數(shù)據(jù)后被硬件電路置“1”。如果要想再次發(fā)送/接收,需再用指令清零。其基本格式如下:

3.中斷允許寄存器IE(InterruptEnable)

IE是21個特殊功能寄存器SFR之一,字節(jié)地址為A8H,8位只使用了6位,每一位都可以位尋址,8位位地址是A8H~AFH,有兩位雖然不用,但仍然有位地址編號。其基本格式如下:

4.中斷優(yōu)先級寄存器IP(InterruptPriority)

IP是一個用于設(shè)置兩個中斷優(yōu)先級的8位寄存器,兩個優(yōu)先級分別稱為高優(yōu)先級和低優(yōu)先級。IP的字節(jié)地址是B8H,8位位地址為B8H~BFH,只用了其中的5位。其基本格式及各位意義如下:4.4.3中斷響應(yīng)過程

1.中斷響應(yīng)步驟

MCS-51單片機要想響應(yīng)中斷,必須具備如下條件:

(1)中斷源有中斷請求;

(2)中斷允許寄存器IE的EA位應(yīng)當(dāng)置“1”,即CPU開放中斷;

(3)IE中的中斷允許位應(yīng)當(dāng)置“1”。在正常情況下,從中斷申請信號發(fā)出到CPU響應(yīng),一般需要3~8個機器周期。中斷響應(yīng)過程通常分如下幾步進行:

(1)?CPU一旦響應(yīng)中斷,首先置位中斷“優(yōu)先級生效”觸發(fā)器。

(2)執(zhí)行長調(diào)用指令LCALL,把當(dāng)前PC值推入堆棧。

(3)程序計數(shù)器PC接受中斷服務(wù)程序入口地址,使用長跳轉(zhuǎn)指令LJMP可以跳轉(zhuǎn)到64KBROM任何一個空間內(nèi)。

2.中斷申請信號片內(nèi)、片外中斷源發(fā)出的中斷申請信號,有不同的申請方式。片內(nèi)定時計數(shù)器依靠加1計數(shù)器計滿歸零將TF0(或TF1)置1提出申請。片外中斷源的中斷申請信號,允許采用邊沿觸發(fā)方式和電平觸發(fā)方式。邊沿觸發(fā)方式如圖4-33所示,要求申請信號的高低電平至少持續(xù)12個時鐘周期以上,否則不能可靠觸發(fā)。電平觸發(fā)的中斷申請信號為低電平時直接觸發(fā),對高低電平持續(xù)時間無特殊要求。圖4-33邊沿觸發(fā)對中斷申請信號的要求4.4.4中斷服務(wù)程序單片機復(fù)位時,PC=0000H,但片內(nèi)程序ROM從0003H至002BH是5個中斷源的入口地址,因此主程序在0000H處應(yīng)當(dāng)使用一條跳轉(zhuǎn)指令,且以長跳轉(zhuǎn)為多。主程序的編程中應(yīng)當(dāng)包含有中斷初始化,初始化過程是對IE、IP賦初值,開放全局中斷及某些中斷源允許中斷,確定優(yōu)先級。中斷流程如圖4-34所示。圖4-34中斷流程在編寫中斷服務(wù)程序時,要注意服務(wù)程序的起始地址,方法是在中斷源入口地址寫入跳轉(zhuǎn)指令,該指令的目標(biāo)地址就是中斷服務(wù)程序的入口地址。編寫時需留意如下問題:

(1)確定是否需要保護現(xiàn)場。

(2)及時清除那些不能被硬件電路自動清除的中斷申請標(biāo)志,避免誤中斷。

(3)?PUSH、POP指令應(yīng)成對使用。

(4)參數(shù)傳遞方式同于主程序與子程序之間的參數(shù)傳遞。

【例4-17】

電路如圖4-35所示。P0口的P0.4~P0.7用作輸入,P0.0~P0.3用作輸出,將開關(guān)狀態(tài)從P0.4~P0.7讀入,再經(jīng)P0.0~P0.3輸出驅(qū)動發(fā)光二極管L0~L3,采用中斷邊沿觸發(fā)方式,每中斷一次,完成一次讀/寫操作。圖4-35中斷方式用例在使用輸入指令MOVA,P0取K4~K7的狀態(tài)時,要先用輸出指令將P0.4~P0.7的鎖存器置1。源程序如下:圖4-36多個中斷源相應(yīng)源程序如下:4.4.5C51中斷程序設(shè)計

【例4-19】

有8個中斷申請源通過編碼器74LS148接入,編碼結(jié)果由P1.0~P1.2進入單片機內(nèi),電路如圖4-37所示。FranklinC51編譯器為MCS-51系列成員的寄存器提供頭文件,其中8051的頭文件為reg51.h。

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論