以下是我自己的总结,我不会分析代码,代码简单讲起来没有好大意思,主要是抓住核心知识框架。
脉冲:32MHZ就是一秒钟32000000个脉冲
时钟周期:1/f=1/32us指令周期等于时钟周期(在51中是机械周期=12*时钟周期)
内部是16MHZ,定时器内部一个脉冲,定时器计数就加一
定时器 1(查询法)
T1CTL寄存器 定时器1控制和状态:
T1CTL (Bit 3:2) 分频器划分值,如下:
00: 标记频率/1
01: 标记频率/8
10: 标记频率/32
11: 标记频率/128
T1CTL (Bit 1:0) 选择定时器1模式
00: 暂停运行。
01: *运行,从0x0000到0xFFFF反复计数。
10: 模,从0x0000到T1CC0反复计数。
11: 正计数/倒计数,从 0x0000 到 T1CC0 反复计数并
且从 T1CC0 倒计数到 0x0000。
T1STAT(0xAF)定时器 1 状态:
Bit5: 定时器 计数器溢出中断标志//设置为1
Bit4: 定时器 1 通道 4 中断标志
Bit3: 定时器 1 通道 3 中断标志
Bit2: 定时器 1 通道 2 中断标志
Bit1: 定时器 1 通道 1 中断标志
Bit0: 定时器 1 通道 0 中断标志
IRCON(0xC0) 中断标志 4 :
Bit1: 定时器1中断标志。当定时器1中断发生时设为1并且当CPU向量指向
中断服务例程时清除。 0: 无中断未决 1: 中断未决
T1CTL = 0x0d; //128分频,自动重装 0x0000-0xFFFF 1/(16000000/128)*65536= 0.5248s
T1STAT= 0x21; //通道0,中断有效
if(IRCON > 0) IRCON=0;
定时器3
T3CTL定时器3控制
[7:5]分频器划分值。产生有效时钟沿用于来自 CLKCON.TICKSPD 的定时器时钟 。如 下
000 : 标记 频率 /1
001 : 标记 频率 /2
010 : 标记 频率 /4
011 : 标记 频率 /8
100 : 标记 频率 / 1 6
101 : 标记 频率 / 3 2
110 : 标记 频率 / 6 4
111 : 标记 频率 / 1 28
[4] 启动定时器。正常运行时设置 ,暂停时清除,1启动。
[3] 溢出中断屏蔽0 :中断禁止 1 :中断使能
[2] 计数器。 写 1 到 CLR 复位 计数器 到 0x00 ,并初始化相关通道所有的输出引脚。总是读作 0 。
[1:0]定时器3模式。选择以下模式:
0 0 : *运行 , 从 0x0 0 到 0xFF 反复计数
0 1 : 倒计数 , 从 T3CC 0 到 0 x 0 0 计数
1 0 : 模 , 从 0x0 0 到 T3 C C0 重复计数
1 1 : 正 / 倒计 数 , 从 0 x0 0 到 T3C C0 重复计数,降到 0x00
{
T3CTL |= 0x08 ; //定时器3控制,开溢出中断
T3IE = 1; //开总中断和T3中断
T3CTL |= 0xE0; //128分频,128/16000000*N=0.5S,N=62500
T3CTL &= ~0x03; //自动重装 00->0xff 62500/255=245(次)
T3CTL |= 0x10; //启动
EA = 1; //开总中断
}
//定时器T3中断处理函数
#pragma vector = T3_VECTOR//(T3_VECTOR向量地址)
__interrupt void T3_ISR(void)
{
IRCON = 0x00; //清中断标志, 也可由硬件自动完成
}