日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]8051定時(shí)器/計(jì)數(shù)器介紹:8051有兩個(gè)定時(shí)器/計(jì)數(shù)器,而8052則有三個(gè)定時(shí)器/計(jì)數(shù)器。定時(shí)器、計(jì)數(shù)器本質(zhì)都是一樣的,定時(shí)器通過(guò)對(duì)內(nèi)部脈沖進(jìn)行計(jì)數(shù)來(lái)達(dá)到計(jì)時(shí)的目的,而計(jì)數(shù)器是對(duì)外部輸入脈沖進(jìn)行計(jì)數(shù),所以它們的本質(zhì)

8051定時(shí)器/計(jì)數(shù)器介紹:
8051有兩個(gè)定時(shí)器/計(jì)數(shù)器,而8052則有三個(gè)定時(shí)器/計(jì)數(shù)器。定時(shí)器、計(jì)數(shù)器本質(zhì)都是一樣的,定時(shí)器通過(guò)對(duì)內(nèi)部脈沖進(jìn)行計(jì)數(shù)來(lái)達(dá)到計(jì)時(shí)的目的,而計(jì)數(shù)器是對(duì)外部輸入脈沖進(jìn)行計(jì)數(shù),所以它們的本質(zhì)都是一樣的。

定時(shí)器/計(jì)數(shù)器的工作模式:
定時(shí)器/計(jì)數(shù)器0有四種工作模式,而定時(shí)器/計(jì)數(shù)器1只有三種工作模式,工作模式由TMOD寄存器的M1和M0位控制。

M1M0工作模式00013位定時(shí)器/計(jì)數(shù)器。01116位定時(shí)器/計(jì)數(shù)器。1028位自動(dòng)重裝定時(shí)器/計(jì)數(shù)器。113模式3只能用于定時(shí)器/計(jì)數(shù)器0,T0被分為兩個(gè)8位定時(shí)器/計(jì)數(shù)器,TL0可以作為定時(shí)器/計(jì)數(shù)器來(lái)使用,由T0的控制位來(lái)控制,而TH0只能用于計(jì)數(shù)器,有T1的控制位來(lái)控制。GATEGATE為0時(shí),由TRx(軟件控制)來(lái)控制定時(shí)器/計(jì)數(shù)器的啟動(dòng)和停止,當(dāng)GATE為1時(shí),定時(shí)器/計(jì)數(shù)器的啟動(dòng)由TRx和引腳INTx共同來(lái)控制(硬件來(lái)控制,僅當(dāng)TRx=1并且引腳INTx輸入高電平時(shí)才工作)。C/T定時(shí)器/計(jì)數(shù)器選擇位,0工作在定時(shí)器模式,1工作在計(jì)數(shù)器模式。TCON寄存器:TFx定時(shí)器/計(jì)數(shù)器溢出標(biāo)志位,當(dāng)定時(shí)器/計(jì)數(shù)器計(jì)數(shù)溢出時(shí),由硬件自動(dòng)置1,在編寫程序時(shí)可以通過(guò)檢測(cè)該位來(lái)判斷是否達(dá)到定時(shí)時(shí)間,需要通過(guò)軟件來(lái)清零。工作在中斷方式下不需要清零,因?yàn)樵趫?zhí)行中斷服務(wù)程序時(shí)會(huì)自動(dòng)給我們清零。TRx定時(shí)器/計(jì)數(shù)器運(yùn)行控制位。IE寄存器:ETx定時(shí)器/計(jì)數(shù)器中斷使能位。EA全局中斷使能位。


THx、TLx初值計(jì)算:
假設(shè)8051外接12MHz的晶振,由于8051的機(jī)器周期是時(shí)鐘周期的12分頻,所以8051的機(jī)器周期為1MHz,那么計(jì)數(shù)一次的時(shí)間剛好為1us,如果定時(shí)器工作在模式0下,那么可以最長(zhǎng)計(jì)時(shí)為8192us,工作模式1可以最長(zhǎng)計(jì)時(shí)為65536us。那么假設(shè)8051工作在模式1下,定時(shí)1ms,那么THx、TLx的初值應(yīng)該為多少呢?如果定時(shí)1ms,也就意味著需要計(jì)數(shù)1000次,那么初值就應(yīng)該為65536-1000=64536,也就是THx=0xFC,TLx=0x18。
根據(jù)上面可以總結(jié)出如下公式:
定時(shí)時(shí)間=(最大計(jì)數(shù)值-計(jì)數(shù)器初值)*機(jī)器周期=(最大計(jì)數(shù)值-計(jì)數(shù)器初值)*(12000000/晶振頻率(Hz))(us);
計(jì)數(shù)器初值=(最大計(jì)數(shù)值-定時(shí)時(shí)間*(晶振頻率(Hz)/12000000));
套用這個(gè)公式,初值=(65536-1000*(12000000/12000000))=64536=0xFC18,那么TH就應(yīng)該為0xFC,TL為0x18。

整個(gè)程序如下:

/*timer.c*/

#include

#defineOSC_FREQ12000000UL

#defineTIMER_MODE00x00

#defineTIMER_MODE10x01

#defineTIMER_MODE20x02

#defineTIMER_MODE30x03

voidtimer0_init(void)

{

TMOD&=0xF0;

TMOD|=TIMER_MODE1;/*Timer0workon16-bittimermode*/

TH0=(65536-1000*(OSC_FREQ/12000000))>>8;

TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;

TR0=1;/*Turnontimer0*/

}

voiddelayms(unsignedintn)

{

while(n--){

while(!TF0);

TF0=0;

TH0=(65536-1000*(OSC_FREQ/12000000))>>8;

TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;

}

}


/*timer.h*/

#ifndef__TIMER_H

#define__TIMER_H

externvoidtimer0_init(void);

externvoiddelayms(unsignedintn);

#endif/*__TIMER_H*/


/*main.c*/

#include

#include"timer.h"

#defineled1P2_0

voidmain(void)

{

timer0_init();

while(1){

led1=0;

delayms(1000);

led1=1;

delayms(1000);

}

}


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉