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
  • HI.

    i no people will complain bout my style but here is code with my comments

    
    ;===================================================
    ;
    ; 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
    
    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
    

    in yo're c do this

    extern void DoNote ( int Cycles, char delay );
    
    
    void DoNote ( void ) { DoNote ( }

    so there is a donation more than others.

    Always yo're freind.

    Zeusti.

Reply
  • HI.

    i no people will complain bout my style but here is code with my comments

    
    ;===================================================
    ;
    ; 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
    
    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
    

    in yo're c do this

    extern void DoNote ( int Cycles, char delay );
    
    
    void DoNote ( void ) { DoNote ( }

    so there is a donation more than others.

    Always yo're freind.

    Zeusti.

Children