/*最近51hei論壇一會員編制了一個單片機秒表程序,該秒表有一個按鍵,
按鍵按下一次,秒表開始計時;按鍵按下第2次,秒表停止計數;按鍵按
下第3次,秒表復位歸0。設計者:51Hei單片機論壇,源程序如下:*/
#include < AT89X51.H>
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90}; //七段數碼管譯碼表
unsigned char second; //定義秒變量
unsigned char keycnt; //按鍵次數變量
unsigned int tcnt; //中斷次數變量
void main(void) //主函數
{
unsigned char i,j;
TMOD=0x02; //定時器0工作在模式2,GATE=0,C/T=0,自動裝載模式
ET0=1; //允許定時器0中斷
EA=1; //允許總中斷
second=0; //置秒變量初值
P1=dispcode[second/10]; //顯示定時值的十位
P0=dispcode[second%10]; //顯示定時值的個位
while(1) //無限循環
{ if(P3_5==0) //與P3_5引腳連接的按鍵按下
{ for(i=20;i>0;i--) //循環語句延時
for(j=248;j>0;j--); //循環語句延時
if(P3_5==0) //如果按鍵確實按下
{ keycnt++; //次數變量加1
switch(keycnt) //根據次數變量的值分支選擇
{ case 1: //若是次數變量等于1
TH0=0x06;
TL0=0x06; //定時器初值為6,所以溢出計數值為250μs,時鐘為12MHz
TR0=1; //啟動定時器0運行
break;
case 2: //若是次數變量等于2
TR0=0; //停止定時器0運行
break;
case 3: //若是次數變量等于3
keycnt=0; //次數變量清 0
second=0; //秒變量清0
break;
} //分支選擇結束
while(P3_5==0); //等待按鍵抬起
} }
P1=dispcode[second/10]; //顯示秒變量十位
P0=dispcode[second%10]; //顯示秒變量個位
} }
void t0(void) interrupt 1 using 0 //定時器0中斷服務程序
{
tcnt++; //每中斷1次,tcnt加1
if(tcnt==400) //如果tcnt=400 ,則執行如下語句
{ //0.25ms*400=100ms
tcnt=0; //將tcnt清0
second++; //秒變量加1
if(second==100) //如果秒變量等于100
{ second=0; } //將秒變量清0
} }