×
嵌入式 > 嵌入式开发 > 详情

用51单片机做的电子时钟

发布时间:2020-10-21 发布时间:
|

程序如下:
#include
unsigned char code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x76};//字码表0-9,最后一个是一横"-"
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();
//前几天刚用了下定时器,想起来之前用汇编写的时钟程序基本没有什么功能,所以这几天就用C再写了下
//这个时钟的功能是模仿我自己的手表写的,功能完全一样,有秒表,闹钟,可以显示年月日及星期
/
{
if(min==nm&&h==nh)//时间到了,闹钟响
{
shengyin(); //闹钟的声音程序
}
}
if(c==0||c==2)
{
if(keymood==0)
{
miao1=0;
miao2=0;
miao3=0;
}
}
while(b==1)//保证按键只按一次,没有重复按键
{tiaoshi();
goto B1; //如果b还等于1,刚重复扫描秒表界面
}
}
/
{ i=0;//将i清零,保证每次进入都是一样的
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的大小来分配,相当于调时、分、秒就显示时间,调年月日就显示日期
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的时候关闭所有的数码管,其他时间开启相应位,这样就可以达到闪烁的目的了
{
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++);
}
//*********************************时显示程序*************************
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++);
}
//*******************************调时显示***********************
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++);
}
//***************************时钟加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标志位主要是为秒表而设的
void miaotime()//秒表加时程序
{

if(flag1==1)
{
flag1=0;
miao1++;
if(miao1==100)
{
miao1=0;
miao2++;
if(miao2==60)
{
miao2=0;
miao3++;
if(miao3==60)
{
miao3=0;
}
}
}
}
}
//************************调时程序*******************************
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)//只要调了秒表,再按一次key2键就可以退回到正常时间显示界面
{
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)) //调闹钟的分
{
if(keyinc==0)
{
nm++;
if(nm==60)
nm=0;
}
while(keyinc==0);
}
//
if(b==2&&(i==2||i==4||i==6))//调闹钟的时
{
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);
}
}
//*****************************延时程序******************************
void delay10ms() //延时10MS子程序,在消除键盘的抖动
{
for(a=0;a<5000;a++);
}
//******************************************************
void delay20ms()//延时20MS,在调时间的时候,按下超过20MS就可以被认为重复按键
{
for(a=0;a<10000;a++);
}
//*******************************中断服务程序************************
void timer1() interrupt 3
{
TH1=(65535-10000)/256;//计算初值
TL1=(65535-10000)%256;
flag++;
time();
if((c==1&&i==0)||(c==1&&(i==2||i==4||i==6)))
{
flag1++;
}
miaotime();
}
程序主要功能有时间显示,秒表,闹钟,年月日及星期显示,基本与一般的电子手表相同。还应该有个灯,按键已经画出来了,程序部分没有写,不过比较简单,就没有写了。当然还有一些地方要再改下,像闹钟应该还有个懒人模式,关闹钟也没有达到预想的效果,当然闹钟的声音就更不用说了,怎么都调不到手表上的那种清脆的声音。先这样,以后再努力!



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM入门篇之(一)概念