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微秒左右。

出入确实比较大,所以实际应用时,还是需要仔细调整初始值才行。
我要赚赏金
