- #include <REGX51.H>
- #define uchar unsigned char
- #define uint unsigned int
- #define PIN0 P0; //數碼管段選端
- #define PIN1 P1; //數碼管位選端
- uint cnt=0; //1s的次數的計數值
- uint num=0; //進入中斷次數的計數值(一次50ms)
- uint num1=0; //0.001s的次數的計數值
- uint haomiaou=0;
- uchar code table[]={0x3f,0x06,0x5b,
- 0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};
- //不帶小數點的共陰極數碼管段碼0-9
- uchar code table1[]={0xbf,0x86,
- 0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
- //帶小數點的共陰極數碼管段碼0-9
- char code table2[]={0xc0,0xf9,0xa4,
- 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- //不帶小數點的共陽極數碼管段碼0-9
- uint a,b,c,d,e,f,g,w;
- void Display(uint a,uint b,uint c,uint d,uint e,uint f,uint g,uint w); //聲明顯示函數
- void InitTimer0(); //聲明定時器初始化函數
- void Delayms(uint x); //聲明延時函數
- void main ()
- {
- uint haomiao,haomiao1,haomiao2,s,s1,min,min1,minu=0,shi,shiu=0;
- //分別是毫秒的個位,毫秒的十位,毫秒的百位,
- //秒的個位,秒的十位,分的個位,分的十位,時的各位
-
- InitTimer0(); //初始化定時器
- while(1) //進入死循環
- {
- //Delayms(20); //延時消抖
- num=0; //進入中斷次數的計數值(一次50ms)
- num1=0; //進入中斷次數值清0
- haomiaou=0; //毫秒的計數值清0
- cnt=0; //秒的計數值清0
- minu=0; //分的計數值清0
- shiu=0; //時的計數值清0
- }
- if(num1>=200) //檢測是否達到0.1s,(兩百個50ms)
- {
- num1=0; //進入中斷次數值清零
- haomiao++; //毫秒秒的個位的計數值加1
- if(haomiao>=10) //若毫秒的個位計數值達到10
- {
- haomiao=0; //清零毫秒的個位的計數值
- num1=0;//進入中斷次數值置0
- }
- }
-
- if(num>=20) //判斷計時時間是否達到1s(20個50ms)
- {
- cnt++; //秒的計數值加1
- if(cnt>=60) //判斷是否達到60s
- {
- cnt=0; //若達到60s,將秒的計數值置零
- minu++; //分的計數值加1
-
- TR0=!TR0; //達到60分鐘則關閉定時器并清零所有的計數值
- num1=0;
- num=0;
- haomiao=0;
- cnt=0;
- minu=0;
- }
- }
- haomiao=haomiaou%10; //從毫秒的計數值里面分離毫秒的個位
- haomiao1=haomiaou/10; //從毫秒的計數值里面分離毫秒的十位
- haomiao2=haomiaou/100; //從毫秒的計數值里面分離毫秒的百位
- s=cnt%10; //從秒的計數值里面分離秒的個位
- s1=cnt/10; //從秒的計數值里面分離秒的十位
- min=minu%10; //從分的計數值里面分離分的個位
- min1=minu/10; //從分的計數值里面分離分的十位
- Display(haomiao,haomiao1,haomiao2,s,s1,min,min1,shi); //顯示這8個數
- }
- void InitTimer0() //定時器初始化函數
- {
- TMOD=0x10; //選擇定時器1的工作方式1
- TH0=(65536-45872)/65536; //裝初值(定時50ms),晶振11.0592MHz
- TL0=(65536-45872)%65536;
- EA=1; //打開總中斷
- ET0=1; //打開定時器中斷
- TR0=0; //先不要啟動定時器
- }
- void TI_time()interrupt 1 //定時器中斷服務函數
- {
- TH0=(65536-45872)/65536; //重裝初值
- TL0=(65536-45872)%65536;
- num++; //讓進入中斷次數值加1,用于判斷是否達到1s
- num1++; //讓進入中斷次數值加1,用于判斷是否達到0.1s
- }
- void Delayms(uint x) //延時xms
- {
- uint i,j;
- for(i=x;i>0;i--)
- for(j=110;j>0;j--);
- }
- void Display(uint a,uint b,uint c,uint d,uint e,uint f,uint g,uint w) //定義顯示函數
- {
- PIN0 = table[a]; //毫秒的個位的段選
- PIN1 = 0x7f; //毫秒的個位的位選
- Delayms(5);
-
- PIN0=table1[b]; //毫秒的十位的段選
- PIN1=0xbf; //毫秒的十位的位選
- Delayms(5);
-
- PIN0=table1[c]; //毫秒的百位的段選
- PIN1=0xdf; //毫秒的百位的位選
- Delayms(5);
-
- PIN0=table[d]; //秒的個位的段選
- PIN1=0xef; //秒的個位的位選
- Delayms(5);
-
- PIN0=table1[e]; //秒的十位的段選
- PIN1=0xf7; //秒的十位的位選
- Delayms(5);
-
- PIN0=table[f]; //分的個位的段選(帶小數點)
- PIN1=0xfb; //分的個位的位選
- Delayms(5);
-
- PIN0=table1[g]; //分的十位的段選
- PIN1=0xfd; //分的十位的位選
- Delayms(5);
-
- PIN0=table[w]; //時的個位的段選
- PIN1=0xfe; //時的個位的位選
- Delayms(5);
- }
復制代碼 |