📄 timer.c
字号:
/*************************************************/
/****************定时器************************/
/*************2003年2月9日*********************/
/************WROTE BY WANGSW********************/
/*
寄存器说明:
1 TCON:中断标志寄存器
TF1(8F) T1中断标志位
TR1(8E) T1启停位
TF0(8D) T0中断标志位
TR0(8C) T0启停位
2 TMOD:定时器方式寄存器
GATE | C/~T | M1,M0 |GATE | C/~T | M1,M0 |
\______________________________/ 0 ~INT0 0 定时器 0 , 0 -----方式0
T1 无关 1 计数器 0 , 1 -----方式1
对应 1 ~INT0 模式 1 , 0 -----方式2
INT1 有关 1 , 1 -----方式3
3 工作方式:
方式0:13位计数器TL的搞三位不用
方式1:16位计数器
方式2:可循环8位计数器,适用于UART
方式3:T0与T1不同
定时器1 只能按不需要中断的方式2工作
此模式下定时器0 的TL0 及TH0 作为两个独立的8 位计数器/定时器
TL0 占用定时器0 的TF0 TH0
TL1 占用定时器1 的TR1和TF1
*/
#include "reg52x2.h"
#include "define.h"
#include "timer.h"
/******************************************************************************************
*函数名: timer0
*参数: bStart 设置定时/计数器0是否开始工作
bInt0Relation 定时/计数器0是否与INT0有关,此位设置即影响TMOD
中关于定时/计数器0的GATE位
bTimerMode 定时/计数器0是否是定时器模式,bTimerMode=1,即进入
定时器模式;bTimerMode=0,即进入计数器模式
bInterruptEnable 定时/计数器0中断使能
WorkMode 定时/计数器0工作模式设定
TH0Data 定时/计数器0高8位定时计数器数据
TL0Data 定时/计数器0低8位定时计数器数据
*返回值: 无
*描述: 对定时/计数器0的工作模式以及一些设置进行设定,并可以
启动定时/计数器0开始工作
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void timer0(bool bStart,
bool bInt0Relation,
bool bTimerMode,
bool bInterruptEnable,
byte WorkMode,
byte TH0Data,
byte TL0Data)
{
TF0 = 0; /*定时器中断标志位*/
if(bInt0Relation) /*是否受INT0控制*/
{
SETBIT(TMOD, 3);
}
else
{
RESETBIT(TMOD, 3);
}
if(bTimerMode) /*定时器计数器模式,TRUE为定时器,FALSE为计数器*/
{
RESETBIT(TMOD, 2);
}
else
{
SETBIT(TMOD, 2);
}
if(WorkMode & 0x02) /*定时/计数器0工作方式设定*/
{
SETBIT(TMOD, 1);
}
else
{
RESETBIT(TMOD, 1);
}
if(WorkMode & 0x01)
{
SETBIT(TMOD, 0);
}
else
{
RESETBIT(TMOD, 0);
}
TH0 = TH0Data;
TL0 = TL0Data;
ET0 = bInterruptEnable;
TR0 = bStart;
}
/******************************************************************************************
*函数名: timer2
*参数: bStart 设置定时/计数器2是否开始工作
TH2Data 定时器2初值设置
*返回值: 无
*描述: 定时器2设置程序,在这里定时/计数器2为可重复装载递增
16位定时器,设置为每5ms产生一次溢出中断
*编写: 王绍伟
*版本信息: V1.0 2003年8月15日
******************************************************************************************/
extern void timer2(bool bStart, byte TH2Data)
{
#ifdef SPEEDUP
TH2 = TH2Data;
RCAP2H = TH2Data;
#else
/*
当非加速模式时,让至溢出的定时计数次
数为原来加速模式的一半
*/
byte temp;
temp = 0x100 - TH2Data;
temp = (temp >> 1) + TH2Data;
TH2 = temp;
RCAP2H = temp;
#endif
ET2 = 1;
TL2 = 0x00;
RCAP2L = 0x00;
T2MOD = 0x00;
if(bStart)
{
T2CON = 0x04;
}
else
{
T2CON = 0x00;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -