用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單片機裡了。