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

您所在的位置:网站首页 单片机闹钟设计程序 51单片机定时闹钟程序(带按键)

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

2024-07-10 01:13| 来源: 网络整理| 查看: 265

电路图很简单,数码管是用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;       }    }    /////////////////定时器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--;}      } } 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3