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

📄 main.asm

📁 STC片四路软件PWM+双路硬件PWM输出程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*******************************************************************************
#include <STC12_PCA_SFR.ASM>
#include <NRF24L01.ASM>
;*******************************************************************************
;24L01相关定义
TX_ADR_WIDTH		EQU	05H		;TX地址宽度,5字节
MAX_DATA_LEN		EQU	12H		;有效数据最大长度	18字节(每个数据包长度固定为18+2字节)
BUFF_LEN		EQU	MAX_DATA_LEN+2	;缓冲区长度

SELF_ADDRESS		EQU	10H		;本机地址,10H-14H,5字节
REMOTE_ADDRESS		EQU	15H		;目标地址,15H-19H,5字节
;24L01 状态标志
RF_STATUS		EQU	20H
MAX_RT			EQU	RF_STATUS.4
TX_DS			EQU	RF_STATUS.5
RX_DR			EQU	RF_STATUS.6

INT_STATUS		EQU	21H
NRF24L01_DATA_READY	EQU	INT_STATUS.0

BUFF_FREE		EQU	027H
BUFF0_FREE		EQU	BUFF_FREE.0;
BUFF1_FREE		EQU	BUFF_FREE.1;
BUFF2_FREE		EQU	BUFF_FREE.2;
BUFF3_FREE		EQU	BUFF_FREE.3;
BUFF4_FREE		EQU	BUFF_FREE.4;
BUFF5_FREE		EQU	BUFF_FREE.5;
BUFF6_FREE		EQU	BUFF_FREE.6;
BUFF7_FREE		EQU	BUFF_FREE.7;

BUFF_FULL		EQU	028H
BUFF0_FULL		EQU	BUFF_FULL.0;
BUFF1_FULL		EQU	BUFF_FULL.1;
BUFF2_FULL		EQU	BUFF_FULL.2;
BUFF3_FULL		EQU	BUFF_FULL.3;
BUFF4_FULL		EQU	BUFF_FULL.4;
BUFF5_FULL		EQU	BUFF_FULL.5;
BUFF6_FULL		EQU	BUFF_FULL.6;
BUFF7_FULL		EQU	BUFF_FULL.7;

BUFF_EMPTY		EQU	029H	;
BUFF0_EMPTY		EQU	BUFF_EMPTY.0;
BUFF1_EMPTY		EQU	BUFF_EMPTY.1;
BUFF2_EMPTY		EQU	BUFF_EMPTY.2;
BUFF3_EMPTY		EQU	BUFF_EMPTY.3;
BUFF4_EMPTY		EQU	BUFF_EMPTY.4;
BUFF5_EMPTY		EQU	BUFF_EMPTY.5;
BUFF6_EMPTY		EQU	BUFF_EMPTY.6;
BUFF7_EMPTY		EQU	BUFF_EMPTY.7;

/*
PBUFF0_W		EQU	30H	;
PBUFF1_W		EQU	31H	;
PBUFF2_W		EQU	32H	;
PBUFF3_W		EQU	33H	;
PBUFF4_W		EQU	34H	;
PBUFF5_W		EQU	35H	;
PBUFF6_W		EQU	36H	;
PBUFF7_W		EQU	37H	;
PBUFF0_R		EQU	38H	;
PBUFF1_R		EQU	39H	;
PBUFF2_R		EQU	3AH	;
PBUFF3_R		EQU	3BH	;
PBUFF4_R		EQU	3CH	;
PBUFF5_R		EQU	3DH	;
PBUFF6_R		EQU	3EH	;
PBUFF7_R		EQU	3FH	;
ACTIVE_S_S_BUFF		EQU	2CH	;ACTIVE SERIAL SEND BUF
ACTIVE_S_R_BUFF		EQU	2DH	;ACTIVE SERIAL RECEIVE BUFF
ACTIVE_N_S_BUFF		EQU	2EH	;ACTIVE NRF24L01 SEND BUFF
ACTIVE_N_R_BUFF		EQU	2FH	;ACTIVE NRF24L01 RECEIVE BUFF
*/
BUFF0_DATA_COUNT	EQU	30H
BUFF1_DATA_COUNT	EQU	31H
BUFF2_DATA_COUNT	EQU	32H
BUFF3_DATA_COUNT	EQU	33H
BUFF4_DATA_COUNT	EQU	34H
BUFF5_DATA_COUNT	EQU	35H
BUFF6_DATA_COUNT	EQU	36H
BUFF7_DATA_COUNT	EQU	37H

SOFT_PWM0_L	EQU	38H	;软件PWM0占空比低位
SOFT_PWM0_H	EQU	39H	;软件PWM0占空比高位
SOFT_PWM1_L	EQU	3AH	;软件PWM1占空比低位
SOFT_PWM1_H	EQU	3BH	;软件PWM1占空比高位
SOFT_PWM2_L	EQU	3CH	;软件PWM2占空比低位
SOFT_PWM2_H	EQU	3DH	;软件PWM2占空比高位
SOFT_PWM3_L	EQU	3EH	;软件PWM3占空比低位
SOFT_PWM3_H	EQU	3FH	;软件PWM3占空比高位

SOFT_PWM_MAX_L	EQU	40H	;软件PWM占空比最大值低位
SOFT_PWM_MAX_H	EQU	41H	;软件PWM占空比最大值高位

SOFT_PWM_FREQ_L	EQU	42H	;软件PWM周期低位
SOFT_PWM_FREQ_H	EQU	43H	;软件PWM周期高位

HARD_PWM0_L	EQU	44H	;硬件PWM0占空比
HARD_PWM0_H	EQU	45H	;硬件PWM0占空比自动重装值
HARD_PWM1_L	EQU	46H	;硬件PWM1占空比
HARD_PWM1_H	EQU	47H	;硬件PWM1占空比自动重装值

HARD_PWM_FREQ_L	EQU	48H	;硬件PWM周期低位
HARD_PWM_FREQ_H	EQU	49H	;硬件PWM周期高位

NODE_ID		EQU	4AH	;本节点ID
;PWM引脚定义
SOFT_PWM0	EQU	P1.0
SOFT_PWM1	EQU	P1.1
SOFT_PWM2	EQU	P1.2
SOFT_PWM3	EQU	P1.3
;24L01引脚定义
RF_CSN		EQU	P1.4		;24L01片选,低电平有效
RF_MOSI		EQU	P1.5		;24L01 SPI 数据输入
RF_MISO		EQU	P1.6		;24L01 SPI 数据输出
RF_SCK		EQU	P1.7		;24L01 SPI 时钟
RF_IRQ		EQU	P3.2		;24L01 中断
RF_CE		EQU	P3.7		;24L01 使能
;RF_CE		EQU	P3.4		;24L01 使能,Tiny board is 3.4

BUFF0		EQU	080H	;80H~8FH,16 BYTE,DATA RECEIFE FROM SERIAL
BUFF1		EQU	090H	;90H~9FH
BUFF2		EQU	0A0H	;A0H~AFH,16 BYTE,DATA WILL SEND TO SERIAL
BUFF3		EQU	0B0H	;B0H~BFH
BUFF4		EQU	0C0H	;C0H~CFH,16 BYTE,DATA RECEIVE FROM NRF24L01
BUFF5		EQU	0D0H	;D0H~DFH
BUFF6		EQU	0E0H	;E0H~EFH,16 BYTE,DATA WILL SEND TO NRF24L01
BUFF7		EQU	0F0H	;F0H~FFH
;*******************************************************************************
;LED DEFINE
LED1	EQU	P3.4
LED2	EQU	P3.5
;*******************************************************************************
	ORG	0000H
	AJMP	MAIN
	ORG	0003H
	AJMP	INT_0
	ORG	000BH
	AJMP	INT_TIMER0
	ORG	0023H
	AJMP	INT_SERIAL
	ORG	0040H
MAIN:	MOV	SP,#0E0H
	ACALL	INIT
;*******************************************************************************
MAIN_LOOP:
	JNB	NRF24L01_DATA_READY,FLASH_LED
	;从24L01读出16字节数据
	MOV	R0,#BUFF4
	MOV	R1,#16H
	ACALL	NRF24L01_READ_BYTES
	ACALL	TRANSACT_SERIAL_DATA
FLASH_LED:
	MOV	A,#READ_REG + TX_ADDR
	MOV	R1,#REMOTE_ADDRESS
	MOV	R0,#TX_ADR_WIDTH
	ACALL	SPI_READ_BUF			;设置发送目标地址
	CPL	LED1
	ACALL	DELAY1
	SJMP	MAIN_LOOP
;*******************************************************************************
NRF24L01_READ_BYTES:
	RET
;*******************************************************************************
TRANSACT_SERIAL_DATA:
	MOV	C,BUFF0_FULL
	JNC	TRANSACT_EXIT
	PUSH	00H
	;判断接收的数据第一字节是否为5AH
	MOV	R0,#BUFF0
	MOV	A,@R0
	CJNE	A,#5AH,CLR_BUFF0	;判断数据包头是否为5A,不是则忽略此包
	MOV	R0,#BUFF0+15
	MOV	A,@R0
	CJNE	A,#5AH,CLR_BUFF0	;判断数据包尾是否为5A,不是则忽略此包
	MOV	R0,#BUFF0+1
	MOV	A,@R0
	CJNE	A,NODE_ID,CLR_BUFF0	;判断节点ID是否为本机ID,不是则忽略此包
	MOV	R0,#BUFF0+2
	MOV	A,@R0			;取得操作命令保存在ACC
 TEST_CMD_10H:
	CJNE	A,#10H,TEST_CMD_11H
	ACALL	SET_SOFT_PWM0		;CMD=10H,WRITE SOFT PWM0
	SJMP	CLR_BUFF0
 TEST_CMD_11H:
	CJNE	A,#11H,TEST_CMD_12H
	ACALL	SET_SOFT_PWM1		;CMD=11H,WRITE SOFT PWM1
	SJMP	CLR_BUFF0
 TEST_CMD_12H:
	CJNE	A,#12H,TEST_CMD_13H
	ACALL	SET_SOFT_PWM2		;CMD=12H,WRITE SOFT PWM2
	SJMP	CLR_BUFF0
 TEST_CMD_13H:
	CJNE	A,#13H,TEST_CMD_14H
	ACALL	SET_SOFT_PWM3		;CMD=13H,WRITE SOFT PWM3
	SJMP	CLR_BUFF0
 TEST_CMD_14H:
	CJNE	A,#14H,TEST_CMD_15H
	ACALL	SET_SOFT_PWM_MAX	;CMD=14H,WRITE SOFT PWM MAX
	SJMP	CLR_BUFF0
 TEST_CMD_15H:
	CJNE	A,#15H,TEST_CMD_1FH
	ACALL	SET_SOFT_PWM_FREQ	;CMD=15H,WRITE SOFT PWM FREQ
	SJMP	CLR_BUFF0
 TEST_CMD_1FH:
	CJNE	A,#1FH,TEST_CMD_20H
	ACALL	SET_SOFT_PWM_ALL	;CMD=1FH,WRITE SOFT PWM ALL
	SJMP	CLR_BUFF0
 TEST_CMD_20H:
	CJNE	A,#20H,TEST_CMD_21H
	ACALL	SET_HARD_PWM0		;CMD=20H,WRITE HARDWARE PWM0
	SJMP	CLR_BUFF0
 TEST_CMD_21H:
	CJNE	A,#21H,TEST_CMD_22H
	ACALL	SET_HARD_PWM1		;CMD=21H,WRITE HARDWARE PWM1
	SJMP	CLR_BUFF0
 TEST_CMD_22H:
	CJNE	A,#22H,TEST_CMD_2FH
	ACALL	SET_HARD_PWM_FREQ	;CMD=2EH,WRITE HARDWARE PWM FREQ
	SJMP	CLR_BUFF0
 TEST_CMD_2FH:
	CJNE	A,#2EH,CLR_BUFF0
	ACALL	SET_HARD_PWM_ALL	;CMD=2FH,WRITE HARDWARE PWM ALL
	SJMP	CLR_BUFF0
 CLR_BUFF0:
;	MOV	R0,#BUFF0
;	MOV	R1,#10H
;;	ACALL	TX_DATAS
	CLR	BUFF0_FULL
	SETB	BUFF0_FREE
	SETB	BUFF0_EMPTY
	MOV	BUFF0_DATA_COUNT,#00H
	POP	00H
 TRANSACT_EXIT:
	RET
;*******************************************************************************
TX_DATAS:
	MOV	SBUF,@R0
	JNB	TI,$
	CLR	TI
	INC	R0
	DJNZ	R1,TX_DATAS
	RET
;*******************************************************************************
SET_SOFT_PWM0:
	MOV	R0,#BUFF0+3
	MOV	SOFT_PWM0_L,@R0
	INC	R0
	MOV	SOFT_PWM0_H,@R0
	RET
;*******************************************************************************
SET_SOFT_PWM1:
	MOV	R0,#BUFF0+5
	MOV	SOFT_PWM1_L,@R0
	INC	R0
	MOV	SOFT_PWM1_H,@R0
	RET
;*******************************************************************************
SET_SOFT_PWM2:
	MOV	R0,#BUFF0+7
	MOV	SOFT_PWM2_L,@R0
	INC	R0
	MOV	SOFT_PWM2_H,@R0
	RET
;*******************************************************************************
SET_SOFT_PWM3:
	MOV	R0,#BUFF0+9
	MOV	SOFT_PWM3_L,@R0
	INC	R0
	MOV	SOFT_PWM3_H,@R0
	RET
;*******************************************************************************
SET_SOFT_PWM_MAX:
	MOV	R0,#BUFF0+11
	MOV	SOFT_PWM_MAX_L,@R0
	INC	R0
	MOV	SOFT_PWM_MAX_H,@R0
	RET
;*******************************************************************************
SET_SOFT_PWM_FREQ:
	MOV	R0,#BUFF0+13
	MOV	SOFT_PWM_FREQ_L,@R0
	INC	R0
	MOV	SOFT_PWM_FREQ_H,@R0
	RET
;*******************************************************************************
SET_SOFT_PWM_ALL:
	MOV	R0,#BUFF0+3
	MOV	SOFT_PWM0_L,@R0
	INC	R0
	MOV	SOFT_PWM0_H,@R0
	INC	R0
	MOV	SOFT_PWM1_L,@R0
	INC	R0
	MOV	SOFT_PWM1_H,@R0
	INC	R0
	MOV	SOFT_PWM2_L,@R0
	INC	R0
	MOV	SOFT_PWM2_H,@R0
	INC	R0
	MOV	SOFT_PWM3_L,@R0
	INC	R0
	MOV	SOFT_PWM3_H,@R0
	INC	R0
	MOV	SOFT_PWM_MAX_L,@R0
	INC	R0

⌨️ 快捷键说明

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