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

📄 ex7-8.asm

📁 《增强型8051单片机实用开发技术》例程代码
💻 ASM
字号:
$INCLUDE (STC12C5A.INC)   ;包含STC12C5A60S2寄存器定义文件
CH1_5MS_H    EQU 03H     ;PCA模块1 5ms定时常数高位 
CH1_5MS_L    EQU 00H     ;PCA模块1 5ms定时常数低位
T0_1         EQU 0F6H    ;T0重装数值1 
T0_2         EQU 0ECH    ;T0重装数值2
PWM_WIDTH    EQU 0FFH    ;数字越大脉宽越窄,占空比越小 
PWM_PULSE_WIDTH  EQU 0FFH  ;数字越大脉宽越窄(占空比越小)
COUNTER      EQU 30H     ;声明一个计数器,用来计数中断的次数 
LED_5MS      EQU P1.6    ;5毫秒指示灯
LED_1S       EQU P1.5    ;1秒钟指示灯
		ORG   0000H
		LJMP  MAIN
		ORG   003BH                 ;PCA中断入口地址
		LJMP  PCA_ISR
		ORG   0060H 
MAIN:
		MOV    SP, #70H           ;设置堆栈指针
		MOV    COUNTER, #100     ;设置COUNTER计数器初值
		;初始化PCA模块
		MOV   CMOD, #10000100B  ;PCA 在空闲模式下停止 PCA 计数器工作 
		                 		;PCA时钟源为定时器0的溢出,禁止PCA计数器溢出时中断
		MOV    CCON, #00H       ;清0 PCA计数器溢出中断请求标志位CF
		          				;CR = 0, 不允许 PCA 计数器计数,清0 PCA各模块中断请求标志位CCFn
		MOV   CL, #00H          ;清0 PCA 计数器
		MOV   CH, #00H 
		;设置模块0为 8 位 PWM 输出模式, PWM无需中断支持。脉冲在P1.3引脚输出
		MOV   CCAPM0, #42H       ;设置模块0为8位PWM输出模式 
		MOV   PCA_PWM0, #00H     ;清0 PWM 模式下的第9位
		MOV   CCAP0H, #PWM_PULSE_WIDTH ;设置脉冲宽度
		;设置 PCA 模块1
		MOV   CCAP1L, #CH1_5mS_L ;给PCA模块1的CCAP1L置初值
		MOV   CCAP1H, #CH1_5mS_H ;给PCA模块1的CCAP1H置初值
		MOV   CCAPM1, #49H        ;设置PCA模块1为16位软件定时器
		;ECCF1=1, 允许PCA模块1中断
		;当[CH,CL]=[CCAP1H,CCAP1L]时,产生中断请求,CCF1=1,请求中断
		SETB  EA                   ;开整个单片机所有中断共享的总中断控制位
		SETB  CR                   ;启动PCA计数器[CH,CL]计数
		;初始化T0, 其溢出脉冲作PCA计数器(CH,CL)的时钟源 
		MOV    TMOD, #02H          ;设置定时器0 为自动重装工作模式
		MOV    TH0, #T0_1
		MOV    TL0, #T0_1
		SETB   TR0                  ;启动定时器0
MAIN_LOOP:
		MOV    TH0, #T0_1           ;T0溢出率时间常数
		MOV    TL0, #T0_1
		MOV    A, #PWM_WIDTH        ;装入脉冲宽度
		MOV    CCAP0H, A
		LCALL DELAY
		;T0溢出率变低后定时器脉冲的LED闪烁速度变慢, 而PWM的LED亮度未改变
		MOV    TH0, #T0_2          ;修改T0溢出率时间常数
		MOV    TL0, #T0_2
		LCALL DELAY
		;P1.3的LED较亮
		MOV    TH0, #T0_1          ;T0 溢出率高
		MOV    TL0, #T0_1
		MOV    A, #PWM_WIDTH
		LCALL RL_A                  ;改变 PWM 占空比
		LCALL RL_A
		MOV    CCAP0H, A            ;数字越大,PWM占空比越小,P3.5的LED越亮
		LCALL DELAY
		;T0溢出率变低后定时器脉冲的LED闪烁速度变慢, 而PWM的LED亮度未改变
		MOV    TH0, #T0_2         	;T0溢出率低
		MOV    TL0, #T0_2
		LCALL DELAY
		MOV    CCAP0H, A         	;数字越大,PWM占空比越小,P3.5的LED越亮
		LCALL DELAY
		;连接P1.3的LED暗
		MOV    TH0, #T0_1        	;T0 溢出率高
		MOV    TL0, #T0_1
		MOV    A, #PWM_WIDTH
		LCALL RL_A                	;改变 PWM 占空比
		LCALL RL_A
		LCALL RL_A
		LCALL RL_A
		;T0溢出率变低后,定时器脉冲的LED闪烁速度变慢, 而PWM的LED亮度未改变
		MOV    TH0, #T0_2        	;T0 溢出率低 
		MOV    TL0, #T0_2
		LCALL DELAY
		LJMP   MAIN_LOOP         	;循环 
RL_A:                          		;循环右移子程序
	    CLR    C
	    RRC    A
	    RET 
PCA_ISR:                       		;PCA中断服务程序
		PUSH   ACC
		PUSH   PSW
		CPL    LED_5MS    			;PCA模块1每5ms中断一次,每次进中断将该灯状态取反
		MOV    A, #CH1_5MS_L     	;给[CCAP1H,CCAP1L] 增加一个数值
		ADD    A, CCAP1L
		MOV    CCAP1L, A
		MOV    A, #CH1_5MS_H
		ADDC   A, CCAP1H
		MOV    CCAP1H, A
		CLR    CCF1                	;清PCA模块1中断标志
		DJNZ   COUNTER,PCA_EXIT 	;检测是否中断了100 次(0.5秒)
		MOV    COUNTER,#100
		CPL    LED_1S             	;在LED_1S输出脉冲宽度为 0.5 秒钟的方

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -