(一)、nRF9E5芯片應用簡述
nRF9E5是一款工作頻率為433/868/915MHz的智能射頻芯片,該芯片采用1.9V~3.6V單電源供電,32腳QFN封裝(5×5mm),發射功率為10dBm,接收靈敏度-100dBm,在低功耗時電流僅2.5μA,在發射功率為-10dBm時的發射電流11mA,接收模式下的電流12.5mA,適用于工業無線傳感器、遙控器和無線報警器等。經測試在沒有建筑物阻擋的情況下,發送端放在辦公室的桌子上,隔一層玻璃,接收端在1000米遠的馬路上能穩定傳輸沒問題,或者在本樓層1至4樓之間傳輸也很好。 下圖所示為nRF9E5的內部結構框圖。nRF9E5是一片嵌入了nRF905無線收發芯片、集成增強型8051微處理器和4個通道的10位ADC,采樣速率為80ksps,內含1.22V電壓基準、電源管理、PWM輸出、UART異步串口、SPI通訊接口、邏輯接口電路、看門夠電路、多通道可編程喚醒,以及CRC檢驗和多點通信控制,高頻電感和濾波器等已經全部內置,外圍元件很少,芯片的一致性能好、穩定且不易受干擾。 nRF9E5沒有復雜的通訊協議,完全對用戶透明,同種產品之間可以自由通訊,內置的CRC糾錯硬件電路和協議免去了軟件開發人員的軟件糾錯編程和微控器的糾錯運算,降低了無線應用的開發難度。 (二)、nRF9E5芯片I/O口設置 nRF9E5有一8 位的通用雙向口(P0口)。另外,4個SPI 也可以用作通用IO口(P1 口)。大部分通用 I/O 口都可以通過編程設置為第二功能,第二功能包括:RXD、TXD,SPI、3個定時器/計數、PWM輸出等。 nRF9E5的P0 口通過 P0_ALT 和 P0_DIR 進行設置。若 P0_ALT.n = 1,則引腳P0.n 具有UART、外部中斷、定時器輸入或脈寬調制輸出功能; RXD方向取決于 P0_DIR.1 的值。若要使用 INT0_N 或INT1_N作為中斷,則必須使用 P0_ALT.3 / P0_ALT.4 的第二功能。若未置 P0_ALT.n=1,則相應的 P0.n 作為通用 IO 口使用, 其方向由P0_DIR.n 確定。如下表所示:
表9 P0 口功能設置表 P1 口有4 個引腳,當SPI_CTRL=01時是作SPI 口用。。引腳EECSN作為EEPROM 的片選信號,MOSI作為SPI輸出,MISO作為SPI輸入,SCK作為SPI時鐘。將SPI_CTRL設為不等于01時,若P1_ALT.n 設為0則P1.0--P1.3為通用 IO 口,此時 P1_DIR.n 決定是輸入還是輸出口,見下表。 無線收發器是由 P2 口來控制的,P2口的地址與 8051相同。但是因無線收發器集成在片內,P2口不再是雙向口。為了匹配無線電收發器子系統的需要,P2 口鎖存電壓值與標準8051也有所不同。無線收發器是通過 P2 口特殊功能寄存器的SPI_CTRL 來控制的,如下表所示: SFR 地址 | | | | | | | | | | | NRF905 無線電收發器和AD 轉換器子系統的 IO 接口 | | | | | | 00->不用SPI 01->SPI 與端口P1 相連接 1x->SPI 與nRF905/AD相連接 |
P2 寄存器位:功能 | | | | | | | | | | | |
| 2: nRF905收發器和ADC SPI 數據輸出(SBMISO) | | |
| |
| | |
| |
| | | | | 3: nRF905收發器和ADC SPI 芯片選擇(SBCSN) | | |
| 1: nRF905收發器和ADC SPI 數據 (SBMOSI) | | 0: nRF905收發器和ADC SPI 時鐘(SBSCK) | | (三)、nRF9E5芯片A/D口轉換
nRF9E5的AD轉換器是一個10位的線性轉換器,在低頻信號及濾波器的作用下可以增大到12位。AD轉換器的基準電壓是:AREF或內部帶隙參考電壓(1.22V)。 默認狀態下AD 轉換器是 10位的,如有特殊要求,也可以設置成6,8,12位轉換模式。AD轉換器也可以應用在其它模式下,比如 AIN0 輸入一負電壓,AIN1~AIN3作為放大輸入端。 AD 轉換器有兩個寄存器ADC_CONFIG_REG 和 ADC_DATA_REG。輸入頻道的選擇直接由 START_ADC_CONV 控制,CHSEL 的值從0 到 3 分別對應選擇 AIN0 到AIN3, 若CHSEL 設置為 1xxx 則nRF9E5 提供給 AD轉換器內部電壓:VDD/3~1.22V。 AD 轉換的結果將保存在ADC_DATA_REG 寄存器中。數據存儲形式如下表所示由ADC_RL_JUST來決定。
溢出狀態保存在STATUS_REGISTER寄存器中的 ADC_RFLAG 中。當 ADC_PWR_UP=0時,AD轉換器功能被禁止。 使用內部參考電壓時的測量值:當VFSSEL=0,CHSEL選擇一個輸入AINi(AIN0到 AIN3),AD轉換的結果 ADCDATA 與 VAINi/1.22成正比:
ADC-配置寄存器說明 參數 | | | | | 當 ADCRUN 無效時,此信號的上升沿將啟動AD 轉換, | | | 有效時,AD 轉換器連續轉換。此時可忽視CSTARTN 的狀態 | | | | | | AD 轉換器參考電壓選擇 0:內部帶隙參考電壓(1.22V) 1:外部引腳AREF 參考電壓(如果CHSEL=[1xxx],不考慮VFSSEL狀態) | | | 輸入通道選擇: 0000:AIN0 0001: AIN1 0010:AIN2 0011:AIN3 1xxx:內部 VDD/3 | | | A/D 轉換器分辨率: 00:6 位 01:8 位 10:10 位 11:12 位 | | | 使能差分測量,AIN0 輸入一負電壓,AIN1~AIN3 作為放大輸入端, | | | 選擇向左或者向右數據存放格式 0:數據向左存放 1:數據向右存放 |
狀態寄存器說明 參數 | | | | | 地址匹配,接收到與本機地址匹配的地址數據。(見 9.8章) | | | 載波檢測,接收到相同頻率的載波.詳細說明見9.7 章. | | | 數據就緒,接收到一包有效數據(地址和 CRC 校驗正確)(見 9.9章) | | | 轉換結束,表明 AD 轉換已經完成,數據存儲在ADC_DATA_REG 里. | | | ADC 溢出標志: RFLAG[2]:未溢出(ADCDATA=0)RFLAG[1]:溢出(ADCDATA=2n-1) RFLAG[0]:溢出部分=RFLAG[1]或者RFLAG[2] |
EXIF 特殊功能寄存器控制字
位 | | | IE5-中斷5 標志位。IE5=1 則探測AM 信號上升沿(見P2)。IE5必須由軟件清0。使能后軟件 設置產生中斷 | | IE4-中斷4 標志位。IE4=1則探測 DR 信號上升沿.(見P2)。.IE4必須由軟件清 0。使能后軟件 設置產生中斷 | | IE3-中斷3 標志位。IE3=1表明內部SPI 模塊已發射或接收了 8 位數據,等待新指令。.IE3必 須由軟件清 0。使能后軟件設置產生中斷 | | IE2-中斷2 標志位。IE2=1則探測 ADC’s 的EOC 信號上升沿(見第10章)。IE2必須由軟件清 0。使能后軟件設置產生中斷 | | | | |
(四)、nRF9E5芯片用戶程序 nRF9E5的主程序存放在外部的串行EEPROM中,當芯片開始上電時,其內部固化的廠家引導程序通過SPI接口,將外部EEPROM中的主程序導入nRF9E5的RAM中(4K字節空間,沒有被主程序占用的可作為片內RAM使用),接著執行跳轉指令,開始主程序的運行。主程序需要按照下表所示的規則寫入EEPROM中,其中SPEED(bit3)為EEPROM的最大讀寫速度,0為1MHz,1為0.5MHz。XO_FREQ(bit2,1,0)為nRF9E5的外接晶振的頻率,000=4MHz,001=8MHz,010=12MHz,011=16MHz,100=20MHz。

在用編程器寫程序時,前3個單元是0B0302,后面是主程序。其中0BH=00001011代表speed=1,XO_FREQ =011表示外接晶振是16MHz,03代表應用程序起始偏移量,02代表主程序的256字節區,見下圖。
nRF9E5發送數據程序 ;開機進行鍵掃描,有按鍵按下,就把該鍵值(10h,20h,40h)送出20個,然后等待接收20個字符;接收到20個字符后,把這些數據送串口發送到微機里,用串口調試助手可以檢查接收情況。
PWMCON EQU 0A9h
PWMDUTY EQU 0AAh
REGX_MSB EQU 0ABh
REGX_LSB EQU 0ACh
REGX_CTRL EQU 0ADh
RSTREAS EQU 0B1h
SPI_DATA EQU 0B2h
SPI_CTRL EQU 0B3h
SPICLK EQU 0B4h
TICK_DV EQU 0B5h
CK_CTRL EQU 0B6h
CKLFCON EQU 0BFh
EXIF EQU 91h
EIE EQU0E8h
CKCON EQU 8EH
SPI_SCK EQU P2.0
SPI_MOSI EQU P2.1
RACSN EQU P2.3
TXEN EQU P2.4
TRX_CE EQU P2.5
SPI_MISO EQU P2.2
EOC EQU P2.4
DR EQU P2.5
CD EQU P2.6
AM EQU P2.7
P0_DRV EQU93H
P0_DIR EQU 94H
P0_ALT EQU 95H
P1_DIR EQU 96H
P1_ALT EQU 97H
KeyValue EQU 20H
L0 EQU KeyValue.4 ;L0=1,(20H)=10H
L1 EQU KeyValue.5 ;L1=1,(20H)=20H
L2 EQU KeyValue.6 ;L2=1,(20H)=40H
S0 EQU P0.5
S1 EQU P0.6
S2 EQU P0.7
LED0 EQU P0.0
LED1 EQU P0.3
LED2 EQU P0.4
BZW EQU 12H ;設一個標志位
ORG 0000H
LJMP MAIN
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG004BH
RETI
ORG 0050H
;串口發送數據到pc
PutChar: CLR ES
MOV SBUF ,R7
JNB TI, $ ;串口發送無線收到的R7鍵值(10H,20H,40H)
CLR TI
SETB ES
RET
;初始化子程序
Init: MOV SP,#60H ;設堆棧指針
MOV TH1,#0F3h ;波特率19200,N,8,1
MOV TL1,#0F3h ;波特率19200,N,8,1 ;;;;;;
ORL CKCON,#10H ;T1M=1,1/4時鐘
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV SCON,# 50h ; Timer1 8bit auto reload ,方式1,REN=1,TI=1
MOV TMOD,#21h ;
SETB TR1 ;啟動定時器1
ORL P0_ALT,#06h ; P0.0 out,P0.1 input(RXD),P0.2(TXD) P0.3P0.4輸出,,P0.5 P0.6 P0.7輸入
MOV P0_DIR,#0E2h
MOV SPICLK,#01h ; Connect internal SPI controller toRadio
MOV SPI_CTRL,#02h
SETB LED0 ;燈滅
SETB LED1
SETB LED2
MOV BZW,#00H
CLR RACSN ;SPI片選有效
MOV R7,#19h ;讀RF配置寄存器10-19為讀命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV A,R7
ORL A,#0CH ;讀結果送R6也就是送到06H單元
MOV R6,A
SETB RACSN
CLR RACSN
MOV R7,#09h ;00-09寫RF配置寄存器命令
LCALL SpiReadWrite
MOV R7,06h
LCALL SpiReadWrite ;把讀出的結果寫回
SETB RACSN
CLR RACSN ; Write to RF config address 3 (RX payload)
MOV R7,#03H ;配置RX_PWR,初值20H,32個字節03h是3個字節
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
SETB RACSN
CLR RACSN
MOV R7,#11h ;Read RF config address 1
LCALL SpiReadWrite ;讀配置寄存器。0001aaaa,aaaa指出讀操作的開始字節,
CLR A ;字節數量取決于aaaa指出的開始地址。
MOV R7,A
LCALL SpiReadWrite ;寫配置寄存器。0000aaaa,aaaa指出寫操作的開始字節,
MOV A,R7 ; 字節數量取決于aaaa指出的開始地址.
ANL A,#0F0H
MOV R6,A
SETB RACSN
CLR RACSN ; Write RF config address 0
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV R7,#05Fh
LCALL SpiReadWrite
MOV A,R6
ORL A,#0Dh
MOV R7,A
LCALL SpiReadWrite
MOV R7,#44h ;44接收、發送地址長度
LCALL SpiReadWrite
MOV R7,#01H ;01h為1字節有效20h是32字節有效
LCALL SpiReadWrite
MOV R7,#01h
LCALL C0185
SETB RACSN
SETB EA
SETB ES ;
RET
;掃描鍵盤子程序
ScanKey: CLR A ;掃描鍵盤即掃描3個按鈕,獲取鍵值
MOV KeyValue,A ;沒有鍵盤按下轉c00b1
JB S0,C00B1
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤按下LED0燈亮延時后熄滅
MOV R7,#1AH
LCALL Delayms
SETB LED0
C00B1:JB S1,C00BF ;L1按下Keyvalue=20h,L0=Keyvalue.5
SETB L1
CLR LED1
MOV R7,#1AH
LCALL Delayms
SETB LED1
C00BF:JB S2 ,C00CD
SETB L2 ;L2按下Keyvalue=40h,L0=Keyvalue.6
CLR LED2
MOV R7,#1AH
LCALL Delayms
SETB LED2
C00CD: MOV A,KeyValue
JZ C00D9
FS: MOV R2,#20H ;發送20個字節
FS1: MOV A,KeyValue
MOV R7,A ;獲取的鍵值送R7
SETB TXEN ;發送使能
LCALL TransmitPacket ;調用發射程序包
CLR TXEN
MOV R7,#2AH
LCALL Delay100us
DJNZ R2,FS1
C00D9: RET
;無線接收子程序
ReceivePacket: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,C010E
CLR RACSN
MOV R7,#24H ;讀接收數據命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV KeyValue,R7
INC BZW
JNB L0,C00F9 ;對接收數據進行計數
CLR LED0 C00F9: JNB L1,C00FE
CLR LED1
C00FE: JNB L2,C0103
CLR LED2
C0103: MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C010E: RET
;無線發送子程序
TransmitPacket: MOV R5,07H ; Spi enable for write a spi command
CLR RACSN ;Writeaddress command
MOV R7,#22H ;寫發送地址命令22H
LCALL C0185 ;E7,E7,E7,E7 TX_ADDRESS
SETB RACSN
MOV R7,#01H ;延時100微秒
LCALL Delay100us
CLR RACSN
MOV R7,#20H ;寫發送數據命令20H
LCALL SpiReadWrite
MOV R7,05H ;保存在R5中的鍵值送R7發送
LCALL SpiReadWrite
SETB RACSN
SETB TRX_CE
MOV R7,#0AH ;發送后延時
LCALL Delay100us
CLR TRX_CE
C0136: JNB TRX_CE,C0136 ;等待發送完畢
RET
;主程序
main: LCALL Init ;主程序,現調用初始化程序
CLR LED0 ;3個燈陸續點亮后熄滅
MOV R7,#0AH
LCALL Delayms
CLR LED1
MOV R7,#0AH
LCALL Delayms
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
Q: MOVA,#20H
MOVR2,#60D ;清數據區
MOV R0,#13H
QING: MOV@R0,A ;清數據區
INC R0
DJNZ R2,QING
C0158: LCALL ScanKey ;掃描鍵盤等待接受數據
MOV A,KeyValue
JZ C0158
MOV R0,#30H
AJMPFH ;等待接收數據
CLR A ;掃描鍵盤即掃描3個按鈕,獲取鍵值
MOV KeyValue,A ;沒有鍵盤按下轉c00b1
JB S0,C0158
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤按下LED0燈亮延時后熄滅
MOV R7,#0AH
LCALL Delayms
SETB LED0
MOV A,KeyValue
JZ C0158
FH: SETB TRX_CE ; nRF905 收發器使能,接收器功能
JNB TRX_CE,FH
CLR RACSN
MOV R7,#24H ;讀接收數據命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN ;SPI片選有效
CLR TRX_CE
MOV A,R7
MOV @R0,A
MOV R7,#05H ;延時100微秒
LCALL Delay100us
INC BZW
INC R0
MOV A,BZW
XRL A,#20D
JZ FH0
AJMP FH
FH0: MOVR2,#20D ; OK
MOV R0,#30H
CLR LED0
FH1: MOV A,@R0
MOV R7,A
LCALL PutChar
INC R0
DJNZ R2,FH1
LCALL Delay
MOV BZW,#0
SETB LED0
LCALL Delay
LJMP C0158
C0185: LCALL SpiReadWrite ;寫發送數據地址
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
SpiReadWrite: ANL EXIF,#0DFH ;Move byte to send to SPI data register
MOV SPI_DATA,R7 ;讀寫SPI數據
C019E: MOV A,EXIF
JNB 0E0H.5,C019E
MOV R7,SPI_DATA
RET
Delayms: MOV 10H,R7 ;延時子程序
C01A8: MOV R7, 10H
DEC 10H
MOV A,R7
JZ C01BF
CLR A
MOV R5,A
C01B1: MOV A,R5
CLR C
SUBB A,#0AH
JNC C01A8
MOV R7,#0AH
LCALL Delay100us
INC R5
SJMP C01B1
C01BF: RET
Delay100us: MOV 11H,R7
Delay100us1: MOV R7, 11H
DEC 11H
MOV A,R7
JZ C021D
CLR A
MOV R6,A
Delay100us2: MOV A,R6
CLR C
SUBB A,#23H
JNC Delay100us1
INC R6
SJMP Delay100us2
C021D: RET
DELAY: MOV 70H,#0FFH
DELAY1: LCALL DELAY2
DJNZ 70H,DELAY1
RET
DELAY2: MOV 71H,#0FFH
DELAY3: NOP
DJNZ 71H,DELAY3
RET
END
nRF9E5接收數據程序示例 ;開機等待接收20個字符,送到30h起始的單元中,然后再把這些數據發送出去
PWMCON EQU 0A9h
PWMDUTY EQU 0AAh
REGX_MSB EQU 0ABh
REGX_LSB EQU 0ACh
REGX_CTRL EQU 0ADh
RSTREAS EQU 0B1h
SPI_DATA EQU 0B2h
SPI_CTRL EQU 0B3h
SPICLK EQU 0B4h
TICK_DV EQU 0B5h
CK_CTRL EQU 0B6h
CKLFCON EQU 0BFh
EXIF EQU 91h
EIE EQU 0E8h
CKCON EQU 8EH
SPI_SCK EQU P2.0
SPI_MOSI EQU P2.1
RACSN EQU P2.3
TXEN EQU P2.4
TRX_CE EQU P2.5
SPI_MISO EQU P2.2
EOC EQU P2.4
DR EQU P2.5
CD EQU P2.6
AM EQU P2.7
P0_DRV EQU93H
P0_DIR EQU 94H
P0_ALT EQU 95H
P1_DIR EQU 96H
P1_ALT EQU 97H
KeyValue EQU 20H
L0 EQU KeyValue.4 ;L0=1,(20H)=10H
L1 EQU KeyValue.5 ;L1=1,(20H)=20H
L2 EQU KeyValue.6 ;L2=1,(20H)=40H
S0 EQU P0.5
S1 EQU P0.6
S2 EQU P0.7
LED0 EQU P0.0
LED1 EQU P0.3
LED2 EQU P0.4
BZW EQU 12H ;設一個標志位
ORG0000H
LJMP MAIN
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 004BH
RETI
ORG 0050H
PutChar: CLR ES
MOV SBUF ,R7
JNB TI, $ ;串口發送無線收到的R7鍵值(10H,20H,40H)
CLR TI
SETB ES
RET
Init: MOV SP,#60H ;設堆棧指針
MOV TH1,#0F3h ;波特率19200,N,8,1
MOV TL1,#0F3h ;波特率19200,N,8,1 ;;;;;;
ORL CKCON,#10H ;T1M=1,1/4時鐘
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV SCON,# 50h ; Timer1 8bit auto reload ,方式1,10位UART波特率可變,波特率受MSOD影響,REN=1,TI=1
MOV TMOD,#21h ; Timer1 8bit auto reload 20---21;;;;;;
SETB TR1 ;啟動定時器1
ORL P0_ALT,#06h ; P0.0 out,P0.1 input(RXD),P0.2(TXD) P0.3 P0.4輸出,,P0.5 P0.6P0.7輸入
MOV P0_DIR,#0E2h
MOV SPICLK,#01h ; Connect internal SPI controller to Radio
MOV SPI_CTRL,#02h
SETB LED0 ;燈滅
SETB LED1
SETB LED2
MOV BZW,#00H
CLR RACSN ;SPI片選有效
MOV R7,#19h ;讀RF配置寄存器10-19為讀命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV A,R7
ORL A,#0CH ;讀結果送R6也就是送到06H單元
MOV R6,A
SETB RACSN
CLR RACSN
MOV R7,#09h ;00-09寫RF配置寄存器命令
LCALL SpiReadWrite
MOV R7,06h
LCALL SpiReadWrite ;把讀出的結果寫回
SETB RACSN
CLR RACSN ; Write to RF config address 3 (RX payload)
MOV R7,#03H ;配置RX_PWR,初值20H,32個字節01h是1個字節
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
SETB RACSN
CLR RACSN
MOV R7,#11h ;Read RF config address 1
LCALL SpiReadWrite ;讀配置寄存器。0001aaaa,aaaa指出讀操作的開始字節,
CLR A ;字節數量取決于aaaa指出的開始地址。
MOV R7,A
LCALL SpiReadWrite ;寫配置寄存器。0000aaaa,aaaa指出寫操作的開始字節,
MOV A,R7 ;字節數量取決于aaaa指出的開始地址.
ANL A,#0F0H
MOV R6,A
SETB RACSN
CLR RACSN ; Write RF config address 0
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV R7,#05Fh
LCALL SpiReadWrite
MOV A,R6
ORL A,#0Dh
MOV R7,A
LCALL SpiReadWrite
MOV R7,#44h ;44接收、發送地址長度
LCALL SpiReadWrite
MOV R7,#01H ;01h為1字節有效20h是32字節有效
LCALL SpiReadWrite
MOV R7,#01h
LCALL C0185
SETB RACSN
SETB EA
SETB ES ;
RET
ScanKey: CLR A ;掃描鍵盤即掃描3個按鈕,獲取鍵值
MOV KeyValue,A ;沒有鍵盤按下轉c00b1
JB S0,C00B1
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤按下LED0燈亮延時后熄滅
MOV R7,#0AH
LCALL Delayms
SETB LED0
C00B1: JB S1,C00BF ;L1按下Keyvalue=20h,L0=Keyvalue.5
SETB L1
CLR LED1
MOV R7,#0AH
LCALL Delayms
SETB LED1
C00BF: JB S2 ,C00CD
SETB L2 ;L2按下Keyvalue=40h,L0=Keyvalue.6
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED2
C00CD: MOV A,KeyValue
JZ C00D9
FS: SETB TXEN ;發送使能
MOV R7,A ;獲取的鍵值送R7
MOV R2,#20H ;發送20個字節
FS1: LCALL TransmitPacket ;調用發射程序包
DJNZ R2,FS1
CLR TXEN
C00D9: RET
ReceivePacket: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,C010E
CLR RACSN
MOV R7,#24H ;讀接收數據命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV KeyValue,R7
INC BZW
JNB L0,C00F9 ;對接收數據進行計數
CLR LED0 C00F9: JNB L1,C00FE
CLR LED1
C00FE: JNB L2,C0103
CLR LED2
C0103: MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C010E: RET
TransmitPacket:MOV R5,07H ; Spi enable for write a spi command
CLR RACSN ;Writeaddress command
MOV R7,#22H ;寫發送地址命令22H
LCALL C0185 ;E7,E7,E7,E7 TX_ADDRESS
SETB RACSN
MOV R7,#01H ;延時100微秒
LCALL Delay100us
CLR RACSN
MOV R7,#20H ;寫發送數據命令20H
LCALL SpiReadWrite
MOV R7,05H ;保存在R5中的鍵值送R7發送
LCALL SpiReadWrite
SETB RACSN
SETB TRX_CE
MOV R7,#0AH ;發送后延時
LCALL Delay100us
CLR TRX_CE
C0136: JNB TRX_CE,C0136 ;等待發送完畢
RET
main: LCALL Init ;主程序,現調用初始化程序
CLR LED0 ;3個燈陸續點亮后熄滅
MOV R7,#0AH
LCALL Delayms
CLR LED1
MOV R7,#0AH
LCALL Delayms
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C0158: LCALL ScanKey ;掃描鍵盤等待接受數據
Q: MOVA,#20H
MOVR2,#60D ;清數據區
MOV R0,#13H
QING: MOV@R0,A ;清數據區
INC R0
DJNZ R2,QING
MOV R0,#30H
MOV R2,#20D
AJMPFH ;等待接收數據
FCBQ1: MOV R0,#30H
MOV R2,#20D
FCBQ2: MOV A,@R0
SETB TXEN ;發送使能
MOV R7,A ;獲取的鍵值送R7
LCALL TransmitPacket ;調用發射程序包
CLR TXEN
MOV R7,#0AH ;必須加延時,否則收不到
LCALL Delay100us
INC R0
DJNZ R2,FCBQ2
CLR LED0
LCALL Delay
SETB LED0
MOV BZW,#0
LJMP C0158
FH: MOV R0,#30H
JS0: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,JS0
CLR RACSN
MOV R7,#24H ;讀接收數據命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV A,R7
MOV @R0,A
XRL A,#10H
JNZ JS1
CLR LED0 ;;;;;;
AJMP JS3
JS1: MOV A,R7
XRLA,#20H
JNZ JS2
CLR LED1 ;;;;;;
JS2: MOV A,R7
XRL A,#40H
JNZ JS3
CLR LED2 ;;;;;;
JS3: MOV R7,#0AH ;延時100微秒
LCALL Delay100us
INC BZW
INC R0
MOV A,BZW
XRL A,#20D
JZ FH2
AJMP JS0
FH0: MOV R2,#20D
MOV R0,#30H
FH1: MOV A,@R0
MOV R7,A
LCALL PutChar
INC R0
DJNZ R2,FH1
LCALL Delay
MOV BZW,#0
SETB LED0
FH2: LCALL Delay
LCALL Delay
LCALL Delay
LCALL Delay
SETB LED0
SETB LED1
SETB LED2
LJMP FCBQ1
C0185: LCALL SpiReadWrite ;寫發送數據地址
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
SpiReadWrite: ANL EXIF,#0DFH ;Move byte to send to SPI data register
MOV SPI_DATA,R7 ;讀寫SPI數據
C019E: MOV A,EXIF
JNB 0E0H.5,C019E
MOV R7,SPI_DATA
RET
Delayms: MOV 10H,R7 ;延時子程序
C01A8: MOV R7, 10H
DEC 10H
MOV A,R7
JZ C01BF
CLR A
MOV R5,A
C01B1: MOV A,R5
CLR C
SUBB A,#0AH
JNC C01A8
MOV R7,#0AH
LCALL Delay100us
INC R5
SJMP C01B1
C01BF: RET
Delay100us: MOV 11H,R7
Delay100us1: MOV R7, 11H
DEC 11H
MOV A,R7
JZ C021D
CLR A
MOV R6,A
Delay100us2: MOV A,R6
CLR C
SUBB A,#23H
JNC Delay100us1
INC R6
SJMP Delay100us2
C021D: RET
DELAY: MOV70H,#0FFH
DELAY1: LCALL DELAY2
DJNZ70H,DELAY1
RET
DELAY2: MOV 71H,#0FFH
DELAY3: NOP
DJNZ71H,DELAY3
RET
END
nRF9E5A/D轉換程序(無線溫度計程序)
;開機定時器工作35h為0時,a/d轉換采集20個數據后,無線發送40h單元開始的20個數據。
PWMCON EQU 0A9h
PWMDUTY EQU 0AAh
REGX_MSB EQU 0ABh
REGX_LSB EQU 0ACh
REGX_CTRL EQU 0ADh
RSTREAS EQU 0B1h
SPI_DATA EQU 0B2h
SPI_CTRL EQU 0B3h
SPICLK EQU 0B4h
TICK_DV EQU 0B5h
CK_CTRL EQU 0B6h
CKLFCON EQU 0BFh
EXIF EQU 91h
EIE EQU 0E8h
CKCON EQU 8EH
SPI_SCK EQU P2.0
SPI_MOSI EQU P2.1
RACSN EQU P2.3
TXEN EQU P2.4
TRX_CE EQU P2.5
SPI_MISO EQU P2.2
EOC EQU P2.4
DR EQU P2.5
CD EQU P2.6
AM EQU P2.7
P0_DRV EQU93H
P0_DIR EQU 94H
P0_ALT EQU 95H
P1_DIR EQU 96H
P1_ALT EQU 97H
KeyValue EQU 20H
L0 EQU KeyValue.4 ;L0=1,(20H)=10H
L1 EQU KeyValue.5 ;L1=1,(20H)=20H
L2 EQU KeyValue.6 ;L2=1,(20H)=40H
S0 EQU P0.5
S1 EQU P0.6
S2 EQU P0.7
LED0 EQU P0.0
LED1 EQU P0.3
LED2 EQU P0.4
BZW EQU 12H ;設一個標志位
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP C1
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 004BH
RETI
ORG 0050H
C1: CPLLED0
MOV TH0,#0BH
MOV TL0, #06H
INC 2FH
MOV A,2FH
CJNE A, #32H, C2
MOV 2FH, #00H
INC 35H ;秒個位加1
MOV A,35H
CJNE A, #0AH, C2
MOV 35H, #00H
INC 34H ;秒十位加1
MOV A,34H;
C2: RETI
PutChar: PUSH ACC
CLR ES
MOV SBUF ,R7
JNB TI, $ ;串口發送無線收到的R7鍵值(10H,20H,40H)
CLR TI
SETB ES
POP ACC
RET
JSSJ: CLR EIE.1 ;INT3中斷使能位,禁止中斷
CLR LED1
INCBZW
MOVA,EXIF ;EXIF.5INT3中斷標志位
JNB ACC.5 ,$ ;串口發送無線收到的R7鍵值(10H,20H,40H)
SETB ACC.5
MOV EXIF,A
SETBEIE.1 ;INT3中斷使能,即允許中斷
RETI
Init: MOV SP,#60H ;設堆棧指針
MOV TH1,#0F3h ;波特率19200,N,8,1
; MOV TL1,#0F3h ;波特率19200,N,8,1 ;;;;;;
MOV TH0, #3CH
MOV TL0, #0c0h;
ORL CKCON,#10H ;T1M=1,1/4時鐘
MOV PCON,#80H ;SMOD=1,波特率加倍
MOV SCON,# 50h ; Timer1 8bit auto reload ,方式1,10位UART波特率可變,波特率受MSOD影響,REN=1,TI=1
MOV TMOD,#21h ; Timer1 8bit auto reload 20---21;;;;;;
SETB TR1 ;啟動定時器1
ORL P0_ALT,#06h ; P0.0 out,P0.1 input(RXD),P0.2(TXD) P0.3 P0.4輸出,,P0.5 P0.6P0.7輸入
MOV P0_DIR,#0E2h
MOV SPICLK,#01h ; Connect internal SPI controller to Radio
MOV SPI_CTRL,#02H;02h
SETB LED0 ;燈滅
SETB LED1
SETB LED2
MOV BZW,#00H
CLR RACSN ;SPI片選有效
MOV R7,#19h ;讀RF配置寄存器10-19為讀命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV A,R7
ORL A,#0CH ;讀結果送R6也就是送到06H單元
MOV R6,A
SETB RACSN
CLR RACSN
MOV R7,#09h ;00-09寫RF配置寄存器命令
LCALL SpiReadWrite
MOV R7,06h
LCALL SpiReadWrite ;把讀出的結果寫回
SETB RACSN
CLR RACSN ; Write to RF config address 3 (RX payload)
MOV R7,#03H ;配置RX_PWR,初值20H,32個字節01h是1個字節
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
MOV R7,# 01h
LCALL SpiReadWrite
SETB RACSN
CLR RACSN
MOV R7,#11h ;Read RF config address 1
LCALL SpiReadWrite ;讀配置寄存器。0001aaaa,aaaa指出讀操作的開始字節,
CLR A ;字節數量取決于aaaa指出的開始地址。
MOV R7,A
LCALL SpiReadWrite ;寫配置寄存器。0000aaaa,aaaa指出寫操作的開始字節,
MOV A,R7 ; 字節數量取決于aaaa指出的開始地址.
ANL A,#0F0H
MOV R6,A
SETB RACSN
CLR RACSN ; Write RF config address 0
CLR A
MOV R7,A
LCALL SpiReadWrite
MOV R7,#05Fh
LCALL SpiReadWrite
MOV A,R6
ORL A,#0Dh
MOV R7,A
LCALL SpiReadWrite
MOV R7,#44h ;44接收、發送地址長度
LCALL SpiReadWrite
MOV R7,#01H ;01h為1字節有效20h是32字節有效
LCALL SpiReadWrite
MOV R7,#01h
LCALL C0185
SETB RACSN
InitADC: CLR RACSN ;Configure and turn on ADC
MOV R7,#44h
LCALL SpiReadWrite
MOV R7,#35H ;Select AIN3, PWR_UP = 1, VFSEL=0;
LCALL SpiReadWrite
MOV R7,#09H;0BH ;Set RES_CTRL = 3, 11位,Rightjustified
LCALL SpiReadWrite
SETB RACSN
SETB EA
SETB ES ;EA, ES, EX1, ET0, EX0;;;;;;
SETB ET0
SETB 0BCH ;通信中斷優先,IP中PS置1
RET
ScanKey: CLR A ;掃描鍵盤即掃描3個按鈕,獲取鍵值
MOV KeyValue,A ;沒有鍵盤按下轉c00b1
JB S0,C00B1
SETB L0 ;L0按下Keyvalue=10h,L0=Keyvalue.4
CLR LED0 ;1鍵盤按下LED0燈亮延時后熄滅
MOV R7,#1AH
LCALL Delayms
SETB LED0
C00B1: JB S1,C00BF ;L1按下Keyvalue=20h,L0=Keyvalue.5
SETB L1
CLR LED1
MOV R7,#1AH
LCALL Delayms
SETB LED1
C00BF: JB S2 ,C00CD
SETB L2 ;L2按下Keyvalue=40h,L0=Keyvalue.6
CLR LED2
MOV R7,#1AH
LCALL Delayms
SETB LED2
C00CD: MOV A,KeyValue
JZ C00D9
FS: MOV R2,#20H ;發送20個字節
FS1: MOV A,KeyValue
MOV R7,A ;獲取的鍵值送R7
SETB TXEN ;發送使能
LCALL TransmitPacket ;調用發射程序包
CLR TXEN
MOV R7,#2AH
LCALL Delay100us
DJNZ R2,FS1
C00D9: RET
ReceivePacket: SETB TRX_CE ;等待接收完畢
JNB TRX_CE,C010E
CLR RACSN
MOV R7,#24H ;讀接收數據命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV KeyValue,R7
INC BZW
JNB L0,C00F9 ;對接收數據進行計數
CLR LED0
C00F9: JNB L1,C00FE
CLR LED1
C00FE: JNB L2,C0103
CLR LED2
C0103: MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
C010E: RET
TransmitPacket:MOV R5,07H ; Spi enable for write a spi command
CLR RACSN ;Writeaddress command
MOV R7,#22H ;寫發送地址命令22H
LCALL C0185 ;E7,E7,E7,E7 TX_ADDRESS
SETB RACSN
MOV R7,#01H ;延時100微秒
LCALL Delay100us
CLR RACSN
MOV R7,#20H ;寫發送數據命令20H
LCALL SpiReadWrite
MOV R7,05H ;保存在R5中的鍵值送R7發送
LCALL SpiReadWrite
SETB RACSN
SETB TRX_CE
MOV R7,#0AH ;發送后延時
LCALL Delay100us
CLR TRX_CE
C0136: JNB TRX_CE,C0136 ;等待發送完畢
RET
main: LCALL Init ;主程序,現調用初始化程序
CLR LED0 ;3個燈陸續點亮后熄滅
MOV R7,#0AH
LCALL Delayms
CLR LED1
MOV R7,#0AH
LCALL Delayms
CLR LED2
MOV R7,#0AH
LCALL Delayms
SETB LED0
SETB LED1
SETB LED2
Q: MOV A,#0H
MOVR2,#60D ;清數據區
MOV R0,#12H
QING: MOV@R0,A ;清數據區
INC R0
DJNZ R2,QING
SETB TR0
C0158: SETB TR0;
MOV A,35H
CJNE A, #0AH, C0158
CLR TR0
LCALL StartADC
MOV A,40H
MOV R7,A
CPL LED1
CLR TR0
FCBQ1: MOV R0,#40H
MOV R2,#20D
FCBQ2: MOV A,@R0
SETB TXEN ;發送使能
MOV R7,A ;獲取的鍵值送R7
LCALL TransmitPacket ;調用發射程序包
CLR TXEN
MOV R7,#0AH ;必須加延時,否則收不到
LCALL Delay100us
INC R0
DJNZ R2, FCBQ2
LCALL Delay
MOV BZW,#0
SETB TR0
LJMP C0158
FH: SETB TRX_CE ;等待接收完畢 OK
JNB TRX_CE,FH
CLR RACSN
MOV R7,#24H ;讀接收數據命令
LCALL SpiReadWrite
CLR A
MOV R7,A
LCALL SpiReadWrite
SETB RACSN
CLR TRX_CE
MOV A,R7
MOV @R0,A
MOV R7,#05H ;延時100微秒
LCALL Delay100us
INC BZW
INC R0
MOV A,BZW
XRL A,#20D
JZ FH0
AJMP FH
FH0: MOVR2,#20D ; OK
MOV R0,#30H
CLR LED0
FH1: MOV A,@R0
MOV R7,A
LCALL PutChar
INC R0
DJNZ R2,FH1
LCALL Delay
MOV BZW,#0
SETB LED0
FH2: ; LCALLDelay
LCALL Delay
LJMP C0158
StartADC: MOV R2,#20
MOV R0,#40H;PUSH ACC
ADC20: CLR RACSN
MOV R7,#0C3h ;START_ADC_CONV(SAV)1100-SSSS=CHSEL=3通道
LCALL SpiReadWrite
SETB RACSN
JNB EOC, $
CLR RACSN
MOV R7,#40h
LCALL SpiReadWrite
MOV R7,#0FFH
LCALL SpiReadWrite
MOV A,R7;07H ;
MOV @R0,A ;
INC R0
DJNZ R2,ADC20
cpl led2
RET
C0185: LCALL SpiReadWrite ;寫發送數據地址
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
LCALL SpiReadWrite
MOV R7,#0E7H
SpiReadWrite: ANL EXIF,#0DFH ;Move byte to send to SPI data register
MOV SPI_DATA,R7 ;讀寫SPI數據
C019E: MOV A,EXIF
JNB 0E0H.5,C019E
MOV R7,SPI_DATA
RET
Delayms: MOV 10H,R7 ;延時子程序
C01A8: MOV R7, 10H
DEC 10H
MOV A,R7
JZ C01BF
CLR A
MOV R5,A
C01B1: MOV A,R5
CLR C
SUBB A,#0AH
JNC C01A8
MOV R7,#0AH
LCALL Delay100us
INC R5
SJMP C01B1
C01BF: RET
Delay100us: MOV 11H,R7
Delay100us1: MOV R7, 11H
DEC 11H
MOV A,R7
JZ C021D
CLR A
MOV R6,A
Delay100us2: MOV A,R6
CLR C
SUBB A,#23H
JNC Delay100us1
INC R6
SJMP Delay100us2
C021D: RET
DELAY: MOV 70H,#0FFH
DELAY1: LCALL DELAY2
DJNZ 70H,DELAY1
RET
DELAY2: MOV 71H,#0FFH
DELAY3: NOP
DJNZ 71H,DELAY3
RET
END
|