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

📄 main.asm

📁 用PWM方波调节LED亮度
💻 ASM
字号:
;*******************************************************************************
;程序名称:用PWM方波调节LED的亮度
;硬件接法:P1.1控制LED,低电平点亮
;          K3和K4分别接在P3.4、P3.5,按下时为低电平
;运行效果:按K3可调暗LED,按K4可调亮LED
;*******************************************************************************


;*******************************************************************************
;宏定义:BHS(Branch if High or Same)
;功能:单字节无符号数比较,如果大于或等于则跳转
;参数:
;	x,y:要比较的两个数
;	Label:跳转目标
;*******************************************************************************
BHS	MACRO	x, y, Label
	MOV	A, x
	CLR	C
	SUBB	A, y
	JNC	Label
	ENDM


;*******************************************************************************
;宏定义:BHI(Branch if High)
;功能:单字节无符号数比较,如果大于则跳转
;参数:
;	x,y:要比较的两个数
;	Label:跳转目标
;*******************************************************************************
BHI	MACRO	x, y, Label
	MOV	A, x
	SETB	C
	SUBB	A, y
	JNC	Label
	ENDM


;*******************************************************************************
;宏定义:BLO(Branch if Low)
;功能:单字节无符号数比较,如果小于则跳转
;参数:
;	x,y:要比较的两个数
;	Label:跳转目标
;*******************************************************************************
BLO	MACRO	x, y, Label
	MOV	A, x
	CLR	C
	SUBB	A, y
	JC	Label
	ENDM


;*******************************************************************************
;定义I/O接口
;*******************************************************************************
PWM	BIT	P1.1	;PWM输出(接LED)
K3	BIT	P3.4	;按键1,使PWM方波占空比增加(LED变暗)
K4	BIT	P3.5	;按键2,使PWM方波占空比减少(LED变亮)


;*******************************************************************************
;定义PWM最大级数
;*******************************************************************************
PWM_MAX	EQU	8


;*******************************************************************************
;定义全局变量
;*******************************************************************************
PwmValue	DATA	0x30	;PWM级数,分为0~PWM_MAX-1级
T1INTSVC_t	DATA	0x31	;T1中断服务函数用到的静态变量


;*******************************************************************************
;复位入口
;*******************************************************************************
	ORG	0x0000
	LJMP	PreMain


;*******************************************************************************
;定时器T1中断入口
;*******************************************************************************
	ORG	0x001B
	LJMP	T1INTSVC


;*******************************************************************************
;进入主程序之前的初始化
;*******************************************************************************
PreMain:
	MOV	SP, #0x31
	MOV	T1INTSVC_t, #0
	LJMP	main


;*******************************************************************************
;函数:unsigned char KeyScan()
;功能:键盘扫描
;返回:扫描到的键值
;*******************************************************************************
; 返回值 = ACC
KeyScan:
	CLR	A
	JB	K3, KeyScan_00
	MOV	A, #'+'
KeyScan_00:
	JB	K4, KeyScan_10
	MOV	A, #'-'
KeyScan_10:
	RET


;*******************************************************************************
;函数:void T1INTSVC() interrupt 3
;功能:定时器T1的中断服务函数
;*******************************************************************************
T1INTSVC:
	PUSH	ACC
	PUSH	PSW
	CLR	TR1
	MOV	TH1, #0xFF
	MOV	TL1, #0x00
	SETB	TR1
	INC	T1INTSVC_t
	BLO	T1INTSVC_t, #PWM_MAX, T1INTSVC_endif1
	MOV	T1INTSVC_t, #0
T1INTSVC_endif1:
	BHI	T1INTSVC_t, PwmValue, T1INTSVC_else2
	SETB	PWM
	SJMP	T1INTSVC_endif2
T1INTSVC_else2:
	CLR	PWM
T1INTSVC_endif2:
	POP	PSW
	POP	ACC
	RETI


;*******************************************************************************
;函数:Delay()
;功能:延时0.01~2.56s
;参数:
;	t>0时,延时(t*0.01)s
;	t=0时,延时2.56s
;说明:
;	晶振频率为11.0592MHz
;*******************************************************************************
; void Delay(unsigned char t)
; t = R7
Delay:
	MOV	TH0, #0DCH
	MOV	TL0, #00H
	SETB	TR0
	JNB	TF0, $
	CLR	TR0
	CLR	TF0
	DJNZ	R7, Delay
	RET


;*******************************************************************************
;函数:SysInit()
;功能:系统初始化
;*******************************************************************************
SysInit:
	ANL	TMOD, #0xF0
	ORL	TMOD, #0x01	;将T0设置成16位定时器
	ANL	TMOD, #0x0F
	ORL	TMOD, #0X10	;将T1设置成16为定时器
	MOV	PwmValue, #(PWM_MAX/2)	;设置PWM初值
	SETB	PWM
	MOV	TH1, #0xFF
	MOV	TL1, #0x00
	SETB	TR1
	SETB	ET1
	SETB	EA
	RET


;*******************************************************************************
;函数:void main()
;功能:主函数
;*******************************************************************************
main:
	LCALL	SysInit		;系统初始化
main_Loop1:
	MOV	R7, #5
	LCALL	Delay		;延时50ms(按键消抖动)
	LCALL	KeyScan		;扫描键盘
	JNZ	main_case1	;如果有键按下,退出循环
	SJMP	main_Loop1	;按键扫描的循环
main_case1:
	CJNE	A, #'+', main_case2
	BHS	PwmValue, #(PWM_MAX-1), main_Loop2
	INC	PwmValue
	SJMP	main_Loop2
main_case2:
	CJNE	A, #'-', main_Loop2
	MOV	A, PwmValue
	JZ	main_Loop2
	DEC	PwmValue
main_Loop2:
	MOV	R7, #5
	LCALL	Delay		;延时50ms
	LCALL	KeyScan		;按键扫描
	JZ	main_Loop1	;如果按键抬起,退出循环
	SJMP	main_Loop2


;*******************************************************************************
;程序结束
;*******************************************************************************
	END

⌨️ 快捷键说明

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