/************************************
*********数码时钟的设计**************
***************************时间2月12日
**************************************/
#include<reg52.h>
#define uchar unsigned char
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table1[]=
{0x3e,0x3d,0x3b,0x37,0x2f,0x1f};//位选表
uchar code table2[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39 ,0x5e,0x79,0x71,0x80};//段码表最后一位是小数点
uchar hour,minute,second,count,flag;
/**********初始化函数***************/
void init()
{
wei=0;
P0=0xff;
duan=0;
P0=0x00;// 初始化关显示
hour=23;
minute=59;
second=50;//初始化时间设置为23点59分50秒
TMOD=0x01;//选择计数器TO模式1定时器1选择模式1
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;//定时器0实现50MS定时
EA=1;//开总中断
ET0=1;//开定时器0中
TR0=1; //定时器0开始计数
}
/*******延时函数***************/
void delay(uchar xms)
{
char x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
/************显示函数***********/
void display(uchar hh,uchar mm,uchar ss)
{
uchar h1,h2,m1,m2,s1,s2;//两位分别对应时间的十位个位
h1=hh/10;//时的十位
h2=hh%10;//时的个位
m1=mm/10;//分的十位
m2=mm%10;//分的个位
s1=ss/10;//秒的十位
s2=ss%10;//秒的个位
P0=0xff; //消隐
wei=1;
P0=table1[0];//第1个数码管选中
wei=0;
duan=1;
P0=table2[h1];
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[1];//第2个数码管选中
wei=0;
duan=1;
P0=table2[h2]+0x80;//最后加0x80为了显示出小数点
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[2];//第3个数码管选中
wei=0;
duan=1;
P0=table2[m1];
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[3];//第4个数码管选中
wei=0;
duan=1;
P0=table2[m2]+0x80;//加0x80为了显示小数点
duan=0;
delay(1);
P0=0xff; //消隐
wei=1;
P0=table1[4];//第5个数码管选中
wei=0;
duan=1;
P0=table2[s1];
duan=0;
delay(1);
P0=0xff;//消隐
wei=1;
P0=table1[5];//第6个数码管选中
wei=0;
duan=1;
P0=table2[s2];
duan=0;
delay(1);
}
/******定时器0中断函数*********/
void t0() interrupt 1 //定时器0中断级别为1
{
TH0=(65536-46080)/256;//数据重载
TL0=(65536-46080)%256;
count++;
if(count==20)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void main()
{
init();
while(1)
{
display(hour,minute,second);
}
}
想写出一个能够实现时分秒可调的电子时钟,加油。