(汇编)用proteus仿真做单片机的追光系统,现遇到了关于用ADC0832进行AD转换汇编代码太长,导致步进电机不能很好的转动的问题

请大家帮忙看下,我的程序和仿真有什么问题以及可以改进的地方,谢谢了

这个是仿真原理图

img

代码如下,主要问题就是由于我写的AD转换汇编代码太长,导致我无法减小定时器0的定时时间,导致定时器0的中断程序控制下的步进电机无法实现正常转动,就是反转的时候只能反转零点几度,然后就又正转了。晶振是12MHz的,步进电机准备使用28BYJ-48。


   org   0000h
      jmp   MAIN
      ORG    000BH
      LJMP    QU


      org   0030h
MAIN:MOV        TMOD,#22H
     MOV         TH0,#038H
     MOV         TL0,#038H
     MOV        TH1,#0ECH
     MOV        TL1,#0ECH
     SETB        ET0
     SETB        EA
     SETB        TR1
     SETB        TR0
ACT:MOV        A,#00H
     CLR        C
     MOV        R0,#8
     SETB        TR0
     CLR        P1.0
     SETB        P1.1
     SETB        P1.2
     JNB        TF1,$
     CLR        P1.1
     JNB        TF1,$
     SETB        P1.1
     JNB        TF1,$
     CLR        P1.1
     CLR        P1.2
     JNB        TF1,$
     SETB        P1.1
     JNB        TF1,$
     CLR        P1.1
     SETB        P1.2
QU1: JNB        TF1,$
     SETB        P1.1
     MOV        C,P1.3
     RLC        A
     JNB        TF1,$
     CLR        P1.1
     DJNZ        R0,QU1
     SETB        P1.0
     CLR        TR1
     MOV        R1,A
     MOV        A,#00H
     MOV        R0,#8
     MOV        R5,#3
     SETB        TR1
     CLR        P1.0
     SETB        P1.1
     SETB        P1.2
QU2: JNB        TF1,$
         CLR        P1.1
     JNB        TF1,$
     SETB        P1.1
     DJNZ        R5,QU2
QU3: SETB        P1.1
         MOV        C,P1.3
     RLC        A
     JNB        TF1,$
     CLR        P1.1
     DJNZ        R0,QU3
     SETB        P1.0
     CLR        TR1
     MOV        R2,A
     MOV        P2,R2
     MOV        P3,R1
     MOV        B,R1
     MOV        A,R2
     CLR        C;1
     SUBB        A,B;1
     JZ            TON;2
     JNC        BIG;2
     JC            SAM;2
     MOV        R3,#2
TON: MOV        R3,#0;1
    JNB            TF0,$
     LCALL        ACT    ;2
BIG:     MOV        R3,#1;1
     JNB        TF0,$
     LCALL        ACT    ;2
SAM:MOV        R3,#2;1
     JNB        TF0,$
     LCALL        ACT    ;2



     

QU:   MOV        A,#00H
     MOV        R0,#00H
          CJNE        R3,#1,BBB                
          MOV         DPTR,#STEP1                    
          SJMP         CCC            
BBB:  CJNE        R3,#2,EEE
       MOV         DPTR,#STEP2           
CCC:  MOVC         A,@A+DPTR                
          MOV         P0,A                    
      INC        A
          INC         R0                            
          CJNE         R0,#8,CCC            
          CLR          A                             
     RETI                 
EEE:  CJNE        R3,#0,RETURN
     JB            P1.4,$
RETURN:RETI
    
    
STEP1:  DB  01H,03H,02H,06H,04H,0CH,08H,09H 

STEP2:  DB  09H,08H,0CH,04H,06H,02H,03H,01H

不是汇编代码太长,
整个主代码问题比较多
1:MAIN 没有初始化栈,就不能调用子程序和中断
2:ACT 不是子程序入口,该代码没有 RET ,就不能用 LCALL 调用。比如你的代码中的 80,83,86 这 3 行代码执行会出错。
3:中断程序没有保护中断用到的寄存器。会使主程序出现混乱。
你的代码偶尔能执行是巧合,能正常多执行一段时间是侥幸。中断间隔短会更容易出错。