单片机c51数字时钟带年月日显示Word格式文档下载.docx
《单片机c51数字时钟带年月日显示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机c51数字时钟带年月日显示Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
2
3
4
5
6
7
8
9
-
灭灯
c
n
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_();
}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;
//亮灯
//灭灯
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[6]=year%10;
dis[7]=year/10;
/*主函数*/
voidmain()
P2=0xff;
P1=0XFF;
p3_4=0;
run=1;
led2=0;
//运行指示灯亮
led1=1;
flash=0x00;
//第三位显示“-”
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)
{
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;
led1=0;
//指示灯亮
if(month==2){
if(leap_year==1)
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;
while(!
minitek)
for(n=0;
n<
1000;
n++);
if(!
minitek==0)break;
//延时防抖
minite++;
second=0x00;
20;
n++)
speaker=!
speaker;
delay_10us(50);
//蜂鸣器响
if(minite==60)minite=0x00;
minitek);
//等待键松开
//显示灯
while(!
hourk)
hourk==0)break;
hour++;
30;
speaker=!
delay_10us(30);
if(hour==24)hour=0x00;
hourk);
yeark)
//yeark键复用进入年月日调整
yeark==0)break;
dis_nyr=1;
yeark);
while(dis_nyr)
{
nyr_to_dis();
yeark)
monthk)
monthk==0)break;
if(month==13)month=1;
monthk);
}
dayk)
dayk==0)break;
31)day=0x01;
//指示灯亮
30)day=0x01;
//指示灯亮
dayk);
{for(n=0;
if(hourk)break;
dis_nyr=0;
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);
beep=0;
while(run==0)
//闹钟时间设定
{
clarm_to_dis();
///////////////////////////////////////////////////////////
//延时防抖
c_min++;
//蜂鸣器响
if(c_min==60)c_min=0x00;
c_hou++;
if(c_hou==24)c_hou=0x00;
/***************定时器T0中断*****************/
timer0()interrupt1using2
//定时器0中断号为1号使用第2组寄存器
{TR1=0;
TH0=15548/256;
TL0=15548%256;
CNTA++;
if(beep)
{
if(speaker_num%2)speaker=!
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;
if(hour>
7){speaker_num=2*hour;
//整点到设定报时次数
蜂鸣标志
置1
beep=1;
if(hour==24)
hour=0;
calculate=1;
//0点到,日期标志加一
/*********定时器中断T1**********/
timer1()interrupt3using3
TH1=0xfc;
P0=0xff;
led_wei=1;
led_wei=0;
P0=seg[dis[i]];
led_duan=1;
led_duan=0;
P0=wei;
if(++i==8)i=0;
wei=_cror_(wei,1);
/**********************外中断0*******************/
int_0()interrupt0
clarm_switch=!
clarm_switch;
//闹钟开关
//开启显示
开启第一位显示C
//关闭不显示
for(k=0;
k<
40;
k++)
{speaker=!
delay_ms(5);
/********************外中断1********************/
int_1()interrupt2
//闹钟时间设置/运行转换开关
run=!
run;
if(run)led2=0;
elseled2=1;
for(k=0;
90;
k++)
//蜂鸣器响
//指示灯闪烁
delay_10us(100);