1.6位共阴极数码管显示时,分,秒。
2.调时功能,且在调时时具体调整位闪烁显示。仿真图及效果:
程序:
//------头文件------
#include<reg51.h>
//------宏定义-------
#define uchar unsigned char
#define uint unsigned int
//------端口定义-----
sbit duan=P2^6;
sbit wei=P2^7;
sbit fm=P2^2;
sbit S2=P3^4;
sbit S3=P3^5;
sbit S4=P3^6;
sbit S5=P3^7;
//------变量定义-----
uchar code table_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//公阴极数码管显示0~9;
uint shi=23,fen=59,miao=55,counter=0;
uchar flag_1s,flag_m,num=0,i=0,m=0;
//------函数声明-----
void csh();
void mode();
void zoushi();
void tiaoshi();
void xianshi();
void baoshi();
void delay(uchar x);
//---------主函数------------
void main()
{
csh();
while(1)
{
mode();
if(flag_m==1)
{
TR0=1;
zoushi();
baoshi();
}
else
{
tiaoshi();
}
xianshi();
}
}
//-----------初始化函数--------------
void csh()
{
EA=1;
TMOD=0x11; //选择两个定时器/计数器的方式一
ET0=1; //定时器/计数器0溢出中断允许
TH0=15536/256;
TL0=15536&256;
ET1=1; //定时器/计数器1溢出中断允许
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
TR1=1; //启动定时器/计数器1
}
//-----------时钟秒变量---------
void T0_ser() interrupt 1
{
TH0=15536/256;
TL0=15536&256;
counter++;
if(counter==20)
{
flag_1s=1;
counter=0;
}
}
//---------闪烁显示变量---------
void T1_ser() interrupt 3
{
TH1=15536/256;
TL1=15536&256;
m++;
if(m==20)
{
m=0;
}
}
//-----------------切换模式函数---------------
void mode()
{
if(S2==0)
{
delay(10);
if(S2==0)
{
num=num+1;
while(!S2)xianshi();
switch(num%2)
{
case 0:flag_m=0;break;
case 1:flag_m=1;break;
}
if(num==2)
num=0;
}
}
}
//---------------走时函数--------------------
void zoushi()
{
if(flag_1s==1)
{
flag_1s=0;
if(++miao>59)
{
miao=0;
if(++fen>59)
{
fen=0;
if(++shi>23)
shi=0;
}
}
}
}
void tiaoshi() //调时函数定义
{
if(flag_m==0&&S3==0)
{
delay(10);
if(S3==0)
{
i++;
while(!S3)
xianshi();
}
if(i==3)
{
i=1;
}
}
if(i==1)
{
if(S4==0)
{
delay(10);
if(S4==0)
{
shi++;
if(shi==24)
shi=0;
while(!S4)
xianshi();
}
}
if(S5==0)
{
delay(10);
if(S5==0)
{
shi--;
if(shi==-1)
shi=23;
while(!S5)
xianshi();
}
}
}
if(i==2)
{
if(S4==0)
{
delay(10);
if(S4==0)
{
fen++;
if(fen==60)
fen=0;
while(!S4)
xianshi();
}
}
if(S5==0)
{
delay(10);
if(S5==0)
{
fen--;
if(fen==-1)
fen=59;
while(!S5)
xianshi();
}
}
}
}
void xianshi()
{
P0=0xdf;
wei=1;
wei=0;
P0=table_du[miao%10];
duan=1;
duan=0;
delay(10);
P0=0xef;
wei=1;
wei=0;
P0=table_du[miao/10];
duan=1;
duan=0;
delay(10);
P0=0xf7;
wei=1;
wei=0;
if(flag_m==0&&i==2) //调时显示判断
{
if(m<10) //闪烁显示
P0=table_du[fen%10]|0x80;
else
P0=0x00|0x80;
}
else
P0=table_du[fen%10]|0x80;
duan=1;
duan=0;
delay(10);
P0=0xfb;
wei=1;
wei=0;
if(flag_m==0&&i==2)
{
if(m<10)
P0=table_du[fen/10];
else
P0=0x00;
}
else
P0=table_du[fen/10];
duan=1;
duan=0;
delay(10);
P0=0xfd;
wei=1;
wei=0;
if(flag_m==0&&i==1)
{
if(m<10)
P0=table_du[shi%10]|0x80;
else
P0=0x00|0x80;
}
else
P0=table_du[shi%10]|0x80;
duan=1;
duan=0;
delay(10);
P0=0xfe;
wei=1;
wei=0;
if(flag_m==0&&i==1)
{
if(m<10)
P0=table_du[shi/10];
else
P0=0x00;
}
else
P0=table_du[shi/10];
duan=1;
duan=0;
delay(10);
}
//-----------------整点提醒函数-------------
void baoshi()
{
if (fen==0&&miao==0)
fm=0;
if(miao==5)
fm=1;
}
//-----------------延时函数---------------
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=200;b>0;b--);
}
|