全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3403
推到 Plurk!
推到 Facebook!

8051計時器 10ms中斷的疑問

答題得分者是:src
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-10 10:21:59 IP:61.221.xxx.xxx 訂閱
請問為什麼下面的init_timer0()函數也可以達到10ms中斷???
一般我們做中斷計時不是都要向下列這兩行的作法嗎???
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%6;
為什麼TMOD &= 0xD8; 也可以達到效果???
PS.震盪器12Mhz

void init_timer0()
{
TMOD &= 0xD8; //定時10毫秒 /* Timer 0 mode 1 with software gate */
TMOD |= 0xF0; /* GATE0=0; C/T0#=0; M10=0; M00=1; */
TH0 = 0xC0; /* init values */
TL0 = 0x00;
ET0=1; /* enable timer0 interrupt */
EA=1; /* enable interrupts */
TR0=1; /* timer0 run */
}
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-10 13:40:58 IP:61.216.xxx.xxx 訂閱

[code c#]
/*TMOD是用來設定計時模式,與計時無關
您的設定是錯誤的,結果TMOD=0XF0會使得TIMER0設定成模式0,
應將TIMER0設定成模式1且在中斷程式中TH0和TL0必須重新設定,
以下僅供參考
*/
#include "reg51.h"
void init_timer0()
{
TMOD |= 0x01; /* GATE0=0; C/T0#=0; T0=MOD1 */
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%6;
ET0=1; /* enable timer0 interrupt */
EA=1; /* enable interrupts */
TR0=1; /* timer0 run */
}
main(void)
{
init_timer0();
while (1);
}
void T0_int() interrupt 1
{
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%6;
}
[/code]

===================引 用 iii0628 文 章===================
請問為什麼下面的init_timer0()函數也可以達到10ms中斷???
一般我們做中斷計時不是都要向下列這兩行的作法嗎???
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%6;
為什麼TMOD &= 0xD8; 也可以達到效果???
PS.震盪器12Mhz

void init_timer0()
{
TMOD &= 0xD8; //定時10毫秒 /* Timer 0 mode 1 with software gate */
TMOD |= 0xF0; /* GATE0=0; C/T0#=0; M10=0; M00=1; */
TH0 = 0xC0; /* init values */
TL0 = 0x00;
ET0=1; /* enable timer0 interrupt */
EA=1; /* enable interrupts */
TR0=1; /* timer0 run */
}
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-10 14:41:49 IP:211.20.xxx.xxx 訂閱
感謝你的回應,原來我拿到的CODE有問題。我還誤以為真的這種做法......
系統時間:2024-04-24 14:30:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!