RFM12B接收程序

;<<<<<<<<<<程序说明>>>>>>>>>>
;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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值