【教學(xué)】第八章 8051內(nèi)部資源的C編程_第1頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第2頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第3頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第4頁
【教學(xué)】第八章 8051內(nèi)部資源的C編程_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第八章8051內(nèi)部資源的C編程.8.1 中斷8.2 定時(shí)器/計(jì)數(shù)器8.3 串行口.8.1 中斷中斷的基本概念所謂中斷是指CPU對(duì)系統(tǒng)中或系統(tǒng)外發(fā)生的某個(gè)事件的一種響應(yīng)過程,即CPU暫時(shí)停止現(xiàn)行程序的執(zhí)行,而自動(dòng)轉(zhuǎn)去執(zhí)行預(yù)先安排好的處理該事件的服務(wù)子程序。當(dāng)處理結(jié)束后,再返回到被暫停程序的斷點(diǎn)處,繼續(xù)執(zhí)行原來的程序。實(shí)現(xiàn)這種中斷功能的硬件系統(tǒng)和軟件系統(tǒng)稱為中斷系統(tǒng)。.8.1.1中斷源1、8051中斷源中斷源說明

外部中斷0由P3.2腳輸入,低電平/負(fù)跳變觸發(fā)外部中斷1由P3.3腳輸入,低電平/負(fù)跳變觸發(fā)定時(shí)器/計(jì)數(shù)器0中斷定時(shí)器T0溢出觸發(fā)定時(shí)器/計(jì)數(shù)器1中斷定時(shí)器T1溢出觸發(fā)串行口中斷接收或發(fā)送一幀數(shù)據(jù)觸發(fā)

.2、定時(shí)器/計(jì)數(shù)器控制寄存器(TCON)TCONIT0IE0IT1IE1TR0TF0TR1TF1D7D6D5D4D3D2D1D0字節(jié)地址98HIT0(IT1):外部中斷0(或1)觸發(fā)方式控制位。IT0(或IT1)被設(shè)置為0,則選擇外部中斷為電平觸發(fā)方式;IT0(或IT1)被設(shè)置為1,則選擇外部中斷為邊沿觸發(fā)方式。電平觸發(fā)方式:

CPU在每個(gè)機(jī)器周期的S5P2采樣INTx引腳,若INTx引腳為低電平,將直接觸發(fā)外部中斷。邊沿觸發(fā)方式:若第一個(gè)機(jī)器周期采樣到INTx引腳為高電平,第二個(gè)機(jī)器周期采樣到INTx引腳為低電平時(shí),向CPU請(qǐng)求中斷。.IE0(IE1):外部中斷0(或1)的中斷請(qǐng)求標(biāo)志位。當(dāng)CPU響應(yīng)中斷轉(zhuǎn)向中斷服務(wù)程序時(shí)由硬件將IE0(或IE1)清零。TCONIT0IE0IT1IE1TR0TF0TR1TF1D7D6D5D4D3D2D1D0字節(jié)地址98HTF0(TF1):定時(shí)器中斷0(或1)的中斷請(qǐng)求標(biāo)志位。當(dāng)CPU響應(yīng)中斷轉(zhuǎn)向中斷服務(wù)程序時(shí)由硬件將TF0(或TF1)清零。.3、串行口控制寄存器(SCON)

SM0SM1SM2RENTB8RB8TIR1SCONRI,TI:串行口收/發(fā)數(shù)據(jù)申請(qǐng)中斷標(biāo)志位 =1申請(qǐng)中斷; =0不申請(qǐng)中斷.8.1.2中斷的控制1、中斷允許寄存器(IE)MCS-51單片機(jī)中沒有專設(shè)的開中斷和關(guān)中斷指令,對(duì)各中斷源的中斷開放或關(guān)閉是由內(nèi)部的中斷允許寄存器IE的各位來控制的。EX0ET0EX1ET1ESEAD7D6D5D4D3D2D1D0IE字節(jié)地址A8HEA:中斷允許總控位。

EA=0,屏蔽所有的中斷請(qǐng)求;

EA=1,開放中斷。

EA的作用是使中斷允許形成兩級(jí)控制。即各中斷源首先受EA位的控制;其次還要受各中斷源自己的中斷允許總控位控制。.EX0ET0EX1ET1ESEAD7D6D5D4D3D2D1D0IE字節(jié)地址A8H

ET1:定時(shí)器/計(jì)數(shù)器T1的溢出中斷允許位。 ET1=0禁止T1中斷; ET1=1允許T1中斷。ES:串行口中斷允許位。 ES=0禁止串行口中斷; ES=1允許串行口中斷。EX1:外部中斷1中斷允許位。 EX1=0禁止外部中斷1中斷; EX1=1允許外部中斷1中斷。.2、中斷優(yōu)先級(jí)寄存器(IP)MCS-51單片機(jī)的中斷源有兩個(gè)用戶可控的中斷優(yōu)先級(jí),從而可實(shí)現(xiàn)二級(jí)中斷嵌套。中斷系統(tǒng)遵循如下三條規(guī)則:(1)正在進(jìn)行的中斷過程不能被新的同級(jí)或低優(yōu)先級(jí)的中斷請(qǐng)求所中斷,一直到該中斷服務(wù)程序結(jié)束,返回了主程序且執(zhí)行了主程序中的一條指令后,CPU才響應(yīng)新的中斷請(qǐng)求。(2)正在進(jìn)行的低優(yōu)先級(jí)中斷服務(wù)程序能被高優(yōu)先級(jí)中斷請(qǐng)求所中斷,實(shí)現(xiàn)兩級(jí)中斷嵌套。(3)CPU同時(shí)接收到幾個(gè)中斷請(qǐng)求時(shí),首先響應(yīng)優(yōu)先級(jí)最高的中斷請(qǐng)求。.PT2PSPT1PX1PT0PX0D7D6D5D4D3D2D1D0IP字節(jié)地址B8HPT2:定時(shí)器/計(jì)數(shù)器T2的中斷優(yōu)先級(jí)控制位,只用于52子系列。PS:串行口的中斷優(yōu)先級(jí)控制位。PT1:定時(shí)器/計(jì)數(shù)器T1的中斷優(yōu)先級(jí)控制位。PX1:外部中斷1的中斷優(yōu)先級(jí)控制位。PT0:定時(shí)器/計(jì)數(shù)器T0的中斷優(yōu)先級(jí)控制位。PX0:外部中斷0的中斷優(yōu)先級(jí)控制位。.表8.2中斷優(yōu)先級(jí)中斷源同級(jí)的中斷優(yōu)先級(jí)

外部中斷0定時(shí)器/計(jì)數(shù)器0中斷外部中斷1定時(shí)器/計(jì)數(shù)器1中斷串行口中斷定時(shí)器/計(jì)數(shù)器2中斷最高

最低..8.1.3中斷響應(yīng)

單片機(jī)響應(yīng)中斷的條件為中斷源有請(qǐng)求(中斷允許寄存器IE相應(yīng)位置1),且CPU開中斷(即EA=1)。這樣,在每個(gè)機(jī)器周期的S5P2期間,對(duì)所有中斷源按用戶設(shè)置的優(yōu)先級(jí)和內(nèi)部規(guī)定的優(yōu)先級(jí)進(jìn)行順序檢測(cè),并可在S6期間找到所有有效的中斷請(qǐng)求。如有中斷請(qǐng)求,且滿足下列條件,則在下一個(gè)機(jī)器周期的S1期間響應(yīng)中斷,否則將丟棄中斷采樣的結(jié)果。(1)無同級(jí)或高級(jí)中斷正在處理。(2)現(xiàn)行指令執(zhí)行到最后1個(gè)機(jī)器周期且已結(jié)束。(3)若現(xiàn)行指令為RETI或訪問IE、IP的指令時(shí),執(zhí)行完該指令且緊隨其后的另一條指令也已執(zhí)行完畢。1.中斷響應(yīng)的條件.

CPU響應(yīng)中斷后,由硬件自動(dòng)執(zhí)行如下的功能操作:(1)根據(jù)中斷請(qǐng)求源的優(yōu)先級(jí)高低,對(duì)相應(yīng)的優(yōu)先級(jí)狀態(tài)觸發(fā)器置1。(2)保護(hù)斷點(diǎn),即把程序計(jì)數(shù)器PC的內(nèi)容壓入堆棧保存。(3)清內(nèi)部硬件可清除的中斷請(qǐng)求標(biāo)志位(IE0、IE1、TF0、TF1)。(4)把被響應(yīng)的中斷服務(wù)程序入口地址送入PC,從而轉(zhuǎn)入相應(yīng)的中斷服務(wù)程序執(zhí)行。各中斷服務(wù)程序的入口地址見表。2.中斷響應(yīng)過程.中斷服務(wù)程序入口地址表編號(hào)中斷源入口地址0外部中斷00003H1定時(shí)器/計(jì)數(shù)器0000BH2外部中斷10013H3定時(shí)器/計(jì)數(shù)器1001BH4串行口中斷0023H.中斷服務(wù)程序的函數(shù)定義的語法格式如下:

void函數(shù)名()interruptm[usingn]{

}3.中斷服務(wù)程序C51編譯器支持在C源程序中直接開發(fā)中斷程序。中斷服務(wù)程序是通過按規(guī)定語法格式定義的一個(gè)函數(shù)。interrupt屬性的參數(shù)為0到31的整常數(shù)值。帶操作數(shù)的表達(dá)式在函數(shù)原型中是不允許的。.interrupt屬性影響如下函數(shù)的目標(biāo)代碼特殊功能寄存器ACCBDPHDPL和PSW的內(nèi)容需要時(shí)在函數(shù)調(diào)用時(shí)保存在堆棧中。在中斷函數(shù)中所用的寄存器如果不用using屬性指定一個(gè)寄存器組就保存在堆棧中。保存在堆棧中的寄存器和SFR在退出函數(shù)前恢復(fù)。函數(shù)由指令RETI終止。另外Cx51編譯器自動(dòng)產(chǎn)生中斷矢量。.linelevel source 1 externbitalarm; 2 intalarm_count; 3 4 5 voidfalarm(void)interrupt1using3 {6 1 alarm_count*=2; 7 1 alarm=1; 8 1 } 下面的例子程序說明了如何使用interrupt屬性。程序同時(shí)顯示進(jìn)入和退出中斷函數(shù)的代碼。using函數(shù)屬性用來選擇和非中斷程序不同的寄存器組。.ASSEMBLYLISTINGOFGENERATEDOBJECTCODE

0000C0E0 PUSH ACC 0002C0D0 PUSH PSW

;SOURCELINE#5 ;SOURCELINE#6 0004E500 R MOV A,alarm_count+01H 000625E0 ADD A,ACC 0008F500 R MOV alarm_count+01H,A 000AE500 R MOV A,alarm_count 000C33 RLC A 000DF500 R MOV alarm_count,A ;SOURCELINE#7 000FD200 E SETB alarm ;SOURCELINE#8 0011D0D0 POP PSW 0013D0E0 POP ACC 001532 RETI 但是因?yàn)樵诒竞瘮?shù)中不需要工作寄存器為切換寄存器組而產(chǎn)生的代碼被優(yōu)化排除了。.4.中斷服務(wù)函數(shù)應(yīng)用注意

中斷函數(shù)沒有函數(shù)參數(shù)。如果中斷函數(shù)聲明中帶參數(shù),編譯器就產(chǎn)生錯(cuò)誤信息。

中斷函數(shù)聲明不能包含返回值,必須聲明為VOID

。如果定義了一個(gè)返回值,編譯器就產(chǎn)生一個(gè)錯(cuò)誤。暗含的int

返回值被編譯器忽略。

編譯器不允許直接的對(duì)中斷函數(shù)的調(diào)用。對(duì)中斷函數(shù)的直接調(diào)用是無意義的。

編譯器對(duì)每個(gè)中斷函數(shù)產(chǎn)生一個(gè)中斷矢量。矢量的代碼是跳轉(zhuǎn)到中斷函數(shù)的起始

從一個(gè)中斷程序中調(diào)用函數(shù)必須和中斷使用相同的寄存器組。.8.1.5中斷編程圖所示是利用優(yōu)先權(quán)解碼芯片,在單片機(jī)8031的一個(gè)外部中斷INT1上擴(kuò)展多個(gè)中斷源的原理電路圖。.#include<reg51.h>unsignedcharstatus;bitflag;voidservice_int1()interrupt2using2/*INT1中斷服務(wù)程序*/{flag=1; /*設(shè)置標(biāo)志*/status=p1; /*存輸入口狀態(tài)*/}

在中斷服務(wù)程序中僅設(shè)置標(biāo)志,并保存I/O口輸入狀態(tài)。.voidmain(void){IP=0x04; /*置INT1為高優(yōu)先級(jí)中斷,等價(jià)PX1=1*/IE=-0x84; /*INT1開中斷,CPU開中斷

等價(jià)EA=1,EX1=1*/

for(;;) {if(flag) /*有中斷*/ {switch(status) /*根據(jù)中斷源分支*/ {case0:break; /*處理IN0*/ case1:break; /*處理IN1*/ case2:break; /*處理IN2*/ case3:break; /*處理IN3*/ default:; } flag=0; /*處理完成清標(biāo)志*/ }}}.8.2 定時(shí)器/計(jì)數(shù)器

2個(gè)16位定時(shí)器/計(jì)數(shù)器定時(shí)器:對(duì)片內(nèi)機(jī)器時(shí)鐘(周期方波)進(jìn)行計(jì)數(shù)計(jì)數(shù)器:對(duì)Tx引腳輸入的負(fù)脈沖進(jìn)行計(jì)數(shù)

與Timer工作有關(guān)的特殊功能寄存器:

TCON、TMOD、THx

和TLx8.2.0定時(shí)器概述

TIMER的作用:定時(shí)操作:定時(shí)采樣,定時(shí)掃描,定時(shí)中斷測(cè)量外部信號(hào):累加統(tǒng)計(jì),測(cè)量周期等定時(shí)輸出:PWM等監(jiān)視系統(tǒng)正常工作與否.

定時(shí)器的一般結(jié)構(gòu)和工作原理+1計(jì)數(shù)器溢出中斷脈沖控制開關(guān)

實(shí)質(zhì)是計(jì)數(shù)器,脈沖每一次下降沿,計(jì)數(shù)寄存器數(shù)值將加1.計(jì)數(shù)的脈沖如果來源于單片機(jī)內(nèi)部的晶振,由于其周期極為準(zhǔn)確,這時(shí)稱為定時(shí)器。計(jì)數(shù)的脈沖如果來源于單片機(jī)外部的引腳,由于其周期一般不確定,可表示事件發(fā)生,這時(shí)稱為計(jì)數(shù)器。.1、計(jì)數(shù)寄存器TH與TL2、定時(shí)器控制寄存器TCON

(88H)

TF1TR1TF0TR0IE1IT1IE0IT0TRx:Timer0/1運(yùn)行控制位。

=1啟動(dòng)計(jì)數(shù);=0停止計(jì)數(shù)8.2.1與定時(shí)器有關(guān)的特殊功能寄存器.TF1TR1TF0TR0IE1IT1IE0IT0TFx:

Timer0/1計(jì)數(shù)溢出標(biāo)志位。

=1計(jì)數(shù)溢出; =0計(jì)數(shù)未滿

TFx標(biāo)志位可用于申請(qǐng)中斷或供CPU查詢。

在進(jìn)入中斷服務(wù)程序時(shí)會(huì)自動(dòng)清零;但在查詢方式時(shí)必須軟件清零。定時(shí)器T0/T1中斷申請(qǐng)過程

在已經(jīng)開放T0/T1中斷允許且已被啟動(dòng)的前提下:T0/T1加滿溢出時(shí)TF0/TF1標(biāo)志位自動(dòng)置“1”

檢測(cè)到TCON中TF0/TF1變“1”后,將產(chǎn)生指令:

LCALL000BH/LCALL001BH

執(zhí)行中斷服務(wù)程序,TF0/TF1標(biāo)志位會(huì)自動(dòng)清“0”,以備下次中斷申請(qǐng)。

.3、定時(shí)器方式寄存器TMOD(89H)GATEC/TM1M0GATEC/TM1M0T1T0C/T:計(jì)數(shù)器/定時(shí)器選擇位

=1

外部事件計(jì)數(shù)器。對(duì)Tx引腳的脈沖計(jì)數(shù);=0片內(nèi)時(shí)鐘定時(shí)器。對(duì)機(jī)器周期脈沖計(jì)數(shù)定時(shí).GATE門控位:

Timer可由軟件與硬件兩者控制

GATE=0——普通用法Timer的啟/停由軟件對(duì)TRx位寫“1”/“0”控制

GATE=1——門控用法

Timer的啟/停由軟件對(duì)TRx位寫“1”/“0”

和在INTx引腳上出現(xiàn)的信號(hào)的高/低共同控制

(INTx引腳高電平允許定時(shí)/計(jì)數(shù))GATEC/TM1M0GATEC/TM1M0T1T0.GATEC/TM1M0GATEC/TM1M0T1T0M1,M0:工作方式定義位(定義4種方式):00:13位Timer01:16位Timer——經(jīng)常用到。10:可自動(dòng)重裝的8位Timer——經(jīng)常用到。11:T0分為2個(gè)8位Timer;T1此時(shí)不工.4、定時(shí)器/計(jì)數(shù)器2控制寄存器TMOD(89H)

TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2T2CONAddress=0C8HResetValue=00000000BTF2:溢出標(biāo)志位,必須由軟件清零。EXF2:外部標(biāo)志,當(dāng)EXEN2=1,且當(dāng)T2EX引腳上出現(xiàn)負(fù)跳變而出現(xiàn)捕獲或重裝時(shí),EXF2置位,申請(qǐng)中斷。EXF2必須由軟件清零。RCLK:接收時(shí)鐘標(biāo)志。 1——用定時(shí)器2溢出作為串行口的接收時(shí)鐘; 0——用定時(shí)器1溢出作為串行口的接收時(shí)鐘。TCLK:發(fā)送時(shí)鐘標(biāo)志。 1——用定時(shí)器2溢出作為串行口的發(fā)送時(shí)鐘; 0——用定時(shí)器1溢出作為串行口的發(fā)送時(shí)鐘。.TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2EXEN2:定時(shí)器2外部允許標(biāo)志。 1——若定時(shí)器2未作串行口波特率發(fā)生器,則T2EX端的負(fù)跳變引起定時(shí)器2的捕獲或重裝。 0——T2EX端的外部信號(hào)不起作用。TR2:定時(shí)器2運(yùn)行控制位。 1——啟動(dòng)。 0——停止。C/T2:計(jì)數(shù)器/定時(shí)器選擇位。 1——計(jì)數(shù)器。 0——定時(shí)器。.CP/RL2:捕獲/重裝標(biāo)志。 1——當(dāng)EXEN2=1,且T2EX端的信號(hào)負(fù)跳變時(shí),發(fā)生捕獲操作。 0——當(dāng)定時(shí)器2溢出,或在EXEN2=1條件下T2EX端的信號(hào)負(fù)跳變時(shí),發(fā)生自動(dòng)重裝操作。TF2EXF2RCLKTCLKEXEN2TR2C/T2CP/RL2.1、工作方式1:——16位的定時(shí)/計(jì)數(shù)器振蕩器12TLx

THx(8位)(8位)TFx申請(qǐng)中斷Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制=1開關(guān)接通或門與門最大計(jì)數(shù)脈沖個(gè)數(shù):65536(216)8.2.2定時(shí)器/計(jì)數(shù)器的工作方式.

THx/TLx賦初值:THx賦高8位,TLx賦低8位工作方式1的編程要點(diǎn):

TMOD選方式:寫“M1,M0”=01b選方式1若不用門控位,直接用軟件寫TRx控制啟/停若使用門控位,先置位TRx,然后由INTx端的高/低電平來控制其啟/停若要允許中斷,還須先置位ETx、EA等中斷允許控制位,并編寫中斷服務(wù)程序若不用中斷,可查詢“計(jì)數(shù)溢出標(biāo)志TFx”的方式工作,但溢出標(biāo)志TFx須軟件清0.定時(shí)器的計(jì)數(shù)單元每個(gè)機(jī)器周期自動(dòng)加1直到溢出

T=(12/fosc)*(2^16-a)us方式1:定時(shí)初值/定時(shí)時(shí)間計(jì)算.2、工作方式2:——8位自動(dòng)重裝的定時(shí)/計(jì)數(shù)器振蕩器12TLx(8位)TFx申請(qǐng)中斷Tx端TRx位GATE位INTx端≥1&C/T=0C/T=1控制=1開關(guān)接通或門與門THx(8位)溢出位門開用于需要重復(fù)定時(shí)和計(jì)數(shù)的場(chǎng)合。最大計(jì)數(shù)值:256(28).

THx/TLx賦相同初值在TLx計(jì)數(shù)達(dá)到0FFH再加“1”時(shí),TL0將溢出,“TFx”置1去申請(qǐng)中斷,同時(shí)THx中的值自動(dòng)重裝(Copy)進(jìn)TLx工作方式2的編程:

TMOD寄存器選方式:寫“M1,M0”=10b選中方式2

其他用法與各種方式1完全相同.3、工作方式3方式3只適用于定時(shí)器0。此時(shí),定時(shí)器0的TH0、TL0成為兩個(gè)獨(dú)立的計(jì)數(shù)器。

TL0可作為定時(shí)器/計(jì)數(shù)器,占用T0在TCON和TMOD中的控制位和標(biāo)志位。

TH0只能作為定時(shí)器使用,占用T1在TCON和TMOD中的控制位TR1和標(biāo)志位TF1。.4、定時(shí)器2的工作方式第一種:捕捉方式。設(shè)置為捕捉方式時(shí)和定時(shí)器0或定時(shí)器1一樣以16位方式工作。這種方式通過復(fù)位EXEN2來選擇。當(dāng)置位EXEN2時(shí),如果T2EX有負(fù)跳變電平將把當(dāng)前的數(shù)鎖存在RCAP2H和RCAP2L中,這個(gè)事件可用來產(chǎn)生中斷。通過軟件設(shè)置T2CON,可使定時(shí)/計(jì)數(shù)器2以三種基本工作方式之一工作。.用來產(chǎn)生串行口通訊所需的波特率。這通過同時(shí)或分別置位RCLK和TCLK來實(shí)現(xiàn)。第二種工作方式:為自動(dòng)重裝方式。其中包含的兩個(gè)子功能由EXEN2來選擇。當(dāng)EXEN2復(fù)位時(shí),16位定時(shí)器溢出將觸發(fā)一個(gè)中斷,并將RCAP2H和RCAP2L中的數(shù)裝入定時(shí)器中。當(dāng)EXEN2置位時(shí),除上述功能外T2EX引腳的負(fù)跳變將產(chǎn)生一次重裝操作。第三種工作方式:.8.2.3定時(shí)器/計(jì)數(shù)器的初始化1、初始化步驟(2)計(jì)算定時(shí)器/計(jì)數(shù)器的計(jì)數(shù)初值,并裝載到TH和TL寄存器。(1)確定定時(shí)器/計(jì)數(shù)器的工作方式——編程TMOD寄存器。(3)定時(shí)器/計(jì)數(shù)器工作中斷方式時(shí),開CPU中斷和源中斷,——編程IE寄存器(4)啟動(dòng)定時(shí)器/計(jì)數(shù)器——編程TCON寄存器中的TR0/TR1位。.2、計(jì)數(shù)初值的計(jì)算(1)定時(shí)器的計(jì)數(shù)初值在定時(shí)器方式下,是對(duì)機(jī)器周期脈沖進(jìn)行計(jì)數(shù)。如果系統(tǒng)時(shí)鐘為6MHz,一個(gè)機(jī)器周期為12/fosc=2us.方式0,13位定時(shí)器最大定時(shí)間隔=213×2us=16.384ms.方式1,16位定時(shí)器最大定時(shí)間隔=216×2us=131.072ms.方式2,8位定時(shí)器最大定時(shí)間隔=28×2us=512us.初值計(jì)算方法:T=(12/fosc)*(216-X)us.(2)計(jì)數(shù)器的計(jì)數(shù)器初值方式0,13位計(jì)數(shù)器最大計(jì)數(shù)值=213=8192.方式1,16位計(jì)數(shù)器最大計(jì)數(shù)值=216=65536.方式2,8位計(jì)數(shù)器最大計(jì)數(shù)值=28=256.初值計(jì)算方法:cnt=216-X.8.2.4定時(shí)器/計(jì)數(shù)器的應(yīng)用實(shí)例例1在頻率為12MHz的標(biāo)準(zhǔn)51單片機(jī)上,用timer1產(chǎn)生10khz定時(shí)器滴答中斷。P187解:1、確定timer1工作方式:

工作方式2——8位自動(dòng)重裝方式

TMOD中的M1M0=10

2、確定timer1計(jì)數(shù)初值:X=256-100=156。3、中斷方式控制字設(shè)定。EA=1(總開關(guān)),ET1=1(分開關(guān))。.4、啟動(dòng)定時(shí)器。TR1=1。5、編程(1)流程圖:主函數(shù)流程圖中斷函數(shù)流程圖(2)代碼編寫:中斷函數(shù)主函數(shù).#include<reg51.h>sbitLED=P1^0;sbitWAVE=P1^1;staticunsignedlongoverflow_count=0;/*定時(shí)器1中斷服務(wù)程序;每100個(gè)時(shí)鐘周期執(zhí)行一次*/voidtimer1_ISR(void)interrupt3{ overflow_count++; WAVE=!WAVE;}./*主函數(shù):定時(shí)器1設(shè)置為方式28位重裝方式*/voidmain(void){ TMOD=(TMOD&0X0F)|0X20; //設(shè)置定時(shí)器1工作方式 TH1=256-100; //定時(shí)器1賦初值 TL1=TH1; EA=1; //開定時(shí)器1中斷 ET1=1; TR1=1; //啟動(dòng)定時(shí)器1 while(1) { if(overflow_count==100)

{overflow_count=0; LED=!LED; } }}.例2在頻率為12MHz的標(biāo)準(zhǔn)51單片機(jī)上,輸出周期為2ms的方波。P1881、用定時(shí)器0的方式1編程,采用查詢方式。#include<reg51.h>sbitP10=P1^0;由P1^0輸出波形voidmain(void){ TMOD=0x01; //定時(shí)器工作方式0 TR0=1; //啟動(dòng)定時(shí)器0 for(;;) { TH0=(65536-1000)/256;//裝載計(jì)數(shù)初值 TL0=(65536-1000)%256; do{}while(!TF0); //查詢等待定時(shí)中斷信號(hào) P10=!P10; //取反 TF0=0; //軟件清零TF0 }}.2、用定時(shí)器0的方式1編程,采用中斷方式。#include<reg51.h>sbitP10=P1^0;voidtimer0_isr(void)interrupt1{ P10=!P10; TH0=(65536-1000)/256;//表達(dá)式的數(shù)學(xué)意義?初值恢復(fù) TL0=(65536-1000)%256;}voidmain(void){ TMOD=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; EA=1; ET0=1; TR0=1; while(1){;}}.例3在頻率為12MHz的標(biāo)準(zhǔn)51單片機(jī)上,使LED閃爍,周期為2s。p189.#include<reg51.h>sbitLED=P2^0;sbitWAVE=P1^1;staticunsignedlongoverflow_count=0;/*定時(shí)器1中斷服務(wù)程序;每50ms執(zhí)行一次,*/voidtimer1_ISR(void)interrupt3{ TH1=(65536–50000)/256; //定時(shí)器1賦初值 TL1=(65536–50000)%256;//

50ms/1us=5000,晶振? overflow_count++; WAVE=!WAVE;

}./*主函數(shù):定時(shí)器1設(shè)置為方式1*/voidmain(void){

TMOD=(TMOD&0X0F)|0X10;//設(shè)置定時(shí)器1工作方式1,//別的方式TMOD=? TH1=(65536–50000)/256; //定時(shí)器1賦初值 TL1=(65536–50000)%256; EA=1; //開定時(shí)器1中斷 ET1=1; TR1=1; //啟動(dòng)定時(shí)器1 while(1) { if(overflow_count==20)//50ms*20=1000ms

{ overflow_count=0; LED=!LED;} }}//T1的中斷系列,20個(gè)中斷為1系列,每個(gè)中斷50ms.例4在頻率為12MHz的標(biāo)準(zhǔn)51單片機(jī)上,在P1.0引腳上輸出周期為2.5S,占空比為20%的脈沖信號(hào)。P190中斷次數(shù)加1次數(shù)=高電平?次數(shù)=周期?P1.0=0P1.0=1返回#include<reg51.h>#defineduncharunsignedcharsbitWAVE=P1^0;ucharperiod=250;ucharhigh=50;ucharoverflow_count=0;voidtimer1_ISR(void)interrupt1{TH0=(65536–10000)/256; TL0=(65536–10000)%256;if(++overflow_count==high) WAVE=0;elseif(overflow_count==period){overflow_count=0; WAVE=1;}}.8.3 串行口串行通訊:數(shù)據(jù)逐位順序傳送。傳輸線僅需1-2根。8.3.0基本概念串行通信的基本特征是數(shù)據(jù)逐位順序進(jìn)行傳送。串行通信的格式及約定(如:同步方式、通訊速率、數(shù)據(jù)塊格式、信號(hào)電平……等)不同,形成了多種串行通信的協(xié)議與接口標(biāo)準(zhǔn)。常見的有:?通用異步收發(fā)器(UART)——本課程介紹的串口?通用串行總線(USB)?I2C總線?CAN總線:控制器局域網(wǎng)CAN(ControllerAreaNet)是一種現(xiàn)場(chǎng)總線?SPI總線,

"SerialPeripheralInterface",串行外圍接口?RS-485,……等等.全雙工串行接口(UART)?全雙工:(串行通信)收/發(fā)可同時(shí)進(jìn)行(手機(jī),電話)?半雙工:(串行通信)收/發(fā)不可同時(shí)進(jìn)行(對(duì)講機(jī))?單工:數(shù)據(jù)單向傳送?異步串行通信:以字符為單位進(jìn)行傳送?同步串行通信:以數(shù)據(jù)塊為單位進(jìn)行傳送?波特率(bps.):每秒鐘傳輸?shù)臄?shù)據(jù)位數(shù)。Bitspersecond異步串行通信數(shù)據(jù)格式(低位先行)D0D1D2D3D4D5D6D7停止位起始位.SBUF(發(fā))SBUF(收)發(fā)送控制器

TI接收控制器

RI移位寄存器波特率發(fā)生器T11A累加器(門)移位寄存器RxDTxD去申請(qǐng)中斷引腳引腳串行接口的組成(發(fā)送完TI才置1或接收完RI才置1).8.3.1與串行口有關(guān)的SFRp194

SM0SM1SM2RENTB8RB8TIR1SCONSM0,SM1:串行口4種工作方式的選擇位。

00方式0:8位移位寄存器I/O,波特率固定為fosc/1201方式1:8位UART(1+8+1位),

波特率可變,按公式計(jì)算;10方式2:9位UART(1+8+1+1位),波特率固定=fosc/32或1/6411方式3:9位UART(1+8+1+1位),

波特率可變,按公式計(jì)算;SM2:串行口多機(jī)通信控制位

(作為方式2、方式3的附加控制位)1、串行口控制寄存器SCON(98H).?RI,TI:串行口收/發(fā)數(shù)據(jù)申請(qǐng)中斷標(biāo)志位=1申請(qǐng)中斷;=0不申請(qǐng)中斷?TB8:方式2、3中,是要發(fā)送的第9位數(shù)據(jù)。多機(jī)通信中,TB8=0表示發(fā)送的是數(shù)據(jù);TB8=1表示發(fā)送的是地址。(奇偶校驗(yàn))?RB8:在方式2、3中,是收到的第9位數(shù)據(jù)。在多機(jī)通信中,用作區(qū)別地址幀/數(shù)據(jù)幀的標(biāo)志。(奇偶校驗(yàn))

SM0SM1SM2RENTB8RB8TIR1?REN:串行口接收允許控制位=1表示允許接收;=0禁止接收。SCON.SMOD———GF1GF0PD1DL2、電源控制寄存器PCON(97H)P.152——特殊功能寄存器PCON不能按位尋址——??SMOD:在串行口工作方式1、2、3中是波特率加倍位=1時(shí),波特率加倍=0時(shí),波特率不加倍。(在PCON中只有這一個(gè)位與串口有關(guān))

?GF1,GF0:用戶可自行定義使用的通用標(biāo)志位PCON.8.3.2串行口的工作方式1、工作方式0:8位移位寄存器I/O方式?發(fā)送:SBUF中的串行數(shù)據(jù)由RxD逐位移出;

TxD輸出移位時(shí)鐘,波特率=fosc/12;

每送出8位數(shù)據(jù)TI就自動(dòng)置1;

需要用軟件清零TI。?接收:串行數(shù)據(jù)由RxD逐位移入SBUF中;

TxD輸出移位時(shí)鐘,波特率=fosc/12;

每接收8位數(shù)據(jù)RI就自動(dòng)置1;

需要用軟件清零RI。.方式0時(shí)序圖并入串出寫入SBUFRXD數(shù)據(jù)輸出TXD同步移位脈沖TI中斷標(biāo)志D0D1D2D3D4D5D6D7寫REN=1RI=0RXD輸入RI接收時(shí)序發(fā)送時(shí)序TXD.串行口方式0的擴(kuò)展應(yīng)用——經(jīng)常用到串行口常用工作方式0擴(kuò)展出并行I/O口,工作方式1、2、3則常用于串行通信ABCLKhgfedcbaCLRABCLKCLRABCLKCLR+5V74LS16474LS16474LS16474LS164是串入并出芯片;hgfedcbahgfedcba+5V共陽LED數(shù)碼管VCCTxDRxD51單片機(jī).2、串行口工作方式1串行口為波特率可調(diào)的8位通用異步串行通信口。發(fā)送或接收一幀信息,包括1位起始位0,8位數(shù)據(jù)位和1位停止位1。其幀格式如圖所示。

方式1工作時(shí):發(fā)送端自動(dòng)添加一個(gè)起始位和一個(gè)停止位;接收端自動(dòng)去掉一個(gè)起始位和一個(gè)停止位。.(1)方式1輸出

發(fā)送時(shí),數(shù)據(jù)從TXD端輸出,當(dāng)數(shù)據(jù)寫入發(fā)送緩沖器SBUF后,啟動(dòng)發(fā)送器發(fā)送。當(dāng)發(fā)送完一幀數(shù)據(jù)后,停止工作,置中斷標(biāo)志TI為1。(2)方式1輸入

接收時(shí),由REN置1,允許接收,串行口采樣RXD,當(dāng)采樣由1到0跳變時(shí),確認(rèn)是起始位“0”,開始接收一幀數(shù)據(jù)。當(dāng)RI=0,且停止位為1或SM2=0時(shí),停止位進(jìn)入RB8位,同時(shí)置中斷標(biāo)志RI;否則信息將丟失。所以,方式1接收時(shí),應(yīng)先用軟件清除RI或SM2標(biāo)志。.(a)發(fā)送時(shí)序圖(b)接收時(shí)序圖采樣RXD輸入數(shù)據(jù)D0D1D2D3D4D5D6D7停止位起始位RI檢測(cè)負(fù)跳變,說明起始位有效寫入SBUFTXD數(shù)據(jù)輸出TID0D1D2D3D4D5D6D7停止位起始位.3、串行口工作方式2方式2下,串行口為9位UART。發(fā)送或接收一幀數(shù)據(jù)包括1位起始位0,8位數(shù)據(jù)位,1位可編程位(TB8/RB8)(用于奇偶校驗(yàn))和1位停止位。其幀格式如圖所示。.(1)方式2的輸出寫SBUF的指令,除了將8位數(shù)據(jù)送入SBUF外,同時(shí)還將TB8裝入發(fā)送移位寄存器的第9位,并通知發(fā)送控制器進(jìn)行一次發(fā)送。發(fā)送時(shí),先根據(jù)通信協(xié)議由軟件設(shè)置TB8,然后用指令將要發(fā)送的數(shù)據(jù)寫入SBUF,啟動(dòng)發(fā)送器。在送完一幀信息后,TI被自動(dòng)置1,在發(fā)送下一幀信息之前,TI必須由中斷服務(wù)程序或查詢程序清0。.

當(dāng)REN=1時(shí),允許串行口接收數(shù)據(jù)。數(shù)據(jù)由RXD端輸入,接收11位的信息。當(dāng)接收器采樣到RXD端的負(fù)跳變,并判斷起始位有效后,開始接收一幀信息。(2)方式2的輸入

當(dāng)接收器接收到第9位數(shù)據(jù)后,若同時(shí)滿足以下兩個(gè)條件:RI=0和SM2=0或接收到的第9位數(shù)據(jù)為1,則接收數(shù)據(jù)有效,8位數(shù)據(jù)送入SBUF,第9位送入RB8,并置RI=1。若不滿足上述兩個(gè)條件,則信息丟失。.方式3為波特率可變的11位UART通信方式,除了波特率以外,方式3和方式2完全相同。4、串行口工作方式串行口的初始化1、串行口的波特率波特率為每秒鐘傳送二進(jìn)制數(shù)碼的位數(shù),也叫比特?cái)?shù),單位為b/s,即位/秒。波特率用于表征數(shù)據(jù)傳輸?shù)乃俣龋ㄌ芈试礁?,?shù)據(jù)傳輸速度越快。(1)方式0波特率

在方式0中,波特率為時(shí)鐘頻率的1/12,即fosc/12,固定不變。(2)方式2波特率

在方式2中,波特率取決于PCON中的SMOD值,當(dāng)SMOD=0時(shí),波特率為fosc/64;當(dāng)SMOD=1時(shí),波特率為fosc/32..波特率=2SMOD

溫馨提示

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

評(píng)論

0/150

提交評(píng)論