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