?? 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 ;關(guān)定時器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 ;關(guān)閉外部中斷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
;*******************************************************************************
;清零內(nèi)存,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;設(shè)置下次定時時間(一般固定為20ms)
MOV DPTR,#00H ;初始化DPTR
SETB SOFT_PWM0 ;初始化SOFT_PWM口, 起始狀態(tài)均為高電平
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低位相同,不同則進入下個循環(huán)
CJNE A,SOFT_PWM3_L,TLOOP
MOV A,DPH ;判斷R1是否同SOFT_PWM3高位相同,不同則進入下個循環(huán)
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操作函數(shù)
#include <NRF24L01_FUNCTIONS.ASM>
END
;*******************************************************************************
;PC-STC通訊協(xié)議
;每個數(shù)據(jù)包最多16字節(jié)
;00H:包頭,固定為5AH(PC->STC),A5H(STC->PC)
;01H:節(jié)點ID
;02H:操作指令
;03H-0EH:附加數(shù)據(jù)(最長12字節(jié))
;0FH:包尾,固定為5AH(PC->STC),A5H(STC->PC)
;操作指令以及數(shù)據(jù)結(jié)構(gòu)
;指令 說明 附加數(shù)據(jù) 應(yīng)答 應(yīng)答格式
;00H 點名指令 無 是 同指令
;01H 發(fā)送數(shù)據(jù)至NRF 數(shù)據(jù) 是 同指令,無數(shù)據(jù)
;02H 發(fā)送命令至NRF 第一字節(jié)為命令 是 同指令,無數(shù)據(jù)
; 其余字節(jié)為數(shù)據(jù) 是 同指令,無數(shù)據(jù)
;03H 讀數(shù)據(jù)從NRF 第一字節(jié)為命令 是 同指令,無數(shù)據(jù)
; 其余字節(jié)為數(shù)據(jù) 是 同指令,無數(shù)據(jù)
;04H 設(shè)置PWM參數(shù)
;5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5A
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -