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的硬體的書,對定時器工作的寄存器設定做進一步的了解。也可以做完試驗再了解,因為例程中都已經為您設定好了。