资源描述:
《基于单片机的数字时钟C程序.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、#include#defineucharunsignedchar//宏定义,为方便编程#defineDIGIP0//宏定义,将P0口定义为数码管显示口#defineSELECTP2//宏定义,将P2口定义为数码管选择口#defineFUNCTIONP1//宏定义,将P1口定义为功能选择口ucharms,sec,min,hour,day,month;//计时毫秒、秒、分、时、日、月intyear;//计时年ucharcount1,ms1,sec1,min1;//秒表计时参数ucharday1;//
2、各月天数ucharcount;//精确计时ucharpLED;uchara,b,c,d,e,f;//显示参数ucharstate;//功能选择state=0,时钟显示state=1,日期显示state=2,进入调时状态state=3,调时state=4,秒表开始state=5,秒表结束ucharstate1;//调时功能选择state1=0,调节时钟分位state1=1,调节时钟时位state1=2,调节日历日期state1=3,调节日历月份state1=4,调节日历年份sbitDAT=P2^7;//数据线连接的是
3、P2.7sbitPL=P2^6;//锁存线连接的是P2.6sbitCLK=P2^5;//移位时钟连接的是P2.5sbitBP=P2^4;bitxKey;//按键读取指示ucharKeyVal;//当前按键状态组合ucharDispBuf[6];ucharClock[3];//保存时钟参数值ucharcodetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//显示码表,分别为0~9voidInitT0(void){TMOD=(TMOD&0xF
4、0)
5、0x01;TH0=0xF8;//2msTL0=0xCC;TR0=1;ET0=1;EA=1;}voidT0srv(void)interrupt1using1{uchari;TH0=0xF8;TL0=0xCC;DIGI=0xFF;SELECT=((SELECT&0xF0)
6、0x08)
7、pLED;DIGI=~DispBuf[pLED];if(++pLED==6)pLED=0;if(++count==5)//以下为时钟基时计数{count=0;//10ms复位if(++ms==100){ms=0;//1s复位if(+
8、+sec==60){sec=0;if(++min==60){min=0;if(++hour==24){hour=0;if(++day==day1){day=1;if(++month==12){month=1;year++;}}}}}}}//秒表基时计数if(++count1==5){count1=0;if(++ms1==100){ms1=0;if(++sec1==60){sec1=0;if(++min1==60){min1=0;}}}}if(year%4==0&&month==2)day1=29;//闰年2月为29
9、天if(year%4!=0&&month==2)day1=28;//非闰年2月为28天if(month==4
10、month==6
11、month==9
12、month==11)day1=30;if(month==1
13、month==3
14、month==5
15、month==7
16、month==8
17、month==10
18、month==12)day1=31;if((ms&0x01)==0)//每四次中断即20ms读一次按键状态{CLK=0;PL=0;//锁存命令,发负脉冲PL=1;KeyVal=0;//初值数据为0,无按键for(i=0;i
19、<8;i++)//8次移位循环完成{KeyVal<<=1;//KeyVal左移位1位if(!DAT)KeyVal
20、=0x01;//有键压下,KeyVal末位置1CLK=1;//发移位正脉冲CLK=0;}KeyVal&=0x3F;//只用了6个键,所以最高两位屏蔽掉xKey=1;}}voiddelay(){uchari,j,k;for(i=254;i>0;i--){for(j=254;j>0;j--)for(k=1;k>0;k--);}}voidedittime(){switch(state1){case0://分位
21、调时Clock[1]=Clock[1]+1;delay();if(Clock[1]==61)Clock[1]=0;break;case1://时位调时Clock[2]=Clock[2]+1;delay();if(Clock[2]==25)Clock[2]=0;break;case2://日期调整Clock[0]=Clock[0]+1;delay();if(C