微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新人求助,关于一个数字时钟

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

时间:10-02 整理:3721RD 点击:

#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);


   } 基于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;


   }


  }  


}


这个程序本是没有用锁存器的,完全可以正常工作,但是当我加上那点锁存器的程序就不行了,


file:///C:/Users/Administrator/Desktop/QQ截图20150424225851.png

没图,具体目的没说清,程序是根据硬件写的,硬件不一样,程序很可能就不一样

怎么发图啊,我不会啊

这个就是用了锁存器的图


数字时钟是用数码管?锁存74hc573?


没有对的。

简单时钟,第一个按键选择调整时间,第二三四个就是调整时分秒的

没错,是这样的

没错,是这样的

程序看的很纠结。能不能再仔细注释下,看的醉了。仿真的话确实有时候不正常,以实物为准

算了,我干脆就用三极管驱动得了

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

for (k=1;k<=6;k++)
   {
       P0=sz[a[k]];
     dula=1;
     dula=0;
      P2=xw[k];
      wela=1;
     wela=0;

     ys(3);
   }

for (k=1;k<=6;k++)
   {
      P0 = 0xFF;
       P0=sz[a[k]];
     dula=1;
     dula=0;
      P2=xw[k];
      wela=1;
     wela=0;

     ys(3);
   }
试试!

这个方法还是不行啊,我之前已经做好用NPN驱动的了,打算焊这个麻烦一点的电路了

这个方法还是不行啊,我之前已经做好用NPN驱动的了,打算焊这个麻烦一点的电路了

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

网站地图

Top