宏晶科技 STC8G1K系列單片機教程「九」定時器

大家好,我是遠方,這一章我們來學習下STC8G1K12的定時器/計數器。

手冊上理論講了一大推,我們直接進行總結:

1. STC8G 系列單片機有 3 個 16 位定時器/計數器,T0,T1,T2。

2. 本質是對脈衝進行計數,如果計數脈衝來自系統時鐘,則為定時方式,如果計數脈衝來自單片機外部特定引腳,則為計數方式。

3. 有4 種工作模式:模式 0(16 位自動重裝載模式),模式 1(16 位不可重裝載模

式),模式 2(8 位自動重裝模式),模式 3(不可屏蔽中斷的 16 位自動重裝載模式)。

我們今天以定時器T0舉例,工作在模式 0,定時器1mS,控制LED亮1S滅1S。

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

TMOD寄存器,跟定時器T0有關的位是 T0_GATE T0_C/T T0_M1 T0_M0 。

T0_GATE:控制定時器0,置1時只有在INT0腳為高及TR0控制位置1時才可打開定時器/計數器0。 這裡我們把T0_GATE寫0,如果寫1的話,T0受INT0腳和TR0一起控制。

T0_C/T:控制定時器0用作定時器或計數器,清0則用作定時器(對內部系統時鐘進行計數),置1用作計數器(對引腳T0/P3.4外部脈衝進行計數)。我們這裡是做定時器。所以寫 0。

T0_M1/T0_M0:定時器定時器/計數器0模式選擇 ,我們是工作在模式0,所以這二位寫0。

TMOD &= 0xF0; //模式 0

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

TCON 寄存器,跟定時器T0有關的是TR0位,TR0寫0禁止定時器T0運行,寫1允許定時器T0運行。我們這裡要運行T0,所以寫1。

TCON |= (1 << 4);

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

IE中斷使能寄存器,跟定時器T0有關的是EA 和 ET0。

EA:總中斷允許控制位。0:CPU 屏蔽所有的中斷申請 1:CPU 開放中斷 ,我們這裡寫1。

EA = 1;

ET0:定時/計數器 T0 的溢出中斷允許位。 0:禁止 T0 中斷 1:允許 T0 中斷 ,我們這裡需要用到定時器T0中斷,所以寫1。

ET0 = 1;

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

IP和IPH是優先級控制,我們這裡只有一箇中斷,就設置為最高級。

IP |= (1<<1);

IPH |= (1<<1);

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

AUXR鋪助寄存器,T0x12是定時器0的速度控制位 。我們這裡設置為12T模式。

AUXR &= ~(1 << 7);

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

TL0和TH0是定時器T0的計數寄存器,這二個寄存器非常重要,我們定時多長時間,就取決於TL0和TH0的值。那我們定時1mS,該設置多少呢?在這個快速開發的年代,產品需迅速佔領市場。我們以最簡單的方式來做,藉助於下載軟件中的工具定時器計算器。大家以後在開發過程中,能簡單就簡單處理,不要什麼都想搞明白,等搞明白了,黃花菜都涼了,競爭公司的產品都已經佔領市場了。

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

通過計算,得到

TL0 = 0x66;TH0 = 0xFC;

相關配置已經講完了。開始寫代碼。

全部工程代碼如下:

#include "STC8.H"

sbit LED = P1^1;

void TM0_Isr() interrupt 1

{

static unsigned int Cnt = 0;

Cnt++;

if (Cnt >= 1000) //1mS中斷 0.001*1000=1S

{

Cnt = 0;

LED = !LED;

}

}

void main(void)

{

//使用內部時鐘 燒錄軟件會幫我們配置好 如不懂 參考前面第3章系統設置學習。

// 燒錄軟件設置11.0592MHz為系統時鐘。以後我們的學習都是這個時鐘頻率。

P_SW2 |= (1<<7);

CKSEL = 0x00; //選擇內部 IRC ( 默認 )

P_SW2 &= ~(1<<7);

//配置端口 對於控制我們系統板的LED,配置準雙向口和推輓輸出都可以。

//只要是做為輸出,我建議全部設置為推輓輸出。

/*

PnM1.x PnM0.x Pn.x 口工作模式

0 0 準雙向口

0 1 推輓輸出

1 0 高阻輸入

1 1 開漏輸出

*/

P1M1 &= ~(1<<1); P1M0 |= (1<<1); //設置為推輓輸出

P_SW2 |= (1<<7);

P1PU = 0x00;//禁止P1端口內部的 3.7K 上拉電阻

P1NCS = 0xFF; //禁止P1端口的施密特觸發功能。

P_SW2 &= ~(1<<7);

AUXR &= ~(1 << 7);//定時器0為12T模式

TMOD &= 0xF0; //模式 0

TL0 = 0x66;//定時器1mS

TH0 = 0xFC;

TCON |= (1 << 4);//啟動定時器0

IP |= (1<<1); //最高優先級

IPH |= (1<<1);

ET0 = 1;//允許定時器0中斷

EA = 1;//總中斷打開

LED = 1;//LED滅

while (1) ;

}

我們把程序編譯好,燒錄到板子裡面,就會看到D2 LED一閃一閃亮晶晶。

宏晶科技 STC8G1K系列單片機教程「九」定時器/計數器

好了這章就講到這裡。希望大家多多關注我的原創文章。謝謝。


分享到:


相關文章: