与T0定时器相关的寄存器共4个;T0M,T0C,INTRQ,INTEN.
一、T0M模式寄存器
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
T0M | T0ENB | T0rate2 | T0rate1 | T0rate0 | ----- | ----- | ----- | ----- |
读/写 | R/W | R/W | R/W | R/W | ----- | ----- | ----- | ----- |
复位 | 0 | 0 | 0 | 0 | ----- | ----- | ----- | ----- |
T0ENB;T0使能位,0=不使能,1=使能
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 |
二、T0计数寄存器
T0是8位的计数器,计数范围为0-255,T0没有重装载功能,所以默认计数是从0开始,到255+1就溢出,当然T0也可以设计数初值。
| Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
T0C | T0C7 | T0C6 | T0C5 | T0C4 | T0C3 | T0C2 | T0C1 | T0C0 |
读/写 | R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
复位 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
T0C初值=256-(T0溢出间隔时间*时钟速度)
例;T0定时10ms,fCPU=1m,T0rate=010=fCPU/64,那么
T0C初值=256-(T0溢出间隔时间*时钟速度)
=256-(10ms*(fcpu/64))
=64H
三、中断请求寄存器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,这个中断标志位需要在中断中软件清零。
T0C溢出时,如果使能了T0中断使能,则会产生T0中断,T0IRQ会被置1.
例;在cpu=1M情况下,T0中断定时10ms。
#include<sn8p2612.h>
main()
{
FT0IEN=0; //配置中断的时候最好先关闭相应中断
T0M=0X20; //分频 fCPU/64
T0C=0X64; //10ms初值
FT0IEN=1; //开定时器T0中断
FGIE=1; //开总中断
while(1);
}
//所有中断共用一个入口,所以要在中断中查询相应的标志位来判断是哪个中断
__interrupt T0INT(void)
{
if(INTRQ&0X10) //T0中断查询
{
T0C=0x64; //10MS初值重装0x64
FT0IRQ=0; //标志位手动清零
//中断处理,该干嘛干嘛去!!!
}
}