鸡肉怎么炒才嫩:用STC12C5410单片机内置PWM模块产生可调频率的PWM信号-自己创作_yu5315...
来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 11:57:34
;定义 STC12C2052 系列 MCU 特殊功能寄存器
IPH EQU 0B7H ;中断优先级高位寄存器
EPCA_LVD EQU IE.6 ;PCA/LVD 中断允许位。
;要打开 PCA 中断还要打开相应的 ECF,ECCF0,ECCF1 位
;要打开 LVD 中断还要打开相应的 ELVDI 位
CH EQU 0xF9 ;PCA 计数器高8位。
CL EQU 0xE9 ;PCA 计数器低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 计数器计数, 必须由软件清0。
CF EQU CCON.7 ;PCA计数器溢出标志,由硬件或软件置位,必须由软件清0。
;------------------------
CMOD EQU 0D9H ;PCA 工作模式寄存器。
;CMOD.7 CIDL: idle 状态时 PCA 计数器是否继续计数, 0: 继续计数, 1: 停止计数。
;CMOD.2 CPS1: PCA 计数器脉冲源选择位 1。
;CMOD.1 CPS0: PCA 计数器脉冲源选择位 0。
; CPS1 CPS0
; 0 0 内部时钟, fosc/12。
; 0 1 内部时钟, fosc/2。
; 1 0 Timer0 溢出。
; 1 1 由 ECI/P3.4 脚输入的外部时钟。
;CMOD.0 ECF: PCA计数器溢出中断允许位, 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 位数。
;B0(EPCnL): 在 PWM 模式下,与 CCAPnL 组成 9 位数。
;------------------------
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:允许上升沿触发捕捉功能。
;CAPNn = 1:允许下降沿触发捕捉功能。
;MATn = 1:当匹配情况发生时, 允许 CCON 中的 CCFn 置位。
;TOGn = 1:当匹配情况发生时, CEXn 将翻转。
;PWMn = 1:将 CEXn 设置为 PWM 输出。
;ECCFn = 1:允许 CCON 中的 CCFn 触发中断。
;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上升沿触发捕捉功能。
; x 0 1 0 0 0 x 0x11 16位CEXn下降沿触发捕捉功能。
; x 1 1 0 0 0 x 0x31 16位CEXn边沿(上、下沿)触发捕捉功能。
; 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 //对系统时钟进行分频。进行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的溢出率来改变信号的周期.
这段程序的表现是:产生周期为20ms占空比为0.075的信号,也就是信号里的高电平宽度是1.5ms,低电平宽度是18.5ms.我将T0设置为1T模式,并且还对整个系统时钟进行分频.