51單片機的定時器0工作在模式1,溢出時間為50ms,每20次中斷,相當于定時1秒鐘。秒變量second實現秒計數,采用兩位數碼管顯示秒計數值。源程序如下:
//本程序來源:51hei單片機
#include < AT89X51.H>
unsigned char code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
0xF8,0x80,0x90}; //數碼管七段譯碼表
unsigned char second; //定義秒變量
unsigned char tcount; //定義中間變量
void main(void) //主函數
{ TMOD=0x01; //定時器0工作在模式1,GATE=0,C/T=0,16位模式
TH0=(65536-50000)/256; //設定時器高8位初值 0x3C=60(10)
TL0=(65536-50000)%256; //設定時器低8位初值 0xB0==176(10)
TR0=1; //啟動定時器0
ET0=1; //允許定時器0中斷
EA=1; //使能總中斷
tcount=0; //設置中間變量初值
second=0; //設置秒變量初值
P1=dispcode[second/10]; //顯示秒變量的十位
P0=dispcode[second%10]; //顯示秒變量的個位
while(1); //無限循環,沒有循環體
}
void t0(void) interrupt 1 using 0 //定時器0中斷服務程序
{
tcount++; //每次中斷,中間變量tcount加1
if(tcount==20) //若20次中斷后,執行如下語句
{
tcount=0; //將中間變量清0
second++; //使秒變量加1
if(second==60) //如果秒變量等于60
{ second=0; } //將秒變量清0
P1=dispcode[second/10]; //將秒變量的十位送P1口顯示
P0=dispcode[second%10]; //將秒變量的個位送P0口顯示
}
TH0=(65536-50000)/256; //設置定時器0高8位初值
TL0=(65536-50000)%256; //設定定時器0低8位初值
}