⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 自学C语言 就写了这么个小程序
💻 C
字号:
//******************************************//
//本程序为单片机89c51控制时钟的实例。       //
//1键调整时间,进入后2键调时,3键调分       //
//2键秒显示  ,进入后按1键返回原始状态      //
//3键调整闹铃,进入后2键调时,3键调分       //
//4键起停闹铃,按键启动,再按键撤销         //
//******************************************//
#include<reg51.h>
#include<MAX7_9.h>

#define uchar unsigned char

sbit Beep     =P0^7;  /*“1”闹铃输出*/
sbit S_settime=P3^2;  //1键调整时间
sbit S_secdisp=P3^3;  //2键秒显示
sbit S_setalam=P3^4;  //3键调整闹铃
sbit S_runalam=P3^5;  //4键起停闹铃

uchar click;        //中断次数计数器变量,40次=1s
uchar delay_time;   //延时时间,主要是用于进入其他程序分支后能够退出

/*定义计时变量*/
  uchar time_sec;
  uchar time_min;
  uchar time_hor;


/*定义闹铃变量*/
  uchar alarm_min=10;
  uchar alarm_hor=07;

/*启动闹钟标志*/
  uchar Aflag;

/*定义显示缓冲*/
unsigned char  max7219buf[4];          //max7219 buffer set    //led初始时间显示'--.--'



   void delay(uchar x)      //对于12M晶振延时1ms j取125 6M j取75=1ms
   {
    uchar j;
    while(x--)
      {
       for (j=0;j<75;j++)
        {;}
       }
    }


  /*时间位分离子程序*/
  void time_depart(uchar t_min,uchar t_hor)
  {
   uchar minL,minH,horL,horH,i;

       minL=t_min%10;
       minH=t_min/10;
       horL=t_hor%10;
       horH=t_hor/10;

       //0.5s点亮一次小数点
       if(click<=19)
       {
         horL=horL|0x80;
       }
       else
       {
        horL=horL;
       }

       if (Aflag==1)
       {
        minL=minL|0x80;
       }
       else
       {
        minL=minL;
       }
     max7219buf[0]=horH;
     max7219buf[1]=horL;
     max7219buf[2]=minH;
     max7219buf[3]=minL;
     for (i=0;i<4;i++) send(i+1,max7219buf[i]);
  }



  //键盘扫描子程序
  uchar keyscan(void)      //判断按键并返回键值,无键按下P3=0x3c
      {       /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/
           if((~P3&0x3c)!=0)                    //如果有键按下
         {
              delay(20);                         //延时10ms去抖动
           if((~P3&0x3c)!=0)                    //有键按下
           {
             if(S_settime==0)                         //功能键按下
                 return 1;
             if(S_secdisp==0)                         //调时键按下
                 return 2;
             if(S_setalam==0)                         //调分键按下
                 return 3;
             if(S_runalam==0)                         //闹铃键按下
                 return 4;
            }
          }
           return 0;
     }         /*&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/


   //时间调整子程序
   void SetTime(void)
    {      /*----------------------*/
    uchar key;
    delay_time=0;
    while(1)
    {
      key=keyscan();
      if (key==2)    //调时键按下
        {
          delay_time=0;
          key=0;
          if(++time_hor>=24)
            {
              time_hor=0;
             }
             delay(250);
         }
         if (key==3)  //调分键按下
          {
            delay_time=0;
            key=0;
            if(++time_min>=60)
              {
                 time_min=0;
              }
              delay(250);
           }

       if(4<=delay_time) break;
       time_depart(time_min,time_hor);

       }
     }     /*----------------------*/


   //秒显示子程序
   void disp_sec(void)
    {      /*########################*/
    uchar key;
    uchar s;
    while(1)
    {
      s=0;
       time_depart(time_sec,s);

       key=keyscan();
      if(key==1) break;   //若功能键按返回正常显示状态
     }
    }      /*########################*/


   //定时调整子程序
   void SetAlarm(void)      //判断按键并返回键值,无键按下P3=0x3c
    {      /*@@@@@@@@@@@@@@@@@@@@@@@@@*/
    uchar key;
    uchar p;
    delay_time=0;
    while(1)
    {
      key=keyscan();
      if (key==2)  //调时键按下
         {
           delay_time=0;
           p=delay_time;
           key=0;
           if(++alarm_hor>=24)
           {
             alarm_hor=0;
           }
           delay(250);
          }

       if (key==3)  //调分键按下
       {
          delay_time=0;
          p=delay_time;
          key=0;
          if(++alarm_min>=60)
            {
             alarm_min=0;
            }
            delay(250);
        }

       if(4<=delay_time) break;

       time_depart(alarm_min,alarm_hor);
 
       }
  }       /*@@@@@@@@@@@@@@@@@@@@@@@@@*/


  /*定时器中断子程序*/
  void timer0 (void) interrupt 1 using 2
   {     /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/
       TH0=-10000/256;
       TL0=-10000%256;

     if(++click>=40)          //定时25ms    //更新时间子循环
       {
            delay_time++;
            click=0;
            if(++time_sec>=60)
            {
               time_sec=0;
               if(++time_min>=60)
               {
                  time_min=0;
                  if(++time_hor>=24)
                  {
                      time_hor=0;
                   }
                }
             }
         }
      //判断闹铃报时
      if (Aflag==1)
      {
          if (time_hor==alarm_hor)
             if (time_min==alarm_min)
                {Beep=1;}
              else
                {Beep=0;}
       }
      //判断正点报时
      if (time_min==0)
      {
         if (time_sec==0)
                {Beep=1;}
         else
                {Beep=0;}
       }

    }    /*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/


void main(void)
  {       /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  uchar key_value;

  TMOD=0x01;
  TH0=-10000/256;
  TL0=-10000%256;                     //定时25ms
  EA=1;                               //开CPU中断
  ET0=1;                              //开定时器中断
  TR0=1;
  Beep=0;
 max7_9_init();

   while(1)
   {
      time_depart(time_min,time_hor);


      key_value=keyscan();   //扫描键盘

      if (key_value==1)      //启动调时功能
      {
       key_value=0;
       SetTime();
      }
      else if (key_value==2) //启动秒显功能
      {
       key_value=0;
       disp_sec();
      }
      else if (key_value==3) //启动调整闹铃功能
      {
       key_value=0;
       SetAlarm();
      }
      else if (key_value==4) //启动闹铃,Aflag==1,闹铃ON,Aflag==0,闹铃OFF
      {
        key_value=0;
        if (Aflag==1)
          {
            Aflag=0;
           }
        else
           {
            Aflag=1;
           }
       }

    }

  }       /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -