找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD2004+DS1302+STC89C52单片机数字钟制作 附仿真代码

[复制链接]
跳转到指定楼层
楼主
使用LCD2004+DS1302+STC89C52制作的数字钟

数字钟正面


数字钟电路板布线




数字钟电路板

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

附近有程序+仿真图

单片机源程序如下:
  1. /**********引用文件**********/
  2. #include <intrins.h>        //函数,应用于程序设计
  3. #include <stdio.h>        //标准输入输出
  4. #include <math.h>        //常用的一些数学运算
  5. #include <REG52.H>        //单片机头文件

  6. #include "1.Delay.h"
  7. #include "2.Timer0.h"
  8. #include "3.LCD2004.h"
  9. #include "4.DS1302.h"
  10. #include "5.Key.h"

  11. unsigned char KeyNum;                                                        //按键值
  12. unsigned char MODE;                                                                //模式
  13. unsigned char TimeSetSelect;                        //设置选择位
  14. unsigned char TimeSetFlashFlag;                //闪烁标志位

  15. void TimeShow(void)                //时间显示功能
  16.         {
  17.                 DS1302_ReadTime();                                                                                //读取时间
  18.                 LCD_ShowNum(2,6,DS1302_Time[0],2);                //显示年
  19.                 LCD_ShowNum(2,11,DS1302_Time[1],2);                //显示月
  20.                 LCD_ShowNum(2,16,DS1302_Time[2],2);                //显示日
  21.                 LCD_ShowNum(3,5,DS1302_Time[3],2);                //显示时
  22.                 LCD_ShowNum(3,10,DS1302_Time[4],2);                //显示分
  23.                 LCD_ShowNum(3,15,DS1302_Time[5],2);                //显示秒                                
  24.                 switch(DS1302_Time[6])
  25.                         {
  26.                                 case 1:LCD_ShowString(4,6,"  Monday ");break;                //星期一
  27.                                 case 2:LCD_ShowString(4,6," Tuesday ");break;                //星期二
  28.                                 case 3:LCD_ShowString(4,6,"Wednesday");break;                //星期三
  29.                                 case 4:LCD_ShowString(4,6," Thursday");break;                //星期四
  30.                                 case 5:LCD_ShowString(4,6,"  Friday ");break;                //星期五
  31.                                 case 6:LCD_ShowString(4,6," Saturday");break;                //星期六
  32.                                 case 7:LCD_ShowString(4,6,"  Sunday ");break;                //星期日
  33.                                 }
  34.         }

  35. void TimeSet(void)                //时间设置功能
  36.         {
  37.                 if(KeyNum==2)                //按键2按下
  38.                         {
  39.                                 TimeSetSelect++;                //设置选择位加1
  40.                                 if(TimeSetSelect==7)
  41.                                         {
  42.                                                 TimeSetSelect=0;                //越界清零功能为0--6
  43.                                                 }
  44.                         }

  45.                 if(KeyNum==3)//按键3按下
  46.                         {
  47.                                 DS1302_Time[TimeSetSelect]++;                //时间设置位数值加1
  48.                                 if(DS1302_Time[0]>99)                //年越界判断
  49.                                         {
  50.                                                 DS1302_Time[0]=0;
  51.                                         }
  52.                                 if(DS1302_Time[1]>12)                //月越界判断
  53.                                         {
  54.                                                 DS1302_Time[1]=1;
  55.                                         }
  56.                                 if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12)                //日越界判断
  57.                                         {
  58.                                                 if(DS1302_Time[2]>31)                //大月
  59.                                                         {
  60.                                                                 DS1302_Time[2]=1;
  61.                                                         }
  62.                                         }
  63.                                         else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
  64.                                                 {
  65.                                                         if(DS1302_Time[2]>30)                //小月
  66.                                                                 {
  67.                                                                         DS1302_Time[2]=1;
  68.                                                                 }
  69.                                                 }
  70.                                         else if(DS1302_Time[1]==2)
  71.                                                 {
  72.                                                         if(DS1302_Time[0]%4==0)                //判断闰年
  73.                                                                 {
  74.                                                                         if(DS1302_Time[2]>29)                //闰年2月
  75.                                                                                 {
  76.                                                                                         DS1302_Time[2]=1;
  77.                                                                                 }
  78.                                                                 }
  79.                                                                 else
  80.                                                                         {
  81.                                                                                 if(DS1302_Time[2]>28)                //平年2月
  82.                                                                                         {
  83.                                                                                                 DS1302_Time[2]=1;
  84.                                                                                         }
  85.                                                                         }
  86.                                                 }
  87.                                 if(DS1302_Time[3]>23)                //时越界判断
  88.                                         {
  89.                                                 DS1302_Time[3]=0;
  90.                                         }
  91.                                 if(DS1302_Time[4]>59)                //分越界判断
  92.                                         {
  93.                                                 DS1302_Time[4]=0;
  94.                                         }
  95.                                 if(DS1302_Time[5]>59)                //秒越界判断
  96.                                         {
  97.                                                 DS1302_Time[5]=0;
  98.                                         }
  99.                                 if(DS1302_Time[6]>7)                //周越界判断
  100.                                         {
  101.                                                 DS1302_Time[6]=1;
  102.                                         }
  103.                         }

  104.                 if(KeyNum==4)//按键4按下
  105.                         {
  106.                                 DS1302_Time[TimeSetSelect]--;                //时间设置位数值减1
  107.                                 if(DS1302_Time[0]<0)                //年越界判断
  108.                                         {
  109.                                                 DS1302_Time[0]=99;
  110.                                         }
  111.                                 if(DS1302_Time[1]<1)                //月越界判断
  112.                                         {
  113.                                                 DS1302_Time[1]=12;
  114.                                         }
  115.                                 if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12)                //日越界判断
  116.                                         {
  117.                                                 if(DS1302_Time[2]<1)                //大月
  118.                                                         {
  119.                                                                 DS1302_Time[2]=31;
  120.                                                         }
  121.                                                 if(DS1302_Time[2]>31)                //保证在进行月改变的时候,日也可以正确
  122.                                                         {
  123.                                                                 DS1302_Time[2]=1;
  124.                                                         }
  125.                                         }
  126.                                         else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
  127.                                                 {
  128.                                                         if(DS1302_Time[2]<1)                //小月
  129.                                                                 {
  130.                                                                         DS1302_Time[2]=30;
  131.                                                                 }
  132.                                                         if(DS1302_Time[2]>30)                //保证在进行月改变的时候,日也可以正确
  133.                                                                 {
  134.                                                                         DS1302_Time[2]=1;
  135.                                                                 }
  136.                                                 }
  137.                                         else if(DS1302_Time[1]==2)
  138.                                                 {
  139.                                                         if(DS1302_Time[0]%4==0)                //判断闰年
  140.                                                                 {
  141.                                                                         if(DS1302_Time[2]<1)                //闰年2月
  142.                                                                                 {
  143.                                                                                         DS1302_Time[2]=29;
  144.                                                                                 }
  145.                                                                         if(DS1302_Time[2]>29)                //保证在进行月改变的时候,日也可以以正确
  146.                                                                                 {
  147.                                                                                         DS1302_Time[2]=1;
  148.                                                                                 }
  149.                                                                 }
  150.                                                                 else
  151.                                                                         {
  152.                                                                                 if(DS1302_Time[2]<1)                //平年2月
  153.                                                                                         {
  154.                                                                                                 DS1302_Time[2]=28;
  155.                                                                                         }
  156.                                                                                 if(DS1302_Time[2]>28)//保证在进行月改变的时候,日也可以以正确
  157.                                                                                         {
  158.                                                                                                 DS1302_Time[2]=1;
  159.                                                                                         }
  160.                                                                         }
  161.                                                 }
  162.                                 if(DS1302_Time[3]<0)                //时越界判断
  163.                                         {
  164.                                                 DS1302_Time[3]=23;
  165.                                         }
  166.                                 if(DS1302_Time[4]<0)                //分越界判断
  167.                                         {
  168.                                                 DS1302_Time[4]=59;
  169.                                         }
  170.                                 if(DS1302_Time[5]<0)                //秒越界判断
  171.                                         {
  172.                                                 DS1302_Time[5]=59;
  173.                                         }
  174.                                 if(DS1302_Time[6]<1)                //周越界判断
  175.                                         {
  176.                                                 DS1302_Time[6]=7;
  177.                                         }
  178.                         }

  179.                         if(TimeSetSelect==0&&TimeSetFlashFlag==1)                //更新显示,根据TimeSetSelect(设置时间模式)和TimeSetFlashFlag判断可完成闪烁功能
  180.                                 {
  181.                                         LCD_ShowString(2,6,"  ");
  182.                                 }
  183.                                 else
  184.                                         {
  185.                                                 LCD_ShowNum(2,6,DS1302_Time[0],2);                //显示年
  186.                                                 }
  187.                         if(TimeSetSelect==1&&TimeSetFlashFlag==1)
  188.                                 {
  189.                                         LCD_ShowString(2,11,"  ");
  190.                                 }
  191.                                 else
  192.                                         {
  193.                                                 LCD_ShowNum(2,11,DS1302_Time[1],2);                //显示月
  194.                                                 }
  195.                         if(TimeSetSelect==2&&TimeSetFlashFlag==1)
  196.                                 {
  197.                                         LCD_ShowString(2,16,"  ");
  198.                                 }
  199.                                 else
  200.                                         {
  201.                                                 LCD_ShowNum(2,16,DS1302_Time[2],2);                //显示日
  202.                                         }
  203.                         if(TimeSetSelect==3&&TimeSetFlashFlag==1)
  204.                                 {
  205.                                         LCD_ShowString(3,5,"  ");
  206.                                 }
  207.                                 else
  208.                                         {
  209.                                                 LCD_ShowNum(3,5,DS1302_Time[3],2);                //显示时
  210.                                                 }
  211.                         if(TimeSetSelect==4&&TimeSetFlashFlag==1)
  212.                                 {
  213.                                         LCD_ShowString(3,10,"  ");
  214.                                 }
  215.                                 else
  216.                                         {
  217.                                                 LCD_ShowNum(3,10,DS1302_Time[4],2);                //显示分
  218.                                                 }
  219.                         if(TimeSetSelect==5&&TimeSetFlashFlag==1)
  220.                                 {
  221.                                         LCD_ShowString(3,15,"  ");
  222.                                 }
  223.                                 else
  224.                                         {
  225.                                                 LCD_ShowNum(3,15,DS1302_Time[5],2);                //显示秒
  226.                                         }
  227.                         if(TimeSetSelect==6&&TimeSetFlashFlag==1)
  228.                                 {
  229.                                         LCD_ShowString(4,6,"          ");
  230.                                 }
  231.                                 else
  232.                                         {
  233.                                                 switch(DS1302_Time[6])                //显示周
  234.                                                         {
  235.                                                                 case 1:LCD_ShowString(4,6,"  Monday ");break;                //星期一
  236.                                                                 case 2:LCD_ShowString(4,6," Tuesday ");break;                //星期二
  237.                                                                 case 3:LCD_ShowString(4,6,"Wednesday");break;                //星期三
  238.                                                                 case 4:LCD_ShowString(4,6," Thursday");break;                //星期四
  239.                                                                 case 5:LCD_ShowString(4,6,"  Friday ");break;                //星期五
  240.                                                                 case 6:LCD_ShowString(4,6," Saturday");break;                //星期六
  241.                                                                 case 7:LCD_ShowString(4,6,"  Sunday ");break;                //星期日
  242.                                                                 }
  243.                                         }
  244.         }

  245. void main()
  246.         {
  247.                 LCD_Init();
  248.                 DS1302_Init();
  249.                 Timer0Init();
  250.                 LCD_ShowString(1,4,"Happy everyday");
  251.                 LCD_ShowString(2,4,"20");//静态字符初始化显示
  252.                 LCD_ShowString(2,9,"-");//静态字符初始化显示
  253.                 LCD_ShowString(2,14,"-");//静态字符初始化显示
  254.                 LCD_ShowString(3,8,":");
  255.                 LCD_ShowString(3,13,":");
  256. //        DS1302_SetTime();                //设置初始时间,在DS1302子函数的数组中
  257.                 while(1)
  258.                         {
  259.                                 KeyNum=Key();
  260. ……………………

  261. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码与Proteus仿真下载:
Keil.rar (45.3 KB, 下载次数: 36)
Proteus.rar (16.71 KB, 下载次数: 19)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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