第6章單片機的定時計數(shù)器_第1頁
第6章單片機的定時計數(shù)器_第2頁
第6章單片機的定時計數(shù)器_第3頁
第6章單片機的定時計數(shù)器_第4頁
第6章單片機的定時計數(shù)器_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第6 6章章 單片機的定時單片機的定時/ /計數(shù)器計數(shù)器 MCS-51單片機內(nèi)部有兩個16位的可編程的定時器/計數(shù)器,即定時器T0和定時器T1(8052提供3個,第3個稱為定時器T2)。它們既可用做定時器方式,又可用做計數(shù)器方式。6.1 6.1 定時定時/ /計數(shù)器的基本知識計數(shù)器的基本知識6.1.1 6.1.1 定時定時/ /計數(shù)器的結(jié)構(gòu)計數(shù)器的結(jié)構(gòu) 定時器/計數(shù)器的基本結(jié)構(gòu)如圖6-1所示,基本的部件是兩個8位的計數(shù)器(其中TH1和TL1是T1的計數(shù)器,TH0和TL0是T0的計數(shù)器)。1講 在作為定時器使用時,是對單片機內(nèi)部機器周期的計數(shù),因其內(nèi)部頻率為晶振頻率的 1/12,如果晶振頻率1

2、2MHz,則定時器每接收一個輸入脈沖的時間為1s。 當它用做對外部事件計數(shù)時,接相應(yīng)的外部輸入引腳T0(P3.4)或T1(P3.5)。在這種情況下,當檢測到輸入引腳上的電平由高跳變到低時,計數(shù)器就加1。圖圖6-1 定時定時/計數(shù)器的基本結(jié)構(gòu)計數(shù)器的基本結(jié)構(gòu)6.1.2 6.1.2 有關(guān)的控制寄存器有關(guān)的控制寄存器 與定時/計數(shù)器應(yīng)用有關(guān)的控制寄存器有3個。 1.定時器控制寄存器(TCON) TCON寄存器既參與中斷控制又參與定時控制。有關(guān)中斷的控制內(nèi)容已在第5章介紹了,現(xiàn)在只介紹和定時/計數(shù)器有關(guān)的控制位。與定時/計數(shù)器有關(guān)的控制位共有4位。1) TF0和TF1:定時/計數(shù)器溢出標志位 當計數(shù)器

3、計數(shù)溢出(計滿)時,該位置1。使用査詢方式時,此位作為狀態(tài)位供查詢,但應(yīng)注意查詢有效后,需用軟件方法及時將該位清零;使用中斷方式時,此位作為中斷標志位,在轉(zhuǎn)向中斷服務(wù)程序時由硬件自動清零。2) TR0和TR1:定時器運行控制位 TR0(TR1)=0:停止定時/計數(shù)器工作。 TR0(TR1)=1:啟動定時/計數(shù)器工作。 該位根據(jù)需要以軟件方法使其置1或清零。2. 工作方式控制寄存器(TMOD) TMOD寄存器是一個專用寄存器,用于設(shè)定兩個定時/計數(shù)器的工作方式,但TMOD寄存器不能位尋址,只能用字節(jié)傳送指令設(shè)置其內(nèi)容。格式如圖6-2所示。1) GATE:門控位 GATE=0:由運行控制位TR啟動

4、定時器。 GATE=1:由外中斷請求信號( 和 )和TR的組合狀態(tài)啟動定時器。2) :定時方式或計數(shù)方式選擇位 =0:定時器工作方式。 =1:計數(shù)器工作方式。3) M1M0:工作方式選擇位 M1M0=00:方式0,13位定時/計數(shù)器工作方式, M1M0=01:方式1,16位定時/計數(shù)器工作方式。 M1M0=10:方式2,常數(shù)自動裝入的8位定時/計數(shù)器工作方式。 M1M0=11:方式3,僅適用于T0,為兩個8位定時/計數(shù)器工作方式,在方式3時T1 停止計數(shù)。 3. 中斷允許控制寄存器(IE) IE寄存器的詳細內(nèi)容在第5章已介紹,這里只就與定時/計數(shù)器有關(guān)的位介紹如下。 EA:中斷允許總控制位。

5、ET0和ET1:定時/計數(shù)器中斷允許控制位。 ET0 (ET1)=0,禁止定時器/計數(shù)器中斷; ET0 (ET1)=1,允許定時器/計數(shù)器中斷。TCTCTC0INT1INT6.1.3 6.1.3 工作方式工作方式 MCS-51單片機的定時/計數(shù)器共有4種工作方式,在C51語言程序設(shè)計中,方式1和方式2用得比較多。 1. 方式0 方式0是13位計數(shù)結(jié)構(gòu)的工作方式,其計數(shù)器由TH0的全部8位和TL0的低5位構(gòu)成,TL0的高3位不用。不管是哪種工作方式,當TL0的低5位計數(shù)溢出時,向TH0進位,而全部13位計數(shù)溢出時,則向計數(shù)溢出標志位TF0進位。計數(shù)范圍和定時范圍如下: 1) 當定時器/計數(shù)器在方

6、式1下作計數(shù)器計數(shù)器用時,其計數(shù)范圍是18192 (2 ) 2) 當定時器/計數(shù)器在方式1下作定時器定時器用時,其定時時間計算公式為: T =(2 -X)T 12式中,T 為定時時間,X為計數(shù)初值,T 為晶振周期。13ddosc13osc 2. 方式1(重點分析) 方式1是16位計數(shù)結(jié)構(gòu)的工作方式,計數(shù)器由TH0的全部8位和TL0的全部8位構(gòu)成, 其邏輯電路和工作情況與方式0完全相同,所不同的只是組成計數(shù)器的位數(shù)。方式1的邏輯電路如圖6-3所示。中斷0TCTR0TF0TH0(8位)TL0(8位)振蕩器12GATEM1M0TMODT0 TCON11&控制INT01TCTC10 圖圖6-3

7、 方式方式1的邏輯電路圖的邏輯電路圖MSC-51單片機之所以重復(fù)設(shè)置完全一樣的方式0和方式1,是出于與MCS-48單片機兼容考慮,所以對于方式1無須多加討論,下面僅將其計數(shù)范圍和定時范圍列出, 1) 當定時器/計數(shù)器在方式1下做計數(shù)器用時,其計數(shù)范圍是165536 (2 )。 2) 當定時器/計數(shù)器在方式1下做定時器用時,其定時時間計算公式為: T =(2 -X)T 12 式中,T 為定時時間,X為計數(shù)初值,T 為晶振周期。 1616ddoscosc 3. 方式2工作方式0和工作方式1的特點是計數(shù)溢出后,計數(shù)回0,而不能自動重裝初值。因此,循環(huán)定時或循環(huán)計數(shù)應(yīng)用時就存在反復(fù)設(shè)置計數(shù)初值的問題,

8、這不但影響定時精度,而且也給程序設(shè)計帶來麻煩。方式2就是針對此問題而設(shè)置的,它具有自動重裝計數(shù)初值的功能。在這種工作方式下,把16位計數(shù)分為兩部分即以TL作為計數(shù)器,以TH作為預(yù)置計數(shù)器, 初始化時把計數(shù)初值分別裝入TL和TH中。當計數(shù)溢出時,由預(yù)置計數(shù)器自動給計數(shù)器Tl重新裝初值。這不但省去了用戶程序中重裝指令,而且也有利于提高定時精度。但這種方式是8位計數(shù)結(jié)構(gòu),計數(shù)值有限,最大只能到256。 計數(shù)范圍是1256 (2 ), 定時時間計算公式為T =(2 -X)T 12式中,T 定時時間,X為計數(shù)初值, T 為晶振周期。方式2的邏輯電路如圖6-4所示。88ddoscosc 這種自動重裝工作方

9、式非常適應(yīng)于循環(huán)定時或循環(huán)計數(shù)應(yīng)用,例如: 1)用于產(chǎn)生固定脈寬的脈沖 2)用做串行數(shù)據(jù)通信的波特率發(fā)生器.圖圖6-4 方式方式2的邏輯電路圖的邏輯電路圖4. 方式3 前3種工作方式,對兩個定時/計數(shù)器的設(shè)置和使用是完全相同的,但是在工作方式3 下,兩個定時/計數(shù)器的設(shè)置和使用卻是不同的,因此要分開介紹。 1) 工作方式3下的T0(定時/計數(shù)器0) 在工作方式3下,定時/計數(shù)器T0被拆成兩個獨立的8位TL0和TH0。其中,TL0既可以用做計數(shù),又可以用做定時,定時/計數(shù)器T0的各控制位和引腳信號全歸它使用,其功能和操作與方式0和方式1完全相同,而且邏輯電路結(jié)構(gòu)也極其類似。 定時/計數(shù)器T0的高

10、8位TH0,只能作為簡單的定時器使用。由于定時/計數(shù)器T0的控制位已被TL0占用,因此只好借用定時/計數(shù)器T1的控制位TR1和TF1,即以計數(shù)溢出置位TF1,而定時的啟動和停止則由TR1的狀態(tài)控制, 由于TL0既能作為定時器使用又能作為計數(shù)器使用,而TH0只能作為定時器使用。因此在工作方式3下,定時/計數(shù)器T0構(gòu)成兩個定時器或一個定時器一個計數(shù)器。 2)在定時/計數(shù)器T0設(shè)置為工作方式3時的定時/計數(shù)器T1 這里只討論定時/計數(shù)器0工作方式3時定時/計數(shù)器1的使用情況。因為定時/計數(shù)器0工作在方式3時已借用了定時/計數(shù)器1的運行控制位TR1和計數(shù)溢出標志位TF1,所以定時/計數(shù)器1不能工作于方

11、式3,只能工作于方式0、方式1或方式2。 且在定時/計數(shù)器0已工作于方式3時,定時/計數(shù)器1通常用做串行口的波特率發(fā)生器,以確定串行通信的速率。因為已沒有計數(shù)溢出標志位TF1可供使用,因此只能把計數(shù)溢出直接送給串行口。 當作為波特率發(fā)生器使用時,只需設(shè)置好工作方式,便可自動運行。如要停止工作,只需送入一個把它設(shè)置為方式3的方式控制字就可以了。6.1.4 6.1.4 初始化初始化1. 初始化步驟 在使用8051單片機的定時/計數(shù)器前,應(yīng)對它進行初始化編程,主要是對TCON和TMOD寄存器編程,還需要計算和裝載T/C的計數(shù)初值,一般應(yīng)完成以下幾個步驟:1) 確定T/C的工作方式編程TMOD寄存器;

12、2) 計算T/C中的計數(shù)初值,并裝載到TH和TL;3) T/C在中斷方式工作時,需開CPU中斷和源中斷編程IE寄存器;4) 啟動T/C編程TCON中的TR1或TR0位。 2. 計數(shù)初值的計算 在計數(shù)模式,工作方式下對應(yīng)的最大計數(shù)值如下。方式1:16位計數(shù)器的最大計數(shù)值為2 =65536。方式2:8位計數(shù)器的最大計數(shù)值為2 =256。在用C語言編寫程序時,計數(shù)器工作于方式1情況下,可按下式裝載計數(shù)寄存器初始值: TH=X/256 TL=X%256 (說明:X代表計數(shù)初值)計數(shù)器工作于方式2情況下,可按下式裝載計數(shù)寄存器初始值: TH=TL=X說明:N=MAX-X (計數(shù)值=最大計數(shù)值-計數(shù)初值)

13、N代表計數(shù)值,MAX代表最大計數(shù)值,X代表計數(shù)初值816【例【例6-16-1】定時器/計數(shù)器0工作于計數(shù)方式,且允許中斷,計數(shù)值N=100,分別令其工作在方式1和方式2,用C語言進行初始化編程。 (詳細介紹) 方式1編程: 首先,定時器/計數(shù)器0工作于計數(shù)方式,則 =1,GATE=0。計數(shù)器0工作于方式1, 所以M1M0=01。計數(shù)器1不用,TMOD的高4位取0000,則TMOD=05H。 計數(shù)寄存器為16位,因此計數(shù)寄存器初值分別為: TH0=(65536-100)/256, TL0=(65536-100)%256 初始化程序如下: TMOD=0 x05; /設(shè)置計數(shù)器工作方式 TH0=(6

14、5536-100)/256; /計數(shù)器高8位TH0賦初值 TL0=(65536-100)%256 /計數(shù)器低8位TL0賦初值 TR0=1; /啟動計數(shù)器 ET0=1; /開計數(shù)器中斷 EA=1; /CPU開中斷TC方式2編程: 計數(shù)器0工作于方式2,所以M1M0=10。計數(shù)器1不用,TMOD的高4位取0,則TMOD=06H。、 方式2為8位初值自動重載方式,計數(shù)寄存器初值分別為:TH0=TL0=256-100。 初始化程序如下: TMOD=0 x06; TH0=156; TL0=156;其余語句與前面相同。 在定時器工作方式下,T/C是對機器周期脈沖計數(shù)的,如果單片機外接晶振頻率為f =12M

15、Hz,那么一個機器周期為T =12/f =1s,則: 方式1:16位定時器的最大定時間隔為2 =65536s。 方式2:8位定時器的最大定時間隔為2 =256s。 如果定時器計數(shù)初值為X,機器周期為T ,定時器定時時間為T ,則T =(2 -X)T , 那么定時器的初值為:X=2 - T / T ,計算得到定時器計數(shù)寄存器的初始值X,就可根據(jù)定時器的工作方式裝載TH和Tl,編程方法類似于計數(shù)器方式。168cycydnoscosccycyddn【例例6-26-2】單片機外接晶振頻率f =12MHz,定時器/計數(shù)器0工作于定時方式,且允許中斷,定時時間為20ms,令其工作在方式1。用C語言進行初始

16、化編程。定時器/計數(shù)器0工作于定時方式:從而 =0,GATE=0。定時器0工作于方式1,所以 M1M0=01。定時器1不用,TMOD=00000001=01H。計數(shù)寄存器為16位,因此定時器的計數(shù)初值為:X=(65536-20000)/1。 計數(shù)寄存器初值分別為:TH0=(65536-20000)/256,TL0=(65536-20000)%256因此初始化程序如下:TMOD=0 x01; /設(shè)置定時器工作方式TH0=(65536-20000)/256; /定時/計數(shù)器T0的高8位TH0賦初值 TL0=(65536-20000)%256; /定時/計數(shù)器T0的低8位TL0賦初值 TR0=1;

17、/啟動計數(shù)器 ET0=1; /開計數(shù)器中 EA=1;oscTC6.2 6.2 定時定時/ /計數(shù)器的編程及應(yīng)用實例計數(shù)器的編程及應(yīng)用實例【例【例6-36-3】設(shè)系統(tǒng)時鐘頻率為12MHz,用定時/計數(shù)器T0編程實現(xiàn)從P1.0輸出周期為500s的方波。 分析:從P1.0輸出周期為500s的方波,只需P1.0每250s取反一次則可。當系統(tǒng)時鐘為12MHz,定時/計數(shù)器T0工作于方式2時,最大的定時時間為256s,(也可以取方式2), 滿足250s的定時要求,方式控制字應(yīng)設(shè)定為00000010B (02H)。系統(tǒng)時鐘為12MHz,定時250s,計數(shù)值N為 250,初值X=256-250=6, 則TH0

18、=TL0=06H。 認真分析對比:中斷和查詢的特點 #includesbit P1_0=P10;void main( ) TMOD=0 x02;/初始化 THO=0 x06; TL0=0 x06; EA=1; ET0=1; TR0=1; while(1);/等待中斷發(fā)生void time0_int(void) interrupt 1/中斷服務(wù)程序 P1_0=!P1_0; #inclidesbit P1_0=P10;void main() unsigned char i;TMOD=0 x02;/初始化THO=0 x06;TL0=0 x06;TR0=1;for(;) if(TF0) TF0=0;P

19、1_0=!P1_0; 【例【例6-4】設(shè)單片機的f =12MHz,要求在P1.0上產(chǎn)生周期為2ms的方波。 要在P1.0上產(chǎn)生周期為2ms的方波,定時器應(yīng)產(chǎn)生1ms的周期性定時,定時到對P1.0取反。 要產(chǎn)生1ms的定時,應(yīng)選擇方式1,定時器方式。 TMOD的確定:選擇定時器/計數(shù)器T0,定時器方式。方式1,GATE不起作用,高4 位為0000,TMOD=01H。TH、TL的確定:單片機的f =12MHz,則單片機的機器周期為1s,1ms=1000s,計數(shù)器的計數(shù)初值為 65536-1000,TH0=(65536-1000)/ 256,TL0=(65536-1000)% 256。oscosc

20、程序如下: #include sbit P1_0=P10; void main(void) TMOD=0 x01; TR0=1; for(;) TH0=(65536-1000)/ 256; TL0=(65536-1000)% 256; do while(!TF0); P1_0=!P1_0; TF0=0; 程序如下:#includesbit P1_0=P10;void timer0(void) interrupt 1 using 1P1_0=!P1_0;TH0=(65536-1000)/ 256; TL0=(65536-1000)% 256; void main(void) TMOD=0 x01

21、; P1_0=0; TH0=(65536-1000)/ 256; TL0=(65536-1000)% 256; EA=1; ET0=1; TR0=1; do while(1); 由于計數(shù)器向上計數(shù),為得到1000個計數(shù)之后的定時器溢出,必須給定時器賦初值 65536-1000,C語言中相當于-1000。 1) 用定時器0的方式1編程,釆用查詢方式 程序如下:#includesbit P1_0=P10;void timerlover(void);void main(void) TMOD=0 x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; TR0=

22、1; for(;) if(TF0) timerlover( ); void timerlover(void) TH0=(65536-1000)/256;TL0=(65536-1000)%256;TF0=0;P1_0=!P1_0; 2) 采用中斷方式程序如下:#includesbit P1_0=P10;void timer0(void) interrupt 1 using 1 P1_0=!P1_0; TH0=(65536-1000)/256; TL0=(65536-1000)%256; TF0=0; void main(void) TMOD=0 x01; P1_0=0; TH0=(65536-1

23、000)/256; TL0=(65536-1000)%256; EA=1; ET0=1; TR0=1; for(;) ; 例例6-56-5 設(shè)系統(tǒng)時鐘頻率為12MHz,編程實現(xiàn)從P1.1輸出周期為1s的方波。 要輸出周期為1s的方波,應(yīng)產(chǎn)生500ms的周期性定時,定時到則對P1.1取反即可實現(xiàn)。由于定時時間較長,一個定時/計數(shù)器不能直接實現(xiàn),一個定時/計數(shù)器最長定時時間為65ms多一點,可以用以下兩種方法實現(xiàn)。 用定時/計數(shù)器T0產(chǎn)生周期性為10ms的定時,然后用一個變量對10ms計數(shù)50次。系統(tǒng)時鐘為12MHz,則定時/計數(shù)器T0定時10ms,計數(shù)值N為10000,選工作方式1,方式控制字為

24、0000001B (01H),則初值X為X=65536-10000。程序代碼如下:2講#includesbit P1_1=P11;unsigned char i;/定義計數(shù)變量void main( )i=0;TMOD=0 x01;/初始化TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;TR0=1;while(1);void time0_int(void) interrupt 1/中斷服務(wù)程序TH0=(65536-10000)/256;/重載初始值TL0=(65536-10000)%256;/重載初始值i+;/每發(fā)生一次中斷,計數(shù)變量

25、加1if(i=50)/發(fā)生50次中斷,定時500msP1_1=!P1_1;i=0;/計數(shù)變量清零 用定時/計數(shù)器T1實現(xiàn),對10ms計數(shù)50次。定時/計數(shù)器T1工作于計數(shù)方式時,計數(shù)脈沖通過T1 (P3.5)輸入。設(shè)定時/計數(shù)器T0定時時間到對P1.0取反一次,則T1 (P3.5) 每10ms產(chǎn)生一個計數(shù)脈沖,那么定時500ms只需計數(shù)50次,設(shè)定時/計數(shù)器T1工作于方式 2,初值X=256-50=206, TH1=TL1=206。因為定時/計數(shù)器T0工作于方式1,T0工作于定時方式,則這時方式控制字為01100001B(61H)。定時/計數(shù)器T0和T1都釆用中斷方式工作。程序代碼如下:#in

26、cludesbit P1_1=P11;sbit P1_0=P10;void main( )TMOD=0 x61; /初始化TH0=(65536-10000)/256;TL0=(65536-10000)%256;TH1=206;TL1=206;EA=1;ET0=1; ET1=1;TR0=1; TR1=1;while(1);void time0_int(void) interrupt 1 /T0中斷服務(wù)程序TH0=(65536-10000)/256;/重載初始值TL0=(65536-10000)%256;/重載初始值P1_0=!P1_0;void time1_int(void) interrupt

27、 3 /T1中斷服務(wù)程序P1_1=!P1_1;【例【例6-6】設(shè)系統(tǒng)時鐘頻率為12MHz,編程實現(xiàn):P1.1引腳上輸出周期為1s,占空比為20%的脈沖信號。 根據(jù)輸出要求,脈沖信號在一個周期內(nèi)高電平占0.2s,低電平占0.8s,超出了定時器的最大定時間隔,因此利用定時器T0產(chǎn)生一個基準定時配合軟件計數(shù)來實現(xiàn)。取50ms作為基準定時,采用工作方式1,這樣這個周期需要20個基準定時:其中高電平占4個基準定時。 #include sbit P1_1=P11; unsigned char i;/定義計數(shù)變量 void main( ) i=0;/初始化TMOD=0 x01;TH0=(65536-5000

28、0)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1); void time0_int(void) interrupt 1 /中斷服務(wù)程序TH0=(65536-50000)/256;/重載初始值TL0=(65536-50000)%256;/重載初始值i=i+1;if(i=4) /高電平時間到變低 P1_1=0;else if(i=20)/周期時間到變高 P1_1=1; i=0; /計數(shù)變量清零【例【例6-7】采用10MHz晶振,在P1.0腳上輸出周期為 2.5s,占空比為20%的脈沖信號。對于10MHz晶振,使用定時器最大定時為幾十毫秒 (

29、ms)。取10ms定時,則周期2.5s需250次,占空比為20%, 高電平應(yīng)為50次中斷。10ms定時,晶振定時,晶振f=10MHz。Tcy=12/f=12/10MHZ=1.2s 需定時計數(shù)次數(shù)需定時計數(shù)次數(shù)X=10ms/Tcy=10000/1.2=8333 中斷服務(wù)程序流程如圖6-5所示。#include#define uchar unsigned charuchar time;sbit P1_0=P10; uchar period=250; uchar high=50;time0( ) interrupt 1 using 1 /中斷服務(wù)程序TH0=(65536-8333)/256;/重載計

30、數(shù)值TL0=(65536-8333)%256;if(+time=high)/高電平時間到變低 P1_0=0;else if(time=period) /周期時間到變高 time=0; P1_0=1;3void main( )TMOD=0 x01;/定時器0方式1TH0=(65536-8333)/256;/預(yù)置計數(shù)值TL0=(65536-8333)%256;EA=1;/開CPU中斷ET0=1;/開T0中斷TR0=1;/啟動T0dowhile(1);圖圖6-5 中斷程序流程圖中斷程序流程圖例例6-86-8 編程實現(xiàn):利用定時/計數(shù)器T0對輸入到P3.4引腳上的脈沖進行釆樣計數(shù)。由于計數(shù)寄存器字節(jié)長

31、度所限,且用硬件寄存器最多只能計數(shù)65536個脈沖,為解決這一問題可加軟件計數(shù)來實現(xiàn)。程序代碼如下:#includeunsigned long i;/定義軟件計數(shù)變量unsigned char count_low;/定義計數(shù)變量,用來讀取TL0的值unsigned char count_high;/定義計數(shù)變量,用來讀取TH0的值void read_counter( );/聲明讀計數(shù)寄存器子函數(shù)void main( ) i=0;/初始化TMOD=0 x05;/T0設(shè)置為計數(shù)器模式,方式1TH0=0;TL0=0;EA=1;ET0=1;TR0=1;while(1) read_counter( );

32、/循環(huán)讀取、處理計數(shù)寄存器內(nèi)容void read_counter( )/讀取計數(shù)寄存器內(nèi)容do count_high=TH0;/讀高字節(jié) count_low=TL0;/讀低字節(jié) . . ./計數(shù)值處理語句while(count_high!=TH0); /*在讀取計數(shù)寄存器內(nèi)容時要特別注意,因為單片機不能在同一時刻讀取TH1和TL1的內(nèi)容,因而如果只讀取一次可能會出錯。比如:先讀TL,再讀TH,可能會由于此時恰好產(chǎn)生TL溢出向TH進位的情況而出錯;同樣,先讀TH后讀TL也可能出現(xiàn)類似的錯誤。因此,需要采用上面程序中給出的讀取順序:先讀TH,再讀TL,然后再讀TH。若兩次讀取的TH內(nèi)容一致,則讀取

33、正確,否則就是不正確,需要再次重復(fù)上次讀取過程直到正確讀取為止*/void time0_int(void) interrupt 1i=i+1;TH0=0;TL0=0;TR0=1; /*中斷服務(wù)程序:當計數(shù)寄存器溢出進入;當計數(shù)寄存器溢出;軟件計數(shù)變量加1;此變量中的1相當于收到65536個脈沖信號*/ 【例【例6-96-9】利用定時器的門控位GATE測量正脈沖寬度,脈沖從/INT1(P3.3)引腳輸入。門控位GATE=1,定時/計數(shù)器T1的啟動受到外中斷1引腳/INT1的控制,當GATE=1,TR1=1時,只有/INT1引腳為高電平時,T1才被允許計數(shù)(定時/計數(shù)器T0具有同樣特性),利用GA

34、TE的這個功能,可以測量/INT1引腳(P3.3)上正脈沖的寬度(機器周期數(shù)),其方法圖6-6所示。 程序代碼如下:#includesbit P3_3=P33;/定義位變量unsigned count_low;/定義計數(shù)變量,用來讀取TL1值unsigned count_high;/定義計數(shù)變量,用來讀取TH1值void read_counter();/聲明讀計數(shù)寄存器子函數(shù)void main()TMOD=0 x90;/T1設(shè)置為定時器模式,工作方式1TH1=0;TL1=0;TR1=1;while(P3_3=1); /等待INT1變低TR1=1;/如果INT1為低,啟動T1(未真正開始計數(shù))w

35、hile(P3_3=0); /等待INT1變高,變高后T1真正開始計數(shù)while(P3_3=1); /等待INT1變低,變低后T1實際上停止計數(shù)TR1=0;/停止T1read_counter( );/讀取、處理計數(shù)寄存器void read_counter( ) /讀取計數(shù)寄存器內(nèi)容docount_high=TH1; /讀高字節(jié)count_low=TL1; /讀低字節(jié). . . /計數(shù)值處理語句while(count_high!=TH1);【例【例6-106-10】設(shè)P1口的P1.0、P1.1上有2個開關(guān)S1和S2 ,周期開始時,它們?nèi)P(guān)。2s以后S1開,0.1s后S2開;S1保持開2.4s,周

36、而復(fù)始。釆用10MHz晶振。解:根據(jù)要求P1.0,P1.1上開關(guān)順序如圖6-7所示。采用10MHz晶振,每10ms中斷一次,0.1s對應(yīng)10次,幵關(guān)變化對應(yīng)的中斷次數(shù)位置為:0、200、 210、 400、 450。相應(yīng)的P1.1 P1.0輸出分別為:00、01、11、10、00。 #include#define uchar unsigned char #define uint unsigned intsbit P1_0=P10;sbit P1_1=P11;uchar i;uint time;void timer0( ) interrupt 1 using 1 /*item1*/TH0=(65

37、536-8333)/256;TL0=(65536-8333)%256;time+;/*item2*/switch(time)case 200:P1_1=0;P1_0=1; break;case 210:P1_1=1;P1_0=1; break;case 400:P1_1=1;P1_0=0; break;case 450:P1_1=0;P1_0=0; break;void main( )P1=0;time=0;/*item3*/i=1;TMOD=0 x01;TH0=(65536-8333)/256;TL0=(65536-8333)%256;TR0=1;ET0=1;EA=1;for(;) 其中,i

38、tem1為中斷服務(wù)程序,每10ms中斷一次,重載定時器初值;item2為記錄中斷發(fā)生的次數(shù);item3為初始化變量和定時器?!纠?-11】 以下是一個產(chǎn)生占空比變化的脈沖信號的程序。它產(chǎn)生的脈寬調(diào)制信號可用于電機變速控制。#include#define uchar unsigned char #define uint unsigned intuchar time,staus,percent,period;bit one_round;uint oldcount,target=500;void pluse(void) interrupt 1 using 1 TH0=(65536-833)/256;

39、/*1ms(1000Hz)*/TL0=(65536-833)%256;ET0=1;if(+time=percent)P1=0;else if(time=100)time=0;P1=1; void tachmeter(void) interrupt 2 using 2 unionuint word;struct uchar hi; uchar lo;byte;newcount;newcount.byte.hi=TH1;newcount.byte.lo=TL1;period=newcount.word-oldcount;/*測得的周期*/oldcount=newcount.word;one_rou

40、nd=1;/*轉(zhuǎn)一圈,引起中斷,設(shè)置標志*/void mian(void)IP=0 x04;/置INT1為高優(yōu)先級TMOD=0 x11;/T0設(shè)置為16位方式TCON=0 x54;/T0運行,IT1邊沿觸發(fā)TH0=0;TL0=0;/設(shè)置初始計數(shù)值IE=0 x86;/允許終端EX1,ET0for(;)if(one_round)/每轉(zhuǎn)一圈,調(diào)整if(percent0)-percent;/占空比減one_round=0;【例【例6-12】通過定時器的定時產(chǎn)生一定頻率的波形信號,經(jīng)P1.0輸出,驅(qū)動揚聲器, 即發(fā)出一定頻率的聲調(diào)。將樂曲的聲調(diào)連續(xù)發(fā)出,使其按照節(jié)拍變化即可演奏一首樂曲。 電路圖如圖6-

41、8所示。C51語言程序如下:#include#define uchar unsigned char#define uint unsigned int sbit P1_0=P10;uint m,i;uint rti;uint l;/音頻表:高位、低位uchar code toneh14=0 xfe,0 xfe,0 xfe,0 xfe,0 xfe,0 xfe,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff,0 xff;uchar code tonel14=0 x22,0 x56,0 x85,0 x9a,0 xc1,0 xe3,0 x03,0 x10,0 x2b,0 x42,0 x4c,0 x60,0 x71,0 x81; /樂譜uchar code song=123112313455345556543256543215111511;uchar code length=444444444444444422224422224422224444444444;void timer0(void) interrupt 1 using 1 P1_0=!P1_0;/P1.0取反TH0=tonehrti;/裝入音頻初值T

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論