板子是用现成的,别人写的软件能正常通信,说明硬件没问题。
单片机型号AT89C4051
以下是我写的软件。
不知道是配置问题还是读写问题,无法通信。
;/----------------------------------------
;--RNF2401发送程序
;--单片机AT89C4051
;-------------------------------------------
PWR_UP EQU P3.3
DATA1 EQU P3.7
CLK1 EQU P3.5
DR1 EQU P1.5
CE EQU P3.2
CS EQU P3.4
LED EQU P1.7
ORG 0000H
JMP START0
ORG 0100H
START0:
MOV P1,#0FFH
MOV P3,#0FFH
SETB PWR_UP
CLR CE
CLR CS
LCALL DELAY3mS ; NRF2401完成上电,进入待机状态
LCALL CONFIG_TX ;调用配置NRF2401发送子程序,
LOOP: SETB CE
LCALL DELAY300US ;进入发送状态。
MOV A,#0F0H
LCALL DATA_WRITE ;数据写入2401
CLR CE ;2401开始发送
MOV 4BH,#20H
LOOP01: LCALL DELAY3mS
DJNZ 4BH,LOOP01
CPL LED ;发送一次数据,LED灯闪一次
JMP LOOP
;/--------------------------------------------
;配置NRF2401发送子程序
;---------------------------------------------/
CONFIG_TX:
CLR CE
SETB CS
LCALL DELAY300US
MOV A,#50H ;bit119-bit112:通道二数据长度
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#50H ;bit119-bit112:通道1数据长度
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#11H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#83H ;bit23-bit18:32地址位的长度, (83H:地址长度32,16位CRC,允许CRC)
; bit17:CRC校验位长度选择(0:8位CRC 1:16位CRC)
; bit16:CRC校验位允许(0:禁止CRC,1:允许CRC)。
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#6fH ; bit15:0:单通道接收,1:双通道接收 (4FH:单通道接收,shockburst模式,250Kbps,16MHz,0dBm)
;bit14:数据传输模式选择位,0:Direct模式1:shockBurst模式。
;bit13:传输速率选择位,0:250kbps 1:1Mbps. 选择250kbps 比1Mbps 传输距离更远。
;bit12-bit10:设置晶振频率。 (000:4MHz, 001:8MHz, 010:12MHz, 011:16MHz, 100:20MHz)
;bit9-bit8:信号发射功率设置。(00:-20dBm , 01:-10dBm, 10:-5dBm, 11:0dBm)
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#04H ;bit7-bit1:通道选择及频率设置,frequency= 2400MHz + RF_CH * 1.0MHz (04H:频段2@发送模式)
;bit0:设置传输模式,0表示发送模式,1表示接收模式。当要求nRF2401A工作在双工方式通信时,通过改变这一位来不断转换发送和接收模式。
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
LCALL DELAY3mS
CLR CS ;完成配置
LCALL DELAY3mS
RET
;/------------------------------------------------------------------------------
;数据写2401子程序
;/----------------------------------------------------------------------------/
DATA_WRITE:
WRITE:
MOV R2,#08
WRITE1:
RLC A ;ACC左移一位,最高位进入CY
MOV DATA1,C ;将CY送到DATA引脚
SETB CLK1 ;将时钟信号置高
NOP ;需要根据CPU运行速度调整NOP指令的数量
NOP
NOP
NOP
NOP
NOP
CLR CLK1 ;将时钟信号置低
DJNZ R2,WRITE1
RET
;/---------------------------------------------------
;延时子程序
;-------------------------------------------------/
DELAY10US: ;晶振11.0592MHz,T=0.0904uS,10uS=110T
MOV 40H,#04H ;MOV direct rel 为3T(1T单片机)或12T(传统单片机)
DJNZ 40H,$ ;DJNZ direct rel 为5T(1T单片机)或24T(传统单片机)
RET
DELAY300US: ;晶振11.0592MHz,T=0.0904uS,300uS=3300T
MOV 40H,#8AH ;MOV direct rel 为3T(1T单片机)或12T(传统单片机)
DJNZ 40H,$ ;DJNZ direct rel 为5T(1T单片机)或24T(传统单片机)
RET
DELAY3mS: ;晶振11.0592MHz,T=0.0904uS,3mS=33178T
MOV 41H,#14H
MS01: MOV 40H,#45H ;MOV direct rel 为3T(1T单片机)或12T(传统单片机)
DJNZ 40H,$ ;DJNZ direct rel 为5T(1T单片机)或24T(传统单片机)
DJNZ 41H,MS01
RET
END
接收部分:
;/----------------------------------------
;--RNF2401接收程序
;--单片机AT89C4051
;-------------------------------------------
PWR_UP EQU P3.3
DATA1 EQU P3.7
CLK1 EQU P3.5
DR1 EQU P1.5
CE EQU P3.2
CS EQU P3.4
LED EQU P1.7
ORG 0000H
JMP START0
ORG 0100H
START0:
;LCALL LED_FAST
MOV P1,#0FFH
MOV P3,#0FFH
SETB PWR_UP
CLR CE
CLR CS
LCALL DELAY3mS ; NRF2401完成上电,进入待机状态
LCALL CONFIG_RX ;调用配置NRF2401接收子程序,
SETB CE
LCALL DELAY300US ;进入接收状态。
RECEIVE1: JB DR1,RECEIVE2 ;Receive
JMP RECEIVE1
RECEIVE2: LCALL READ
LCALL LED_FAST ;接收完数据,LED闪
JMP RECEIVE1 ;继续接收
;/-------------------------------------
; LED灯闪
;----------------------------------------/
LED_FAST:
MOV 50H, #0AH
L03: MOV 51H, #0aH
L02: MOV 52H, #21H
L01: LCALL DELAY3mS
DJNZ 52H, L01
DJNZ 51H,L02
CPL LED
DJNZ 50H,L03
RET
;/--------------------------------------------
;配置NRF2401接收子程序
;---------------------------------------------/
CONFIG_RX:
CLR CE
SETB CS
LCALL DELAY300US
MOV A,#50H ;bit119-bit112:通道二数据长度
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#50H ;bit119-bit112:通道1数据长度
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit103-bit64:表示当前配置芯片通道二地址 最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#00H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#11H ;bit63-bit24:表示当前配置芯片通道一地址,最长可以配置为40 bit ,少于40BIT的部分设置为0
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#83H ;bit23-bit18:32地址位的长度, (83H:地址长度32,16位CRC,允许CRC)
; bit17:CRC校验位长度选择(0:8位CRC 1:16位CRC)
; bit16:CRC校验位允许(0:禁止CRC,1:允许CRC)。
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#6fH ; bit15:0:单通道接收,1:双通道接收 (4FH:单通道接收,shockburst模式,250Kbps,16MHz,0dBm)
;bit14:数据传输模式选择位,0:Direct模式1:shockBurst模式。
;bit13:传输速率选择位,0:250kbps 1:1Mbps. 选择250kbps 比1Mbps 传输距离更远。
;bit12-bit10:设置晶振频率。 (000:4MHz, 001:8MHz, 010:12MHz, 011:16MHz, 100:20MHz)
;bit9-bit8:信号发射功率设置。(00:-20dBm , 01:-10dBm, 10:-5dBm, 11:0dBm)
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
MOV A,#05H ;bit7-bit1:通道选择及频率设置,frequency= 2400MHz + RF_CH * 1.0MHz (04H:频段2@发送模式)
;bit0:设置传输模式,0表示发送模式,1表示接收模式。当要求nRF2401A工作在双工方式通信时,通过改变这一位来不断转换发送和接收模式。
LCALL DATA_WRITE ;发送一个字节的数据
LCALL DELAY300US
CLR CS ;完成配置
LCALL DELAY3mS
RET
;/------------------------------------------------------------------------------
;数据写2401子程序
;/----------------------------------------------------------------------------/
DATA_WRITE:
WRITE:
MOV R2,#08
WRITE1:
RLC A ;ACC左移一位,最高位进入CY
MOV DATA1,C ;将CY送到DATA引脚
SETB CLK1 ;将时钟信号置高
NOP ;需要根据CPU运行速度调整NOP指令的数量
NOP
NOP
NOP
CLR CLK1 ;将时钟信号置低
DJNZ R2,WRITE1
RET
;/---------------------------------------------------------------
;读2401数据子程序
;/-----------------------------------------------------------------
READ:
SETB DATA1
MOV R2,#08
READ1:
SETB CLK1 ;将时钟信号置高
NOP ;需要根据CPU运行速度调整NOP指令的数量
NOP
NOP
NOP
RLC A ;ACC左移一位,CY进入最低位
MOV C,DATA1 ;将DATA脚读取一位数据到CY
CLR CLK1 ;将时钟信号置低
cpl led
LCALL DELAY300US
DJNZ R2,READ1
RET
;/---------------------------------------------------
;延时子程序
;-------------------------------------------------/
DELAY10US: ;晶振11.0592MHz,T=0.0904uS,10uS=110T
MOV 40H,#04H ;MOV direct rel 为3T(1T单片机)或12T(传统单片机)
DJNZ 40H,$ ;DJNZ direct rel 为5T(1T单片机)或24T(传统单片机)
RET
DELAY300US: ;晶振11.0592MHz,T=0.0904uS,300uS=3300T
MOV 40H,#8AH ;MOV direct rel 为3T(1T单片机)或12T(传统单片机)
DJNZ 40H,$ ;DJNZ direct rel 为5T(1T单片机)或24T(传统单片机)
RET
DELAY3mS: ;晶振11.0592MHz,T=0.0904uS,3mS=33178T
MOV 41H,#14H
MS01: MOV 40H,#45H ;MOV direct rel 为3T(1T单片机)或12T(传统单片机)
DJNZ 40H,$ ;DJNZ direct rel 为5T(1T单片机)或24T(传统单片机)
DJNZ 41H,MS01
RET
END
求助 。
一周热门 更多>