從上圖可以看到,GATE先經(jīng)過非門,再和INT0引腳作為或門的輸入。這里簡單提一下數(shù)字電路中的與門、或門和非門。顧名思義,與門當且僅當所有輸入都位高電平時輸出才是高電平,或門只要有其中之一輸入是高電平則輸出就是高電平,非門的輸出電平狀態(tài)剛好和輸入電平狀態(tài)相反。因此從定時器0方式1的邏輯結(jié)構(gòu)圖中,當GATE=0,且TR0=1時,TL0低8位寄存器便在機器周期的作用下開始加1計數(shù)。當TL0計滿之后向TH0進位,直到TH0也計滿,此時再來一個計數(shù),計數(shù)器便溢出TF0置1,發(fā)出定時器0中斷申請。
在清楚定時器的工作方式之后,重點就是如何讓定時器定時我們想要的時間呢?這就涉及到定時器的初值問題。定時器一旦啟動,便在TL0和TH0原來的基礎(chǔ)上開始每隔一個機器周期加1操作直到溢出。假設(shè)在程序開始執(zhí)行時TL0和TH0的初值都是0,單片機的晶振是12MHz,那么該單片機的機器周期就是1us,計滿TL0和TH0一共需要(2的16次方減1=65535)個數(shù),再來一個加1就溢出。也就是說定時器最多可以定時的時間是65536us(65.536ms),可想而知如果我們需要定時器能夠定時50ms的話,那么TL0和TH0必須有一定的初值。通俗的理解就是定時器的16位計數(shù)器是個水桶,這個水桶最多能夠倒?jié)M65.536斤水,而我們只需要往水桶里到50斤水就把水桶倒?jié)M,這個時候水桶里必須要有15.536斤水,這就是初值。
這里我們就正式開始如何確定定時器的初值,我們要讓定時器定時50ms就產(chǎn)生一次中斷,這個時候TL0和TH0裝入的總數(shù)就是65536-50000=15536,把15536對256取模:15536/256=60裝入TH0中,把15536對256求余:15536%256=176裝入TL0中。這樣就得到我們想要的初值了。