急救!!!各位兄弟姐妹们谁懂单片机编程啊,帮帮我啊!用单片机编辑一个数字钟的程序啊,要求如下:

使用KEIL编辑出数字钟完整程序;数字钟有八个按键,八个按键功能分别为:
1、按键一:用来修改时间和闹钟;每按一下小时上加一;
2、按键二:用来修改时间和闹钟;每按一下小时上减一;
3、按键三:用来修改时间和闹钟;每按一下分钟上加一;
4、按键四:用来修改时间和闹钟;每按一下分钟上减一;
5、按键五:用来控制时间和闹钟显示页面的转换;
6、按键六:用来控制闹钟的开和关;
7、按键七:用来控制时间和秒表显示页面的转换;
8、按键八:用来控制秒表的开始和停止;按第一下,秒表开始计数;按第二下,秒表停止且10秒后清零。

最好按键功能设定在P3.0-P3.7端口上;
8位8段显示管要这样显示:13-34-45 时分秒中间用一横隔开;端口设定在P0跟P2上。

请各位兄弟姐妹们帮帮忙,急用!!!谢谢
用AT89S51芯片的

给你一个我用液晶屏12864写的程序,一个是功能键,按照顺序按一下是第一位跳动,接下再按就是第二位,一次类推。第二个按键是控制加,第三个按键是控制减,你的数码管和这个很类似,比这个还简单,在这你也没有要求数码管是怎么接的。你可以参考的。
#include<reg52.h>
#include<chushihua.h> //12864的初始化函数;
char gwnian,nian,yue,ri,xq,shi,fen,miao;
sbit DQ =P3^5; //定义DS18B20通信端口
sbit led_en_port = P2^5; /*发光二极管寄存器LE引脚*/
sbit sled_en_port = P3^6; /*数码管寄存器LE引脚*/
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
uchar code mun_to_char[] = {"0123456789"}; /*数字转换为ASCII字符码*/
uchar table[]={"制作人:"};
uchar table2[]={"2009年11月28日晚"};
uchar table1[]={"江向阳"};
uchar table31[]={"年"};
uchar table32[]={"月"};
uchar table33[]={"日"};
uchar table4[]={"星期"};
uchar table51[]={"时"};
uchar table52[]={"分"};
uchar table53[]={"秒"};
uchar table6[]={"当前温度:20.3"};
//uchar table61[]={"??度"};
uchar xq1[]={"一"};
uchar xq2[]={"二"};
uchar xq3[]={"叁"};
uchar xq4[]={"四"};
uchar xq5[]={"五"};
uchar xq6[]={"六"};
uchar xq7[]={"日"};

/***************写星期函数*******************/
write_xq(uchar z)
{
uchar num;
write_com(0x90+5);
switch(z)
{
case 1: for(num=0;num<2;num++)
{
write_date(xq1[num]);
delay(1);
}
break;
case 2: for(num=0;num<2;num++)
{
write_date(xq2[num]);
delay(1);
}
break;
case 3: for(num=0;num<2;num++)
{
write_date(xq3[num]);
delay(1);
}
break;
case 4: for(num=0;num<2;num++)
{
write_date(xq4[num]);
delay(1);
}
break;
case 5: for(num=0;num<2;num++)
{
write_date(xq5[num]);
delay(1);
}
break;
case 6: for(num=0;num<2;num++)
{
write_date(xq6[num]);
delay(1);
}
break;
case 7: for(num=0;num<2;num++)
{
write_date(xq7[num]);
delay(1);
}
break;
}
}

/*************写年月日函数**************/
void write_nyr(uchar date,uchar add)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

/*************写时分秒函数**************/
void write_sfm(uchar date,uchar add)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x88+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

/*****************键盘扫描*****************/
void keyscan()
{
uchar keynum;
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
delay(5);
while(!key1);
keynum++;
TR0=0;
if(keynum==1)
{
//TR0=0;
write_com(0x8D);
write_com(0x0f);

}
if(keynum==2)
{
//TR0=0;
write_com(0x8B);
write_com(0x0f);
}
if(keynum==3)
{
//TR0=0;
write_com(0x89);
write_com(0x0f);
}
if(keynum==4)
{
//TR0=1;
write_com(0x95);
write_com(0x0f);
}
if(keynum==5)
{
//TR0=1;
write_com(0x85);
write_com(0x0f);
}
if(keynum==6)
{
//TR0=1;
write_com(0x83);
write_com(0x0f);
}
if(keynum==7)
{
//TR0=1;
write_com(0x81);
write_com(0x0f);
}
if(keynum==8)
{
//TR0=1;
write_com(0x80);
write_com(0x0f);
}
if(keynum==9)
{
TR0=1;
keynum=0;
//write_com(0x95);
write_com(0x0c);
}
}
}
if(keynum==1)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
miao++;
if(miao==60)
miao=0;
write_sfm(miao,5);
write_com(0x8D);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
miao--;
if(miao==-1)
miao=59;
write_sfm(miao,5);
write_com(0x8D);
}
}
}
if(keynum==2)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
fen++;
if(fen==60)
fen=0;
write_sfm(fen,3);
write_com(0x8B);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
fen--;
if(fen==-1)
fen=59;
write_sfm(fen,3);
write_com(0x8B);
}
}
}
if(keynum==3)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
shi++;
if(shi==24)
shi=0;
write_sfm(shi,1);
write_com(0x89);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
shi--;
if(shi==-1)
shi=23;
write_sfm(shi,1);
write_com(0x89);
}
}
}
if(keynum==4)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
xq++;
if(xq==8)
xq=1;
write_xq(xq);
write_com(0x95);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
xq--;
if(xq==0)
xq=7;
write_xq(xq);
write_com(0x95);
}
}
}
if(keynum==5)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
ri++;
if(ri==31)
ri=1;
write_nyr(ri,5);
write_com(0x85);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
ri--;
if(ri==0)
ri=30;
write_nyr(ri,5);
write_com(0x85);
}
}
}
if(keynum==6)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
yue++;
if(yue==13)
yue=1;
write_nyr(yue,3);
write_com(0x83);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
yue--;
if(yue==0)
yue=12;
write_nyr(yue,3);
write_com(0x83);
}
}
}
if(keynum==7)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
nian++;
if(nian==100)
nian=0;;
write_nyr(nian,1);
write_com(0x81);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
nian--;
if(nian==-1)
nian=99;
write_nyr(nian,1);
write_com(0x81);
}
}
}
if(keynum==8)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
delay(5);
while(!key2);
gwnian++;
if(gwnian==100)
gwnian=0;
write_nyr(gwnian,0);
write_com(0x80);
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
delay(5);
while(!key3);
gwnian--;
if(gwnian==-1)
gwnian=99;
write_nyr(gwnian,0);
write_com(0x80);
}
}
}
}

/************主函数********************/
void main()
{
uint num;
led_en_port = 0;/*关闭发光二极管显示*/
sled_en_port = 0;/*关闭数码管显示*/
gwnian=20;
nian=9;
yue=11;
ri=28;
xq=6;
shi=23;
fen=58;
miao=45;
init(); //12864液晶初始化;

write_com(0x80);//设置初始显示的坐标;
for(num=0;num<8;num++) /******在第一行显示制作人*******/
{
write_date(table[num]);
delay(100);
}
write_com(0x93); //第二行的初始坐标;
for(num=0;num<6;num++) /**********在第二行显示江向阳*******/
{
write_date(table1[num]);
delay(100);
}
write_com(0x88);//第三行的初始坐标
for(num=0;num<16;num++) /******在第三行显示制作时间*******/
{
write_date(table2[num]);
delay(100);
}
for(num=50;num>0;num--) ///延时,第一屏的显示时间 ;
delay(50000);
TMOD=0x01; //定时器0工作方式1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=0X01;
ET0=0X01;
TR0=0X01;
write_com(0x01);//清屏;
// delay(5);
// write_com(0x01);
write_com(0x80); //写入初始的年月日数据(2009-11-28);
write_date('2');
write_date('0');
write_date('0');
write_date('9');
write_com(0x83);
write_date('1');
write_date('1');
write_com(0x85);
write_date('2');
write_date('8');
write_com(0x95);
for(num=0;num<2;num++) //写入星期函数(周六);
{
write_date(xq6[num]);
}
write_com(0x89); //写入初始的时分秒函数(23:58:45);
write_date('2');
write_date('3');
write_com(0x8B);
write_date('5');
write_date('8');
write_com(0x8D);
write_date('4');
write_date('5');
write_com(0x82);
for(num=0;num<2;num++) //固定显示‘年’
{
write_date(table31[num]);
delay(1);
}
write_com(0x84);
for(num=0;num<2;num++) //固定显示‘月’
{
write_date(table32[num]);
delay(1);
}
write_com(0x86); //固定显示‘日’
for(num=0;num<2;num++)
{
write_date(table33[num]);
delay(1);
}
write_com(0x92); //固定显示‘星期’
for(num=0;num<4;num++)
{
write_date(table4[num]);
delay(1);
}
write_com(0x8A); //固定显示'时'
for(num=0;num<2;num++)
{
write_date(table51[num]);
delay(1);
}
write_com(0x8C); //固定显示'分'
for(num=0;num<2;num++)
{
write_date(table52[num]);
delay(1);
}
write_com(0x8E); //固定显示'秒'
for(num=0;num<2;num++)
{
write_date(table53[num]);
delay(1);
}
write_com(0x98); //固定显示'当前温度:20.3'
for(num=0;num<14;num++)
{
write_date(table6[num]);
delay(1);
}

/***************显示温度字符命令****************/
write_com(0x64); //开启扩展指令显示;
write_com(0x9f); //设置显示地址 ;
write_date(0xA1); //显示的字符编码地址;
write_date(0xE6);
write_com(0x66); //关闭扩展功能;

while(1)
{
keyscan;
}
}
void timer0() interrupt 1
{
uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
ri++;
xq++;
if(xq==8)
{
xq=1;
}
if(ri==31)
{
ri=1;
yue++;
if(yue==13)
{
yue=1;
nian++;
if(nian==100)
{
nian=0;
gwnian++;
if(gwnian==100)
gwnian=0;
write_nyr(gwnian,0);
}
write_nyr(nian,1);
}
write_nyr(yue,3);
}
write_xq(xq);
write_nyr(ri,5);
}
write_sfm(shi,1);
}
write_sfm(fen,3);
}
write_sfm(miao,5);
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-12-24
51单片机的程序如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTA
ORG 000BH
LJMP SEV1
ORG 0013H
LJMP INTB
ORG 001BH
LJMP SEV2
ORG 0030H
MAIN:MOV SP,#60H
MOV A,#00H
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV 33H,#0CH
MOV 34H,A
MOV 35H,A
MOV 44H,#80H
MOV 45H,#40H
MOV 46H,#20H
MOV 47H,#10H
CLR RS0
CLR RS1
MOV R2,#0
MOV R3,#0
MOV R4,#0
MOV R5,#12H
MOV TMOD,#11H
MOV TH1,#3CH
MOV TL1,#0B0H
MOV TH0,#0ECH
MOV TL0,#78H
MOV IP,#08H
MOV TCON,#50H
MOV IE,#8FH
LOP:MOV B,#10
MOV A,33H
DIV AB
MOV 40H,A
MOV 41H,B
MOV B,#10
MOV A,32H
DIV AB
MOV 42H,A
AA:MOV 43H,B
SETB RS1
CLR RS0
A1:MOV R2,35H
CJNE R2,#0,NT
MOV R2,34H
CJNE R2,#0,NT
SJMP BB
NT:MOV A,35H
CJNE A,33H,BB
MOV A,34H
CJNE A,32H,BB
CLR P3.7
SJMP LOP
BB:SETB P3.7
SJMP LOP
SEV1:PUSH ACC
PUSH PSW
SETB RS1
SETB RS0
CLR TR0
MOV R2,#04H
MOV R0,#40H
MOV R1,#44H

FLASH1:MOV A,@R1
ADD A,@R0
MOV P1,A
LCALL DELAY1
FLASH:INC R0
INC R1
DJNZ R2, FLASH1
MOV TH0,#0ECH
MOV TL0,#78H
POP PSW
POP ACC
SETB ET0
SETB TR0
SETB EA
RETI
DELAY1:MOV R3,#02H
AGAIN:MOV R4,#0F8H
DELAY:DJNZ R4,DELAY
DJNZ R3,AGAIN
RET
;计时程序清单:
SEV2:MOV TH1,#3CH
MOV TL1,#0B0H
CLR EA
PUSH ACC
PUSH B
PUSH PSW
CLR RS1
CLR RS0
INC R2
CJNE R2,#0AH,EN
MOV R2,#0
INC R3
CJNE R3,#3CH,EN
MOV R3,#0
INC R4
MOV 32H,R4
CJNE R4,#3CH,EN
MOV R4,#0
MOV 32H,R4
INC R5
MOV 33H,R5
CJNE R5,#18H,EN
MOV R5,#0
MOV 33H,R5
EN:POP PSW
POP B
POP ACC
SETB EA
RETI
;设置当前时间程序清单:
INTA:SETB P3.0
SETB P3.1
CLR TR1
CLR ET1
CLR EX0
CLR EX1
SETB EA
SETB ET0
SETB PT0
PUSH ACC
PUSH B
PUSH PSW
MOV 31H,#04H
MOV 29H,#00H
LP0:JB P3.0,NEXT0
LCALL DELAY1
JB P3.0,LP0
LP1:JNB P3.0,LP1
INC 29H
MOV 30H,#1H
SJMP LO1
NEXT0:JB P3.1,L1
LCALL DELAY1
JB P3.1,NEXT0
LD1:JNB P3.1,LD1
MOV 29H,#0
MOV 30H,#1
DJNZ 31H,LP0
SJMP LL
LO1:MOV A,31H
CJNE A,#04H,LO2
MOV A,29H
CJNE A,#03H,LA1
MOV 29H,#00H
LA1:MOV 40H,29H
SJMP L1
LO2:MOV A,31H
CJNE A,#03H,LO3
MOV A,40H
CJNE A,#2,A11
MOV A,29H
CJNE A,#4,LA2
MOV 29H,#0
SJMP LA2
A11:MOV A,29H
CJNE A,#0AH,LA2
MOV 29H,#00H
LA2:MOV 41H,29H
SJMP L1
LO3:MOV A,31H
CJNE A,#02H,LO4
MOV A,29H
CJNE A,#06H,LA3
MOV 29H,#00H
LA3:MOV 42H,29H
SJMP L1
LO4:MOV A,29H
CJNE A,#0AH,LA4
MOV 29H,#00H
LA4:MOV 43H,29H
L1:MOV A,31H
CJNE A,#00H,LP0
LL:MOV A,40H
MOV B,#10
MUL AB
ADD A,41H
MOV 33H,A
MOV A,42H
MOV B,#10
MUL AB
ADD A,43H
MOV 32H,A
PUSH PSW
CLR RS0
CLR RS1
MOV R4,32H
MOV R5,33H
POP PSW
POP PSW
POP B
POP ACC
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
SETB ET1
SETB PT1
SETB EX0
SETB EX1
CLR TR0
MOV TH0,#0FFH
MOV TL0,#00H
SETB TR0
SETB ET0
RETI
;设置定时(闹钟)时间程序清单:
INTB:SETB P3.0
SETB P3.1
CLR EX0
CLR EX1
SETB EA
SETB ET0
SETB ET1
SETB PT0
PUSH ACC
PUSH B
PUSH PSW
MOV 31H,#04H
MOV 29H,#00H
LP0B:JB P3.0,NEXTB
LCALL DELAY1
JB P3.0,LP0B
LP1B:JNB P3.0,LP1B
INC 29H
MOV 30H,#1H
SJMP LO1B
NEXTB: JB P3.1,L1B
LCALL DELAY1
JB P3.1,NEXTB
LD1B:JNB P3.1,LD1B
MOV 29H,#0
MOV 30H,#1
DJNZ 31H,LO1B
SJMP LLB
LO1B:MOV A,31H
CJNE A,#04H,LO2B
MOV A,29H
CJNE A,#03H,LA1B
MOV 29H,#00H
LA1B:MOV 40H,29H
SJMP L1B
LO2B:MOV A,31H
CJNE A,#03H,LO3B
MOV A,40H
CJNE A,#2,A1B
MOV A,29H
CJNE A,#4,LA2B
MOV 29H,#0
SJMP LA2B
A1B:MOV A,29H
CJNE A,#0AH,LA2B
MOV 29H,#00H
LA2B:MOV 41H,29H
SJMP L1B
LO3B:MOV A,31H
CJNE A,#02H,LO4B
MOV A,29H
CJNE A,#06H,LA3B
MOV 29H,#00H
LA3B:MOV 42H,29H
SJMP L1B
LO4B:MOV A,29H
CJNE A,#0AH,LA4B
MOV 29H,#00H
LA4B:MOV 43H,29H
L1B:MOV A,31H
CJNE A,#00H,LP0B
LLB:MOV A,40H
MOV B,#10
MUL AB
ADD A,41H
MOV 35H,A
MOV A,42H
MOV B,#10
MUL AB
ADD A,43H
MOV 34H,A
POP PSW
POP B
POP ACC
CLR TR0
MOV TH0,#0FFH
MOV TL0,#00H
SETB TR0
SETB EX1
SETB EX0
SETB ET0
SETB EA
RETI
END

这个程序是别人的。不知楼主你能不能用。这几天我也要做数字钟的实验。挺纠结的本回答被提问者采纳
相似回答
大家正在搜