8位数码管显示时钟.docx

上传人:b****6 文档编号:5683731 上传时间:2022-12-31 格式:DOCX 页数:22 大小:165.18KB
下载 相关 举报
8位数码管显示时钟.docx_第1页
第1页 / 共22页
8位数码管显示时钟.docx_第2页
第2页 / 共22页
8位数码管显示时钟.docx_第3页
第3页 / 共22页
8位数码管显示时钟.docx_第4页
第4页 / 共22页
8位数码管显示时钟.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

8位数码管显示时钟.docx

《8位数码管显示时钟.docx》由会员分享,可在线阅读,更多相关《8位数码管显示时钟.docx(22页珍藏版)》请在冰豆网上搜索。

8位数码管显示时钟.docx

8位数码管显示时钟

8位数码管显示时钟

 

本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!

本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!

C程序:

#include

unsignedcharled[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//用一维数组定义-9、横杠、全灭

unsignedcharnum[12]={2,0,0,9,3,5,0,7,0,1,2,0};

unsignedchara[8];

unsignedcharsecond=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1;

unsignedcharminute1=0,hour1=0;

unsignedchar

voidinit1()

{

S_flag=0;//闪烁标志位

TMOD=0x10;//定时器以方式定时

TH1=0xfc;

TL1=0x18;

EA=1;//打开总中断

ET1=1;//允许定时器中断

TR1=1;//开启定时器(开始定时计数)

}

voidinit0()

{

TMOD=0x01;//定时器以方式定时

TH0=0xff;

TL0=0xff;

EA=1;//打开总中断

ET0=1;//允许定时器中断

TR0=0;//关闭定时器(关闭定时计数)

}

voiddisplay_led()//流动显示学号

{

intx;

charl,a,m;

for(a=0;a<21;a++)

{

x=a-8;

for(l=0;l<6;l++)

{

for(m=0;m<8;m++)

{

P2=b[m];

if(x>=0&&x<12)P1=led[num[x]];

elseP1=led[11];

delay(10);

x++;

}

x-=8;

}

}

}

 

voiddisplay()//显示时钟及显示调节位

{

switch(M)

{

case0:

{

a[0]=led[hour/10];

a[1]=led[hour%10];

a[2]=led[10];

a[3]=led[minute/10];

a[4]=led[minute%10];

a[5]=led[10];

a[6]=led[second/10];

a[7]=led[second%10];

}break;

case1:

{

if(S_flag==1)

{

a[0]=led[hour/10];

a[1]=led[hour%10];

}

else

{

a[0]=led[11];

a[1]=led[11];

}

a[2]=led[10];

a[3]=led[minute/10];

a[4]=led[minute%10];

a[5]=led[10];

a[6]=led[second/10];

a[7]=led[second%10];

}break;

case2:

{

a[0]=led[hour/10];

a[1]=led[hour%10];

a[2]=led[10];

if(S_flag==1)

{

a[3]=led[minute/10];

a[4]=led[minute%10];

}

else

{

a[3]=led[11];

a[4]=led[11];

}

a[5]=led[10];

a[6]=led[second/10];

a[7]=led[second%10];

}break;

case3:

{

if(S_flag==1)

{

a[0]=led[year/10];

a[1]=led[year%10];

}

else

{

a[0]=led[11];

a[1]=led[11];

}

a[2]=led[10];

a[3]=led[mon/10];

a[4]=led[mon%10];

a[5]=led[10];

a[6]=led[day/10];

a[7]=led[day%10];

}break;

case4:

{

a[0]=led[year/10];

a[1]=led[year%10];

a[2]=led[10];

if(S_flag==1)

{

a[3]=led[mon/10];

a[4]=led[mon%10];

}

else

{

a[3]=led[11];

a[4]=led[11];

}

a[5]=led[10];

a[6]=led[day/10];

a[7]=led[day%10];

}break;

case5:

{

a[0]=led[year/10];

a[1]=led[year%10];

a[2]=led[10];

a[3]=led[mon/10];

a[4]=led[mon%10];

a[5]=led[10];

if(S_flag==1)

{

a[6]=led[day/10];

a[7]=led[day%10];

}

else

{

a[6]=led[11];

a[7]=led[11];

}

}break;

 

case6:

{

if(S_flag==1)

{

a[0]=led[hour1/10];

a[1]=led[hour1%10];

}

else

{

a[0]=led[11];

a[1]=led[11];

}

a[2]=led[10];

a[3]=led[minute1/10];

a[4]=led[minute1%10];

a[5]=led[10];

a[6]=led[11];

a[7]=led[11];

}break;

case7:

{

a[0]=led[hour1/10];

a[1]=led[hour1%10];

a[2]=led[10];

if(S_flag==1)

{

a[3]=led[minute1/10];

a[4]=led[minute1%10];

}

else

{

a[3]=led[11];

a[4]=led[11];

}

a[5]=led[10];

a[6]=led[11];

a[7]=led[11];

}

}

}

 

voidkey_prc()//时钟和闹钟调节

{

if(K1==0)

{

delay(10);//延时去抖

if(K1==0)//按K1进行模式切换

{M++;

if(M==8)

M=0;

}

while(!

K1);//等待按键释放

}

if(M!

=0)

{

switch(M)

{

case1:

//模式--调时

{

if(K2==0)

{

delay(10);//延时去抖

if(K2==0)//加键按下

{

if(hour<23)hour++;

elsehour=0;

}

while(!

K2);//等待按键释放

}

if(K3==0)

{

delay(10);

if(K3==0)

{

if(hour>0)hour--;

elsehour=23;

}

while(!

K3);

}

}break;

case2:

//模式--调分

{

if(K2==0)

{

delay(10);

if(K2==0)

{

if(minute<59)minute++;

elseminute=0;

}

while(!

K2);

}

if(K3==0)

{

delay(10);

if(K3==0)

{

if(minute>0)minute--;

elseminute=59;

}

while(!

K3);

}

}break;

 

case3:

//模式--调年

{

if(K2==0)

{

delay(10);

if(K2==0)

{

if(year<99)year++;

elseyear=0;

}

while(!

K2);

}

if(K3==0)

{

delay(10);

if(K3==0)

{

if(year>0)year--;

elseyear=99;

}

while(!

K3);

}

}break;

case4:

//模式--调月

{

if(K2==0)

{

delay(10);

if(K2==0)

{

if(mon<12)mon++;

elsemon=0;

}

while(!

K2);

}

if(K3==0)

{

delay(10);

if(K3==0)

{

if(mon>1)mon--;

elsemon=12;

}

while(!

K3);

}

if(year%4==0&&mon==2)day1=29;//闰年2月为29天

if(year%4!

=0&&mon==2)day1=28;//非闰年2月为28天

if(mon==4|mon==6|mon==9|mon==11)day1=30;

if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31;

}break;

case5:

//模式--调日

{

if(K2==0)

{

delay(10);

if(K2==0)

{

if(day

else

{

day=1;

}

}

while(!

K2);

}

if(K3==0)

{

delay(10);

if(K3==0)

{

if(day>1)day--;

else

{

day=day1;

}

}

while(!

K3);

}

}break;

 

case6:

//模式--闹钟调时

{

if(K2==0)

{

delay(10);

if(K2==0)

{

if(hour1<23)

hour1++;

elsehour1=0;

}

while(!

K2);

}

if(K3==0)

{

delay(10);

if(K3==0)

{if(hour1>0)

hour1--;

elsehour1=23;

}

while(!

K3);

}

}break;

case7:

//模式--闹钟调分

{

if(K2==0)

{

delay(10);

if(K2==0)

{

if(minute1<59)

minute1++;

elseminute1=0;

}

while(!

K2);

}

if(K3==0)

{

delay(10);//延时去抖

if(K3==0)//减键按下

{if(minute1>0)

minute1--;

elseminute1=59;

}

while(!

K3);

}

}break;

}

}

}

voiddisplay_rq()//年月日显示

{

if(K2==0)

{

delay(10);

if(K2==0)

{

a[0]=led[year/10];

a[1]=led[year%10];

a[2]=led[10];

a[3]=led[mon/10];

a[4]=led[mon%10];

a[5]=led[10];

a[6]=led[day/10];

a[7]=led[day%10];

}

while(!

K2);//等待按键释放

}

}

voidkey_prc2()//秒表模式转换

{

if(M==0)

{

if(K3==0)

{

delay(10);//延时去抖

if(K3==0)//按K3进行模式切换

{N++;

if(N==2)

N=0;

}

while(!

K3);//等待按键释放

}

}

}

voiddisplay_sec()//秒表显示

{

if(N==1)

{

a[0]=led[min_m/10];

a[1]=led[min_m%10];

a[2]=led[10];

a[3]=led[sec_m/10];

a[4]=led[sec_m%10];

a[5]=led[10];

a[6]=led[hsec/10];

a[7]=led[hsec%10];

if(K2==0)

{

delay(10);//延时去抖

if(K2==0)//加键按下

{

TR0=!

TR0;

}

while(!

K2);//等待按键释放

}

}

}

voidres_sec()//秒表复位

{

if(K1==0)

{

delay(10);

if(K1==0)

{

min_m=0;

sec_m=0;

hsec=0;

M=0;

}

while(!

K1);

}

}

voidmain()//主程序

{

display_led();

init0();

init1();

while

(1)

{

key_prc();

key_prc2();

if(N==1)

{

display_sec();

res_sec();

}

else

{

display_rq();

display();

}

}

}

 

voidtime1()interrupt3//定时器中断函数

{

if(year%4==0&&mon==2)day1=29;//闰年2月为29天

if(year%4!

=0&&mon==2)day1=28;//非闰年2月为28天

if(mon==4|mon==6|mon==9|mon==11)day1=30;

if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31;

TH1=0xfc;//定时ms

TL1=0x18;

temp++;

if(temp==1000)//配合定时器定时s

{temp=0;

second++;

}

if(second==60)

{second=0;

if(minute<59)

minute++;

else{minute=0;

hour++;

if(hour==24)

{

hour=0;

day++;

if(day>day1)

{

day=1;

mon++;

if(mon>12)

{

mon=1;

year++;

if(year==99)

{year=0;}

}

}

}

}

}

if(hour1==hour&&minute1==minute&&K0==0)//闹钟时间到

{

BEEP=!

BEEP;

}

if(temp%250==0)//每ms

S_flag=!

S_flag;//闪烁标志位取反

if(k==8)k=0;

P1=a[k];

P2=b[k++];

delay

(1);

P2=0xff;

}

 

voidsec_clo()interrupt1//秒表程序中断

{

TH0=0xff;

TL0=0xff;

temp1++;

if(temp1==150)

{

temp1=0;

hsec++;

if(hsec==100)

{

hsec=0;

sec_m++;

if(sec_m==60)

{

sec_m=0;

min_m++;

if(min_m==100)

{

min_m=0;

}

}

}

}

}

 

仿真电路图:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1