|
沒有花里胡哨的功能,電子鐘安靜的看個時間就可以了,需要查看日期的時候按一下顯示切換鍵就可以了。我原來用的89c52單片機,現(xiàn)在把程序移植到成本更低15單片機上了。板子的下載接口同時也是電源接口,使用手機充電器供電即可,我是使用電腦的USB接口供電的。
截圖11.jpg (25.67 KB, 下載次數(shù): 36)
下載附件
2019-12-6 13:10 上傳
原理圖.jpg (58.31 KB, 下載次數(shù): 31)
下載附件
2019-12-6 13:10 上傳
PCB3.jpg (52.86 KB, 下載次數(shù): 41)
下載附件
2019-12-6 13:10 上傳
PCB2.jpg (41.15 KB, 下載次數(shù): 41)
下載附件
2019-12-6 13:10 上傳
PCB1.jpg (63.26 KB, 下載次數(shù): 31)
下載附件
2019-12-6 13:10 上傳
單片機源程序如下:
#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; //數(shù)碼管位選
sbit DIG2=P3^4;
sbit DIG3=P3^6;
sbit DIG4=P3^7;
char miao_num; //冒號標(biāo)志
/********************************************************/
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) //時鐘調(diào)整子程序
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; //函數(shù)返回
}
/********************************************************/
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) //大循環(huán)
{
mao_hao(); //冒號初始化
keyscan(); //鍵盤初始化
DS1302_GetTime(&time1); //讀取時間參數(shù)
Bime[3]=(time1.Week)%10; //把時的個位數(shù)據(jù)存入Bime[3]
Bime[2]=(time1.Week)/10; //把時的個位數(shù)據(jù)存入Bime[2]
Bime[1]=(time1.Day)%10; //把時的個位數(shù)據(jù)存入Bime[1]
Bime[0]=(time1.Day)/10; //把時的個位數(shù)據(jù)存入Bime[0]
Dime[3]=(time1.Month)%10; //把時的個位數(shù)據(jù)存入Dime[3]
Dime[2]=(time1.Month)/10; //把時的個位數(shù)據(jù)存入Dime[2]
Dime[1]=(time1.Year)%10; //把時的個位數(shù)據(jù)存入Dime[1]
Dime[0]=(time1.Year)/10; //把時的個位數(shù)據(jù)存入Dime[0]
Time[3]=(time1.Minute)%10; //把分的個位數(shù)據(jù)存入Time[3]
Time[2]=(time1.Minute)/10; //把分的十位數(shù)據(jù)存入Time[2]
Time[1]=(time1.Hour)%10; //把時的個位數(shù)據(jù)存入Time[1]
Time[0]=(time1.Hour)/10; //把時的十位數(shù)據(jù)存入Time[0]
}
}
/*******************************************************/
void keyscan() //按鍵掃描程序
{
if(S3==0) //切換程序
{
delay(50);
if(S3==0)
{
TR0=0; //有按鍵按下關(guān)閉定時器0
miao_num=0; //冒號常亮
flag++;
if(flag>2) //翻頁年月日周按兩次后啟動定時器
{
flag=0;
TR0=1; //啟動定時器0
}
}
while(S3==0);
}
/*******************************************************/
if(S4==0) //設(shè)置程序
{
delay(50);
if(S4==0)
{
TR0=0; //有按鍵按下關(guān)閉定時器0
miao_num=0; //冒號常亮
flag++;
if(flag>2) //按兩次后啟動定時器
{
TR0=1; //啟動定時器0
}
if(flag>4) //按四次后關(guān)閉定時器
{
TR0=0; //關(guān)閉定時器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]); //調(diào)用子函數(shù)display,把存入數(shù)組time的數(shù)據(jù)給顯示出來
LED1=0;
LED3=1;
break;
case 1:display(Dime[0],Dime[1],Dime[2],Dime[3]); //調(diào)用子函數(shù)display,把存入數(shù)組Dime的數(shù)據(jù)給顯示出來
LED1=1;
LED2=0;
break;
case 2:display(Bime[0],Bime[1],Bime[2],Bime[3]); //調(diào)用子函數(shù)display,把存入數(shù)組Bime的數(shù)據(jù)給顯示出來
LED2=1;
LED3=0;
break;
/*******************************************************/
case 3:time1.Hour=button_time(time1.Hour,24,23); //調(diào)整時
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); //調(diào)整分
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); //調(diào)整年
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); //調(diào)整月
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); //調(diào)整日
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); //調(diào)整周
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, 下載次數(shù): 41)
2019-12-6 13:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|