单片机c51数字时钟带年月日显示.docx
- 文档编号:12272314
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:20
- 大小:602.63KB
单片机c51数字时钟带年月日显示.docx
《单片机c51数字时钟带年月日显示.docx》由会员分享,可在线阅读,更多相关《单片机c51数字时钟带年月日显示.docx(20页珍藏版)》请在冰豆网上搜索。
单片机c51数字时钟带年月日显示
【单片机】c51数字时钟(带年月日显示)
【单片机】c51数字时钟(带年月日显示)
显示当前时间:
9点58分34秒(第一个零表示闹钟未开启)
当前日期:
10年4月六日
摘要:
本设计以单片机为核心,LED数码管动态扫描显示。
采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。
具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能
说明
系统的功能选择由7个按键完成。
其中,分别对应调整当前时间的时和分,
为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)
用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按,可进行闹钟时分的设定,此时,led1灯灭。
闹铃时间到切闹钟开关开启时,闹铃响一分钟。
\\对年月日进行调整(第一次按,就进入了年月日的显示,现在就可对日期进行调整)。
按回到当前时间的显示状态。
整点到时:
报警对应小时的次数。
程序如下:
#include<>
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
uchardatakeyvalue;//查到的键值
uchardatakeys;//转换出的数字
uchardis[8];
ucharcodeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x39,0xf7};
//0123456789-灭灯cn
sbitled_duan=P2^6;//段选通
sbitled_wei=P2^7;//位选通
sbitspeaker=P2^3;//蜂鸣器
sbitminitek=P3^0;//分校正按键
sbithourk=P3^1;//小时校正按键
sbitp3_4=P3^4;//
sbityeark=P3^5;//年
sbitmonthk=P3^6;//月
sbitdayk=P3^7;//日
uchardatawei,i;
bitleap_year;//闰年标志位
bitdis_nyr;
bitcal_year=1;
bitcalculate=1;//显示年月日与当前时间切换标志
uchardatac_min;//闹钟‘分寄存单元
uchardatac_hou;//闹钟、小时寄存单元
uchardatasecond;//秒
uchardataminite;//分变量
uchardatahour;//小时变量
uchardatayear,month,day;//定义年月日变量
uchardataCNTA;
uchardataspeaker_num;//蜂鸣次数
bitbeep;//整点报时标志
bitrun;//运行标志
bitflash;//灭灯标志
bitclarm_switch;//闹钟开关标志
bitbaoshi;//报时开关标志
sbitled1=P1^6;//按键标识指示灯
sbitled2=P1^7;//运行标志指示灯
sbitP3_2=P3^2;
sbitP3_3=P3^3;
uintn,k;
/*10微秒级延时*/
voiddelay_10us(ucharn)?
{do
{_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
/***毫秒级延时***/
voiddelay_ms(uintn)?
{dodelay_10us(131);
while(--n);
}
/******当前时间转换******/
clk_to_dis()
{
dis[0]=second%10;
dis[1]=second/10;
if(flash)dis[2]=10;
elsedis[2]=11;
dis[3]=minite%10;
dis[4]=minite/10;
dis[5]=hour%10;
dis[6]=hour/10;
}
/*****定时闹钟显示译码(用于七段码显示)*****/
clarm_to_dis()
{
dis[0]=c_min%10;
dis[1]=c_min/10;
if(flash)dis[2]=10;//亮灯
elsedis[2]=11;//灭灯
dis[3]=c_hou%10;
dis[4]=c_hou/10;
dis[5]=10;
dis[6]=13;
}
/***********年月日显示译码************/
nyr_to_dis()
{
dis[0]=day%10;
dis[1]=day/10;
dis[2]=10;//显示'-'
dis[3]=month%10;
dis[4]=month/10;
dis[5]=10;//'-'
dis[6]=year%10;
dis[7]=year/10;
}
/*主函数*/
voidmain()
{
P2=0xff;
P1=0XFF;
p3_4=0;
run=1;
led2=0;//运行指示灯亮
led1=1;
flash=0x00;
dis[2]=10;//第三位显示“-”
wei=0x7f;//选通低位
i=0;?
second=21;
minite=58;
hour=9;
CNTA=0x00;
year=10;
month=4;
day=5;
clk_to_dis();
TMOD=0x11;
TH0=15560/256;
TL0=15560%256;
TH1=0xfc;
TL1=0x18;
EA=1;
PT0=1;
EX0=1;//开中断;
EX1=1;?
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while
(1)
{while(run==1)
{clk_to_dis();
if(calculate)
{
if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)
{day++;?
if(day>31){day=0x01;month++;if(month==13){month=1;year++;cal_year=1;}}
led1=0;//指示灯亮
}
if(month==4|month==6|month==9|month==11)
{
day++;
if(day>30){day=0x01;month++;}
led1=0;//指示灯亮
}
if(month==2){if(leap_year==1)
{day++;if(day==30)day=1;}
else{day++;if(day==29)day=1;}
}
?
while(cal_year)
{
if((year+2000)%400==0)leap_year=1;//被400整除为闰年
elseif((year+2000)%100==0)leap_year=0;//不能被400整除能被100整除不是闰年
elseif((year+2000)%4==0)leap_year=1;//不能被400、100整除能被4整除是闰年
elseleap_year=0;
cal_year=0;
}
calculate=0;led1=1;
}
while(!
minitek)
{
for(n=0;n<1000;n++);
if(!
minitek==0)break;//延时防抖
minite++;
second=0x00;
led1=0;
for(n=0;n<20;n++)
{
speaker=!
speaker;
delay_10us(50);//蜂鸣器响
}
if(minite==60)minite=0x00;
while(!
minitek);//等待键松开
led1=1;//显示灯
}
while(!
hourk)
{
for(n=0;n<1000;n++);
if(!
hourk==0)break;
hour++;
second=0x00;
led1=0;
for(n=0;n<30;n++)
{
speaker=!
speaker;
delay_10us(30);//蜂鸣器响
}
?
if(hour==24)hour=0x00;
while(!
hourk);
led1=1;
}
?
while(!
yeark)//yeark键复用进入年月日调整
{
for(n=0;n<1000;n++);
if(!
yeark==0)break;
dis_nyr=1;
while(!
yeark);
while(dis_nyr)
{nyr_to_dis();
while(!
yeark)
{
for(n=0;n<1000;n++);
if(!
yeark==0)break;
year++;
led1=0;
for(n=0;n<30;n++)
{
speaker=!
speaker;
delay_10us(30);//蜂鸣器响
}
if((year+2000)%400==0)leap_year=1;//被400整除为闰年
elseif((year+2000)%100==0)leap_year=0;//不能被400整除能被100整除不是闰年
elseif((year+2000)%4==0)leap_year=1;//不能被400、100整除能被4整除是闰年
elseleap_year=0;
while(!
yeark);
?
led1=1;
}
while(!
monthk)
{
for(n=0;n<1000;n++);
if(!
monthk==0)break;
month++;
if(month==13)month=1;
led1=0;
for(n=0;n<30;n++)
{
speaker=!
speaker;
delay_10us(30);//蜂鸣器响
}
while(!
monthk);
led1=1;
}?
while(!
dayk)
{
for(n=0;n<1000;n++);
if(!
dayk==0)break;
if(month==1|month==3|month==5|month==7|month==8|month==10|month==12)
{day++;?
if(day>31)day=0x01;
led1=0;//指示灯亮
}
if(month==4|month==6|month==9|month==11)
{
day++;
if(day>30)day=0x01;?
led1=0;//指示灯亮
}
if(month==2){if(leap_year==1)
{day++;if(day==30)day=1;}
else{day++;if(day==29)day=1;}
}
led1=0;
for(n=0;n<30;n++)
{
speaker=!
speaker;
delay_10us(30);//蜂鸣器响
}
while(!
dayk);
led1=1;
}?
while(!
hourk)
{for(n=0;n<1000;n++);
if(hourk)break;
dis_nyr=0;
while(!
hourk);
if(clarm_switch)dis[7]=12;//开启显示C
elsedis[7]=11;//关闭不显示
dis[6]=11;
clk_to_dis();
}
}
}
?
if(clarm_switch)//闹铃时间到,指示灯闪烁蜂鸣器长响
{
if(c_min==minite&&c_hou==hour)
?
{speaker_num=60;
beep=1;
while(beep&&clarm_switch)
{
led1=!
led1;
delay_ms(100);
clk_to_dis();
}
led1=1;
beep=0;
}
}
}
while(run==0)//闹钟时间设定
{clarm_to_dis();
///////////////////////////////////////////////////////////?
while(!
minitek)
{
for(n=0;n<1000;n++);
if(!
minitek==0)break;//延时防抖
c_min++;
led1=0;
for(n=0;n<20;n++)
{
speaker=!
speaker;
delay_10us(50);//蜂鸣器响
}
if(c_min==60)c_min=0x00;
while(!
minitek);//等待键松开
led1=1;//显示灯
}
while(!
hourk)
{
for(n=0;n<1000;n++);
if(!
hourk==0)break;
c_hou++;
led1=0;
for(n=0;n<30;n++)
{
speaker=!
speaker;
delay_10us(30);//蜂鸣器响
}
?
if(c_hou==24)c_hou=0x00;
while(!
hourk);
led1=1;
}
?
}
}
}
/***************定时器T0中断*****************/
timer0()interrupt1using2//定时器0中断号为1号使用第2组寄存器
{TR1=0;
TH0=15548/256;
TL0=15548%256;
CNTA++;
if(beep)
{
if(speaker_num%2)speaker=!
speaker;
if(!
speaker_num)beep=0;
}
if(CNTA==20)
{if(speaker_num)speaker_num--;//每秒整点报时次数减一
flash=!
flash;
CNTA=0;
second++;//秒加
if(second==60)
{second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour>7){speaker_num=2*hour;//整点到设定报时次数蜂鸣标志置1
beep=1;}
if(hour==24)
{
hour=0;calculate=1;//0点到,日期标志加一
}
}
}
}
TR1=1;
}
/*********定时器中断T1**********/
timer1()interrupt3using3
{
TH1=0xfc;
TL1=0x18;
P0=0xff;
led_wei=1;
led_wei=0;
P0=seg[dis[i]];
led_duan=1;
led_duan=0;
P0=wei;
led_wei=1;
led_wei=0;
if(++i==8)i=0;
wei=_cror_(wei,1);
}
/**********************外中断0*******************/
int_0()interrupt0
{
clarm_switch=!
clarm_switch;//闹钟开关
if(clarm_switch)dis[7]=12;//开启显示开启第一位显示C
elsedis[7]=11;//关闭不显示
for(k=0;k<40;k++)
{speaker=!
speaker;
led1=!
led1;
delay_ms(5);
}
led1=1;
}
/********************外中断1********************/
int_1()interrupt2//闹钟时间设置/运行转换开关?
{
run=!
run;
if(run)led2=0;
elseled2=1;
for(k=0;k<90;k++)?
{speaker=!
speaker;//蜂鸣器响
led1=!
led1;//指示灯闪烁
delay_10us(100);
}
led1=1;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 c51 数字 时钟 年月日 显示