⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 发送nrf905_test汇编.asm

📁 无线模块开发包
💻 ASM
字号:
	;无线遥控,NRF905,STC2052AD,12M,20071121
	;AT89C2051
	;发送模块	;	;
	;定义相应管脚
	CSN	EQU	P3.4	;	;SPI使能
	SCK	EQU	P3.5
	MOSI	EQU	P3.7
	MISO	EQU	P1.0
	PWR	EQU	P1.5
	TRX_CE	EQU	P1.6
	TX_EN	EQU	P1.7
	DR	EQU	P1.1
	AM	EQU	P1.2
	CD	EQU	P1.3
	ORG	0000H
	AJMP	MAIN
	ORG	0030H
MAIN:	MOV	SP,#70H
	SETB	PWR
	SETB	AM
	SETB	DR
	SETB	CD
	SETB	CSN
	CLR	SCK
	CLR	TX_EN
	CLR	TRX_CE
	LCALL	PZRE	;调用配置
LOOP:	SETB	TRX_CE
	CLR	TX_EN
	JNB	DR,$    ;等待接收
	MOV	R0,#60H	;读2个字节存入60H-61H
	MOV	R1,#24H	;读接收数据命令
	CLR	TRX_CE
	SETB	CSN
	NOP
	CLR	CSN
	ACALL	SPIW
CCRD:	ACALL	SPIR
	MOV	@R0,A
	INC	R0
	CJNE	R0,#62H,CCRD
	INC	60H	;要发送的数据(2字节)
	INC	61H
	SETB	CSN
	MOV	R5,#200
	DJNZ	R5,$
	LCALL	SEND_D	;调用发射
	JNB	DR,$
	SJMP	LOOP
	;*******************************
	;NRF905
PZRE:	;	;RF配置寄存器为固定的10字节	;	;
	SETB	CSN
	NOP
	CLR	CSN	;	;	;使能置底开始写状态字
	MOV	R1,#00H	;	;	;写RF配置寄存器的指令00H
	LCALL	SPIW
	;	;	;0	;
	MOV	R1,#4CH	;CH_NO	;	;	频偏地址,默认为(这个0在下面的CHNO[BIT8])	0110_1100(即433.2MHZ)
	LCALL	SPIW	;	;	;默认为6CH	;	;
	;	;	;计算在什么频段自己去算,有公式	;	;
	;	;	;不算也可以,两个或(更多的)NRF905配置成一样,就行了。哈。。。	;	;	;1	;	;
	MOV	R1,#0CH	;	;+6DB	;BIT7,6	;NOP	;	;BIT5	;AUTO	RETRAN	;0不重发	;1重发
	LCALL	SPIW	;	;	;BIT4	;RX	RED_PWR	;0=正常模式1=低功耗模式至(1.6MA)
	;	;	;BIT3,2	;	;PA_PWR	;	;00为-10DBM	;	;01=-2DBM	;	;10=+6DBM	;11=+10DBM
	;	;	;BIT1	;	;HEREQ_PLL	;=0/433MHZ	;=1/868/915MHZ	;	;
	;	;	;BIT0	;	;CHNO[BIT8]((上面的1位在这)因为它CH_NO为9位。
	;	;	;由参考表得来,若900MHZ以上则此位为1,900MHZ以下此为0
	;	;	;例	;	;	;0CH[0000_1100]	;	;正常模式,功率+10DBM,频点433MHZ
	;	;	;00H[0000_0000]	;	;正常模式,功率-10DBM,频点433MHZ
	;	;	;..自已喜欢看着组合	;	;
	;	;	;2	;地址字节数
	MOV	R1,#44H	;	;	;BIT7	;NOP	;	;6,5,4	;TX_AFW	;	;3	;NOP	;	;2,1,0	;RX_AFW
	LCALL	SPIW	;
	;	;	;TX_AFW	;001	;1字节	;100	;	4字节	;	;
	;	;	;RX_AFW	;001	;1字节	;100	;	4字节	;	;
	;	;	;44为TX地址宽度4字节,RX地址宽度4字节	;	;00000000-FFFFFFFF	;(4294967295)台机子。
	;	;	;11为TX地址宽度1字节,RX地址宽度1字节	;	;00-FF(256)台机子	;
	;	;	;例	;	;	;44H	;	;[#100_0100]	;	;发射4字节,接收4字节	;	;
	;	;	;11H	;	;[#001_0001]	;	;发射1字节,接收1字节	;	;
	;	;	;3	;要接收的字节数
	MOV	R1,#02H	;	;JIE2ZIJIE	;BIT7,6	;	NOP	;	;BIT5,4,3,2,1,0	;	RX_PWR
	LCALL	SPIW	;	;00001	;	;1字节接收有效	;	;00010	;	;2字节接收有效	;	;10000	;	;32字节接收有效	;	;
	;	;	;例	;[##10_0000]=20H	;即32字节接收有效
	;	;	;[##00_0010]=02H	;	;即2字节接收有效
	;	;*******	;4	;要发射的字节数
	MOV	R1,#02H	;	;BIT7,6	,NOP	;BIT5,4,3,2,1,0	;	TX_PWR
	LCALL	SPIW	;	;	;	;00001	;	;1字节发射有效	;	;00010	;	;2字节发射有效	;	;10000	;	;32字节发射有效	;	;
	;	;	;例	;	;	;[##10_0000]=20H	;即32字节发射有效
	;	;	;{##00_0010]=02H	;即2字节发射有效
	;	;5,6,7,8	;	;这个为此NRF905的地址每个都不同	;	;每当收到一个TX的地址比较是否是自己的。????
	;	;	;5	;地址的第一个字节
	MOV	R1,#02H	;	;	;RX地址0	;	默认0E7H
	LCALL	SPIW	;	;例	;	也说是说可以为每个模块写入自己特定的编号
	;	;	;在群发系统中有多个子模块,为防发生数据碰撞,
	;	;	;模块接收到的地址与自己的地址比较	;	;正确后方做应答,否则不应答
	;	;	;例
	;	;	;5,6,7,8小项中写入01	00	00	00	则此模块为01号
	;	;	;只有在主机发送地址中包含了01	00	00	00的数据方做此模块方做应答.
	;	;	;6	;	;地址的第2个字节
	MOV	R1,#00H	;	;RX地址1,默认0E7H
	LCALL	SPIW	;
	;	;	;7	;地址的第3个字节
	MOV	R1,#00H	;	;RX地址2,默认0E7H
	LCALL	SPIW	;
	;	;	;8	;	;地址的第4个字节
	MOV	R1,#00H	;
	LCALL	SPIW	;	;RX地址3,默认0E7H
	;	;9	;校验设置
	MOV	R1,#58H	;	;BIT7	;	CRC_MODE模式	;=0八位CRC校验	/=1十六位CRC校验	;(默认=1)
	LCALL	SPIW	;	;BIT6	;	CRC校验允计	;=0不允许校验	/=1充许校验	;(默认=1)
	;	;BIT5,4,3	;	XOF[2	;	0]	;000=4MHZ	;001=8MHZ	;	;010=12MHZ	;	;011=16MHZ	;	;111=20MHZ
	;	;	;晶体振荡器,必须与外部晶振来设计	;	;
	;	;	;BIT2	;	UP_CLK_EN	;	;=0没有外部时钟	/=1外部时钟信号使能	;
	;	;	;输出时钟使能
	;	;BIT1,0	;	UP_CLK_FREQ[1	;	0]	;	;00=4MHZ	;	;01=2MHZ	;	;10=1MHZ	;	;11=500KHZ	;
	;	;	;输出时钟频率
	;	;	;
	;	;	;
	;	;	;例	;	;	;[0101_1000]=58H	;	;8位CRC校验,CRC校验允许,板上的NRF905用的晶振16MHZ,
	;	;	;没有外部时钟(即用的是自己的晶振)。输出频率为4MHZ。
	SETB	CSN
	RET
	;****************************
	;	;NRF905_SPI指令
	;1	;写配置寄存器	;	00H
	;	;格式0000_AAAA	;	;其中AAAA指的是0-9的寄存器
	;	;例	;	你可以专门改定寄存中的某一项,如改变功率
	;	;在此前的功率为-10DBM
	;	;命令	;	MOV	R1,#01H	;ACALL	SPIW	;	;指向配置寄存器的01地址
	;	;紧接数据	;	MOV	R1,#0CH	;ACALL	SPIW	;	;把0CH的数据写入01地址中
	;	;	;	;此时RF_REGIT中的发射功率由-10DBM改到+10DBM
	;2	;读配置寄存器	;	01H
	;3	;写发射数据命令	;	20H
	;4	;读发射数据命令	;	21H
	;5	;写发射地址命令	;	22H	;	;默认为E7,E7,E7,E7	;	;
	;6	;读发射地址命令	;	23H
	;7	;读接收数据命令	;	24H
	;	;这个个快速配置寄存器,会让人误解?
	;	;我个人觉得应写成
	;	;<<中心频率频偏设置寄存器>>,更好理解。
	;8	;快速配置寄存器	;	1000_PPHC	;	;也就是说这个指令为16BIT字长	;	;不能单独的写一个8BIT就算完事???.
	;	;PP指的是PA_PWR	;	;00,01,10,11	;-10DBM/-2DBM/+6DBM/+10DBM
	;	;H指的是	HFREQ_PLL	;	;0=通道频差100KHZ	;	;=1通道频差200KHZ
	;	;C指的是CH_NO	CCCCCCCCC(9BIT)
	;	;例1	;	;	;它的指令为80H,4CH	;	;工作在433.0MHZ,频差100KHZ,
	;	;MOV	R1,#80H
	;	;ACALL	SPIW
	;	;MOV	R1,#4CH
	;	;ACALL	SPIW
	;	;例2	;	它的指令为80H,7BH	;	;在工作在433.7MHZ,频差100KHZ
	;	;MOV	R1,#80H
	;	;ACALL	SPIW
	;	;MOV	R1,#7BH
	;	;ACALL	SPIW
	;9	;	;
	;	;1)状态	寄存器	;	;(内部地址)不知道???供查询用。
	;7	;	AM	;	;BIT6	;	NOP	;	;BIT5	;	DR	;	;BIT4-0	;	NOP
	;	;初始不定
	;	;2)RF配置	寄存器
	;	;3)发送地址	寄存器
	;	;4)发送有效数据寄存器
	;	;5)接收有效数据寄存器
	;************************
SEND_D:	CLR	CSN
	MOV	R1,#22H	;写入四个发射地址	;3456
	ACALL	SPIW
	MOV	R1,#03H
	ACALL	SPIW
	MOV	R1,#04H
	ACALL	SPIW
	MOV	R1,#05H
	ACALL	SPIW
	MOV	R1,#06H
	ACALL	SPIW
	SETB	CSN
	NOP
	NOP
	CLR	CSN
	;写入2个要发送的数据
	MOV	R1,#20H
	ACALL	SPIW	;	;
	MOV	R1,60H
	ACALL	SPIW
	MOV	R1,61H	
	ACALL	SPIW
	SETB	CSN
	SETB	TX_EN
	SETB	TRX_CE	;充许发送,芯片开始调制载波并发送	;	;
	RET
	;*****************
SPIW:	;写操作
	MOV	A,R1
	MOV	R5,#08H
SPIW2:	RLC	A
	MOV	MOSI,C
	SETB	SCK
	NOP
	NOP
	CLR	SCK
	DJNZ	R5,SPIW2
	RET
	;*************
SPIR:	;	;读操作
	MOV	R5,#08H
SPIR2:	SETB	SCK
	MOV	C,MISO
	RLC	A
	NOP
	NOP
	CLR	SCK
	DJNZ	R5,SPIR2
	RET
	;************************
DELAY:	MOV	R7,#200
D:	MOV	R2,#200
	DJNZ	R2,$
	DJNZ	R7,D
	RET
	;*****************
T500US:	MOV	2BH,#10
TF1:	MOV	2CH,#50
	DJNZ	2CH,$
	DJNZ	2BH,TF1
	RET
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -