因此一共經(jīng)過(guò)了【(256-H-1)*256+256-L】=(65536-256H-L)次計(jì)數(shù)定時(shí)器請(qǐng)求中斷。也就是說(shuō)定時(shí)器中的16位寄存器的初值C=256H+L。
很明顯TH0中的初值H=C/256,而TL0中的初值L=C%256,這就推導(dǎo)出來(lái)了。
搞定了定時(shí)器初值的問(wèn)題,接下來(lái)就可以寫定時(shí)器中斷的代碼了。
中斷服務(wù)程序的寫法
C51的中斷函數(shù)格式如下:
void 函數(shù)名() interrupt 中斷號(hào) using 工作組
{中斷服務(wù)程序具體內(nèi)容}
中斷函數(shù)沒(méi)有返回值和參數(shù),函數(shù)名只要符合C語(yǔ)言標(biāo)準(zhǔn)就可以,中斷號(hào)是指單片機(jī)中的中斷源序號(hào),是編譯器識(shí)別不同中斷源的唯一憑證,using工作組是指這個(gè)中斷服務(wù)程序使用單片機(jī)內(nèi)存中4組工作寄存器的哪一組,由編譯器自動(dòng)分配,通常我們可以忽略不寫。
#include //包含頭文件
sbit led = P0^0;
unsigned char count = 0; //定時(shí)累計(jì)變量,我們需要1000ms定時(shí),50 * 20 = 1000
//count是全局變量,通俗地說(shuō)就是程序每次重新執(zhí)行時(shí)值保持住最近一次的值
//后續(xù)會(huì)專門講講C語(yǔ)言的一些基礎(chǔ)知識(shí)
void main()
{TMOD = 001; //設(shè)置定時(shí)器0工作方式1,16位計(jì)數(shù)
TH0 = (65536 - 45872) / 256; //晶振11.0592MHz,定時(shí)50ms時(shí)TH0初值
TL0 = (65536 - 45872) % 256; //晶振11.0592MHz,定時(shí)50ms時(shí)TL0初值
EA = 1; //開啟總中斷
ET0 = 1; //開啟定時(shí)器0中斷
TR0 = 1; //啟動(dòng)定時(shí)器0
while(1); //程序停止,等待定時(shí)器0中斷發(fā)生}
void T0_INT() interrupt 1 //大家對(duì)照著上述格式看看