为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > nRF24L01测试程序

nRF24L01测试程序

2017-09-18 18页 doc 42KB 20阅读

用户头像

is_597436

暂无简介

举报
nRF24L01测试程序nRF24L01测试程序 ;****************************************IO端口定义 *************************************** LED BIT P3.7; LED1 BIT P3.5; LED2 BIT P3.4; LED3 BIT P3.3; K1 BIT P1.5; KZ BIT P1.6; K2 BIT P1.7; CE BIT P1.0;数字输入,RX或TX模式选择 CSN BIT P1.1;数字输入,SPI片选 SCK BI...
nRF24L01测试程序
nRF24L01测试程序 ;****************************************IO端口定义 *************************************** LED BIT P3.7; LED1 BIT P3.5; LED2 BIT P3.4; LED3 BIT P3.3; K1 BIT P1.5; KZ BIT P1.6; K2 BIT P1.7; CE BIT P1.0;数字输入,RX或TX模式选择 CSN BIT P1.1;数字输入,SPI片选 SCK BIT P1.2;数字输入,SIP时钟 MOSI BIT P1.3;数字输入,数据输入 MISO BIT P1.4;数字输出,数据输出 IRQ BIT P3.2;数字输出,可屏蔽中断 ;******************************************************************************* ********************************* ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV P1,#0FFH MOV P3,#0FFH CLR LED CLR KZ ;串口初始化 MOV SP,#70H MOV PCON,#00H MOV SCON,#01000000B MOV TMOD,#00100000B MOV TL1,#0FDH MOV TH1,#0FDH SETB TR1 SETB REN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOOP: JNB K2,CHANGFA JNB K1,DANFA LJMP LOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DANFA: ;发射 LCALL init_NRF24L01;初始化 LCALL SetTX_Mode ;确认工作在发射模式 CLR CE ;发射模式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;串口显示已经配置的信息 MOV R0,#17H MOV R1,#00H XIAN_T_A: CJNE R0,#00H,XIAN_T_B LJMP LOOPA XIAN_T_B: MOV A,R1 LCALL SPI_R_Reg MOV SBUF,A JNB TI,$ CLR TI DEC R0 INC R1 LJMP XIAN_T_A ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOOPA:;写入32位数据并且发送 MOV B,#12H LCALL SPI_Write_Buf CLR LED1 ;LCALL YAN500MS ;SETB LED1 ;LCALL YAN500MS LJMP LOOPA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CHANGFA: ;接收 LCALL init_NRF24L01;初始化 LCALL SetRX_Mode ;确认工作在接收模式 SETB CE ;接收模式 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;串口显示已经配置的信息 MOV R0,#17H MOV R1,#00H XIAN_R_A: CJNE R0,#00H,XIAN_R_B LJMP LOOPB XIAN_R_B: MOV A,R1 LCALL SPI_R_Reg MOV SBUF,A JNB TI,$ CLR TI DEC R0 INC R1 LJMP XIAN_R_A ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOOPB:;判断有无接收数据 MOV A,#07H LCALL SPI_R_Reg JNB ACC.6,LOOPB ;########################################## LCALL SPI_Read_Buf MOV A,B MOV SBUF,A JNB TI,$ CLR TI ;########################################## CLR LED3 ;LCALL YAN500MS ;SETB LED3 ;LCALL YAN500MS LJMP LOOPB ;******************************************************************************* ********************************* ;************************************************************************** ; - 功能描述:延时500毫秒 ; - 隶属模块:无 ; - 函数属性:无 ; - 参数说明:无 ; - 返回说明:无 ; ************************************************************************* YAN500MS: MOV R4,#5 TXD_c3: MOV R5,#10 TXD_c2: MOV R6,#0FFH TXD_c1: MOV R7,#0FFH TXD_c0: DJNZ R7,TXD_c0 DJNZ R6,TXD_c1 DJNZ R5,TXD_c2 DJNZ R4,TXD_c3 RET ;########################################################## ;函数:SPI_W---SPI写1字节 ;参数:A=写入数据 ;返回:无 ;使用:A R7 ;########################################################## SPI_W: SETB MOSI ;恢复端口状态 MOV R7,#8 ;设置需要写入8个位,1个字节 SPI_W_A: CJNE R7,#00H,SPI_W_B ;判断是否写完数据,写完退出 RET ;数据写完退出 SPI_W_B: RLC A ;移出最高位-输出高位 MOV MOSI,C ;输出最高位 SETB SCK ;时钟高电平 NOP NOP CLR SCK ;恢复时钟状态 DEC R7 ;指向下一位 LJMP SPI_W_A ;返回继续判断 ;########################################################## ;函数:SPI_R---SPI读1字节 ;参数:无 ;返回:A=读出来的数据 ;使用:A R7 ;########################################################## SPI_R: SETB MISO ;恢复端口状态 MOV R7,#8 ;设置需要写入8个位,1个字节 SPI_R_A: CJNE R7,#00H,SPI_R_B ;判断是否写完数据,写完退出 RET ;数据写完退出 SPI_R_B: SETB SCK ;时钟高电平 MOV C,MISO ;读输出引脚状态 RLC A ;保存输出状态 CLR SCK ;恢复时钟状态 DEC R7 ;指向下一位 LJMP SPI_R_A ;返回继续判断 ;########################################################## ;函数:SPI_R_Reg---SPI读寄存器 ;参数:A:指令+地址 ;返回:A: A=读出来的数据 ;使用:A R7 ;########################################################## SPI_R_Reg: CLR CSN ;SPI片选择使能 LCALL SPI_W ;写入指令+地址 LCALL SPI_R ;读取数据 SETB CSN ;SPI片选择关闭 RET ;########################################################## ;函数:SPI_W_Reg---SPI写寄存器 ;参数:A:指令+地址 B:需要写入的数据 ;返回:无 ;使用:A B R7 ;########################################################## SPI_W_Reg: CLR CSN ;SPI片选择使能 LCALL SPI_W ;写入指令+地址 MOV A,B ;读取需要写入的数据 LCALL SPI_W ;写入数据 SETB CSN ;SPI片选择关闭 RET ;########################################################## ;函数:init_NRF24L01---初始化 ;参数:无 ;返回:无 ;使用:A B R7 ;备注: 本地发送地址:0x01,0x23,0x45,0x67,0x89 ; 端口0接收地址:0x01,0x23,0x45,0x67,0x89 ; 默认配置为:发射模式 ;########################################################## init_NRF24L01: CLR CE ;进入待机模式1进行配置 SETB CSN ;SPI片选择关闭 CLR SCK ;恢复时钟状态 ;############################################## ;设置接收发射模式与CRC校验等 CLR CSN ;SPI片选择使能 MOV A,#20H ;写配置寄存器 00+20写指令 LCALL SPI_W ;发送指令 MOV A,#0FH ;上电,发射模式=0EH 接收模式=0FH LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;打开端口0自动应答 CLR CSN ;SPI片选择使能 MOV A,#21H ;写自动应答寄存器 01+20写指令 LCALL SPI_W ;发送指令 MOV A,#00H ;打开端口0自动应答 01 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;打开端口0接收允许 CLR CSN ;SPI片选择使能 MOV A,#22H ;写数据通道允许寄存器 02+20写指令 LCALL SPI_W ;发送指令 MOV A,#01H ;打开接收数据通道0允许 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;设置地址宽度 CLR CSN ;SPI片选择使能 MOV A,#22H ;写收发地址宽度寄存器 03+20写指令 LCALL SPI_W ;发送指令 MOV A,#03H ;设置地址宽度为5个字节 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;建立自动重发 CLR CSN ;SPI片选择使能 MOV A,#24H ;写自动重发度寄存器 04+20写指令 LCALL SPI_W ;发送指令 MOV A,#00H ;重发等待500uS,重发4次 14 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;工作频率设置为2.4G CLR CSN ;SPI片选择使能 MOV A,#25H ;写工作频率寄存器 05+20写指令 LCALL SPI_W ;发送指令 MOV A,#02H ;设置信道工作为2.4GHZ LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;设置发射速度为1M,发送功率最大0dB CLR CSN ;SPI片选择使能 MOV A,#26H ;写发射速率寄存器 06+20写指令 LCALL SPI_W ;发送指令 MOV A,#07H ;设置速率1M,功率0dB LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;写状态寄存器 CLR CSN ;SPI片选择使能 MOV A,#27H ;写状态寄存器 07+20写指令 LCALL SPI_W ;发送指令 MOV A,#70H ;写状态寄存器 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;写端口0接收地址 CLR CSN ;SPI片选择使能 MOV A,#2AH ;写端口0接收寄存器 0A+20写指令 LCALL SPI_W ;发送指令 MOV A,#55H ;写发送地址第1位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第2位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第3位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第4位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第5位 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;写本地地址 CLR CSN ;SPI片选择使能 MOV A,#30H ;写发送地址寄存器 10+20写指令 LCALL SPI_W ;发送指令 MOV A,#55H ;写发送地址第1位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第2位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第3位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第4位 LCALL SPI_W ;写1字节数据 MOV A,#55H ;写发送地址第5位 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;设置端口0接收数据长度 CLR CSN ;SPI片选择使能 MOV A,#31H ;写端口0数据长度寄存器 11+20写指令 LCALL SPI_W ;发送指令 MOV A,#1 ;设置端口0接收32字节 32 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## ;退出 RET ;########################################################## ;函数:SPI_Write_Buf---写1位数据 ;参数:B存放需要发送的1字节数据 ;返回:无 ;使用:A R7 ;########################################################## SPI_Write_Buf: CLR CE ;进入待机模式1进行配置 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;装载数据 CLR CSN ;SPI片选择使能 MOV A,#0A0H ;写待发送数据指令A0 LCALL SPI_W ;发送指令 MOV A,B ;写入需要发送的数据 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选恢复 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;发送数据 SETB CE ;启动发射 MOV R6,#150 ;等待一段时间 DJNZ R6,$ ;等待一段时间 CLR CE ;进入待机状态 JB IRQ,$ ;等待IRQ出现0电平 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;清除状态寄存器中断标志 CLR CSN ;SPI片选 MOV A,#27H ;写状态寄存器07+20写指令 LCALL SPI_W ;发送指令 MOV A,#70H ;通过写1来清楚中断标志 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选恢复 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LCALL SPI_R ;读1字节 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;清模块发送缓冲区 CLR CSN ;SPI片选 MOV A,#0E1H ;清模块发送缓冲区 LCALL SPI_W ;发送指令 SETB CSN ;SPI片选恢复 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RET ;########################################################## ;函数:SPI_Read_Buf---读1位数据 ;参数:无 ;返回:读出后的数据在B中 ;使用:A R7 - R0 R6 ;########################################################## SPI_Read_Buf: CLR CE ;进入待机模式 ;########################################## ;读取数据 CLR CSN ;SPI片选 MOV A,#61H ;写读取接收数据指令 LCALL SPI_W ;发送指令 LCALL SPI_R ;读1字节数据 MOV B,A SETB CSN ;SPI片选恢复 ;########################################## ;清除状态寄存器中断标志 CLR CSN ;SPI片选 MOV A,#27H ;写状态寄存器07+20写指令 LCALL SPI_W ;发送指令 MOV A,#70H ;通过写1来清楚中断标志 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选恢复 ;########################################## ;清模块接收缓冲区 CLR CSN ;SPI片选 MOV A,#0E2H ; LCALL SPI_W ;发送指令 SETB CSN ;SPI片选恢复 ;########################################## SETB CE ;继续进入接收状态 RET ;########################################################## ;函数: SetTX_Mode---配置为发射模式 ;参数:无 ;返回:无 ;使用:A R7 ;########################################################## SetTX_Mode: CLR CE ;进入待机模式 ;############################################## ;设置发射模式与CRC校验等 CLR CSN ;SPI片选择使能 MOV A,#20H ;写配置寄存器 00+20写指令 LCALL SPI_W ;发送指令 MOV A,#0EH ;上电,发射模式 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## RET ;########################################################## ;函数: SetRX_Mode---配置为接收模式 ;参数:无 ;返回:无 ;使用:A R7 ;########################################################## SetRX_Mode: CLR CE ;进入待机模式 ;############################################## ;设置接收模式与CRC校验等 CLR CSN ;SPI片选择使能 MOV A,#20H ;写配置寄存器 00+20写指令 LCALL SPI_W ;发送指令 MOV A,#0FH ;上电,接收模式 LCALL SPI_W ;写1字节数据 SETB CSN ;SPI片选择关闭 ;############################################## RET ;########################################################## END
/
本文档为【nRF24L01测试程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索