2013-10-15 75 views
1

我是新来的工作汇编代码,我想制作一个程序,它将读取ROM中的值,并根据它们在特定时间长度内播放某个音符的值。代码本身编译得很好,但是当我将代码发送到8051时,没有任何反应。我想我已经正确设置了定时器(以及它们各自的中断)。但是,我绝不是专家。现在代码并没有太多的功能,假设只是一遍又一遍地播放一个音符,但是没有任何反应......实际的芯片是89LPC932A1,这里是一本用户手册:http://www.nxp.com/documents/user_manual/UM10109.pdf8051定时器+中断

这是代码:

#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 
+0

无论何时您希望其他人查看它,汇编代码中都需要注释。 SO也不例外。 –

回答

0

根据您链接的文件(!感谢)设置IEN00x88只设置EA(全局中断使能)和ET1(定时器1)。因此,timer0中断未启用,因此您的TIMER0处理程序将永远不会被调用。我想用0x8a来代替。

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