新人求助,关于一个数字时钟

2019-07-15 17:28发布

#include <reg51.h>
#define uint unsigned int        //宏定义
#define uchar unsigned char       //宏定义
uchar i=0,j=0,k=0, s=0,f=0,m=0,lbbz=0,a[7];  //定义变量
sbit tz=P3^0;             //位定义
sbit sz1=P3^1;            //位定义
sbit fz1 =P3^2;            //位定义
sbit mz1 =P3^3;            //位定义
sbit ss =P3^4;            //位定义
sbit lb =P3^5;             //位定义
sbit dula=P1^6;sbit wela=P1^7;

uchar code sz[]={0x3f,0x06,0xdb,0x4f,         //数字编码表
     0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71} ;
uchar code  xw[]={ 0xff,0xfe,0xfd,0xfb,0xf7,  //选位编码表
      0xef,0xdf,0xbf,0x7f        
     };
void  pf()                  //区分出个位和十位
{
  a[1]=s/10;
  a[2]=s%10;
  a[3]=f/10;
  a[4]=f%10;
  a[5]=m/10;
  a[6]=m%10;
}
void  ys ( int d )               //延时函数
{
int b ,c ;
for (b = d;b>0;b--)
  for (c=110;c>0;c--) ;
}
void   xs()               //显视函数
{
  pf() ;
   for (k=1;k<=6;k++)
   {
       P0=sz[a[k]];     dula=1;     dula=0;
      P2=xw[k];       wela=1;     wela=0;

     ys(3);
   } 基于times New Roman">C语言的51单片机可调数字钟的设计
   }
void dczd() interrupt 1        //定时中断
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
i++;
if (i==4)
{  
  ss=1;
  if (lbbz==1)
  {
   lbbz=0;
   lb=0;
  }
}
if (i==20)
  {
   i=0;
   ss=0;
   m++;
   if (m==60)
   {
    m=0;
    f++;
    if (f==60)
    {
     f=0;
     s++;
     lbbz=1;
     if (s==24)
      s=0;
    }   
   }
  }
}
void  cs()                   //初始函数
{
TMOD=0x01;           //设置为定时工作方式
TH0=(65535-50000)/256;      //定时器装初值
TL0=(65535-50000)%256;      //定时器装初值
EA=1;             //打开总中断
ET0=1;             //打开定时中断
TR0=1;             //起用定时器
P3=0X0f; 基于C语言的51单片机可调数字钟的设计
   }
void  main   ()
{
   cs();  
   lb=0;      
while (1)
  {
   xs();
   if (lbbz==1)
    lb=~lb;
   if( tz==0)
    {
     j++;
     while  (!tz)  ;
     TR0=0;
      while (j>0)
       {
        xs();
       if( tz==0)
         {
          ys(5);
          if( tz==0)
           j=0;
           while  (!tz);
         }
        if( sz1==0)
        {
         ys(5);
         if( sz1==0)
         {
          while  (!sz1);
          s++;
          if (s==24)
          s=0;
         }
        }
         if( fz1==0)
        {
         ys(5);
         if( fz1==0)
         {
          while  (!fz1);
          f++;
          if (f==60) 基于C语言的51单片机可调数字钟的设计
           f=0;
         }
        }
         if( mz1==0)
        {
         ys(5);
         if( mz1==0)
         {
          while  (!mz1);
          m++;
          if (m==60)
          m=0;
         }
        }
         }
   if (j==0)  
    TR0=1;
   }
  }  
}
这个程序本是没有用锁存器的,完全可以正常工作,但是当我加上那点锁存器的程序就不行了,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
十分煮鱼
1楼-- · 2019-07-16 20:50
苍梧叶落 发表于 2015-4-24 23:27
没图,具体目的没说清,程序是根据硬件写的,硬件不一样,程序很可能就不一样 ...

简单时钟,第一个按键选择调整时间,第二三四个就是调整时分秒的
十分煮鱼
2楼-- · 2019-07-17 01:51
苍梧叶落 发表于 2015-4-24 23:36
数字时钟是用数码管?锁存74hc573?

没错,是这样的
十分煮鱼
3楼-- · 2019-07-17 04:49
 精彩回答 2  元偷偷看……
苍梧叶落
4楼-- · 2019-07-17 06:32
程序看的很纠结。。。能不能再仔细注释下,看的醉了。。。仿真的话确实有时候不正常,以实物为准
十分煮鱼
5楼-- · 2019-07-17 08:03
苍梧叶落 发表于 2015-4-24 23:51
程序看的很纠结。。。能不能再仔细注释下,看的醉了。。。仿真的话确实有时候不正常,以实物为准 ...

算了,我干脆就用三极管驱动得了
十分煮鱼
6楼-- · 2019-07-17 12:04
苍梧叶落 发表于 2015-4-24 23:51
程序看的很纠结。。。能不能再仔细注释下,看的醉了。。。仿真的话确实有时候不正常,以实物为准 ...

仿真里面出的问题是秒的个位变,十位也跟着变,但是都不是正确的码,类推,秒的十位变分的个位就变,但是当我把按键一直按下,显示就正常了,但是不是延时的问题

一周热门 更多>