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位初值
}