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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

6.1定時/計數器的結構與工作原理6.2定時器/計數器的控制第6章單片機的定時器/計數器6.3定時/計數器的工作方式6.4定時/計數器的編程和應用實現(xiàn)定時一般有三種方法:利用軟件實現(xiàn)(延時程序);優(yōu)點:簡單,控制方便;缺點:CPU效率低。硬件實現(xiàn),專門設計一個單穩(wěn)態(tài)定時器:優(yōu)點:CPU效率高;缺點:修改參數麻煩。利用計數器實現(xiàn)計數器溢出預置數輸入脈沖計算機一般利用第三種方法實現(xiàn)1us8位256us單片機軟硬件聯(lián)合定時/計數方法:等待CPU響應系統(tǒng)時鐘脈沖加1計數器溢出標志溢出定時器外來信號脈沖加1計數器溢出標志溢出等待CPU響應計數器外來信號脈沖加1計數器溢出標志溢出等待CPU響應系統(tǒng)時鐘脈沖K定時/計數器定時器本質上是計數器,前者是對時鐘脈沖進行計數,后者則是對外來脈沖進行計數.51系列內部有2個16位的定時/計數器T0、T1功能:定時計數串行口的波特率發(fā)生器定時/計數器的可編程特性:⑴確定其工作方式是定時還是計數⑵預置定時或計數初值⑶當定時時間到或計數終止時,要不要發(fā)中斷請求⑷如何啟動定時或計數器工作可編程可編程的6.1定時/計數器的結構與工作原理一、定時計數器的結構與工作原理1、結構CPUTH1(8位)TL1(8位)T1

T1(P3.5)(8DH)(8BH)7070TH0(8位)TL0(8位)T0

T0(P3.4)(8CH)(8AH)7070TCON(88H)TMOD(89H)啟動啟動溢出溢出工作方式工作方式定時/計數器邏輯結構結構2個16位T/C分別由8位計數器TH0、TL0、

TH1、TL1組成“+1”計數器控制寄存器TCON:控制T/C的啟停、中斷等方式寄存器TMOD:控制T/C的工作方式2、工作原理⑴定時器定時輸入信號:機器內部震蕩信號的1/12分頻即每一個機器周期做一次“+1”運算T0T1∵1個機器周期=12震蕩脈沖∴計數速率為震蕩頻率的1/12分頻若單片機的晶振主頻為12MHz則計數周期為1μs⑵計數器由外部引腳(T0為P3.4,T1為P3.5)輸入計數脈沖外部輸入脈沖寬度應大于2個機器周期>TCY>TCY外部輸入脈沖發(fā)生負跳變時,進行“+1”計數下降沿高電平低電平TCY:為機器周期1、方式寄存器TMODGATEC/TM1M0GATEC/TM1M0LSBMSB(89H)TMOD控制T1控制T0門控位功能選擇位工作方式選擇6.2定時器/計數器的控制GATEC/TM1M0GATEC/TM1M0INT1INT0引腳輸入電平的控制GATE:門控位。設定T1、T0運行時,是否受GATE=

0不受外部中斷控制C/T=

00方式013位計數器

01方式116位計數器

10方式2可自動重新裝載初值的8位計數器

11方式3T0分為2個8位計數器,T1停止計數M1M0操作方式功能操作方式選擇1受外部中斷控制0為定時功能1為計數功能2、控制寄存器TCONLSBMSB(88H)TCONTF1TR1TF0TR0IE1IT1IE0IT0T1、T0

啟/停控制位T1、T0

溢出標志位與外部中斷INT1、INT0有關“0”停止“1”啟動“1”有溢出“0”無溢出可編程可控制“+1”亦可由指令清“0”工作“1”“0”記錄有無溢出⑴方式0M1M0=0013位的定時計數器,由TH的8位和TL的低5位組成T1(P3.5)GATETR1INT1震蕩器÷12TL15位TH18位TF1中斷KC/T=0C/T=1控制定時/計數器方式0邏輯圖111“+1”中斷TL4~0以T1為例:13位計數器TF1“+1”“+1”6.3定時/計數器的工作方式⑵方式1M1M0=0116位的定時計數器,由TH的8位和TL的8位組成T1(P3.5)GATETR1INT1震蕩器÷12TL18位TH18位TF1中斷KC/T=0C/T=1控制定時/計數器方式1邏輯圖16位計數器“+1”1以T1為例:中斷TF1“+1”“+1”⑶方式2M1M0=10可自動重裝載的8位計數器TH1(TH0)被定義為賦值寄存器TL1(TL0)被定義為計數器定時/計數器方式2邏輯圖

T1(P3.5)

GATETR1INT1震蕩器÷12TL18位TF1中斷KC/T=0C/T=1控制TH18位重裝載重裝載1“+1”以T1為例:中斷TL18位TF1“+1”“+1”⑷方式3M1M0=11T0被分成2個相互獨立的8位計數器TL0、TH0TL0使用自己本身的一些控制位C/T、GATE、TR0TF0、INT0等。TH0只能做定時器,并使用T1的控制位TR1、TF1,同時占用T1的中斷源震蕩器÷121/12f0scTL08位TF0中斷KC/T=0C/T=1控制1/12f0scT0(P3.4)GATETR0INT0KTH08位TF1中斷控制1/12f0scTR1定時/計數器方式3邏輯圖1TH0借用了T1的TR1和TF1,因此控制了T1的中斷此時T1只能用在一些不要中斷的情況下“+1”“+1”1“+1”“+1”TF0TF1

中斷

中斷“+1”定時/計數器的初始化初始化一般有以下幾個步驟:⑴確定工作方式,對方式寄存器TMOD賦值⑵預置定時或計數初值,直接將其寫入T0、T1中⑶根據需要對中斷允許寄存器有關位賦值,以開放或禁止定時/計數器中斷⑷啟動定時/計數器,將TRi

賦值為“1”計數初值的設定:最大計數值M:不同的工作方式M值不同方式0:M=213=8192方式1:M=216=65536方式2、3:M=28=2566.4

定時/計數器的編程和應用計數初值X的計算方法:計數方式:X=M-計數值(X即為計數值的補碼數)定時方式:(M-X)×T=定時值∴X=M-定時值/T其中T為機器周期,時鐘的12分頻,若晶振為6MHz,則T=2μs,若晶振為12MHz,則T=1

s例

若單片機晶振為12MHz,要求產生500

s定時,試計算X的初值。解:由于T=1

s,產生500

s定時,需要“+1”500次,定時器方能產生溢出。采用方式0:(

13位計數器)X=213-(500×10-6/10-6

=8192-500采用方式1:(

16位計數器)X=216-(500×10-6/10-6)=65536-500 若單片機晶振為6MHz,要求產生10ms的定時,試計算X的初值,可以采用何種工作方式?練習實例1設單片機的fosc=12MHz,采用T0定時方式1在P1.0腳上輸出周期為2ms的方波?!痉治觥坑肞1.0作方波輸出信號,周期為2ms的方波 即可用每1ms改變一次電平的方法完成, 故定時值可設置為1ms。 可做“+1”運算1000次,使T0工作在方式1, 即16位計數器TH0

=(65536–1000)

/256

=0xfcTL0

=

(65536–1000)

%

256=0x18注意:需要不斷重裝計數初值。定時初值:X=M-計數次數=65536-1000GATEC/TM1M0控制T1控制T00001TMOD方式字01H選擇方式1,16位計數器選擇定時器方式INT0不參與控制#include<reg51.h>sbitP1_0=P1^0;voidmain(void){TMOD=0x01; //定時器0方式1TR0=1;

for(;;){

TH0=(65536-1000)/256; //置計數初值

TL0=(65536-1000)%256; while(!TF0); //查詢等待TF0復位

P1_0=!P1_0; //定時時間到P1.0反相

TF0=0; //軟件清TF0}}查詢方式#include<reg51.h>sbitP1_0=P1^0;//------------------//定時器0中斷處理程序-----------voidtimer0(void)interrupt1

{P1_0=!P1_0; //P1.0取反

TH0=(65536-1000)/256; //計數初值重裝載

TL0=(65536-1000)%256;}//-------------------主函數-------------------------------------voidmain(void){

TMOD=0x01;P1_0=0;

TH0=(65536-1000)/256; //預置初值

TL0=(65536-1000)%256;

EA=1;ET0=1;TR0=1;while(1);}中斷方式ETx=1;

//開定時x中斷,x=0或1EA=1;

//開總中斷tx_srv()

interruptn{ //n=1或3……}若是查詢方式——采用條件判斷語句若是中斷方式→中斷初始化設置和中斷服務程序:while(!TFx);

//x=0或1確定采用何種方式處理溢出結果實例2采用T1定時在P1.0口輸出周期為0.5ms的方波?!痉治觥坑肞1.0作方波輸出信號,周期為0.5ms的方波 即可用每0.25ms改變一次電平的方法完成, 故定時值可設置為0.25ms。

可做“+1”運算250次,使T1工作在方式2,即8位計數器定時初值:X=M-計數次數=256-250=6GATEC/TM1M0控制T1控制T00010TMOD方式字20H中斷方式#include<reg51.h>sbitP1_0=P1^0;timer1()interrupt3{P1_0=!P1_0; }main(){

TMOD=0x20;

TH1=6; TL1=6;

EA=1; ET1=1;

TR1=1;

while(1);}思考,查詢方式呢?#include<reg51.h>sbitP1_0=P1^0;main(){

TMOD=0x20; TH1=6; TL1=6; TR1=1;

for(;;){

while(!TF1);

P1_0=!P1_0; TF1=0; }}查詢方式實例7采用定時中斷方式,實現(xiàn)下圖流水燈控制功能。要求燈的循環(huán)速率為每秒1次。【分析】利用定時器直接進行1s延時是無法實現(xiàn)的,但可以將定時中斷與軟件計數聯(lián)合起來增加延時長度,即利用定時中斷進行中斷次數統(tǒng)計。1s延時可以視為20次50ms定時中斷的累積延時量。若采用12MHz頻率定時方式1,則計數初值為:定時初值:X=M-定時值/T=216-(50×10-3/10-6)

=65536-50000GATEC/TM1M0控制T1控制T00001TMOD方式字01H#defineucharunsignedchar //定義一下方便后面使用#include<reg51.h> bitldelay=0; //長定時溢出標記uchar

t=0; //定時溢出次數//-------------------定時器0中斷函數---------------------timer0()interrupt1{

t++;

if(t==20){ t=0;

ldelay=1; //每次溢出置一個標記,以便主程序處理

}

TH0=(65536-50000)/256; //重置T0初值0x3cb0

TL0=(65536-50000)%256;}完整程序voidmain(void){ //主程序ucharcodeledp[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//跑馬燈工作狀態(tài)uchar

ledi=0; //用來指示顯示順序

TMOD=0x01; //定義T0方式1 TH0=(65536-50000)/256;

//T0初值

TL0=(65536-50000)%256;

TR0=1; //啟動定時器

ET0=1; //打開定時器0中斷

EA=1; //打開總中斷 while(1){ //主程序循環(huán)

if(ldelay){ //發(fā)現(xiàn)有時間溢出標記,進入處理

ldelay=0; //清除標記 P2=ledp[ledi]; //讀出一個值送到P2口

ledi++; //指向下一個

if(ledi==8)ledi=0;//到了最后一個燈就換到第一個 } }}實例6采用10MHz晶振,在P1.0腳上輸出周期為2.5s,占空比為20%的脈沖信號。2.5s0.5s【分析】10M晶振,方式1最大定時為78.643ms(65536×(12/10)us);若取10ms產生定時,則2.5s對應于250次溢出;高電平占20%(500ms),則對應于50次溢出。定時初值:X=M-定時值/T=216-10000×10/12 =65536-8333GATEC/TM1M0控制T1控制T00001TMOD方式字01H#include<reg51.h>#defineucharunsignedcharuchartime;//時間累計

uchar

period=250;uchar

high=50;sbitp10=P1^0;//-----------定時器0中斷處理程序-------------

timer0(void)interrupt1{TH0=(65536-8333)/256;//重載計數初值TL0=(65536-8333)%256;if(

++time==high)p10=0;//高電平時間到變低elseif(time==period)//周期時間到變高{time=0;

p10=1;}}完整程序//-------------------主函數----------------------------------main(){

TMOD=0x01;

//定時器0方式1TH0=(65536-8333)/

256;

//預置計數初值TL0=(65536-8333)%256;

EA=1;ET0=1;

TR0=1;

while(1);}完整程序 編寫程序,要求采用T0,從P1.7輸出周期為400ms,占空比9:1的矩形脈沖信號。課堂測試實例3作計數器用將第4章實例5“計數顯示器”中的查詢法按鍵檢測改用T0中斷方式實現(xiàn)?!痉治觥繉0設置為計數器方式2,設法使其在1個外部脈沖到來時就能溢出(即計數溢出周次為1)產生中斷請求。

T0(P3.4)

GATETR0INT0震蕩器÷12TL08位TF0中斷KC/T=1控制TH08位重裝載重裝載1“+1”中斷TL08位TF0計數初值X=M–計數值

=28–1=255=0xffGATEC/TM1M00110TMOD方式字06H完整程序#include<reg51.H>unsignedcharcode

table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsignedcharcount=0;

//計數器賦初值//-------------------中斷服務程序--------------------------int0_srv()interrupt1{ count++;

if(count==100)count=0; P0=table[count/10]; //P0口顯示初值 P2=table[count%10];}//----------------------------主程序------------------------voidmain(void) {

//計數器賦初值P0=table[0];

//P0口顯示初值P2=table[0];

//P2口顯示初值

TMOD=0x06;TH0=TL0=0xff;ET0=1;EA=1;

TR0=1;while(1);}完整程序實例2測量從P3.3(INT1)輸入的正脈沖的寬度,測量結果以BCD碼形式存放在片內RAM40H開始的單元處(設40H地址存放個位,系統(tǒng)時鐘為12MHz,被測脈沖信號周期不超過100ms)。原理分析:GATE=TR1=1時允許INT1的脈沖控制定時器的啟停,即INT1=1可啟動定時器,INT1=0可關閉定時器。若T1為定時器方式(計數初值為0),則根據T1先啟動、再關閉后的計數值可算出被測脈沖寬度。門控位GATE的應用GATEC/TM1M0控制T1控制T0TMOD選方式1選定時器方式INT1為高時,T1開始計數1001T1(P3.5)GATETR1INT1震蕩器÷12TL18位TH18位TF1中斷KC/T=0C/T=1控制16位計數器“+1”1INT1INT1為高時T1開始計數INT1為低時T1停止計數00111寬度≤65ms計數值

即μs數1“+1”“+1”INT1INT1為高時T1開始計數INT1為低時T1停止計數#include<reg51.h>sbitP3_3=P3^3;voidmain(){unsignedchar*P,i;

inta;

P=0x40;//指針指向片內40H單元

TMOD=0x90;//GATE=1,工作方式為計數器T1

TL1=0x00;TH1=0x00;

//

溫馨提示

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

評論

0/150

提交評論