HC18M003单片机的定时器1是一个16位的计时器,。系统框图如下:
数据寄存器T1L,T1H
以下是测试程序,使用定时器1在PB1口输出矩形波。
#include "holychip_define.h" static int cnt = 0; /*************************************************************************************** * @实现效果 将T1设置为定时器模式,定时50us后进入中断,PB1翻转 ***************************************************************************************/ void main(void) { /************************************系统初始化****************************************/ OSCCON = 0X04; //Fosc=32MHz,Fcpu=4MHz(Fosc四分频,2T) /************************************IO口初始化***************************************/ ANSELB = 0XFF; TRISB = 0XFF; //PB数字输出模式 /**************************************T1配置*****************************************/ T1CS1 = 0; T1CS0 = 0; T1OSCEN = 0; //T1时钟源配置Fcpu T1CKPS3 = 1; T1CKPS2 = 0; T1CKPS1 = 0; T1CKPS0 = 0; //T1输入时钟1分频 T1ON = 1; T1CS1 = 0; T1CS0 = 0; T1OSCEN = 0; T1SYNC = 0; //定时器模式,休眠和绿色模式下停止 T1H = 0XFF; T1L = 0x37; //T1初始值 //定时时间=(1/时钟源*分频系数)*(0xFFFF-初始值) // = 1/4000000*1*200 // = 50uS /*************************************中断使能****************************************/ GIE = 1; PEIE = 1; T1IE = 1; //使能T1中断 while(1) { } } /*************************************************************************************** * @说明 中断服务函数 * @参数 无 * @返回值 无 * @注 无 ***************************************************************************************/ void interrupt T1_Isr(void) { if(T1IF) { T1H = 0XFF; T1L = 0x00; //重置T1 T1IF = 0; //清除中断标志位 cnt=(cnt+1)%10000; // 每500mS翻转一次 if (cnt == 0) { PORTB1 =~PORTB1; //PORTB翻转 } } }
实际测试完整低电平和高电平的持续时间为700mS,与计算的误差出入有点大。于是去掉500mS计数处理部分,直接测试50微秒周期,实际结果为将近70微秒左右。
出入确实比较大,所以实际应用时,还是需要仔细调整初始值才行。