|
平時經常遇到關于單片機定時器中斷的帖子,總有人喜歡在中斷里面做一大堆操作。今天把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();
}
|
-
aa.jpg
(144.99 KB, 下載次數: 63)
下載附件
2021-5-27 20:34 上傳
|