鸡肉怎么炒才嫩:用STC12C5410单片机内置PWM模块产生可调频率的PWM信号-自己创作_yu5315...

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 11:57:34
用STC12C5410单片机内置PWM模块产生可调频率的PWM信号-自己创作2007年09月02日 星期日 下午 02:25

;定义 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模式,并且还对整个系统时钟进行分频.