找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7118|回复: 5
收起左侧

51单片机多功能数字时钟程序,可显示时分秒,可定闹钟

[复制链接]
ID:908462 发表于 2021-4-21 16:28 | 显示全部楼层 |阅读模式
附带c代码和仿真图
51hei图片_20210421162309.png
  1. #include "main.h"


  2. //延时函数
  3. void delay(unsigned int time)
  4. {
  5.         unsigned int j = 0;
  6.         for(;time>0;time--)        //执行空语句,消耗CPU时间。
  7.         for(j=0;j<125;j++);
  8. }

  9. void main(void)
  10. {
  11.         //时分秒初始化
  12.         m_shi=num/10;
  13.         m_ge=num%10;
  14.         f_shi=f/10;
  15.         f_ge=f%10;
  16.         h_shi=h/10;
  17.         h_ge=h%10;

  18.         //初始化定时器1和定时器0
  19.         TMOD=0x10;

  20.         //设置定时器溢出值
  21.         TH1=(65536-50000)/256;
  22.         TL1=(65536-50000)%256;
  23.        
  24.         //开总中断
  25.         EA=1;
  26.        
  27.         //开启定时器中断
  28.         ET1=1;

  29.         //开启定时器
  30.         TR1=1;

  31.         //开外部中断0
  32.         EX0 = 1;

  33.         //设置外部中断0的触发方式为下降沿
  34.         IT0 = 1;
  35.        
  36.         while(1)
  37.         {
  38.                 if (key1 == 0)
  39.                 {
  40.                         //按键松手检测
  41.                         while (key1 == 0);
  42.                         mode++;

  43.                         Beep = 1;
  44.                         flag = 0;

  45.                         if (mode == 3)
  46.                         {
  47.                                 //刷新数值并显示
  48.                                 m_shi=alarm_num/10;
  49.                                 m_ge=alarm_num%10;
  50.                                 f_shi=alarm_f/10;
  51.                                 f_ge=alarm_f%10;
  52.                                 h_shi=alarm_h/10;
  53.                                 h_ge=alarm_h%10;                       
  54.                         }
  55.                         else
  56.                         {
  57.                                 //刷新数值并显示
  58.                                 m_shi=num/10;
  59.                                 m_ge=num%10;
  60.                                 f_shi=f/10;
  61.                                 f_ge=f%10;
  62.                                 h_shi=h/10;
  63.                                 h_ge=h%10;                       
  64.                         }


  65.                         if (mode == 4)
  66.                         {
  67.                                 mode = 1;
  68.                         }
  69.                 }

  70.                 if (mode == 1)//时钟模式
  71.                 {
  72.                         display();       
  73.                 }

  74.                 //调试模式
  75.                 if (mode == 2)
  76.                 {
  77.                         adjust_time();       
  78.                 }

  79.                 //设置闹钟
  80.                 if(mode == 3)
  81.                 {
  82.                         adjust_alarm();
  83.                 }

  84.                 //打开闹钟
  85.                 if ((alarm_num == num) && (alarm_f == f) && (alarm_h == h))
  86.                 {
  87.                         //num2 = 0;
  88.                           alarm_clock = 1;       
  89.                 }
  90.                
  91.                 //关闭闹钟
  92.                 if (alarm_clock == 0)
  93.                 {
  94.                         Beep = 1;
  95.                 }
  96.         }
  97. }
  98. void display(void)
  99. {
  100.         //把时的十位送到P0端口
  101.         duang_clk = 1; //开启573锁存引脚
  102.         P0=LED[h_shi];
  103.         delay(1);
  104.         duang_clk = 0; //关闭573锁存引脚
  105.        
  106.         //调时闪烁                       
  107.         if (flag == 1)
  108.         {
  109.                 if (ok == 0)
  110.                 {
  111.                         wei_clk = 1;
  112.                         P0=0xfe;
  113.                         delay(1);
  114.                         P0=0xff;
  115.                         wei_clk = 0;                               
  116.                 }                               
  117.                 else
  118.                 {
  119.                         wei_clk = 1;
  120.                         P0=0xff;
  121.                         wei_clk = 0;               
  122.                 }       
  123.         }
  124.         else
  125.         {
  126.                 wei_clk = 1;
  127.                 P0=0xfe;
  128.                 delay(1);
  129.                 P0=0xff;
  130.                 wei_clk = 0;
  131.         }

  132.         //把时的个位送到P0端口
  133.         duang_clk = 1;
  134.         P0=LED[h_ge];
  135.         delay(1);
  136.         duang_clk = 0;

  137.         //调时闪烁                       
  138.         if (flag == 1)
  139.         {
  140.                 if (ok == 0)
  141.                 {
  142.                         wei_clk = 1;
  143.                         P0=0xfd;
  144.                         delay(1);
  145.                         P0=0xff;
  146.                         wei_clk = 0;       
  147.                 }                               
  148.                 else
  149.                 {
  150.                         wei_clk = 1;
  151.                         P0=0xff;
  152.                         wei_clk = 0;               
  153.                 }       
  154.         }
  155.         else
  156.         {
  157.                 wei_clk = 1;
  158.                 P0=0xfd;
  159.                 delay(1);
  160.                 P0=0xff;
  161.                 wei_clk = 0;
  162.         }

  163.         //-
  164.         duang_clk = 1;
  165.         P0=LED[10];
  166.         delay(1);
  167.         duang_clk = 0;
  168.                                
  169.         wei_clk = 1;
  170.         P0=0xfb;
  171.         delay(1);
  172.         P0=0xff;
  173.         wei_clk = 0;


  174.         //把分的十位到P0端口
  175.         duang_clk = 1;
  176.         P0=LED[f_shi];
  177.         delay(1);
  178.         duang_clk = 0;

  179.         //调分闪烁                       
  180.         if (flag == 2)
  181.         {
  182.                 if (ok == 0)
  183.                 {
  184.                         wei_clk = 1;
  185.                         P0=0xf7;
  186.                         delay(1);
  187.                         P0=0xff;
  188.                         wei_clk = 0;       
  189.                 }                               
  190.                 else
  191.                 {
  192.                         wei_clk = 1;
  193.                         P0=0xff;
  194.                         wei_clk = 0;               
  195.                 }
  196.         }
  197.         else
  198.         {
  199.                 wei_clk = 1;
  200.                 P0=0xf7;
  201.                 delay(1);
  202.                 P0=0xff;
  203.                 wei_clk = 0;
  204.         }

  205.         //把分的个位送到P0端口
  206.         duang_clk = 1;
  207.         P0=LED[f_ge];
  208.         delay(1);
  209.         duang_clk = 0;

  210.         //调分闪烁                       
  211.         if (flag == 2)
  212.         {
  213.                 if (ok == 0)
  214.                 {
  215.                         wei_clk = 1;
  216.                         P0=0xef;
  217.                         delay(1);
  218.                         P0=0xff;
  219.                         wei_clk = 0;
  220.                 }                               
  221.                 else
  222.                 {
  223.                         wei_clk = 1;
  224.                         P0=0xff;
  225.                         wei_clk = 0;               
  226.                 }       
  227.         }
  228.         else
  229.         {
  230.                 wei_clk = 1;
  231.                 P0=0xef;
  232.                 delay(1);
  233.                 P0=0xff;
  234.                 wei_clk = 0;
  235.         }

  236.         //-
  237.         duang_clk = 1;
  238.         P0=LED[10];
  239.         delay(1);
  240.         duang_clk = 0;
  241.                                
  242.         wei_clk = 1;
  243.         P0=0xdf;
  244.         delay(1);
  245.         P0=0xff;
  246.         wei_clk = 0;


  247.         //把秒的十位到P0端口
  248.         duang_clk = 1;
  249.         P0=LED[m_shi];
  250.         delay(1);
  251.         duang_clk = 0;
  252.                                
  253.         if (flag == 3)
  254.         {
  255.                 if (ok == 0)
  256.                 {
  257.                         wei_clk = 1;
  258.                         P0=0xbf;
  259.                         delay(1);
  260.                         P0=0xff;
  261.                         wei_clk = 0;
  262.                 }                               
  263.                 else
  264.                 {
  265.                         wei_clk = 1;
  266.                         P0=0xff;
  267.                         wei_clk = 0;               
  268.                 }
  269.         }
  270.         else//调秒闪烁
  271.         {
  272.                 wei_clk = 1;
  273.                 P0=0xbf;
  274.                 delay(1);
  275.                 P0=0xff;
  276.                 wei_clk = 0;
  277.         }

  278.         //把秒的个位送到P0端口
  279.         duang_clk = 1;
  280.         P0=LED[m_ge];
  281.         delay(1);
  282.         duang_clk = 0;
  283.         //调秒闪烁                       
  284.         if (flag == 3)
  285.         {
  286.                 if (ok == 0)
  287.                 {
  288.                         wei_clk = 1;
  289.                         P0=0x7f;
  290.                         delay(1);
  291.                         P0=0xff;
  292.                         wei_clk = 0;
  293.                 }                               
  294.                 else
  295.                 {
  296.                         wei_clk = 1;
  297.                         P0=0xff;
  298.                         wei_clk = 0;               
  299.                 }
  300.         }
  301.         else
  302.         {
  303.                 wei_clk = 1;
  304.                 P0=0x7f;
  305.                 delay(1);
  306.                 P0=0xff;
  307.                 wei_clk = 0;
  308.         }
  309. }



  310. //定时器1中断服务函数,50ms进入一次中断
  311. void T1_time() interrupt 3
  312. {
  313.         //重装载定时器1的初始值
  314.         TH1=(65536-50000)/256;
  315.         TL1=(65536-50000)%256;
  316.        
  317.         //没20ms加一次
  318.         num2++;

  319.         //闹钟响
  320.         if (alarm_clock == 1)
  321.         {
  322.                 if (num2 % 20 == 0)
  323.                 {
  324.                         alarm_clock_counte++;
  325.                         Beep = !Beep;
  326.                         if (alarm_clock_counte == 7)
  327.                         {
  328.                                 Beep = 1;
  329.                                 alarm_clock_counte=0;
  330.                                 alarm_clock = 0;
  331.                         }
  332.                 }               
  333.         }

  334.         if (num2 % 10 == 0)
  335.         {
  336.                 ok = !ok;
  337.         }


  338.         //50ms * 20 = 1s
  339.         if(num2==20)
  340.         {
  341.                 //清零
  342.                 num2=0;

  343.                    //只有在走时模式秒钟才动作
  344.                 if (mode == 1)
  345.                 {
  346.                         //秒计数加1
  347.                         num++;       
  348.                        
  349.                         //更新数值
  350.                         m_shi=num/10;
  351.                         m_ge=num%10;
  352.                 }

  353.                        
  354.                 //1s * 60 = 60s = 1分钟
  355.                 if(num==60)
  356.                 {
  357.                         //清零
  358.                         num=0;

  359.                         //分计数加1
  360.                         f++;

  361.                         //更新数值
  362.                         m_shi=num/10;
  363.                         m_ge=num%10;
  364.                         f_shi=f/10;
  365.                         f_ge=f%10;

  366.                         //1分钟 * 60 = 1小时
  367.                         if (f == 60)
  368.                         {
  369.                                 //清零
  370.                                 f = 0;

  371.                                 //时计数加1
  372.                                 h++;

  373.                                 //更新数值
  374.                                 f_shi=f/10;
  375.                                 f_ge=f%10;
  376.                                 h_shi=h/10;
  377.                                 h_ge=h%10;

  378.                                 //1小时 * 24 = 1天
  379.                                 if (h == 24)
  380.                                 {
  381.                                         //清零
  382.                                         h = 0;

  383.                                         //更新数值
  384.                                         h_shi=h/10;
  385.                                         h_ge=h%10;
  386.                                 }               
  387.                         }               
  388.                 }
  389.         }
  390. }


  391. //外部中断0中断服务函数
  392. void int0() interrupt 0
  393. {
  394.         alarm_clock = 0;
  395.         Beep = 1;
  396. }

  397. //调时间
  398. void adjust_time(void)
  399. {
  400.         if (key2 == 0)
  401.         {
  402.                 //按键松手检测
  403.                 while (key2 == 0);
  404.                 flag++;
  405.                 if(flag == 4)
  406.                 {
  407.                         flag = 1;
  408.                 }
  409.         }

  410.         if (flag == 1)
  411.         {
  412.                 if (key3 == 0)
  413.                 {
  414.                         while (key3 == 0);
  415.                         h++;
  416.                         if (h == 24)
  417.                         {
  418.                                 h=0;
  419.                         }                                                                       
  420.                 }

  421.                 if (key5 == 0)
  422.                 {
  423.                         while (key5 == 0);
  424.                         h--;
  425.                         if (h == -1)
  426.                         {
  427.                                 h=23;
  428.                         }                                                                       
  429.                 }
  430.         }

  431.         if (flag == 2)
  432.         {
  433.                 if (key3 == 0)
  434.                 {
  435.                         while (key3 == 0);
  436.                         f++;
  437.                         if (f == 60)
  438.                         {
  439.                                 f=0;
  440.                         }                                                                               
  441.                 }

  442.                 if (key5 == 0)
  443.                 {
  444.                         while (key5 == 0);
  445.                         f--;
  446.                         if (f == -1)
  447.                         {
  448.                                 f=59;
  449.                         }                                                                       
  450.                 }
  451.         }

  452.         if (flag == 3)
  453.         {
  454.                 if (key3 == 0)
  455.                 {
  456.                         while (key3 == 0);
  457.                         num++;
  458.                         if (num == 60)
  459.                         {
  460.                                 num=0;
  461.                         }                                                                               
  462.                 }

  463.                 if (key5 == 0)
  464.                 {
  465.                         while (key5 == 0);
  466.                         num--;
  467.                         if (num == -1)
  468.                         {
  469.                                 num=59;
  470.                         }                                                                       
  471.                 }               
  472.         }

  473.         //刷新数值并显示
  474.         m_shi=num/10;
  475.         m_ge=num%10;
  476.         f_shi=f/10;
  477.         f_ge=f%10;
  478.         h_shi=h/10;
  479.         h_ge=h%10;
  480.         display();               
  481. }

  482. void adjust_alarm(void)
  483. {
  484.         if (key2 == 0)
  485.         {
  486.                 //按键松手检测
  487.                 while (key2 == 0);
  488.                 flag++;
  489.                 if(flag == 4)
  490.                 {
  491.                         flag = 1;
  492.                 }
  493.         }

  494.         if (flag == 1)
  495.         {
  496.                 if (key3 == 0)
  497.                 {
  498.                         while (key3 == 0);
  499.                         alarm_h++;
  500.                         if (alarm_h == 24)
  501.                         {
  502.                                 alarm_h=0;
  503.                         }                                                                       
  504.                 }

  505.                 if (key5 == 0)
  506.                 {
  507.                         while (key5 == 0);
  508.                         alarm_h--;
  509.                         if (alarm_h == -1)
  510.                         {
  511.                                 alarm_h=23;
  512.                         }                                                                       
  513.                 }
  514.         }

  515.         if (flag == 2)
  516.         {
  517.                 if (key3 == 0)
  518.                 {
  519.                         while (key3 == 0);
  520.                         alarm_f++;
  521.                         if (alarm_f == 60)
  522.                         {
  523.                                 alarm_f=0;
  524.                         }                                                                               
  525.                 }

  526.                 if (key5 == 0)
  527.                 {
  528.                         while (key5 == 0);
  529.                         alarm_f--;
  530.                         if (alarm_f == -1)
  531.                         {
  532.                                 alarm_f=59;
  533.                         }                                                                       
  534.                 }
  535.         }

  536.         if (flag == 3)
  537.         {
  538.                 if (key3 == 0)
  539.                 {
  540.                         while (key3 == 0);
  541.                         alarm_num++;
  542.                         if (alarm_num == 60)
  543.                         {
  544.                                 alarm_num=0;
  545.                         }                                                                               
  546.                 }
  547.                
  548.                 if (key5 == 0)
  549.                 {
  550.                         while (key5 == 0);
  551.                         alarm_num--;
  552.                         if (alarm_num == -1)
  553.                         {
  554.                                 alarm_num=59;
  555.                         }                                                                       
  556.                 }               
  557.         }

  558.         //刷新数值并显示
  559.         m_shi=alarm_num/10;
  560.         m_ge=alarm_num%10;
  561.         f_shi=alarm_f/10;
  562.         f_ge=alarm_f%10;
  563.         h_shi=alarm_h/10;
  564.         h_ge=alarm_h%10;
  565.         display();
  566. }
复制代码


回复

使用道具 举报

ID:947933 发表于 2021-7-1 17:12 | 显示全部楼层
有没有比较清楚的仿真图
回复

使用道具 举报

ID:971637 发表于 2021-10-22 22:43 | 显示全部楼层
可以发一下仿真文件吗?谢谢
回复

使用道具 举报

ID:985559 发表于 2021-11-28 12:15 | 显示全部楼层
可以看一下前面的几行程序吗
回复

使用道具 举报

ID:983456 发表于 2021-11-29 11:08 来自手机 | 显示全部楼层
楼主,有没有仿真文件呀
回复

使用道具 举报

ID:245820 发表于 2022-5-10 20:06 | 显示全部楼层
还缺少变量定义
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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