定时器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闪灯了。
审核编辑:汤梓红
-
单片机
+关注
关注
6035文章
44554浏览量
634635 -
计数器
+关注
关注
32文章
2256浏览量
94477 -
定时器
+关注
关注
23文章
3246浏览量
114719
发布评论请先 登录
相关推荐
评论