芯圣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周期闪烁。程序中附带了如何计算定时周期的方法。