|
這個基于51單片機的定時器設(shè)計,使用共陰數(shù)碼管顯示,如果要換成共陽數(shù)碼管只需要將程序內(nèi)數(shù)組改為共陽數(shù)碼管的數(shù)組,38譯碼器LSA,LSB,LSC分別接單片機的P2^2,
P2^3,P2^4,蜂鳴器使用的是無源蜂鳴器,接單片機P1^5,三個低電平觸發(fā)按鍵分別接的P3^1,P3^2,P3^3.
定時器圖片.png (81.74 KB, 下載次數(shù): 38)
下載附件
2020-1-5 20:29 上傳
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit key0=P3^1; //定義P31口是k0
sbit key1=P3^0; //定義P33口是k1
sbit key2=P3^2; //定義P33口是k2
sbit beep=P1^5;
程序運行后,先進入設(shè)置模式,key0和key1分別設(shè)置秒和分,key2確定后進入定時模式,數(shù)碼管顯示時間,定時結(jié)束后蜂鳴器發(fā)聲提示。
單片機源程序如下:
- //基于stc89c52的定時器
- //時間:2020年1月5日,作者:吃貓的魚
- #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
- typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
- typedef unsigned char u8;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- sbit key0=P3^1; //定義P31口是k0
- sbit key1=P3^0; //定義P33口是k1
- sbit key2=P3^2; //定義P33口是k2
- sbit beep=P1^5;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x5e,0x3f,0x3f,0x6f};//顯示0~F的值
- u16 miao=0,fen=0;//時間參數(shù)
- bit flag=1;
- /*******************************************************************************
- * 函 數(shù) 名 : delay
- * 函數(shù)功能 : 延時函數(shù),i=1時,大約延時10us
- *******************************************************************************/
- void delay(u16 i)
- {
- while(i--);
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Timer1Init
- * 函數(shù)功能 : 定時器1初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1Init()
- {
- TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
- TH1=0XFC; //給定時器賦初值,定時1ms
- TL1=0X18;
- ET1=1;//打開定時器1中斷允許
- EA=1;//打開總中斷
- TR1=1;//打開定時器
- }
- void good_init()
- {
- u8 i,j=1000;
- while(j)
- {
- for(i=10;i<14;i++)
- {
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- case(10):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(11):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(12):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(13):
- LSA=1;LSB=1;LSC=0; break;//顯示第2位
-
- }
- P0=smgduan[i];//發(fā)送段碼
- delay(300); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- j--;
- }
- }
- void DigDisplay()
- {
-
- LSA=0;LSB=0;LSC=0;
- P0=smgduan[miao%10];//發(fā)送段碼
- delay(500);
- LSA=1;LSB=0;LSC=0;
- P0=smgduan[miao/10];//發(fā)送段碼
- delay(500);
- LSA=0;LSB=1;LSC=0;
- P0=smgduan[fen%10];//發(fā)送段碼
- delay(500);
- LSA=1;LSB=1;LSC=0;
- P0=smgduan[fen/10];//發(fā)送段碼
- delay(500);
- // delay(100); //間隔一段時間掃描
- // P0=0x00;//消隱
-
- }
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
-
- good_init();
- while(flag)
- {
- if(key0==0)//秒針
- {
- delay(1000);
- if(key0==0)
- {
- miao++;
-
- }
- while(!key0);
- }
- if(key1==0)//分針
- {
- delay(1000);
- if(key1==0)
- {
- fen++;
-
- }
- while(!key1);
- }
- if(key2==0)//確定
- {
- delay(1000);
- if(key2==0)
- {
- flag=0;
-
- }
- while(!key2);
- }
- miao=miao%60;
- fen=fen%60;
- DigDisplay();
- }
- Timer1Init();//定時器初始化
- while(1)//工作模式
- {
- if(miao<=1)
- {
- fen--;
- miao=60;
- }
- DigDisplay();
-
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void Timer1() interrupt 3
- * 函數(shù)功能 : 定時器0中斷函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- static u16 i;
- TH1=0XFC; //給定時器賦初值,定時1ms
- TL1=0X18;
- i++;
- if(fen==0&&miao==1)//蜂鳴器叫
- {
- LSA=0;LSB=0;LSC=0;
- P0=smgduan[1];//發(fā)送段碼
- delay(800000);
- ET1=0;//關(guān)閉定時器1中斷允許
-
- while(1)
- {
- beep=~beep;
- delay(10); //延時大約100us 通過修改此延時時間達(dá)到不同的發(fā)聲效果
- }
- }
- if(i==1000)
- {
- i=0;
- miao--;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
基于51單片機的定時器源代碼.rar
(34.45 KB, 下載次數(shù): 37)
2020-1-5 20:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|