没有花里胡哨的功能,电子钟安静的看个时间就可以了,需要查看日期的时候按一下显示切换键就可以了。我原来用的89c52单片机,现在把程序移植到成本更低15单片机上了。板子的下载接口同时也是电源接口,使用手机充电器供电即可,我是使用电脑的USB接口供电的。
单片机源程序如下:
#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, 2019-12-6 13:13 上传)
下载积分: 黑币 -5