找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2308|回复: 2
收起左侧

4位0.8寸电子钟 15单片机加DS1302源程序

[复制链接]
ID:95809 发表于 2019-12-6 13:16 | 显示全部楼层 |阅读模式
没有花里胡哨的功能,电子钟安静的看个时间就可以了,需要查看日期的时候按一下显示切换键就可以了。我原来用的89c52单片机,现在把程序移植到成本更低15单片机上了。板子的下载接口同时也是电源接口,使用手机充电器供电即可,我是使用电脑的USB接口供电的。

截图11.jpg 原理图.jpg PCB3.jpg PCB2.jpg PCB1.jpg

单片机源程序如下:
#include <STC15F2K.h>
#include <DS1302.h>
#define uchar unsigned char
/********************************************************/
unsigned char code shumg[]={
        0xC0,/*0*/
        0xF9,/*1*/
        0xA4,/*2*/
        0xB0,/*3*/
        0x99,/*4*/
        0x92,/*5*/
        0x82,/*6*/
        0xF8,/*7*/
        0x80,/*8*/
        0x90,/*9*/
        0xff};
/********************************************************/                                            

sbit LED1=P1^4;        //时间指示灯
sbit LED2=P1^5;        //年月指示灯
sbit LED3=P1^6; //日周指示灯
sbit LED4=P1^0;        //冒号闪烁

sbit S1=P3^0;   //定义按键
sbit S2=P3^1;
sbit S3=P3^2;     //切换
sbit S4=P3^3;

sbit DIG1=P3^5; //数码管位选
sbit DIG2=P3^4;
sbit DIG3=P3^6;
sbit DIG4=P3^7;

char miao_num;                                   //冒号标志
/********************************************************/
unsigned char Time[]={0,0,0,0};//用来储存,时间
unsigned char Dime[]={0,0,0,0};//用来储存,年月
unsigned char Bime[]={0,0,0,0};//用来储存,日期
unsigned char flag;                       //键盘入口
/********************************************************/
SYSTEMTIME  time1;   
/********************************************************/
void keyscan();                       //按键扫描程序
void mao_hao();                                         //冒号声明
/********************************************************/
void delay(unsigned char i)      //延时子程序  
{
  unsigned char j;
  while((i--)!=0)
  {
    for(j=123;j>0;j--);
  }
}
/********************************************************/
void t0_init()                        //定时50ms一个中断
{
  TMOD=0x11;                                                  //总中断初始化
  TH0=0x3c;                                          //定时50ms一个中断
  TL0=0xb0;                                          //定时50ms一个中断
  EA=1;                                                                  //开启总中断
  ET0=1;                                                        
  TR0=1;                                                          //开启定时器0
}
/********************************************************/
unsigned char button_time(n,x,y)        //时钟调整子程序
unsigned char n,x,y;
{
if(S1==0)                                                        //加
  {
  delay(50);
if(S1==0)
{
n++;
if(n==x)
  n=0;
while(S1==0);
   }
}
/********************************************************/
if(S2==0)                                                //减
    {
   delay(50);
if(S2==0)
    {
if(n==0)
   n=y;
else
    n--;                                                
  while(S2==0);
    }
}
return n;                                                   //函数返回
}
/********************************************************/
void display(shi10,shi1,fen10,fen1)//显示子程序
{
  DIG1=0;
P2=shumg[shi10];   //显示时的十位
  delay(1);                        //延时
P2=0xff;                        //消隐
  DIG1=1;                         //消隐

  DIG2=0;
P2=shumg[shi1];        //显示时的个位
  delay(1);                        //延时
  DIG2=1;                        //消隐
P2=0xff;                        //消隐                                                         

  DIG3=0;
P2=shumg[fen10];  //显示分的十位
  delay(1);                        //延时
  DIG3=1;                        //消隐
P2=0xff;                        //消隐

  DIG4=0;
P2=shumg[fen1];        //显示分的个位
  delay(1);                        //延时
  DIG4=1;                        //消隐
P2=0xff;                    //消隐
}
/********************************************************/
void main()                                                        //主程序
{  
   Initial_DS1302();                                 //初始化DS1302这个时钟芯片,   
   t0_init();                                                 //中断初始化
   while(1)                                                         //大循环   
   {                                                                 
   mao_hao();                                                 //冒号初始化
          keyscan();                                         //键盘初始化

  DS1302_GetTime(&time1);                       //读取时间参数            

  Bime[3]=(time1.Week)%10;                   //把时的个位数据存入Bime[3]
  Bime[2]=(time1.Week)/10;                         //把时的个位数据存入Bime[2]
  Bime[1]=(time1.Day)%10;                       //把时的个位数据存入Bime[1]
  Bime[0]=(time1.Day)/10;                     //把时的个位数据存入Bime[0]

  Dime[3]=(time1.Month)%10;                   //把时的个位数据存入Dime[3]
  Dime[2]=(time1.Month)/10;                         //把时的个位数据存入Dime[2]
  Dime[1]=(time1.Year)%10;                   //把时的个位数据存入Dime[1]
  Dime[0]=(time1.Year)/10;                         //把时的个位数据存入Dime[0]

  Time[3]=(time1.Minute)%10;                 //把分的个位数据存入Time[3]
  Time[2]=(time1.Minute)/10;                 //把分的十位数据存入Time[2]
  Time[1]=(time1.Hour)%10;                   //把时的个位数据存入Time[1]
  Time[0]=(time1.Hour)/10;                         //把时的十位数据存入Time[0]
}
}
/*******************************************************/
void keyscan()                                //按键扫描程序
{
    if(S3==0)                                    //切换程序
        {
         delay(50);
        if(S3==0)
           {
           TR0=0;                                                        //有按键按下关闭定时器0
                miao_num=0;                                         //冒号常亮
                 flag++;
                if(flag>2)                                                //翻页年月日周按两次后启动定时器
                        {
                 flag=0;
                   TR0=1;                                                //启动定时器0
                        }
                }
        while(S3==0);
        }
/*******************************************************/
        if(S4==0)                                    //设置程序
        {
         delay(50);
        if(S4==0)
           {
          TR0=0;                                                        //有按键按下关闭定时器0
           miao_num=0;                                                //冒号常亮
                flag++;                                                        
            if(flag>2)                                                //按两次后启动定时器
           {
           TR0=1;                                                        //启动定时器0
                }
          if(flag>4)                                                //按四次后关闭定时器
           {
           TR0=0;                                                        //关闭定时器0
                miao_num=0;                                                //冒号常亮
                }
        if(flag>8)                                                        //显示多少位和翻页按八次启动定时器
                        {
                 flag=0;
                  TR0=1;                                                //启动定时器0
                        }
                }
        while(S4==0);
        }
switch(flag)
        {
/*******************************************************/
                        
        case 0:display(Time[0],Time[1],Time[2],Time[3]);                //调用子函数display,把存入数组time的数据给显示出来
                        LED1=0;
                        LED3=1;
                        break;
        case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]);                //调用子函数display,把存入数组Dime的数据给显示出来
                        LED1=1;
                        LED2=0;
                        break;
        case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]);                //调用子函数display,把存入数组Bime的数据给显示出来
                        LED2=1;
                        LED3=0;
                        break;
/*******************************************************/        
        case 3:time1.Hour=button_time(time1.Hour,24,23);                //调整时                           
                        DS1302_SetTime(0x84,time1.Hour);
                        display(Time[0],Time[1],10,10);
                        LED1=0;
                        LED3=1;
                        break;

    case 4:time1.Minute=button_time(time1.Minute,60,59);        //调整分                           
                        DS1302_SetTime(0x82,time1.Minute);
                        display(10,10,Time[2],Time[3]);
                        LED1=0;
                        LED3=1;
                        break;
/*******************************************************/
               
        case 5:time1.Year=button_time(time1.Year,100,99);                //调整年                           
                        DS1302_SetTime(0x8c,time1.Year);
                        display(Dime[0],Dime[1],10,10);
                        LED1=1;
                        LED2=0;
                        break;
        
        case 6:time1.Month=button_time(time1.Month,13,12);                //调整月                           
                        DS1302_SetTime(0x88,time1.Month);
                        display(10,10,Dime[2],Dime[3]);
                        LED1=1;
                        LED2=0;
                        break;
/********************************************************/        
                                         
           case 7:time1.Day=button_time(time1.Day,32,31);                        //调整日
                        DS1302_SetTime(0x86,time1.Day);
                        display(Bime[0],Bime[1],10,10);
                        LED2=1;
                        LED3=0;
                        break;
        
        case 8:time1.Week=button_time(time1.Week,8,7);                        //调整周
                        DS1302_SetTime(0x8a,time1.Week);
                        display(10,10,Bime[2],Bime[3]);
                        LED2=1;
                        LED3=0;
                        break;
    }
}
/*******************************************************/
void t0_timer() interrupt 1                                //冒号中断赋值
{
      TH0=0x3c;
      TL0=0xb0;
      miao_num++;
}
/*******************************************************/
void mao_hao()                                        //冒号子程序
{
if(miao_num>=20)
   {
   miao_num=0;
   }
   if(miao_num<10)
     LED4=0;
         if(miao_num>=10)
          LED4=1;
}

完整代码51hei下载地址:
15版.rar (29.83 KB, 下载次数: 41)
回复

使用道具 举报

ID:475402 发表于 2019-12-13 17:26 | 显示全部楼层
学习并支持
回复

使用道具 举报

ID:315554 发表于 2020-3-2 17:53 | 显示全部楼层
好象下过,再下,谢谢楼主,测试一下!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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