微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 电子时钟程序(51单片机)

电子时钟程序(51单片机)

时间:10-02 整理:3721RD 点击:
这程序有两个问题我解决不了,求大神帮助。第一:计时不精确,跑16个小时,快了五分钟,可是我用的是10ms的定时啊,跑100遍,为什么不准确;
第二:数码管有两根比较暗,改变display函数里面控制各管语句的顺序时,变暗的数码管也会改变位置,搞不懂
代码如下:#include<reg52.h>
unsigned char code Tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char temp,a,b,c,d,e,f,m,n,l,k,j,p;
unsigned long int t;
void delay(unsigned int z )

{
    unsigned char j;
while(z--)
{
   for(j=0;j<30;j++)
     { ; }
}
}

void display(unsigned long int t)
{  
   
     a=t%10;
    b=t%100000%10000%1000%100/10;
c=t%100000%10000%1000/100;
d=t%100000%10000/1000;
e=t%100000/10000;
f=t/100000;
     P0=Tab[10];
P2=0xdb;
delay(1);
     P0=Tab[t/100000];
   P2=0xfe;
   delay(1);
   
    P0=Tab[t%100000/10000];
    P2=0xfd;
    delay(1);
   
    P0=Tab[t%100000%10000/1000];
    P2=0xf7;
   delay(1);
P0=Tab[t%10];
    P2=0x7f;
   delay(1);
   
P0=Tab[t%100000%10000%1000%100/10];
    P2=0xbf;
    delay(1);
   P0=Tab[t%100000%10000%1000/100];
    P2=0xef;
   delay(1);
  
  

   

}
void init()
{   t=0;
   
   
temp=0;
EA=1;                  //开总中断
ET0=1;                 //定时器T0中断允许         
TMOD=0x01;             //使用定时器T0的模式1
TH0=(65536-9216)/256; //定时器T0的高8位赋初值
TL0=(65536-9216)%256; //定时器T0的高8位赋初值
    TR0=1;                //启动定时器T0
   
         
}
void Time0(void) interrupt 1  //“interrupt”声明函数为中断服务函数
                 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
  TH0=(65536-9216)/256; //定时器T0的高8位重新赋初值
  TL0=(65536-9216)%256; //定时器T0的高8位重新赋初值
  temp++;
   
  if(temp==10)
  {
  temp=0;
   if(b==5&&a==9)
   {
   
   t+=41;
    }
   else if(d==5&&c==9)
    {
  t+=4100;
    }
   else if(f==2&&e==4)
     {
    e=0;
    f=0;
  }
       else  t=t+1;
      }     

}
void main()
{
   init();
   while(1)
    {
   display(t);
}
}

你那9216是啥啊?那是10ms吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top