作者WolfLord (呆呆小狼)
看板ASM
标题Re: [问题] 89S51 使用 C51 计时问题
时间Sat Jun 7 22:41:15 2014
※ 引述《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--;}else{
_hsc=_HSdv;
_hsf=1;
if(_tsc>0){_tsc--;}else{
_tsc=_TSdv;_tsf=1;
if(_osc>0){_osc--;}else{
_osc=_OSdv;_osf=1;
}
}
}
TF0=0;
}
/********************************************************************/
这里因为使用Bank1 所以少了8个PUSH16个周期但是我多了一个把TIMER暂停
28-16+1=13 所以overhead 为13个M 算数式为(65536-((TIMERFREQ/1000)-13))
因为第零LEAP会被用来重至资料所以他也占用时间,所以计数器均从9倒数。
--
剑兮,剑兮,食无鱼,行无车,无以家养,不如归去不如归去~~ ▁▁
-= A23203 =- ▕武罗▏
BM4GRM Harlock WolfLord ▕夫得▏
 ̄ ̄
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.230.90.132
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/ASM/M.1402152081.A.BF0.html
※ 编辑: WolfLord (125.230.90.132), 06/07/2014 22:43:52
1F:推 a45601236qq:感谢<_ _) 06/08 09:06