找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6133|回复: 3
收起左侧

51单片机电子时钟+万历表+闹钟(代码+原理图+PCB文件)

[复制链接]
ID:323044 发表于 2019-6-26 11:13 | 显示全部楼层 |阅读模式
                        电 子 时 钟 万 年 历 + 闹 钟 设 置
实 现 功 能 :1 . 一 上 电 显 示 00-00-00 ,且 ‘-’ 一 秒 闪 烁 一 次
                    2 . 按 键 功 能 :
                      k1:设 置 位
                      k2:加 位
                      k3:减 位
                      k4:万 年 历 、闹 钟 、时 钟 切 换 位      
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)

PCB

PCB

原理图

原理图

单片机源程序如下:
  1. /********************************************************
  2.                         电 子 时 钟 万 年 历 + 闹 钟 设 置
  3. 实 现 功 能 :1 . 一 上 电 显 示 00-00-00 ,且 ‘-’ 一 秒 闪 烁 一 次
  4.                       2 . 按 键 功 能 :
  5.                             k1:设 置 位
  6.                             k2:加 位
  7.                       k3:减 位
  8.                       k4:万 年 历 、闹 钟 、时 钟 切 换 位                                   
  9. *********************************************************/
  10. #include <reg52.h>
  11. typedef         unsigned char u8;
  12. typedef  unsigned int  u16;

  13. u16 i,j,k;
  14. u8 anjian,jia,jian,beep;
  15. u8 sec,min,hour,shine;
  16. u8 N_sec,N_min,N_hour;                //闹钟
  17. u8 shine1;
  18. u16 year=2019,month=6,day=17;

  19. sbit buzzer=P3^7;
  20. sbit k2=P3^1;
  21. sbit k1=P3^0;
  22. sbit k3=P3^2;
  23. sbit k4=P3^3;

  24. u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //数码管显示0123456789- 空

  25. u8 code smgwei[]={0x00,0x04,0x08,0x0c,0x10,0x14,0x18,0x1c};         //选择1-8位数码管

  26. /********延时函数*************/
  27. void delay(i)
  28. {
  29.         while(i--);
  30. }

  31. /***********数码管段位选********/
  32. void time(j,k)
  33. {        
  34.         P2=smgwei[j];          //数码管位选
  35.         P0=smgduan[k];          //数码管段选
  36.         delay(100);                  //间隔一段时间
  37. }

  38. /**********数码管时间循环流动**********/
  39. void time_Display()
  40. {
  41.    if(shine == 1)    //3、6位数码管'-'闪烁
  42.         {
  43.                  time(2,11);
  44.                  time(5,11);           
  45.         }
  46.         else if(shine==0)
  47.         {
  48.                  time(2,10);
  49.                  time(5,10);
  50.         }

  51.    if(anjian==0)        //一上电,时钟显示00-00-00
  52.           {
  53.             time(0,sec%10);
  54.                 time(1,sec/10);
  55.                 time(3,min%10);
  56.                 time(4,min/10);
  57.                 time(6,hour%10);
  58.                 time(7,hour/10);
  59.         }

  60.         else if(anjian==1)        //切换设置模式,选择位为秒位
  61.         {
  62.                 TR0=0;                        //关闭定时器0,在设置模式下时钟不运行
  63.                 TR1=1;                        //打开定时器1,开始计数
  64.         if(shine1<=50)        //在shine1为0-50区间内,即1秒灭
  65.         {
  66.                 time(0,11);
  67.                 time(1,11);
  68.         }
  69.         else if((shine1>50)&&(shine1<=100))         //在shine1为50-100区间内,即1秒亮
  70.         {
  71.                 time(0,sec%10);
  72.                 time(1,sec/10);
  73.         }
  74.                 time(3,min%10);        //其他不变
  75.             time(4,min/10);
  76.             time(6,hour%10);
  77.              time(7,hour/10);
  78.         }

  79.         else if(anjian==2)        //设置模式下,选择位为分位
  80.         {
  81.                 TR0=0;                        //关闭定时器0,在设置模式下时钟不运行
  82.                 TR1=1;                        //打开定时器1,开始计数
  83.                 if(shine1<=50)        //在shine1为0-50区间内,即1秒灭
  84.                 {
  85.                         time(3,11);
  86.                         time(4,11);
  87.             }
  88.            else if((shine1>50)&&(shine1<=100)) //在shine1为50-100区间内,即1秒亮
  89.            {
  90.                  time(3,min%10);
  91.              time(4,min/10);
  92.            }
  93.             time(0,sec%10);        //其他不变           
  94.              time(1,sec/10);
  95.                 time(6,hour%10);
  96.              time(7,hour/10);
  97.         }
  98.         else if(anjian==3)        //设置模式下,选择位为时位
  99.         {
  100.                 TR0=0;                        //关闭定时器0,在设置模式下时钟不运行
  101.                 TR1=1;                        //打开定时器1,开始计数
  102.                 if(shine1<=50)        //在shine1为0-50区间内,即1秒灭
  103.                 {
  104.                         time(6,11);
  105.                         time(7,11);
  106.                         }
  107.                 else if((shine1>50)&&(shine1<=100))        //在shine1为50-100区间内,即1秒亮
  108.                 {
  109.                         time(6,hour%10);
  110.                         time(7,hour/10);
  111.                 }
  112.                         time(0,sec%10);         //其他不变
  113.                         time(1,sec/10);
  114.                         time(3,min%10);
  115.                         time(4,min/10);
  116.                 }

  117.         //k2加一功能        
  118.         if(jia==1&&anjian==1)  //选择秒位时,按下k2加一
  119.         {        
  120.                 jia=0;
  121.                 sec++;
  122.                 if(sec>59)
  123.                 sec=0;
  124.                 TR0=0;                          //时钟暂停
  125.         }

  126.         if(jia==1&&anjian==2)        //选择分位时,按下k2加一
  127.         {        
  128.                 jia=0;
  129.                 min++;
  130.                 if(min>59)
  131.                 min=0;
  132.                 TR0=0;                           //时钟暂停
  133.         }

  134.         if(jia==1&&anjian==3)  //选择时位时,按下k2加一
  135.         {        
  136.                 jia=0;
  137.                 hour++;
  138.                 if(hour==24)
  139.                 hour=0;
  140.                 TR0=0;                           //时钟暂停
  141.         }

  142.         //k3减一功能
  143.         if(jian==1&&anjian==1)        //选择秒位时,按下k3减一
  144.         {        
  145.                 jian=0;
  146.                 sec--;
  147.                 if(sec==-1)
  148.                 sec=59;
  149.                 TR0=0;                                //时钟暂停
  150.         }
  151.         if(jian==1&&anjian==2)        //选择分位时,按下k3减一
  152.         {        
  153.                 jian=0;
  154.                 min--;
  155.                 if(min==-1)
  156.                 min=59;
  157.                 TR0=0;                            //时钟暂停
  158.         }


  159.         if(jian==1&&anjian==3)        //选择时位时,按下k3减一
  160.         {        
  161.                 jian=0;
  162.                 hour--;
  163.                 if(hour==-1)
  164.                 hour=23;
  165.                 TR0=0;                            //时钟暂停
  166.         }
  167. }
复制代码
详细代码在附件中
0.png

全部资料51hei下载地址:
51单片机电子时钟 万历表 闹钟(代码 原理图 PCB).zip (2.04 MB, 下载次数: 129)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:409824 发表于 2019-7-10 10:48 | 显示全部楼层
里面文件少了,和帖子里面的有误差
回复

使用道具 举报

ID:323044 发表于 2019-7-10 12:09 | 显示全部楼层
电子爱好者1号 发表于 2019-7-10 10:48
里面文件少了,和帖子里面的有误差

少了啥?
回复

使用道具 举报

ID:782897 发表于 2020-6-18 15:08 来自手机 | 显示全部楼层
老哥,仿真图不来一张?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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