?? ex7-6.asm
字號:
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2寄存器定義文件
;定義常量
;pulse_width_MAX = pulse_width_MIN 時, 輸出脈沖寬度不變。
pulse_width_MAX EQU 0F0H ;PWM 脈寬最大值, 占空比 = 93.75%
pulse_width_MIN EQU 10H ;PWM 脈寬最小值, 占空比 = 6.25%
step EQU 38H ;PWM 脈寬變化步長
;定義變量
pulse_width EQU 30H
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP, #70H
MOV CMOD, #80H ;PCA 在空閑模式下停止 PCA 計數器工作
;PCA 時鐘模式為fOSC/12,禁止 PCA 計數器溢出中斷
MOV CCON, #00H ;禁止PCA計數器工作,清除中斷標志、計數器溢出標志
MOV CL, #00H ;清0計數器
MOV CH, #00H
;設置模塊0為8位PWM輸出模式,脈沖在P1.3引腳輸出
MOV CCAPM0, #42H
MOV PCA_PWM0, #00H
; MOV PCA_PWM0, #03H ;釋放本行注釋, PWM 輸出就一直是 0, 無脈沖。
SETB CR ;將PCA 計數器打開
MAIN_LOOP:
LCALL PWMOUT
LJMP MAIN_LOOP
;------------------------------------------------------------
PWMOUT: ;可以使用示波器觀察P1.3的波形
;如果P1.3連接一個LED,則連接到P1.3的LED逐漸變亮
MOV A, #pulse_width_MIN ;為輸出脈沖寬度設置初值
MOV pulse_width, A ;pulse_width數字越大脈寬越窄,LED越亮
PWM_LOOP1:
MOV A, pulse_width ;判是否到達最大值
CLR C
SUBB A, #pulse_width_MAX
JNC PWM_A ;到達最大值就轉到逐漸變暗
MOV A, pulse_width ;設置脈沖寬度。數字越大,脈寬越窄,LED越亮
MOV CCAP0H, A ;核心語句
MOV CCAP1H, A ;核心語句
MOV A, pulse_width ;計算下一次輸出脈沖寬度數值
ADD A, #step
MOV pulse_width, A
LCALL DELAY ;在一段時間內保持輸出脈沖寬度不變
LJMP PWM_LOOP1
PWM_A:
;如果P1.3連接一個LED,連接到P1.3的LED逐漸變暗
MOV A, #pulse_width_MAX ;為輸出脈沖寬度設置初值
MOV pulse_width, A ;pulse_width 數字越大脈寬越窄,LED越亮
PWM_LOOP2:
MOV A, pulse_width ;判是否到達最小值
CLR C
SUBB A, #pulse_width_MIN
JC PWM_B ;到達最小值就返回。
JZ PWM_B ;到達最小值就返回。
MOV A, pulse_width ;設置脈沖寬度。數字越大、脈寬越窄,LED 越亮
MOV CCAP0H, A ;核心語句
MOV CCAP1H, A ;核心語句
MOV A, pulse_width ;計算下一次輸出脈沖寬度數值
CLR C
SUBB A, #step
MOV pulse_width, A
LCALL DELAY ;在一段時間內保持輸出脈沖寬度不變
LJMP PWM_LOOP2
PWM_B:
RET
DELAY: ;延時子程序
CLR A
MOV R1, A
MOV R2, A
MOV R3, #80H
DELAY_LOOP:
NOP
NOP
NOP
DJNZ R1, DELAY_LOOP
DJNZ R2, DELAY_LOOP
DJNZ R3, DELAY_LOOP
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -