使用LCD2004+DS1302+STC89C52制作的数字钟
数字钟正面
数字钟电路板布线
数字钟电路板
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
附近有程序+仿真图
单片机源程序如下:
- /**********引用文件**********/
- #include <intrins.h> //函数,应用于程序设计
- #include <stdio.h> //标准输入输出
- #include <math.h> //常用的一些数学运算
- #include <REG52.H> //单片机头文件
- #include "1.Delay.h"
- #include "2.Timer0.h"
- #include "3.LCD2004.h"
- #include "4.DS1302.h"
- #include "5.Key.h"
-
- unsigned char KeyNum; //按键值
- unsigned char MODE; //模式
- unsigned char TimeSetSelect; //设置选择位
- unsigned char TimeSetFlashFlag; //闪烁标志位
- void TimeShow(void) //时间显示功能
- {
- DS1302_ReadTime(); //读取时间
- LCD_ShowNum(2,6,DS1302_Time[0],2); //显示年
- LCD_ShowNum(2,11,DS1302_Time[1],2); //显示月
- LCD_ShowNum(2,16,DS1302_Time[2],2); //显示日
- LCD_ShowNum(3,5,DS1302_Time[3],2); //显示时
- LCD_ShowNum(3,10,DS1302_Time[4],2); //显示分
- LCD_ShowNum(3,15,DS1302_Time[5],2); //显示秒
- switch(DS1302_Time[6])
- {
- case 1:LCD_ShowString(4,6," Monday ");break; //星期一
- case 2:LCD_ShowString(4,6," Tuesday ");break; //星期二
- case 3:LCD_ShowString(4,6,"Wednesday");break; //星期三
- case 4:LCD_ShowString(4,6," Thursday");break; //星期四
- case 5:LCD_ShowString(4,6," Friday ");break; //星期五
- case 6:LCD_ShowString(4,6," Saturday");break; //星期六
- case 7:LCD_ShowString(4,6," Sunday ");break; //星期日
- }
- }
- void TimeSet(void) //时间设置功能
- {
- if(KeyNum==2) //按键2按下
- {
- TimeSetSelect++; //设置选择位加1
- if(TimeSetSelect==7)
- {
- TimeSetSelect=0; //越界清零功能为0--6
- }
- }
- if(KeyNum==3)//按键3按下
- {
- DS1302_Time[TimeSetSelect]++; //时间设置位数值加1
- if(DS1302_Time[0]>99) //年越界判断
- {
- DS1302_Time[0]=0;
- }
- if(DS1302_Time[1]>12) //月越界判断
- {
- DS1302_Time[1]=1;
- }
- 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) //日越界判断
- {
- if(DS1302_Time[2]>31) //大月
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
- {
- if(DS1302_Time[2]>30) //小月
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==2)
- {
- if(DS1302_Time[0]%4==0) //判断闰年
- {
- if(DS1302_Time[2]>29) //闰年2月
- {
- DS1302_Time[2]=1;
- }
- }
- else
- {
- if(DS1302_Time[2]>28) //平年2月
- {
- DS1302_Time[2]=1;
- }
- }
- }
- if(DS1302_Time[3]>23) //时越界判断
- {
- DS1302_Time[3]=0;
- }
- if(DS1302_Time[4]>59) //分越界判断
- {
- DS1302_Time[4]=0;
- }
- if(DS1302_Time[5]>59) //秒越界判断
- {
- DS1302_Time[5]=0;
- }
- if(DS1302_Time[6]>7) //周越界判断
- {
- DS1302_Time[6]=1;
- }
- }
- if(KeyNum==4)//按键4按下
- {
- DS1302_Time[TimeSetSelect]--; //时间设置位数值减1
- if(DS1302_Time[0]<0) //年越界判断
- {
- DS1302_Time[0]=99;
- }
- if(DS1302_Time[1]<1) //月越界判断
- {
- DS1302_Time[1]=12;
- }
- 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) //日越界判断
- {
- if(DS1302_Time[2]<1) //大月
- {
- DS1302_Time[2]=31;
- }
- if(DS1302_Time[2]>31) //保证在进行月改变的时候,日也可以正确
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
- {
- if(DS1302_Time[2]<1) //小月
- {
- DS1302_Time[2]=30;
- }
- if(DS1302_Time[2]>30) //保证在进行月改变的时候,日也可以正确
- {
- DS1302_Time[2]=1;
- }
- }
- else if(DS1302_Time[1]==2)
- {
- if(DS1302_Time[0]%4==0) //判断闰年
- {
- if(DS1302_Time[2]<1) //闰年2月
- {
- DS1302_Time[2]=29;
- }
- if(DS1302_Time[2]>29) //保证在进行月改变的时候,日也可以以正确
- {
- DS1302_Time[2]=1;
- }
- }
- else
- {
- if(DS1302_Time[2]<1) //平年2月
- {
- DS1302_Time[2]=28;
- }
- if(DS1302_Time[2]>28)//保证在进行月改变的时候,日也可以以正确
- {
- DS1302_Time[2]=1;
- }
- }
- }
- if(DS1302_Time[3]<0) //时越界判断
- {
- DS1302_Time[3]=23;
- }
- if(DS1302_Time[4]<0) //分越界判断
- {
- DS1302_Time[4]=59;
- }
- if(DS1302_Time[5]<0) //秒越界判断
- {
- DS1302_Time[5]=59;
- }
- if(DS1302_Time[6]<1) //周越界判断
- {
- DS1302_Time[6]=7;
- }
- }
- if(TimeSetSelect==0&&TimeSetFlashFlag==1) //更新显示,根据TimeSetSelect(设置时间模式)和TimeSetFlashFlag判断可完成闪烁功能
- {
- LCD_ShowString(2,6," ");
- }
- else
- {
- LCD_ShowNum(2,6,DS1302_Time[0],2); //显示年
- }
- if(TimeSetSelect==1&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(2,11," ");
- }
- else
- {
- LCD_ShowNum(2,11,DS1302_Time[1],2); //显示月
- }
- if(TimeSetSelect==2&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(2,16," ");
- }
- else
- {
- LCD_ShowNum(2,16,DS1302_Time[2],2); //显示日
- }
- if(TimeSetSelect==3&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(3,5," ");
- }
- else
- {
- LCD_ShowNum(3,5,DS1302_Time[3],2); //显示时
- }
- if(TimeSetSelect==4&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(3,10," ");
- }
- else
- {
- LCD_ShowNum(3,10,DS1302_Time[4],2); //显示分
- }
- if(TimeSetSelect==5&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(3,15," ");
- }
- else
- {
- LCD_ShowNum(3,15,DS1302_Time[5],2); //显示秒
- }
- if(TimeSetSelect==6&&TimeSetFlashFlag==1)
- {
- LCD_ShowString(4,6," ");
- }
- else
- {
- switch(DS1302_Time[6]) //显示周
- {
- case 1:LCD_ShowString(4,6," Monday ");break; //星期一
- case 2:LCD_ShowString(4,6," Tuesday ");break; //星期二
- case 3:LCD_ShowString(4,6,"Wednesday");break; //星期三
- case 4:LCD_ShowString(4,6," Thursday");break; //星期四
- case 5:LCD_ShowString(4,6," Friday ");break; //星期五
- case 6:LCD_ShowString(4,6," Saturday");break; //星期六
- case 7:LCD_ShowString(4,6," Sunday ");break; //星期日
- }
- }
- }
-
- void main()
- {
- LCD_Init();
- DS1302_Init();
- Timer0Init();
- LCD_ShowString(1,4,"Happy everyday");
- LCD_ShowString(2,4,"20");//静态字符初始化显示
- LCD_ShowString(2,9,"-");//静态字符初始化显示
- LCD_ShowString(2,14,"-");//静态字符初始化显示
- LCD_ShowString(3,8,":");
- LCD_ShowString(3,13,":");
- // DS1302_SetTime(); //设置初始时间,在DS1302子函数的数组中
- while(1)
- {
- KeyNum=Key();
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码与Proteus仿真下载:
Keil.rar
(45.3 KB, 下载次数: 39)
Proteus.rar
(16.71 KB, 下载次数: 20)
|