就是下面的程序,我感覺是我不按k1,定時器應(yīng)該也工作吧。這樣的話通電后在隔一段時間再按k1,不是應(yīng)該s不為0嗎?
為什么隔了一段時間這個s還是。
單片機源程序如下:
- /*****定時器0與外部中斷1制作計時器:夠60秒則進為分,夠60分則進位時*****/
- /*當按下k1鍵計時器開始工作,當按下k4鍵,定時器停止,再按一次k4,繼續(xù)定省
- 當按下k3,定時器歸0;再次按下k4,定時器開始定時。*/
- #include"reg52.h"
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit key1=P3^3;
- sbit key2=P3^1;
- sbit key0=P3^2;
- u16 s=0;u16 m=0;u16 h=0;
- u16 i,c;
- u16 code weixuan[8]={0xe3,0xe7,0xeb,0xef,0xf3,0xf7,0xfb,0xff};//位選數(shù)組:數(shù)碼管第一個到最后一個
- u16 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//顯示0—9最后有一個顯示-
- //0 , 1 , 2, 3, 4, 5, 6, 7, 8, 9, —
- void delay_ms(u16 j)
- {
- while(j--)
- {
- u16 b;
- for(b=0;b<125;b++);
- }
- }
- void time1()
- {
- TMOD|=0x10;
- TH1=0xFC; //給定時器賦初值定時1ms
- TL1=0x18;
- ET1=1;
- TR1=1;
- EA=1;
- }
- void zhongduan1()
- {
- IT1=1;
- EX1=1;
- EA=1;
- }
- void zhongduan0()
- {
- IT0=1;
- EX0=1;
- EA=1;
- }
- void shuma()
- {
- u16 a;
- for(a=1;a<9;a++)
- {
- switch(a)
- {
- case(1):P2=weixuan[0];P0=smgduan[s%10];break;
- case(2):P2=weixuan[1];P0=smgduan[s/10];break;
- case(3):P2=weixuan[2];P0=smgduan[10];break;
- case(4):P2=weixuan[3];P0=smgduan[m%10];break;
- case(5):P2=weixuan[4];P0=smgduan[m/10];break;
- case(6):P2=weixuan[5];P0=smgduan[10];break;
- case(7):P2=weixuan[6];P0=smgduan[h%10];break;
- case(8):P2=weixuan[7];P0=smgduan[h/10];break;
- }
- delay_ms(1);
- P0=0x00;
- }
- }
- void main()
- {
- time1();
- zhongduan1();
- zhongduan0();
- if(key2==0)delay_ms(6);//按下k1,主函數(shù)中的數(shù)碼管函數(shù)開始執(zhí)行,定時器開始工作
- {
- if(key2==0)
- {
- while(1)
- {
- shuma();
- }
- }
- while(!key2);
- }
- }
-
- void waibu0()interrupt 0//外部中斷函數(shù)0,按下k3,s,m,h都歸0;
- {
- if(key0==0)
- {
- delay_ms(6);
- if(key0==0)
- {
- s=0;m=0;h=0;
- }
- }while(!key1);
- }
- void waibu()interrupt 2//外部中斷函數(shù),按下k4,定時器停止工作,再次按下k4繼續(xù)工作
- {
- if(key1==0)
- {
- delay_ms(6);
- if(key1==0)
- {
- TR1=~TR1;
- }
- }while(!key1);
- }
- void time1_()interrupt 3//定時器中斷函數(shù)每一秒s加1,夠60s則s變?yōu)?,m加1;
- {
- TH1=0xFC; //給定時器再次賦初值
- TL1=0x18;
- i++;
- if(i==1000)
- {
- i=0;
- s++;
- if(s==60){m++;s=0;}
- if(m==60){h++;m=0;}
- }
- }
復(fù)制代碼
|