- #include <reg51.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit start=P2^7;
- sbit stop=P2^6;
- sbit plus_one=P2^5;
- sbit resert=P2^4;
- #define dpick P0
- #define wpick P1
- u16 num1=0; //1s的次數(shù)的計數(shù)值
- u16 num60=0; //1min的次數(shù)的計數(shù)值
- u16 zd_num=0; //進入中斷次數(shù)的計數(shù)值
- //子函數(shù)
- void delay(u16 num) //延時函數(shù)
- {
- u16 x,y;
- for(x=num;x>0;x--)
- for(y=110;y>0;y--)
- {
- ;
- }
- }
- u8 code table[]={0x3f,0x06 ,0x5b ,0x4f, 0x66, 0x6d, 0x7d ,0x07, 0x7f,
- 0x6f,0x77 ,0x7c, 0x39, 0x5e, 0x79, 0x71};
- void Display(u16 a,u16 b,u16 c,u16 d) //定義顯示函數(shù)
- {
- dpick=table[a]; //秒的個位的段選
- wpick=0x7f; //秒的個位的位選
- delay(5);
-
- dpick=table[b]; //秒的十位的段選
- wpick=0xbf; //秒的十位的位選
- delay(5);
-
- dpick=table[c]+0x80; //分的個位的段選(帶小數(shù)點)
- wpick=0xdf; //分的個位的位選
- delay(5);
-
- dpick=table[d]; //分的十位的段選
- wpick=0xef; //分的十位的位選
- delay(5);
- }
- void InitTimer0() //定時器初始化函數(shù)
- {
-
- TMOD=0x01; //選擇定時器0的工作方式1
- TH0=(65535-50000) / 256; //計算初值 (定時50ms)
- TL0=(65535-50000) % 256;
- EA=1; //打開總中斷
- ET0=1; //打開定時器中斷
- TR0=0;
- }
- void TIMER0() interrupt 1 //定時器中斷服務函數(shù)
- {
- TH0=(65535-50000) / 256; //手動填充
- TL0=(65535-50000) % 256;
- zd_num++; //讓進入中斷次數(shù)值加1,用于判斷是否達到1s
- }
- //主函數(shù)
- void main()
- {
- u16 s1,s10,min1,min10; //秒的個位,秒的十位,分的個位,分的十位
- InitTimer0(); //初始化定時器
- while(1)
- {
- if(start==0) //檢測啟動
- {
- delay(20);
- if(start==0)
- {
- TR0=1; //定時器打開
- while(!start);
- }
- }
- if(stop==0) //檢測啟動
- {
- delay(20);
- if(stop==0)
- {
- TR0=0; //定時器關閉
- while(!stop);
- }
- }
- if(plus_one==0)
- {
- delay(20);
- if(plus_one==0)
- {
- zd_num=zd_num+20;
- while(!plus_one);
- }
- }
- if(resert==0)
- {
- delay(20);
- if(resert==0)
- {
- zd_num=0;
- TR0=0;
- num1=0;
- num60=0;
- }
- while(!resert);
- }
-
- if(zd_num>=20)
- {
- zd_num=0;
- num1++;
- if(num1>=60)
- {
- num1=0;
- num60++;
- if(num60>=60)
- {
- TR0=0;
- num1=0;
- num60=0;
- zd_num=0;
- }
- }
- }
-
- s1=num1%10; //從秒的計數(shù)值里面分離秒的個位
- s10=num1/10; //從秒的計數(shù)值里面分離秒的十位
- min1=num60%10; //從分的計數(shù)值里面分離分的個位
- min10=num60/10; //從分的計數(shù)值里面分離分的十位
-
- Display(s1,s10,min1,min10); //顯示
- }
- }
復制代碼 |