|
- #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ù)的計(jì)數(shù)值
- u16 num60=0; //1min的次數(shù)的計(jì)數(shù)值
- u16 zd_num=0; //進(jìn)入中斷次數(shù)的計(jì)數(shù)值
- //子函數(shù)
- void delay(u16 num) //延時(shí)函數(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]; //秒的個(gè)位的段選
- wpick=0x7f; //秒的個(gè)位的位選
- delay(5);
-
- dpick=table[b]; //秒的十位的段選
- wpick=0xbf; //秒的十位的位選
- delay(5);
-
- dpick=table[c]+0x80; //分的個(gè)位的段選(帶小數(shù)點(diǎn))
- wpick=0xdf; //分的個(gè)位的位選
- delay(5);
-
- dpick=table[d]; //分的十位的段選
- wpick=0xef; //分的十位的位選
- delay(5);
- }
- void InitTimer0() //定時(shí)器初始化函數(shù)
- {
-
- TMOD=0x01; //選擇定時(shí)器0的工作方式1
- TH0=(65535-50000) / 256; //計(jì)算初值 (定時(shí)50ms)
- TL0=(65535-50000) % 256;
- EA=1; //打開(kāi)總中斷
- ET0=1; //打開(kāi)定時(shí)器中斷
- TR0=0;
- }
- void TIMER0() interrupt 1 //定時(shí)器中斷服務(wù)函數(shù)
- {
- TH0=(65535-50000) / 256; //手動(dòng)填充
- TL0=(65535-50000) % 256;
- zd_num++; //讓進(jìn)入中斷次數(shù)值加1,用于判斷是否達(dá)到1s
- }
- //主函數(shù)
- void main()
- {
- u16 s1,s10,min1,min10; //秒的個(gè)位,秒的十位,分的個(gè)位,分的十位
- InitTimer0(); //初始化定時(shí)器
- while(1)
- {
- if(start==0) //檢測(cè)啟動(dòng)
- {
- delay(20);
- if(start==0)
- {
- TR0=1; //定時(shí)器打開(kāi)
- while(!start);
- }
- }
- if(stop==0) //檢測(cè)啟動(dòng)
- {
- delay(20);
- if(stop==0)
- {
- TR0=0; //定時(shí)器關(guān)閉
- 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; //從秒的計(jì)數(shù)值里面分離秒的個(gè)位
- s10=num1/10; //從秒的計(jì)數(shù)值里面分離秒的十位
- min1=num60%10; //從分的計(jì)數(shù)值里面分離分的個(gè)位
- min10=num60/10; //從分的計(jì)數(shù)值里面分離分的十位
-
- Display(s1,s10,min1,min10); //顯示
- }
- }
復(fù)制代碼 |
|