51单片机驱动八位数码管电子钟

如题所述

#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define DP 0x80

uchar code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//八位位选码表
//0 1 2 3 4 5 6 7
uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段选码表
// 0, 1,2, 3, 4 , 5,6,7 ,8,9
uchar flag=0; //
sbit K1=P3^4; //时钟
sbit K2=P3^5; //秒表
sbit start=P1^0; //秒表开始
sbit stop=P1^1; //暂停
sbit clear=P1^2; //清零
sbit clock=P3^0; //时钟开始
sbit t1=P3^1; //调时
sbit t2=P3^2; //调分
sbit t3=P3^3; //调秒
sbit P3_4 = P3^4;
sbit P3_5 = P3^5;

void delay(uint z);
void display1();
void display2();
void init();
void keyscan1();
void keyscan2();
void qiehuan();
void gongzuo();

uchar shi,fen,miao,nam;
uchar hour,minite,sec,dot;

void main()
{
init();
P0=0X3F;
P2=0X00; //八个数码管显示全为0
TR0=0;
TR1=0;
while(1)
{
gongzuo();
}
}

void delay(uint z) //延时程序
{
uint i,j;
for (i=z;i>0;i--)
for (j=110;j>0;j--);
}

void display1() //P2为位选,P0为段选,显示格式为 23小时59分59.99秒
{
uchar s,g;
s=shi/10;g=shi%10;
P2=wei[0];P0=duan[s]; delay(1);
P2=wei[1];P0=duan[g]; delay(1);

s=fen/10;g=fen%10;
P2=wei[2];P0=duan[s]; delay(1);
P2=wei[3];P0=duan[g]; delay(1);

s=miao/10;g=miao%10;
P2=wei[4];P0=duan[s]; delay(1);
P2=wei[5];P0=duan[g]|DP; delay(1);

s=nam/10;g=nam%10;
P2=wei[6];P0=duan[s]; delay(1);
P2=wei[7];P0=duan[g]; delay(1);

}
void display2() //P2为位选,P0为段选,显示格式为:00时-00分-00秒
{
uchar s,g;
s=hour/10;g=hour%10;
P2=wei[0];P0=duan[s]; delay(1);
P2=wei[1];P0=duan[g]; delay(1);
P2=wei[2];P0=0x40; delay(1);

s=minite/10;g=minite%10;
P2=wei[3];P0=duan[s]; delay(1);
P2=wei[4];P0=duan[g]; delay(1);
P2=wei[5];P0=0x40; delay(1);

s=sec/10;g=sec%10;
P2=wei[6];P0=duan[s]; delay(1);
P2=wei[7];P0=duan[g]; delay(1);

}

void init()
{
EA=1; //开总中断
ET0=1; //开T0中断
ET1=1; //开T1中断
TMOD=0x11; //T0工作方式1,T1工作方式1,
TH0=0x3c;
TL0=0xb0; //T0定时50ms
TH1=0xd8;
TL1=0xf0; //T1定时10ms
TR0=1; // 启动定时/计数器T0
TR1=1; // 启动定时/计数器T1

}

void timer1(void) interrupt 1 using 1 //时钟中断计时T0 50ms
{

TH0 = 0x3c;
TL0 = 0xb0;
dot++;
if(dot == 20)
{
dot = 0;
sec++;
if (sec == 60)
{
sec = 0;
minite++;
if (minite == 60)
{
minite = 0;
hour++;
if (hour == 24) hour = 0;
}
}
}
}
void timer3 (void)interrupt 3 using 3 //秒表中断计时 T1 10ms
{
TH1=0xd8;
TL1=0xf0;
if(++nam==100)
{
nam=0;
if(++miao==60) //计时一分钟
{
miao=0;
if(++fen==60)
{
fen=0; //返回0
if(++shi==24) shi=0; //24小时返回0
}
}
}
}

void keyscan1()
{
if(~start)
{
delay(5);
if(~start)
{
TR1=1;
display1();
}
}
if(~stop)
{
delay(5);
if(~stop)
{
TR1=0;
display1();
}
}
if(~clear&&TR1==0)
{
delay(5);
if(~clear&&TR1==0)
{
nam=0;miao=0;fen=0;shi=0;
display1();
}
}
}

void keyscan2()
{
if(~clock)
{
delay(5);
if(~clock)
{
TR0=1;
display2();
}
}
if (~t1)
{
delay(1);
if (~t1)
{
while(~t1);
hour=hour+1;
if (hour>=24) hour=0;
display2();
}
}
if (~t2)
{
delay(1);
if (~t2==0)
{
while(~t2);
minite=minite+1;
if (minite>=60) minite=0;
display2();
}
}
if (~t3)
{
delay(1);
if (~t3)
{
while(~t3);
sec=sec+1;
if (sec>=60) sec=0;
display2();
}
}
}

void qiehuan()
{
if(~K1)
{
delay(1);
if(~K1)
{
P3_4 = 0;
P3_5 = 1;
flag = 1;
}
}
if(~K2)
{
delay(1);
if(~K2)
{
P3_4 = 1;
P3_5 = 0;
flag = 2;
}
}
}

void gongzuo()
{
qiehuan();
if(1 == flag)
{
display2();
keyscan2();
}
if(2 == flag)
{
display1();
keyscan1();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-01
这个可以买个现成的模块