久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

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

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

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

電路圖很簡單,數碼管是用2片573 接到p2口,通過p0.0 和P0.1鎖存控制,詳見單片機開發板上面的電路:http://www.zg4o1577.cn/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);
    }
   }
 
  }
 
 

關閉窗口

相關文章

主站蜘蛛池模板: 国产乱肥老妇国产一区二 | 免费黄色片在线观看 | 国产成人精品一区二区三区视频 | 国产精品美女在线观看 | 亚洲精品日韩在线 | 亚洲第一视频网 | 精品国产乱码久久久久久老虎 | 中文字幕亚洲视频 | 国产精品地址 | 精一区二区| 在线观看视频亚洲 | 精品久久一 | 九九亚洲| 国产一区二区三区四区五区3d | 亚洲免费在线 | 色婷婷久久久久swag精品 | 久久综合伊人一区二区三 | 亚洲人成一区二区三区性色 | 日本在线视频一区二区 | 午夜国产一区 | 久久黄网 | 亚洲精品一区在线观看 | 91色视频在线观看 | 国产精品久久久久久久久久久免费看 | 91精品亚洲| 久久伊人影院 | 欧美日韩国产三级 | а√中文在线8 | 亚洲精品国产一区 | 天天综合天天 | 成人在线视频一区二区三区 | 男女深夜网站 | 日韩网站在线观看 | 欧美色a v | 中文字幕亚洲欧美 | 精品视频一区二区 | 五月天婷婷综合 | 成人在线免费视频观看 | 91精品国产一区二区三区 | 久久国产精品72免费观看 | 91在线免费观看 |