×
单片机 > 单片机程序设计 > 详情

51单片机定时闹钟程序(带按键)

发布时间:2020-08-21 发布时间:
|
电路图很简单,数码管是用2片573 接到p2口,通过p0.0 和P0.1锁存控制,详见单片机开发板上面的电路:http://www.51hei.com/f/51hei-5.pdf  , 大家可以按里面的图接,只需要端口要改为本程序中的即可.可通过按键实现设置定时的时间.小时分秒设置等等.

//////////////////包含头文件及宏定义//////////////////////////////////////
#include
#include
#define uchar unsigned char
#define uint  unsigned int
/////////////////////////////////////////////////////////////////////////
////////////////继电器响应动作指示灯//////////////////////////////////////
sbit light=P1^0;
sbit int0_ok=P3^2;
sbit int1_ok=P3^3;
/////////////////数码管的段位锁存////////////////////////////////////////
sbit duan=P0^0;
sbit wei=P0^1;
uchar bit1,bit2,bit3,bit4,bit5,bit6;///////////////小时 分钟 秒钟显示码
uchar fen=0;// 分钟缓存
uchar miao=0;//秒缓存
uchar shi=0;//小时缓存
uchar key_temp;/////按键暂存
//uchar key_old;
uchar key_count;//按键计数
uchar key_back;/////按键备份
uchar key_data;//////按键数值
uchar key_con;////
uchar key_ok;
uchar int0_function=0;///功能0,做调节始终
uchar int1_function=0;///功能1,做运行停止用
uchar time;////定时常数
uchar t2time;
#define KEYDELAY 25    /*首键延迟次数*/
#define KEYLOOP 10    /*连续键间隔次数,需小于KEYDELAY*/
void shanshuo(uchar aa,uchar ii);
void init();
void sign(uchar i);
////////////////毫秒级的延时////////////////////////////////////////////////
void delayms(uint i)   //误差 0us
{  
   uint c;
    unsigned char a,b;
    for(c=i;c>0;c--)
        for(b=142;b>0;b--)
            for(a=2;a>0;a--);
}
/////////////////////////////数码管的段位码///////////////////////////////
uchar code tableduan[]={    //共阳极数码管段码
         0xc0,0xf9,0xa4,0xb0,
         0x99,0x92,0x82,0xf8, 0x80,0x90,//0-9
   //0x88,0x83,0xc6,0xa1,0x86,0x8E//A-F
   0xbf//-
   };
uchar code tablewei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//位码
uchar code welcom[]={0xbf,0xbf,0xc0,0x8c,0x86,0xc8,0xbf,0xbf};//--OPEN-- 1
uchar code on[]={0xbf,0xbf,0xbf,0xc0,0xc8,0xbf,0xbf,0xbf};//---on---       2
uchar code off[]={0xbf,0xbf,0xc0,0x8e,0x8e,0xbf,0xbf,0xbf};//--off---      3
uchar code closed[]={0xbf,0xc6,0xc7,0xc0,0x92,0x86,0xf8,0xbf};//-closed-   4
/////////////////////////////////数码管显示程序///////////////////////////////////////
void display(uchar duan1,uchar wei1)
{
  P2=0xff;
  duan=0;
  wei=0;
  P2=tableduan[duan1];
  duan=1;
 
  duan=0;
  P2=tablewei[wei1];
  wei=1;
 
  wei=0;
  delayms(1);
}
/////////////////////////////////数码管显示程序///////////////////////////////////////
//////////////////////////////////////数码管显示位计算/////////////////////////////////
void jisuan()
{
     bit1=shi/10;
  bit2=shi%10;
     bit3=fen/10;
  bit4=fen%10;
     bit5=miao/10;
  bit6=miao%10;
  /*
    display(bit1,0);
    display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);*/
}
//////////////////////////////////////数码管显示位计算/////////////////////////////////////////////////
//////////////////////////////////////单击按键键值表////////////////////////////////////////////////////////
 uchar key_data_jisuan(uchar dat)
 {
   uchar key;
    switch(dat)
 {
   case 0xfb:key=1;break;
   case 0xf7:key=2;break;
   case 0xef:key=3;break;
   case 0xdf:key=4;break;
   case 0xbf:key=5;break;
   case 0x7f:key=6;break;
   default:key=0;break;
 }
 return key;
 }
 //////////////////////////////////////长按按键键值表////////////////////////////////////////////////////////
 /*uchar key_data_con_jisuan(uchar dat)
 {
   uchar key;
    switch(dat)
 {
   case 0xef:key=5;break;
   case 0xdf:key=6;break;
   default:key=0;break;
 }
 return key;
 }
 */
 /////////////////////////////////////////键盘扫描//////////////////////////////////////////////////////
 void key_scan()
 {
  P3=0xff;
   if((P3&0xff)!=0xff)
   {
       delayms(10);
      key_temp=P3;
   if(key_temp==key_back)
   {
       delayms(10);
    key_count++;
    if (key_count==KEYDELAY)                //连续键,不要则把此if屏蔽
               {
                key_ok=0;
                key_data=key_data_jisuan(key_temp);    //键*
                key_count=KEYDELAY-KEYLOOP;
            }
   }
   else
   {
   key_count=0;
   key_back=key_temp;
   }
   //key_ok=1;
   }
   else
   {
      if(key_count)
   {
    key_count=0;
    key_data=key_data_jisuan(key_temp);
   }
   key_temp=0;
   key_ok=1;
      }
   }[page]
   /////////////////定时器0的初始化///////////////////////////
void InitTimer0(void)
{
    TMOD = 0x01;
    TH0 = 0x3C;
    TL0 = 0x0B0;
  
    ET0 = 1;
    //TR0 = 1;
    //EA = 1;
}
void InitTimer1(void)
{
    TMOD = 0x10;
    TH1 = 0x3C;
    TL1 = 0x0B0;
    EA = 1;
   // ET1 = 1;
   // TR1 = 1;
}
////////////////////////////主函数开始///////////////////////////
void main()
{
   uchar ss;
   InitTimer0();
  // InitTimer1();
  while(1)
  {
   key_scan();
   if(key_data==1)
   {
    key_data=0;
 
 int0_function++;
 if(int0_function==5)
  {
  int1_function=0;
  ss=0;
  int0_function=1;
  }
   }
 if(key_data==2)
   {
    key_data=0;
  
 int1_function++;
 if(int1_function>=3)int1_function=1;
   }
if(int0_function==0)
{
 sign(1);
}
////////////////////小时设定///////////////////////////
if(int0_function==1)
 {
  TR0 = 0;
    EA = 0;
   // ET1 = 1;
   // TR1 = 1;
    light=1;
 // shanshuo(0,1);
  if(key_data==3)
  {
 
  key_data=0;
  shi++;if(shi==24)shi=0;
  }
 if(key_data==4)
  {
 
  key_data=0;
  shi--;if(shi==0)shi=23;
  }
   jisuan();
  shanshuo(0,1);
 for(ss=10;ss>0;ss--)
 {
    display(bit1,0);
    display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
 }
for(ss=10;ss>0;ss--)
 {
   // display(bit1,0);
  // display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
 }
   
  
 }
/////////////////分钟设定/////////////////////////
if(int0_function==2)
 {
    TR0 = 0;
    EA = 0;
   // ET1 = 1;
   // TR1 = 1;
    light=1;
  if(key_data==3)
  {
 
  key_data=0;
  fen++;if(fen==60)fen=0;
  }
 if(key_data==4)
  {
 
  key_data=0;
  fen--;if(fen==0)fen=59;
  }
  jisuan();
 // shanshuo(0,2);
for(ss=10;ss>0;ss--)
 {
    display(bit1,0);
    display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
 }
for(ss=10;ss>0;ss--)
 {
    display(bit1,0);
   display(bit2,1);
    display(10,2);
   // display(bit3,3);
   // display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
 }
  
 }
//////////////////////秒数设定////////////////////////////
if(int0_function==3)
 {
    TR0 = 0;
    EA = 0;
   // ET1 = 1;
   // TR1 = 1;
    light=1;
  if(key_data==3)
  {
 
  key_data=0;
  miao++;if(miao==60)miao=0;
  }
 if(key_data==4)
  {
 
  key_data=0;
  miao--;if(miao==0)miao=59;
  }
  jisuan();
 // shanshuo(0,3);
for(ss=10;ss>0;ss--)
 {
    display(bit1,0);
    display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
 }
for(ss=10;ss>0;ss--)
 {
    display(bit1,0);
   display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
   // display(bit5,6);
   // display(bit6,7);
 }
  }
if(int0_function==4)
{
    display(bit1,0);
    display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
}
//if(int0_function==6)
//{
// sign(6);
//}
  ///////////////////////////计时开始/////////////////////
   if(int1_function==1)
   {
    TR0 = 1;
    EA = 1;
 int0_function=4;
   // ET1 = 0;
    // TR1 = 0;
 if((shi==0)&&(fen==0)&&(miao==0))
 {
  light=0;
 }
 
   jisuan();
   shanshuo(0,0);
  
   }
////////////////计时结束,关掉定时器和继电器/////////////////
 if(int1_function==2)
   {
    TR0 = 0;
    EA = 0;
   // ET1 = 1;
   // TR1 = 1;
    light=1;
   int0_function=0;
   int1_function=0;
  
   jisuan();
   sign(4);

 
   }
 
 
  // jisuan();
 //shanshuo(0,0);
 
  }
}
/////////////////定时器0的中断服务///////////////////////////
void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x3C;
    TL0 = 0x0B0;
    //add your code here!
    time++;
   if(time==20)
     {
     time=0;
     if(miao>0)miao--;
     if((miao==0)&&(fen>0)){miao=59;fen--;}
     if((fen==0)&&(shi>0)){fen=59;shi--;}
     }
}[page]
void Timer1Interrupt(void) interrupt 3
{
    TH1 = 0x3C;
    TL1 = 0x0B0;
    //add your code here!
 t2time++;
 if(t2time==20)t2time=0;
}
void shanshuo(uchar aa,uchar i)///如果i=1 是小时闪烁 ,如果i=2 是 分钟闪烁,如果i=3 是秒钟闪烁
{
    //uchar i;//闪烁频率
 if(aa==4|aa==0)
 {
                for(i;i>0;i--)
       {
       display(bit1,0);
       display(bit2,1);
       display(10,2);
       display(bit3,3);
       display(bit4,4);
       display(10,5);
       display(bit5,6);
       display(bit6,7);
       }
 }
    if(aa==1)
 {
        for(i;i>0;i--)
       {
      // display(bit1,0);
      // display(bit2,1);
       display(10,2);
       display(bit3,3);
       display(bit4,4);
       display(10,5);
       display(bit5,6);
       display(bit6,7);
       }
    
 }
 if(aa==2)
 {
                   for(i;i>0;i--)
       {
         display(bit1,0);
         display(bit2,1);
         display(10,2);
        // display(bit3,3);
        // display(bit4,4);
         display(10,5);
         display(bit5,6);
         display(bit6,7);
       }
 }
 if(aa==3)
 {
                       for(i;i>0;i--)
        {
          display(bit1,0);
          display(bit2,1);
          display(10,2);
          display(bit3,3);
          display(bit4,4);
          display(10,5);
         // display(bit5,6);
         // display(bit6,7);
        }
 }
for(i;i>0;i--)
  {
    display(bit1,0);
    display(bit2,1);
    display(10,2);
    display(bit3,3);
    display(bit4,4);
    display(10,5);
    display(bit5,6);
    display(bit6,7);
  }
}
/////////////////闪烁程序/////////////////////////////////////////////////////////////
void sign(uchar i )// 1, 显示open,显示on 3,显示off 4,显示 closed
{
  uchar bb;
  if(i==0)
  {
   P2=0x00;
   P0=0x03;
  }
  if(i==1)
  {
    for(bb=0;bb<8;bb++)
    {
     
  P2=0xff;
  duan=0;
  wei=0;
  P2=welcom[bb];
  duan=1;
  //delayms(1);
  duan=0;
  P2=tablewei[bb];
  wei=1;
  //delayms(1);
  wei=0;
  delayms(1);
    }
   }
  if(i==2)
  {
    for(bb=0;bb<8;bb++)
    {
     
  P2=0xff;
  duan=0;
  wei=0;
  P2=on[bb];
  duan=1;
  //delayms(1);
  duan=0;
  P2=tablewei[bb];
  wei=1;
  //delayms(1);
  wei=0;
  delayms(1);
    }
  
}
if(i==3)
  {
    for(bb=0;bb<8;bb++)
    {
     
  P2=0xff;
  duan=0;
  wei=0;
  P2=off[bb];
  duan=1;
  //delayms(1);
  duan=0;
  P2=tablewei[bb];
  wei=1;
  //delayms(1);
  wei=0;
  delayms(1);
    }
   }
   if(i==4|i==0)
  {
    for(bb=0;bb<8;bb++)
    {
     
  P2=0xff;
  duan=0;
  wei=0;
  P2=closed[bb];
  duan=1;
  //delayms(1);
  duan=0;
  P2=tablewei[bb];
  wei=1;
  //delayms(1);
  wei=0;
  delayms(1);
    }
   }
  
  }



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
可升级和可配置的PSoC62系列MCU平台架构