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

📄 接收 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	;调用配置
       SETB     CSN
        SETB     PWR    ; 接收命令
        SETB     TRX_CE
        CLR      TX_EN
        LCALL    T500US
        CLR      PWR     ; 转入待机模式,以便SPI操作
        SETB     DR
        CLR     TX_EN
        SETB     TRX_CE
        SETB     PWR
        LCALL    T500US
        JNB      DR,$
        CLR     TRX_CE
        MOV     R1,#24H
        SETB    CSN
        NOP 
        CLR     CSN
        ACALL   SPIW
        
        SETB    CSN
        JNB      DR,$
        MOV      R0,#60H  ;数据存入60H,61H
CCRD:   ACALL    SPIR
        MOV       @R0,A
        INC       R0
        CJNE      R0,#62H,CCRD
        SETB      CSN
DISPLAY:  PUSH   A
         MOV    R0,  #60H        ;显示缓冲区地址放入R0
         MOV    R2,  #0f7H       ;位选码指向
DISPLAY1:MOV    A,   @R0         ;取出要显示的数
         MOV    DPTR,#TAB        ;指向换码表首址
         MOVC   A,   @A+DPTR
         MOV    P0,  A           ;输出显示
         MOV    A,   R2          ;取出位边码
         MOV    P2, A
         LCALL  D1MS             ;延时20MS
         JB     ACC.0,DISPY2     ;四位是否显示完?未完,则继续显示
         POP    A
         SJMP DISPLAY            ;显示完,从新显示
DISPY2:  inc    R0               ;求下一位要显示的数的地址
         MOV    A,  R2           ;求下一个位选码
         Rr     A
         MOV    R2, A
         SJMP   DISPLAY1
;延时20MS
D20MS:   MOV R3,#27H
D20:     MOV R2,#00H
         DJNZ R2,$
         DJNZ R3,D20
         RET
;延时1MS
D1MS: MOV    R3, #0f9H
D1:   NOP
      NOP
      DJNZ   R3, D1
      RET
TAB: DB 3FH,6H,5BH,4FH,66H,6DH,7DH,27H,7FH,6FH,00H,54H,73H,79H,37H,3EH,07H,31H
        ;0,  1,  2,  3,  4,  5,  6,  7,  8,  9,NUL,n  ,  P,  E,  N,(F)U,  T   
        
	;*******************************
	;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
	;CALL	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
TF:	MOV	2CH,#50
	DJNZ	2CH,$
	DJNZ	2BH,TF
	RET
	END

⌨️ 快捷键说明

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