⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text2.asm

📁 STC 51系列单片机实现PWM,由P1口输出其波形9+
💻 ASM
字号:



;STC12C5410AD 系列单片机 PCA 功能.. PWM 示例程序,使用18.432MHz 晶振。
;------------------------------------------------------------
#include <STC12_PCA_SFR.INC> ;定义 PCA 特殊功能寄存器
;------------------------------------------------------------
;定义常量
;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
AJMP main
;------------------------------------------------------------
ORG 0050H
main:
MOV SP, #0E0H
ACALL PCA_init
main_loop:
ACALL PWM
SJMP main_loop
;------------------------------------------------------------
PCA_init:
MOV CMOD, #80H; ;PCA 在空闲模式下停止 PCA 计数器工作
;PCA 时钟模式为fosc/12
;禁止 PCA 计数器溢出中断
MOV CCON, #00H ;禁止 PCA 计数器工作, 清除中断标志、计数器溢出标志
MOV CL, #00H ;清0 计数器
MOV CH, #00H
;-------------------------
;设置模块0 为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.7(第11 脚)输出
MOV CCAPM0, #42H ;*** 示例程序核心语句, ---->0100,0010
MOV PCA_PWM0, #00H ;*** 示例程序核心语句
; MOV PCA_PWM0, #03H ;释放本行注释, PWM 输出就一直是 0, 无脉冲。
;-------------------------
;设置模块1 为 8 位 PWM 输出模式, PWM 无需中断支持。脉冲在P3.5(第9 脚)输出
MOV CCAPM1, #42H ;*** 示例程序核心语句, ---->0100,0010
MOV PCA_PWM1, #00H ;*** 示例程序核心语句
;STC12C5410AD 系列单片机 PCA 功能 PWM 输出程序
;宏晶科技:www.MCU-Memory.com Mobile:13922805190(姚永平) Tel:0755-82948409 Fax: 0755-82944243
;宏晶科技:专业单片机/ 存储器供应商 www.MCU-Memory.com STC12C5410AD 系列 1T 8051 单片机中文指南85
; MOV PCA_PWM1, #03H ;释放本行注释, PWM 输出就一直是 0, 无脉冲。

SETB EPCA_LVD;开 PCA 中断
SETB EA ;开总中断
SETB CR ;将PCA 计数器打开
RET
;------------------------------------------------------------
PWM: ;用示波器进行观察较为理想。
;逐渐变亮。
MOV A, #pulse_width_MIN ;为输出脉冲宽度设置初值。
MOV pulse_width, A ;pulse_width 数字越大脉宽越窄,P3.5 的 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 ;*** 示例程序核心语句
CPL A ;用 P1 口的 LED 显示占空比,
MOV P1, A ;占空比 = ( pulse_width/256 ) * 100% 。
MOV A, pulse_width ;计算下一次输出脉冲宽度数值。
ADD A, #step
MOV pulse_width, A
ACALL delay ;在一段时间内保持输出脉冲宽度不变。
SJMP PWM_loop1
PWM_a:
;逐渐变暗。
MOV A, #pulse_width_MAX ;为输出脉冲宽度设置初值。
MOV pulse_width, A ;pulse_width 数字越大脉宽越窄,P3.5 的 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 ;*** 示例程序核心语句
CPL A ;用 P1 口的 LED 显示占空比,
;宏晶科技:www.MCU-Memory.com Mobile:13922805190(姚永平) Tel:0755-82948409 Fax: 0755-82944243
;宏晶科技:专业单片机/ 存储器供应商 www.MCU-Memory.com STC12C5410AD 系列 1T 8051 单片机中文指南86
MOV P1, A ; 占空比 = ( pulse_width/256 ) * 100% 。
MOV A, pulse_width ;计算下一次输出脉冲宽度数值。
CLR C
SUBB A, #step
MOV pulse_width, A
ACALL delay ;在一段时间内保持输出脉冲宽度不变。
SJMP 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 + -