芯圣HC18M003单片机的定时器0是8位可编程定时器。




下面我们使用定时器0的模式0,做一小段测试程序。代码如下:
#include"holychip_define.h"
static int cnt = 0;
/***************************************************************************************
* @实现效果 T0定时1ms,每进500次中断,PA翻转一次
***************************************************************************************/
void main() {
/************************************系统初始化****************************************/
OSCCON = 0x04; // Fosc=32M Fcpu=4M(Fosc4分频 2T)
/************************************IO初始化******************************************/
ANSELA = 0xFF; // PA设为数字模式
TRISA = 0xFF; // PA设为输出模式
/**********************************T0配置初始化****************************************/
OPTION = 0X07; // 分频寄存器配置256分频
T0CS = 0; // T0 模式选择寄存器:定时器模式,计数时钟Fcpu,休眠和绿色模式下停止
T0OSCEN = 0; // 禁止定时器模块0使用计数时钟
T0SE = 0; // 定时器模式,计数时钟Fcpu
//Tim0计算时间 = 1/(时钟源/Timer分频系数)*(256-T0初值)
//定时1ms
//反推初值 = 256 - ((1/1000) /(1/(Fcpu / Timer分频系数)))
// = 256 - ((1/1000) / (1/(4000000 / 256)))
// = 256 - 16
// = 0xF0
//T0=0xF0
//反推初值 = 1/(时钟源/Timer分频系数)*(256-T0初值)
// = 1/(4000000/256)*(256-0xF0)
// = 1.024ms
T0 = 0xF0; // T0定时时间1ms
T0IE = 1; // 允许定时器0中断
GIE = 1; //打开总中断
while(1) {
}
}
/***************************************************************************************
* @说明 T0中断服务函数
* @参数 无
* @返回值 无
* @注 无
***************************************************************************************/
void interrupt T0_Isr(void) {
if(T0IF) {
T0 = 0xF0; //T0定时时间1ms
cnt = (cnt +1)%500; // 500次计数为一个周期
if (cnt==0) {
PORTA5 = ~PORTA5; //PORTA5翻转
PORTA0 = ~PORTA0; //PORTA0翻转
}
T0IF = 0; //清除T0中断标志位
}
}因为程序加了注释,所以就不额外说明了。基本思路就是让定时器0使用系统时钟进行计数,并产生定时中断。在中断例程中计数,得到准确时间,并驱动GPIO口翻转,使LED周期闪烁。程序中附带了如何计算定时周期的方法。
我要赚赏金
