51單片機定時器秒錶?

/*

1、程序目的:使用定時器學習秒錶計時,中斷0控制走表,中斷1控制清零

2、硬件要求:數碼管、晶振12M

*/

#include

code unsigned char tab[]=

{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//共陽數碼管 0-9

unsigned char Dis_Shiwei;//定義十位

unsigned char Dis_Gewei; //定義個位

unsigned char S_Dis_Shiwei;//定義秒十位

unsigned char S_Dis_Gewei; //定義秒個位

unsigned char second,msecond;

void CLR(void);

void delay(unsigned int cnt)

{

while(--cnt);

}

main()

{

EX0=1;//外部中斷0設置

IT0=1;

EX1=1;//外部中斷1設置

IT1=1;

TMOD =0x01;//定時器設置 10ms in 12M crystal

TH0=0xd8;

TL0=0xf0;

ET0=1; //打開中斷

TR0=0;

EA=1;

CLR();

while(1)

{

P0=S_Dis_Shiwei;//顯示秒十位

P2=0xEF;

delay(300);//短暫延時

P0=S_Dis_Gewei; //顯示秒個位

P2=0xF7;

delay(300);

P0=0xBF; //顯示秒個位

P2=0xFB;

delay(300);

P0=Dis_Shiwei;//顯示十位

P2=0xFD;

delay(300);//短暫延時

P0=Dis_Gewei; //顯示個位

P2=0xFE;

delay(300);

}

}

/********************************/

/* 定時中斷 */

/********************************/

void tim(void) interrupt 1 using 1

{

TH0=0xd8;//重新賦值

TL0=0xf0;

msecond++;

if (msecond==100)

{

msecond=0;

second++;//秒加1

if(second==100)

second=0;

S_Dis_Shiwei=tab[second/10];//十位顯示值處理

S_Dis_Gewei=tab[second%10]; //個位顯示處理

}

Dis_Shiwei=tab[msecond/10];//十位顯示值處理

Dis_Gewei=tab[msecond%10]; //個位顯示處理

}

void ISR_INT0(void) interrupt 0 using 1

{

TR0=!TR0; //利用外部中斷打開和關閉定時器0 用於開始和停止計時

}

void ISR_INT1(void) interrupt 2 using 1

{

if(TR0==0)//停止時才可以清零

CLR();

}

void CLR(void)

{

second=0; //利用外部中斷清零

msecond=0;

Dis_Shiwei=tab[msecond/10];//十位顯示值處理

Dis_Gewei=tab[msecond%10]; //個位顯示處理

S_Dis_Shiwei=tab[second/10];//十位顯示值處理

S_Dis_Gewei=tab[second%10]; //個位顯示處理

}

相關問題答案