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

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

基于51單片機(jī)的倒計時器設(shè)計

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

//  本程序的電路很簡單就不畫圖了,就是8位數(shù)碼管的段選接在P0口,
//為了節(jié)約端口8個位接在了74hc138上,由P2.1 P2.0 P2.2控制譯碼器輸出位選.
//本程序完全測試通過.完整代碼下載地址: http://www.zg4o1577.cn/f/djsq.rar
/************************************************************************/
/************8位數(shù)碼管倒計時顯示 時間格式24—00—00~~00-00-00**************/
/************************************************************************/
#include <reg52.h>
#define  uchar unsigned char
#define  uint  unsigned int
                       
sbit D0=P2^0;                         //定義數(shù)碼管片選參數(shù)
sbit D1=P2^1;
sbit D2=P2^2;
sbit D3=P1^2;       //定義蜂鳴器輸出引腳
#define  CLOCK_NUM    4      //動態(tài)定義鬧鐘的個數(shù)
struct SAVE_TIME {
 uint save_hour;
 uint save_minute;
 uint save_second;
};
void key_scan_pro(void);
void Displaypro(void);
void Print_play_pro(void);
struct SAVE_TIME save_time[CLOCK_NUM]={0};
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};        //共陰極數(shù)碼管0—9
uchar StrTab[8];                                  //定義緩沖區(qū)
static uint  minute=0,hour=24,second=0;                //定義并初始化為 24:00:00
static uchar num=0;              
static uchar temp,count1=1;
static uchar time_save_value=0;
void delay(uint z)                           //按鍵消抖延時函數(shù)
{
 uint x,y;
    for(x=z; x>0; x--)
  for(y=110; y>0; y--);
}
void hour_add_pro(void)               //小時加一減一處理函數(shù) KEY0
{
 if(24==hour)  { hour=24; minute=0; second=0; } //小時為24時,將分鐘和秒置零
 else    { hour++;  }
 Displaypro();
}
void hour_sub_pro(void)             //KEY1
{
 if(0==hour)   { hour=0; }
 else      { hour--; }
    Displaypro();
}
void minute_add_pro(void)            //分鐘加一減一處理函數(shù) KEY2
{
 if(59==minute)  { minute=59; }
 else   
 {
  if((24==hour)&&(minute==0)){}     //分鐘邊界壓力判斷,當(dāng)24:00:00,不允許往上加
  else            { minute++; } 
 }
    Displaypro();
}
void minute_sub_pro(void)             //KEY3
{
 if(0==minute)  { minute=0; }
 else     { minute--; }
 Displaypro();
}
void second_add_pro(void)                //秒加一減一處理函數(shù)  KEY4
{
  if(60==second)  { second=60; }
     else               //秒邊界壓力判斷 當(dāng)24:00:00,不允許往上加
  {
   if((24==hour)&&(minute==0)) {}
  else     { second++; }
  }
  Displaypro();
}     
void second_sub_pro(void)           //KEY5
{
 if(0==second)  { second=0; }
 else    { second--; }
    Displaypro();
}
void begin_suspend_pro(void)             //開始/暫停處理函數(shù)
{ TR0 ^=0x1; }
void time_save_pro(void)              //定時值保存函數(shù)
{
 if(time_save_value<CLOCK_NUM)
 {
  save_time[time_save_value].save_hour   = hour;
     save_time[time_save_value].save_minute = minute;
  save_time[time_save_value].save_second = second;
  time_save_value++;
  if(CLOCK_NUM==time_save_value)        //循環(huán)調(diào)用鬧鐘
  { time_save_value=0; }                  
 }              
}
void clock_judge_pro(void)           //鬧鐘值判斷函數(shù)
{
 uchar i;
 for(i=0; i< CLOCK_NUM; i++)
 { if((hour==save_time[i].save_hour)&&(minute==save_time[i].save_minute)&&(second==save_time[i].save_second))
 { TR0=0; TR1=1; } }
}
void time_init_pro(void)           //定時器初始化函數(shù)
{
   TMOD |=0x01;                      //定時器0  10ms  inM  crystal  用于計時
      TH0=0xd8;                          //定時器初值10ms
      TL0=0xf0;
      ET0=1;                             //定時器/計數(shù)器T0中斷允許位
      TR0=0;                               //TCON寄存器的TR0位 1:啟動T1/0 0:停止T1/0
      TMOD |=0x10;                       //定時器1用于處理蜂鳴器
      TH1=0xd8;                         //初值20ms
      TL1=0xf0;
      ET1=1;
      TR1=0;                             //定時器的允許位
      EA =1;                             //開總中斷
}
/********************************主函數(shù)***************************************/
void main(void)
{
  time_init_pro();                //調(diào)用定時器初始化函數(shù)
     Displaypro();           //調(diào)用顯示函數(shù)
  while(1)
  {
    key_scan_pro();         //不斷掃描按鍵
  }
}
/********************************主函數(shù)***************************************/
void key_scan_pro(void)            //鍵盤掃描函數(shù)
{
  D3=1;
  Print_play_pro();                  //調(diào)用顯示處理函數(shù)
  P1=0xfe; temp=P1; temp&=0xf0;
 
  while(temp!=0xf0)               //按鍵消抖
  {
   delay(6); temp=P1; temp&=0xf0;
   while(temp!=0xf0)
   {
    temp=P1;
    switch(temp)
    {
      case 0xee: num=0;
       hour_add_pro();         //按鍵0,1控制小時
      break;
      case 0xde: num=1;
       hour_sub_pro();
      break;
      case 0xbe: num=2;   //按鍵2,3控制分鐘
       minute_add_pro();
      break;
      case 0x7e: num=3;
       minute_sub_pro();
      break;
      default:
      break;
     }
     while(temp!=0xf0)
     { temp=P1; temp&=0xf0; }
     delay(6);
     while(temp!=0xf0)
     { temp=P1; temp&=0xf0; }
    }  
   }
   P1=0xfd; temp=P1; temp&=0xf0;
   while(temp!=0xf0)
   {
    delay(6); temp=P1; temp&=0xf0;
    while(temp!=0xf0)
    {
     temp=P1;
     switch(temp)
     {
      case 0xed: num=4;          //按鍵4,5控制秒
        second_add_pro();
      break;
      case 0xdd: num=5;
       second_sub_pro();
      break;
      case 0xbd: num=6;     //按鍵6控制開始/暫停處理函數(shù)
          begin_suspend_pro();
      break;
      case 0x7d: num=7;     //按鍵7控制定時保存函數(shù)
       time_save_pro();
      break;
      default:
      break;
     }
     while(temp!=0xf0)
     { temp=P1; temp&=0xf0; }
     delay(6);
               while(temp!=0xf0)
     { temp=P1; temp&=0xf0; }
    }
   }
}
void Displaypro(void)
{
        StrTab[0]=tab[hour/10];             //存儲小時
        StrTab[1]=tab[hour%10];
        StrTab[2]=0x40;                    //存儲"-"
        StrTab[3]=tab[minute/10];                 //存儲分鐘
        StrTab[4]=tab[minute%10];
        StrTab[5]=0x40;                           //存儲"-"
        StrTab[6]=tab[second/10];                 //存儲秒
        StrTab[7]=tab[second%10];
}
 
void Print_play_pro(void)                 //動態(tài)掃描數(shù)碼管
{
  D0=1; D1=1; D2=1;               //顯示秒
  P0=StrTab[7];
  delay(3);
 
  D0=0;D1=1; D2=1;
  P0=StrTab[6];
  delay(3);
  D0=1;D1=0; D2=1;               //顯示"-"
  P0=StrTab[5];
  delay(3);
  D0=0;D1=0;D2=1;                    //顯示分
  P0=StrTab[4];
  delay(3);
 
  D0=1;D1=1;D2=0;
  P0=StrTab[3];
  delay(3);       
  D0=0;D1=1;D2=0;                    //顯示"-"
  P0=StrTab[2];     
  delay(3);
  D0=1;D1=0;D2=0;                    //顯示小時
  P0=StrTab[1];
  delay(3);
  D0=0;D1=0;D2=0;
  P0=StrTab[0];
  delay(3);
}
/*****************************定時器1中斷*********************************/
void time1_isr(void) interrupt 3           //定時器1用來處理蜂鳴器
{
     static uint count = 1;          //位置待定
  TH1=0xd8;               //重入初值定時20ms
     TL1=0xf0;
  //Print_play_pro();       //抖動效果   
  count++;
  D3=0;          //產(chǎn)生鬧鐘方波
  if(200==count)
  {
   TR0=1;
   TR1=0;
   count=1;
   D3=1;
  }
}
/***************************定時器0中斷**********************************/                               
void tim(void) interrupt 1       //定時器0用來處理倒計時
{
        static uchar count;            //定義內(nèi)部局部變量
        TH0=0xd8;               //重新賦值
        TL0=0xf0;
        count++;
        switch (count)
        {
                case 80:Displaypro();break;     //隔一定時間調(diào)用顯示處理
                default:break;
        }
        if (count==100)
        {  
    clock_judge_pro();    //定時時間判斷
    count=0;
   
    if((0==minute)&&(second==0)) //倒計時值處理
    {
     if(0==hour)    { hour=0;    }
     else           { hour--;    }
     minute=60;
    }
    if(0==second)
    {
     if(0==minute)  { minute=59; }
     else           { minute-=1; }
    }
    if(0==second)      { second=60; }
    else               { second-=1; }
       if((0==hour)&&(0==minute)&&(0==second)) //倒計時到00:00:00,結(jié)束倒計時
      { hour=0; minute=0; second=0; Displaypro(); TR0=0; }      
        }  
}

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产成人免费观看 | 日韩一级欧美一级 | 国产精品久久久久久久久久免费看 | 黄色一级免费 | 国产精品揄拍一区二区 | 免费三级黄 | 欧美中文字幕在线观看 | 97伦理电影 | 亚洲一区二区在线播放 | 久久一区二区三区四区 | 国产免费一区二区 | 日韩中文字幕av | 欧美激情亚洲天堂 | 日韩中文字幕视频 | 欧美久久综合 | 精品一区二区三区免费视频 | 91精品国产高清久久久久久久久 | 性精品| 中文字幕免费在线 | 国产成人在线免费 | 精品国产18久久久久久二百 | 91精品中文字幕一区二区三区 | 精品国产欧美一区二区三区成人 | 亚洲精品一区在线 | 亚洲三级在线 | 亚洲视频在线看 | 日本不卡免费新一二三区 | 欧美极品在线 | 亚洲国产一区二区在线 | 国产精品96久久久久久 | 国产欧美精品在线观看 | 最新日韩在线 | 91精品国产综合久久精品 | 国产精品成人久久久久 | 欧美国产精品一区二区三区 | 久久欧美高清二区三区 | 中文字幕三区 | 国产精品资源在线 | 欧美黑人一区 | 国产精品成人一区二区 | 亚洲精品一级 |