定時器TIMER0、TIMER1
RD8T37 系列單片機內部的 Timer0 和 Timer1 是兩個 16 位定時器/計數器,它們具有計數方式和定時方式兩種工作模式。特殊功能寄存器 TMOD 中有一個控制位 C/TX 來選擇 T0 和T1 是定時器還是計數器。它們本質上都是一個加法計數器,只是計數的來源不同。定時器的來源為系統時鐘或者其分頻時鐘,但計數器的來源為外部管腳的輸入脈沖。只有在 TRx=1 的時候,T0 和 T1 才會被打開計數。
計數器模式下,P0.2/T0 和 P0.3/T1 管腳上的每一個脈沖,T0 和T1的計數值分別增加 1。定時器模式下,可通過特殊功能寄存器 TMCON 來選擇T0和 T1 的計來源是 sys/12 或 fsys (fsys 為分頻后的系統時鐘)。
定時器/計數器 T0 有4 種工作模式,定時器/計數器 T1有 3 種工作模式(模式三不存在):
1.模式 0: 13 位定時器/計數器模式
2.模式 1: 16 位定時器/計數器模式
3.模式 2: 8 位自動重模式
- 模式 3: 兩個8 位定時器/計數器模式
在上述模式中,T0 和 T1 的模式 0、1、2 都相同,模式3 不同。
T0 和 T1相關特殊功能寄存器
定時器0 功能寄存器的宏定義:
/*TIMER*/
sfr TCON = 0X88; //定時器控制寄存器
sfr TMOD = 0X89; //定時器工作模式寄存器
sfr TL0 = 0X8A; //定時器0低8位
sfr TL1 = 0X8B; //定時器1低8位
sfr TH0 = 0X8C; //定時器0高8位
sfr TH1 = 0X8D; //定時器1高8位
定時器0初始化
void Timer0Iint(void)
{
TMOD |= 0x01; // 配置定時器0為 16位定時器, TH0、TL0全用
TH0 =(65536-1000)/256; //1000us定時,即1毫秒溢出產生中斷
TL0 =(65536-1000)%256; //1000us定時,即1毫秒溢出產生中斷
ET0 = 1; //開啟定時器0中斷
EA = 1; //開啟全局中斷
TR0 = 1; //定時器0開始計數;
}
定時器0中斷函數:
void Timer0() interrupt 1
{
//每次產生中斷后初始化定時器初值, 1ms秒產生1次中斷
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
//500毫秒執行次LED1反轉
count ++;
if(count == 500)
{
LED1 = ~LED1;
count = 0;
}
}
main.c代碼如下:
#include "RD8T37x_C.H"
sbit LED1 = P3^1;
sbit LED2 = P3^2;
static uint32_t count = 0;
void LED_Init(void)
{
P3CON |= 0x06; //P31輸出
}
void Timer0Iint(void)
{
TMOD |= 0x01; // 配置定時器0為 16位定時器, TH0、TL0全用
TH0 =(65536-1000)/256; //1000us定時,即1毫秒溢出產生中斷
TL0 =(65536-1000)%256; //1000us定時,即1毫秒溢出產生中斷
ET0 = 1; //開啟定時器0中斷
EA = 1; //開啟全局中斷
TR0 = 1; //定時器0開始計數;
}
void main(void)
{
LED_Init();
Timer0Iint();
while(1);
}
void Timer0() interrupt 1
{
//每次產生中斷后初始化定時器初值, 1ms秒產生1次中斷
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
//500毫秒執行次LED1反轉
count ++;
if(count == 500)
{
LED1 = ~LED1;
count = 0;
}
}
下載到開發板后就實現P3.1閃燈了。
審核編輯:湯梓紅
-
單片機
+關注
關注
6056文章
44804瀏覽量
643737 -
計數器
+關注
關注
32文章
2281瀏覽量
95772 -
定時器
+關注
關注
23文章
3271瀏覽量
116467
發布評論請先 登錄
相關推薦
單片機定時器中斷應用案例

52單片機有幾個定時器?52單片機定時器1和52單片機定時器2程序對比
ATmega16單片機教程之ATmega16單片機定時器的分析與設計應用概述

基于51單片機的定時器

51單片機——定時器的原理和使用

評論