This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

C51:how to write asm code for PWM speaker?

i am a noob and learning 8051 coding.
i want to know how can i use PWM to write a speaker which can emit diff sound (do,re,mi,etc.) by using 2 pins only.
thanks.

Parents
  • Zeusti,

    I'll make no comments about your comments, but I noticed a little error in your code:

    ;===================================================
    ;
    ; Name       : DoNote
    ;
    ; Purpose    : Produce a sound on P1.0
    ;
    ; Parameters : int           Cycles (R6:R7)
    ;              unsigned char Delay  (R5)
    ;
    ; Result     : void
    ;
    ;===================================================
    
    
    ?PR?DoNote?sound segment code
    
              rseg ?PR?DoNote?sound
    
    DoNote:
    
              clr   a            ; Get 0-'Cycles'
              clr   c            ; Bcoz code uses up counter
              subb  a,r7         ; And store to dptr
              mov   dpl,a
              clr   a
              subb  a,r6
              mov   dph,a
    
    ;          mov   dpl,a    <<< I think this should not be here
    
    Dn_1:     cpl   p1.0         ; Toggle the port pin
    
              mov   a,r5         ; Get 'Delay'
              mov   r2,a         ; Loop for 'Delay'
              djnz  R2,$
    
              inc   dptr         ; Update cycle counter
              mov   a,dpl        ; While count is not overflowed
              or    a,dph
              jnz   Dn_1         ; Loop
    
              ret
    

Reply
  • Zeusti,

    I'll make no comments about your comments, but I noticed a little error in your code:

    ;===================================================
    ;
    ; Name       : DoNote
    ;
    ; Purpose    : Produce a sound on P1.0
    ;
    ; Parameters : int           Cycles (R6:R7)
    ;              unsigned char Delay  (R5)
    ;
    ; Result     : void
    ;
    ;===================================================
    
    
    ?PR?DoNote?sound segment code
    
              rseg ?PR?DoNote?sound
    
    DoNote:
    
              clr   a            ; Get 0-'Cycles'
              clr   c            ; Bcoz code uses up counter
              subb  a,r7         ; And store to dptr
              mov   dpl,a
              clr   a
              subb  a,r6
              mov   dph,a
    
    ;          mov   dpl,a    <<< I think this should not be here
    
    Dn_1:     cpl   p1.0         ; Toggle the port pin
    
              mov   a,r5         ; Get 'Delay'
              mov   r2,a         ; Loop for 'Delay'
              djnz  R2,$
    
              inc   dptr         ; Update cycle counter
              mov   a,dpl        ; While count is not overflowed
              or    a,dph
              jnz   Dn_1         ; Loop
    
              ret
    

Children