Zirok大大:
開于于第52帖提到的可能錯誤,終於有時間翻查了 manual 。確定會導致錯誤了。 http://www.atmel.com/dyn/resources/prod_documents/DOC4316.PDF (用搜尋找 timer 0 的段落)
你看這個:
2.11.5 Interrupt
Each timer handles one interrupt source; that is the timer overflow flag TF0 or TF1. This
flag is set every time an overflow occurs. Flags are cleared when vectoring to the timer
interrupt routine.
它說當 timer0 溢位(overflow) 時,TF0=1。 程序流程 導向 中斷程序(timer interrupt routine)時,會清空 TF0 的旗標,即 TF0=0。
按這順序
PWM_WIDTH:
MOV COUNT,@R0
LOOP1:
SETB TR0 ; 開啟T0計數器
JNB TF0,$
CLR TR0 ;關閉T0計數器
當開始計時後發生溢位,程序流程 會先指向 中斷程序, 並清空 TF0 的旗標,即 TF0=0。當返回下句時 JNB TF0,$
,它可能永遠也測不到溢位的,做成無限循環。程式其它部份若是用以上的寫法皆有問題,你要更改啊!!