- 北有云溪
-
时钟
#include<reg52.h>
char code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //0-9数码管,共阴
char code wema[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7}; //片选,1-8个数码管
char j;
char h_num,m_num,s_num; //分别定义小时、分钟、秒
char h_shi,h_ge,m_shi,m_ge,s_shi,s_ge;
sbit fm=P3^4;
void delay(char x)
{
char a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void inter_init()
{
EA=1; //开总中断
ET0=1; //本例中使用的是定时器T0,如果用T1。则为ET1=0,TMOD=0x10。
TMOD=0x01; //定时器工作方式1
TH0=(65535-50000)/256; //因为晶振用的是11.0592MHZ。在取初值时,大概定义为一个中断为50MS
TL0=(65535-50000)%256;
TR0=1;
}
void display(char h_shi,h_ge,m_shi,m_ge,s_shi,s_ge)
{
P2=duma[h_shi];
P1=wema[0];
delay(8);
P2=duma[h_ge];
P1=wema[1];
delay(8);
P2=duma[10];
P1=wema[2];
delay(8);
P2=duma[m_shi];
P1=wema[3];
delay(8);
P2=duma[m_ge];
P1=wema[4];
delay(8);
P2=duma[10];
P1=wema[5];
delay(8);
P2=duma[s_shi];
P1=wema[6];
delay(8);
P2=duma[s_ge];
P1=wema[7];
delay(8);
}
void main()
{
inter_init();
s_num=55; //初始时间设置。分别是秒,分,小时
m_num=59;
h_num=10;
while(1)
{
if(j==20)
{
j=0;
if(s_num==59)
{
s_num=-1;
if(m_num==59)
{
m_num=-1;
if(h_num==24)
h_num=-1;
h_num++;
fm=0; //到整点后蜂鸣器会响一下
delay(50);
fm=1;
}
m_num++;
}
s_num++;
}
h_shi=h_num/10;
h_ge =h_num%10;
m_shi=m_num/10;
m_ge =m_num%10;
s_shi=s_num/10;
s_ge =s_num%10;
display(h_shi,h_ge,m_shi,m_ge,s_shi,s_ge);
}
}
void time()interrupt 1 using 1 //如果用T1的话,应为interrupt 3
{
TH0=(65535-50000)/256; //因为晶振用的是11.0592MHZ。在取初值时,大概定义为一个中断为50MS
TL0=(65535-50000)%256;
j++;
}
- coco
-
我给你一个6位数码管的,减。计时最长为99分59秒99,并使用了软件复位:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3; //四位设置开关
sbit light=P3^4;
sfr ISP_CONTR=0xe7;
sbit fen1=P2^0;
sbit fen2=P2^1;
sbit miao1=P2^2;
sbit miao2=P2^3;
sbit pemiao1=P2^4;
sbit pemiao2=P2^5; //数码管选择
uint fen,miao,pemiao,mn,xy;
uchar code led[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//共阳数码管编码
/******************************************************************/
void delay(uint aa)
{
uint ar;
for(ar=aa;ar>0;ar--);//去抖延时
}
/**************************************************************/
void fencomd()
{
if(key1==0)
{
delay(800);
if(key1==0)
{
if(!key1)
{
delay(15000);
fen++;
}
}
}
} //返回值分
void desplayfen()
{
if(fen>100)
fen=0;
P1=led[fen/10];
fen1=0;
delay(100);
fen1=1;
P1=led[fen%10];
fen2=0;
delay(100);
fen2=1; //显示分
}
/***************************************************************************/
void miaocomd()
{
if(key2==0)
{
delay(800);
if(key2==0)
{
if(!key2)
{
delay(15000);
miao++;
}
}
}
} //返回值秒
void desplaymiao()
{
if(miao>60)
miao=0;
P1=led[miao/10];
miao1=0;
delay(100);
miao1=1;
P1=led[miao%10];
miao2=0;
delay(100);
miao2=1; //显示秒
}
/********************************************************************/
void pemiaocomd()
{
if(key3==0)
{
delay(800);
if(key3==0)
{
if(!key3)
{
delay(15000);
pemiao++;
}
}
}
} //返回值百分秒
void desplaypemiao()
{
if(pemiao>100)
pemiao=0;
P1=led[pemiao/10];
pemiao1=0;
delay(100);
pemiao1=1;
P1=led[pemiao%10];
pemiao2=0;
delay(100);
pemiao2=1; //显示百分秒
}
/**************************************************************/
void run()
{
if(key4==0)
{
while(!key4)
{
TR1=1;
work: for(;pemiao>0;)
{
desplayfen();
desplaymiao();
desplaypemiao();
}
if(!(fen||miao||pemiao))
{
light=0;
TR1=0;
while(key4)
{
desplayfen();
desplaymiao();
desplaypemiao();
}
if(key4==0)
{
while(!key4)
{
delay(1000);
ISP_CONTR=0x20;
}
}
}
if(fen||miao)
{
if(miao)
{
miao--;
pemiao=100;
goto work;
}
if(fen)
{
fen--;
miao=59;
pemiao=100;
goto work;
}
}
}
}
} //计时器工作部分,计时0.01秒自减
/*****************************************************************************************************/
void init()
{
EA=1;
ET1=1;
TMOD=0x10;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
}
//中断设定部分
/***************************************************************************************************/
void main()
{
while(1)
{
desplayfen();
desplaymiao();
desplaypemiao();
fencomd();
miaocomd();
pemiaocomd();
init();
run();
}
} //主函数部分
/*******************************************************************************/
void timer() interrupt 3
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
pemiao--;
} //中断服务部分
- 我不懂运营
-
时钟可以采用数码管的动态显示!计时可用定时器!