日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞?lì)^條 >> N76E003的定時(shí)器/計(jì)數(shù)器 0和1
新聞資訊
NEWS INFORMATION

N76E003的定時(shí)器/計(jì)數(shù)器 0和1

發(fā)布時(shí)間:2019-05-22

定時(shí)器/計(jì)數(shù)器 0和1
N76E003系列定時(shí)器/計(jì)數(shù)器 0和1是2個(gè)16位定時(shí)器/計(jì)數(shù)器。每個(gè)都是由兩個(gè)8位的寄存器組成的16位計(jì)數(shù)寄存器。

對于定時(shí)器/計(jì)數(shù)器0,高8位寄存器是TH0、 低8位寄存器是TL0。

同樣定時(shí)器/計(jì)數(shù)器1也有兩個(gè)8位寄存器, TH1 和TL1。

 

 

 

 TCON 和 TMOD 可以配置定時(shí)器/計(jì)數(shù)器0和1的工作模式。

 

通過TMOD中的 位來選擇定時(shí)器或計(jì)數(shù)器功能。

每個(gè)定時(shí)器/計(jì)數(shù)器都有選擇位,TMOD的第2位選擇定時(shí)器/計(jì)數(shù)器0功能,TMOD的第6位選擇定時(shí)器/計(jì)數(shù)器1功能。

將它們設(shè)置為定時(shí)器后,定時(shí)器將對系統(tǒng)時(shí)鐘周期計(jì)數(shù)。

定時(shí)器0通過設(shè)置T0M(CKCON.3)位,定時(shí)器1通過設(shè)置T1M(CKCON.4)位,來選擇定時(shí)器時(shí)鐘是系統(tǒng)時(shí)鐘(FSYS)的12分頻或直接是系統(tǒng)時(shí)鐘。

 

在計(jì)數(shù)器模式下,每當(dāng)檢測到外部輸入腳T0上的下降沿,計(jì)數(shù)寄存器的內(nèi)容就會加一。如果在一個(gè)時(shí)鐘周期采樣到高電平,在下一個(gè)時(shí)鐘周期采樣到低電平,那么T0或T1引腳就會確認(rèn)為一個(gè)由高到低的跳變。

當(dāng)有定時(shí)器溢出發(fā)生,定時(shí)器0和1能配置引腳T0/T1自動翻轉(zhuǎn)輸出。

 

這個(gè)功能通過設(shè)P2S寄存器的T0OE和T1OE來設(shè)置,分別對應(yīng)于定時(shí)器0和定時(shí)器1。當(dāng)打開這個(gè)功能,輸出端口在第一個(gè)定時(shí)溢出之前輸出邏輯1。為確保此模式功能, 位應(yīng)該被清除并且選擇系統(tǒng)時(shí)鐘作為定時(shí)器的時(shí)鐘源。

注意:TH0(TH1)和TL0(TL1)是獨(dú)立分開訪問。需要特別注意,在模式0或模式1下時(shí),當(dāng)讀/寫TH0(TH1)和TL0(TL1)之前,必須清除TR0(TR1)來停止計(jì)時(shí)。否則將產(chǎn)生不可預(yù)料的結(jié)果。

模式0(13位定時(shí)器)
在模式 0, 定時(shí)器/計(jì)數(shù)器是13位的計(jì)數(shù)器。13位的計(jì)數(shù)器由TH0 (TH1) 和TL0 (TL1)的低五位組成。TL0 (TL1)的高三位被忽略。當(dāng)TR0 (TR1)置位且GATE是0或 是1時(shí),定時(shí)器/計(jì)數(shù)器使能。GATE設(shè)置為1可以通過定時(shí)器來計(jì)算外部輸入引腳上輸入脈沖的寬度。當(dāng)13位的定時(shí)器計(jì)數(shù)值從1FFFH變?yōu)?000H后,定時(shí)器溢出標(biāo)志TF0 (TF1) 置位,如果中斷打開,此時(shí)會產(chǎn)生一個(gè)定時(shí)器中斷。

 

#define TH0_INIT        0xFC 
#define TL0_INIT        0x0F
#define TH1_INIT        0xE0 
#define TL1_INIT        0x00
    TMOD = 0XFF;
    Set_All_GPIO_Quasi_Mode;
    TIMER0_MODE0_ENABLE;                        //Timer 0 and Timer 1 mode configuration
    TIMER1_MODE0_ENABLE;
    
    clr_T0M;
    clr_T1M;
    
    TH0 = TH0_INIT;
    TL0 = TL0_INIT;
    TH1 = TH1_INIT;
    TL1 = TL1_INIT;
    
    set_ET0;                                    //enable Timer0 interrupt
    set_ET1;                                    //enable Timer1 interrupt
    set_EA;                                     //enable interrupts
    
    set_TR0;                                    //Timer0 run
//    set_TR1;                                    //Timer1 run
TMOD = 0XFF;

 

Set_All_GPIO_Quasi_Mode; 設(shè)置引腳模式

#define   P14_OpenDrain_Mode   P1M1|=SET_BIT4;P1M2|=SET_BIT4

 


    TIMER0_MODE0_ENABLE;                        //Timer 0 and Timer 1 mode configuration

#define TIMER0_MODE0_ENABLE TMOD&=0xF0

 

 

//-------------------- Timer1 function define --------------------
#define        TIMER0_MODE0_ENABLE        TMOD&=0xF0
#define        TIMER0_MODE1_ENABLE        TMOD&=0xF0;TMOD|=0x01
#define        TIMER0_MODE2_ENABLE        TMOD&=0xF0;TMOD|=0x02
#define        TIMER0_MODE3_ENABLE        TMOD&=0xF0;TMOD|=0xF3
    clr_T0M;
    clr_T1M;
#define clr_PWMCKS  CKCON   &= ~SET_BIT6
#define clr_T1M     CKCON   &= ~SET_BIT4
#define clr_T0M     CKCON   &= ~SET_BIT3
#define clr_CLOEN   CKCON   &= ~SET_BIT1

    TH0 = TH0_INIT;
    TL0 = TL0_INIT;
    TH1 = TH1_INIT;
    TL1 = TL1_INIT;
#define TH0_INIT        0xFC //
#define TL0_INIT        0x0F
#define TH1_INIT        0xE0 //
#define TL1_INIT        0x00

 set_TR0;                                    //Timer0 run

 

 



由于定時(shí)器方式0位13為計(jì)數(shù)器,即最多能裝載2的13次方個(gè)(8192),當(dāng)TH0與TL0初始值為零時(shí)最多經(jīng)過8192個(gè)機(jī)器周期該計(jì)數(shù)器就會溢出一次,,向CPU申請中斷。
時(shí)鐘周期

時(shí)鐘周期也稱為振蕩周期,定義為時(shí)鐘脈沖的倒數(shù)(可以這樣來理解,時(shí)鐘周期就是單片機(jī)外接晶振的倒數(shù),例如12M的晶振,它的時(shí)間周期就是1/12 us),是計(jì)算機(jī)中最基本的、最小的時(shí)間單位。

在一個(gè)時(shí)鐘周期內(nèi),CPU僅完成一個(gè)最基本的動作。對于某種單片機(jī),若采用了1MHZ的時(shí)鐘頻率,則時(shí)鐘周期為1us;若采用4MHZ的時(shí)鐘頻率,則時(shí)鐘周期為250us。由于時(shí)鐘脈沖是計(jì)算機(jī)的基本工作脈沖,它控制著計(jì)算機(jī)的工作節(jié)奏(使計(jì)算機(jī)的每一步都統(tǒng)一到它的步調(diào)上來)。顯然,對同一種機(jī)型的計(jì)算機(jī),時(shí)鐘頻率越高,計(jì)算機(jī)的工作速度就越快。但是,由于不同的計(jì)算機(jī)硬件電路和器件的不完全相同,所以其所需要的時(shí)鐘周頻率范圍也不一定相同。我們學(xué)習(xí)的8051單片機(jī)的時(shí)鐘范圍是1.2MHz-12MHz。

8051單片機(jī)中把一個(gè)時(shí)鐘周期定義為一個(gè)節(jié)拍(用P表示),二個(gè)節(jié)拍定義為一個(gè)狀態(tài)周期(用S表示)。

機(jī)器周期

在計(jì)算機(jī)中,為了便于管理,常把一條指令的執(zhí)行過程劃分為若干個(gè)階段,每一階段完成一項(xiàng)工作。例如,取指令、存儲器讀、存儲器寫等,這每一項(xiàng)工作稱為一個(gè)基本操作。完成一個(gè)基本操作所需要的時(shí)間稱為機(jī)器周期。一般情況下,一個(gè)機(jī)器周期由若干個(gè)S周期(狀態(tài)周期)組成。8051系列單片機(jī)的一個(gè)機(jī)器周期同6個(gè)S周期(狀態(tài)周期)組成。前面已說過一個(gè)時(shí)鐘周期定義為一個(gè)節(jié)拍(用P表示),二個(gè)節(jié)拍定義為一個(gè)狀態(tài)周期(用S表示),8051單片機(jī)的機(jī)器周期由6個(gè)狀態(tài)周期組成,也就是說一個(gè)機(jī)器周期=6個(gè)狀態(tài)周期=12個(gè)時(shí)鐘周期。

指令周期

指令周期是執(zhí)行一條指令所需要的時(shí)間,一般由若干個(gè)機(jī)器周期組成。指令不同,所需的機(jī)器周期數(shù)也不同。對于一些簡單的的單字節(jié)指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執(zhí)行,不再需要其它的機(jī)器周期。對于一些比較復(fù)雜的指令,例如轉(zhuǎn)移指令、乘法指令,則需要兩個(gè)或者兩個(gè)以上的機(jī)器周期。
通常含一個(gè)機(jī)器周期的指令稱為單周期指令,包含兩個(gè)機(jī)器周期的指令稱為雙周期指令。
1T、6T、12T這個(gè)原本叫 機(jī)械周期,現(xiàn)在更多人稱為 指令周期;以前標(biāo)準(zhǔn)51單片機(jī),是12T模式的。后來大量單片機(jī)廠家的介入,開始對單片機(jī)進(jìn)行提速,于是就出現(xiàn)了 6T、1T模式的單片機(jī)。
時(shí)鐘周期:是指振蕩源的周期,如 外部晶振 10MHz(假設(shè)有),那么它的時(shí)鐘周期就是 1/10MHz=0.1us;(N76E003)
機(jī)械周期:單片機(jī)執(zhí)行一單位指令所需要的 時(shí)鐘周期 個(gè)數(shù),如 1T,就表示,需要 1個(gè)時(shí)鐘周期;12T(AT89C51) 即為 12個(gè)時(shí)鐘周期。這些都只是一單位指令的時(shí)間(如自增、自減等),多單位指令時(shí)間進(jìn)行倍乘(如賦值語句需要2個(gè)機(jī)械周期,即乘以2倍)
指令周期:早期更多的是用來描述 某條指令執(zhí)行 需要多少個(gè)機(jī)械周期,(如自增、自減為 1個(gè)機(jī)械周期,賦值 2個(gè)機(jī)械周期,判斷 4個(gè)機(jī)械周期)。隨著C語言的大量普及,現(xiàn)在,更多的人用它來代替 機(jī)械周期 這個(gè)名詞,而 指令本身的 周期被人們所忽略,不再深討了。
13位的計(jì)數(shù)器由TH0 (TH1) 和TL0 (TL1)的低五位組成。也就是說先將TH0向左移五位,在或上TL0,即(0xFC<<5)|0X0F=((11111100)<<5)|00001111=1111110000000|00001111=0001 1111 1000 1111=1F8F(8079)
當(dāng)13位的定時(shí)器計(jì)數(shù)值從1FFFH變?yōu)?000H后(這地方需要仔細(xì)理解,我花費(fèi)了好長時(shí)間),定時(shí)器溢出標(biāo)志TF0 (TF1) 置位(定時(shí)器溢出標(biāo)志溢出),如果中斷打開,此時(shí)會產(chǎn)生一個(gè)定時(shí)器中斷。N76E003例程里選用了16M,選用16MHZ,然后16/12(clr_t0m,可以不選)=1.3MHZ,也就是1/1300000s,
即(8192-8079)*1/1300000=0.000086923s(即86us)

這里需要說明的是示波器高電平計(jì)一次數(shù)低電平計(jì)一次數(shù)所以,周期需要除以二就是定時(shí)器的正確計(jì)時(shí)時(shí)間


其實(shí)也可以按照這種方法來寫
TH0=(8192-X)/32; TL0=(8192-x)%32 這種好處就是更方便計(jì)數(shù)。
方式0為13位的定時(shí)器/計(jì)數(shù)器,對定時(shí)器T0來說是分成兩個(gè)寄存器(可以形象地比作容器吧,網(wǎng)上有比我更形象的比喻,我就不多寫了,請自行查閱):TH0和TL0的低五位,組成了13位的定時(shí)器,當(dāng)?shù)臀籘L0計(jì)滿就向高位TH0移一個(gè)數(shù),然后清零。
以內(nèi)置16MHZ的晶振來說,經(jīng)過clr_T0M12分頻 ,也就是16/12=1.3MHZ,對于N76E003 這種1T 8051內(nèi)核來說,一個(gè)指令周期就是一個(gè)機(jī)器周期,就是一個(gè)時(shí)鐘周期,如果從0開始計(jì)數(shù),計(jì)數(shù)到8192時(shí)(即0X1FFF)再來一個(gè)數(shù)就“溢出”產(chǎn)生中斷,一次溢出也就是8192/1300000,約等于6.3ms,如果要定時(shí)1ms的話就要給他們裝一個(gè)預(yù)裝值(初值),總值-需要值=預(yù)裝值,(8192-(0.001s*1300000(MHZ))=6892
也就預(yù)裝值(8192-6892),預(yù)裝后,定時(shí)器從預(yù)裝值開始加值,定時(shí)器溢出中斷后,會重新從預(yù)裝值開始加值加到我們想要的時(shí)間就再產(chǎn)生中斷,從而達(dá)到了定時(shí)的目的。如果要定時(shí)1s就可以讓定時(shí)器中斷1000ms/1ms=1000次。
另外一點(diǎn),TH0和TL0中應(yīng)該裝入的總數(shù)是6892,然后把6892對32求模:6892/32裝入TH0中,把6892對32求余:6892%32裝入TL0中,因?yàn)檫@是兩個(gè)八位28*28的容器。
所以就有了
TH0=(8192-6892)/32
TL0=(8192-6892)%32
 
當(dāng)用定時(shí)器的方式0時(shí),為13位計(jì)數(shù)器,機(jī)最多能裝載2的13次方,當(dāng)TL0和TH0的初始值為零時(shí)最多經(jīng)過8192個(gè)機(jī)器周期,該計(jì)數(shù)器就會溢出一次,向CPU申請中斷。
總結(jié)如下:
當(dāng)使用定時(shí)器的方式0時(shí),設(shè)機(jī)器周期為Tcy,定時(shí)器產(chǎn)生一次中斷的時(shí)間為t,那么需要計(jì)數(shù)的個(gè)數(shù)為N=t/Tcy,裝入THX和TLX中的數(shù)分別為
THX=(8192-N)/32,TLX=(8192-N)%32
先計(jì)算機(jī)器周期Tcy,時(shí)鐘頻率為內(nèi)置的16MHZ,歷程中clr——T0M是對其進(jìn)行了12分頻,則為16/12=1.3MHZ,若t=1ms,則需要計(jì)數(shù)N=t/TCY(即5/1/1300000),這就是在16MHZ12分頻下初值的計(jì)算方法,如果不進(jìn)行分頻,算法與上述相同。
這里對32求模是因?yàn)槎〞r(shí)器1方式0是13為計(jì)數(shù)器,,技術(shù)只是用了TL0的低五位,這五位最多可裝載32個(gè)數(shù),再加一便會進(jìn)位,與16位計(jì)數(shù)器裝載256個(gè)數(shù)有所不同,因此這里在這里是對32求模,求余同理。

    set_ET1;                                    //enable Timer1 interrupt

           #define set_ET1 ET1 = 1

    set_EA;                                     //enable interrupts

    set_TR0;                                    //Timer0 run
 

 

中斷服務(wù)函數(shù):

void Timer0_ISR (void) interrupt 1          //interrupt address is 0x000B
{
    TH0 = TH0_INIT;
    TL0 = TL0_INIT;    
    P12 = ~P12;                                                            // GPIO toggle when interrupt
}

模式1(16位定時(shí)器)

模式1與模式0 非常相似,只是模式1下定時(shí)器/計(jì)數(shù)器為16位的,就是說是用THx和TLx的全部16位用來計(jì)數(shù)。當(dāng)
計(jì)數(shù)值由FFFFH向0000H翻轉(zhuǎn)后,定時(shí)器相應(yīng)的溢出標(biāo)志TF0(TF1)置1,如果中斷使能則將產(chǎn)生中斷。

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
//#define        TIMER0_MODE0_ENABLE        TMOD&=0x0F
//#define        TIMER0_MODE1_ENABLE        TMOD&=0x0F;TMOD|=0x10
//#define        TIMER0_MODE2_ENABLE        TMOD&=0x0F;TMOD|=0x20
//#define        TIMER0_MODE3_ENABLE        TMOD&=0x0F;TMOD|=0x3F

//#define        TIMER1_MODE0_ENABLE        TMOD&=0xF0
//#define        TIMER1_MODE1_ENABLE        TMOD&=0xF0;TMOD|=0x01
//#define        TIMER1_MODE2_ENABLE        TMOD&=0xF0;TMOD|=0x02
//#define        TIMER1_MODE3_ENABLE        TMOD&=0xF0;TMOD|=0xF3
#endif

#define TH0_INIT        50000 
#define TL0_INIT        50000
#define TH1_INIT        25000 
#define TL1_INIT        25000

UINT8 u8TH0_Tmp,u8TL0_Tmp,u8TH1_Tmp,u8TL1_Tmp;
/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1  //interrupt address is 0x000B
{
    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;    
    
    P12 = ~P12;                     // GPIO1 toggle when interrupt
}

/************************************************************************************************************
*    TIMER 1 interrupt subroutine
************************************************************************************************************/
void Timer1_ISR (void) interrupt 3  //interrupt address is 0x001B
{
    TH1 = u8TH1_Tmp;
    TL1 = u8TL1_Tmp;   

    P03 = ~P03;                     //P0.3 toggle when interrupt
}
/************************************************************************************************************
*    Main function 
************************************************************************************************************/
void main (void)
{
   
    Set_All_GPIO_Quasi_Mode;
        TIMER0_MODE1_ENABLE;
        TIMER1_MODE1_ENABLE;

    clr_T1M;
    //set_T1M;

    u8TH0_Tmp = (65536-TH0_INIT)/256;
    u8TL0_Tmp = (65536-TL0_INIT)%256;    
    u8TH1_Tmp = (65536-TH1_INIT)/256;
    u8TL1_Tmp = (65536-TL1_INIT)%256;
    
    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
    TH1 = u8TH1_Tmp;
    TL1 = u8TL1_Tmp;
    
    set_ET0;                                    //enable Timer0 interrupt
    set_ET1;                                    //enable Timer1 interrupt
    set_EA;                                     //enable interrupts
    set_TR0;                                    //Timer0 run
    set_TR1;                                    //Timer1 run
    while(1);
}

u8TH0_Tmp = (65536-TH0_INIT)/256; u8TL0_Tmp = (65536-TL0_INIT)%256;
    u8TH1_Tmp = (65536-TH1_INIT)/256;
    u8TL1_Tmp = (65536-TL1_INIT)%256;
    
    TH0 = u8TH0_Tmp;
    TL0 = u8TL0_Tmp;
    TH1 = u8TH1_Tmp;
    TL1 = u8TL1_Tmp;
只是模式1下定時(shí)器/計(jì)數(shù)器為16位的,就是說是用THx和TLx的全部16位用來計(jì)數(shù)。當(dāng)
計(jì)數(shù)值由FFFFH向0000H翻轉(zhuǎn)后,定時(shí)器相應(yīng)的溢出標(biāo)志TF0(TF1)置1,如果中斷使能則將產(chǎn)生中斷。

方式1為16位的定時(shí)器/計(jì)數(shù)器,對定時(shí)器T0來說是分成兩個(gè)寄存器(可以形象地比作容器吧,網(wǎng)上有比我更形象的比喻,我就不多寫了,請自行查閱):TH0為高八位,TL0為低八位,組成了16位的定時(shí)器,當(dāng)?shù)臀籘L0計(jì)滿就向高位TH0移一個(gè)數(shù),然后清零。
以16Mhz的內(nèi)置晶振來說,機(jī)器周期是(1/16000000)s(1T 8051),當(dāng)一次溢出也就是65536*1/16 us,約等于4.096ms,如果要定時(shí)50ms的話就要給他們裝一個(gè)預(yù)裝值(初值),總值-需要值=預(yù)裝值,
也就是65536-65536=0,預(yù)裝后,定時(shí)器從預(yù)裝值(0)開始加值,定時(shí)器溢出中斷后,會重新從預(yù)裝值開始加值加到4(約為)ms就再產(chǎn)生中斷,從而達(dá)到了定時(shí)的目的。如果要定時(shí)1s就可以讓定時(shí)器中斷1000ms/4ms=500次。
另外一點(diǎn),TH0和TL0中應(yīng)該裝入的總數(shù)是0,然后把0對256求模:0/256=00裝入TH0中,把0對256求余:0%256=0裝入TL0中,因?yàn)檫@是兩個(gè)八位2^8*2^8的容器。
所以就有了
TH0=(65535-65535)/256
TL0=(65535-65535)%256
  

模式2(8位自動重裝載定時(shí)器)
模式2下定時(shí)器/計(jì)數(shù)器為自動重裝模式。此模式下TL0(TL1)是一個(gè)8位的計(jì)數(shù)器,TH0(TH1)保存重裝計(jì)數(shù)
值。當(dāng)TL0(TL1)溢出后,TCON中的TF0(TF1)標(biāo)志置位且TH0 (TH1)中內(nèi)容重裝至TL0(TL1),然后繼續(xù)計(jì)數(shù)過
程。重裝過程中TH0(TH1)內(nèi)的值保持不變.該特征最好地適用于UART波特率發(fā)生器,不需要連續(xù)軟件介入。

 

void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1
{
        P06_Quasi_Mode;        //Setting UART pin as Quasi mode for transmit
        P07_Quasi_Mode;        //Setting UART pin as Quasi mode for transmit
    
    SCON = 0x50;         //UART0 Mode1,REN=1,TI=1
    TMOD |= 0x20;        //Timer1 Mode2
    
    set_SMOD;            //UART0 Double Rate Enable
    set_T1M;
    clr_BRCK;            //Serial port 0 baud rate clock source = Timer1
 
#ifdef FOSC_160000
    TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */
#endif        
#ifdef FOSC_166000
    TH1 = 256 - (1037500/u32Baudrate);                      /*16.6 MHz */
#endif
    set_TR1;
        set_TI;                        //For printf function must setting TI = 1
}
 SCON = 0x50;         //UART0 Mode1,REN=1,TI=1

 


TMOD |= 0x20; //Timer1 Mode2

#define set_SMOD    PCON    |= SET_BIT7

 

#define set_T1M     CKCON   |= SET_BIT4

 

clr_BRCK;

#define clr_BRCK T3CON &= ~SET_BIT5

#ifdef FOSC_160000
TH1 = 256 - (1000000/u32Baudrate+1); /*16 MHz */
#endif
#ifdef FOSC_166000
TH1 = 256 - (1037500/u32Baudrate); /*16.6 MHz */
#endif

 

已知串口0通信方式1下,波特率為115200bps,系統(tǒng)晶振頻率為16MHz,求TL1,TH1中裝入的初值(定時(shí)器1方式2) 
解:設(shè)初值X,則定時(shí)器每計(jì)256-X個(gè)數(shù)溢出一次,每計(jì)一個(gè)數(shù)的時(shí)間為一個(gè)機(jī)器周期,因?yàn)槭?T 8051架構(gòu),所以一個(gè)機(jī)器周期等于1個(gè)時(shí)鐘周期,由于設(shè)置了SMOD 所以計(jì)一個(gè)數(shù)的時(shí)間為(1/16MHZ) us(即1/16000000s),則定時(shí)器溢出一次的時(shí)間為[256-X]/16MHZ
通常都是固定的,一般都是根據(jù)所使用的波特率來求定時(shí)器初值。方式1的波特率=      即   (2^smod /32)*T1的溢出率,即  ((2^smod /32)*16000000)/(256-x)

通常都是固定的,一般都是根據(jù)所使用的波特率來求定時(shí)器初值。

TH1 = 256 - (1000000/u32Baudrate+1); 
256-TH1-1=1000000/u32Baudrate

u32Baudrate=1000000/(256-TH1-1)

 set_T1M;

    clr_BRCK;            //Serial port 0 baud rate clock source = Timer1

    set_TR1;

        set_TI;                        //For printf function must setting TI = 1
 

模式3(兩組獨(dú)立8位定時(shí)器)
定時(shí)器0和定時(shí)器1的模式3有著不同的工作方式。對定時(shí)器/計(jì)數(shù)器1來說模式3會將其停用;

對定時(shí)器/計(jì)數(shù)器0來說,模式3下TL0和TH0是2個(gè)獨(dú)立的8位計(jì)數(shù)寄存器。模式3下TL0使用定時(shí)器0的控制位:如  GATE, TR0,TL0也可以用來對T0 腳上的1到0 跳變計(jì)數(shù),由 計(jì)數(shù)。TH0 只能對時(shí)鐘周期計(jì)數(shù),并使用定時(shí)器/計(jì)數(shù)器1的控制位(TR1和TF1)。

當(dāng)需要額外的8位定時(shí)器時(shí)可以使用模式3 。

當(dāng)定時(shí)器0配置為模式3時(shí),定時(shí)器1可以通過配置其進(jìn)入或離開模式3的方式來打開或關(guān)閉自己。

定時(shí)器1依然可以工作在模式0、1、2下,但它的靈活性受到限制。雖然基本功能得以維持,但已不能對TF1和TR1進(jìn)行控制(由上文可知在該模式下該位由定時(shí)器0控制)。此時(shí)定時(shí)器1依然可以使用GATE腳、T1M。它同樣可以用作串行口的波特率發(fā)生器或其他不需要中斷的應(yīng)用。也就是說當(dāng)定時(shí)器工作在模式3時(shí),定時(shí)器1模式依然可以選擇但是靈活性受限,不能對TF1和TR1進(jìn)行控制。

 

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2016 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp. 
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2016
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 Timer0/1 Mode3 demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

//*****************  The Following is in define in Fucntion_define.h  ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
//#define        TIMER0_MODE0_ENABLE        TMOD&=0x0F
//#define        TIMER0_MODE1_ENABLE        TMOD&=0x0F;TMOD|=0x10
//#define        TIMER0_MODE2_ENABLE        TMOD&=0x0F;TMOD|=0x20
//#define        TIMER0_MODE3_ENABLE        TMOD&=0x0F;TMOD|=0x3F

//#define        TIMER1_MODE0_ENABLE        TMOD&=0xF0
//#define        TIMER1_MODE1_ENABLE        TMOD&=0xF0;TMOD|=0x01
//#define        TIMER1_MODE2_ENABLE        TMOD&=0xF0;TMOD|=0x02
//#define        TIMER1_MODE3_ENABLE        TMOD&=0xF0;TMOD|=0xF3
#endif

#define TH0_INIT        (256-100)
#define TL0_INIT        (256-50)
#define TH1_INIT        0x00
#define TL1_INIT        0x00

/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1              // interrupt address is 0x000B
{              
    TL0 = TL0_INIT;                             // reload by software    
    P12 = ~P12;                                 // GPIO1 toggle when interrupt
}

/************************************************************************************************************
*    TIMER 1 interrupt subroutine
************************************************************************************************************/
void Timer1_ISR (void) interrupt 3              //interrupt address is 0x001B
{           
    TH0 = TH0_INIT;
        Send_Data_To_UART0(0x54);                                        //print charater "T" means timer interrupt
        P12 = ~ P12;                                                    //Mark UART output to find the real timer interrupt timming.
}

/************************************************************************************************************
*    Main function 
************************************************************************************************************/
void main (void)
{
    Set_All_GPIO_Quasi_Mode;
        InitialUART0_Timer3(115200);
    
        TIMER0_MODE3_ENABLE;
        TIMER1_MODE3_ENABLE;
    
    TH0 = TH0_INIT;                             //initial counter values 
    TL0 = TL0_INIT;    
    TH1 = TH1_INIT;
    TL1 = TL1_INIT;    
    
    set_ET0;                                    //enable Timer0 counter interrupt
    set_ET1;                                    //enable Timer1 counter interrupt
    set_EA;                                     //enable interrupts
    set_TR0;                                    //Timer0 run
    set_TR1;                                    //Timer1 run
    
    while(1);
}
#define        TIMER1_MODE3_ENABLE        TMOD&=0xF0;TMOD|=0xF3
#define TH0_INIT        (256-100)
#define TL0_INIT        (256-50)
#define TH1_INIT        0x00
#define TL1_INIT        0x00

/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1              // interrupt address is 0x000B
{              
    TL0 = TL0_INIT;                             // reload by software    
    P12 = ~P12;                                 // GPIO1 toggle when interrupt
}

/************************************************************************************************************
*    TIMER 1 interrupt subroutine
************************************************************************************************************/
void Timer1_ISR (void) interrupt 3              //interrupt address is 0x001B
{           
    TH0 = TH0_INIT;
    P11 = ~P11;                                 //P1.1 toggle when interrupt
}

/************************************************************************************************************
*    Main function 
************************************************************************************************************/
void main (void)
{
   
    Set_All_GPIO_Quasi_Mode;
        TIMER0_MODE3_ENABLE;
        TIMER1_MODE3_ENABLE;
    
    TH0 = TH0_INIT;                             //initial counter values 
    TL0 = TL0_INIT;    
    TH1 = TH1_INIT;
    TL1 = TL1_INIT;    
    
    set_ET0;                                    //enable Timer0 counter interrupt
    set_ET1;                                    //enable Timer1 counter interrupt
    set_EA;                                     //enable interrupts
    set_TR0;                                    //Timer0 run
    set_TR1;                                    //Timer1 run
    
    while(1)
    {
        P1 = TH1;                               //for Timer 1 has no interrupt while Timer 0 in mode 3, show on ports
        P2 = TL1;
    }
}

對定時(shí)器/計(jì)數(shù)器0來說,模式3下TL0和TH0是2個(gè)獨(dú)立的8位計(jì)數(shù)寄存器。

模式3下TL0使用定時(shí)器0的控制位:如  ,GATE, TR0,,TL0也可以用來對T0 腳上的1到0 跳變計(jì)數(shù),由TMOD.2()來決定。TH0 只能對時(shí)鐘周期計(jì)數(shù),并使用定時(shí)器/計(jì)數(shù)器1的控制位(TR1和TF1)

 

模式三情況如下表所示:

TH0 TL0 TH1 TL1
8位計(jì)數(shù) 8位計(jì)數(shù) 停用,其他模式可選擇但受限 停用,其他模式可選擇但受限
定時(shí)器1的控制位(TR1,TF1) 定時(shí)器0的控制位 其他模式可以控制GATE、、T1M 其他模式可以控制GATE、、T1M

 當(dāng)定時(shí)器0配置為模式3時(shí),定時(shí)器1可以通過配置其進(jìn)入或離開模式3的方式來打開或關(guān)閉自己。定時(shí)器1依然可以工作在模

式0、1、2下,但它的靈活性受到限制。雖然基本功能得以維持,但已不能對TF1和TR1進(jìn)行控制

它同樣可以用作串行口的波特率發(fā)生器或其他不需要中斷的應(yīng)用。

 
聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

喀什市| 克什克腾旗| 津市市| 云南省| 钦州市| 南溪县| 龙州县| 夹江县| 阳信县| 青州市| 鸡东县| 阿拉善右旗| 鹤壁市| 调兵山市| 汾阳市| 尉犁县| 江华| 武胜县| 肃宁县| 正阳县| 镇坪县| 巢湖市| 武清区| 海宁市| 新田县| 台中市| 多伦县| 长宁县| 湟中县| 新宾| 阳曲县| 福海县| 突泉县| 津南区| 长治县| 延安市| 施秉县| 南城县| 承德县| 西林县| 河源市|