这是我第一设计,包括硬件设计和软件设计。做这个设计,我深深地体会到做工程师的辛苦! 由于这只是一个电子时钟,所以硬件设计方面困难不大,原理图较为简单。PCB板采用单面板设计,减低成本,所以布线时要尽量避免有交叉线,布线前要充分思考元件的布局问题。软件的设计体会最深,单片机只是把一台计算机集成一块芯片上,而计算机做事的每一步都是人已经设定的,如果考虑不够周到,那么就会出现错误,甚至影响到整个程序,所以程序设计时要求每一步必须正确无误。

源程序:
ORG 0000H
AJMP START
ORG 0003H
RETI
ORG 000BH
LJMP T0
ORG 0013H
RETI
ORG 001BH
RETI
ORG 30H
START:MOV TMOD,#1H ;程序开始
MOV TL0,#0B0H
MOV TH0,#3CH
MOV DPTR,#TABLE
MOV 6BH,#0H
MOV 6CH,#0H
MOV 6DH,#0H
MOV 6EH,#0H
MOV 6FH,#0H
SETB P1.0
MOV A,#0H
MOV B,#0H
MOV 70H,#0H
MOV 71H,#0H
MOV 72H,#0H
MOV 73H,#0H
MOV 74H,#0H
MOV 75H,#0H
MOV 76H,#0H
MOV 77H,#0H
MOV 78H,#0H
MOV 79H,#0H
MOV 7AH,#0H
MOV 7BH,#0H
MOV 7CH,#0H
MOV 7EH,#0H
MOV 7FH,#0H
SETB EA
SETB ET0
SETB TR0
LOOPNO:LCALL SHOWNO ;开机5秒内显示学号
MOV A,71H
CJNE A,#5H,LOOPNO
LOOP: JB P3.2,AA1 ;主程序1(时分显示模式)
LCALL DELAY
CA1: JNB P3.2,CA1
LCALL DELAY
LCALL INTT0
AA1: JB P3.3,RAA0
LCALL DELAY
CA2: JNB P3.3,CA2
LCALL DELAY
AJMP BB0
RAA0: MOV A,6BH
CJNE A,#1H,CLR1
MOV A,6FH
CJNE A,76H,CLR1
MOV A,6EH
CJNE A,75H,CLR1
MOV A,6DH
CJNE A,74H,CLR1
MOV A,6CH
CJNE A,73H,CLR1
CLR P1.0
AJMP AA0
CLR1: SETB P1.0
AA0: LCALL SHOW1
AJMP LOOP
LOOP1: JB P3.2,BB1 ;主程序2(分秒显示模式)
LCALL DELAY
CA11: JNB P3.2,CA11
LCALL DELAY
LCALL INTT0
BB1: JB P3.3,RBB0
LCALL DELAY
CA22: JNB P3.3,CA22
LCALL DELAY
AJMP LOOPR
RBB0: MOV A,6BH
CJNE A,#1H,CLR2
MOV A,6FH
CJNE A,76H,CLR2
MOV A,6EH
CJNE A,75H,CLR2
MOV A,6DH
CJNE A,74H,CLR2
MOV A,6CH
CJNE A,73H,CLR2
CLR P1.0
AJMP BB0
CLR2: SETB P1.0
BB0: LCALL SHOW0
AJMP LOOP1
LOOPR: LCALL RING ;主程序3(闹钟设置)
LOOP2: JB P3.3,RCC0 ;主程序4(省电模式)
LCALL DELAY
CA33: JNB P3.3,CA33
LCALL DELAY
AJMP AA0
RCC0: MOV A,6BH
CJNE A,#1H,CLR3
MOV A,6FH
CJNE A,76H,CLR3
MOV A,6EH
CJNE A,75H,CLR3
MOV A,6DH
CJNE A,74H,CLR3
MOV A,6CH
CJNE A,73H,CLR3
CLR P1.0
AJMP CC0
CLR3: SETB P1.0
CC0: MOV P2,#0FFH
AJMP LOOP2
T0: PUSH ACC ;中断程序0 (定时计数器0)
PUSH PSW
CLR ET0
CLR TR0
MOV A,#0B7H ;计数修正
ADD A,TL0
MOV TL0,A
MOV A,#03CH
ADD A,TH0
MOV TH0,A
SETB TR0
MOV A,7EH
CJNE A,#0H,T2T
AJMP T0T
T2T: INC B ;0.4秒定时
MOV A,B
CJNE A,#8H,C1
MOV B,#0H
INC 77H ;用作 30 秒计数寄存器
INC 78H ;用作 0.4秒计数寄存器
MOV A,78H
CJNE A,#2H,C1
MOV 78H,#0H
C1: MOV A,7FH
CJNE A,#1H,T0T
AJMP A1
T0T: INC 70H ;1秒钟定时
MOV A,70H
CJNE A,#14H,A1
MOV 70H,#0H
INC 71H ;秒+1
MOV A,71H
CJNE A,#0AH,A1
MOV 71H,#0H
INC 72H
MOV A,72H
CJNE A,#6H,A1
MOV 72H,#0H
INC 73H ;分+1
MOV A,73H
CJNE A,#0AH,A1
MOV 73H,#0H
INC 74H
MOV A,74H
CJNE A,#6H,A1
MOV 74H,#0H
MOV A,76H ;时+1
CJNE A,#2H,A2
INC 75H
MOV A,75H
CJNE A,#4H,A1
MOV 75H,#0H
AJMP J1
A2: INC 75H
MOV A,75H
CJNE A,#0AH,A1
MOV 75H,#0H
J1: INC 76H
MOV A,76H
CJNE A,#3H,A1
MOV 76H,#0H
A1: POP PSW
POP ACC
SETB ET0
RETI
INTT0:MOV 7EH,#1H ;修改时间
M2: JB P3.2,JMP1 ;"时" 修改
LCALL DELAY
UU1: JNB P3.2,UU1
LCALL DELAY
AJMP M1
JMP1: JB P3.3,DELAY5
LCALL DELAY
UU2: JNB P3.3,UU2
LCALL DELAY
MOV 7FH,#1H
MOV 70H,#0H
MOV A,76H
CJNE A,#2H,B1
INC 75H
MOV A,75H
CJNE A,#4H,M3
MOV 75H,#0H
AJMP J2
B1: INC 75H
MOV A,75H
CJNE A,#0AH,M3
MOV 75H,#0H
J2: INC 76H
MOV A,76H
CJNE A,#3H,M3
MOV 76H,#0H
DELAY5:MOV A,78H ;是否已过0.4秒,闪烁用
CJNE A,#1H,BC1
LCALL SHOW2
AJMP BC2
M3: MOV 77H,#0H
BC1: LCALL SHOW1
BC2: MOV A,77H ;是否已过30秒,是则退出
CJNE A,#4BH,M2
AJMP OUT
M1: MOV 77H,#0H ;"分" 修改
M0: JB P3.2,JMP2
LCALL DELAY
UU3: JNB P3.2,UU3
LCALL DELAY
AJMP MM1
JMP2: JB P3.3,DELAY6
LCALL DELAY
UU4: JNB P3.3,UU4
LCALL DELAY
MOV 7FH,#1H
MOV 70H,#0H
INC 73H
MOV A,73H
CJNE A,#0AH,M4
MOV 73H,#0H
INC 74H
MOV A,74H
CJNE A,#6H,M4
MOV 74H,#0H
DELAY6:MOV A,78H ;是否为0.4秒
CJNE A,#1H,DC1
LCALL SHOW3
AJMP DC2
M4: MOV 77H,#0H
DC1: LCALL SHOW1
DC2: MOV A,77H ;是否已过30秒,是则退出
CJNE A,#4BH,M0
AJMP OUT
MM1: MOV 77H,#0H ;"秒" 修改
MM0: JB P3.2,JMP3
LCALL DELAY
UU5: JNB P3.2,UU5
LCALL DELAY
AJMP OUT
JMP3: JB P3.3,DELAY7
LCALL DELAY
UU6: JNB P3.3,UU6
LCALL DELAY
MOV 7FH,#1H
MOV 70H,#0H
INC 71H
MOV A,71H
CJNE A,#0AH,MM4
MOV 71H,#0H
INC 72H
MOV A,72H
CJNE A,#6H,MM4
MOV 72H,#0H
DELAY7:MOV A,78H ;是否为0.4秒
CJNE A,#1H,DCC1
LCALL SHOW4
AJMP DCC2
MM4: MOV 77H,#0H
DCC1: LCALL SHOW
DCC2: MOV A,77H ;是否已过30秒,是则退出
CJNE A,#4BH,MM0
AJMP OUT
OUT: MOV 7EH,#0H ;修改时间退出
MOV 7FH,#0H
MOV B,#0H
MOV 77H,#0H
MOV 78H,#0H
RET
RING: MOV 7EH,#1H ;闹钟时间设置
RI0: LCALL RSHOW01
JB P3.3,R31 ;是否有按p3.3
LCALL DELAY
R33: JNB P3.3,R33
LCALL DELAY
AJMP RP33
R31: MOV A,77H ;是否已 5 秒
CJNE A,#0DH,R331
LJMP OUTR
R331: JB P3.2,RI0 ;是否有按p3.2
LCALL DELAY
R32: JNB P3.2,R32
LCALL DELAY
INC 6BH
MOV A,6BH
CJNE A,#2H,ZZZ
MOV 6BH,#0H
ZZZ: MOV 77H,#0H
AJMP RI0
RP33: MOV A,6BH ;闹钟"开"还是"关"
CJNE A,#0H,QQ
LJMP OUTR
QQ: MOV 77H,#0H
YM2:JB P3.3,YJMP1 ;是否有按p3.3
LCALL DELAY
YUU1:JNB P3.3,YUU1
LCALL DELAY
AJMP YM1
YJMP1:JB P3.2,YDELAY5 ;"时" 闹钟设置
LCALL DELAY
W1: JNB P3.2,W1
LCALL DELAY
MOV A,6FH ;"闹时"+1
CJNE A,#2H,YB1
INC 6EH
MOV A,6EH
CJNE A,#4H,YM3
MOV 6EH,#0H
AJMP YJ2
YB1: INC 6EH
MOV A,6EH
CJNE A,#0AH,YM3
MOV 6EH,#0H
YJ2: INC 6FH
MOV A,6FH
CJNE A,#3,YM3
MOV 6FH,#0H
AJMP YM3
YDELAY5:MOV A,78H ;是否已过0.4秒
CJNE A,#1H,YBC1
LCALL RSHOW2
AJMP YBC2
YM3: MOV 77H,#0H
YBC1: LCALL RSHOW1
YBC2: MOV A,77H ;30秒
CJNE A,#4BH,YM2
AJMP OUTR
YM1: MOV 77H,#0H ;"分" 闹钟设置
YM0: JB P3.3,YJMP2
LCALL DELAY
YUU3: JNB P3.3,YUU3
LCALL DELAY
AJMP OUTR
YJMP2: JB P3.2,YDELAY6
LCALL DELAY
YUU4: JNB P3.2,YUU4
LCALL DELAY
INC 6CH ;"闹分"+1
MOV A,6CH
CJNE A,#0AH,YM4
MOV 6CH,#0H
INC 6DH
MOV A,6DH
CJNE A,#6H,YM4
MOV 6DH,#0H
AJMP YM4
YDELAY6:MOV A,78H ;是否已过0.4秒
CJNE A,#1H,YDC1
LCALL RSHOW3
AJMP YDC2
YM4: MOV 77H,#0H
YDC1: LCALL RSHOW1
YDC2: MOV A,77H ;是否已30秒
CJNE A,#4BH,YM0
OUTR: MOV 7EH,#0H
MOV 7FH,#0H
MOV B,#0H
MOV 77H,#0H
MOV 78H,#0H
RET
SHOW: MOV R0,#71H ;"秒" 显示模式
MOV R1,#2H
MOV R2,#0EEH
LCALL SH
MOV P2,#0FFH
LCALL DELAY1
LCALL DELAY1
RET
SHOW0:MOV R0,#71H ;"分秒" 显示模式
MOV R1,#4H
MOV R2,#0EEH
LCALL SH
MOV P2,#0FFH
RET
SHOW1:MOV R0,#73H ;"时分" 显示模式
MOV R1,#4H
MOV R2,#0EEH
LCALL SH
MOV P2,#0FFH
RET
SHOW2:MOV R0,#73H ;"时" 闪烁
MOV R1,#2H
MOV R2,#0EEH
LCALL SH
MOV P0,#7FH
MOV P2,#0BBH
LCALL DELAY1
MOV P0,#7FH
MOV P2,#77H
LCALL DELAY1
MOV P2,#0FFH
RET
SHOW3:MOV P0,#7FH ;"分" 闪烁
MOV P2,#0EEH
LCALL DELAY1
MOV P0,#7FH
MOV P2,#0DDH
LCALL DELAY1
MOV R0,#75H
MOV R1,#2H
MOV R2,#0BBH
LCALL SH
MOV P2,#0FFH
RET
SHOW4:MOV P2,#0FFH ;"秒" 闪烁
LCALL DELAY1
LCALL DELAY1
LCALL DELAY1
LCALL DELAY1
RET
RSHOW01:MOV R0,#6BH ;闹钟 "开"--"关" 显示
MOV R1,#1H
MOV R2,#0EEH
LCALL SH
LCALL DELAY1
LCALL DELAY1
LCALL DELAY1
RET
RSHOW1:MOV R0,#6CH ;"闹时"显示
MOV R1,#4H
MOV R2,#0EEH
LCALL SH
MOV P2,#0FFH
RET
RSHOW2:MOV R0,#6CH ;"闹时"闪烁
MOV R1,#2H
MOV R2,#0EEH
LCALL SH
MOV P0,#7FH
MOV P2,#0BBH
LCALL DELAY1
MOV P0,#7FH
MOV P2,#77H
LCALL DELAY1
MOV P2,#0FFH
RET
RSHOW3:MOV P0,#7FH ;"闹分"闪烁
MOV P2,#0EEH
LCALL DELAY1
MOV P0,#7FH
MOV P2,#0DDH
LCALL DELAY1
MOV R0,#6EH
MOV R1,#2H
MOV R2,#0BBH
LCALL SH
MOV P2,#0FFH
RET
SHOWNO:MOV P0,#12H
MOV P2,#0EEH
LCALL DELAY1
MOV P0,#40H
MOV P2,#0DDH
LCALL DELAY1
LCALL DELAY1
LCALL DELAY1
RET
SH:MOV A,@R0
INC R0
MOVC A,@A+DPTR
MOV P0,A
MOV P2,R2
LCALL DELAY1
MOV A,R2
RL A
MOV R2,A
DJNZ R1,SH
RET
TABLE:DB 40H,79H,24H,30H,19H,12H,2H,78H,0H,10H
DELAY:MOV 79H,#64H ;延时10ms
D11:MOV 7AH,#30H
D12:DJNZ 7AH,D12
DJNZ 79H,D11
RET
DELAY1:MOV 7BH,#64H ;延时2.4ms
D2:MOV 7CH,#0AH
D3:DJNZ 7CH,D3
DJNZ 7BH,D2
RET
END