打印

求助.请大虾帮忙看下,在中断里调用带有中断子程序后计时就

[复制链接]
2488|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YFEVA|  楼主 | 2007-6-3 08:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, hm, hd, AC, se
请各位高手帮忙看看了,弄了很久都没弄明白为什么计时一开始准的,一个闹钟时间到后调用音乐子程序,然后回来计时就边快了。。(计时用T1,音乐子程序用T0,在T1中断服务程序里调用了音乐子程序)

ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INTT0
ORG 001BH
LJMP INTT1
ORG 0100H
MAIN:
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#14H
SETB PT0
CLR PT1

MOV TMOD,#10H
MOV TL1,#00H
MOV TH1,#4CH
SETB ET1
SETB TR1
SETB EA
AJMP $

INTT1:
MOV SP,#60H
PUSH PSW
PUSH ACC
MOV TH1,#4CH      ;晶振11.0592M,50ms定时
MOV TL1,#00H
DJNZ 33H,RETURN   
MOV 33H,#14H      ;20次计满为1s
INC 32H
MOV A,32H
CJNE A,#60,RETURN  ;判断秒钟到60s
MOV 32H,#00H       ;到60s清零
MOV A,31H
ADD A,#1
DA A
MOV 31H,A

TABTIME:   ;一分钟扫一次定时表,比较计时到否        
PUSH PSW
PUSH ACC
COMPARE:
MOV 20H,#00H
COMP1:MOV A,20H
MOV DPTR,#TABLE
MOVC A,@A+DPTR
CJNE A,30H,COMP2
INC 20H
MOV A,20H
MOVC A,@A+DPTR
CJNE A,31H,COMP3
LCALL MUSIC
AJMP COMP3
COMP2:INC 20H
COMP3:INC 20H
COMP4:MOV A,20H
CJNE A,#06H,COMP1
RETURN1:
POP ACC
POP PSW


CJNE A,#60H,RETURN
MOV 31H,#00H
MOV A,30H
ADD A,#1
DA A
MOV 30H,A
CJNE A,#24H,RETURN
MOV 30H,#00H
RETURN:
POP ACC
POP PSW
RETI

MUSIC:   ;音乐子程序,用T0中断
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH

MAIN1:
MOV TMOD,#01H
SETB ET0
SETB EA
SETB TR0
START0:
SETB P1.0
MOV 40H,#00H
NEXT:
MOV A,40H
MOV DPTR,#TABLEM
MOVC A,@A+DPTR
MOV R0,A
JZ ENDD
ANL A,#0FH
MOV R7,A
MOV A,R0
SWAP A
ANL A,#0FH
JNZ SING
CLR TR0
LJMP D1
SING:
DEC A
MOV 52H,A
RL A
MOV DPTR,#TABLEF
MOVC A,@A+DPTR
MOV TH0,A
MOV 51H,A
MOV A,52H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 50H,A
SETB TR0
D1:
LCALL DELAY
INC 40H
LJMP NEXT
ENDD:
CLR TR0
LJMP EXIT 

INTT0:
PUSH PSW
PUSH ACC
MOV TL0,50H
MOV TH0,51H
CPL P1.0
POP ACC
POP PSW
RETI

DELAY:MOV R1,#100
DELAY1:MOV R2,#30 
DELAY2:MOV R3,#29
DELAY3:DJNZ R3,DELAY3 
DJNZ R2,DELAY2
DJNZ R1,DELAY1
DJNZ R7,DELAY
RET

EXIT:
POP DPH
POP DPL
POP ACC
POP PSW
RET

TABLE:DW 0002H,0003H,0015H
TABLEM:
DB 44H,54H,64H,44H
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 44H,84H,48H
DB 44H,14H,48H
DB 00H
TABLEF:
DW 64260,64400,64524,64580,64684,64777,64820,64898
DW 64968,65030,65058,65110,65157,65178,65217

END

相关帖子

来自 2楼
maychang| | 2007-6-3 20:02 | 只看该作者

Re

汇编源程序本来就不容易看,书写时若不依照一定规范就更没办法看了。
明天我把你的程序改改贴上来,说说应该怎么写就容易让别人看清楚。

使用特权

评论回复
板凳
maychang| | 2007-6-3 08:35 | 只看该作者

先别说走时准不准

INTT1:
        MOV SP,#60H

进入中断修改栈针?那怎么返回?

使用特权

评论回复
地板
yfeva| | 2007-6-3 14:55 | 只看该作者

还有哪里有错误啊

我把MOV SP,#60H放到了MAIN后面,可是还是走不准啊,哪里还有错误啊,请大家帮帮忙了

使用特权

评论回复
5
conwh| | 2007-6-3 15:22 | 只看该作者

有点乱,怎么没有TIMER0的定义

使用特权

评论回复
6
maychang| | 2007-6-3 15:27 | 只看该作者

程序写得实在不规范,看得头昏

待我慢慢看完再说。

使用特权

评论回复
7
conwh| | 2007-6-3 17:10 | 只看该作者

狂倒!

请各位高手帮忙看看了,弄了很久都没弄明白为什么计时一开始准的,一个闹钟时间到后调用音乐子程序,然后回来计时就边快了。。(计时用T1,音乐子程序用T0,在T1中断服务程序里调用了音乐子程序)

ORG 0000H
AJMP MAIN
ORG 000BH
LJMP INTT0
ORG 001BH
LJMP INTT1
ORG 0100H
MAIN:
MOV 30H,#00H
MOV 31H,#00H     分计数
MOV 32H,#00H     秒计数
MOV 33H,#14H     50mS计数
SETB PT0
CLR PT1

MOV TMOD,#10H
MOV TL1,#00H
MOV TH1,#4CH
SETB ET1
SETB TR1
SETB EA
AJMP $

INTT1:
MOV SP,#60H
                  放到初始化
PUSH PSW
PUSH ACC
MOV TH1,#4CH      ;晶振11.0592M,50ms定时
MOV TL1,#00H
                   时间常数为4BFDH
DJNZ 33H,RETURN   
MOV 33H,#14H      ;20次计满为1s

INC 32H
MOV A,32H
CJNE A,#60,RETURN  ;判断秒钟到60s
MOV 32H,#00H       ;到60s清零

MOV A,31H
ADD A,#1
DA A
MOV 31H,A

TABTIME:   ;一分钟扫一次定时表,比较计时到否        
PUSH PSW
PUSH ACC

COMPARE:
MOV 20H,#00H
COMP1:MOV A,20H

MOV DPTR,#TABLE
MOVC A,@A+DPTR
CJNE A,30H,COMP2
INC 20H
MOV A,20H
MOVC A,@A+DPTR
CJNE A,31H,COMP3

LCALL MUSIC
AJMP COMP3

COMP2:INC 20H
COMP3:INC 20H
COMP4:MOV A,20H
CJNE A,#06H,COMP1
RETURN1:
POP ACC
POP PSW


CJNE A,#60H,RETURN
MOV 31H,#00H
MOV A,30H
ADD A,#1
DA A
MOV 30H,A
CJNE A,#24H,RETURN
MOV 30H,#00H
RETURN:
POP ACC
POP PSW
RETI

MUSIC:   ;音乐子程序,用T0中断
PUSH PSW
PUSH ACC
PUSH DPL
PUSH DPH

MAIN1:
MOV TMOD,#01H
                     在这里改变了TIMER1
SETB ET0
SETB EA
SETB TR0
START0:
SETB P1.0
MOV 40H,#00H

NEXT:
MOV A,40H
MOV DPTR,#TABLEM
MOVC A,@A+DPTR
MOV R0,A
JZ ENDD
ANL A,#0FH
MOV R7,A
MOV A,R0
SWAP A
ANL A,#0FH
JNZ SING

CLR TR0
LJMP D1
SING:

DEC A
MOV 52H,A
RL A
MOV DPTR,#TABLEF
MOVC A,@A+DPTR
MOV TH0,A
MOV 51H,A
MOV A,52H
RL A
INC A
MOVC A,@A+DPTR
MOV TL0,A
MOV 50H,A
SETB TR0
D1:
LCALL DELAY
                        延时100*30*29*2个时钟周期=174000以上*15个
INC 40H
LJMP NEXT

ENDD:
CLR TR0
LJMP EXIT 

INTT0:
PUSH PSW
PUSH ACC
MOV TL0,50H
MOV TH0,51H
CPL P1.0
POP ACC
POP PSW
RETI

DELAY:MOV R1,#100
DELAY1:MOV R2,#30 
DELAY2:MOV R3,#29
DELAY3:DJNZ R3,DELAY3 
DJNZ R2,DELAY2
DJNZ R1,DELAY1
DJNZ R7,DELAY
RET

EXIT:
POP DPH
POP DPL
POP ACC
POP PSW
RET

TABLE:DW 0002H,0003H,0015H
TABLEM:
DB 44H,54H,64H,44H
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 44H,84H,48H
DB 44H,14H,48H
DB 00H
TABLEF:
DW 64260,64400,64524,64580,64684,64777,64820,64898
DW 64968,65030,65058,65110,65157,65178,65217

END
 
可能堆栈要爆了
建议LZ先不要搞这个了,先把结构理顺好,画个流程图,从基础做起!
在计时中断中等中断(TIMER0),并且把TIMER1改成模式0

使用特权

评论回复
8
maychang| | 2007-6-3 17:11 | 只看该作者

回楼主

MOV TMOD,#01H
调用MUSIC子程序时修改了TMOD寄存器。

我看定时器0中断例程看走眼了。

使用特权

评论回复
9
maychang| | 2007-6-3 17:15 | 只看该作者

conwh 回得比我快多了,延时多少周期都计算出来了

使用特权

评论回复
10
conwh| | 2007-6-3 17:18 | 只看该作者

呵呵,看的头都大了。

使用特权

评论回复
11
yfeva| | 2007-6-3 17:26 | 只看该作者

那我再改改,谢谢大家了

使用特权

评论回复
12
gyt| | 2007-6-3 20:45 | 只看该作者

这样不行

这个程序实在太乱:)
是不是考虑把实际操作全部放到中断子程序之外

使用特权

评论回复
13
diannaoza| | 2007-6-4 03:09 | 只看该作者

在中断内标志一下。

在中断内标志一下
到主程序再运行。”我喜欢这样“
jbc;;标志位一下就ok了。
运行的程序在这

使用特权

评论回复
14
conwh| | 2007-6-4 07:41 | 只看该作者

不知道理解的对否

;************************报点时钟*************************
;要求:在2,3,15分的时候各报一次
;---------------------------------------------------------
;建立时间:6:23 2007-6-4
;修改时间:
;*********************************************************
MUSIC.OUT        EQU    !P1.0
;---------------------------------------------------------
TIMER*1*H        EQU    4BH
TIMER*1*L        EQU    0FDH        ;50mS
TIME*20*50        EQU    20        ;每20个溢出,产生1S
TIME*60*S        EQU    60        ;1分=60秒
;---------------------------------------------------------
MUSIC.FLAG        EQU    0        ;音乐响应标志
;---------------------------------------------------------
MUSIC_GUIDE        EQU    23H        ;音符指针
TIMER_50MS        EQU            ;50豪秒计数,倒计
TIMER_S            EQU            ;秒计数,倒计
TIMER_M            EQU            ;分钟为正计数
TIMER_MID_H        EQU            ;暂存
TIMER_MID_L        EQU            ;暂存
SP*VAL            EQU            ;堆栈位置
;=======================主程序==============================
MAIN-PROGRAM:
        MOV    SP,            #SP*VAL
        MOV    TMOD,            #11H
        MOV    TH1,            #TIMER*1*H
        MOV    TL1,            #TIMER*1*L
        SETB    EA
        SETB    ET0
        SETB    ET1
        SETB    TR1
        CLR    MUSIC.FLAG
        MOV    MUSIC_GUIDE,        #0
        MOV    TIMER_50M,        #TIME*20*50
        MOV    TIMER_S,        #TIME*60*S
MAIN-PROGRAM-LOOP:
        JNB    MUSIC.FLAG,        MAIN-PROGRAM-LOOP
;-----------------------------------------------------------------
;取表TABLEM,高4位-1为音乐起始地址,低4位为音乐延时的时间,当=0则关闭音乐
;           (实际这个可以直接在表中体现,但考虑同作者保持一直,所以没有改动)
;表TABLEF为音乐内容,将装载到TH0/TL0中
;-----------------------------------------------------------------
PLAY-MUSIC-HEAD:
        MOV    DPTR,            #TABLEM
        MOV    A,            MUSIC_GUIDE
        MOVC    A,            @A+DPTR
        MOV    B,            A
        ANL    A,            #0FH
        JNZ    PLAY-AGAIN
;-----------------------音乐播放结束----------------------------------
        MOV    MUSIC_GUIDE,        #0
        SETB    MUSIC.OUT
        CLR    MUSIC.FLAG
        CLR    TR0
        SJMP    MAIN-PROGRAM-LOOP
;-----------------------确定音乐拍节-----------------------------------
PLAY-AGAIN:
        MOV    R7,            A
        MOV    A,            B
        SWAP    A
        ANL    A,            #0FH
        JNZ    PLAY-SINGLE-SONG
;-----------------------音乐播放休止符---------------------------------
        CLR    TR0
        SETB    MUSIC.OUT
        LCALL    MUSIC-DELAY
        INC    MUSIC_GUIDE
        SJMP    PLAY-MUSIC-HEAD
;-----------------------提取音乐频率-----------------------------------
PLAY-SINGLE-SONG:
        MOV    DPTR,            #TABLEF
        DEC    A
        RL    A
        MOV    B,            A
        MOVC    A,            @A+DPTR
        MOV    TH0,            A
        MOV    TIMER_MID_H,        A
        MOV    A,            B
        INC    A
        MOVC    A,            @A+DPTR
        MOV    TL0,            A
        MOV    TIMER_MID_L,        A
        SETB    TR0
        LCALL    MUSIC-DELAY
        INC    MUSIC_GUIDE
        SJMP    PLAY-MUSIC-HEAD
;-----------------------音乐延时-----------------------------------------
MUSIC-DELAY:
        MOV    R1,            #100
MUSIC-DELAY-1:
        MOV     R2,            #30 
MUSIC-DELAY-2:
        MOV    R3,            #29
MUSIC-DELAY-3:
        DJNZ    R3,            MUSIC-DELAY-3 
        DJNZ    R2,            MUSIC-DELAY-2
        DJNZ    R1,            MUSIC-DELAY-1
        DJNZ    R7,            MUSIC-DELAY
        RET
;=======================时钟0,音乐输出====================================
TIMER-0-MUSIC-OUTPUT:
        MOV    TH0,            TIMER_MID_H
        MOV    TL0,            TIMER_MID_L
        CPL    MUSIC.OUT
        RETI
;=======================时钟1,计时中断====================================
TIMER-1-COUNT-TIME:
        MOV    TH1,            #TIMER*1*H
        MOV    TL1,            #TIMER*1*L
        PUSH    PSW
        PUSH    A
        DJNZ    TIMER_50MS,        TIMER-1-END
        MOV    TIMER_50MS,        #TIME*20*50
        DJNZ    TIMER_S,        TIMER-1-END
        MOV    TIMER_S,        #TIME*60*S
        MOV    A,            TIMER_M
        ADD    A,            #1
        DA    A
        MOV    TIMER_M,        A
;-----------------------判断输出条件---------------------------------------
        CJNE    A,            #2,        TIMER-1-NEXT-1
        SETB    MUSIC.FLAG
        SJMP    TIMER-1-END
TIMER-1-NEXT-1:
        CJNE    A,            #3,        TIMER-1-NEXT-2
        SETB    MUSIC.FLAG
        SJMP    TIMER-1-END
TIMER-1-NEXT-2:
        CJNE    A,            #15H,        TIMER-1-END
        SETB    MUSIC.FLAG
TIMER-1-END:
        POP    A
        POP    PSW
        RETI
;==================================================================
TABLEM:
DB 44H,54H,64H,44H
DB 44H,54H,64H,44H
DB 64H,74H,88H
DB 64H,74H,88H
DB 82H,92H,82H,72H,64H,44H
DB 82H,92H,82H,72H,64H,44H
DB 44H,84H,48H
DB 44H,14H,48H
DB 00H
TABLEF:
DW 64260,64400,64524,64580,64684,64777,64820,64898
DW 64968,65030,65058,65110,65157,65178,65217

使用特权

评论回复
15
gyt| | 2007-6-4 10:14 | 只看该作者

13楼

支持13楼的做法

使用特权

评论回复
16
HWM| | 2007-6-4 10:26 | 只看该作者

这种问题建议采用一个时基计数器

计数器采用自动载入复位,时基计数器的中断应设为最高优先级。

使用特权

评论回复
17
dengm| | 2007-6-4 11:01 | 只看该作者

T1 改为可中断自己

    TMP   DATA     20H
    HOUR  DATA     30H    ; BCD 00H TO 23H
    MIN DATA       31H    ; BCD 00H TO 59H
    SEC DATA       32H    ; BIN
    TICK_50MS DATA 33H
    STACK_BUF EQU  61H    
;=============================
    ORG 0000H
      AJMP MAIN
    ORG 000BH 
      LJMP INTT0
    ORG 001BH
      LJMP INTT1
    ORG 0100H
MAIN:
      MOV SP, #(STACK_BUF-1)

      CLR A
      MOV SEC, A  ; #00H
      MOV MIN, A  ; #00H
      MOV HOUR, A ; #00H
      MOV TICK_50MS, #20

      SETB PT0
      CLR PT1

      MOV TMOD,#10H
      MOV TL1,#00H
      MOV TH1,#4CH
      SETB ET1
      SETB TR1
      SETB EA
    AJMP $
;---------------------------------
INT_RET:
     RETI
INTT1:
  MOV TH1,#4CH      ;晶振11.0592M,50ms定时
       ;MOV TL1,#00H
  DJNZ TICK_50MS, INT_RET   
    MOV TICK_50MS,#20     ;20次计满为1s
    ACALL INT_RET
    ;---------------- 
    PUSH PSW
    PUSH ACC

    INC SEC
    MOV A, #60  ;判断秒钟到60s
    XRL A, SEC
    JNZ RETURN
      MOV SEC, A       ;到60s清零
      
      INC A   ; A = 1 
      ADD A, MIN       ; BCD INC 1
      DA A
      MOV MIN, A
      
      XRL A, #60
      JNZ TABTIME
         MOV MIN, A
         INC A  ; A= 1
         ADD A, HOUR
         DA A
         MOV HOUR, A
         XRL A, #24
         JNZ TABTIME
           MOV HOUR, A

TABTIME:   ;一分钟扫一次定时表,比较计时到否        
     PUSH DPL
     PUSH DPH
 
    MOV TMP, #(TABLE_END-TABLE)
    MOV DPTR,#TABLE
COMPARE:
    MOV A, TMP
    MOVC A,@A+DPTR
    DEC TMP
    CJNE A, MIN, COMP2

    MOV A,TMP
    MOVC A,@A+DPTR
    CJNE A, HOUR,COMP2
      AJMP COMP3
COMP2:
    DJNZ TMP, COMPARE
EXIT:
    POP DPH
    POP DPL
RETURN:
    POP ACC
    POP PSW
    RET

COMP3:
MUSIC:   ;音乐子程序,用T0中断

MAIN1:
    ORL TMOD,#01H
    SETB ET0
    SETB EA
    SETB TR0
START0:
    SETB P1.0
    MOV 40H,#00H
NEXT:
    MOV A,40H
    MOV DPTR,#TABLEM
    MOVC A,@A+DPTR
    MOV R0,A
    JZ ENDD
    ANL A,#0FH
    MOV R7,A
    MOV A,R0
    SWAP A
    ANL A,#0FH
    JNZ SING
      CLR TR0
      LJMP D1
SING:
    DEC A
    MOV 52H,A
    RL A
    MOV DPTR,#TABLEF
    MOVC A,@A+DPTR
    MOV TH0,A
    MOV 51H,A
    MOV A,52H
    RL A
    INC A
    MOVC A,@A+DPTR
    MOV TL0,A
    MOV 50H,A
    SETB TR0
D1:
    LCALL DELAY
    INC 40H
    LJMP NEXT
ENDD:
    CLR TR0
    LJMP EXIT 

INTT0:
  MOV TL0,50H
  MOV TH0,51H
  CPL P1.0
RETI

DELAY:
  DELAY:MOV R1,#100
  DELAY1:MOV R2,#30 
  DELAY2:MOV R3,#29
  DELAY3:DJNZ R3,DELAY3 
  DJNZ R2,DELAY2
  DJNZ R1,DELAY1
  DJNZ R7,DELAY
RET

TABLE:
    DW 0002H,0003H,0015H
TABLE_END:


TABLEM:
    DB 44H,54H,64H,44H
    DB 44H,54H,64H,44H
    DB 64H,74H,88H
    DB 64H,74H,88H
    DB 82H,92H,82H,72H,64H,44H
    DB 82H,92H,82H,72H,64H,44H
    DB 44H,84H,48H
    DB 44H,14H,48H
    DB 00H

TABLEF:
    DW 64260,64400,64524,64580,64684,64777,64820,64898
    DW 64968,65030,65058,65110,65157,65178,65217
END

使用特权

评论回复
18
yfeva| | 2007-6-5 01:49 | 只看该作者

谢谢大家了..哈哈..我学到不少东西!!

使用特权

评论回复
19
寒雨飞扬| | 2007-6-5 08:36 | 只看该作者

压栈太多了,有的好像根本不需要

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

10

帖子

0

粉丝