找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用数码管显示电子钟,程序简单,适合初学者(内含代码及注解及仿真)

[复制链接]
跳转到指定楼层
楼主
  1. #include <reg51.h>

  2. unsigned char code smg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,

  3.                           0x77,0x7C,0x39,0x5E,0x79,0x71,0x40,0x00};        //字形代码,分别为0-9,a-f,-,全灭



  4. unsigned char num[8]={0,0,16,0,0,16,0,0};       //显示缓冲区

  5. unsigned char w;// 移位控制

  6. unsigned char miao,fen,shi;    //时间

  7. unsigned char t,i;// 记录定时器中断次数

  8. bit qd=1;     //时钟启停控制位

  9. sbit wei =P3^0;     //定义P3.0端口为移位按键

  10. sbit tiao=P3^1;     //定义P.1端口为调整按键

  11. void delay(unsigned int T)   //延时子函数

  12. {

  13.     unsigned char b,c;

  14.     for(c=T;c>0;c--)

  15.         for(b=90;b>0;b--);

  16. }

  17. /*=======================================================

  18.                           ------- 主程序 ------

  19. =======================================================*/

  20. void main()

  21. {                   // 定时器1,外部中断0的初始化

  22.         TMOD=0x10;      //设置定时器T1为方式1模式

  23.         ET1=1;          //允许定时器T1中断

  24.         TL1=0xE0;      //设定定时器T1初值

  25.         TH1=0xB1;      //设定定时器T1初值

  26.         EX0=1;         //使能外部中断

  27.         IT0=1;         //指定外部中断0下降沿触发

  28.         EX1=1;         //开外部中断1

  29.         IT1=1;         //外部中断1下降沿触发方式

  30.         PT1=1;

  31.         EA=1;                //总中断允许                          

  32.         TR1=1;      //启动定时器T1

  33.         

  34.         miao=0,fen=0,shi=0;

  35.         num[0]=shi/10;//时高位

  36.         num[1]=shi%10;//时低位

  37.         num[3]=fen/10;//分高位

  38.         num[4]=fen%10;//分地位

  39.         num[6]=miao/10;//秒高位

  40.         num[7]=miao%10;//秒地位

  41.         t=0;    //定时器中断次数初始化

  42.         w=0;    //闪烁控制位,初始无闪烁位

  43.         qd=1;   //时钟启停标志位

  44.         while(1)

  45.         {        if(t==50)     // 时间的控制

  46.                 {        t=0;      

  47.                    miao++;    //秒自增

  48.                    if(miao==60)  //如果秒等于60

  49.                    {miao=0;fen++;   //0赋值给秒,分自增

  50.                             if(fen==60)   //如果分等于60

  51.                               {fen=0;shi++;    //把0赋值给分,时自增

  52.                                      if(shi==24) shi=0;}   //如果时等于24,把0赋值给时

  53.                    }       // 下面是显示缓冲区内容的计算

  54.                    num[0]=shi/10;num[1]=shi%10;

  55.                    num[3]=fen/10;num[4]=fen%10;

  56.                    num[6]=miao/10;num[7]=miao%10;

  57.                 }

  58.         }

  59. }

  60. /*=======================================================

  61.                 ------- 定时器1中断程序 ------

  62. =======================================================*/

  63. void timer1() interrupt 3

  64. {        static unsigned char ss,g;

  65.         TL1=0xE0;

  66.         TH1=0xB1;         //定时20Ms          循环

  67.   if(qd) t++;//-----时钟计时         

  68.         if(w==1||w==2||w==3||w==4||w==5||w==6)

  69.         {        ss++;//调位闪烁

  70.           if(ss<30)//显示灭

  71.                           {

  72.                                   switch(w)        //选择灭的显示位

  73.                                   {

  74.                                   case 1:g=0;break;//时高位

  75.                                         case 2:g=1;break;//时地位

  76.                                         case 3:g=3;break;//分高位

  77.                                         case 4:g=4;break;//分低位

  78.                                         case 5:g=6;break;//秒高位

  79.                                         case 6:g=7;break;//秒低位

  80.                                   }

  81.                                 for(i=0;i<8;i++)//输出显示

  82.                                 {

  83.                                         P2=i;

  84.                                         if(i==g)P0=0X00;//需要调整的位灭

  85.                                         else  P0=smg[num[i]];//正常显示

  86.                                         delay(4);

  87.                                 }

  88.                    }

  89.                           else if(ss>=30)//+++++++++++++亮

  90.                           {

  91.                                  for(i=0;i<8;i++)

  92.                                   {

  93.                                         P2=i;

  94.                                         P0=smg[num[i]];//正常显示

  95.                                         delay(3);

  96.                                   }

  97.                                   if(ss==60) ss=0;

  98.                     }

  99.         }

  100.         else//-------不调整时正常显示

  101.         {

  102.                 for(i=0;i<8;i++)

  103.                 {

  104.                         P2=i; //把i赋值给P2

  105.                     P0=smg[num[i]];//正常显示

  106.                         delay(3);

  107.                 }         

  108.         }

  109. }


  110. /*=======================================================

  111.                         ------- 外部中断1中断程序 ------

  112. 说明:调整时分秒的每一位

  113. =======================================================*/

  114. void  shezhi() interrupt  2

  115. { if(wei==0) //调整位的按键按下了

  116.   {w++;

  117.           if(w==7)  //如果w等于7

  118.                   w=0;   //把0赋值给w

  119.           if(w==0) qd=1;  //如果w等于0,把1赋值给qd

  120.            else     qd=0;  //否则把0赋值给qd

  121.   }

  122.   else if(tiao==0&& w!=0)//调整数据的按键按下了

  123.   {

  124.         if(w==1) //如果w等于1,调整时的十位

  125.         {

  126.                 num[0]++;   //时高位增加

  127.                 if(num[0]==3) num[0]=0;

  128.         }

  129.         else if (w==2)//如果w等于2,调整时的个位

  130.         {

  131.                 num[1]++;   //时低位增加

  132.                 if( (num[0]==2 && num[1]==4 ) ||

  133.                     (num[0]==1 && num[1]==10) ||

  134.                         (num[0]==0 && num[1]==10)   )

  135.                 num[1]=0;         

  136.         }

  137.         else if (w==3)//如果w等于3,调整分的十位

  138.         {

  139.             num[3]++;   //分高位增加

  140.                 if(num[3]==6) num[3]=0;     //分高位等于6,把0赋值给分高位

  141.         }

  142.         else if (w==4)//如果w等于4,调整分的个位

  143.         {

  144.             num[4]++;    //分低位增加

  145.                 if(num[4]==10) num[4]=0;   //分低位等于10,把0赋值给分低位

  146.         }

  147.         else if (w==5)//如果w等于5,调整秒的十位

  148.         {

  149.             num[6]++;    //秒高位增加

  150.                 if(num[6]==6) num[6]=0;   //秒高位等于6,把0赋值给秒高位

  151.         }

  152.         else if (w==6)//如果w等于6,调整秒的个位

  153.         {

  154.             num[7]++;    //秒低位增加

  155.                 if(num[7]==10) num[7]=0;  //秒低位等于10,把0赋值给秒低位

  156.         }



  157.         miao=num[7]+num[6]*10;

  158.         fen =num[4]+num[3]*10;

  159.         shi =num[1]+num[0]*10;

  160.   }

  161. }
复制代码

Desktop.zip (70.58 KB, 下载次数: 48)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:489282 发表于 2021-11-11 15:53 | 只看该作者
原理图在哪
回复

使用道具 举报

板凳
ID:262 发表于 2021-11-11 16:25 | 只看该作者

在下载的压缩包里面有仿真原理图

51hei.gif (304.71 KB, 下载次数: 40)

51hei.gif
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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