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

📄 dianzishizhong.txt

📁 基于单片机的多功能电子时钟的c51源码
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include"c:\stc54\stc54.h"
#include"c:\stc54\LedCode-P.h"

// 定义输入按键I/O
sbit  set  = P3^4;
sbit   inc = P2^6;
sbit  ring = P0^3;

sbit  led0 = P2^1;                              // 闹铃

bit set_sec, set_min, set_hour;                 // 设置时,分,秒标志

bit set_ring0, set_ring1, set_ring2;   // 设置闹铃1,闹铃2,闹铃3标志

bit set_ring;         // 开始设置闹铃标志

bit sec;                                        // 秒标志

bit half;                                       // 半秒标志,调整时间时为被调数的闪动作准备

bit run;                                        // 时间运行标志,时间调整时设置为run = 0

bit key_mark;                                   // 按键标志

bit store_ring0,store_ring1, store_ring2;  // 存储闹铃1,闹铃2,闹铃3标志

bit store_ring;         // 存储闹铃标志

bit ring_call;               // 闹铃响应按键  

bit ring_re;                                    // 不响应闹铃,闹铃不能停止

bit time_recall;                                // 看完闹铃,恢复正常


bit ring0_see, ring1_see, ring2_see;   // 观察闹铃1,闹铃2,闹铃2标志

bit ring_see;

bit ring_full;         // 闹铃存储满标志

bit ring0_lock, ring1_lock, ring2_lock;         // 关闭闹铃1,闹铃2,闹铃3标志

unchar second, minute, hour;

unchar second_before, minute_before, hour_before;

unchar second_ring_before, minute_ring_before, hour_ring_before;

unchar second_set_before, minute_set_before, hour_set_before;

unchar ring0, ring1, ring2;                     // 闹铃1,闹铃2, 闹铃3

unchar count;

unchar count_second;          // 观察闹铃,调整时表自行计数 

unchar dip[6];                                  // 显示变量,数码管需要显示的内容存入此变量

unchar status;         // 二极管状态


extern dsp(unchar);                             // dsp是用汇编语言编写的外部函数,用extern声明

void key_func();        // 按键功能函数

void dspfull();         
 
void dspplay();         

void delay();             // 延时函数

void change();          // 控制二极管亮灭函数

// 由于中断函数任务较多,为了保护现场中断函数工作寄存器用1区
void time0() interrupt 1 
{
     TL0 = TL0 + (-50000 & 0xff);   // 设置初值
  TH0 =  -50000>>8; 
                         
  // 运行时间
  if (++count > 19)
  { 
      count = 0;
   sec = 1;
 
   if(++second > 59)
   {
       second = 0;
    if (++minute > 59)
    {
        minute = 0;
     if (++hour > 23)
     {   
         hour = 0;
     }

    }
         }
   }
   if(count == 10)
      half = 1;
}

void main()
{
 
    TMOD = 1;            // 初始化SFR
 IE = 0x82;
 TR0 = 1;

 run = 1;    // 通电时工

 time_recall = 1;

 // 由于C51初始化时内部RAM都为零,因此系统初始为零的值都不用赋值
 dspplay();

 for( ; ; )
 {
     
  if(!key_mark && (!set || !inc || !ring))
  {
     // 键功能调用

     delay();    // 防止干扰
     if (!set || !inc || !ring)    // 防干扰
     {
         key_mark = 1;                  // 设置标志,确保每次按键只执行1次 
      key_func();
     }
   }
   else if(set && inc && ring)
         key_mark = 0;            //  抬键清标志,以便下次按键

   
      if (sec)
      {
           // 显示功能调用
           if(run && !ring_see )
            dspfull();      // 时钟运行,显示时间
  
        dspplay();
                      

         sec =0;

     count_second++;

      }
      else if(half)
      {
           if(!run)
            dspplay();    
              half = 0;    
   }
     }
}

     
void dspfull()
{   
    
 // 拆数程序,将需要显示的内容送入各自的寄存器
 dip[0] = hour / 10;
 dip[1] = hour % 10;
 dip[2] = minute / 10;
 dip[3] = minute % 10;
 dip[4] = second / 10;
 dip[5] = second % 10;

 if  (((ring0 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring0_lock)
   || ((ring1 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring1_lock)
   || ((ring2 == dip[0]*1000 + dip[1]*100 + dip[2]*10 + dip[3]) && !ring2_lock) )
   
 {
   
    change();
    
 }
}

void dspplay()
{

   unchar n;
   
   
   if(ring0_see)
   { 
     for(n=0;n<6;n++)
    {  
              if(set_ring)
     {
                 if(!run && half  && ((set_hour   && (n == 0 || n == 1))   
                                     ||  (set_min    && (n == 2 || n == 3))
                            ||  (set_sec    && (n == 4 || n == 5))))   // 显示黑屏的条件
   
                 {
                         dsp(0xff);
              }
     else
     {
                   dip[4] = 0;
                dip[5] = 0;

                      dsp(dspc[dip[n]]);
     }   
      }
      else  
      {
            if(n==0 || n==1 || n==2 || n==3)
              {
                   dip[0] = ring0 / 1000;
                dip[1] = ring0 % 1000 /100;
                dip[2] = ring0 % 100 / 10;
                dip[3] = ring0 % 10;
              } 
        
              if(n==4 || n==5)
              { 
                   dip[4] = 0;
                dip[5] = 0;
               }
      dsp(dspc[dip[n]]);

      }
  }
  
    }
 else if(ring1_see)
 {  
     for(n=0;n<6;n++)
    {  
              if(set_ring)
     {
                 if(!run && half  && ((set_hour   && (n == 0 || n == 1))   
                                     ||  (set_min    && (n == 2 || n == 3))
                            ||  (set_sec    && (n == 4 || n == 5))))   // 显示黑屏的条件
   
                 {
                         dsp(0xff);
              }
     else
     {

          dip[4] = 0;
                dip[5] = 0;

                      dsp(dspc[dip[n]]);
     }      
      }
      else  
      {
           if(n==0 || n==1 || n==2 || n==3)
              {
                   dip[0] = ring1 / 1000;
                dip[1] = ring1 % 1000 /100;
                dip[2] = ring1 % 100 / 10;
                dip[3] = ring1 % 10;
              } 
        
              if(n==4 || n==5)
              { 
                   dip[4] = 0;
                dip[5] = 0;
               }

                  dsp(dspc[dip[n]]);
      }
  }
 }
 else if(ring2_see)
    {   
      for(n=0;n<6;n++)
      {  
        if(set_ring)
     {
                 if(!run && half  && ((set_hour   && (n == 0 || n == 1))   
                                     ||  (set_min    && (n == 2 || n == 3))
                            ||  (set_sec    && (n == 4 || n == 5))))   // 显示黑屏的条件
   
                 {
                         dsp(0xff);
              }
     else
     {

          dip[4] = 0;
                dip[5] = 0;
        
                      dsp(dspc[dip[n]]);
     }      
      }
      else  
      {
           if(n==0 || n==1 || n==2 || n==3)
              {
                   dip[0] = ring2 / 1000;
                dip[1] = ring2 % 1000 /100;
                dip[2] = ring2 % 100 / 10;
                dip[3] = ring2 % 10;
              } 
        
              if(n==4 || n==5)
              { 
                   dip[4] = 0;
                dip[5] = 0;
               }

                  dsp(dspc[dip[n]]);
      }
      
  }
     }
  else if(ring_full)
  {
       for(n = 0; n < 6; n++)
    {
        
     if(!run && half  )   // 显示黑屏的条件
   
           {
                      dsp(0xff);
        }
           else  
        {
                   dsp(dspc[dip[n]]);                     // 正常显示
             }
    }
  }
     else if(!ring0_see && !ring1_see && !ring2_see && !ring_full)
  {   
     for(n = 0; n < 6; n++)
  {
        if(!run && half  && ((set_hour   && (n == 0 || n == 1))   
                            ||  (set_min    && (n == 2 || n == 3))
                   ||  (set_sec    && (n == 4 || n == 5))))   // 显示黑屏的条件
   
        {
                      dsp(0xff);
     }
       else  
    {
                   dsp(dspc[dip[n]]);                     // 正常显示
         }
  }

 }
}

void key_func()
{

   if (!set)  // 设置键                              
   {
        if(run)
     {
       if(set_ring0 || set_ring1 || set_ring2)
    { 
        
    set_ring = 1; 
    
    if(set_ring0)
    {
       ring0_lock = 0;

       hour   = ring0 / 100;
       minute = ring0 % 100;
    }
    if(set_ring1)
    {
       ring1_lock = 0;

       hour   = ring1 / 100;
       minute = ring1 % 100;
    }
    if(set_ring2)
    {
       ring2_lock = 0;

       hour   = ring2 / 100;
       minute = ring2 % 100;
    }

          hour_set_before = hour_ring_before;
        minute_set_before = minute_ring_before;
        second_set_before = second_ring_before;
    }
    else
    { 
       hour_set_before = dip[0]*10 + dip[1];
        minute_set_before = dip[2]*10 + dip[3];
        second_set_before = dip[4]*10 + dip[5];
    }

          set_sec  = 1;
       set_min  = 0;
       set_hour = 0;
       run = 0;
     }
     else if(set_sec)
     {
          set_sec  = 0;
       set_min  = 1;
       set_hour = 0;
     }
        else if(set_min)
     {
          set_sec = 0;
       set_min = 0;
       set_hour = 1;
     } 
  else if(set_hour)
  {
       if(set_ring0 || set_ring1 || set_ring2)
    {

    }
    else
    {
        hour   = hour_before;
        minute = minute_before ;
        second = second_before ;
    

⌨️ 快捷键说明

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