#include<reg52.h> // 包含51 单片机寄存器定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar int_time ; //中断次数计数变量
uchar second; //秒计数变量
minute; //分钟计数变量
uchar hour; //小时计数变量
void delay(uint z) //延时函数,延时约1ms
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/******************************************************************
函数功能:显示秒的子程序
入口参数:s
********************************************************************/
void DisplaySecond(uchar s)
{
wela=1;
P0=0xef; //DS5点亮
wela=0;
P0=0xff; //消隐
dula=1;
P0=table[s/10]; //显示十位
dula=0;
delay(1);
wela=1;
P0=0xdf; //DS6点亮
wela=0;
P0=0xff; //消隐
dula=1;
P0=table[s%10]; //显示个位
dula=0;
delay(1);
}
/******************************************************************
函数功能:显示分钟的子程序
入口参数:m
********************************************************************/
void DisplayMinute(uchar m)
{
wela=1;
P0=0xfb; //DS3点亮
wela=0;
P0=0xff; //消隐
dula=1;
P0=table[m/10]; //显示十位
dula=0;
delay(1);
wela=1;
P0=0xf7; //DS4点亮
wela=0;
P0=0xff; //消隐
dula=1;
P0=table[m%10]; //显示个位
dula=0;
delay(1);
}
/******************************************************************
函数功能:显示小时的子程序
入口参数:h
********************************************************************/
void DisplayHour(uchar h)
{
wela=1;
P0=0xfe; //DS1点亮
wela=0;
P0=0xff; //消隐
dula=1;
P0=table[h/10]; //显示十位
dula=0;
delay(1);
wela=1;
P0=0xfd; //DS2点亮
wela=0;
P0=0xff; //消隐
dula=1;
P0=table[h%10]; //显示个位
dula=0;
delay(1);
}
/************初始化************/
void init()
{
TMOD=0x01; //使用定时器T0
EA=1; //开中断总允许
ET0=1; //允许T0 中断
TH0=(65536-50000)/256; //定时器高八位赋初值
TL0=(65536-50000)%256; //定时器低八位赋初值
TR0=1;
int_time=0; //中断计数变量初始化
second=0; //秒计数变量初始化
minute=0; //分钟计数变量初始化
hour=0; //小时计数变量初始化
}
/******************************************************************
函数功能:主函数
********************************************************************/
void main()
{
init();
while(1)
{
DisplaySecond(second); //调用秒显示子程序
delay(1);
DisplayMinute(minute); //调用分钟显示子程序
delay(1);
DisplayHour(hour); //调用小时显示子程序
delay(1);
}
}
/******************************************************************
函数功能:定时器T0的中断服务子程序
********************************************************************/
void interserve() interrupt 1 //using Time0
{
int_time++;
if(int_time==20)//控制速度
{
int_time=0; //中断计数变量清0
second++; //秒计数变量加1
}
if(second==60)
{
second=0; //如果秒计满60,将秒计数变量清0
minute++; //分钟计数变量加1
}
if(minute==60)
{
minute=0; //如果分钟计满60,将分钟计数变量清0
hour++; //小时计数变量加1
}
if(hour==24)
{
hour=0; //如果小时计满24,将小时计数变量清0
}
TH0=(65536-50000)/256; //定时器重新赋初值
TL0=(65536-50000)%256;
}