新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用51單片機(jī)做的電子時(shí)鐘

用51單片機(jī)做的電子時(shí)鐘

作者: 時(shí)間:2016-11-23 來源:網(wǎng)絡(luò) 收藏

程序如下:
#include
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x76};//字碼表0-9,最后一個(gè)是一橫"-"
unsigned int i,a,b,c,d,flag,flag1;
unsigned int sec,min,h,nm,nh,nz;
unsigned int w,day,mon,year;
int miao1,miao2,miao3;
sbit keyled=P1^0;
sbit key2=P1^1;
sbit keyinc=P1^2;
sbit keymood=P1^3;
sbit BEEP=P1^4;
void second();
void minute();
void hour();
void time();
void riqi();
void xianshi();
void delay10ms();
void delay20ms();
void tiaoshi();
void miaobiao();
void miaotime();
void week();
void naozhong();
void shengyin();
//前幾天剛用了下定時(shí)器,想起來之前用匯編寫的時(shí)鐘程序基本沒有什么功能,所以這幾天就用C再寫了下
//這個(gè)時(shí)鐘的功能是模仿我自己的手表寫的,功能完全一樣,有秒表,鬧鐘,可以顯示年月日及星期
/
{
if(min==nm&&h==nh)//時(shí)間到了,鬧鐘響
{
shengyin(); //鬧鐘的聲音程序
}
}
if(c==0||c==2)
{
if(keymood==0)
{
miao1=0;
miao2=0;
miao3=0;
}
}
while(b==1)//保證按鍵只按一次,沒有重復(fù)按鍵
{tiaoshi();
goto B1; //如果b還等于1,剛重復(fù)掃描秒表界面
}
}
/
{ i=0;//將i清零,保證每次進(jìn)入都是一樣的
B2:if(nz==0)
{ if(min==nm&&h==nh)
{
shengyin();
}
}
naozhong();
while(b==2)
{ tiaoshi();
goto B2;
}
}
/
{ i=1;
B3:if(nz==0)
{ if(min==nm&&h==nh)
{
shengyin();
}
}
xianshi(); //顯示程序,用i的大小來分配,相當(dāng)于調(diào)時(shí)、分、秒就顯示時(shí)間,調(diào)年月日就顯示日期
while(b==3)
{tiaoshi();
goto B3;
}
}
/
{i=0;
if(nz==0)
{ if(min==nm&&h==nh)
{
shengyin();
}
}
second();
minute();
hour();
}
if(keyinc==0)
{ delay10ms();
if(keyinc==0)
{
B: riqi();
while(keyinc==0)
{
goto B;
}
}
}
if(keymood==0)
{
delay10ms();
if(keymood==0)
{
N: naozhong();
}
while(keymood==0)
{
goto N;
}
}
tiaoshi();
/
{
if(flag>10) //在flag>10的時(shí)候關(guān)閉所有的數(shù)碼管,其他時(shí)間開啟相應(yīng)位,這樣就可以達(dá)到閃爍的目的了
{
P3=0xff;
}
else
{
P3=0x7f;
}
}
else //如果i不等于1,剛正常顯示,不會閃爍
{
P3=0x7f;
}
P2=table1[secge];
for(a=0;a<100;a++);
if(i==1)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xbf;
}
}
else//如果i不等于1,剛正常顯示,不會閃爍
{
P3=0xbf;
}
P2=table1[secshi];
for(a=0;a<100;a++);
P3=0xdf;
P2=table1[10];
for(a=0;a<100;a++);
}
//*******************************分顯示程序***************************
void minute()
{
int minge,minshi;
minge=min%10;
minshi=min/10;


if(i==2)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xef;
}
}
else
{
P3=0xef;
}
P2=table1[minge];
for(a=0;a<100;a++);

if(i==2)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xf7;
}
}
else
{
P3=0xf7;
}
P2=table1[minshi];
for(a=0;a<100;a++);
P3=0xfb;
P2=table1[10];
for(a=0;a<100;a++);
}
//*********************************時(shí)顯示程序*************************
void hour()
{
int hourge,hourshi;
hourge=h%10;
hourshi=h/10;

if(i==3)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xfd;
}
}
else
{
P3=0xfd;
}
P2=table1[hourge];
for(a=0;a<100;a++);
if(i==3)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xfe;
}
}
else
{
P3=0xfe;
}
P2=table1[hourshi];
for(a=0;a<100;a++);
}
//*****************************年、月、日顯示程序************************
void riqi()
{
int dayge,dayshi;
int monge,monshi;
int yearge,yearshi;
dayge=day%10;
dayshi=day/10;
if(i==4)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0x7f;
}
}
else
{
P3=0x7f;
}
P2=table1[dayge];
for(a=0;a<100;a++);
if(i==4)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xbf;
}
}
else
{
P3=0xbf;
}
P2=table1[dayshi];
for(a=0;a<100;a++);
P3=0xdf;
P2=table1[10];
for(a=0;a<100;a++);
monge=mon%10;
monshi=mon/10;
if(i==5)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xef;
}
}
else
{
P3=0xef;
}
P2=table1[monge];
for(a=0;a<100;a++);
if(i==5)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xf7;
}
}
else
{
P3=0xf7;
}
P2=table1[monshi];
for(a=0;a<100;a++);
P3=0xfb;
P2=table1[10];
for(a=0;a<100;a++);
yearge=year%10;
yearshi=year/10;
if(i==6)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xfd;
}
}
else
{
P3=0xfd;
}
P2=table1[yearge];
for(a=0;a<100;a++);
if(i==6)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xfe;
}
}
else
{
P3=0xfe;
}
P2=table1[yearshi];
for(a=0;a<100;a++);
}
//*****************************星期顯示程序****************************
void week()
{
if(i==7)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xef;
}
}
else
{
P3=0xef;
}
P2=table1[w];
for(a=0;a<100;a++);
}
//*****************************秒表顯示程序************************
void miaobiao()
{
int miao1ge,miao1shi;
int miao2ge,miao2shi;
int miao3ge,miao3shi;
miao1ge=miao1%10;
miao1shi=miao1/10;
P3=0x7f;
P2=table1[miao1ge];
for(a=0;a<100;a++);
P3=0xbf;
P2=table1[miao1shi];
for(a=0;a<100;a++);
P3=0xdf;
P2=table1[10];
for(a=0;a<100;a++);
miao2ge=miao2%10;
miao2shi=miao2/10;
P3=0xef;
P2=table1[miao2ge];
for(a=0;a<100;a++);
P3=0xf7;
P2=table1[miao2shi];
for(a=0;a<100;a++);
P3=0xfb;
P2=table1[10];
for(a=0;a<100;a++);
miao3ge=miao3%10;
miao3shi=miao3/10;
P3=0xfd;
P2=table1[miao3ge];
for(a=0;a<100;a++);
P3=0xfe;
P2=table1[miao3shi];
for(a=0;a<100;a++);
}
//****************************鬧鐘顯示程序************************
void naozhong()
{
int nmge,nmshi;
int nhge,nhshi;
nmge=nm%10;
nmshi=nm/10;
if(i==1||i==3||i==5||i==7)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xef;
}
}
else
{
P3=0xef;
}
P2=table1[nmge];
for(a=0;a<100;a++);
if(i==1||i==3||i==5||i==7)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xf7;
}
}
else
{
P3=0xf7;
}
P2=table1[nmshi];
for(a=0;a<100;a++);
P3=0xfb;//顯示一橫
P2=table1[10];
for(a=0;a<100;a++);
nhge=nh%10;
nhshi=nh/10;
if(i==2||i==4||i==6)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xfd;
}
}
else
{
P3=0xfd;
}
P2=table1[nhge];
for(a=0;a<100;a++);
if(i==2||i==4||i==6)
{
if(flag>10)
{
P3=0xff;
}
else
{
P3=0xfe;
}
}
else
{
P3=0xfe;
}
P2=table1[nhshi];
for(a=0;a<100;a++);
P3=0xdf; //顯示H
P2=table1[11];
for(a=0;a<100;a++);
}
//*******************************調(diào)時(shí)顯示***********************
void xianshi()
{
if(i>3&&i<7)
{
riqi();
}
else if(i==7)
{
week();
}
else
{
second();
minute();
hour();
}
}
//***********************************鬧鐘聲音程序****************
void shengyin()
{
BEEP=~BEEP;
for(a=0;a<10;a++);
}
//***************************時(shí)鐘加1程序*******************************
void time()
{
if(flag==90)
{
flag=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
h++;
if(h==24)
{
h=0;
day++;
if(day==31)
{
day=0;
mon++;
if(mon==12);
{
mon=0;
year++;
}
}
}
}
}
}
}
//****************************秒表加1程序****************
// flag1標(biāo)志位主要是為秒表而設(shè)的
void miaotime()//秒表加時(shí)程序
{

if(flag1==1)
{
flag1=0;
miao1++;
if(miao1==100)
{
miao1=0;
miao2++;
if(miao2==60)
{
miao2=0;
miao3++;
if(miao3==60)
{
miao3=0;
}
}
}
}
}
//************************調(diào)時(shí)程序*******************************
void tiaoshi()//
{
if(keyinc==0&&keymood==0)
{
delay10ms();
if(keyinc==0&&keymood==0)
{
nz++;
if(nz==2)
{
nz=0;
}
}
while(keyinc==0&&keymood==0);
}
//********************
if(keymood==0)
{
delay10ms();
if(keymood==0)
{
i++;
if(i==8)
{
i=1;
}
}
while(keymood==0);
}
//******************************
if(key2==0)
{
for(a=0;a<2000;a++);
if(key2==0)
{
b++;
if(c>0||i>0)//只要調(diào)了秒表,再按一次key2鍵就可以退回到正常時(shí)間顯示界面
{
if(key2==0)
{
b=0;
c=0;
}
}
//***
if(b==4)
{
b=0;
}
}

while(key2==0);
}
//****************************************
//**********
if(b==2&&(i==1||i==3||i==5||i==7)) //調(diào)鬧鐘的分
{
if(keyinc==0)
{
nm++;
if(nm==60)
nm=0;
}
while(keyinc==0);
}
//
if(b==2&&(i==2||i==4||i==6))//調(diào)鬧鐘的時(shí)
{
if(keyinc==0)
{
nh++;
if(nh==24)
{
nh=0;
}
}
while(keyinc==0);
}
//**********************
if(b==1)
{
if(keyinc==0)
{
delay10ms();
if(keyinc==0)
{
c++;
if(c==3)
{
c=1;
}
}
while(keyinc==0);
}
}

//*******************************************************
if(i==1)
{

if(keyinc==0)
{
delay10ms();
if(keyinc==0)
{
sec=0;
}
while(keyinc==0);
}
}
if(i==2&&keyinc==0)
{
for(a=0;a<5000;a++);
if(keyinc==0)
{
min++;
}
if(min==60)
{
min=0;
}
delay10ms();
}
//***************
if(i==3&&keyinc==0)
{
for(a=0;a<5000;a++);
if(keyinc==0)
{
h++;
}
if(h==24)
{
h=0;
}
while(keyinc==0);
}
//******************
if(i==4&&keyinc==0)
{
for(a=0;a<5000;a++);
if(keyinc==0)
{
day++;
if(day==31)
{
day=0;
}
}
while(keyinc==0);
}
//
if(i==5&&keyinc==0)
{
for(a=0;a<5000;a++);
if(keyinc==0)
{
mon++;
if(mon==13)
{
mon=0;
}
}
while(keyinc==0);
}
//
if(i==6&&keyinc==0)
{
for(a=0;a<5000;a++);
if(keyinc==0)
{
year++;
}
while(keyinc==0);
}
//
if(i==7&&keyinc==0)
{
delay10ms();
if(keyinc==0)
{
w++;
}
while(keyinc==0);
}
}
//*****************************延時(shí)程序******************************
void delay10ms() //延時(shí)10MS子程序,在消除鍵盤的抖動
{
for(a=0;a<5000;a++);
}
//******************************************************
void delay20ms()//延時(shí)20MS,在調(diào)時(shí)間的時(shí)候,按下超過20MS就可以被認(rèn)為重復(fù)按鍵
{
for(a=0;a<10000;a++);
}
//*******************************中斷服務(wù)程序************************
void timer1() interrupt 3
{
TH1=(65535-10000)/256;//計(jì)算初值
TL1=(65535-10000)%256;
flag++;
time();
if((c==1&&i==0)||(c==1&&(i==2||i==4||i==6)))
{
flag1++;
}
miaotime();
}
程序主要功能有時(shí)間顯示,秒表,鬧鐘,年月日及星期顯示,基本與一般的電子手表相同。還應(yīng)該有個(gè)燈,按鍵已經(jīng)畫出來了,程序部分沒有寫,不過比較簡單,就沒有寫了。當(dāng)然還有一些地方要再改下,像鬧鐘應(yīng)該還有個(gè)懶人模式,關(guān)鬧鐘也沒有達(dá)到預(yù)想的效果,當(dāng)然鬧鐘的聲音就更不用說了,怎么都調(diào)不到手表上的那種清脆的聲音。先這樣,以后再努力!

本文引用地址:http://www.butianyuan.cn/article/201611/320128.htm


關(guān)鍵詞: 51單片機(jī)電子時(shí)

評論


技術(shù)專區(qū)

關(guān)閉