找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6216|回复: 12
收起左侧

假期新做,精巧高精度数码管时钟PCF8563+TM1637 附单片机程序

  [复制链接]
ID:86421 发表于 2019-10-8 08:35 | 显示全部楼层 |阅读模式
放假下雨,无事做了一个时钟。洞洞焊接,很是费力哟。四位带双点0.56数码管,废微波炉上拆下来的,PCF8563,旧电表的拆下来的。加了一个STC15W104、TM1637及三个按键.做出来的时钟小巧稳定,功能也还可以。上图: 图片4.jpg 图片3.jpg 图片2.jpg 图片1.jpg

单片机源程序如下:
  1. #include <STC15.h>
  2. #include "intrins.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.        
  6. #include "TM1637.h"
  7. #include "PCF8563.H"


  8. uchar keyvalue,xs=0,LD=5,SetFlag=0,re_disp=0;
  9. uchar keydate;     //读键盘参数
  10. bit Flash;       //闪烁标志位
  11. bit ReadTimeFlag;//定义读时间标志

  12. void Init_Timer0(void);//定时器初始化
  13. void Displsy_Time();
  14. void Scan_Key();
  15. void Set(uchar sel,uchar selby);

  16. /*------------------------------------------------
  17.               主函数
  18. ------------------------------------------------*/
  19. void main()
  20. {
  21.         P3M0=0X00;
  22.         P3M1=0X00;

  23.   Init_Timer0();
  24.         while(1)
  25.         {
  26.    Scan_Key();
  27.         }
  28. }
  29. /*------------------------------------------------
  30.    显示界面设置
  31. ------------------------------------------------*/
  32. void Displsy_Time()
  33. {
  34.         if(ReadTimeFlag==1)  //读取时间
  35.         {
  36.                 ReadTimeFlag=0;
  37.                 Read8563();
  38.                 keydate=ScanKey();

  39.         }

  40.         if(SetFlag==0&&xs==0) TM1637_display((time_buf1[4]/10),(time_buf1[4]%10),(time_buf1[5]/10),(time_buf1[5]%10),Flash,(LD));  //非设置状态,正常显示  时:分
  41.         if(SetFlag==0&&xs==1)        TM1637_display((2),(0),(time_buf1[1]/10),(time_buf1[1]%10),0,(LD));                                  //20xx年
  42.         if(SetFlag==0&&xs==2)        TM1637_display((time_buf1[2]/10),(time_buf1[2]%10),(time_buf1[3]/10),(time_buf1[3]%10),1,(LD));      //月:日
  43.         if(SetFlag==0&&xs==3)        TM1637_display((time_buf1[7]),(21),(time_buf1[6]/10),(time_buf1[6]%10),1,(LD));                      //周空秒

  44.                
  45.         switch(SetFlag)        //以下是设置状态
  46.         {
  47.                 case 1:
  48.                 {
  49.                 if(Flash)        TM1637_display((2),(0),(time_buf1[1]/10),(time_buf1[1]%10),0,(LD));
  50.           else TM1637_display((2),(0),(21),(21),0,(LD));
  51.                        
  52.                 if(keyvalue==2&&SetFlag==1) //年+
  53.            {
  54.              Set(1,0);
  55.              keyvalue=0;
  56.      }
  57.                 if(keyvalue==3&&SetFlag==1) //年-
  58.            {
  59.              Set(1,1);
  60.              keyvalue=0;
  61.            }
  62.                 }
  63.                 break;

  64.                 case 2:
  65.                 {
  66.                 if(Flash)        TM1637_display((11),(21),(time_buf1[2]/10),(time_buf1[2]%10),1,(LD));
  67.           else TM1637_display((11),(21),(21),(21),1,(LD));
  68.        
  69.                 if(keyvalue==2&&SetFlag==2) //月+
  70.            {
  71.              Set(2,0);
  72.              keyvalue=0;
  73.      }
  74.                 if(keyvalue==3&&SetFlag==2) //月-
  75.            {
  76.              Set(2,1);
  77.              keyvalue=0;
  78.            }
  79.                 }
  80.                 break;
  81.                
  82.                 case 3:
  83.                 {
  84.                 if(Flash)        TM1637_display((13),(21),(time_buf1[3]/10),(time_buf1[3]%10),1,(LD));
  85.           else TM1637_display((13),(21),(21),(21),1,(LD));
  86.        
  87.                 if(keyvalue==2&&SetFlag==3) //日+
  88.            {
  89.              Set(3,0);
  90.              keyvalue=0;
  91.      }
  92.                 if(keyvalue==3&&SetFlag==3) //日-
  93.            {
  94.              Set(3,1);
  95.              keyvalue=0;
  96.            }
  97.                 }
  98.                 break;
  99.                
  100.                 case 4:
  101.                 {
  102.                 if(Flash)        TM1637_display((16),(21),(time_buf1[4]/10),(time_buf1[4]%10),1,(LD));
  103.           else TM1637_display((16),(21),(21),(21),1,(LD));
  104.        
  105.                 if(keyvalue==2&&SetFlag==4) //时+
  106.            {
  107.              Set(4,0);
  108.              keyvalue=0;
  109.      }
  110.                 if(keyvalue==3&&SetFlag==4) //时-
  111.            {
  112.              Set(4,1);
  113.              keyvalue=0;
  114.            }
  115.                 }
  116.                 break;
  117.                
  118.                 case 5:
  119.                 {
  120.                 if(Flash)        TM1637_display((15),(21),(time_buf1[5]/10),(time_buf1[5]%10),1,(LD));
  121.           else TM1637_display((15),(21),(21),(21),1,(LD));
  122.        
  123.                 if(keyvalue==2&&SetFlag==5) //分+
  124.            {
  125.              Set(5,0);
  126.              keyvalue=0;
  127.      }
  128.                 if(keyvalue==3&&SetFlag==5) //分-
  129.            {
  130.              Set(5,1);
  131.              keyvalue=0;
  132.            }
  133.                 }
  134.                 break;
  135.                
  136.                 case 6:
  137.                 {
  138.                 if(Flash)        TM1637_display((5),(21),(time_buf1[6]/10),(time_buf1[6]%10),1,(LD));
  139.           else TM1637_display((5),(21),(21),(21),1,(LD));
  140.        
  141.                 if(keyvalue==2&&SetFlag==6) //秒+
  142.            {
  143.              Set(6,0);
  144.              keyvalue=0;
  145.      }
  146.                 if(keyvalue==3&&SetFlag==6) //秒-
  147.            {
  148.              Set(6,1);
  149.              keyvalue=0;
  150.            }
  151.                 }
  152.                 break;

  153.         }
  154.                
  155. }
  156. /*------------------------------------------------
  157.                     定时器初始化子程序
  158. ------------------------------------------------*/
  159. void Init_Timer0(void)
  160. {
  161. TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
  162. EA=1;            //总中断打开
  163. ET0=1;           //定时器中断打开
  164. TR0=1;           //定时器开关打开
  165. }
  166. /*------------------------------------------------
  167.                  定时器中断子程序
  168. ------------------------------------------------*/
  169. void Timer0_isr(void) interrupt 1
  170. {
  171. static unsigned int num,a;
  172. TH0=(65536-50000)/256;                  //重新赋值 50ms
  173. TL0=(65536-50000)%256;

  174. num++;
  175. re_disp++;
  176. if(num==2)        //大致100ms
  177.    {
  178.     num=0;
  179.     ReadTimeFlag=1; //读标志位置1
  180.           a++;
  181.         }
  182.          
  183.         if(a==5)
  184.         {
  185.                 a=0;
  186.                 Flash=~Flash;
  187.         }
  188.                 if(re_disp==200)
  189.         {
  190.                 re_disp=0;
  191.                 SetFlag=0;
  192.         }

  193. }
  194. /*------------------------------------------------
  195.             键盘检测函数
  196. ------------------------------------------------*/
  197. void Scan_Key(void)    //键盘检测函数
  198. {
  199.         keydate=0xff;

  200.   Displsy_Time();    //程序开头调用显示函数
  201.        
  202.         if(keydate==0xef)
  203.     {
  204.                  re_disp=0;    //清除记数,重新开始10s定时
  205.      SetFlag++;
  206.      if(SetFlag>6)SetFlag=0;
  207.     }

  208.         if(keydate==0xed)
  209.      {
  210.        re_disp=0;      //清除记数,重新开始10s定时
  211.        keyvalue=2;     //跳到加减判断函数,下同
  212.                          
  213.                          if(SetFlag==0)
  214.                          {
  215.                                  xs++;
  216.                                  if(xs>3)xs=0;
  217.                          }
  218.      }
  219.    
  220.         if(keydate==0xee)
  221.      {
  222.        re_disp=0;
  223.        keyvalue=3;
  224.                          
  225.                          if(SetFlag==0)
  226.                          {
  227.                                  LD++;
  228.                                  if(LD>7)LD=0;
  229.                          }
  230.      }
  231. }

  232. /*-------------------------------------------------------
  233. //根据选择调整相应项目并写入DS3231
  234. --------------------------------------------------------*/
  235. void Set(unsigned char sel,unsigned char selby)  //执行调整项目的函数
  236. {
  237.     uchar max,mini;

  238.     if(sel==6)  {max=59;mini=0;}    //秒
  239.     if(sel==5)  {max=59;mini=0;}    //分钟
  240.     if(sel==4)  {max=23;mini=0;}    //小时

  241.           if(time_buf1[2]==2)           //日
  242.                 {
  243.                         if(runnian())
  244.                         {
  245.                                 if(sel==3)  {max=29;mini=1;}
  246.                         }
  247.                         else
  248.                         {
  249.                                 if(sel==3)  {max=28;mini=1;}
  250.                         }
  251.                 }
  252.                  if(time_buf1[2]==1|time_buf1[2]==3|time_buf1[2]==5|time_buf1[2]==7|time_buf1[2]==8|time_buf1[2]==10|time_buf1[2]==12)
  253.                    {   
  254.                            if(sel==3)  {max=31;mini=1;}
  255.                    }
  256.                  if(time_buf1[2]==4|time_buf1[2]==6|time_buf1[2]==9|time_buf1[2]==11)
  257.                    {   
  258.                     if(sel==3)  {max=30;mini=1;}
  259.                    }
  260.                
  261.     if(sel==2)  {max=12;mini=1;}    //月
  262.     if(sel==1)  {max=25;mini=15;}    //年

  263.           if (selby==0) time_buf1[sel]++;  else time_buf1[sel]--;
  264.           if(time_buf1[sel]>max) time_buf1[sel]=mini;   
  265.           if(time_buf1[sel]<mini) time_buf1[sel]=max;
  266.     Write8563();
  267.                 autoweek();
  268. }
复制代码

所有资料51hei提供下载:
TM1637PCF8563四数码管时钟.rar (55.25 KB, 下载次数: 195)

评分

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

查看全部评分

回复

使用道具 举报

ID:35873 发表于 2019-11-29 02:09 | 显示全部楼层
不错  楼主上个完整电路图呗
回复

使用道具 举报

ID:638375 发表于 2019-11-30 22:14 | 显示全部楼层
看到电路板都晕了!!厉害啊
回复

使用道具 举报

ID:410680 发表于 2020-2-21 19:42 | 显示全部楼层
谢谢分享,正好需要研究一下,下载下来试试
回复

使用道具 举报

ID:410680 发表于 2020-2-21 19:44 | 显示全部楼层
非常给力,谢谢楼主,先看看
回复

使用道具 举报

ID:119642 发表于 2020-7-2 10:14 | 显示全部楼层
这个真的挺好的。纯手工
回复

使用道具 举报

ID:745362 发表于 2021-2-25 13:31 来自手机 | 显示全部楼层
PCF变成了DS
回复

使用道具 举报

ID:590050 发表于 2021-11-18 16:14 | 显示全部楼层
PCF8563和DS1302那个好用
回复

使用道具 举报

ID:982352 发表于 2021-11-18 21:28 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:242298 发表于 2022-1-25 06:10 | 显示全部楼层
这按键都没有怎么玩
回复

使用道具 举报

ID:71233 发表于 2022-2-5 09:20 | 显示全部楼层
hzh173 发表于 2021-11-18 16:14
PCF8563和DS1302那个好用

应该是PCF8563吧,虽然我从来都没有用过PCF8563。
回复

使用道具 举报

ID:155606 发表于 2023-3-5 20:58 | 显示全部楼层
注释里面怎么有这个型号://根据选择调整相应项目并写入DS3231,难道是通用的吗?
回复

使用道具 举报

ID:86421 发表于 2023-3-6 08:57 | 显示全部楼层
注释里有没有改彻底的。PCF与DS3231不能通用的,好多地址不一样的。但也都差不多,改改就是了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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