<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51單片機定時鬧鐘程序(帶按鍵)

        作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月01日   【字體:

        電路圖很簡單,數碼管是用2片573 接到p2口,通過p0.0 和P0.1鎖存控制,詳見單片機開發板上面的電路:http://www.thefapper.com/f/51hei-5.pdf  , 大家可以按里面的圖接,只需要端口要改為本程序中的即可.可通過按鍵實現設置定時的時間.小時分秒設置等等.
        //////////////////包含頭文件及宏定義//////////////////////////////////////
        #include<reg52.h>
        #include<intrins.h>
        #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<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);
            }
           }
         
          }
         
         

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮