專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

51單片機(jī)定時(shí)鬧鐘程序(帶按鍵)

作者:huqin   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年04月01日   【字體:

電路圖很簡(jiǎn)單,數(shù)碼管是用2片573 接到p2口,通過(guò)p0.0 和P0.1鎖存控制,詳見單片機(jī)開發(fā)板上面的電路:http://www.torrancerestoration.com/f/51hei-5.pdf  , 大家可以按里面的圖接,只需要端口要改為本程序中的即可.可通過(guò)按鍵實(shí)現(xiàn)設(shè)置定時(shí)的時(shí)間.小時(shí)分秒設(shè)置等等.
//////////////////包含頭文件及宏定義//////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
/////////////////////////////////////////////////////////////////////////
////////////////繼電器響應(yīng)動(dòng)作指示燈//////////////////////////////////////
sbit light=P1^0;
sbit int0_ok=P3^2;
sbit int1_ok=P3^3;
/////////////////數(shù)碼管的段位鎖存////////////////////////////////////////
sbit duan=P0^0;
sbit wei=P0^1;
uchar bit1,bit2,bit3,bit4,bit5,bit6;///////////////小時(shí) 分鐘 秒鐘顯示碼
uchar fen=0;// 分鐘緩存
uchar miao=0;//秒緩存
uchar shi=0;//小時(shí)緩存
uchar key_temp;/////按鍵暫存
//uchar key_old;
uchar key_count;//按鍵計(jì)數(shù)
uchar key_back;/////按鍵備份
uchar key_data;//////按鍵數(shù)值
uchar key_con;////
uchar key_ok;
uchar int0_function=0;///功能0,做調(diào)節(jié)始終
uchar int1_function=0;///功能1,做運(yùn)行停止用
uchar time;////定時(shí)常數(shù)
uchar t2time;
#define KEYDELAY 25    /*首鍵延遲次數(shù)*/
#define KEYLOOP 10    /*連續(xù)鍵間隔次數(shù),需小于KEYDELAY*/
void shanshuo(uchar aa,uchar ii);
void init();
void sign(uchar i);
////////////////毫秒級(jí)的延時(shí)////////////////////////////////////////////////
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--);
}
/////////////////////////////數(shù)碼管的段位碼///////////////////////////////
uchar code tableduan[]={    //共陽(yáng)極數(shù)碼管段碼
         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
/////////////////////////////////數(shù)碼管顯示程序///////////////////////////////////////
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);
}
/////////////////////////////////數(shù)碼管顯示程序///////////////////////////////////////
//////////////////////////////////////數(shù)碼管顯示位計(jì)算/////////////////////////////////
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);*/
}
//////////////////////////////////////數(shù)碼管顯示位計(jì)算/////////////////////////////////////////////////
//////////////////////////////////////單擊按鍵鍵值表////////////////////////////////////////////////////////
 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;
 }
 //////////////////////////////////////長(zhǎng)按按鍵鍵值表////////////////////////////////////////////////////////
 /*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)                //連續(xù)鍵,不要?jiǎng)t把此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;
      }
   }
   /////////////////定時(shí)器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;
}
////////////////////////////主函數(shù)開始///////////////////////////
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);
}
////////////////////小時(shí)設(shè)定///////////////////////////
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);
 }
  
 
 }
/////////////////分鐘設(shè)定/////////////////////////
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);
 }
 
 }
//////////////////////秒數(shù)設(shè)定////////////////////////////
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);
//}
  ///////////////////////////計(jì)時(shí)開始/////////////////////
   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);
 
   }
////////////////計(jì)時(shí)結(jié)束,關(guān)掉定時(shí)器和繼電器/////////////////
 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);
 
  }
}
/////////////////定時(shí)器0的中斷服務(wù)///////////////////////////
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 是小時(shí)閃爍 ,如果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);
    }
   }
 
  }
 
 

關(guān)閉窗口

相關(guān)文章