用C语言编写AT89C51单片机程序,设计一个智能数字钟。

用C语言编写AT89C51单片机程序,设计一个智能数字钟。
基本要求:
1.C语言程序要求是模块化设计。
2.该闹钟基于AT89C51单片机及相关外围电路进行设计。
3.该闹钟有4个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒)。
4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能。S2是设定键,即该键按下,将分别选中需要设定的选项。S3键是加键,即按下去表示相应选项加1。S4键是减键,即按下去表示相应的选项减1。
5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s。
发挥要求:
1.定时时间可被打断,即打断后恢复时继续计时。
2.设置闹钟报警功能;
3.能切换显示年月日等信息。
并实现分,秒倒计时,注意用c语言编写

这是我的课程设计,6个数码管,显示时分秒,三个按钮P0.0、P0.1、P0.2可以调时,有8个彩灯(可以不要),没闹钟、倒计时之类的。呵呵。

#include<AT89X52.H>
#define uchar unsigned char
int i;
//**********************************************************************时钟的
uchar one[10]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,0x07,0xff,0xef}; //NPN,阿拉伯数码(共阳数码管专用)
//uchar one[10]={0x40,0x4f,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //PNP三极管,低电平使能
uchar three[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //扫描
int num[6]={2,3,5,9,3,6};
uint a,t,d;
void time(); //计时
void turn(); //调时
void delay(int); //延时
//***********************************************************************彩灯的
uchar light[24]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e};
int n,m=6,h;
void go();

//====================================主函数========================================
void main()
{
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1; //允许计数
ET0=1; //允许中断
EA=1;

for(;;) //主循环
{
time();
for(a=0;a<6;a++)
{
P3=three[a]; //扫描
P1=one[num[a]];
delay(1);
}
turn();
go();
}
}
//=====================================中断函数=================================
void work()interrupt 1 using 0
{
t++; //时钟时间
h++;
}

//=====================================计时子函数================================
void time()
{
if(t>=4000) //中断了4000次,一秒
{
t=0;
num[5]++;
if(num[5]>9) //1
{
num[5]=0;
num[4]++;
}
if(num[4]>5) //2
{
num[4]=0;
num[3]++;
}
if(num[3]>9) //3
{
num[3]=0;
num[2]++;
}
if(num[2]>5) //4
{
num[2]=0;
num[1]++;
}
if(num[1]>9) //5
{
num[1]=0;
num[0]++;
}
if(num[0]>1) //6
if(num[1]>3)
{
num[0]=0;
num[1]=0;
}
}
}

//====================================调时子程序===========================================
void turn()
{
if(P0_0==0) //小时
{
delay(5);
if(P0_0==0)
{
num[1]++;
if(num[1]>9)
{
num[1]=0;
num[0]++;
}
if(num[0]>1)
if(num[1]>3)
{
num[0]=0;
num[1]=0;
}

}
while(P0_0==0);
}
if(P0_1==0) //分钟
{
delay(5);
if(P0_1==0)
{
num[3]++;
if(num[3]>9)
{
num[3]=0;
num[2]++;
}
if(num[2]>5)
{
num[2]=0;
}
}
while(P0_1==0);
}
if(P0_2==0)
{
delay(5);
if(P0_2==0)
{
num[5]++;
if(num[5]>9)
{
num[5]=0;
num[4]++;
}
if(num[4]>5)
num[4]=0;
}
while(P0_2==0);
}
}

//========================================彩灯===========================================
void go()
{

if(h>=500*m) //1000=0.125秒
{
h=0;
P2=light[n];
n++;
}
if(n==24)
{
n=0;
m--;
}
if(m==0)
m=6;

}

//=====================================延时子程序==========================================
void delay(int c)
{
for(i=0;i<30*c;i++);
}
温馨提示:答案为网友推荐,仅供参考
相似回答