SOGO論壇

標題: 求用8051產生頻率為1kHZ的PWM訊號(組語) [列印本頁]

作者: a23118010    時間: 2012-5-15 19:24:52     標題: 求用8051產生頻率為1kHZ的PWM訊號(組語)

求用8051程式產生頻率為1kHz(OSC=12MHz)的PWM訊號(組語),工作時間為25%>50%>75%的PWM訊號,謝謝
作者: 又靜    時間: 2012-5-16 22:24:05

本帖最後由 又靜 於 2012-5-16 22:57 編輯

您好,
不知道您要如何控制工作時間,所以只寫25%的工作時間,
但,您只要修改第四行的數值,就可以得到您要的工作時間。
  1. PWM:        REG        P0
  2.         ORG        0

  3.         MOV        R3,#25
  4.         MOV        A,#100
  5.         SUBB        A,R3
  6.         MOV        R4,A


  7. START:
  8.         SETB        P0,0
  9.         MOV        R5,#4
  10. HI:
  11.         DJNZ        R5,$
  12.         DJNZ        R3,HI

  13.         CLR        P0,0
  14.         MOV        R5,#4
  15. LO:
  16.         DJNZ        R5,$
  17.         DJNZ        R4,LO
  18.         JMP        START

  19.         END
複製代碼

作者: a23118010    時間: 2012-5-17 18:04:57

本帖最後由 a23118010 於 2012-5-18 10:48 編輯
又靜 發表於 2012-5-16 22:24  
您好,
不知道您要如何控制工作時間,所以只寫25%的工作時間,
但,您只要修改第四行的數值,就可以得到您 ...


不好意思,妳給的程式電腦說11.17行有錯,可請問一下我下面寫的這可行嗎,有錯嗎?因我用LED試沒變,想利用按P1.0開關做控制              
           ORG           0000H                        
        AJMP        LOOP
NEXT:        MOV        R3,#3
        ACALL        DELAY3
        JNB        P1.0,LOOP
        MOV        A,R5
        INC        A
        INC        A
        INC        A
        INC        A
        INC        A
        MOV        R5,A
        MOV        A,R4              
        DEC        A
        DEC        A
        DEC        A
        DEC        A
        DEC        A
        MOV        R4,A
LOOP:        JNB        P1.0,NEXT
        MOV        R1,#00000001B
        MOV        P2,R1
        MOV        R5,#5
        ACALL        DELAY
        MOV        R1,#11111110B
        MOV        P2,R1
        MOV        R4,#15
        ACALL        DELAY1
                AJMP        LOOP


DELAY:        MOV        R6,#4
LED01:        MOV        R7,#50
LED02:        DJNZ        R7,LED02                  
        DJNZ        R6,LED01                  
        DJNZ        R5,DELAY
        RET

DELAY1:        MOV        R6,#4
LED03:        MOV        R7,#50
LED04:        DJNZ        R7,LED04                  
        DJNZ        R6,LED03                  
        DJNZ        R4,DELAY1
        RET

DELAY3:        MOV        R6,#40
LED05:        MOV        R7,#249
LED06:        DJNZ        R7,LED06                  
        DJNZ        R6,LED05                  
        DJNZ        R3,DELAY3
        RET
作者: 又靜    時間: 2012-5-17 18:41:24

a23118010 發表於 2012-5-17 18:04  
不好意思,妳給的程式電腦說11.17行有錯,可請問一下我下面寫的這可行嗎,有錯嗎?因我用LED試沒變,想利用按P ...

抱歉,
請您把11跟17行的P0,0 改成 P0.0  再試看看

另外,第四行的數值只能是 1~99 的範圍

作者: alphi    時間: 2012-5-17 18:42:04

a23118010 發表於 2012-5-17 18:04  
不好意思,妳給的程式電腦說11.17行有錯,可請問一下我下面寫的這可行嗎,有錯嗎?因我用LED試沒變,想利用按P ...

版主給的有些語法是錯的,我修改如下可以讓他編譯過
  1. ;IC: ATMEL AT89C51
  2. ;Compiler: Keil A51
  3. ;設定P0.0(P0第一隻腳為輸出)
  4. PWM:
  5.                
  6.         ORG        0

  7.         MOV        R3,#50
  8.         MOV        A,#100
  9.         SUBB        A,R3
  10.         MOV        R4,A


  11. START:
  12.         SETB        P0.0
  13.         MOV        R5,#4
  14. HI:
  15.         DJNZ        R5,$
  16.         DJNZ        R3,HI

  17.         CLR        P0.0
  18.         MOV        R5,#4
  19. LO:
  20.         DJNZ        R5,$
  21.         DJNZ        R4,LO
  22.         JMP        START

  23.         END
複製代碼
另外模擬結果如下圖.看起來是duty : 50%,頻率也非1KHz.因對8051組語不熟.所以只能幫到此為止



附件: pwm.png (2012-5-17 18:41:58, 136.77 KB) / 下載次數 15
https://oursogo.com/forum.php?mod=attachment&aid=MjE3Mzc0N3xmZWM3ZmIzMXwxNzUzMDU5MjgzfDB8MA%3D%3D
作者: 又靜    時間: 2012-5-17 19:45:44

a23118010 發表於 2012-5-17 18:04  
不好意思,妳給的程式電腦說11.17行有錯,可請問一下我下面寫的這可行嗎,有錯嗎?因我用LED試沒變,想利用按P ...


剛剛看了一下您的程式,您是想用 P1.0 的開關做控制,在NEXT迴圈裡改變暫存器R5、R4,來改變工作時間
但是,在您的LOOP迴圈裡,又把暫存器R5、R4寫入一個固定值,所以,您的LED才不會變,問題應該是出在那裡

作者: 又靜    時間: 2012-5-17 19:57:25

alphi 發表於 2012-5-17 18:42  
版主給的有些語法是錯的,我修改如下可以讓他編譯過另外模擬結果如下圖.看起來是duty : 50%,頻率也非1KHz. ...

alphi 大師您好  
小妹只是粗淺提供程式的流程,至於每一個指令所耗費的指令週期並沒有仔細去計算

作者: a23118010    時間: 2012-5-17 20:06:25

又靜 發表於 2012-5-17 19:45  
剛剛看了一下您的程式,您是想用 P1.0 的開關做控制,在NEXT迴圈裡改變暫存器R5、R4,來改變工作時間
但 ...

謝謝,但是我LED還是沒變==
作者: 又靜    時間: 2012-5-18 11:47:13

a23118010 發表於 2012-5-17 20:06  
謝謝,但是我LED還是沒變==

您好,

關於您的程式...

一、您是用開關ON/OFF做控制工作時間,剛剛算了一下您的延遲時間只有0.06秒,
當開關 ON → OFF→ ON 可能重複觸發很多次

二、R4暫存器是計算低電位的工作時間,每執行NEXT迴圈,其值減5,所以不該把R4設為0


作者: a23118010    時間: 2012-5-18 12:08:22

本帖最後由 a23118010 於 2012-5-18 12:10 編輯
又靜 發表於 2012-5-18 11:47  
您好,

關於您的程式...


  這樣程式呢?雖然還是沒有動作==  ,謝謝           
           ORG        0000H   
        MOV        R5,#5
        MOV        R4,#15                    
NEXT:        JB        P1.0,LOOP
NEXT2:        MOV        R3,#1
        ACALL        DELAY3
        JB        P1.0,NEXT2
WAIT1:        JNB        P1.0,WAIT1  
        MOV        A,R5
        INC        A
        INC        A
        INC        A
        INC        A
        INC        A
        MOV        R5,A
        MOV        A,R4              
        DEC        A
        DEC        A
        DEC        A
        DEC        A
        DEC        A
        MOV        R4,A
LOOP:        MOV        P2,#01H
        ACALL        DELAY
        MOV        P2,#00H
        ACALL        DELAY1
                AJMP        NEXT


DELAY:        MOV        R6,#4
LED01:        MOV        R7,#50
LED02:        DJNZ        R7,LED02                  
        DJNZ        R6,LED01                  ;2μ*5(50+50*4)=0.0025
        DJNZ        R5,DELAY
        RET

DELAY1:        MOV        R6,#4
LED03:        MOV        R7,#50
LED04:        DJNZ        R7,LED04                  
        DJNZ        R6,LED03                  
        DJNZ        R4,DELAY1
        RET

DELAY3:        MOV        R6,#40
LED05:        MOV        R7,#249
LED06:        DJNZ        R7,LED06                  
        DJNZ        R6,LED05                  ;2μ*1(249+249*40)+3=0.02
        DJNZ        R3,DELAY3
        RET

作者: 又靜    時間: 2012-5-18 18:43:04

本帖最後由 又靜 於 2012-5-18 23:43 編輯
a23118010 發表於 2012-5-18 12:08  
這樣程式呢?雖然還是沒有動作==  ,謝謝           
           ORG        0000H   
        MOV        R5,#5


您好,
試看看這個.....
  1.         ORG        0
  2. PWM:
  3.         MOV        R3,#5
  4.         MOV        R4,#15

  5. NEXT:   JNB        P1.0,NEXT
  6.         INC        R3
  7.         INC        R3
  8.         INC        R3
  9.         INC        R3
  10.         INC        R3
  11.         DEC        R4
  12.         DEC        R4
  13.         DEC        R4
  14.         DEC        R4
  15.         DEC        R4
  16.         MOV        R5,#200
  17.         CALL       DELAY
  18.         CJNE       R3,#20,START
  19.         JMP        PWM
  20. START:
  21.         SETB       P2.0
  22.         MOV        A,R3
  23.         MOV        R5,A
  24.         CALL       DELAY
  25.         CLR        P2.0
  26.         MOV        A,R4
  27.         MOV        R5,A
  28.         CALL       DELAY
  29.         JB         P1.0,START
  30.         JMP        NEXT
  31.         
  32. DELAY:  MOV        R6,#250
  33.         DJNZ       R6,$
  34.         DJNZ       R5,DELAY
  35.         RET
複製代碼

作者: kazima    時間: 2012-5-18 19:48:34

                        ORG    00H
START:
                        MOV      P3,#FFH
                        MOV      P2,#FFH
                        JNB        P3.1,LED1
                        JNB        P3.2,LED2
                        JNB        P3.3,LED3
                        JNB        P3.4,LED4
                        JMP        START
LED1:
                        MOV      P2,#00H
                        ACALL  DELAY1
                        MOV      P2,#FFH
                        ACALL  DELAY     
                        JNB        P3.1,LED1
                        JMP        START
DELAY1:
                        MOV      R6,#20
S1:
                        MOV      R7,#25
                        DJNZ      R7,$
                        DJNZ      R6,S1
                        RET
LED2:
                        MOV      P2,#00H
                        ACALL  DELAY2
                        MOV      P2,#FFH
                        ACALL  DELAY
                        JNB        P3.2,LED2
                        JMP        START
DELAY2:
                        MOV      R6,#20
S2:
                        MOV      R7,#5
                        DJNZ      R7,$
                        DJNZ      R6,S2
                        RET
LED3:
                        MOV      P2,#00H
                        ACALL  DELAY3
                        MOV      P2,#FFH
                        ACALL  DELAY
                        JNB        P3.3,LED3
                        JMP        START
DELAY3:
                        MOV      R6,#10
S3:
                        MOV      R7,#4
                        DJNZ      R7,$
                        DJNZ      R6,S3
                        RET
LED4:
                        MOV       P2,#00H
                        ACALL   DELAY4
                        MOV       P2,#FFH
                        ACALL   DELAY
                        JNB         P3.4,LED4
                        JMP         START
DELAY4:
                        MOV      R6,#10
S4:
                        MOV      R7,#1
                        DJNZ      R7,$
                        DJNZ      R6,S4
                        RET
DELAY:
                        MOV      R6,#20
S:
                        MOV      R7,#25
                        DJNZ      R7,$
                        DJNZ      R6,S
                        RET

                        END


  以上是我之前寫的,確定可以用,用的是比較笨的方法,一目瞭然。

  用P3.1~P3.4做控制,也就是有四段不同佔空比,頻率會變動,主要是因為高電位持續時間不變,只變動低電位時間所致。

  如果要更改頻率和佔空比,直接修改各個延遲副程式中的R6或R5的值就可

作者: loni3    時間: 2012-5-27 09:21:59

NEXT2:        MOV        R3,#1
        ACALL        DELAY3
        JB        P1.0,NEXT2                  
WAIT1:        JNB        P1.0,WAIT1    2  p1.0=0  jumb wait1
        MOV        A,R5
你這裡好像是在做無窮迴圈ㄅ  太久沒寫了  感覺你程式是這裡出問題  給你參考用拉  小弟真的是太久沒寫了    pwm成是你要記得去算執行時間跟你的石英震盪器有關係




歡迎光臨 SOGO論壇 (https://oursogo.com/) Powered by OURSOGO.COM