【问题标题】:8051 Timers + Interrupts8051 定时器 + 中断
【发布时间】:2013-10-15 22:20:21
【问题描述】:

我是工作汇编代码的新手,我正在尝试制作一个程序,该程序将从 ROM 中读取值,并根据它们的值在一定时间内播放某个音符。代码本身编译得很好,但是当我将代码发送到 8051 时,什么也没有发生。我认为我正确设置了计时器(以及它们各自的中断);但是,我绝不是专家。而且代码现在做的不多,假设只是永远反复播放一个音符,但没有任何反应......实际芯片是89LPC932A1,这是一个用户手册:http://www.nxp.com/documents/user_manual/UM10109.pdf

代码如下:

#include <reg932.inc>

        NOTE_LENGTH EQU R0
        HIGH_CURRENT_NOTE EQU R1
        LOW_CURRENT_NOTE EQU R2
        TEMP EQU R3
        HIGH_NOTE_LENGTH EQU R4
        LOW_NOTE_LENGTH EQU R5
        DPTR_VALUE EQU R6



        ORG 0
        LJMP SETUP

        ORG 000BH
TIMER0:     CPL P1.7
        MOV TH0, HIGH_CURRENT_NOTE
        MOV TL0, LOW_CURRENT_NOTE
        RETI

        ORG 001BH
TIMER1:     CJNE NOTE_LENGTH, #0, TIMER1_END
        SETB TR0                                
        MOV TEMP, A
        MOV DPTR, #SONG

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV HIGH_CURRENT_NOTE, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV LOW_CURRENT_NOTE, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV NOTE_LENGTH, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV HIGH_NOTE_LENGTH, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV LOW_NOTE_LENGTH, A
        INC DPTR_VALUE

        MOV A, TEMP
        MOV DPTR_VALUE, #0
        CLR TR0                         
        RETI

TIMER1_END: DEC NOTE_LENGTH
        RETI


        ORG 0080H
SETUP:      MOV DPTR, #SONG
        MOV DPTR_VALUE, #0

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV HIGH_CURRENT_NOTE, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV LOW_CURRENT_NOTE, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV NOTE_LENGTH, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV HIGH_NOTE_LENGTH, A
        INC DPTR_VALUE

        MOV A, DPTR_VALUE
        MOVC A, @A+DPTR
        MOV LOW_NOTE_LENGTH, A
        INC DPTR_VALUE

        MOV IEN0, #0x88
        MOV TMOD, #0x11
        SETB TR1
        SETB TR0

MAIN:       SJMP $

        ORG 0F00H
SONG:       DB  80H, 80H, 26, 0, 0

        END

【问题讨论】:

  • 只要您希望其他人看到它,就需要在汇编代码中添加注释。 SO也不例外。

标签: assembly timer interrupt 8051


【解决方案1】:

根据您链接的文档(谢谢!)将IEN0 设置为0x88 仅设置EA(全局中断启用)和ET1(定时器1)。因此 timer0 中断未启用,因此您的 TIMER0 处理程序将永远不会被调用。我会尝试使用0x8a

很可能还有其他错误,这只是我发现的第一个错误。你最好学会使用调试器或模拟器来跟踪你的程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多