|
感覺進入中斷時間沒問題,但數(shù)碼管閃爍過快,代碼如下
#include <reg52.h>
sbit BEEP = P1^5; //跟中斷無關
bit flagls = 0;
unsigned char Ledbuf;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char code LedChar[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void ConfigTimer0(unsigned int ms) //配置T0
{
unsigned long tmp;
tmp = 11059200/12;
tmp = (tmp*ms)/1000;
tmp = 65536 - tmp;
T0RH = (unsigned char)(tmp >> 8);
T0RL = (unsigned char)tmp;
TMOD &= 0xf0;
TMOD |= 0x01;
TH0=T0RH;
TL0=T0RL;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void LedScan() //在中斷中使用,每進中斷掃描一次
{
P0 = 0x00;
P2 = (P2&0xe3);
P0 = Ledbuf;
}
void main()
{
unsigned int i = 0;
unsigned int sec = 0;
ConfigTimer0(1); //設置定時器1ms
for(i = 0; i < 50000; i++)
{
BEEP = ~BEEP;
}
while(1)
{
if(flagls == 1)
{
flagls = 0;
sec++; //每次進入sec加1
Ledbuf = LedChar[9 - sec%10];
}
}
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s = 0;
TH0=T0RH; //設置斷點看進入時間 第一次0.00266602s,第二次 0.00367405, 相差0.001s左右,進入正常
TL0=T0RL;
tmr1s++;
if(tmr1s >= 1000); //1s時改變flagls
{
tmr1s = 0;
flagls = 1;
}
LedScan();
}
|
|