;定義 STC12C2052 系列 MCU 特殊功能寄存器
IPH EQU 0B7H ;中斷優(yōu)先級高位寄存器
EPCA_LVD EQU IE.6 ;PCA/LVD 中斷允許位。
;要打開 PCA 中斷還要打開相應的 ECF,ECCF0,ECCF1 位
;要打開 LVD 中斷還要打開相應的 ELVDI 位
CH EQU 0xF9 ;PCA 計數(shù)器高8位。
CL EQU 0xE9 ;PCA 計數(shù)器低8位。
;------------------------
CCON EQU 0D8H ;PCA 控制寄存器。
CCF0 EQU CCON.0 ;PCA 模塊0 中斷標志, 由硬件置位, 必須由軟件清0。
CCF1 EQU CCON.1 ;PCA 模塊1 中斷標志, 由硬件置位, 必須由軟件清0。
CR EQU CCON.6 ;1:允許 PCA 計數(shù)器計數(shù), 必須由軟件清0。
CF EQU CCON.7 ;PCA計數(shù)器溢出標志,由硬件或軟件置位,必須由軟件清0。
;------------------------
CMOD EQU 0D9H ;PCA 工作模式寄存器。
;CMOD.7 CIDL: idle 狀態(tài)時 PCA 計數(shù)器是否繼續(xù)計數(shù), 0: 繼續(xù)計數(shù), 1: 停止計數(shù)。
;CMOD.2 CPS1: PCA 計數(shù)器脈沖源選擇位 1。
;CMOD.1 CPS0: PCA 計數(shù)器脈沖源選擇位 0。
; CPS1 CPS0
; 0 0 內部時鐘, fosc/12。
; 0 1 內部時鐘, fosc/2。
; 1 0 Timer0 溢出。
; 1 1 由 ECI/P3.4 腳輸入的外部時鐘。
;CMOD.0 ECF: PCA計數(shù)器溢出中斷允許位, 1--允許 CF(CCON.7) 產生中斷。
;------------------------
CCAP0H EQU 0FAH ;PCA 模塊0的捕捉/比較寄存器高 8 位。
CCAP1H EQU 0FBH ;PCA 模塊1的捕捉/比較寄存器高 8 位。
CCAP2H EQU 0FCH ;PCA 模塊2的捕捉/比較寄存器高 8 位。
CCAP3H EQU 0FDH ;PCA 模塊3的捕捉/比較寄存器高 8 位。
CCAP0L EQU 0EAH ;PCA 模塊0的捕捉/比較寄存器低 8 位。
CCAP1L EQU 0EBH ;PCA 模塊1的捕捉/比較寄存器低 8 位。
CCAP2L EQU 0ECH
CCAP3L EQU 0EDH
;------------------------
PCA_PWM0 EQU 0F2H ;PCA 模塊0 PWM 寄存器。
PCA_PWM1 EQU 0F3H ;PCA 模塊1 PWM 寄存器。
PCA_PWM2 EQU 0F4H
PCA_PWM3 EQU 0F5H
;PCA_PWMn: 7 6 5 4 3 2 1 0
; - - - - - - EPCnH EPCnL
;B7-B2: 保留
;B1(EPCnH): 在 PWM 模式下,與 CCAPnH 組成 9 位數(shù)。
;B0(EPCnL): 在 PWM 模式下,與 CCAPnL 組成 9 位數(shù)。
;------------------------
CCAPM0 EQU 0DAH ;PCA 模塊0的工作模式寄存器。
CCAPM1 EQU 0DBH ;PCA 模塊1的工作模式寄存器。
CCAPM2 EQU 0DCH
CCAPM3 EQU 0DDH
;CCAPMn: 7 6 5 4 3 2 1 0
; - ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
;
;ECOMn = 1:允許比較功能。
;CAPPn = 1:允許上升沿觸發(fā)捕捉功能。
;CAPNn = 1:允許下降沿觸發(fā)捕捉功能。
;MATn = 1:當匹配情況發(fā)生時, 允許 CCON 中的 CCFn 置位。
;TOGn = 1:當匹配情況發(fā)生時, CEXn 將翻轉。
;PWMn = 1:將 CEXn 設置為 PWM 輸出。
;ECCFn = 1:允許 CCON 中的 CCFn 觸發(fā)中斷。
;ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
; 0 0 0 0 0 0 0 0x00 未啟用任何功能。
; x 1 0 0 0 0 x 0x21 16位CEXn上升沿觸發(fā)捕捉功能。
; x 0 1 0 0 0 x 0x11 16位CEXn下降沿觸發(fā)捕捉功能。
; x 1 1 0 0 0 x 0x31 16位CEXn邊沿(上、下沿)觸發(fā)捕捉功能。
; 1 0 0 1 0 0 x 0x49 16位軟件定時器。
; 1 0 0 1 1 0 x 0x4d 16位高速脈沖輸出。
; 1 0 0 0 0 1 0 0x42 8位 PWM。
AUXR EQU 8EH //1T模式 特殊寄存器。
CLK_DIV EQU 0C7H //時鐘分頻寄存器
TIMER0_RELOAD_1 EQU 2AH
PWM_PULSE_WIDTH EQU 0ECH 設置占空比
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP,#40H
ACALL PCA_INITIATE
ACALL TIMER0_INITIATE
ACALL SET_F //對系統(tǒng)時鐘進行分頻。進行2分頻
MAIN_LOOP:
MOV TH0,#TIMER0_RELOAD_1
MOV TL0,#TIMER0_RELOAD_1
MOV A,#PWM_PULSE_WIDTH
MOV CCAP0H,A
ACALL DELAY
SJMP $
PCA_INITIATE:
MOV CMOD,#1000100B
MOV CCON,#00H
MOV CL,#00H
MOV CH,#00H
MOV CCAPM0,#42H
MOV PCA_PWM0,#00H
MOV CCAP0H,#PWM_PULSE_WIDTH
SETB CR
RET
TIMER0_INITIATE:
MOV TMOD,#02H
MOV AUXR,#80H //將T0設置成1T模式
MOV TH0,#TIMER0_RELOAD_1
MOV TL0,#TIMER0_RELOAD_1
SETB TR0
RET
SET_F:
MOV CLK_DIV,#00000001B //對內部時鐘進行2分頻
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
總結: 我用12C5410單片機內置的PWM模塊產生可調頻率的PWM信號,這里主要是運用了定時器0的溢出率來改變信號的周期.
這段程序的表現(xiàn)是:產生周期為20ms占空比為0.075的信號,也就是信號里的高電平寬度是1.5ms,低電平寬度是18.5ms.我將T0設置為1T模式,并且還對整個系統(tǒng)時鐘進行分頻.