目錄
1.定時器
2. STC89C52定時器資源
3.定時器框圖
4. 定時器工作模式
5.中斷系統
1)介紹
2)流程圖:?編輯
3)STC89C52中斷資源
4)定時器和中斷系統
5)定時器的相關寄存器
6.按鍵控制LED流水燈模式
1.定時器
介紹:51單片機的定時器屬于單片機的內部資源,其電路的連接和運轉均在單片機內部完成
作用:
(1)用于計時系統,可實現軟件計時,或者使程序每隔一固定時間完成一項操作
(2)替代長時間的Delay,提高CPU的運行效率和處理速度(避免按鍵不靈敏)
(…)?
2. STC89C52定時器資源
定時器個數:3個(T0、T1、T2),?T0?和?T1?與傳統的51單片機兼容,T2是此型號單片機增加的資源
注意:定時器的資源和單片機的型號是關聯在一起的,不同的型號可能會有不同的定時器個數和操作方式,但一般來說,T0和T1的操作方式是所有51單片機所共有的
3.定時器框圖
提供計數單元的時鐘脈沖? ? ? ? ? ? ? ? ? ? ? ?????????時鐘計數??????????????????????????????產生中斷,執行定時任務
定時器在單片機內部就像一個小鬧鐘一樣,根據時鐘的輸出信號,每隔“一秒”,計數單元的數值就增加一,當計數單元數值增加到“設定的鬧鐘提醒時間”時,計數單元就會向中斷系統發出中斷申請,產生“響鈴提醒”,使程序跳轉到中斷服務函數中執行?
4. 定時器工作模式
STC89C52的T0和T1均有四種工作模式:
? 模式0:13位定時器/計數器
? 模式1:16位定時器/計數器(常用)
? 模式2:8位自動重裝模式
? 模式3:兩個8位計數器
工作模式1框圖:
1)TH0 TL0 計數系統最多可以存65535
2)TF0為標志位,通過標志位向中斷系統申請中斷
3)時鐘提供脈沖,一個脈沖使計數系統加 1 ,當計數系統到達65535后會溢出(計數系統為 0 )通過TF0產生中斷
4)/12或/6 為分頻? ?如:12MHZ/12 ==1 MHZ
SYSclk:系統時鐘,即晶振周期,本開發板上的晶振為12MHz? (system clock)
T0 Pin :單片機外部接口?
當有外部引腳來提供時鐘時,定時器為計數器? ? ? ? ? ? ? ? ?
5.中斷系統
1)介紹
2)流程圖:
3)STC89C52中斷資源
中斷源個數:8個(外部中斷0、定時器0中斷、外部中斷1、定時器1中斷、串口中斷、定時器2中斷、外部中斷2、外部中斷3)
中斷優先級個數:4個
中斷號:
注意:中斷的資源和單片機的型號是關聯在一起的,不同的型號可能會有不同的中斷資源,例如中斷源個數不同、中斷優先級個數不同等等
4)定時器和中斷系統
為了方便理解,這里使用的中斷系統圖是傳統51單片機的圖,STC89C52的中斷系統圖可參考手冊
從左下往右分別為 非門(數據取反) 或門(有1 則為1) 與門(有0則為0)
5)定時器的相關寄存器
寄存器是連接軟硬件的媒介,在單片機中寄存器就是一段特殊的RAM存儲器,一方面,寄存器可以存儲和讀取數據,另一方面,每一個寄存器背后都連接了一根導線,控制著電路的連接方式寄存器相當于一個復雜機器的“操作按鈕”
?
6.按鍵控制LED流水燈模式
#include <REGX52.H>
#include"Timer0.h" //main.c
#include"Key.h"
#include<INTRINS.H>unsigned char KeyNum,LEDMode;
void main()
{P2=0xfe;Timer0Init();while(1){KeyNum=Key();if(KeyNum){if(KeyNum==1){LEDMode++;if(LEDMode>=2)LEDMode=0;} }}
}
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0x18; TH0 = 0xFC; T0Count++;if(T0Count>=500){T0Count=0;if(LEDMode==0)P2=_crol_(P2,1);if(LEDMode==1)P2=_cror_(P2,1);}
}
#include <REGX52.H>
void Timer0Init(void) //Timer0.c
{TMOD &= 0xF0; TMOD |= 0x01; TL0 = 0x18; TH0 = 0xFC; TF0 = 0; TR0 = 1;ET0=1;EA=1;PT0=0;
}
#ifndef ___Timer0__ //防止重定義
#define ___Timer0__ //Timer0.hvoid Timer0Init(void); #endif
#include <REGX52.H> //Key.c
#include"Delay.h"unsigned char Key()
{unsigned char KeyNumber = 0;if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}return KeyNumber;
}
#ifndef ___Key__ //防止重定義
#define ___Key__ //Key.hunsigned char Key();#endif
#include <REGX52.H>void Delay(unsigned int xms) //延時 xms ms{unsigned char i, j;
while(xms)
{i = 2;j = 239;do{while (--j);} while (--i);xms--;
}
}
#ifndef __Delay_H //防止重定義
#define __Delay_H //Delay.hvoid Delay(unsigned int xms); #endif
注意:可位尋址可以對單獨的位進行賦值(TCON),不可位尋址只能整體賦值(TMOD)
謝謝觀看