一、前言
C8051F340单片的定时器2有3种工作方式,其中用于定时的有两种:
1、16 位自动重装载方式
2、8 位自动重装载定时器方式(双8位定时器)
定时器 2 是一个 16 位的计数器/定时器,由两个 8 位的 SFR 组成:TMR2L(低字节)和TMR2H(高字节)。定时器 2 可以工作在 16 位自动重装载方式、8 位自动重装载方式(两个 8位定时器)、USB 帧起始(SOF)捕捉方式或低频振荡器(LFO)下降沿捕捉方式。T2SPLIT
位(TMR2CN.3)、T2CE 位(TMR2CN.4)和 T2CSS 位TMR2CN.1)定义定时器 2 的工作方式。定时器 2 的时钟源可以是系统时钟、系统时钟/12 或外部振荡源时钟/8。
文本介绍16 位自动重装载方式的定时程序。
二、程序展示
1、程序简介
通过定时器2计时,控制LED灯的闪烁(50ms闪烁一次)。使用单片机内部的12M晶振,进行硬件12分频,并进行软件8分频,目的是为了让计时器能够计50ms级。
X*12 * 8/12000000=0.05(50ms) X=6250,也就是计数器需要计6250次数,定时器2总共可以计2的16次方次数,也就是65536次,因为是从0开始计,最多计导65535次,现需要计6250次,则定时器的初始值应该为65535-6250=59285。
2、程序头文件部分
#include <C8051F340.h>
#define SYSCLK 12000000/8 //软件进行8分频
#define TIMER2_PRESCALE 12 //通过寄存器设置的分频数
#define LED_CHG_RATE 50 //设置LED灯的闪烁频率,50代表50ms
#define TIMER0_TICK_PER_MS SYSCLK/TIMER0_PRESCALE/1000
#define REG1 TIMER0_TICK_PER_MS*LED_CHG_RATE
#define REG2 0xFFFF-REG1
#define TIMER2_RELOAD REG2 // 高位重载值
sbit LED1 = P2^2; //通过P2.2输出驱动LED灯闪烁
void Port_Init (void); //端口初始化
void Timer2_Init (void); //定时器2初始化
sfr16 TMR2RL = 0xCA;
sfr16 TMR2 = 0xCC;
3、主程序部分
main ()
{
PCA0MD &= ~0x40; // 关闭看门狗
Timer2_Init (); // 定时器0初始化
Port_Init (); // 端口初始化
EA = 1; // 允许中断
while (1);
}
4、端口初始化程序
void Port_Init (void)
{
XBR1 = 0x40;
P2MDOUT = 0x04; //设置P2.2推挽输出
}
5、定时器2初始化程序
void Timer2_Init(void)
{
CKCON &= ~0x60; // 系统时钟12分频
TMR2CN &= ~0x01;
TMR2RL = TIMER2_RELOAD; // 重载值
TMR2 = TMR2RL; // 初始化寄存器
TMR2CN = 0x04; // 使能定时器2在16位自动重载模式
ET2 = 1; // 定时器2中断允许
}
6、定时器2中断程序
void Timer2_ISR (void) interrupt 5
{
LED = ~LED; // LED闪烁
TF2H = 0; // 中断清0
}