目錄
- 定時器的介紹
- STC89C52定時器資源
- 定時器框圖
- 定時器作業模式
- 中斷系統
- 單片機引腳圖
- 中斷服務流程
- 中斷資源
- 定時器相關暫存器
- 代碼
定時器的介紹
定時器介紹: 51單片機的定時器屬于單片機的內部資源,其電路的連接和運轉均在單片機內部完成,
定時器作用:
1.用于計數系統,可實作軟體計時,或者使程式每隔一固定時間完成一項操作
2.替代長時間的Delay,提高CPU的運行效率和處理速度
STC89C52定時器資源
1.定時器個數三個(T0,T1,T2),T0和T1與傳統的51單片機兼容,T2是此型號單片機增加的資源
注意:定時器的資源和單片機的型號是關聯在I起的,不同的型號可能會有不同的定時器個數和操作方式,但一般來說,T0和T1的操作方式是所有51單片機所共有的,
定時器框圖

定時器在單片機內部就像一個小鬧鐘一樣,根據時鐘的輸出信號每隔“一秒”,計數單元的數值就加以,當計數單元數值增加到“設定的鬧鐘提醒時候”時,計數單元就會向中斷系統發出中斷申請,產生“響鈴提醒”,使得程式跳轉到中斷服務程式,
定時器作業模式
STC89C52的T0和T1均由四種作業模式
模式0:13位定時器/計數器
模式1:16位定時器/計數器(常用)
模式2:8位自動重裝載模式
模式3:兩個8位計數器
作業模式1框圖:

Sysclk : 系統時鐘,即晶振周期,本開發板上的晶振為12MHZ
C/T = 0 ->定時器, C/T =1 -> 計數器
有兩個開關,第一個開關是選擇12分頻還是6分頻,第二個開關向上就是定時器的模式(Sysclk),向下就是計數器的模式(T1 Pin)
選擇12分頻:12MHz除12為1MHz,也就是說一秒=1000000次機器周期 相當于1us計數一次
51單片機定時器初值的計算
中斷系統

單片機引腳圖

中斷服務流程

中斷資源
1.中斷源個數: 8個(外部中斷0,定時器0中斷,外部中斷1,定時器1中斷,串口中斷,外部中斷2,外部中斷3)
2.優先級個數: 4個
3.中斷號:

注意: 中斷的資源和單片機的型號是關聯在一起的,不同的型號可能會有不同的中斷資源,例如中斷源個數不同,中斷優先級個數不同等等,
定時器相關暫存器
1.暫存器是連接軟硬體的媒介
2.在單片機中暫存器就是一段特殊的RAM存盤器,一方面,暫存器可以存盤和讀取資料,另一方面,每一個暫存器背后都連接了一根導線,控制著電路的連接方式,
3.暫存器相當于一個復雜機器的”操作按鈕”


可位尋址和不可謂尋址的區別:
可位尋址:可以單獨配置暫存器中的一位
不可位尋址:想要配置其中一位,必須配置整個暫存器


代碼
將震動傳感器接到P3.4(T0)
main.c
#include <REGX52.h>
#include <INTRINS.H>
/*?ìμ??÷μ?*/
sbit LED = P2^1;
unsigned int T0Count=0;
void Timer0_Init(void)
{
TMOD = 0x01; //?????¨ê±?÷?£ê?1£?0000 0001
TF0 = 0; //1?±??D??ò?3?±ê????£?·à?12úéú?D??
TR0 = 1; //?a???¨ê±?÷0
TH0 = 64535/256; //ày£o123/100 = 1 ?¨ê±?÷16??£?TH0oíTL0°???×é3éμ?16??
TL0 = 64535%256; //ày£o123%100 = 23;16??×?′ó??êy65535£???ê±ò???1us£?Dèòa1ms?í??3?1000us
ET0 = 1; //′ò?a?¨ê±?÷0?D??
EA = 1; //′ò?a×ü?D??
PT0 = 1; //?D??ó??è??
}
/**
*1|?ü£o?óê±500ms
*2?êy£ovoid
*·μ???μ£ovoid
*/
void Delay500ms(void) //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
int main()
{
Timer0_Init();
while(1)
{
}
}
/**
*1|?ü£o?¨ê±?÷?D??·t??3ìDò
*2?êy£ovoid
*·μ???μ£ovoid
*/
void Timer0_Routine(void) interrupt 1
{
TH0 = 64535/256;//μúò?′?ê?64535£??óμ?65535oó??D???êyê?′ó0?aê?
TL0 = 64535%256;
T0Count ++;
if(T0Count >= 1000)//1yò????ù?′DD?£??è??D??ò?′?1ms£?1s = 1000ms
{
LED = 0;
Delay500ms();
LED = 1;
Delay500ms();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290735.html
標籤:其他
