Re: [問題] 89S51 使用 C51 計時問題

作者: WolfLord (呆呆小狼￾ ￾ N￾ ￾ )   2014-06-07 22:41:15
※ 引述《a45601236qq (Ming)》之銘言:
: 今天試著做一下模擬 ms 計算的(高階語言 sleep 都喜歡以 1ms * n 為單位)
你沒說明你的環境, 假設這邊是使用12MHZ時鐘,一個M週期是1uS
: void timer1_isr() interrupt 3
: {
: TL1 = ( 65536 - 1000 ) % 256;
: TH1 = ( 65536 - 1000 ) / 256;
: Timer1Ms -= 1;
: if (Timer1Ms == 0)
: {
: Timer1Ms = Timer1Value;
: P1_2 = ~(P1_2);
: }
: }
這段有點問題:你的中斷發生到跳進ISR需要兩個M週期,ISRVECT的JMP
指令也要兩個M。然後你沒使用BANK(using X)所以會PUSH A,F R0~R7
10組資料每一個PUSH都要兩個M 然後設定TH TL 要2*2個M,所以你額外
的計時週期為28個M,所以你的T1算式應當為 (65536-(1000-28))
下面我的計時系統程式為說明:
Header:
#ifndef CRYSTALFREQ
#ifndef _EM6T
#define CRYSTALFREQ 24000000
#else
#define CRYSTALFREQ 48000000
#endif
#endif
#ifndef INSFREQ
#define INSFREQ (CRYSTALFREQ/12)
#endif
#ifndef TIMERREQ
#define TIMERFREQ (CRYSTALFREQ/12)
#endif
#define __FREQBASE__ (65536-((TIMERFREQ/1000)-13))
#define __VTH (__FREQBASE__/256)
#define __VTL (__FREQBASE__%256)
#define _HSdv 9
#define _TSdv 9
#define _OSdv 9
/********************************************************************/
isr.c
unsigned char _hsc=_HSdv;
unsigned char _tsc=_TSdv;
unsigned char _osc=_OSdv;
bit _msf;
bit _hsf;
bit _tsf;
bit _osf;
/********************************************************************/
void _T0ISR(void) interrupt intT0 using 1{
TR0=0;
TH0=__VTH;
TL0=__VTL;
TR0=1;
_msf=1;
if(_hsc>0){_hsc
作者: a45601236qq (Ming)   2014-06-08 09:06:00
感謝<_ _)

Links booklink

Contact Us: admin [ a t ] ucptt.com