求各位高手看看,我用单片机做了个时钟,不过时间却越跑越慢,这究竟是怎么回事?哪里出错了???

2024-12-21 14:41:19
推荐回答(5个)
回答1:

#include
#include
int shi1,shi2,fen1,fen2,miao1,miao2,d,n;
unsigned char code display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit L1=P3^2; //调分
sbit L2=P3^3; //调时
a=b=c=0;
g=3; //延时值
void delay(int z) //延时程序
{
int x, y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void xianshi() //显示程序
{
shi1=a/10;
shi2=a%10;
fen1=b/10;
fen2=b%10;
miao1=c/10;
miao2=c%10;
P2=0x00; //位选
P0=display[miao2]; //显示
delay(g); //延时
P2=0x04;
P0=display[miao1];
delay(g);
P2=0x08;
P0=0x40;
delay(g);
P2=0x0c;
P0=display[fen2];
delay(g);
P2=0x10;
P0=display[fen1];
delay(g);
P2=0x14;
P0=0x40;
delay(g);
P2=0x18;
P0=display[shi2];
delay(g);
P2=0x1c;
P0=display[shi1];
delay(g);
}
void cal() //时钟自加程序
{
if(d==20)
{
c++;
d=0;
if(c>=60) //秒钟数值
{
b++;
c=0;
if(b>=60) //分钟数值
{
a++;
b=0;
if(a>=24) //时钟数值
{
a=0;
}
}
}
}
xianshi();
}
void tiaojie() //时间数值按键调节程序
{
if(L1==0)
{
delay(10);
if(L1==0)
{
a++;
if(a>=23)
{
a=0;
}
}
}
if(L2==0)
{
delay(10);
if(L2==0)
{
b++;
if(b>=59)
{
b=0;
}
}
}
}
void main() //主程序
{
P0=0xff;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=1;
EA=1;
while(1)
{
tiaojie();
cal();
}
}
void int0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
++d;
}

回答2:

大家的回答不到位啊

#include
#include 
#define g 3     //延时值

int shi1,shi2,fen1,fen2,miao1,miao2,d,n;
unsigned char code display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit L1=P3^2;   //调分
sbit L2=P3^3;  //调时


unsigned char cnt50ms=0,cnt1s=0;

int a=0,b=0,c=0;  
void delay(int z)    //延时程序
{
  int x, y;
  for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void xianshi()    //显示程序
{
  shi1=a/10;
  shi2=a%10;
  fen1=b/10;
  fen2=b%10;
  miao1=c/10;
  miao2=c%10;
  P2=0x00;      //位选
  P0=display[miao2];  //显示
  delay(g);   //延时
  P2=0x04;
  P0=display[miao1];
  delay(g);
  P2=0x08;
  P0=0x40;
  delay(g);
  P2=0x0c;
  P0=display[fen2];
  delay(g);
  P2=0x10;
  P0=display[fen1];
  delay(g);
  P2=0x14;
  P0=0x40;
  delay(g);
  P2=0x18;
  P0=display[shi2];
  delay(g);
  P2=0x1c;
  P0=display[shi1];
  delay(g);
}
void cal()    //时钟自加程序
{
   if(d==20)  
   {
      c++;
      d=0;
      if(c>=60)    //秒钟数值
      {
         b++;
         c=0;
         if(b>=60)    //分钟数值
         {
            a++;
            b=0;
            if(a>=24)   //时钟数值
            {
               a=0;
            }
         }
      }
   }
   xianshi();
}

void tiaojie()    //时间数值按键调节程序
{
   if(L1==0)
   {
      delay(10);
      if(L1==0)
      {
         if(++a>23)
         {
            a=0;
         }            
         while(L1==0);         
         delay(10);
      } 
   }      
   if(L2==0)
   {
      delay(10);
      if(L2==0)
      {
         if(++b>59)
         {
            b=0;
         } 
         while(L2==0);      
         delay(10);
      }      
   }
}

void main()    //主程序
{
  P0=0xff;
  TMOD=0x02;   //定时器2
  TH0=0x06;    //定时250us
  TL0=0x06;
  ET0=1;
  TR0=1;
  EA=1;
  while(1)
  {
    PCON=0x1;
  }
}
void timer0(void) interrupt 1       //定时器0的中断号是1
{                                   //定时器1的中断号是3
   if(++cnt50ms>=200)//50ms定时到
   {
        cnt50ms=0;
        d++;
        cal();    //时钟自加程序
   } 
   tiaojie();         
}

回答3:

哈哈,这个错误挺低级的,嘿嘿!不是笑话你哦,初学者一般都会犯这样的错误。不严谨啊,慢慢来,不要紧的。问题越多,学的也越多。加油!

回答4:

您的中断服务程序忘记重新初始化T0了,相当于初始化到0, 当然会变慢。
改为这样既可
void int0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
++d;
tiaojie();
}

回答5:

电路图可以给我吗。。。