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

📄 main.asm

📁 STC片四路软件PWM+双路硬件PWM输出程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	MOV	SOFT_PWM_MAX_H,@R0
	RET
;*******************************************************************************
SET_HARD_PWM0:
	MOV	R0,#BUFF0+3
	MOV	HARD_PWM0_L,@R0
	INC	R0
	MOV	HARD_PWM0_H,@R0
	RET
;*******************************************************************************
SET_HARD_PWM1:
	MOV	R0,#BUFF0+5
	MOV	HARD_PWM1_L,@R0
	INC	R0
	MOV	HARD_PWM1_H,@R0
	RET
;*******************************************************************************
SET_HARD_PWM_FREQ:
	MOV	R0,#BUFF0+7
	MOV	HARD_PWM_FREQ_L,@R0
	INC	R0
	MOV	HARD_PWM_FREQ_H,@R0
	RET
;*******************************************************************************
SET_HARD_PWM_ALL:
	MOV	R0,#BUFF0+3
	MOV	HARD_PWM0_L,@R0
	INC	R0
	MOV	HARD_PWM0_H,@R0
	INC	R0
	MOV	HARD_PWM1_L,@R0
	INC	R0
	MOV	HARD_PWM1_H,@R0
	INC	R0
	MOV	HARD_PWM_FREQ_L,@R0
	INC	R0
	MOV	HARD_PWM_FREQ_H,@R0
	RET
;*******************************************************************************
INIT:	CLR	EA
	ACALL	INIT_MEMORY
	ACALL	INIT_TIMER
	ACALL	INIT_24L01
	ACALL	INIT_PCA
	SETB	EA
;	IO
	CLR	RF_CE
	SETB	RF_CSN
	CLR	RF_SCK
	RET
;*******************************************************************************
INIT_TIMER:
	;Timer 1 for serial
	MOV	TMOD,#21H
;	22.1184M,9600BPS,倍增为19200
;	MOV	TL1,#0FAH
;	MOV	TH1,#0FAH

;	22.1184M,19200BPS,倍增为38400
;	MOV	TL1,#0FDH
;	MOV	TH1,#0FDH

;	22.1184M,28800BPS,倍增为57600
	MOV	TL1,#0FEH
	MOV	TH1,#0FEH

	MOV	SCON,#50H
	MOV	PCON,#80H	;波特率翻倍
	SETB	TR1
	CLR	ET1		;关定时器1中断
	SETB	ES		;打开串口中断

	;Timer 0 for 20ms PWM output
	MOV	TL0,#00H
	MOV	TH0,#70H
	SETB	TR0
	SETB	ET0		;开定时器0中断
;	CLR	ET0

	SETB	EX0		;打开外部中断0
	CLR	EX1		;关闭外部中断1
	RET
;*******************************************************************************
INIT_MEMORY:
	;CLEAR DATA POINT
	MOV	R0,#30H
	MOV	R1,#10H
	ACALL	ZERO_MEMORY
	;CLEAR BUFFS
	MOV	R0,#80H
	MOV	R1,#80H
	ACALL	ZERO_MEMORY
	MOV	NODE_ID,#00H

	;INIT STATUS BYTE
	MOV	STATUS,#00H

	;SOFT PWM的周期控制量
	;7006H:20ms
	MOV	SOFT_PWM_FREQ_L,#06H
	MOV	SOFT_PWM_FREQ_H,#70H

	;SOFT PWM的最大占空比控制量
	;0900H:2ms
	;5000H:19.5ms
	MOV	SOFT_PWM_MAX_L,#00H
	MOV	SOFT_PWM_MAX_H,#09H

	;SOFT PWM的占空比控制量
	;0000h:0.00125ms
	;07D0H:2ms
	MOV	SOFT_PWM0_L,#0D8H
	MOV	SOFT_PWM0_H,#007H
	MOV	SOFT_PWM1_L,#0D8H
	MOV	SOFT_PWM1_H,#007H
	MOV	SOFT_PWM2_L,#0D8H
	MOV	SOFT_PWM2_H,#007H
	MOV	SOFT_PWM3_L,#0D8H
	MOV	SOFT_PWM3_H,#007H

	RET
;*******************************************************************************
;清零内存,R0:起始地址,R1:长度
;R0:MEMORY START ADDRESS
;R1:LENGTH
ZERO_MEMORY:
	DEC	R1
	MOV	@R0,#00H
	INC	R0
	DJNZ	R1,ZERO_MEMORY
	RET
;*******************************************************************************
INIT_PCA:
	MOV	CMOD,#10000000B	;CF(CCON.7)=1,ENABLE PCA COUNT INT
				;CPS1=0,CPS2=0,fosc/12
	MOV	CCON,#00H
	MOV	CCAPM0,#42H	;ECOM=1,PWM=1
	MOV	CCAPM1,#42H

	MOV	CL,#00H		;
	MOV	CH,#0B8H		;fosc=11.0592M,fosc/12T/256/50Hz=72=48H,100H-48H=B8H
	MOV	PCA_PWM0,#80H	
	MOV	PCA_PWM1,#80H

	SETB	EPCA_LVD	;ENABLE PCA INT
	SETB	EA
	SETB	CR
	RET
;*******************************************************************************
;串口中断处理
INT_SERIAL:
	JNB	TI,SKIP_TI
	CLR	TI
	RETI
 SKIP_TI:
	CLR	REN
	ACALL	SAVE_SERIAL_DATA
	SETB	REN
	RETI
;*******************************************************************************
SAVE_SERIAL_DATA:	
	PUSH	ACC
	PUSH	00H
	MOV	A,BUFF0_DATA_COUNT
	CJNE	A,#10H,DATA_NOT_FULL
	SETB	BUFF0_FULL
	SJMP	EXIT_SAVE_SERIAL_DATA
 DATA_NOT_FULL:
	ADD	A,#BUFF0
	MOV	R0,A
	MOV	A,SBUF
	MOV	@R0,A
	CLR	BUFF0_EMPTY
	SETB	BUFF_FREE
	INC	BUFF0_DATA_COUNT
	MOV	A,BUFF0_DATA_COUNT
	CJNE	A,#10H,EXIT_SAVE_SERIAL_DATA
	SETB	BUFF0_FULL
 EXIT_SAVE_SERIAL_DATA:
	CLR	RI
	POP	00H
	POP	ACC
	RET
;*******************************************************************************
;处理中断
INT_0:	SETB	NRF24L01_DATA_READY
	RETI
;*******************************************************************************
;定时器0中断
INT_TIMER0:
;	CLR	EA
	;TIMER0 20ms VALUE:7006H
	MOV	TL0,SOFT_PWM_FREQ_L
	MOV	TH0,SOFT_PWM_FREQ_H;设置下次定时时间(一般固定为20ms)
	MOV	DPTR,#00H	;初始化DPTR
	SETB	SOFT_PWM0	;初始化SOFT_PWM口,	起始状态均为高电平
	SETB	SOFT_PWM1
	SETB	SOFT_PWM2
	SETB	SOFT_PWM3

	PUSH	ACC
 TEST_SOFT_PWM0_L:
	MOV	A,DPL		;判断R0是否同SOFT_PWM0低位相同,不同则去判断SOFT_PWM1低位
	CJNE	A,SOFT_PWM0_L,TEST_SOFT_PWM1_L
	MOV	A,DPH		;判断R1是否同SOFT_PWM0高位相同,不同则去判断SOFT_PWM1低位
	CJNE	A,SOFT_PWM0_H,TEST_SOFT_PWM1_L
	CLR	SOFT_PWM0	;全部相同,SOFT_PWM0脚输出0
 TEST_SOFT_PWM1_L:
	MOV	A,DPL		;判断R0是否同SOFT_PWM1低位相同,不同则去判断SOFT_PWM2低位
	CJNE	A,SOFT_PWM1_L,TEST_SOFT_PWM2_L
	MOV	A,DPH		;判断R1是否同SOFT_PWM1高位相同,不同则去判断SOFT_PWM2低位
	CJNE	A,SOFT_PWM1_H,TEST_SOFT_PWM2_L
	CLR	SOFT_PWM1	;全部相同,SOFT_PWM1脚输出0
 TEST_SOFT_PWM2_L:
	MOV	A,DPL		;判断R0是否同SOFT_PWM2低位相同,不同则去判断SOFT_PWM3低位
	CJNE	A,SOFT_PWM2_L,TEST_SOFT_PWM3_L
	MOV	A,DPH		;判断R1是否同SOFT_PWM2高位相同,不同则去判断SOFT_PWM3低位
	CJNE	A,SOFT_PWM2_H,TEST_SOFT_PWM3_L
	CLR	SOFT_PWM2	;全部相同,SOFT_PWM1脚输出0
 TEST_SOFT_PWM3_L:
	MOV	A,DPL		;判断R0是否同SOFT_PWM3低位相同,不同则进入下个循环
	CJNE	A,SOFT_PWM3_L,TLOOP
	MOV	A,DPH		;判断R1是否同SOFT_PWM3高位相同,不同则进入下个循环
	CJNE	A,SOFT_PWM3_H,TLOOP
	CLR	SOFT_PWM3	;全部相同,SOFT_PWM1脚输出0
 TLOOP:	MOV	C,RI
	JNC	TLOOP_DPTR
	ACALL	SAVE_SERIAL_DATA
	ACALL	TRANSACT_SERIAL_DATA
	CPL	LED2
 TLOOP_DPTR:
	INC	DPTR		;步进DPTR
	;占空比范围
	;2800H:0~2ms
	;5000H:0~19.5ms
	MOV	A,DPL		;判断DPTR低位
	CJNE	A,SOFT_PWM_MAX_L,TEST_SOFT_PWM0_L
	MOV	A,DPH		;判断DPTR高位
	CJNE	A,SOFT_PWM_MAX_H,TEST_SOFT_PWM0_L
	POP	ACC
;	SETB	EA
	RETI
;*******************************************************************************
/*
DELAY:	CLR	A
	MOV	R1,A
	MOV	R2,A
	MOV	R3,#080H
 DELAY_LOOP:
	NOP
	NOP
	NOP
	DJNZ	R1,DELAY_LOOP
	DJNZ	R2,DELAY_LOOP
	DJNZ	R3,DELAY_LOOP
	RET
*/
;*******************************************************************************
DELAY1:	PUSH	00H
	PUSH	01H
	PUSH	02H

	MOV	R2,#02FH
 DELAY_R2:
	MOV	R1,#01FH
 DELAY_R1:
	MOV	R0,#0FFH
 DELAY_R0:
	NOP
	DJNZ	R0,DELAY_R0
	DJNZ	R1,DELAY_R1
	DJNZ	R2,DELAY_R2

	POP	02H
	POP	01H
	POP	00H
	RET
;*******************************************************************************
;NRF24L01操作函数
#include <NRF24L01_FUNCTIONS.ASM>
END

;*******************************************************************************
;PC-STC通讯协议
;每个数据包最多16字节
;00H:包头,固定为5AH(PC->STC),A5H(STC->PC)
;01H:节点ID
;02H:操作指令
;03H-0EH:附加数据(最长12字节)
;0FH:包尾,固定为5AH(PC->STC),A5H(STC->PC)

;操作指令以及数据结构
;指令	说明		附加数据	应答	应答格式
;00H	点名指令	无		是	同指令
;01H	发送数据至NRF	数据		是	同指令,无数据
;02H	发送命令至NRF	第一字节为命令	是	同指令,无数据
;			其余字节为数据	是	同指令,无数据
;03H	读数据从NRF	第一字节为命令	是	同指令,无数据
;			其余字节为数据	是	同指令,无数据
;04H	设置PWM参数	


;5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5A

⌨️ 快捷键说明

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