TC0与TC1的功能和使用方法是一样的,所以这里只介绍TC0
与定时器TC0相关的寄存器共有5个;TC0M,TC0C,INTRQ,INTEN,TC0R
一、TC0M模式寄存器
|
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
TC0M |
TC0ENB |
TC0rate2 |
TC0rate1 |
TC0rate0 |
TC0CKS |
ALOAD0 |
TC0OUT |
PWM0OUT |
读/写 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
复位 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Bit0;PWM0OUT;pwm输出控制位
0=禁止pwm0输出
1=使能pwm0输出,占空比由TC0OUT和ALOAD0决定
Bit1;TC0OUT;仅当PWM0OUT =0时有效
0=禁止,p54作为普通IO口使用
1=使能,p54输出TC0OUT信号
Bit2;ALOAD0,自动装载控制。仅当PWM0OUT = 0 时有效。
0 = 禁止 TC0自动装载;
1 = 使能 TC0 自动装载。
Bit3;TC0CKS:TC0 时钟信号控制位。
0 = 内部时钟(Fcpu或 Fosc);
1 = 外部时钟,由 P0.0/INT0输入。
Bit6~bit4;T0rate2~T0rate0;T0分频选择位
T0时钟由CPU时钟分频而来,分频比如下;
T0rate2~T0rate0 |
分频比 |
000 |
fCPU/256 |
001 |
fCPU/125 |
010 |
fCPU/64 |
011 |
fCPU/32 |
100 |
fCPU/16 |
101 |
fCPU/8 |
110 |
fCPU/4 |
111 |
fCPU/2 |
Bit7;T0ENB;T0使能位,
0=不使能
1=使能
注:若 TC0CKS=1,则TC0 用作外部事件计数器,此时不需要考虑TC0RATE 的设置,P0.0 口无中断信号(P00IRQ=0)
二、TC0C计数寄存器
TC0是8位的计数器,计数范围为0-255,到255+1就溢出,
|
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
TC0C |
TC0C7 |
TC0C6 |
TC0C5 |
TC0C4 |
TC0C3 |
TC0C2 |
TC0C1 |
TC0C0 |
读/写 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
复位 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
当TC0时钟来源不同时,TC0C的计数范围也不一样,当TC0M寄存器中TC0CKS0= 0=计数脉冲来源为内部时钟(Fcpu或 Fosc),计数范围由PWM0OUT、TC0OUT和ALOAD0决定。当TC0CKS0=1 =为外部计数模式,由 P0.0/INT0输入。计数范围为0-256;
TC0CKS0 |
PWM0OUT |
TC0OUT |
ALOAD0 |
TC0C范围 |
计数多少次溢出 |
0 |
0 |
x |
x |
00H-0FFH |
256 |
1 |
0 |
0 |
00H-0FFH |
256 |
|
1 |
0 |
1 |
00H-3FH |
64 |
|
1 |
1 |
0 |
00H-1FH |
32 |
|
1 |
1 |
1 |
00H-0FH |
16 |
|
1 |
— |
— |
— |
00H-0FFH |
256 |
TC0C初值=256-(T0溢出间隔时间*时钟速度)
例;TC0C定时10ms,fCPU=1m,TC0rate=010=fCPU/64,那么
TC0C初值=256-(T0溢出间隔时间*时钟速度)
=256-(10ms*(fcpu/64))
=64H
三、TC0R自动重装寄存器
TC0 的自动装载功能由 TC0M的 ALOAD0位控制。当 TC0C溢出时, TC0R的值自动装入 TC0C中。这样在使用的过程中就不需要在中断中重新赋值。
|
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
TC0R |
TC0R7 |
TC0R6 |
TC0R5 |
TC0R4 |
TC0R3 |
TC0R2 |
TC0R1 |
TC0R0 |
读/写 |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
复位 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
TC0R初值=256-(T0溢出间隔时间*时钟速度),计算方法和TC0C一样。
四、中断请求寄存器INTRQ
五、中断请求使能寄存器INTEN
名称 |
Bit7 |
Bit6 |
Bit5 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
复位 |
INTRQ |
ADCIRQ |
TC1IRQ |
TC0IRQ |
T0IRQ |
SIOIRQ |
P02IRQ |
P01IRQ |
P00IRQ |
00000000 |
INTEN |
ADCIEN |
TC1IEN |
TC0IEN |
T0IEN |
SIOIEN |
P02IEN |
P01IEN |
P00IEN |
00000000 |
置位寄存器INTEN的相应位可以使能相应的中断。
当中断发生时,寄存器INTRQ相应的位会被置1,这个中断标志位需要在中断中软件清零。TC0C溢出时,如果使能了TC0中断使能,则会产生TC0中断,TC0IRQ会被置1.
例;在cpu=1M情况下,T0中断定时10ms。
#include<sn8p2612.h>
main()
{
FTC0IEN=0;//配置中断的时候最好先关闭相应中断
TC0M=0X24;//分频 fCPU/64,使能自动重装载
TC0R=0X64;//重装值
TC0C=0X64;//10ms初值
FTC0IEN=1;//开定时器T0中断
FGIE=1;//开总中断
while(1);
}
//所有中断共用一个入口,所以要在中断中查询相应的标志位的判断是哪个中断
__interrupt T0INT(void)
{
if(FTC0IRQ=0) //T0中断查询
{
FTC0IRQ=0; //标志位手动清零
//中断处理函数,该干嘛干嘛去!
}
}
例;TC0作为外部脉冲计数器
#include<sn8p2612.h>
int TC0_OVER_COUNT=0; //中断溢出次数,溢出一次为256个脉冲
main()
{
unsigned int All_Count=0; //计数总值
FTC0IEN=0; //配置中断的时候最好先关闭相应中断
TC0M=0X08; //对外部脉冲计数
FTC0IEN=1; //开定时器T0中断
FGIE=1; //开总中断
while(1)
{
All_Count=TC0_OVER_COUNT*256+TC0C; //计算外部脉冲总值
}
}
//所有中断共用一个入口,所以要在中断中查询相应的标志位的判断是哪个中断
__interrupt T0INT(void)
{
if(FTC0IRQ=0) //TC0中断查询
{
FTC0IRQ=0; //标志位手动清零
TC0_OVER_COUNT++;
}
}