基于51单片机电子显示时钟带闹钟整点报时日期星期.docx

上传人:b****5 文档编号:7816780 上传时间:2023-01-26 格式:DOCX 页数:14 大小:18.19KB
下载 相关 举报
基于51单片机电子显示时钟带闹钟整点报时日期星期.docx_第1页
第1页 / 共14页
基于51单片机电子显示时钟带闹钟整点报时日期星期.docx_第2页
第2页 / 共14页
基于51单片机电子显示时钟带闹钟整点报时日期星期.docx_第3页
第3页 / 共14页
基于51单片机电子显示时钟带闹钟整点报时日期星期.docx_第4页
第4页 / 共14页
基于51单片机电子显示时钟带闹钟整点报时日期星期.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于51单片机电子显示时钟带闹钟整点报时日期星期.docx

《基于51单片机电子显示时钟带闹钟整点报时日期星期.docx》由会员分享,可在线阅读,更多相关《基于51单片机电子显示时钟带闹钟整点报时日期星期.docx(14页珍藏版)》请在冰豆网上搜索。

基于51单片机电子显示时钟带闹钟整点报时日期星期.docx

基于51单片机电子显示时钟带闹钟整点报时日期星期

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitKEY1=P3^0;//切换键

sbitKEY3=P3^1;//minute,hour调整加1定义

sbitKEY2=P3^7;//minute,hour调整减1定义

sbitbear=P3^4;//闹铃

uchara=0;//时间显示和闹钟时间显示切换

codeunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21};//段码控制

charcodeweikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharStrTab[32];

charminute=01,hour=13,second=00;//正常时钟秒,分,时定义

charminute1=12,hour1=24;//闹钟时钟秒,分,时定义

uintyear=2014;

charmonth=12,day=10;//日期年,月,日定义

charweek=3,v=1;//星期

//要保持高位为0

charpp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,

0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f,

0x3e,0x3d,0x3b,0x37,0x2f,0x1f,

0x1e,0x1d,0x1b,0x17,0x0f,

0x0e,0x0d,0x0b,0x07,

0x06,0x05,0x03,

0x02,0x01,

0x00

};

charw=0;

ucharflag=0;//切换标志

uintcount=0;//定时器计数,定时50ms,count满20,秒加1

/**********************延时子程序*****************************/

voiddelay(uintz)

{uintx,y;

for(x=0;x

for(y=0;y<110;y++);

}

/*******************蜂鸣器子程序****************************/

voidbeng()

{

bear=~bear;

delay(10);

bear=1;

}

/**********************显示时钟子函数***************************/

voiddisplay(ucharw[32])

{unsignedinti,j,c=0;

if(a==0)//正常时间显示

{for(i=0;i<8;i++)//依次将数组w中八个数取出,并显示

{P2=weikong_code[i];//位选

j=w[i];//取出要显示的数码

P0=tab[j];//取出段选编码

delay

(1);//显示延时

P0=0xff;

}}

if(a==1)//闹钟调整显示

{for(i=8;i<16;i++)

{if(c==8)c=0;

P2=weikong_code[c];

c++;

j=w[i];

P0=tab[j];

delay

(1);

P0=0xff;

}}

if(a==2)//日期调整显示

{for(i=16;i<24;i++)//取w内容显示

{if(c==8)c=0;//控制位选1

P2=weikong_code[c];//控制位选2

c++;//控制位选3

j=w[i];//取w内容

P0=tab[j];//取w内容查表

delay

(1);

P0=0xff;

}}

if(a==3)//星期调整显示

{for(i=24;i<32;i++)

{if(c==8)c=0;

P2=weikong_code[c];

c++;

j=w[i];

P0=tab[j];

delay

(1);

P0=0xff;

}}

}

/***********************显示时钟数组子程序***********************/

voidxianshishuzu()

{StrTab[1]=second/10;//秒十位

StrTab[0]=second%10;//秒个位

StrTab[2]=10;//间隔符-

StrTab[4]=minute/10;//分十位

StrTab[3]=minute%10;//分个位

StrTab[5]=10;//间隔符-

StrTab[7]=hour/10;//时十位

StrTab[6]=hour%10;//时个位

}

/********************************定时闹钟****************/

voidalarm()

{chark;

if((hour==hour1)&(minute==minute1)&(k))

{if(P3!

=0XFF)

{k=0;}

beng();

display(StrTab);

}

if((hour==hour1)&(minute!

=minute1))

{k=1;}

StrTab[9]=10;//闹钟秒个位

StrTab[8]=10;//秒十位

StrTab[10]=10;//间隔符-

StrTab[12]=minute1/10;//分个位

StrTab[11]=minute1%10;//分十位

StrTab[13]=10;//间隔符-

StrTab[15]=hour1/10;//时个位

StrTab[14]=hour1%10;//时十位

display(StrTab);

}

voiddata1()//年日期显示

{

StrTab[17]=day/10;//闹钟秒个位

StrTab[16]=day%10;//秒十位9

StrTab[18]=month%10;//间隔符-

StrTab[20]=year%10;//分个位

StrTab[19]=month/10;//分十位

StrTab[21]=(year/10)%10;//间隔符-

StrTab[23]=year/1000;//时个位

StrTab[22]=(year/100)%10;//时十位

display(StrTab);

}

voidweek1()//星期显示

{

StrTab[25]=10;//闹钟秒个位

StrTab[24]=10;//秒十位9

StrTab[26]=10;//间隔符-

StrTab[28]=week/10;//分个位

StrTab[27]=week%10;//分十位

StrTab[29]=10;//间隔符-

StrTab[31]=10;//时个位

StrTab[30]=10;//时十位

display(StrTab);

}

voidgodata()

{

if((hour==0)&(minute==0)&(second==0))

{day++;//日期格式走

if((month==2)|(month==4)|(month==6)|(month==9)|(month==11))//2,4,6,9,11数月30天)//其他偶数月

{if(month==2)//对二月的特殊判断

{if((year%4==0)&(year/100!

=0)|(year/400==0))//判断是闰年

{if(day==30);//闰年29天

{day=1;month++;

if(month==13)

{month=1;year++;

if(year==10000)

year=0;}}}

elseif(day==29)//平年28天

{day=1;month++;

if(month==13)

{month=1;year++;

if(year==10000)

year=0;}}

}

elseif(day==31)//其他月30天

{day=1;month++;

if(month==13)

{month=1;year++;

if(year==10000)

year=0;}}

}

else

if(day==32)//其他其他月31天

{day=1;month++;

if(month==13)

{month=1;year++;

if(year==10000)

year=0;}}

week++;//星期走

if(week==8)

week=1;

data1();

week1();

while(second==0);

}

}

/**********************键盘扫描子程序*************************/

voidkeycan()

{

if(KEY1==0)//按一次,正常显示,按第二次,时调整,按第三次,分调这整,

{delay(10);//按键1去抖以及动作

if(KEY1==0)//确认按键是否按下

{flag++;}//切换标志

if(flag==10)

flag=0;

a=0;

if((flag==4)|(flag==5))

a=1;

if((flag==6)|(flag==7)|(flag==8))

a=2;

if(flag==9)

a=3;

while(!

KEY1);}//释放按键

}

voidtiao()

{

while(flag==1)

{if(KEY2==0)

{delay(10);

if(KEY2==0)

{hour++;if(hour==24)hour=0;}//正常时间小时加1

while(!

KEY2)display(StrTab);}

if(KEY3==0)

{delay(10);

if(KEY3==0)

{hour--;if(hour==-1)hour=23;}//正常时间小时减1

while(!

KEY3)display(StrTab);

}display(StrTab);keycan();}

while(flag==2)

{if(KEY2==0)//按键去抖以及动作

{delay(10);

if(KEY2==0)

{minute++;if(minute==60)minute=0;}//分加1

while(!

KEY2)display(StrTab);}

if(KEY3==0)

{delay(10);

if(KEY3==0)

{minute--;if(minute==-1)minute=59;}

while(!

KEY3)display(StrTab);

}display(StrTab);keycan();

}

while(flag==3)//秒表的加1

{if(KEY3==0)

{delay(10);

if(KEY3==0)

second=0;

while(!

KEY3)display(StrTab);}

if(KEY2==0)

{delay(10);

if(KEY2==0)

second=0;

while(!

KEY2)display(StrTab);

}display(StrTab);keycan();

}

while(flag==4)//闹钟

{if(KEY2==0)

{delay(10);

if(KEY2==0)

{hour1++;if(hour1==25)hour1=0;}//闹钟时间小时加1

while(!

KEY2)alarm();}

if(KEY3==0)

{delay(10);

if(KEY3==0)

{hour1--;if(hour1==-1)hour1=24;}//闹钟时间小时减

while(!

KEY3)alarm();

}alarm();keycan();}

while(flag==5)

{if(KEY2==0)//按键去抖以及动作

{delay(10);

if(KEY2==0)

{minute1++;if(minute1==60)minute1=0;}//闹钟分加1

while(!

KEY2)alarm();}

if(KEY3==0)//按键去抖以及动作

{delay(10);

if(KEY3==0)

{minute1--;if(minute1==-1)minute1=59;}//闹钟分减1

while(!

KEY3)alarm();}alarm();keycan();}

while(flag==6)//调整年

{if(KEY2==0)//按键去抖以及动作

{delay(10);

if(KEY2==0)

{year++;if(year==10000)year=0;}//闹钟分加1

while(!

KEY2)data1();}

if(KEY3==0)//按键去抖以及动作

{delay(10);

if(KEY3==0)

{year--;if(year==-1)year=9999;}//闹钟分减1

while(!

KEY3)data1();}data1();keycan();}

while(flag==7)//调整月只加

{if(KEY2==0)//按键去抖以及动作

{delay(10);

if(KEY2==0)

{month++;if(month==13)month=1;}//闹钟分加1

while(!

KEY2)data1();}

data1();keycan();}

while(flag==8)//调整日只加

{

if(KEY2==0)//按键去抖以及动作

{delay(10);

if(KEY2==0)

{day++;

if((month==2)|(month==4)|(month==6)|(month==9)|(month==11))//2,4,6,9,11数月30天)//其他偶数月

{if(month==2)//对二月的特殊判断

{if((year%4==0)&(year%100!

=0)|(year%400==0))//判断是闰年

{if(day==30)//闰年29天

day=1;}

elseif(day==29)//平年28天

day=1;}

elseif(day==31)//其他月30天

day=1;}

elseif(day==32)//其他其他月31天

day=1;

}

while(!

KEY2)data1();}//日期加加

data1();keycan();}

while(flag==9)//调整星期只加

{if(KEY2==0)//按键去抖以及动作

{delay(10);

if(KEY2==0)

{week++;if(week==8)week=1;}

while(!

KEY2)week1();}

week1();keycan();}

}

/*****************整点报警子程序***************************/

voidzhengdian(void)

{chari;

if((minute==0)&(second==0))//整点报时

{if((hour<=23)&(hour>=7))

{for(i=0;i

{beng();

delay(1000);

display(StrTab);}

}

else

{beng();

godata();

delay(3000);}

}

}

/**************************中断子程序*********************************/

voidtime_()interrupt1//中断程序

{count++;

TH0=(65536-50000)/256;//0.5ms重新送初值

TL0=(65536-50000)%256;

if(count==20)//定时器计数,定时50ms,count满20,秒加1

{second++;

count=0;

if(second==60)//秒值等于60,秒清零,分加1

{second=0;minute++;

if(minute==60)//分值等于60,分清零,时加1

{minute=0;

hour++;

if(hour==24)//时值等于24,时清零,返回,全部归零

{hour=0;}}}}

xianshishuzu();

}

/***********************主函数***************************/

voidmain()

{P3=0XFF;TMOD=0x01;//time0为定时器,方式1

TH0=(65536-50000)/256;//预置计数初值,50ms

TL0=(65536-50000)%256;

EA=1;//总中断开

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

TR0=1;//开启定时器0

bear=1;

while

(1)//主循环

{

display(StrTab);

zhengdian();

alarm();

keycan();

tiao();

if((second%8==1)&(flag==0))

{w++;

if(w==36)

w=0;

while((second%8==1)&(flag==0))

{display(StrTab);alarm();keycan();tiao();}

}

P1=pp[w];

if(flag==0)

{if(second==11)

a=2;

if(second==15)

a=3;

if(second==19)

a=0;

}

}}

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

当前位置:首页 > 工程科技 > 纺织轻工业

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

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