找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数字闹钟仿真(自动值班打铃系统)新手的第一个51数码管闹钟

[复制链接]
跳转到指定楼层
楼主


单片机源程序:
  1. #include <reg51.h>
  2. #include <intrins.h>                                                                                                                                                                                                                 
  3. #define uchar unsigned char                                                                                                                                                                                               
  4. #define uint unsigned int
  5. uchar code DSY_CODE[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阴极总段//
  6. uchar DSY_BUFFER[]={0,0,0xBF,0,0,0xff,0,0};//时间显示时-分 模式
  7. uchar DSY_BUFFER1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //模式显示段//
  8. uchar Scan_BIT;//位选择//
  9. uchar DSY_IDX;//段选择//
  10. uchar Key_State; //按键控制//
  11. uchar s,s100,h1        ;
  12. char  h,m;
  13. sbit dd=P1^7;        //喇叭和led输出端口//
  14. sbit cc=P1^6;
  15. sbit ss=P1^5; //时间和秒转换显示键//
  16. void DelayMS(uchar x)
  17. {
  18.   uchar i;
  19.   while(x--) for(i = 0;i<120;i++);
  20.   }
  21. void Increase_Hour()
  22.   {
  23.      if (++h>23) h=0;
  24.          DSY_BUFFER[0] =DSY_CODE[h/10];
  25.          DSY_BUFFER[1] =DSY_CODE[h%10];
  26.          }
  27. void Decrease_Hour()
  28.   {         h--;
  29.      if (h<0) h=23;
  30.          DSY_BUFFER[0] =DSY_CODE[h/10];
  31.          DSY_BUFFER[1] =DSY_CODE[h%10];
  32.          }

  33. void Increase_Minute()
  34.   {
  35.      if(++m>59)
  36.          {
  37.            m=0;Increase_Hour();
  38.            }
  39.                  DSY_BUFFER[3] =DSY_CODE[m/10];
  40.              DSY_BUFFER[4] =DSY_CODE[m%10];
  41.                  }
  42. void Decrease_Minute()
  43.   {           m--;
  44.      if(m<0)           m=59;
  45.                  DSY_BUFFER[3] =DSY_CODE[m/10];
  46.              DSY_BUFFER[4] =DSY_CODE[m%10];
  47.                  }  
  48. void Increase_Hour1()
  49.   {
  50.      if (++h1>7) h1=1;
  51.          DSY_BUFFER[6] =DSY_CODE[h1/10];
  52.          DSY_BUFFER[7] =DSY_CODE[h1%10];
  53.          }
  54. void Increase_Second()
  55.   {
  56.      if(++s>59)
  57.          {
  58.            s=0;Increase_Minute();
  59.            }
  60.                  DSY_BUFFER1[0] =DSY_CODE[s/10];
  61.              DSY_BUFFER1[1] =DSY_CODE[s%10];
  62.                  }
  63.   void T0_INT() interrupt 1         //显示屏显示//
  64.   {
  65.     TH0=(65536-1000)/256;
  66.         TL0=(65536-1000)%256;
  67.         if(ss==1)                          //P1.5键没按下,显示时间//
  68.         {
  69.         P3=Scan_BIT;
  70.         P2=~DSY_BUFFER[DSY_IDX];
  71.         }
  72.         else {                                 //P1.5键按下,闪//
  73.                  P3=Scan_BIT;
  74.                 P2=~DSY_BUFFER[DSY_IDX];
  75.             }
  76.         Scan_BIT=_crol_(Scan_BIT,1);//位显示移动//
  77.         DSY_IDX=(DSY_IDX+1)%8;         //段选择每次变化//
  78.        
  79.         if(h1==3)
  80. {        if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
  81.         if(h==6&m==15)cc=dd=0; else cc=dd=1;
  82.         if(h==7&m==0)cc=dd=0; else cc=dd=1;
  83. if(h==12&m==30)cc=dd=0;         else cc=dd=1;
  84. if(h==14&m==0)cc=dd=0;         else cc=dd=1;
  85. if(h==16&m==30)cc=dd=0;         else cc=dd=1;
  86. if(h==18&m==0)cc=dd=0;          else cc=dd=1;
  87. if(h==18&m==45)cc=dd=0;          else cc=dd=1;
  88. if(h==19&m==30)cc=dd=0;                else cc=dd=1;
  89. if(h==21&m==30)cc=dd=0;          else cc=dd=1;
  90. if(h==22&m==0)cc=dd=0;else cc=dd=1;        }
  91.         else cc=dd=1;

  92.         if(h1==1|h1==4|h1==2|h1==5)
  93. {        if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
  94.         if(h==7&m==0)cc=dd=0; else cc=dd=1;
  95. if(h==12&m==30)cc=dd=0;         else cc=dd=1;
  96. if(h==14&m==0)cc=dd=0;         else cc=dd=1;
  97. if(h==16&m==30)cc=dd=0;         else cc=dd=1;
  98. if(h==18&m==0)cc=dd=0;          else cc=dd=1;
  99. if(h==18&m==45)cc=dd=0;          else cc=dd=1;
  100. if(h==19&m==30)cc=dd=0;                else cc=dd=1;
  101. if(h==21&m==30)cc=dd=0;          else cc=dd=1;
  102. if(h==22&m==0)cc=dd=0;else cc=dd=1;        }
  103.         else cc=dd=1;

  104.           if(h1==6)
  105. {        if(h==6&m==0)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
  106.         if(h==7&m==0)cc=dd=0; else cc=dd=1;
  107. if(h==12&m==30)cc=dd=0;         else cc=dd=1;
  108. if(h==14&m==30)cc=dd=0;         else cc=dd=1;
  109. if(h==18&m==0)cc=dd=0;          else cc=dd=1;
  110. if(h==21&m==0)cc=dd=0;                else cc=dd=1;
  111. if(h==21&m==30)cc=dd=0;          else cc=dd=1;
  112. if(h==22&m==30)cc=dd=0;else cc=dd=1;        }
  113.         else cc=dd=1;

  114.         if(h1==7)
  115. {        if(h==6&m==30)cc=dd=0;else cc=dd=1;//时间到闹钟响,led亮,一分钟//
  116.                 if(h==7&m==0)cc=dd=0; else cc=dd=1;
  117. if(h==11&m==30)cc=dd=0;         else cc=dd=1;
  118. if(h==12&m==30)cc=dd=0;         else cc=dd=1;
  119. if(h==15&m==30)cc=dd=0;         else cc=dd=1;
  120. if(h==16&m==30)cc=dd=0;          else cc=dd=1;
  121. if(h==18&m==0)cc=dd=0;          else cc=dd=1;
  122. if(h==18&m==40)cc=dd=0;                else cc=dd=1;
  123. if(h==20&m==0)cc=dd=0;          else cc=dd=1;
  124. if(h==20&m==30)cc=dd=0;          else cc=dd=1;
  125. if(h==21&m==30)cc=dd=0;          else cc=dd=1;
  126. if(h==22&m==0)cc=dd=0;else cc=dd=1;        }
  127.         else cc=dd=1;
  128.           
  129.   }


  130.         void T1_INT() interrupt 3//时间秒自动加一,走时//
  131.         {
  132.           TH1=(65536-50000)/256;
  133.           TL1=(65536-50000)%256;//延时50毫秒//
  134.           if (s100==20)
  135.           {
  136.             s100=0;
  137.                 Increase_Second();
  138.       }
  139.         else s100++;
  140.         }
  141.         void main ()
  142.         {
  143.           P2=P3=0xFF;
  144.           TMOD=0x11;
  145.           TH0=(65536-1000)/256;
  146.           TL0=(65536-1000)%256;
  147.           TH1=0XDC;
  148.           TL1=0;
  149.           TCON=0x01;
  150.           EA=1;
  151.           ET0=1;
  152.           ET1=1;
  153.           h=05,m=55,s=s100,h1=1;  //时间和闹钟初值//
  154.           DSY_BUFFER[0]=DSY_CODE[h/10];           //时间初值赋给时间段码显示组//
  155.           DSY_BUFFER[1]=DSY_CODE[h%10];
  156.           DSY_BUFFER[3]=DSY_CODE[m/10];
  157.           DSY_BUFFER[4]=DSY_CODE[m%10];
  158.           DSY_BUFFER[6]=DSY_CODE[h1/10];
  159.           DSY_BUFFER[7]=DSY_CODE[h1%10];
  160.           DSY_BUFFER1[0]=DSY_CODE[h1/10];        //闹钟初值赋给闹钟段码显示组//
  161.           DSY_BUFFER1[1]=DSY_CODE[h1%10];
  162.           Scan_BIT=0xFE;  //给位选择赋初值为二进制数 11111110,即只有最后一位为低电平,之后每次左移一位,依次为11111101,11111011......01111111,11111110循环移动//
  163.           DSY_IDX=0;         //段码显示组的选择变量//
  164.           TR0=TR1=1;
  165.           Key_State=0xFF;
  166.           while(1)
  167.           {
  168.             if (P1^Key_State)         //判断按键是否有按下//
  169.                  {
  170.                    DelayMS(10);
  171.                    if (P1^Key_State)
  172.                    {
  173.                      Key_State=P1; EA=0;
  174.                          if((Key_State&0x01)==0) Increase_Hour();           //小时加一//
  175.                          else if ((Key_State&0x02)==0) Decrease_Hour();   //小时减一//
  176.                             else if ((Key_State&0x04)==0) Increase_Minute();        //分钟加一//
  177.                                 else if ((Key_State&0x08)==0) Decrease_Minute(); //分钟减一//
  178.                                 else if ((Key_State&0x10)==0)                                         //复位按键//
  179.                                 {h=05,m=55,s=0,h1=1;
  180.                                         DSY_BUFFER[0]=DSY_CODE[h/10];
  181.                                         DSY_BUFFER[1]=DSY_CODE[h%10];
  182.                                         DSY_BUFFER[3]=DSY_CODE[m/10];
  183.                                         DSY_BUFFER[4]=DSY_CODE[m%10];
  184.                                         DSY_BUFFER[6]=DSY_CODE[h1/10];
  185.                                         DSY_BUFFER[7]=DSY_CODE[h1%10];

  186.                                 }
  187.                            else if ((Key_State&0x20)==0)Increase_Hour1();        //模式加一//
  188.                            EA=1;
  189.                            }
  190.                }
  191.                            }
  192.                            }
复制代码

下载:
数字闹钟(自动值班打铃系统).zip (48.9 KB, 下载次数: 105)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:165792 发表于 2017-3-25 07:46 来自手机 | 只看该作者
学习了,不错不错
回复

使用道具 举报

板凳
ID:744197 发表于 2020-5-4 22:05 | 只看该作者
厉害了,有时间学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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