单片机c51数字时钟带年月日显示.docx

上传人:b****4 文档编号:4417510 上传时间:2022-12-01 格式:DOCX 页数:16 大小:237.41KB
下载 相关 举报
单片机c51数字时钟带年月日显示.docx_第1页
第1页 / 共16页
单片机c51数字时钟带年月日显示.docx_第2页
第2页 / 共16页
单片机c51数字时钟带年月日显示.docx_第3页
第3页 / 共16页
单片机c51数字时钟带年月日显示.docx_第4页
第4页 / 共16页
单片机c51数字时钟带年月日显示.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

单片机c51数字时钟带年月日显示.docx

《单片机c51数字时钟带年月日显示.docx》由会员分享,可在线阅读,更多相关《单片机c51数字时钟带年月日显示.docx(16页珍藏版)》请在冰豆网上搜索。

单片机c51数字时钟带年月日显示.docx

单片机c51数字时钟带年月日显示

【单片机】c51数字时钟(带年月日显示)

 

显示当前时间:

9点58分34秒(第一个零表示闹钟未开启)

当前日期:

10年4月六日

摘要:

本设计以单片机为核心,LED数码管动态扫描显示。

采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。

具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能

说明

系统的功能选择由7个按键完成。

其中P3.0,P3.1分别对应调整当前时间的时和分,

P3.2为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)

P3.3用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按P3.0,P3.1可进行闹钟时分的设定,此时,led1灯灭。

闹铃时间到切闹钟开关开启时,闹铃响一分钟。

P3.5\P3.6\P3.7对年月日进行调整(第一次按P3.5,就进入了年月日的显示,现在就可对日期进行调整)。

按P3.1回到当前时间的显示状态。

整点到时:

报警对应小时的次数。

程序如下:

#include

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

uchardatakeyvalue;   //查到的键值

uchardatakeys;       //转换出的数字

uchardis[8];

ucharcodeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x39,0xf7};

            //   0   1   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_();

   _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;

}

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

当前位置:首页 > 解决方案 > 学习计划

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

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