C语言的定时器中断程序

#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
uchar aa,num;
void main()
{
aa=0;
num=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
P2=0xf0;
P0=0x3f;
while(1)
{
if(aa==10)
{
aa=0;
num++;
if(num==10)
{
num=0;
}
P2=0xf0;
P0=table[num];
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}

void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑{?……………

}释疑:void Timer0() interrupt 1 using 1Timer0? ?是函数名,随便取的 interrupt? ?xx? ?using? ?y 跟在interrupt? ?后面的xx? ?值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 外部中断0? ? 1? ?定时器0 2? ?外部中断1 3? ?定时器1 4? ?串行中断 实际上编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址 using? ?y? ?这个y是说这个中断函数使用的那个寄存器组,51里面一般有4组? ?r0? ?--? ?r7寄存器,一共有32个,看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用FFFF减去它的绝对值一样中断的理解。单片机的主程序是从0x0000开始运行的,单片机服务程序从哪里开始运行呢?在51里,有多个中断服务程序入口,0号入口是外中断0,地址在0x0003;1号入口是定时器0,在 0x000B;2号入口是外中断1;地址在0x0013,3号入口是定时器2;地址在0x001B,等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。在C51中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。请看一下相关的51的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以做完试验再了解,因为例程中都已经为您设置好了。