|
平时经常遇到关于单片机定时器中断的帖子,总有人喜欢在中断里面做一大堆操作。今天把STC15W4K的5个定时器中断全开,然后在中断入口放了Delay函数,发现一个特别奇怪的现象。 对应12864的显示,下面的代码屏幕显示正常,T2、T3、T4都是准确的,但是T0、T1是什么原因会慢的呢?请大佬们不吝赐教!!!
#include "SysDefine.h"
#include "Peripheral.h"
#include "Lcd.h"
/*******************************************************************************
*
* 程序类别 : IAP15W4K61S4定时中断测试
* 芯片时钟 : 22.1184MHz
* 人机界面 : LCD12864
*
//------------------------------------------------------------------*/
unsigned int T0Sign = 0;
unsigned int T0Flag = 0;
unsigned int T1Sign = 0;
unsigned int T1Flag = 0;
unsigned int T2Sign = 0;
unsigned int T2Flag = 0;
unsigned int T3Sign = 0;
unsigned int T3Flag = 0;
unsigned int T4Sign = 0;
unsigned int T4Flag = 0;
void Timer0Init(void) //1毫秒@22.1184MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //5毫秒@22.1184MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0xDC; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
}
void Timer2Init(void) //10毫秒@22.1184MHz
{
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0x00; //设置定时初值
T2H = 0xB8; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
}
void Timer3Init(void) //20毫秒@22.1184MHz
{
T4T3M &= 0xFD; //定时器时钟12T模式
T3L = 0x00; //设置定时初值
T3H = 0x70; //设置定时初值
T4T3M |= 0x08; //定时器3开始计时
}
void Timer4Init(void) //20毫秒@22.1184MHz
{
T4T3M &= 0xDF; //定时器时钟12T模式
T4L = 0x00; //设置定时初值
T4H = 0x70; //设置定时初值
T4T3M |= 0x80; //定时器4开始计时
}
void Delay4ms() //@22.1184MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 87;
j = 12;
do
{
while (--j);
} while (--i);
}
void Delay15ms() //@22.1184MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 2;
j = 67;
k = 183;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay30ms() //@22.1184MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 3;
j = 134;
k = 115;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main(void)
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M1 = 0x00;
P1M0 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
LCD_Init();
Timer0Init();
Timer1Init();
Timer2Init();
Timer3Init();
Timer4Init();
ET0 = 1;
ET1 = 1;
IE2 |= 0x64; //开定时器2中断
//IE2 |= 0x20; //开定时器3中断
//IE2 |= 0x40; //开定时器4中断
EA = 1;
while(1)
{
LCD_TextOut(80,0,DOT12,0,0,"T0:");
LCD_TextOut(80,12,DOT12,0,0,"T1:");
LCD_TextOut(80,24,DOT12,0,0,"T2:");
LCD_TextOut(80,36,DOT12,0,0,"T3:");
LCD_TextOut(80,48,DOT12,0,0,"T4:");
LCD_DisplayData(100,0,T0Flag);
LCD_DisplayData(100,12,T1Flag);
LCD_DisplayData(100,24,T2Flag);
LCD_DisplayData(100,36,T3Flag);
LCD_DisplayData(100,48,T4Flag);
} //end while(1)
} //end main
void tm0_isr() interrupt 1 //中断入口
{
T0Sign++;
if(T0Sign%1000==0)
{
T0Sign = 0;
T0Flag++;
}
}
void t1int() interrupt 3 //中断入口
{
T1Sign++;
if(T1Sign%200==0)
{
T1Sign = 0;
T1Flag++;
}
//Delay4ms();
}
void t2int() interrupt 12 //中断入口
{
T2Sign++;
if(T2Sign%100==0)
{
T2Sign = 0;
T2Flag++;
}
//Delay4ms();
}
void t3int() interrupt 19 //中断入口
{
T3Sign++;
if(T3Sign%50==0)
{
T3Sign = 0;
T3Flag++;
}
//Delay15ms();
}
void t4int() interrupt 20 //中断入口
{
T4Sign++;
if(T4Sign%50==0)
{
T4Sign = 0;
T4Flag++;
}
Delay15ms();
//Delay30ms();
}
|
|