#include<reg51.h>
#include<intrins.h>
#define INT8U unsigned char
#define INT16U unsigned int
INT8U T_Count = 0;
INT8U code SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
INT8U code Scan_BITs[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//待显示数据
INT8U data disp_buff[]={0,0,0,0,0,0,0,0};
INT8U Count_S = 0; Count_F = 0; Count_H = 0;
void delay_ms(INT16U x)
{
INT8U t;while(x--) for(t = 0;t < 120;t++);
}
//数据显示处理
void Show_Count()
{
INT8U i;
//分解秒计数值Count_S
disp_buff[0] = Count_S % 10;
disp_buff[1] = Count_S / 10;
if(disp_buff[1] == 0)
{
disp_buff[1] = 11;
}
disp_buff[2] = 10;
//分解分Count_F
disp_buff[3] = Count_F % 10;
disp_buff[4] = Count_F / 10;
if(disp_buff[4] == 0)
{
disp_buff[4] = 11;
}
disp_buff[5] = 10;
//分解时Count_H
disp_buff[6] = Count_H % 10;
disp_buff[7] = Count_H / 10;
//数码管显示
for(i = 0;i < 8;i++)
{ P0 = 0xff; //关闭段码
P2 = Scan_BITs[i];
P0 = SEG[disp_buff[i]];
delay_ms(1);
}
}
//主程序
void main()
{
TMOD= 0x01;
TH0 = (65536-45872)/256; // 11.0592MHz晶振50ms定时
TL0 = (65536-45872)%256;
EA = 1; //开启中断
PT0=1;PT1=0; //T0设为高优先级
TR0=0; //启动T0
TR1=0;
while(1);
}
//中断处理
//T0中断
void T0_INT() interrupt 1
{
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
if(++T_Count == 20)
{
Count_S++;
T_Count = 0;
if(Count_S ==60)
{
Count_S = 0;
}
}
}
//T1中断
void T1_INT() interrupt 3
{
TH0 = (65536-45872)/256;
TL0 = (65536-45872)%256;
if(++T_Count == 1200)
{
T_Count = 0;
Count_F++;
if(Count_F ==60)
{
Count_F = 0;
Count_H++;
if(Count_H ==24)
{
Count_H = 0;
}
}
}
}
|