基于单片机的数字时钟C程序.docx
- 文档编号:1915976
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:9
- 大小:16.91KB
基于单片机的数字时钟C程序.docx
《基于单片机的数字时钟C程序.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字时钟C程序.docx(9页珍藏版)》请在冰豆网上搜索。
基于单片机的数字时钟C程序
#include
#defineucharunsignedchar//宏定义,为方便编程
#defineDIGIP0//宏定义,将P0口定义为数码管显示口
#defineSELECTP2//宏定义,将P2口定义为数码管选择口
#defineFUNCTIONP1//宏定义,将P1口定义为功能选择口
ucharms,sec,min,hour,day,month;//计时毫秒、秒、分、时、日、月
intyear;//计时年
ucharcount1,ms1,sec1,min1;//秒表计时参数
ucharday1;//各月天数
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;//数据线连接的是P2.7
sbitPL=P2^6;//锁存线连接的是P2.6
sbitCLK=P2^5;//移位时钟连接的是P2.5
sbitBP=P2^4;
bitxKey;//按键读取指示
ucharKeyVal;//当前按键状态组合
ucharDispBuf[6];
ucharClock[3];//保存时钟参数值
ucharcodetable[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//显示码表,分别为0~9
voidInitT0(void)
{
TMOD=(TMOD&0xF0)|0x01;
TH0=0xF8;//2ms
TL0=0xCC;
TR0=1;
ET0=1;
EA=1;
}
voidT0srv(void)interrupt1using1
{
uchari;
TH0=0xF8;
TL0=0xCC;
DIGI=0xFF;
SELECT=((SELECT&0xF0)|0x08)|pLED;
DIGI=~DispBuf[pLED];
if(++pLED==6)pLED=0;
if(++count==5)//以下为时钟基时计数
{
count=0;//10ms复位
if(++ms==100)
{
ms=0;//1s复位
if(++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天
if(year%4!
=0&&month==2)day1=28;//非闰年2月为28天
if(month==4|month==6|month==9|month==11)day1=30;
if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)day1=31;
if((ms&0x01)==0)//每四次中断即20ms读一次按键状态
{
CLK=0;
PL=0;//锁存命令,发负脉冲
PL=1;
KeyVal=0;//初值数据为0,无按键
for(i=0;i<8;i++)//8次移位循环完成
{
KeyVal<<=1;//KeyVal左移位1位
if(!
DAT)KeyVal|=0x01;//有键压下,KeyVal末位置1
CLK=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:
//分位调时
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(Clock[0]==32)Clock[0]=0;
break;
case3:
//月份调整
Clock[1]=Clock[1]+1;
delay();
if(Clock[1]==13)Clock[1]=0;
break;
case4:
//年份调整
Clock[2]=Clock[2]+1;
delay();
if(Clock[2]==100)Clock[2]=0;
break;
default:
break;
}
}
voidkey()
{
if(xKey)//有新的键值,就…
{
xKey=0;//清除信号量
}
switch(~KeyVal){
case0xFE:
state=0;break;
case0xFD:
state=1;break;
case0xFB:
state=2;
if(++state1==5)state1=0;
delay();
switch(state1){
case0:
case1:
Clock[0]=sec;Clock[1]=min;Clock[2]=hour;
break;
case2:
case3:
case4:
Clock[0]=day;Clock[1]=month;Clock[2]=year;
break;
}
break;
case0xF7:
state=3;edittime();break;
case0xEF:
state=4;count1=0;ms1=0;sec1=0;min1=0;break;//秒表初始化
case0xDF:
state=5;a=ms1%10;b=ms1/10;c=sec1%10;d=sec1/10;e=min1%10;f=min1/10;break;
default:
break;
}
}
voidfunction()
{
switch(state){
case0:
a=sec%10;b=sec/10;c=min%10;d=min/10;e=hour%10;f=hour/10;FUNCTION=0xFE;break;
case1:
a=day%10;b=day/10;c=month%10;d=month/10;e=(year%100)%10;f=(year%100)/10;FUNCTION=0xFD;break;
case2:
a=Clock[0]%10;b=Clock[0]/10;c=Clock[1]%10;d=Clock[1]/10;e=Clock[2]%10;f=Clock[2]/10;
if(state1==0)FUNCTION=0xFB;//选择不同功能时对应的灯亮
if(state1==1)FUNCTION=0xF7;
if(state1==2)FUNCTION=0xEF;
if(state1==3)FUNCTION=0xDF;
if(state1==4)FUNCTION=0xBF;
break;
case3:
a=Clock[0]%10;b=Clock[0]/10;c=Clock[1]%10;d=Clock[1]/10;e=Clock[2]%10;f=Clock[2]/10;
switch(state1){
case0:
case1:
sec=Clock[0];min=Clock[1];hour=Clock[2];
break;
case2:
case3:
case4:
day=Clock[0];month=Clock[1];year=Clock[2];
break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字 时钟 程序