📄 main.asm
字号:
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 + -