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

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

基于單片機(jī)定時器中斷的時鐘程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2010年07月05日   【字體:

大家只要自行更改端口就可以使用,走時還是比較準(zhǔn)確的

#include<reg51.h>
#define uchar unsigned char
#define uint  unsigned int

sbit RING1=P3^7;                           //P3^7接蜂鳴                                       
sbit OPEN=P3^1;                            //鬧鐘開時LED亮                    
uchar idata buffer[8]={0,0,0,0,0,0,10,11};//定義兩段緩沖區(qū),buffer用于過程中時間BCD碼暫存并初始化
                                           

uchar code LED[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X40,0X40}; //LED段譯存儲于程序存儲區(qū)
uchar miao=0;fen=58;shi=10; //定義全局變量用于miao,fen,shi用于存儲過程時間
uchar _20ms;//定義全局變量_20ms用于計(jì)數(shù)中斷個數(shù),50個為1秒
uchar hour2,minutes2,second2;//鬧鈴設(shè)置時間存儲區(qū)
uchar hour1,minutes1,second1;//修改時間時暫存區(qū)
bit hour,minutes,second;//修改相應(yīng)時的位標(biāo)志 

bit add,dec;//加減位標(biāo)志
bit openring,cancelring;//鬧鈴開、關(guān)、取消標(biāo)志                                            
bit setring,settime;//鬧鈴設(shè)置、時間設(shè)置標(biāo)志                                    
bit ok;//確定變量


 void delay_1ms(uchar x)//延時1ms
{
  uchar j;
  while(x--)
    {
      for(j=0;j<123;j++){;}
    }
}
 
 void  inital(void)//定時器初始化函數(shù)
{  RING1=1;      //這里RING等于0時蜂鳴器響;
   TMOD=0x01;   //定時器0工作于方式1,采用12M晶振,定時20ms
   TH0=(65536-20000)/256;
   TL0=(65536-20000)%256; 
   TR0=1;    //TR0=1  啟動定時器
   EA=1;     //開總中斷
   ET0=1;  //開定時器中斷
}


void timer0 (void) interrupt 1 using 1   //定時0中斷函數(shù)
{  TH0=(65536-20000)/256;
   TL0=(65536-20000)%256; 
    _20ms++;
    if(50==_20ms)   //判斷是否到了一秒
       {  miao++;        //到了一秒,秒++
         _20ms=0; 

         if(miao==60)   //六十秒到了嗎
            { fen++;        //到了份++
              miao=0;
          
              if(fen==60)     //六十分到了嗎
                 { shi++;      //到了時++
                   fen=0;
  
                 if(shi==24)   //24小時到了嗎
                     { shi=0;    //時清零
                       fen=0;
                      miao=0;
                     }
                  }
              }
          }
  if(openring==1)    //鬧鐘開了嗎
    { if((shi==hour2)&&(fen==minutes2)&&(miao==second2)) //定時時間到  鬧鈴響
         RING1=0;
    if(cancelring==1)  //鬧鐘關(guān)
            {RING1=1;cancelring=0;}
 }  
}

void timebcd (uchar m,uchar f,uchar s)         //時間變動函數(shù),當(dāng)計(jì)時到達(dá)1秒時進(jìn)行時間變動             
{ 
 buffer[0]=m%10;              //shi、fen、miao轉(zhuǎn)換成BCD碼,主要為了數(shù)碼管的顯示
 buffer[1]=m/10;
 buffer[2]=f%10;
 buffer[3]=f/10;
 buffer[4]=s%10;
 buffer[5]=s/10;
}


void keyscan(void)       //鍵掃描并確定鍵值函數(shù),該部分是時鐘各種功能實(shí)現(xiàn)的核心
{ 
  uchar scode,recode,value;    //定義行列變量
  P2=0XF0;   //  注意鍵盤與P2的接法,4*4鍵盤
  if ((P2 & 0XF0)!=0XF0)
     { 
      delay_1ms(10);
      if ((P2&0XF0)!=0XF0)
         {
           scode=0xfe;
     while((scode & 0x10)!=0)
              {  P2=scode;
                 if ((P2&0XF0)!=0XF0)
                   {recode=(P2 & 0XF0)|0X0f;
                      value=((~scode)+(~recode));
       switch(value)
       { case 0x11: hour=1;minutes=0;second=0;break;//時,按到的鍵是修改時的功能鍵,hour是修改時的標(biāo)志位
         case 0x21: hour=0;minutes=1;second=0;break;//分,按到的鍵是修改分的功能鍵,minutes是修改分的標(biāo)志位;
         case 0x41: hour=0;minutes=0;second=1;break;//秒     與上面類似;
         case 0x81: add=1;dec=0;break;// 加   
         case 0x12: dec=1;add=0;break;//減
         case 0x22: setring=1;settime=0;second1=second2;minutes1=minutes2;hour1= hour2;break;//鬧鐘設(shè)置,
         case 0x42: settime=1;setring=0;second1=miao;minutes1=fen;hour1=shi;break;//時間設(shè)置
         case 0x82: setring=0;settime=0;break;//返回
         case 0x14: ok=1;break;//確定
         case 0x24: openring=1;OPEN=0;break;//開鬧鐘
         case 0x44: openring=0;OPEN=1;break;//關(guān)鬧鐘
         case 0x84:cancelring=1;break;//  取消響鈴            
         default: break;
                       }
                   }
   else   scode=(scode<<1)|0x01;
              }
           }     
       } 
} 

  注意:這里將鍵盤的值進(jìn)行了編碼,12個鍵盤進(jìn)行了編碼 ,特別注意 鬧鐘設(shè)置和時間設(shè)置的實(shí)現(xiàn)方法 ,他們共用了函數(shù) resettime,沒什么難的。      
void resettime (viod)  
{
 if(hour==1)
   {
     if (add==1)
        {hour1++;add=0;}

     if( hour1==24)
         hour1=0;

     if (dec==1)
         {hour1--;dec=0;}

     if (hour1==-1)
        hour1=23;
   }
  if(minutes==1)
  {
     if (add==1)
      {minutes1++;add=0;}

     if (minutes1==60)
         minutes1=0;

     if(dec==1)
      { minutes1--;dec=0;}

     if (minutes1==-1)
       minutes1=59;
   }

    if(second==1)
  { 
    if (add==1)
      {second1++;add=0;}

    if(second1==60)
      second1=0;

    if (dec==1)
      {second1--;dec=0;}

    if(second1==-1)
      second1=59;
   }

}
 
  

 display (void)                    //顯示函數(shù)子程序
{  
   uchar j,n;
   for(n=0,j=0XFE;n<8;j=((j<<1)|0X01),n++)
     {P1=j;  //P1接數(shù)碼管位選
      P0=LED[buffer[n]];  //P0接數(shù)碼管段選
      delay_1ms(5);
     }
}


                          
 void main (void)
{ 
   inital();                              // 調(diào)用定時器初始化
  for(;;)                           
  {                        
    timebcd(miao,fen,shi);  

    keyscan(); 
                                       //調(diào)用鍵掃描,確定功能
    if(settime==1)                    //當(dāng)按下的鍵是時間設(shè)置時
      { 
          resettime();
   timebcd ( second1, minutes1,hour1);
 

          if(ok==1)                        //當(dāng)確定被按下時,表明重設(shè)時間要覆蓋原來的時間,所以將miao,fen,shi重置,_20ms清零
           { shi=hour1;
      fen=minutes1;
      miao=second1;
             _20ms=0;
                                                  }
      } 

   if(setring==1)
   {   
      resettime();
      timebcd( second1, minutes1,hour1);

         if(ok==1)
           {  hour2=hour1;
       minutes2=minutes1;
       second2=second1;
                                                         }
      }

     display(); //調(diào)用顯示函數(shù)

    }
}

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 日韩一二三区视频 | 97国产成人 | www久久久| 一区二区中文 | 色接久久 | 四虎网站在线观看 | 日韩av福利在线观看 | 在线观看免费av网 | 精品国产一区二区在线 | 成人在线视频网 | 亚洲成人精品久久 | 中文字幕亚洲精品 | 免费观看毛片 | 精品国产乱码久久久久久闺蜜 | 一区二区三区视频在线观看 | 国产乱人伦| 91精品国产高清一区二区三区 | 亚洲国产看片 | 日韩中文字幕一区 | 四虎永久免费影院 | 久久久精品网站 | 国产精品视频一 | 亚洲视频二区 | www.一区二区三区.com | 亚洲日本国产 | 宅男噜噜噜66一区二区 | 黄色毛片视频 | 精品国产视频 | 久久久国产一区二区三区四区小说 | 一区二区高清不卡 | 亚洲国产精品成人久久久 | 国产小u女发育末成年 | 国产精品久久九九 | 精品国产一区探花在线观看 | 国产伦精品一区二区三区精品视频 | 一区二区三区小视频 | 91成人小视频 | 国产小视频在线看 | 欧美日韩久 | 男女啪啪高潮无遮挡免费动态 | 日韩欧美亚洲 |