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

📄 ex2a.asm

📁 nRF24E1 sample transmit & receiver
💻 ASM
字号:
;= ex2a.asm ====================================================================
;
; Copyright (C) 2003, 2004 Nordic Semiconductor
;
; This file is distributed in the hope that it will be useful, but WITHOUT
; WARRANTY OF ANY KIND.
; 
; Author(s): Ole Saether
;
; DESCRIPTION:
;
;   This program gives an example of using the ADC and PWM together with the
;   radio. You need two nrf24E1 evaluation boards to test this program. One
;   board will act as the transmitter and the other as the receiver determined
;   by the logical level on pin P0.6.
;
;   After initializing the ADC and the radio, the transmitter enters an infinite
;   loop continuously reading the ADC and transmitting the read data.
;
;   After initializing the PWM and radio, the receiver enters an infinite loop
;   continuously waiting for a radio packet and updating the PWM with the data
;   in the received packet.
;
;   The functionality is the same as in ex2c.c.
;
; ASSEMBLER:
;
;   You need as31.exe to assemble this program. It can be downloaded from this
;   web page: http://www.pjrc.com/tech/8051/
;
; $Revision: 5 $
;
;===============================================================================

                 .equ    CKCON,      0x8e
                 .equ    EXIF,       0x91
                 .equ    P0_DIR,     0x94
                 .equ    P0_ALT,     0x95
                 .equ    RADIO,      0xA0
                 .equ    ADCCON,     0xa1
                 .equ    ADCDATAH,   0xa2
                 .equ    ADCDATAL,   0xa3
                 .equ    ADCSTATIC,  0xa4
                 .equ    PWMCON,     0xa9
                 .equ    PWMDUTY,    0xaa
                 .equ    SPI_DATA,   0xb2
                 .equ    SPI_CTRL,   0xb3
                 .equ    SPICLK,     0xb4

                 ljmp    start

start:           mov     P0_ALT, #0x00
                 mov     P0_DIR, #0x40       ; P0.6 is input, the rest output
                 mov     P0, #0x10           ; P0.4 = 1 for the rec/tran strap
                 acall   rf_init             ; Initialize radio
                 jb      P0.6, receiver

trasmitter:      acall   adc_init
                 acall   settxmode
transmitter1:    acall   read_adc
                 acall   tx_packet
                 sjmp    transmitter1

receiver:        acall   pwm_init
                 acall   setrxmode
receiver1:       acall   rx_packet
                 acall   write_pwm
                 sjmp    receiver1

read_adc:        mov     a, EXIF
                 jnb     acc.4, read_adc
                 anl     EXIF, #0xef
                 mov     a, ADCDATAH         ; Read ADC result
                 anl     ADCCON, #0x7f       ; Start new...
                 orl     ADCCON, #0x80       ; ...conversion
                 ret

write_pwm:       mov     PWMDUTY, a
                 ret

rf_init:         setb    RADIO.7             ; Turn on Radio (PWR_UP=1)
                 ; Wait at least 3ms:
                 mov     r1, #150
                 acall   delay10us
                 mov     r1, #150
                 acall   delay10us
                 mov     SPICLK, #0x00       ; SPICLK = CLK/8
                 mov     SPI_CTRL, #0x02     ; Connect SPI to RADIO CH1
                 mov     dptr, #confw
                 mov     a, #0
                 movc    a, @a+dptr          ; Get number of config bytes...
                 mov     r3, a               ; ...and store it in r3
                 setb    RADIO.3             ; RF SPI CS = 1
                 mov     r1, #1
                 acall   delay10us
rf_init1:        inc     dptr                ; Point to next data byte
                 mov     a, #0
                 movc    a, @a+dptr          ; Read next config byte
                 acall   spi_wr              ; Write byte to nrf2401
                 djnz    r3, rf_init1        ; Loop until all bytes are written
                 clr     RADIO.3             ; RF SPI CS = 0
                 ret
 
tx_packet:       setb    P0.0
                 setb    RADIO.6             ; RF CE = 1
                 mov     r7, a
                 mov     r1, #1
                 acall   delay10us
                 mov     dptr, #rxaddr
                 mov     r1, #4
tx_packet1:      mov     a, #0
                 movc    a, @a+dptr          ; Read next address byte
                 acall   spi_wr
                 inc     dptr                ; Point to next address byte
                 djnz    r1, tx_packet1
                 mov     a, r7
                 acall   spi_wr
                 clr     RADIO.6             ; RF CE = 0
                 clr     P0.0
                 ; Wait ~250us:
                 mov     r1, #25
                 acall   delay10us
                 ret

rx_packet:       setb    RADIO.6             ; RF CE = 1
rx_packet1:      jnb     RADIO.2, rx_packet1 ; Wait for RF data ready
                 acall   spi_rd
                 clr     RADIO.6             ; RF CE = 0
                 ret

setrxmode:       mov     r0, #0x01           ; Set RXEN bit
                 ajmp    setrxtxmode
settxmode:       mov     r0, #0x00
setrxtxmode:     mov     dptr, #confw
                 mov     a, #0
                 movc    a, @a+dptr          ; a = #of bytes in 2401 conf word
                 movc    a, @a+dptr          ; Get last byte of conf word
                 setb    RADIO.3             ; RF SPI CS = 1
                 orl     a, r0               ; Tx if r0=0, Rx if r0=1
                 mov     r1, #1
                 acall   delay10us
                 acall   spi_wr              ; Write byte to radio
                 clr     RADIO.3             ; RF SPI CS = 0
                 ret

spi_rd:
spi_wr:          anl     EXIF, #0xdf         ; Clear SPI interrupt
                 mov     SPI_DATA, a         ; Move byte to send into SPI_DATA
spi_rdwr1:       mov     a, EXIF             ; Wait until...
                 jnb     acc.5, spi_rdwr1    ; ...SPI_RX bit is set
                 mov     a, SPI_DATA         ; Move byte received into acc...
                 ret

; adc_init: initialize ADC =====================================================
;
adc_init:        anl     ADCSTATIC, #0xfc    ; 8bit
                 orl     ADCSTATIC, #0x01
                 mov     ADCCON, #0x20       ; Ch 0, NPD=1, ADCRUN=0, EXTREF=0
                 anl     ADCCON, #0x7f       ; Start new...
                 orl     ADCCON, #0x80       ; ...conversion
                 ret


; pwm_init: initialize PWM =====================================================
;
pwm_init:        orl     P0_ALT, #0x80       ; Select P0.7 as PWM output
                 mov     PWMCON, #0xc0       ; Enable 8 bit PWM, pre=min
                 ret

; delay10us: 10 us delay function. Call with the number of 10us in r1 ==========
;
delay10us:       mov     r2, #11
delayl1:         djnz    r2, delayl1
                 nop
                 djnz    r1, delay10us
                 nop
                 ret

confw:           .db     15  ; Number of bytes that follow
                 .db     0x08, 0x08, 0x00, 0x00, 0x00, 0x00
                 .db     0x00, 0x00
rxaddr:          .db     0x87, 0x65, 0x43, 0x21
                 .db     0x83, 0x6c, 0x04

⌨️ 快捷键说明

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