采用内部定时做的简单炫彩电子表(定时不精准原因?)

2019-07-16 04:20发布

本帖最后由 liangyuhc 于 2012-10-15 12:06 编辑

显示效果
显示效果

显示效果

自己做的一个彩 {MOD}led显示器

自己做的一个彩 {MOD}led显示器

IMG_20121009_081003.jpg
焊接的很难看,很不好意思
背面焊接,太难看,实在是不好意思
#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit LE1=P3^0;
sbit LE2=P3^1;
sbit LE3=P3^2;
sbit K1=P3^3;
sbit K2=P3^4;
sbit K3=P3^5;
sbit K4=P3^5;
sbit W0=P1^0;
sbit W1=P1^1;
sbit W2=P1^2;
sbit W3=P1^3;
sbit W4=P1^4;
sbit W5=P1^5;
/*函数声明*************************************************************/
void s_jian_z();
void xian_s();
void delay_xms(uint);
void key_scan();
void chu_s();
/********************************************************************/
uchar code dH_ma[]={0xdf,0x99,0xef,0x6f,0x7d,0x3f,0xbf,0x47,0xff,0x7f};
uchar code dL_ma[]={0xf8,0x20,0xb8,0xf8,0xc8,0xf8,0xf8,0xc8,0xf8,0xf8};
uchar num=00;f_num=00;s_num=00;
uchar num0;
uchar m_shi,m_ge,f_shi,f_ge,s_shi,s_ge;
uint s_f_k1=0;
uint s_f_k2=0;
/*初始化函数*********************************************************/
void chu_s()
{
TMOD=0x10;
EA=1;
ET1=1;
TR1=1;
}
/*延时函数*************************************************************/
void delay_xms(uint xms)
{   uchar i,j;
   for(i=xms;i>0;i--)
      for(j=110;j>0;j--);
}
/*键盘扫描函数*********************************************************/
void key_scan()
{   
   if(K1==0&&s_f_k1==2)    //按下三次k1时间设定完成
       {
      delay_xms(2);
        if(K1==0)
       s_f_k1=0;
    while (!K1);
    }
  if(K1==0&&s_f_k1==1)
    {
   delay_xms(2);
     if(K1==0)
    s_f_k1=2;     //表示k1按下两次 ,可以改变时间的分钟设定新值      
  while(!K1);  
}

if(K1==0)
    {
   delay_xms(2);
     if(K1==0)
    s_f_k1=1;     //表示k1按下一次 ,可以改变时间的小时设定新值     
  while(!K1);  
}
   
   if(s_f_k1==1)  
     {
  if(K2==0)      //表示k1按下之后,按下k2,小时加1
       {
      delay_xms(2);
        if(K2==0)
         {
      s_num++;
         if(s_num==24)
          s_num=0;
    }   
             while(!K2);
        }

      else if (K3==0)   //表示按下k1之后,按下k3,小时减1
      {
            delay_xms(2);
             if(K3==0)
          {
            if(s_num==0)
            s_num=24;
      s_num--;
     }
   
  while(!K3);
      }
      }
   if(s_f_k1==2)
    if(K2==0)     //表示按下k1两次,按下k2分钟加1
       {
      delay_xms(2);
       if(K2==0)
     {
       f_num++;
        if(f_num==60)
         f_num=0;
      while(!K2);
   
      }
     }
      else if (K3==0)    //表示k1按下两次,这次按下k3分钟减1
      {
            delay_xms(2);
             if(K3==0)
          {
      
         if(f_num==0)
           f_num=60;
     f_num--;
     
         while(!K3);
      }
      }

}
/*时间附值函数*********************************************************/
void s_jian_z()
{
if(num0==20)//定时20ms
      {
    num0=0;
       num++;
    }
      if(num==60)
       {
    num=0;
     f_num++;
     }
     if(f_num==60)
       {
      f_num=0;
      s_num++;
      }
      if(s_num==24)
        s_num=0;
}
/*键盘扫描函数*********************************************************/
/*扫描显示函数**********************************************************/
void xian_s( )      
{   
s_jian_z();
m_shi  = num/10;
    m_ge   =num%10;
f_shi  =f_num/10;
f_ge   =f_num%10;
s_shi  =s_num/10;
s_ge   =s_num%10;

/**小时十位的显示************************************************/  
LE3=1;LE2=1;LE1=1;
W0=0;
P0=dH_ma[s_shi];
P2=dL_ma[s_shi];   
delay_xms(5);
P0=0x00;
P2=0x00;
W0=1;

/***小时个位的显示***************************************************/   
   
    W1=0;
P0=dH_ma[s_ge];
P2=dL_ma[s_ge];   
delay_xms(5);
P0=0x00;
P2=0x00;
W1=1;
/***分钟十位显示******************/
W2=0;
P0=dH_ma[f_shi];
P2=dL_ma[f_shi];   
delay_xms(5);
P0=0x00;
P2=0x00;
W2=1;
/**分钟个位显示****************/
     W3=0;
P0=dH_ma[f_ge];
P2=dL_ma[f_ge];   
delay_xms(5);
P0=0x00;
P2=0x00;
W3=1;
/**秒钟十位显示******/
    W4=0;
P0=dH_ma[m_shi];
P2=dL_ma[m_shi];   
delay_xms(5);
P0=0x00;
P2=0x00;
W4=1;
/*秒钟个位显示*/
  
    W5=0;
P0=dH_ma[m_ge];
P2=dL_ma[m_ge];   
delay_xms(5);
P0=0x00;
P2=0x00;
W5=1;

}
/****主函数*******************************************************/
void main()
{
   s_jian_z();
   chu_s();
   while(1)
   {
key_scan();   //检测键盘
   if(!s_f_k1)   //当调节时间的时候数码管处于闪烁状态
      xian_s();   //显示内容
   

else
   while(1)
   {
  
    xian_s();   //显示内容
    delay_xms(200);
    delay_xms(200);
    delay_xms(200);
    delay_xms(200);
    delay_xms(200);
    delay_xms(200);
    delay_xms(200);
    delay_xms(200);

  
   
    break;
  }
   xian_s();
   }
}
/*中断函数******************************************************/
void T1_time() interrupt 3
{
   TH1=0x3c;
   TL1=0xb0;
      num0++;
}
原理图被我弄丢了,实在不好意思。

现在是采用单片机内部定时,使用中断方式定时,但是出现走时不精准,请问各位大侠这是由于什么原因呢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。