急求基于8051单片机的多功能数字钟的程序

临近期末了 马上要交一个数字钟的程序 请大虾们帮帮忙吧。 要求就是用单片机编程:能计时 和报时就行了 急急急啊!!!!!
谢谢你们的帮忙 可是你们给的程序都只有显示时间 没有定点或多点报时功能啊

#include <AT89X51.H>
unsigned char second=0,minute=0,hour=0,max=23; //second秒,minute分,hour时,max时制

//主函
main()
{
unsigned char code table[]={0xdd,0x84,0xe9,0xec,0xb4,0x7c,0x7d,0xc4,0xfd,0xfc};
unsigned int i;
void good();
TMOD=0X11; //T0工作于定时模式1用于计时,T1工作于定时模式1用于扫描按键
IE=0X8a; //开放T0、T1中断
IP=0X80; //T1优先级高于T0,有按键停止计时
TH0=0X3c; //设置T0初值,定时5MS
TL0=0Xb0;
TH1=0x3c; //定时250ms扫描按键;
TL1=0xb0;
TR1=1; //启动
good();
while(1) //扫描轮流显示
{
i=minute/10; //显示分十位
P0_5=0;
P0_4=1;
P0_6=1;
P0_7=1;
P2=table[i];
for(i=0;i<500;i++);
i=minute%10; //显示分个位
P0_5=1;
P0_4=0;
P0_6=1;
P0_7=1;
P2=table[i];
for(i=0;i<500;i++);
i=hour%10; //显示时个位
P0_5=1;
P0_4=1;
P0_6=0;
P0_7=1;
P2=table[i];
for(i=0;i<500;i++);
i=hour/10; //显示时十位
P0_5=1;
P0_4=1;
P0_6=1;
if(i!=0)P0_7=0;
P2=table[i];
for(i=0;i<500;i++);
}
}
//计时中断程序
void abc() interrupt 1 //t0(计时)中断子程序
{
static char a=0;
TH0=0X3c; //重赋初值
TL0=0Xb0;
a++;
if (a==20) //当a=20时一秒到了
{a=0;
P1_7=~P1_7; //二级管取反闪烁
second++; //秒增1
if(minute==0)
{if(second<2*hour)P1_4=~P1_4;
else P1_4=1; }
if(second==60){second=0;minute++;} //秒计到60,秒清0,分增一
if(minute==60){minute=0;hour++;} //分计到60,分清0,时增一
if(hour==max+1){hour=0;} //时计到最大值,清0
}
}

//按键中断处理程序
void key() interrupt 3
{ char key=9;
// int i;
static char b=0;
TR1=0; //停止计时
TH1=0x3c; //重赋初值
TL1=0xb0;
b++; //250ms计数
if(b==5){ //判断按键是哪一个
if(P1_0==0)key=0;
if(P1_1==0)key=1;
if(P1_2==0||P3_2==0)key=2;
if(P1_3==0)key=3;
b=0;
}
switch (key)
{
case 0: //按下调时键调整时数
{TR0=0;
hour++;
if (hour==max+1)hour=0;
break;}
case 2: //按下调分键调整分数
{TR0=0;
minute++;
if (minute==60)minute=0;
break;}
case 1: {TR0=1;break;}//按下重启键重新计时
case 3: Musicu(); //按下通讯键,功能待定
}
TR1=1; //重启T1
}

void good()
{ int i,j=0,k;
unsigned char a[]={0x00,0x00,0x00,0x84,0x00,0x19,0x2d,0x0d,0x79,0x00,0xbc,0x2d,0x9d} ;//放置0~9
while(TR0==0&&minute==0&&hour==0)
{ if(k==60 ) { k=0;j++;if(j==13) j=0;}
//显示g
P0_5=1;
P0_4=1;
P0_6=1;
if(a[j%13]==0x00) P0_7=1;
else P0_7=0;
P2=a[j%13];
for(i=0;i<500;i++);
//显示分十位
if(a[(j+1)%13]==0x00) P0_6=1;
else P0_6=0;
P0_4=1;
P0_5=1;
P0_7=1;
P2=a[(j+1)%13];
for(i=0;i<500;i++);
//显示时O位
P0_4=1;
P0_6=1;
if(a[(j+2)%13]==0x00) P0_5=1;
else P0_5=0;
P0_7=1;
P2=a[(j+2)%13];
for(i=0;i<500;i++);
//显示分0位
P0_5=1;
if(a[(j+3)%13]==0x00) P0_4=1;
else P0_4=0;
P0_6=1;
P0_7=1;
P2=a[(j+3)%13];
for(i=0;i<500;i++);
k++;
} }

这条程序写进去要注意几点.
因为数码管的接法不同.给数组a[]的0~9的代码也要改.要不然你写进去后,显示都是乱码
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-01-02
我的博客上有一个比较好的电子钟程序,你可以去看看.
相似回答
大家正在搜