;<<<<<<<<<<程序说明>>>>>>>>>>
;RFM12B接收程序v 1.3
;Coder: 幻风
;
;<<<<<<<<<<引脚定义>>>>>>>>>>
;SDI:Data input of the serial control interface (SPI compatible)
;SCK:Clock input of the serial control interface
;nSEL:Chip select input of the serial control interface (active low)
;SDO:Serial data output with bus hold
;nIRQ:Interrupt request output (active low)
SDI EQU P1.6
SDO EQU P1.5
SCK EQU P1.7
nSEL EQU P1.4
nIRQ EQU P3.2
;Delay time
Delay_H equ 50H
Delay_L equ 51H
;<<<<<<<<<<初始化命令定义>>>>>>>>>>
CONFIG_SET DATA 80D7H
POWER_MANAGEMENT DATA 82D9H
FREQUENCY_SET DATA 0A640H
DATA_RATE DATA 0C647H
RECEIVER_CONTROL DATA 94A0H
DATA_FILTER DATA 0C2ACH
FIFO_AND_RESET DATA 0CA81H
SYNCHRON_PATTERN DATA 0CED4H
AFC DATA 0C483H
TRANSMIT_SET_CTRL DATA 9850H
PLL_SET DATA 0CC17H
WAKE_UP_TIMER DATA 0E000H
LOW_DUTY_CYCLE DATA 0C800H
LOW_BD_MCD DATA 0C040H
RF_REAET_REGISTER DATA 0000H
RF_RECEIVER_OVER DATA 8201H
;<<<<<<<<<<接收器若干命令>>>>>>>>>>
RF_RECEIVER_OPEN DATA 82D9H
RF_FIFO_EN DATA 0CA83H
RF_FIFO_DISEN DATA 0CA81H
;数据输出引脚
D3 EQU p3.7
D2 EQU p3.4
D1 EQU p3.3
D0 EQU p3.1
;<<<<<<<<<<主程序开始>>>>>>>>>>>>>
ORG 00H
AJMP MAIN
;##########
;函数名称:
;功能:(1)
;接口:
;修改日志:
;##########
ORG 30H
MAIN:
LCALL RF12_PORT_INIT
LCALL RF12_INIT
WHILE:
MOV DPTR,#FIFO_AND_RESET ;INIT FIFO
LCALL RF12_SET_CMD
LCALL RF12_RECEIV
AJMP WHILE
SJMP $
;##########
;函数名称:RF12_PORT_INIT
;功能:设置处理器各端口的初始电平
;接口:无
;修改日志:
;#########
RF12_PORT_INIT:
SETB nSEL
CLR SCK
SETB SDI
SETB SDO
RET
;##########
;函数名称:RF12_SET_CMD
;功能:为RF12B发送命令
;接口:命令必须先存于DPTR中
;修改日志:
;##########
RF12_SET_CMD:
;MOV DPTR,#CONFIG_SET;#80D7H
CLR C
CLR nSEL
NOP
NOP
CLR SCK
NOP
NOP
MOV R0,#08H
MOV A,DPH
SET_HIGH:
CLR SCK
NOP
NOP
NOP
NOP
NOP
MOV C,SDO ;
NOP
NOP
RLC A ;
MOV SDI,C
SETB SCK
NOP
NOP
DJNZ R0,SET_HIGH
MOV R0,#08H ;LOW 8 BYTE
MOV DPH,A
MOV A,DPL
SET_LOW:
CLR SCK
NOP
NOP
NOP
NOP
NOP
MOV C,SDO
NOP
NOP
RLC A
MOV SDI,C
SETB SCK
NOP
NOP
DJNZ R0,SET_LOW
MOV DPL,A
CLR SCK
NOP
NOP
SETB nSEL
NOP
NOP
RET;
;##########
;函数名称:RF12_INIT
;功能:RF12B接收器设置
;接口:无
;修改日志:
;##########
RF12_INIT:
CLR SCK
CLR nSEL
NOP
MOV DPTR,#CONFIG_SET
LCALL RF12_SET_CMD
MOV DPTR,#POWER_MANAGEMENT
LCALL RF12_SET_CMD
MOV DPTR,#FREQUENCY_SET
LCALL RF12_SET_CMD
MOV DPTR,#DATA_RATE
LCALL RF12_SET_CMD
MOV DPTR,#RECEIVER_CONTROL
LCALL RF12_SET_CMD
MOV DPTR,#DATA_FILTER
LCALL RF12_SET_CMD
MOV DPTR,#FIFO_AND_RESET
LCALL RF12_SET_CMD
MOV DPTR,#SYNCHRON_PATTERN
LCALL RF12_SET_CMD
MOV DPTR,#AFC
LCALL RF12_SET_CMD
MOV DPTR,#TRANSMIT_SET_CTRL
LCALL RF12_SET_CMD
MOV DPTR,#PLL_SET
LCALL RF12_SET_CMD
MOV DPTR,#WAKE_UP_TIMER
LCALL RF12_SET_CMD
MOV DPTR,#LOW_DUTY_CYCLE
LCALL RF12_SET_CMD
MOV DPTR,#LOW_BD_MCD
LCALL RF12_SET_CMD
RET
;##########
;函数名称:RF12_RECEIV
;功能:接收数据中断服务程序
;接口:无
;##########
RF12_RECEIV:
;准备接收数据
MOV DPTR,#RF_FIFO_EN ;Enable FIFO,0CA83H
LCALL RF12_SET_CMD
MOV DPTR,#RF_RECEIVER_OPEN ;82D9H
LCALL RF12_SET_CMD
;接收数据,1byte*16
MOV R5,#10H
REC_LOOP:
LCALL RF12_RECEIV_aByte
LCALL DELAY_200ms
LCALL DATA_SAVE
DJNZ R5,REC_LOOP
MOV DPTR,#RF_FIFO_DISEN ;Disable FIFO,0CA81H
LCALL RF12_SET_CMD
LCALL DELAY_200ms
RET
;##########
;函数名称:RF12_RECEIV_aByte
;功能:接受RF12B传来的一个字节
;接口:将接收的数据存于DPL
;##########
RF12_RECEIV_aByte: ;接受字节
JB nIRQ,$
;读寄存器状态
MOV DPTR,#RF_REAET_REGISTER
LCALL RF12_SET_CMD
;发送读数据命令并将读到的数据放在DPL中
MOV DPTR,#0B000H
LCALL RF12_SET_CMD
;;;;;;;;;;;;;;;;;;;;;;;;;;DATA OUT
RET
;把收到的数据输出
DATA_SAVE:
clr D0
clr D1
clr D2
clr D3
nop
nop
nop
nop
MOV A,DPL
RRC A
MOV D0,C
RRC A
MOV D1,C
RRC A
MOV D2,C
RRC A
MOV D3,C
nop
nop
nop
nop
clr D0
clr D1
clr D2
clr D3
RET
;************Delay program begin****************************
DELAY_10us:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
DELAY_20us:
LCALL DELAY_10us
LCALL DELAY_10us
RET
DELAY_40us:
LCALL DELAY_20us
LCALL DELAY_20us
RET
DELAY_100us:
LCALL DELAY_20us
LCALL DELAY_20us
LCALL DELAY_20us
LCALL DELAY_20us
LCALL DELAY_20us
RET
;-------------------------
DELAY_60us:
LCALL DELAY_20us
LCALL DELAY_20us
LCALL DELAY_20us
RET
;-------------------------
DELAY_200us:
MOV Delay_L,#28H ;40*5us
DD1:
NOP
NOP
NOP
NOP
NOP
DJNZ Delay_L,DD1
ret
;---------------------------
DELAY_1MS: ; 在调用此函数时R6,R7就不能再使用了
MOV R6,#10
D_1MS1:
MOV R7,#188
D_1MS2:
DJNZ R7,D_1MS2
DJNZ R6,D_1MS1
RET
;---------------------------
DELAY_5ms:
MOV Delay_H,#04H ;4*1.2ms
D5_1:
MOV Delay_L,#0FFH
D5_2:
NOP
NOP
NOP
DJNZ Delay_L,D5_2
DJNZ Delay_H,D5_1
ret
;--------------------------------
DELAY_50ms:
MOV Delay_H,#50 ;
D50ms_1:
MOV Delay_L,#0FFH
D50ms_2:
NOP
NOP
NOP
DJNZ Delay_L,D50ms_2
DJNZ Delay_H,D50ms_1
ret
;----------------------------
DELAY_100ms:
MOV Delay_H,#100 ;4*1.2ms
D100ms_1:
MOV Delay_L,#0FFH
D100ms_2:
NOP
NOP
NOP
DJNZ Delay_L,D100ms_2
DJNZ Delay_H,D100ms_1
ret
;--------------------------------
DELAY_200ms:
MOV Delay_H,#080 ;4*1.2ms 160
D200ms_1:
MOV Delay_L,#0FFH
D200ms_2:
NOP
NOP
NOP
DJNZ Delay_L,D200ms_2
DJNZ Delay_H,D200ms_1
ret
;------------------------------
DELAY_1s:
LCALL DELAY_200ms
LCALL DELAY_200ms
LCALL DELAY_200ms
LCALL DELAY_200ms
LCALL DELAY_200ms
RET
;--------------------------------
END