單片機秒錶計時器

來源:互聯網
上載者:User

     用51單片機的定時器0的方式1計時,結果用4位元碼管顯示,分別為秒十位,秒個位,毫秒百位,毫秒十位。所以總共最大計時為1分鐘,精確到了0.01s。同時,加上3個獨立按鍵,分別控制秒錶的清零,暫停和開始功能。

   按照模組化的思想,首先先把要用的函數和預定義寫到一個標頭檔中,要用到的預定義和全域變數如下:

#include <reg52.h>#define uchar   unsigned charsbit Clear=P3^7;   //按鍵實現清零sbit Stop=P3^6;    //按鍵實現暫停sbit ReStart=P3^5;  //按鍵實現開始sbit dula=P2^6;     //段選線接P2^6口sbit wela=P2^7;     //位選線接P2^7口//table數組中儲存數位管顯示0~F對應的編碼uchar code   table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//計時時間,計時中斷髮生一次,則加1,最大為5999int time;

 

接下來是將要用到的函式宣告:

//用於動態掃描數位管的時間較短的延時函數void ShortDelay();    //用於鍵盤消抖的時間較長的延時函數void LongDelay();//初始化void Inital();//在數位管顯示秒十位,秒個位,微秒百位,微秒十位//用拼音表示很不好,將就著看吧void Display(uchar shimiao,uchar gemiao,uchar baiwei,uchar shiwei);//清零函數,按下清零鍵的時候調用void Clc();//暫停函數,按下暫停鍵時候調用void StopTimer();//開始或重新開始函數,按下開始鍵時候調用void ReStartTimer();//鍵盤掃描函數,是否有鍵被按下,並且執行相應操作void KeyScan();

 

接下來是主函數:

void main(){  uchar shimiao,gemiao,baiwei,shiwei;  Inital();   //初始化  while(1)  {    if(time==6000)    //到了秒錶最大值,自動歸零    {      time=0;    }        //分解出要顯示的各個數位    shimiao=time/1000;    gemiao=time%1000/100;    baiwei=time%100/10;    shiwei=time%10;        //顯示    Display(shimiao,gemiao,baiwei,shiwei);    ShortDelay();    //鍵盤掃描,有鍵按下執行相應操作    KeyScan();  }}

下面的工作就是要寫相應的處理函數了:

首先是兩個延時函數:

void ShortDelay(){  uchar a=100;  while(a--);}void LongDelay(){  int a=5000;  while(a--);}

初始化函數:

void Inital(){  dula=0;  wela=0;  time=0;  EA=1;  ET0=1;    //開定時器0中斷  TMOD=0x01;  TH0=0xdc;  TL0=0x01;   //裝載初值,計時方式1    Clear=1;  Stop=1;  ReStart=1;   //按鍵介面管腳輸出高電平}

在數位管上顯示時間的函數:

void Display(uchar shimiao,uchar gemiao,uchar baiwei,uchar shiwei){  //輸出秒十位  wela=1;  P0=0xfb;  wela=0;  P0=0xff;  dula=1;  P0=table[shimiao];  dula=0;  ShortDelay();    //輸出秒個位  wela=1;  P0=0xf7;  wela=0;  P0=0xff;  dula=1;  P0=table[gemiao];  dula=0;  ShortDelay();    wela=1;  P0=0xef;  wela=0;  P0=0xff;  dula=1;  P0=table[baiwei];  dula=0;  ShortDelay();    wela=1;  P0=0xdf;  wela=0;  P0=0xff;  dula=1;  P0=table[shiwei];  dula=0;  ShortDelay();  }

鍵盤掃描函數:

void KeyScan(){   if(Clear==0)        {      LongDelay();    //消抖      if(Clear==0)    //確實是被按下      {        //Do somthing        Clc();      }    }        //Stop和ReStart檢測方法相同    if(Stop==0)         {      LongDelay();      if(Stop==0)      {        //Do somthing        StopTimer();      }    }    if(ReStart==0)    {      LongDelay();      if(ReStart==0)      {        //Do somthing        ReStartTimer();      }    }}

最後是3個按鍵按下後的處理函數:

void Clc(){  TR0=0;   //計時暫時停止  time=0;   //時間歸零  Display(0,0,0,0);   //顯示0000  ShortDelay();    }void StopTimer(){  //計時暫時停止,僅此而已  TR0=0;    }void ReStartTimer(){  //計時重新開始,僅此而已  TR0=1;}

至此,編譯連結後產生的.HEX檔案就能下載到51單片機裡了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.