⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 120240 .asm

📁 1、 由于后级采样电子电路将正弦波整形为方波
💻 ASM
字号:
;该程序是为了得到相移为120,240的,占空比为50%的方波.我们将信号接到INTO上,当信号下降沿来的时候,就产生int0中断,我们用T0来计数,转下行
; 因为要相移120 ,所以要延时T/3,延时之后,翻转P1.4口,再之后赋T/2,这个是在T1中断中产生.
;当产生120相移之后,我们将P1.4产生的波形再传输给int1,即连接P1.4口和int1.再通过T2中断再次相移120,即可得到240的相移波形.
        et2 equ ie.5    ;编译环境没有定义T2定时/计数器,在这里定义
        pt2 equ ip.5
        TL2 EQU 0CCH
        TH2 EQU 0CDH
        T2CON EQU 0C8H
        T2MOD EQU 0C9H
        tr2  EQU  t2con.2
        tf2  equ  t2con.7
       org 0000h
       sjmp main
       org 0003h
       ajmp intt0
       org 000bh
       ajmp tt0
       org 0013h
       ajmp intt1
       org 001bh
       ajmp tt1
       org 002bh
       ajmp tt2
       org 0030h
main:  mov 20h,#00h            ;清零20H的单元,这些单元用作标志位。
       mov 43h,#00h
       mov 44h,#00h
       mov 47h,#00h
       mov 48h,#00h
       setb p1.5              ;P1.5输出120 的波形,先设定为高电平。
       setb p1.4              ;P1.4输出240 的波形,先设定为高电平。
       mov sp, #70h
       mov tmod,#11h           ;T1,T0定义为16计数
       mov t2con,#00h
       MOV DPL,#00H            ;清DPTR,DPTR主要用于当定时器0计满65536之后,在定时器0中断中INC DPTR的
       MOV DPH,#00H
       mov th0,#00h
       mov tl0,#00h
       mov th1,#00h
       mov tl1,#00h
       mov th2,#00h
       mov tl2,#00h
       setb it0              ;int0下降沿有效
       setb it1               ;int1下降沿有效
       setb ex0               ;开中断源
       setb ex1
       setb et0
       setb et1
       setb et2
        setb pt1              ;设定优先级
        setb pt2
        ;setb tr1
        ;setb tr2
        ;setb px0
       setb ea                ;开总中断源。


 HERE: JNB 04H, RELA          ;主循环
      CLR 04H
      ACALL DIVII
      mov a, 40h        ;40存放低位
      cpl a
      mov 43h, a        ;tl1=t/2 43h    取反设定初值
      mov a, 41h         ;次高位放在41H中, 最高位放在 42H中    最高位加一是为了用到DJNZ 的时候。 42h+1=51h=60H=38H
      cpl a
      mov 44h, a        ;th1=t/2 44h  ,取反

     mov a, 34h
      cpl a
      mov 47h, a        ;tl1=t/3 47h
      mov a, 35h                       ;最高位是 36h+1=49h
      cpl a                                                   ;最高位加一是为了用到DJNZ 的时候。 36h+1=49h=61H=37H
      mov 48h, a        ;th1=t/3 48h

RELA: sjmp HERE

TT0:  clr tr0
       inc dptr          ;DPTR主要用于当定时器0计满65536之后,在定时器0中断中INC DPTR的
       setb tr0
       reti


tt1:  clr tr1
      
      jb 02h,relyidong        ;为了先延时T/3所要设定的标志位
      ;;;;;;;;;;;;;;;;;;;;
      ;新加的一句
      mov 51h, 60h
      djnz 49h, reltt11        ;最高位36H+1=49h
      mov 49h,61h
       clr p1.4
        setb 02h
       mov tl1,43h              ;送入T/2初值
       mov th1,44h
       setb tr1
       reti
relyidong:
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;
     
      djnz 51h,reltt11     ;T/3延时完了之后再延时T/2
      setb p1.4
       mov 51h, 60h
       mov th1, 44h
       mov tl1, 43h
       setb tr1
       reti
 reltt11: mov tl1,#00h
          mov th1,#00h
          setb tr1               ;47H,48H里存放的T/3的值放在中断int0中进行.
          reti

tt2:   clr tf2                    ;定时器2 同定时器1完全一样,
      clr tr2
      jb 03h,relyidongggg
      mov 38h, 60h
      djnz 37h, reltt1111
      mov 37h,61h
       setb 03h
       clr p1.5
       mov tl2,43h
       mov th2,44h
       setb tr2
       reti
relyidongggg: djnz 38h,reltt1111
       setb p1.5
       mov 38h, 60h
       mov th2, 44h
       mov tl2, 43h
       setb tr2
       reti
 reltt1111: mov tl2,#00h
          mov th2,#00h
          setb tr2
          reti


intt1: clr tr2             ;上面介绍了将P1.5引脚产生的波形用于连接int1,还是下降沿中断.延时T/3 ,就相当于240度了
      clr 03h              ;中断int0开始,每当有信号发生中断了的时候,就把47H,48H里的数据传给TL2,TH2。
       mov tl2, 47h           ;47H,48H存放的是T/3的余量,即除去DPTR之后的剩余的数。
       mov th2,48h
       setb tr2
       reti

intt0: clr tr1        ;中断int0开始,每当有信号发生中断了的时候,就把47H,48H里的数据传给TL1,TH1。
       clr 02h          ;47H,48H存放的是T/3的余量,即除去DPTR之后的剩余的数。
       mov tl1,47h
       mov th1,48h
       setb tr1

       jb 00h, rel     ;第一次中断时开T0计数
       setb tr0
       setb 00h
       reti
  rel: clr tr0         ;第二次中断关T0
       clr 00h
       setb 04h        ; 设置标志位04H用于控制主循环
       push acc
       push psw
       jb 06h, relgaijin      ;这个是为第一次存储数据而设定的。以后就都为1,然后将第二次,第三次......的数据跟上一次比较,如果之差大于某一值,就重新取代原值。
       setb 06h
        MOV 30H, TL0
        MOV 31H, TH0
        MOV 32H, DPL
        MOV 33H,DPH     ;存储数据在33H,32H,31H, 30H,由于相移要求频率最小是5HZ,所以我在后面的除法33H省略了。
        ajmp texture
 relgaijin:
             mov 52h,tL0   ; 这个是第二次存储的值,跟上一次进行比较。
             mov 53h,th0
             mov 54h,dpl
             mov 55h,dph
             clr c
             mov a, 55h       ;最高位进行比较
             cjne a,33h,relaa
             sjmp relbb
        relaa: jc relcc
               sjmp reldd
          relbb: mov a, 54h    ; 2位进行比较
                 cjne a, 32h,relee
                 sjmp relff
          relee: jc relcc
                 sjmp reldd
           relff: mov a, 53h     ;第三位进行比较
                 cjne a, 31h,relgg
                 sjmp relhh
            relgg:jc relcc
                  sjmp reldd
             relhh:mov a, 52h    ;第四位进行比较
                  cjne a, 30h,reljj
                  clr 04h         ;如果相等,就不用重新计算,直接输出元波形
                  ajmp texture
             reljj: jc relcc
                    sjmp reldd
          relcc: clr c             ; 如果第二次的值小于第一次的值,就比较
                 mov a,30h
                 subb a, 52h
                 mov 56h, a
                 mov a, 31h
                 subb a, 53h
                 mov 57h, a
                 mov a, 32h
                 subb a, 54h
                 mov 58h, a
                 mov a, 33h
                 subb a, 55h
                 mov 59h, a
                 jnz relkk
                 mov a, 58h
                 jnz relkk
                 mov a, 57h
                 jnz relkk
                 mov a, 56h
                 clr c
                 subb a, #20
                 jnc relkk
                 clr 04h          ;如果它们俩之间的差值小于20,就清04,不改变波形所设定的TL,TH值。如果大于则取代,转向relkk
                 ajmp texture
          reldd: mov a, 52h          ; 如果第二次的值大于第一次的值,就比较
                 subb a, 30h
                 mov 56h, a
                 mov a, 53h
                 subb a, 31h
                 mov 57h, a
                 mov a, 54h
                 subb a, 32h
                 mov 58h, a
                 mov a, 55h
                 subb a, 33h
                 mov 59h, a
                 jnz relkk
                 mov a, 58h
                 jnz relkk
                 mov a, 57h
                 jnz relkk
                 mov a, 56h
                 clr c
                 subb a, #20
                 jnc relkk
                 clr 04h             ;如果它们俩之间的差值小于20,就清04,不改变波形所设定的TL,TH值。如果大于则取代,转向texture.
                ajmp texture
       relkk: mov 33h,55h
              mov 32h,54h
              mov 31h,53h
              mov 30h,52h
texture:
        MOV TH0,#00H
        MOV TL0,#00H
        MOV DPL,#00H
        MOV DPH,#00H
        pop psw
        pop acc
        RETI

DIVII: CLR C          ;T/2 ,数据存储在42H,41H,40H
       MOV A, 32H
       RRC A
       MOV 42H, A
       MOV A, 31H
       RRC A
       MOV 41H, A
       MOV A, 30H
       RRC A
       MOV 40H, A  ;42h+1 ------51h
       mov a, 42h
       inc a
       mov 51h, a       ;38H=60h=51h
       mov 38h, a
       mov 60h, a
       MOV R4,#03H     ;除以3,得到T/3  ,数据存储在36H,35H,34H
       MOV R7, 31H
       MOV R6, 30H
       MOV R3, 32H
       CLR A
       MOV R5, A
       MOV R1,#24
DIV1: CLR C
      MOV A, R6
      RLC A
      MOV R6, A
      MOV A, R7
      RLC A
      MOV R7, A
      MOV A, R3
      RLC A
      MOV R3,A
      MOV A, R5
      RLC A
      MOV R5, A
      SUBB A, R4
      JC  NEXT1
      INC R6
      MOV R5, A
NEXT1: DJNZ R1,DIV1
       MOV A, R5
       JB ACC.7, ADD1
       CLR C
       MOV A, R5
       RLC A
       MOV R5, A
       SUBB A, R4
       JC NEXT2
 ADD1: MOV A, R6
       ADD A, #01H
       MOV R6, A
       MOV A, R7
       ADDC A, #00H
       MOV R7, A
       MOV A,R3
       ADDC A,#00H
       MOV R3,A
NEXT2: MOV A, R6
       MOV 34H, A
       MOV A, R7
       MOV 35H, A
       MOV A, R3
       MOV 36H,A
       inc a
       mov 49h, a        ;36h+1 -------49h
       mov 37h, a
        mov 61h,a  ;61h=49h
         RET
	end
















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -