|
問(wèn)題主要出在定時(shí)器0那里,里面所有定時(shí)操作都不準(zhǔn)確。我定時(shí)器賦的初值是為50ms準(zhǔn)備的,我想要定時(shí)500ms,按理說(shuō)進(jìn)入定時(shí)器中斷10次就可以定500ms了,可是實(shí)際我燒錄后,速度非?,軟件調(diào)試發(fā)現(xiàn)根本不到500ms,只能把判斷條件改到進(jìn)入定時(shí)器中斷74次,調(diào)試才500ms...希望有知道的大佬解答一下。
以下是單片機(jī)代碼
#include <REGX52.H>
#include <intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
#define SMG_A_DP_PORT P0
#define LED_PORT P2
u8 gsmg_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x76,0x79,0x38,0x38,0x3f,0x40};
u16 NUM=432;
u8 bai,shi,ge,aa,bb,cc,t,times,flag,flag1;
void delay(u16 x)
{
u16 y,z;
for(y=0;y<x;y++)
for(z=0;z<115;z++);
}
void smg_display()
{
u8 i;
if(flag1==1)
{
cc=10;bb=11;aa=12;bai=13;shi=14;ge=15;
}
else
{
cc=7;bb=6;aa=5;
}
for(i=0;i<6;i++)
{
switch(i)
{
case(0):LSA=0;LSB=0;LSC=0;SMG_A_DP_PORT=gsmg_code[ge];delay(1);break;
case(1):LSA=1;LSB=0;LSC=0;SMG_A_DP_PORT=gsmg_code[shi];delay(1);break;
case(2):LSA=0;LSB=1;LSC=0;SMG_A_DP_PORT=gsmg_code[bai];delay(1);break;
case(3):LSA=1;LSB=1;LSC=0;SMG_A_DP_PORT=gsmg_code[aa];delay(1);break;
case(4):LSA=0;LSB=0;LSC=1;SMG_A_DP_PORT=gsmg_code[bb];delay(1);break;
case(5):LSA=1;LSB=0;LSC=1;SMG_A_DP_PORT=gsmg_code[cc];delay(1);break;
}
P0=0x00;
}
}
void timer0_init()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void timer1_init()
{
TMOD=0x10;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
EA=1;
ET1=1;
TR1=1;
}
void main()
{
timer0_init();
timer1_init();
while(1)
{
smg_display();
}
}
void timer0() interrupt 1
{
u8 i,u;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
t++;
if(flag!=1)//控制LED流水燈
{
if(t==74)//要定時(shí)0.5秒,可是正確的數(shù)字無(wú)法達(dá)到...
{
t=0;
if(i<8)
{
LED_PORT=_crol_(0xfe,i);
i++;
}
if(i>7)
{
LED_PORT=_cror_(0x7f,u);
u++;
}
if(u==7)
{
i=0;
u=0;
}
}
}
else//控制LED閃爍
{
if(t%20==0)
{
LED_PORT=0x00;
delay(500);
LED_PORT=0xff;
}
if(t==60)
{
TR0=0;//關(guān)閉定時(shí)器0
LED_PORT=0xff;
flag1=1;//控制顯示字母
}
}
}
void timer1() interrupt 3
{
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
times++;
if(times==2)
{
times=0;
NUM--;
bai=NUM/100;
shi=NUM/100/10;
ge=NUM%10;
}
if(NUM==398)//NUM=398時(shí),流水燈停止
{
TR0=0;
LED_PORT=0xff;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
t=0;
TR0=1;//再次打開(kāi)定時(shí)器0
flag=1;//定時(shí)器0 else條件成立,LED閃爍
TR1=0;//關(guān)閉定時(shí)器1保持字母數(shù)據(jù)顯示
}
}
|
|