找回密码
 立即注册
查看: 37|回复: 2

10-2 DS1302可调时钟,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准

[复制链接]
  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:14:09 | 显示全部楼层 |阅读模式
10-2 DS1302可调时钟,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
主程序main.C代码如下:


#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "Key.h"
#include "Timer0.h"

unsigned char KeyNum,MODE,TimeSetSelect,TimeSetFlashFlag;

void TimeShow(void)//时间显示功能
{
        DS1302_ReadTime();//读取时间
        LCD_ShowNum(1,1,DS1302_Time[0],2);//显示年
        LCD_ShowNum(1,4,DS1302_Time[1],2);//显示月
        LCD_ShowNum(1,7,DS1302_Time[2],2);//显示日
        LCD_ShowNum(2,1,DS1302_Time[3],2);//显示时
        LCD_ShowNum(2,4,DS1302_Time[4],2);//显示分
        LCD_ShowNum(2,7,DS1302_Time[5],2);//显示秒
}

void TimeSet(void)//时间设置功能
{
        if(KeyNum==2)//按键2按下
        {
                TimeSetSelect++;//设置选择位加1
                TimeSetSelect%=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){DS1302_Time[2]=1;}//闰年2月
                        }
                        else
                        {
                                if(DS1302_Time[2]>28){DS1302_Time[2]=1;}//平年2月
                        }
                }
                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(KeyNum==4)//按键3按下
        {
                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){DS1302_Time[2]=29;}//闰年2月
                                if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
                        }
                        else
                        {
                                if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
                                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;}//秒越界判断
        }
        //更新显示,根据TimeSetSelect和TimeSetFlashFlag判断可完成闪烁功能
        if(TimeSetSelect==0 && TimeSetFlashFlag==1){LCD_ShowString(1,1,"  ");}
        else {LCD_ShowNum(1,1,DS1302_Time[0],2);}
        if(TimeSetSelect==1 && TimeSetFlashFlag==1){LCD_ShowString(1,4,"  ");}
        else {LCD_ShowNum(1,4,DS1302_Time[1],2);}
        if(TimeSetSelect==2 && TimeSetFlashFlag==1){LCD_ShowString(1,7,"  ");}
        else {LCD_ShowNum(1,7,DS1302_Time[2],2);}
        if(TimeSetSelect==3 && TimeSetFlashFlag==1){LCD_ShowString(2,1,"  ");}
        else {LCD_ShowNum(2,1,DS1302_Time[3],2);}
        if(TimeSetSelect==4 && TimeSetFlashFlag==1){LCD_ShowString(2,4,"  ");}
        else {LCD_ShowNum(2,4,DS1302_Time[4],2);}
        if(TimeSetSelect==5 && TimeSetFlashFlag==1){LCD_ShowString(2,7,"  ");}
        else {LCD_ShowNum(2,7,DS1302_Time[5],2);}
}

void main()
{
        LCD_Init();
        DS1302_Init();
        Timer0Init();
        LCD_ShowString(1,1,"  -  -  ");//静态字符初始化显示
        LCD_ShowString(2,1,"  :  :  ");
        
        DS1302_SetTime();//设置时间
        
        while(1)
        {
                KeyNum=Key();//读取键码
                if(KeyNum==1)//按键1按下
                {
                        if(MODE==0){MODE=1;TimeSetSelect=0;}//功能切换
                        else if(MODE==1){MODE=0;DS1302_SetTime();}
                }
                switch(MODE)//根据不同的功能执行不同的函数
                {
                        case 0:TimeShow();break;
                        case 1:TimeSet();break;
                }
        }
}

void Timer0_Routine() interrupt 1
{
        static unsigned int T0Count;
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        T0Count++;
        if(T0Count>=500)//每500ms进入一次
        {
                T0Count=0;
                TimeSetFlashFlag=!TimeSetFlashFlag;//闪烁标志位取反
        }
}


10-2 DS1302可调时钟.zip

63.05 KB, 下载次数: 2

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:14:54 | 显示全部楼层
10-2 DS1302可调时钟,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
Key.C代码如下:

#include <REGX52.H>
#include "Delay.h"

/**
  * @brief  获取独立按键键码
  * @param  无
  * @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
  */
unsigned char Key()
{
        unsigned char KeyNumber=0;
       
        if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
        if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
        if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
        if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
       
        return KeyNumber;
}


回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:80
  • 最近打卡:2026-07-23 09:36:34
已绑定手机

231

主题

172

回帖

1081

积分

版主

积分
1081
发表于 2026-7-13 13:15:50 | 显示全部楼层
10-2 DS1302可调时钟,江协科技讲普中51单片机开发板STC89C52学习板 配套程序, A2标准版
Timer0.C代码如下:

#include <REGX52.H>

/**
  * @brief  定时器0初始化,1毫秒@12.000MHz
  * @param  无
  * @retval 无
  */
void Timer0Init(void)
{
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        ET0=1;
        EA=1;
        PT0=0;
}

/*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
        static unsigned int T0Count;
        TL0 = 0x18;                //设置定时初值
        TH0 = 0xFC;                //设置定时初值
        T0Count++;
        if(T0Count>=1000)
        {
                T0Count=0;
               
        }
}
*/


回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-24 05:55 , Processed in 0.071589 second(s), 53 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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