找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4093|回复: 14
打印 上一主题 下一主题
收起左侧

为什么数字钟数码管显示不出时间

[复制链接]
跳转到指定楼层
楼主
ID:256724 发表于 2017-12-3 11:38 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
不知道怎不知道要怎么调 了 要交作业了 谢谢大家
//****************************头文件********************************
#include<reg51.h>            
#include<intrins.h>
//****************************宏定义********************************
#define uchar unsigned char   
#define uint  unsigned int
//****************************位声明********************************
sbit key1=P1^0;               
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit fmq=P2^1;   
//************************数码管显示的数值**************************
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
//                    0     1   2    3   4    5
                    0x82,0xf8,0x80,0x90,0xbf,0x0ff};
//                      6   7   8    9    -    灭                 
//****************************函数声明******************************
void jia();   
void jian();
//********************数组定义,数组内含有8个数值******************
uchar table1[8],table2[8],table3[8],table4[8];
//**************************时间显示初始值**************************
uchar shi=12,fen=0,miao=0;
//**************************定义全局变量****************************
uchar shi1,fen1,miao1,shi2,fen2,miao2,shi3,fen3,miao3;
uchar shi4,fen4,miao4;
uchar flag, flag1, wss, cnt, cnt1, alm1, alm2, alm3;
//    1秒  等时  位闪 次数 校时  闹1  闹2  闹3
uint flag2;
//  蜂鸣
//*********************延时函数,用于动态扫描数码管*****************
void delay(uchar i)                                   
{  uchar x,y;
  for(x=i;x>0;x--)
    for(y=120;y>0;y--);
}
//*******************************初始化函数*************************
void init()
{ TMOD=0x01;        //工作方式1                                               
  TH0=0x3c;          //定时时间为:50ms    (65536-50000)/256
  TL0=0x0b0;        //(65536-50000)%256
  ET0=1;            //打开定时器
  EA=1;              //开总中断
  TR0=1;            //启动定时器
}
//********************显示子函数,用于显示时间数值*****************
void display()
{  uchar i,j;
  if(cnt!=10||wss==0)
    { table1[0]=miao;        //分离秒的个位与十位
      table1[1]=miao/10;
      }
    else
    { table1[0]=table1[1]=11;}
    if(cnt!=11||wss==0)
    { table1[3]=fen;        //分离分的个位与十位
      table1[4]=fen/10;
      }
    else
    { table1[3]=table1[4]=11;}
    if(cnt!=12||wss==0)
    { table1[6]=shi;        //分离时的个位与十位
      table1[7]=shi/10;
      }
    else
    { table1[6]=table1[7]=11;}
  table1[2]=table1[5]=10;
  j=0xbf;
  for(i=0;i<=7;i++)          //从秒到时的扫描
    {  P3=j;
        P0=table[table1[i]];  //显示数值
        delay(10);
        j=_cror_(j,1);        //循环右移
      }
  }
  //*******************显示子函数,用于显示定时1时间*****************
void display1()
{  uchar i,j;
  if(alm1==0)
    { if(cnt!=1||wss==0)
        { table2[0]=miao1;        //以下含义同上
          table2[1]=miao1/10;
          }
      else
        { table2[0]=table2[1]=11;}
      if(cnt!=2||wss==0)
        { table2[3]=fen1;
          table2[4]=fen1/10;
          }
      else
        { table2[3]=table2[4]=11;}
      if(cnt!=3||wss==0)
        { table2[6]=shi1;
          table2[7]=shi1/10;
          }
      else
        { table2[6]=table2[7]=11;}
      }
    else
      table2[0]=table2[1]=table2[3]=table2[4]=table2[6]=table2[7]=10;
  table2[2]= table2[5]=10;
  j=0xbf;
  for(i=0;i<=7;i++)
    {  P3=j;
        P0=table[table2[i]];
        delay(10);
        j=_cror_(j,1);
      }
}
//********************显示子函数,用于显示定时2时间******************
void display2()
{  uchar i,j;
  if(alm2==0)
    { if(cnt!=4||wss==0)
        { table3[0]=miao2;        //以下含义同上
          table3[1]=miao2/10;
            }
      else
        { table3[0]=table3[1]=11;}
      if(cnt!=5||wss==0)
        { table3[3]=fen2;
          table3[4]=fen2/10;
          }
        else
        { table3[3]=table3[4]=11;}
        if(cnt!=6||wss==0)
        { table3[6]=shi2;
          table3[7]=shi2/10;
          }
        else
        { table3[6]=table3[7]=11;}
      }
    else
      table3[0]=table3[1]=table3[3]=table3[4]=table3[6]=table3[7]=10;
  table3[2]= table3[5]=10;
  j=0xbf;
  for(i=0;i<=7;i++)
    {  P3=j;
        P0=table[table3[i]];
        delay(10);
        j=_cror_(j,1);
      }
}
//***************显示子函数,用于显示定时3时间数值****************//
void display3()
{  uchar i,j;
  if(alm3==0)
    {  if(cnt!=7||wss==0)
          { table4[0]=miao3;        //分离秒的个位与十位
            table4[1]=miao3/10;
            }
        else
          { table4[0]=table4[1]=11;}
        if(cnt!=8||wss==0)
          { table4[3]=fen3;        //分离分的个位与十位
            table4[4]=fen3/10;
            }
        else
          {    table4[3]=table4[4]=11;}
        if(cnt!=9||wss==0)
          { table4[6]=shi3;        //分离时的个位与十位
            table4[7]=shi3/10;
            }
        else
          {    table4[6]=table4[7]=11;}
        }
    else
        table4[0]=table4[1]=table4[3]=table4[4]=table4[6]=table4[7]=10;
  table4[2]= table4[5]=10;
  j=0xbf;                    //从秒到时的扫描
  for(i=0;i<=7;i++)
    {  P3=j;
        P0=table[table4[i]];  //显示数值
        delay(10);
        j=_cror_(j,1);        //循环右移
      }
  }
//***********************时间子函数 *****************************//
void shijian()         
{  if(flag>=20)              //判断是否到一秒
    { wss=~wss;
      flag=0;                    //到了,则标志位清零
      if(cnt1!=0)
          { miao4++;          //秒加1
            if( miao4>59)    //判断秒是否到60s
              { miao4=0;      //到了,则清零
                fen4++;      //分加1
                if(fen4>59)  //以下含义同上
                  { fen4=0;
                    shi4++;
                    if(shi4>23)
                      shi4=0;                                                         
                  }   
                }
            }
      else
      { miao++;          //秒加1
        if( miao>59)    //判断秒是否到60s
          { miao=0;      //到了,则清零
            fen++;      //分加1
            if(fen>59)  //以下含义同上
              { fen=0;
                shi++;
                if(shi>23)
                  shi=0;                                                         
                }   
            }
          }
      }
  }
//**************************键盘扫描子函数************************//
void key_scan()
{  if(key1==0)
    {  while(!key1)          //防止掉显
          {  if(cnt==1||cnt==2||cnt==3)
                { display1(); }
              if(cnt==4||cnt==5||cnt==6)
                { display2(); }
              if(cnt==7||cnt==8||cnt==9)
                { display3(); }
              if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
                { display(); }
            }
        cnt++;    //记下按键key1按下的次数              
        if(cnt==10&&cnt1==0)
          { miao4=miao;
            fen4=fen;
            shi4=shi;
            cnt1++;
            }
        if(cnt==13)
          { cnt=0;
            if(cnt1==1)
                { miao=miao4;
                  fen=fen4;
                  shi=shi4;
                  }
            cnt1=0;
            }      
      }
    if(key2==0)              //判断key2是否按下
    {  while(!key2)          //防止掉显
          {  if(cnt==1||cnt==2||cnt==3)
              { display1(); }
            if(cnt==4||cnt==5||cnt==6)
              { display2(); }
            if(cnt==7||cnt==8||cnt==9)
              { display3(); }
            if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
              { display(); }
            }
        jia();
      }
    if(key3==0)              //判断key3是否按下
    {  while(!key3)          //防止掉显
          {  if(cnt==1||cnt==2||cnt==3)
              { display1(); }
            if(cnt==4||cnt==5||cnt==6)
              { display2(); }
            if(cnt==7||cnt==8||cnt==9)
              { display3(); }
            if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
              { display(); }
            }
        jian();           //调用减1子函数         
      }
      if(key4==0)          //判断key4是否按下
        {while(!key4)       //防止掉
          { if(cnt==1||cnt==2||cnt==3)
              {  alm1=~alm1;
                  display1();
                  }
            if(cnt==4||cnt==5||cnt==6)
              {  alm2=~alm2;
                  display2();
                  }
            if(cnt==7||cnt==8||cnt==9)
              {  alm3=~alm3;
                  display3();
                  }
            if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
              display();
            }
          }     
  }
//****************************加1子函数***************************
void jia()           
{ if(cnt==1)            //判断key1按下的次数是否为1
    {  miao1++;        //是,则秒加1
        if(miao1>59)    //判断秒是否大于60,是,则秒清零
          miao1=0;
      }
  if(cnt==2)            //以下含意同上
    {  fen1++;
        if(fen1>59)
          fen1=0;
      }
  if(cnt==3)
    {  shi1++;
        if(shi1>23)
          shi1=0;
      }
  if(cnt==4)
    {  miao2++;
        if(miao2>59)
          miao2=0;
      }
  if(cnt==5)
    {  fen2++;
        if(fen2>59)
          fen2=0;
      }
  if(cnt==6)
    {  shi2++;
        if(shi2>23)
          shi2=0;
      }
  if(cnt==7)
    {  miao3++;
        if(miao3>59)
          miao3=0;
      }
  if(cnt==8)
    {  fen3++;
        if(fen3>59)
          fen3=0;
      }
  if(cnt==9)
    {  shi3++;
        if(shi3>23)
          shi3=0;
      }
  if(cnt==10)         
    {  miao++;      
      if(miao>59)     
          miao=0;
        cnt1++;
      }
  if(cnt==11)         
    {  fen++;
        if(fen>59)
          fen=0;
        cnt1++;
      }
  if(cnt==12)
    {  shi++;
        if(shi>23)
          shi=0;
        cnt1++;
      }
}
//***************************减1子函数**************************//
void jian()   
{  if(cnt==1)            //判断key1按下的次数是否为1,是则秒减1
    {  miao1--;
        if(miao1==255)    //判断秒是否减到255,是,则秒置59
          miao1=59;
      }
  if(cnt==2)            //以下含意同上
    {  fen1--;
        if(fen1==255)
          fen1=59;
      }
  if(cnt==3)
    {  shi1--;
        if(shi1==255)
          shi1=23;
      }
  if(cnt==4)
    {  miao2--;
        if(miao2==255)
          miao2=59;
      }
  if(cnt==5)
    {  fen2--;
        if(fen2==255)
          fen2=59;
      }
  if(cnt==6)
    {  shi2--;
        if(shi2==255)
          shi2=23;
      }
    if(cnt==7)
      {  miao3--;
        if(miao3==255)
            miao3=59;
      }
    if(cnt==8)
      {  fen3--;
        if(fen3==255)
            fen3=59;
      }
    if(cnt==9)
      {  shi3--;
        if(shi3==255)
            shi3=23;
      }
    if(cnt==10)         
      {  miao--;
        if(miao==255)
            miao=59;
        cnt1++;
        }
    if(cnt==11)
      {  fen--;
        if(fen==255)
            fen=59;
        cnt1++;
        }
    if(cnt==12)
      {  shi--;
        if(shi==255)
            shi=23;
        cnt1++;
        }
}
//***************************闹铃子函数***************************//
void clock()
//判断秒的数值是否相等         
{  if(miao==miao1&&alm1==0||miao==miao2&&alm2==0||miao==miao3&&alm3==0)
//是,在判断分是否相等                                 
      if(fen==fen1&&alm1==0||fen==fen2&&alm2==0||fen==fen3&&alm3==0)
//是,再判断时是否相等      
        if(shi==shi1&&alm1==0||shi==shi2&&alm2==0||shi==shi3&&alm3==0)
        { flag2=0;                      //是,则标志位,flag2清零
        while(!(flag2==1200)&&(cnt==0)) //判断flag2是否到1200且不
                                          //            为调时状态
        {if(key4==0)                    //没有,则继续驱动蜂鸣器响
                  {while(!key4)
                      flag2=1200;
                      }
                    if(flag1>1)          //等时方波驱动蜂鸣器
                      { fmq=~fmq;
                        flag1=0;
                        }
                  shijian();        //调用时间子函数
                  display();        //调用显示子函数
                  }
            fmq=1;                  //关闭蜂鸣器
            }
}
//**************************主函数********************************//
void main()
{  
  init();                        //调用初始化子函数
  while(1)
    {  
        clock();                  //闹钟子函数         
        if(cnt==1||cnt==2||cnt==3) //显示子函数
          { display1(); }
        if(cnt==4||cnt==5||cnt==6)
          { display2(); }
        if(cnt==7||cnt==8||cnt==9)
          { display3(); }
        if(cnt==0||cnt==10||cnt==11||cnt==12||cnt==13)
          { display(); }
        shijian();         //调用时间子函数
        key_scan();        //调用键盘扫描子函数
      }
}
//**************************定时中断******************************//
void time0() interrupt 1         
{   TH0=0x3c;        //初值50ms (65536-50000)/256
    TL0=0x0b0;        // (65536-50000)%256
    flag++;          //标志位
    flag1++;
    flag2++;      
  }

U (43.24 KB, 下载次数: 47)

U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:256754 发表于 2017-12-3 13:49 来自手机 | 只看该作者
分离时,分,秒那里是个位是%10,
回复

使用道具 举报

板凳
ID:222948 发表于 2017-12-3 15:05 | 只看该作者
  1. #include <reg51.h>
  2. unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//áDêyÑ¡ÔñÂë
  3. unsigned char code digittab[3][8]=
  4. {
  5.         {0x40,0x40,0x44,0x44,0x44,0x44,0x40,0x00},//
  6.         {0x00,0x3c,0x42,0x81,0x81,0x81,0x42,0x3c},//
  7.         {0x00,0x18,0x24,0x42,0x81,0x42,0x24,0x18},//·Åoo×ÖμÄμØ·½
  8. };
  9. unsigned int timecount;//¶¨òåê±¼ä¼Æêy′Îêy±äá¿
  10. unsigned char cnta;//¶¨òåáD
  11. unsigned char cntb;//¶¨òåDD
  12. void main(void)
  13. {
  14.         TMOD=0x01;//ê1óö¨ê±Æ÷T0μÄ·½ê½1
  15.         TH0=(65536-5000)/256;
  16.         TL0=(65536-5000)%256;//5msÖD¶Ïò»′Î
  17.         EA=1;//ÖD¶Ï×üÔêDí
  18.         TR0=1;//Æô¶ˉ¶¨ê±Æ÷¿aê¼1¤×÷
  19.         ET0=1;//ÔêDí¶¨ê±Æ÷T0ÖD¶Ï            
  20.         while(1);//μè′yÖD¶Ï2úéú
  21. }
  22. void t0(void) interrupt 1 using 0//ÖD¶Ï·tÎñ3ìDò
  23. {
  24.         TH0=(65536-5000)/256;//ÖØD¸33õÖμ
  25.         TL0=(65536-5000)%256;        
  26.         P2=tab[cnta];                  
  27.         P1=digittab[cntb][cnta];//DDêy±£3Ö2»±ä£¬áDÿÖD¶Ïò»′μó1
  28.         cnta++;
  29.         if(cnta==8) cnta=0;//ò»DDÖ»óD8¸öêyÂ룬áD¼óμ½8Ö®oó»Øáã
  30.         timecount++;     
  31.         if(timecount==200)//200*5=1000msoóDD¼ó1£¬¿ØÖÆÿ¸öí¼DÎÏÔê¾μÄê±¼äÎa1000ms£¬¼′Îa1s
  32.     {
  33.                 timecount=0;
  34.                 cntb++;
  35.                 if(cntb==3) cntb=0;//Ö»óDèyDDêyÂ룬DD¼óμ½3Ö®oó»Øáã
  36.     }
  37. }
复制代码
包含有仿真图和取模软件.docx (893.88 KB, 下载次数: 15)

Doc1.docx

34.08 KB, 下载次数: 6

回复

使用道具 举报

地板
ID:256724 发表于 2017-12-3 15:07 来自手机 | 只看该作者
lhg154 发表于 2017-12-3 13:49
分离时,分,秒那里是个位是%10,

谢谢 但是我改了以后还是那样不应该显示00-00-00格式的么
回复

使用道具 举报

5#
ID:230826 发表于 2017-12-3 17:59 | 只看该作者
uchar code table[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0xbf,~0x0ff}; //包行
回复

使用道具 举报

6#
ID:256724 发表于 2017-12-3 19:54 来自手机 | 只看该作者
changle11 发表于 2017-12-3 17:59
uchar code table[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0xbf,~0x0ff}; //包 ...

解决了 谢谢!
回复

使用道具 举报

7#
ID:250031 发表于 2017-12-3 20:21 | 只看该作者
写程序。代码能短就短,这样太多重复的代码,不好查错误
回复

使用道具 举报

8#
ID:256961 发表于 2017-12-3 22:24 | 只看该作者
数码管显示取反就解决了,这是什么问题/
回复

使用道具 举报

9#
ID:345662 发表于 2018-7-6 15:43 | 只看该作者
我也做了这个,也是这个程序,但是显示的位置有问题,应该在程序哪里改。
回复

使用道具 举报

10#
ID:111634 发表于 2018-7-7 15:41 | 只看该作者
实例94  模拟电子钟(由80C51定时器产生秒时基)
Proteus仿真一下,确认有效。
实例94 模拟电子钟(由80C51定时器产生秒时基).rar (43.05 KB, 下载次数: 5)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

11#
ID:111634 发表于 2018-7-7 15:45 | 只看该作者
实例93  具有校正功能的时钟1302(LED数码管显示)
Proteus仿真一下,确认有效。
实例93 带校正时分秒的时钟1302(6位LED数码管显示).7z (24.17 KB, 下载次数: 4)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1内有常用的单片机应用100案例,用于仿真实验操作,电路与程序真实可靠可信可行。
回复

使用道具 举报

12#
ID:313515 发表于 2018-7-7 15:59 | 只看该作者
数码管是共阴还是共阳
回复

使用道具 举报

13#
ID:366889 发表于 2018-7-7 16:03 | 只看该作者
zzzzhhhhaaaaz 发表于 2017-12-3 22:24
**** 作者被禁止或删除 内容自动屏蔽 ****

电压取反
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表