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

📄 text1.c

📁 基于迁入系统的电子钟的c51固件
💻 C
字号:
////////////////////////////////////////////////////////
//               MODEL:CLOCK                          //
//               MCU:AT89C2051                        //
//               Ctystal:12MHz                        //
//               Design by:hevy                       // 
//               Date:2004.08.05                      // 
////////////////////////////////////////////////////////
#include <AT89X051.H>
#define uchar unsigned char
#define uint unsigned int
uchar hour,min,sec; //定义时分秒变量
uchar hour_2,hour_1,min_2,min_1,sec_2,sec_1;//定义显示缓冲变量
uchar code dis[11]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xff}; //LED段码
uchar coun1;//1秒走时=50ms*coun1
uchar coun2;//闪动一次=50ms*coun2
bit adjust; //时间调整标志位,0表示调整分,1表示调整时。
bit display_sw=1;//显示开关标志位,0表示关闭显示,1表示开显示。
bit flash_sw;//调时间时闪动标志位,0表示灭,1表示亮
//---------延时子函数----------------------------
delay()   //
{uchar d2;
 for(d2=0;d2<0xff;d2++);
}
//显示子函数----------------------------------
display()
{if(display_sw==1)
   {P1=dis[sec_1];//显示秒
    P3=0xfe;
    delay();
    P1=dis[sec_2];
    P3=0xfd;
    delay();

    P1=dis[min_1];//显示分
    P3=0xfb;
    delay();
    P1=dis[min_2];
    P3=0xf7;
    delay();

    P1=dis[hour_1];//显示时
    P3=0xef;
    delay();
    P1=dis[hour_2];
    P3=0xdf;
    delay();
    P3=0xff;
   }
 }
//----按键长按、短按检测延时子函数----------------
bit testkeytime()
{uchar d1;
 bit keytime=0;
 if(display_sw==0) //如果关闭了显示,则不进行时间调整
  {keytime=1;      //使函数返回1,表示短按,开显示
   goto en;}
 for(d1=0;d1<0xa0;d1++)//延时
    {display();     //延时期间进行显示,避免按键期间影响显示
     if(P3_7==1)    //如果延时还没完就发现松开了按键,则使返回1,表示短按。
       {keytime=1;
        break;
       }
    }
en:while(P3_7==0);   //如果按键未松开,等待按键松开。
   display();        //调用显示
   return(keytime);//返回值为1表示短按,返回值为0则表示长按
} 
//--走时加1子函数-------------------------------------
add1()
{
 if(sec==59)      //如果秒已经59秒,则:
 {sec=00;         //秒清零,同时分钟加1
  min=min+1;      // 
  if(min==60)     //如果分钟加1后等于60分,则
  {min=00;        // 分钟清零,同时小时加1。
   hour=hour+1;   //
   if(hour==24)   //如果小时加1等于24时,则
   {hour=00;}     //小时也清零。
  }
 }
 else
  {sec++;}        //如果秒钟不等于59秒,则秒加1
}
//----计时中断(1秒计时)---------------------------
uchar hex_bcd(uchar a);  //函数说明
timer0() interrupt 1
{TH0=0x3c;    //中断后重新设置定时初值
 TL0=0xb0;
 if (coun1==20)//如果coun1=20,则表示定时了一秒了(50ms*20=1000ms=1s)
 {coun1=0;     //重新设coun1的值为零。
  add1();      //调用时间加1秒子函数
  sec_1=hex_bcd(sec)&0x0f;//以下是将时分秒转换成BCD码分别存于显示缓冲区
  sec_2=hex_bcd(sec)>>4;
  min_1=hex_bcd(min)&0x0f;
  min_2=hex_bcd(min)>>4;
  hour_1=hex_bcd(hour)&0x0f;
  hour_2=hex_bcd(hour)>>4;
 }
  else
  {coun1++;}//如果未到1秒,则coun1+1
}
//---调时闪动中断---------------------------------
flash() interrupt 3
{TR1=0;     //先关中断
 TH1=0x3c;  //赋定时初值
 TL1=0xb0;
 if(coun2==5)//50ms*5=250ms
   {coun2=0;
    flash_sw=~flash_sw;//闪动标志为取反
    if(flash_sw==0)
      {if(adjust==0)
         {min_1=0x0a;
          min_2=0x0a;
         }
       else
         {hour_1=0x0a;
          hour_2=0x0a;
         }
      }
    else
      {min_1=hex_bcd(min)&0x0f;
       min_2=hex_bcd(min)>>4;
       hour_1=hex_bcd(hour)&0x0f;
       hour_2=hex_bcd(hour)>>4;
      }
    }
 else
   {coun2++;}
 TR1=1;
} 
//-----十六进制数转BCD码子函数---------------------
uchar hex_bcd(uchar a)//
{
 uchar b;      //定义一个2个字节的B变量
 b=a/10;       //
 b=b<<4;       //
 a=a%10;       //
 b=b+a;        //
 return(b);    //
}
//--------设置分钟子函数---------------------------
setmin()
{bit flag1;
 adjust=0;
 while(1)
   {display();
    if(P3_7==0)
      {flag1=testkeytime();
       if(flag1==1)
         {min++;
          if(min==60)
            {min=00;}
         }
       else
        {break;}    
         
      }
   } 
}
//--------设置小时子函数---------------------------
sethour()
{bit flag2;
 adjust=1;
while(1)
   {display();
    if(P3_7==0)
      {flag2=testkeytime();
       if(flag2==1)
         {hour++;
          if(hour==24)
            {hour=00;}
         }
        else
        {break;}    
         
       }
   } 
}
//--------时间设置子函数----------------------------
settime()
{TR0=0;
 TR1=1;
 setmin();
 sethour();
 TR1=0;
 TR0=1;
}
//-----按键检测子函数--------------------------------
scankey()
{bit d_sw;
 d_sw=testkeytime();
 if(d_sw==1) //如果d_sw=1则表示短按
   {display_sw=~display_sw;}
 else 
   {settime();}
} 
//----------主程序函数-------------------------------
void main(void)
{hour=0x00;   //小时清零
 min=0x00;    //分钟清零
 sec=0x00;    //秒钟清零
 coun1=0x00;  //coun1用于计时:1秒=50ms*coun1
 SP=0X50;     //设置堆栈
 TMOD=0X11;   //设定时器工作在1模式
 TH0=0x3c;    //定时器0初值设置
 TL0=0xb0;    //
 TH1=0x3c;    //定时器1初值设置
 TL1=0xb0;    //
 EA=1;        //开总中断
 ET0=1;       //开定时0中断  
 ET1=1;       //开定时1中断
 TR0=1;       //启动计时器0
 while(1)     //无限循环
 {display();  //调用显示函数
  if(P3_7==0) //如果按键按下则进行按键检测。
   {scankey();}//按键检测子函数
 }
}


 
 

⌨️ 快捷键说明

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