专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单片机闹钟程序及PROTUES仿真文件

作者:huqin   来源:本站原创   点击数:  更新时间:2014年03月16日   【字体:

//提示:k1k2k3k4分别是:小时。分钟。秒钟的调节功能。定时时间的显示功能。k5k6分别是设定第二时间定为0:01:00,启用或者关闭闹钟,

下面是仿真图,芯片是用的51单片机: 


PROTUES工程文件可以从 http://www.51hei.com/bbs/dpj-24552-1.html 下载

下面是源程序:
#include"AT89X52.H"
#define uchar unsigned char
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};   //断码
uchar code pos[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                                                //微码
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit jidianqi1=P1^5;
sbit k6=P1^6;
sbit led=P1^7;
uchar k[8]={0,0,16,0,0,16,0,0};      //01234567

uchar code seg00[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};   //断码
uchar code pos00[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                                                //微码
uchar k00[8]={0,0,16,0,0,16,0,0};                                                                            //01234567
uchar second;
uchar minite;
uchar hour;
uchar num;  
uchar naozhongqiyongFlag;
 
uchar second00;
uchar minite00;
uchar hour00;
uchar num00;
////////////////////////////////////////////////////////////////////////////////////
void TimeCompate(void)
  {
if(naozhongqiyongFlag) 
  {
    if((second00==0)&&(minite00==1)&&(hour00==0))               ///&&(minite00<=2),,,(naozhongqiyongFlag==1)&&,,  led=1
        {
       jidianqi1=0;                          
      }
  else if((second00==5)&&(minite00==42)&&(hour00==0))
        {
       jidianqi1=1;   naozhongqiyongFlag=~naozhongqiyongFlag;    led=~led;                   
      }
  }   
/* if(hour00!=0)
       { jidianqi1=1;   naozhongqiyongFlag=0;                             
    }
  if(hour00==0) 
       {
      if(minite00<1)
      { jidianqi1=1;   naozhongqiyongFlag=0;                             
      }
     else if(minite00>2)
       { jidianqi1=1;   naozhongqiyongFlag=0;                             
       }
      else
           {
           jidianqi1=0;                                 
        }
  }
 
/*/
//////////////////////////////////////////

    
}

 


//////////////// //延时程序///////////////////////////////
void delay_5ms(void)         
{
  uchar i,j;
  for(i=10;i>0;i--)
  for(j=248;j>0;j--)
  ;
}

////////////显示程序,这个写法不错啊。//////////////////////////
void disp(uchar m,uchar n)    
{
P2=pos[n];                          //查表法 把对应的段码送P2?
P0=seg[m];                           //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}


////////////显示程序,这个写法不错啊。//////222222222222222/////
void disp00(uchar x,uchar y)    
{
P2=pos00[y];                          //查表法 把对应的段码送P2?
P0=seg00[x];                           //查表法 把对应的未码送P0口
delay_5ms();
P2=0x00;
}

 

////////////////////主程序//////////////////////////////
void main(void)
{

  uchar j;
  uchar p;
  TMOD=0x01;
  // TH0=-50000/256;
  // TL0=-50000%256;
  TR0=1;
  ET0=1;
  EA=1;
  second=0;
  minite=0;
  hour=0;

  second00=7;
  minite00=8;
  hour00=9;

  jidianqi1=1;
  naozhongqiyongFlag=0;
  led=1;

  while(1)
   {

   TimeCompate();
     if(k1==0)
       {
         delay_5ms();
          if(k1==0)        //判断按键是否按下
            { 
             second=0;
         while(k1==0);               
            }
        }
     if(k2==0)                //判断按键是否按下
        {
          delay_5ms();
          if(k2==0)
            {
              minite++;
              if(minite==60)  minite=0;
     while(k2==0);
            }
        }
     if(k3==0)                    //判断按键是否按下
        {
          delay_5ms();
          if(k3==0)
            {
              hour++;
              if(hour==24)  hour=0;
              while(k3==0)
                   {for(j=0;j<8;j++)              //扫描显示程序,循环有8次,01234567.
                   disp(k[j],j);               //扫描显示程序
         }     
            }
        }

 //////////////////////////////////////////////////////////////////////
  
   if(k4==0)                    //判断按键是否按下
        {
          delay_5ms();
          if(k4==0)
            {
              while(k4==0)
       {
                    for(p=0;p<8;p++)
                     disp00(k00[p],p); 
       TimeCompate();
         ;
                 }    
            }
        }

    ///////////////////////////////////////////////////////////////////////////////
  if(k5==0)                    //判断按键是否按下
        {
          delay_5ms();
          if(k5==0)
            {
     second00=57;
              minite00=0;
              hour00=0;


              while(k5==0)
       {
                    for(p=0;p<8;p++)
                     disp00(k00[p],p); 
         ;
                 }    
            }
        }
//////////////////////////////////////////////////////////////////////////////////////
if(k6==0)                    //判断按键是否按下
        {
          delay_5ms();
          if(k6==0)
            {
             naozhongqiyongFlag=~naozhongqiyongFlag;
     led=~led;
     
              while(k6==0)
       {
                  ;
                 }    
            }
        }

   ////////////////////////////////////////////////////////////////////////////////////
      for(j=0;j<8;j++)              //扫描显示程序,循环有8次,01234567.
      disp(k[j],j);               //扫描显示程序
  ////////////////////////////////////////////////////////////////////////////////////

      TimeCompate();
  ////////////////////////////////////////////////////////////////////////////////////

 

   
   }
}
////////////////*定时器工作方式*/ /////////////////////////////////
void t0(void) interrupt 1  /*定时器工作方式*/  using 0   //工作寄存器
{
  num++;
 
  if(num==20)
    {
      num=0;
      second++;
      if(second==60)
        {
          second=0;
          minite++;
          if(minite==60)
            {
              minite=0;
              hour++;     
              if(hour==24)
                {
                  hour=0;
                }
             }
         }
     k[0]=second%10;     //各位
     k[1]=second/10;         //各十位
     k[3]=minite%10;        //各位
     k[4]=minite/10;      //各十位
     k[6]=hour%10;        //各位
     k[7]=hour/10;        //各十位

    }
  num00++;
  if(num00==20)
    {
      num00=0;
      second00++;
      if(second00==60)
        {
          second00=0;
          minite00++;
          if(minite00==60)
            {
              minite00=0;
              hour00++;
              if(hour00==99)
                {
                  hour00=0;
                }
             }
         }
        k00[0]=second00%10;         //各位
              k00[1]=second00/10;         //各十位
              k00[3]=minite00%10;         //各位
              k00[4]=minite00/10;         //各十位
              k00[6]=hour00%10;           //各位
              k00[7]=hour00/10;           //各十位
     }

 

 
 
   TH0=-50000/256;
   TL0=-50000%256;
   
}

关闭窗口

相关文章