? 想要實現(xiàn)倒計時顯示器,首先得確定從哪個時間開始倒計時,這就需要寫出一個計數(shù)的程序來,通過按鍵來控制需要的數(shù),從而開始倒計時。我的開發(fā)板上用的Key2,Key3,Key4,Key5這四個鍵,分別對應著加1,減1,乘2,開始計時四個功能。
? 通過加一,減一,乘2三個操作,可以較快地得到想要設置的數(shù)。然后將所得到的數(shù)顯示在數(shù)碼管上(我這里使用的是共陰數(shù)碼管)。這樣就可以實時地看到自己所設置的數(shù),然后就可以開始計時了。
具體實現(xiàn)步驟:
1.定義所用到的端口
2.定義一個數(shù)組,里面裝0~9這十個數(shù)(用于后邊的數(shù)碼管顯示,所以需要轉化為對應的段選),例如0,就寫成0X3F
3.寫一個計數(shù)的程序,通過按鍵實現(xiàn)計數(shù),并且在按下時數(shù)碼管同步顯示。
4.寫一個計時的程序。(用時鐘)
4.打開時鐘中斷,開始計時,運行計時程序。
5,打開蜂鳴器,提示計時結束。
以下為源代碼:
#include<reg52.h>
/******************************************
程序作用:倒計時顯示器
實現(xiàn)步驟:1.輸入數(shù)字
? ? ? ? ? 2.開始倒計時
?? ??? ??? ??? ??? ?3.蜂鳴器響1s提示計時結束
*******************************************/
sbit Key2=P3^4;
sbit Key3=P3^5;
sbit Key4=P3^6;
sbit Key5=P3^7;//定義按鍵端口
sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;//定義數(shù)碼管端口
sbit bing=P2^3;//定義蜂鳴器端口
/********************定義數(shù)組******************/
int base[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************定義數(shù)組******************/
/********************定義全局變量******************/
? ?int num;
? ?int time=0;?
? ?int time_1s=0;
? ?int qian;//千位數(shù)字
?? ? int bai;//百位數(shù)字
? ?int shi;//十位數(shù)字
?? ? int ge;//個位數(shù)字
/********************定義全局變量******************/
void xianshi();
void Time_begin();
int num_scp(int num);
int delay(int x);//函數(shù)聲明
void main()
{
?? ?
?? ?num=0;
?? ?/*************初始化端口*************/
?? ?wei1=0;//第一位數(shù)碼管
?? ?wei2=0;//第二位數(shù)碼管
?? ?wei3=0;//第三位數(shù)碼管
?? ?wei4=0;//第四位數(shù)碼管
?? ?Key2=1;//加一開關
?? ?Key3=1;//減一開關
?? ?Key4=1;//乘二開關
?? ?Key5=1;//計時開關
?? ?/*************初始化端口*************/
?? ?
?? ?
?? ?while(1){
?? ??? ?Key2=1;//加一開關
?? ? ?Key3=1;//減一開關
?? ? ?Key4=1;//乘2開關
?? ? ?Key5=1;//開始計時
?? ??? ?
?? ??? ?
?? ??? ?if(Key2==0)
?? ??? ?{
?? ??? ??? ?delay(10);
?? ??? ?while(Key2==1){num++;break;}
?? ??? ??? ?
?? ??? ?}//按下Key2鍵 ? 時間加1s
?? ??? ?
?? ??? ?
?? ??? ?if(Key3==0)
?? ??? ?{
?? ??? ??? ?delay(10);
?? ??? ??? ?while(Key3==1){num--;break;}
?? ??? ?}//按下Key3鍵 ? 時間減1s
?? ??? ?
?? ??? ?
?? ??? ?if(Key4==0)
?? ??? ?{
?? ??? ??? ?delay(10);
?? ??? ??? ?while(Key4==1){num=num*2;break;}
?? ??? ?}//按下Key4鍵 ? 時間乘2
?? ??? ?
?? ??? ?
?? ??? ?if(Key5==0)
?? ??? ?{
?? ??? ??? ?delay(10);
?? ??? ??? ?while(Key5==1)
?? ??? ??? ?{
?? ??? ??? ??? ?Time_begin();
?? ??? ??? ??? ?while(1)
?? ?{
?? ??? ?num_scp(time_1s);
?? ??? ?xianshi();
?? ??? ?if(time_1s==1){bing=0;delay(1000);bing=1;}
?? ?}
?? ??? ? ? }
?? ? ? }?? ?//按下Key5鍵 ? 開始計時
?? ??? ?
?? ??? ??
?? ??? ??
?? ?
?? ??? ?while(1)
?? ??? ?{
?? ??? ??? ?num_scp(num);
?? ??? ??? ?xianshi();
?? ??? ??? ?if(Key2==0||Key3==0||Key4==0||Key5==0){break;}
?? ??? ?}//顯示設置的時間
}
}
/*****************************
定義函數(shù)num_scp
sc代表scanf;p代表put
函數(shù)作用:掃描數(shù)據(jù)并進行拆分
參數(shù)列表:x
*******************************/
int num_scp(int x)
{?? ?
?? ?qian=(x/1000)%10;//千位數(shù)字
?? ?bai=(x/100)%10;//百位數(shù)字
?? ?shi=(x/10)%10;//十位數(shù)字
?? ?ge=x%10;//個位數(shù)字
?? ?return 0;
}?? ?
?? ?
?? ?
?? ?
?? ?/*****************************
定義函數(shù)delay
函數(shù)作用:延時x_ms
參數(shù)列表:x
*******************************/
int delay(int x)
{
? unsigned int time;
?? ?time=9206*x-2;
?? ?while(time--);
?? ?return 0;//較粗略的延時函數(shù),主要用于按鍵消抖,不可用于計時
}
?? ?
?? ?
?? ?/*****************************
定義函數(shù)Timer0
函數(shù)作用:定時計數(shù)
參數(shù)列表:time time_1s
*******************************/
void Timer0() interrupt 1 using 1//準確的時鐘,可用于計時
{
?? ?TH0=0x4c;//定時器0裝初值 定時50ms
?? ?TH1=0x00;
?? ?time++;
?? ?if(time>=20)
?? ?{
?? ??? ?if(time_1s==0){time_1s=num+1;}
?? ??? ?time_1s--;
?? ??? ?time=0;
?? ?}
?? ?
}
/*****************************
定義函數(shù)Time_begin
函數(shù)作用:開啟定時計數(shù)器
參數(shù)列表:
*******************************/
void Time_begin(){
TMOD &=0xf0;//低四位全部置0 設置定時器0 方式1
?? ?TMOD |=0x01;//最低位置1
?? ?TH0=0x4c;//定時器0裝初值 定時50ms
?? ?TH1=0x00;
?? ?
?? ?TR0=1;//定時器0 啟動計數(shù)
?? ?ET0=1;//打開ET0 中斷允許位
?? ?EA=1;//打開總中斷
}文章來源:http://www.zghlxwxcb.cn/news/detail-499660.html
/*****************************
定義函數(shù)顯示
函數(shù)作用:數(shù)碼管顯示
參數(shù)列表:qian bai shi ge?
*******************************/
void xianshi(){
?? ? ?P0=0x00;
? ? P0=base[qian];
?? ??? ?wei1=1;
?? ??? ?wei1=0;
?? ??? ?P0=base[bai];
?? ??? ?wei2=1;
?? ??? ?wei2=0;
?? ??? ?P0=base[shi];
?? ??? ?wei3=1;
?? ??? ?wei3=0;
?? ??? ?P0=base[ge];
?? ??? ?wei4=1;
?? ??? ?wei4=0;//顯示具體數(shù)字
}文章來源地址http://www.zghlxwxcb.cn/news/detail-499660.html
到了這里,關于初學51單片機(STC89C52)一個倒計時顯示器和大家分享的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!