/*
write by cjdsn
时间计算
1/22.1184=0.0000005425
1/0.5425=1843317
1843317/40=46083
//我的是阳极显示,0开1关
*/
#include
unsigned char code Tab[12]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f,0xff};
//数码管显示0~9的段码表
unsigned char int_time; //记录中断次数
unsigned char second; //储存秒
unsigned char t,h;
sbit pd=P2^0;
sbit pc=P2^1;
sbit pb=P2^2;
sbit pa=P2^3;
sbit p27=P2^7;
/******************************************************************
*****
函数功能:快速动态扫描延时,延时约0.6毫秒
*******************************************************************
*****/
void delay(void)
{
unsigned char i;
for(i=0;i<200;i++)
;
}
/******************************************************************
*****
函数功能:显示秒
入口参数:k
出口参数:无
*******************************************************************
*****/
void DisplaySecond(unsigned char k)
{
pb=0; //P2.1引脚输出低电平
P0=Tab[k/10]; //显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pb=1;
pa=0; //P2.0引脚输出低电平
P0=Tab[k%10]; //显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
pd=0;
P0=Tab[t/10]; //分 十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pd=1;
pc=0;
P0=Tab[t%10]; //分 个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
///////////////////////////////////
pc=0;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
//====================================//
/*
P2=0xff; //关闭所有数码管
P0=0xff; //显示个位
*/
//====================================//
}
///////////////////////////////////////////////////////////////////
/////////////////
void Displayh()
{
pb=0; //P2.1引脚输出低电平
P0=Tab[t/10]; //显示十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pb=1;
pa=0; //P2.0引脚输出低电平
P0=Tab[t%10]; //显示个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
pd=0;
P0=Tab[h/10]; //分 十位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pd=1;
pc=0;
P0=Tab[h%10]; //分 个位
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
///////////////////////////////////
pc=0;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
pc=1;
}
//////////////////////////////// 显示小数点
displayms(void)
{
P2=1;
p27=1;
pa=0;
pb=1;
P0=Tab[10];
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
delay();
pa=1;
}
//==========================================================//
void main(void)
{
P2=1;
p27=1;
TMOD=0x01; //使用定时器T0
TH0=(-46083)/256; //将定时器计时时间设定为
46083×1.085微秒
//=50000微秒=50毫秒
TL0=(-46083)%256;
EA=1;
ET0=1;
TR0=1;
int_time=0; //中断次数初始化
second=0; //秒初始化
t=59;
while(1)
{ if(h<=0){
DisplaySecond(second);//调用秒的显示子程序
}
else Displayh();
}
}
//********************************************************
//函数功能:定时器T0的中断服务程序
//*******************************************************
void interserve(void ) interrupt 1 using 1
{
TR0=0; //关闭定时器T0
int_time ++; //每来一次中断,中断次数int_time自加1
中
断次数清0
if(int_time==40) //够20次中断,即1秒钟进行一次检测结果采样
{
int_time=0; //
second++; //秒加1
if(h>0){displayms();}
if(second==60)
{ second =0; //秒等于60就返回0
t++;}
if(t==60){t=0;h++;
if(h==24)h=0;}
}
TH0=(-46083)/256; //重新给计数器T0赋初值
TL0=(-46083)%256;
TR0=1; //启动定时器T0
}