am007 发表于 2007-7-9 17:25

[求助]用单片机做时钟,我这个程序可以实现吗?

<P>本人没有实验设备,<BR>用仿真的软件显示很乱。<BR>要求可以显示时,分,秒。刚开始显示全零。<BR>有一个按钮,按一下开始计时,再按一下停止,再按一下清零。<BR>程序如下:<BR><BR>SECOND        EQU 30H<BR>MINITUE         EQU 31H<BR>HOUR            EQU 32H<BR>COUNT        EQU 33H<BR>        ORG 00H<BR>START:        MOV SECOND,#00H                ;准备开始全部清零<BR>                MOV MINITUE,#00H<BR>                MOV HOUR,  #00H<BR>        MOV COUNT,#00H                        </P>
<P>AA:        MOV A,#24H                         ;显示00              <BR>        MOV P2,A<BR>                MOV A,#3FH<BR>                MOV P0,A<BR>        LCALL DELAY1</P>
<P>                MOV A,#0DBH                    ;显示--<BR>                MOV P2,A<BR>                MOV A,#40H<BR>                MOV P0,A<BR>                LCALL DELAY1</P>
<P>                MOV A,P3                       ;判断是否开始计数?<BR>                LCALL DELAY2<BR>                JB  ACC.5,AA </P>
<P>        MOV TMOD,#01H                  ;开始计数<BR>        MOV TH0,#(65536-50000) / 256<BR>        MOV TL0,#(65536-50000) MOD 256<BR>                SETB TR0</P>
<P>DISP:           MOV A,SECOND<BR>        MOV B,#10<BR>        DIV AB<BR>                MOV DPTR,#TABLE                ;显示秒数的十位,并存于R0<BR>        MOVC A,@A+DPTR<BR>        MOV P0,A<BR>        MOV R0,A<BR>                MOV A,#0FDH<BR>        MOV P2,A<BR>                LCALL DELAY1<BR>        MOV A,B                        ;显示秒数的个位,并存于R1<BR>        MOVC A,@A+DPTR<BR>        MOV P0,A<BR>        MOV R1,A<BR>                MOV A,#0FEH<BR>        MOV P2,A<BR>                LCALL DELAY1<BR>                <BR>                MOV A,#0DBH                    ;显示--<BR>                MOV P2,A<BR>                MOV A,#40H<BR>                MOV P0,A<BR>                LCALL DELAY1</P>
<P>                MOV A,MINITUE                 <BR>        MOV B,#10<BR>        DIV AB<BR>                MOV DPTR,#TABLE                ;显示分数的十位,并存于R2<BR>        MOVC A,@A+DPTR<BR>        MOV P0,A<BR>        MOV R2,A<BR>                MOV A,#0EFH<BR>        MOV P2,A<BR>                LCALL DELAY1<BR>        MOV A,B<BR>        MOVC A,@A+DPTR                 ;显示分数的个位,并存于R3<BR>        MOV P0,A<BR>        MOV R3,A<BR>                MOV A,#0F7H<BR>        MOV P2,A<BR>                LCALL DELAY1</P>
<P>                MOV A,#0DBH                    ;显示--<BR>                MOV P2,A<BR>                MOV A,#40H<BR>                MOV P0,A<BR>                LCALL DELAY1</P>
<P>                MOV A,HOUR<BR>        MOV B,#10<BR>        DIV AB<BR>                MOV DPTR,#TABLE<BR>        MOVC A,@A+DPTR                ;显示时数的十位,并存于R4<BR>        MOV P0,A<BR>        MOV R4,A<BR>                MOV A,#07FH<BR>        MOV P2,A<BR>                LCALL DELAY1<BR>        MOV A,B<BR>        MOVC A,@A+DPTR                ;显示时数的个位,并存于R5<BR>        MOV P0,A<BR>        MOV R5,A<BR>                MOV A,#0BFH<BR>        MOV P2,A<BR>                LCALL DELAY1</P>
<P>        MOV A,P3                      ;判断是否停止计数?<BR>                LCALL DELAY2<BR>                JNB  ACC.5,EE <BR>        SJMP WAIT<BR>EE:             LJMP CC</P>
<P><BR>WAIT:        JNB TF0,FF<BR>                SJMP GG<BR>FF:             AJMP DISP<BR>GG:        CLR TF0<BR>        MOV TH0,#(65536-50000) / 256<BR>        MOV TL0,#(65536-50000) MOD 256<BR>        INC COUNT<BR>        MOV A,COUNT<BR>        CJNE A,#20,NEXT1<BR>        MOV COUNT,#00H<BR>        INC SECOND<BR>        MOV A,SECOND<BR>        CJNE A,#60,NEXT2<BR>                MOV SECOND,#00H<BR>                INC MINITUE<BR>                MOV A,MINITUE<BR>                CJNE A,#60,NEXT2 <BR>                MOV MINITUE,#00H<BR>                INC HOUR<BR>        MOV A,HOUR<BR>                CJNE A,#24,NEXT2<BR>                LJMP START        </P>
<P>NEXT2:        LJMP DISP<BR>NEXT1:        LJMP WAIT</P>
<P>CC:             MOV A,#0FDH                ;显示秒数的十位<BR>                MOV P1,A<BR>                MOV P0,R0<BR>                LCALL DELAY1<BR>        MOV A,#0FEH                ;显示秒数的个位<BR>        MOV P1,A<BR>                MOV P0,R1<BR>        LCALL DELAY1</P>
<P>                MOV A,#0DBH                    ;显示--<BR>                MOV P2,A<BR>                MOV A,#40H<BR>                MOV P0,A<BR>                LCALL DELAY1</P>
<P>                MOV A,#0EFH                ;显示分数的十位<BR>                MOV P1,A<BR>                MOV P0,R2<BR>                LCALL DELAY1<BR>        MOV A,#0F7H                ;显示分数的个位<BR>        MOV P1,A<BR>                MOV P0,R3<BR>        LCALL DELAY1</P>
<P>                MOV A,#0DBH                    ;显示--<BR>                MOV P2,A<BR>                MOV A,#40H<BR>                MOV P0,A<BR>                LCALL DELAY1</P>
<P>                MOV A,#07FH                ;显示时数的十位<BR>                MOV P1,A<BR>                MOV P0,R4<BR>                LCALL DELAY1<BR>        MOV A,#0BFH                ;显示时数的个位<BR>        MOV P1,A<BR>                MOV P0,R5<BR>        LCALL DELAY1</P>
<P>                MOV A,P3                  ; 判断是否清零?<BR>                LCALL DELAY2<BR>                JNB ACC.5,DD<BR>                SJMP CC<BR>                <BR>DD:             LJMP START</P>
<P>DELAY1:         MOV R2,#10                 ;延时5MS<BR>D1:             MOV R3,128<BR>                DJNZ R3,$<BR>                DJNZ R2,D1<BR>            RET</P>
<P>DELAY2:         MOV R4,#20                ;延时10MS <BR>D2:             MOV R5,#128<BR>                DJNZ R5,$<BR>                DJNZ R4,D2<BR>            RET</P>
<P>TABLE:        DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH<BR>        END</P>


页: [1]

编程论坛