| 
 20. 数字钟﹝★﹞  1. 实验任务  (1. 开机时,显示12:00:00的时间开始计时;  (2. P0.0/AD0控制“秒”的调整,每按一次加1秒;  (3. P0.1/AD1控制“分”的调整,每按一次加1分;  (4. P0.2/AD2控制“时”的调整,每按一次加1个小时;  2. 电路原理图  file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps57B1.tmp.jpg 图4.20.1  3. 系统板上硬件连线  (1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上;  (2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上;  (3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“独立式键盘”区域中的SP3、SP2、SP1端口上;  4. 相关基本知识  (1. 动态数码显示的方法  (2. 独立式按键识别过程  (3. “时”,“分”,“秒”数据送出显示处理方法  5. 程序框图  file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps57D1.tmp.jpg 6. 汇编源程序 
SECOND EQU 30H 
MINITE EQU 31H 
HOUR EQU 32H 
HOURK BIT P0.0 
MINITEK BIT P0.1 
SECONDK BIT P0.2 
DISPBUF EQU 40H 
DISPBIT EQU 48H 
T2SCNTA EQU 49H 
T2SCNTB EQU 4AH 
TEMP EQU 4BH 
 
ORG 00H 
LJMP START 
ORG 0BH 
LJMP INT_T0 
START: MOV SECOND,#00H 
MOV MINITE,#00H 
MOV HOUR,#12 
MOV DISPBIT,#00H 
MOV T2SCNTA,#00H 
MOV T2SCNTB,#00H 
MOV TEMP,#0FEH 
LCALL DISP 
MOV TMOD,#01H 
MOV TH0,#(65536-2000) / 256 
MOV TL0,#(65536-2000) MOD 256 
SETB TR0 
SETB ET0 
SETB EA 
WT: JB SECONDK,NK1 
LCALL DELY10MS 
JB SECONDK,NK1 
INC SECOND 
MOV A,SECOND 
CJNE A,#60,NS60 
MOV SECOND,#00H 
NS60: LCALL DISP 
JNB SECONDK,$ 
NK1: JB MINITEK,NK2 
LCALL DELY10MS 
JB MINITEK,NK2 
INC MINITE 
MOV A,MINITE 
CJNE A,#60,NM60 
MOV MINITE,#00H 
NM60: LCALL DISP 
JNB MINITEK,$ 
NK2: JB HOURK,NK3 
LCALL DELY10MS 
JB HOURK,NK3 
INC HOUR 
MOV A,HOUR 
CJNE A,#24,NH24 
MOV HOUR,#00H 
NH24: LCALL DISP 
JNB HOURK,$ 
NK3: LJMP WT 
DELY10MS: 
MOV R6,#10 
D1: MOV R7,#248 
DJNZ R7,$ 
DJNZ R6,D1 
RET 
DISP: 
MOV A,#DISPBUF 
ADD A,#8 
DEC A 
MOV R1,A 
MOV A,HOUR 
MOV B,#10 
DIV AB 
MOV @R1,A 
DEC R1 
MOV A,B 
MOV @R1,A 
DEC R1 
MOV A,#10 
MOV@R1,A 
DEC R1 
MOV A,MINITE 
MOV B,#10 
DIV AB 
MOV @R1,A 
DEC R1 
MOV A,B 
MOV @R1,A 
DEC R1 
MOV A,#10 
MOV@R1,A 
DEC R1 
MOV A,SECOND 
MOV B,#10 
DIV AB 
MOV @R1,A 
DEC R1 
MOV A,B 
MOV @R1,A 
DEC R1 
RET 
INT_T0: 
MOV TH0,#(65536-2000) / 256 
MOV TL0,#(65536-2000) MOD 256 
MOV A,#DISPBUF 
ADD A,DISPBIT 
MOV R0,A 
MOV A,@R0 
MOV DPTR,#TABLE 
MOVC A,@A+DPTR 
MOV P1,A 
MOV A,DISPBIT 
MOV DPTR,#TAB 
MOVC A,@A+DPTR 
MOV P3,A 
INC DISPBIT 
MOV A,DISPBIT 
CJNE A,#08H,KNA 
MOV DISPBIT,#00H 
KNA: INC T2SCNTA 
MOV A,T2SCNTA 
CJNE A,#100,DONE 
MOV T2SCNTA,#00H 
INC T2SCNTB 
MOV A,T2SCNTB 
CJNE A,#05H,DONE 
MOV T2SCNTB,#00H 
INC SECOND 
MOV A,SECOND 
CJNE A,#60,NEXT 
MOV SECOND,#00H 
INC MINITE 
MOV A,MINITE 
CJNE A,#60,NEXT 
MOV MINITE,#00H 
INC HOUR 
MOV A,HOUR 
CJNE A,#24,NEXT 
MOV HOUR,#00H 
NEXT: LCALL DISP 
DONE: RETI 
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H 
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH 
END 
 
7. C语言源程序 
#include <AT89X51.H> 
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 
0x66,0x6d,0x7d,0x07, 
0x7f,0x6f,0x77,0x7c, 
0x39,0x5e,0x79,0x71,0x00}; 
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 
0xef,0xdf,0xbf,0x7f}; 
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; 
unsigned char dispbitcnt; 
 
unsigned char second; 
unsigned char minite; 
unsigned char hour; 
unsigned int tcnt; 
unsigned char mstcnt; 
 
unsigned char i,j; 
 
void main(void) 
{ 
TMOD=0x02; 
TH0=0x06; 
TL0=0x06; 
TR0=1; 
ET0=1; 
EA=1; 
 
while(1) 
{ 
if(P0_0==0) 
{ 
for(i=5;i>0;i--) 
for(j=248;j>0;j--); 
if(P0_0==0) 
{ 
second++; 
if(second==60) 
{ 
second=0; 
} 
dispbuf[0]=second%10; 
dispbuf[1]=second/10; 
while(P0_0==0); 
} 
} 
if(P0_1==0) 
{ 
for(i=5;i>0;i--) 
for(j=248;j>0;j--); 
if(P0_1==0) 
{ 
minite++; 
if(minite==60) 
{ 
minite=0; 
} 
dispbuf[3]=minite%10; 
dispbuf[4]=minite/10; 
while(P0_1==0); 
} 
} 
if(P0_2==0) 
{ 
for(i=5;i>0;i--) 
for(j=248;j>0;j--); 
if(P0_2==0) 
{ 
hour++; 
if(hour==24) 
{ 
hour=0; 
} 
dispbuf[6]=hour%10; 
dispbuf[7]=hour/10; 
while(P0_2==0); 
} 
} 
} 
} 
void t0(void) interrupt 1 using 0 
{ 
mstcnt++; 
if(mstcnt==8) 
{ 
mstcnt=0; 
P1=dispcode[dispbuf[dispbitcnt]]; 
P3=dispbitcode[dispbitcnt]; 
dispbitcnt++; 
if(dispbitcnt==8) 
{ 
dispbitcnt=0; 
} 
} 
tcnt++; 
if(tcnt==4000) 
{ 
tcnt=0; 
second++; 
if(second==60) 
{ 
second=0; 
minite++; 
if(minite==60) 
{ 
minite=0; 
hour++; 
if(hour==24) 
{ 
hour=0; 
} 
} 
} 
dispbuf[0]=second%10; 
dispbuf[1]=second/10; 
dispbuf[3]=minite%10; 
dispbuf[4]=minite/10; 
dispbuf[6]=hour%10; 
dispbuf[7]=hour/10; 
} 
}    
 |