3des 发表于 2016-1-7 09:04

C51+8155数字钟

尝试许久,仿真就是没反应,不知哪里有错?
小弟通常用C,汇编不会编,不会编汇编,不知用C语言怎么编下列程序?
看不清可另下电路附件
       ORG 0000H
      AJMP MAIN
      ORG 000BH
      AJMP CLOCK
      ORG0030H
MAIN:   MOV   SP,#50H ;设置堆栈区
            MOV   DPTR,#PORT ; 8155初始化
             MOV   A,#03H
             MOVX@DPTR,A
             CLR    F1 ;清0闹钟标志位
             CLR    F0 ;允许计时显示
             MOV   AHOUR,#0FFH ;闹钟值寄存区初值
             MOV   AMIN,#0FFH
             MOV   ASEC,#0FFH
             MOV   R7,#10H ;显示缓冲区、计时缓冲区清0
             MOV   R0,#DISP0
             CLRA
LOOP:   MOV@R0, A
            INC   R0
         DJNZR7,LOOP
         MOVTMOD,#01H ;定时器T0初始化
         MOVTL0, #0B0H
         MOVTH0, #3CH
         SETBTR0 ; 启动定时器0
         SETBEA ; 开中断
         SETBET0
BEGIN:ACALLALARM ;调用定时器比较
            ACALLKEYSCAN ;调用键盘扫描
            CJNEA,#0AH,NEXT1;是C/R键否?
            CLRTR0 ;暂停计时
            MOVR1, #HOUR ;地址指针指向计时缓冲区首地址
            AJMP MOD
NEXT1:CJNE   A,#0BH ,BEGIN;是ALM键否?
             JB      F1,NEXT2      ;闹钟正在闹响否?
            MOV    R1,#AHOUR   ;地址指针指向闹钟值寄存区首地址
MOD:    SETB   F0             ;禁止显示计时时间
            ACALLMODIFY      ;调用时间设置/闹钟定时程序
            SETB   TR0 ; 重新开始计时
            CLR   F0 ; 恢复显示计时时间
            AJMP   BEGIN
NEXT2:SETB   P1.0 ;闹钟正在闹响,停闹
             CLR    F1;清0闹钟标志
             AJMPBEGIN
/*定时器T0中断服务子程序*/
CLOCK: PUSH    PSW
         PUSH   ACC;保护现场
         MOVTL0,#0B7H
         MOVTH0,33CH;重装初值,时间校正
         INC   MSEC
         MOV   A,MSEC
         CJNEA,#0AH,DONE
         MOVMSEC,#00H
         MOVA,SEC
         ADD   A,#01H
         DA   A       ;二-十进制转换
         MOV   SEC,A
         CJNE   A,#60H,DONE
         MOV   SEC,#00H
         MOV   A,MIN
         ADD   A,#01H
         DA   A
         MOV   MIN,A
         CJNEA,#60H,DONE
         MOV   MIN,#00H
         MOV   A,HOUR
         ADD   A,#01H
          DA   A
          MOV   HOUR,A
          CJNE   A,#24H,DONE
          MOV    HOUR,#00H
DONE:POP    ACC
            POP    PSW
            RETI
/*键盘设置子程序*/
KEYIN:PUSH   PSW         ;保护现场
             PUSH   ACC
             SETB   RS1
             MOV    R0,#DISP0;R0指向显示缓冲区首地址
             MOV    R7,#06H    ;设置键盘输入次数
L1:       CLR      RS1
         ACALL   KEYSCAN ;调用键盘扫描程序取按下键号
         SETB    RS1
         CJNE    A,#0AH,L2 ;键入数合法性检测(是否大于9)
L2:      JNC   L1   ; 大于9,重新输入
          MOV   @R0,A ;键号送显示缓冲区
          INC   R0
         DJNZ   R7,L1 ;6位时间输入完否?未完继续
         CLR   RS1 ;恢复现场
         POP    ACC
         POP   PSW
         RET
/*定时比较模块*/
ALARM:MOV   A,ASEC
            CJNE   A,SEC,BACK ; 秒钟单元相同则继续比较,否则返回
            MOV    A,AMIN
            CJNE   A,MIN,BACK ;分钟单元相同则继续比较,否则返回
            MOV    A,AHOUR
            CJNE   A,HOUR,BACK ;小时单元相同定时时间到
            CLR   P1.0 ;启动闹钟鸣叫
            SETB    F1;置位闹钟标志
BACK:   RET













3des 发表于 2016-1-7 09:26

已知PORT地址为8000H
PORTA为8001H
PORTB为8002H
PORTC为8003H
DISP0地址为30H 初始化值为00H
AHOUR,MIN,SEC,MESC的地址为3CH~3FH,初始化值为00H
页: [1]
查看完整版本: C51+8155数字钟