nrf24l01 AVR 發(fā)射和接收調(diào)試成功_第1頁
nrf24l01 AVR 發(fā)射和接收調(diào)試成功_第2頁
nrf24l01 AVR 發(fā)射和接收調(diào)試成功_第3頁
nrf24l01 AVR 發(fā)射和接收調(diào)試成功_第4頁
nrf24l01 AVR 發(fā)射和接收調(diào)試成功_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、注明:本發(fā)射程序帶SC12A觸摸按鍵程序,不要可以去掉,不去也行。 接收程序帶液晶1602程序。 實(shí)現(xiàn)功能發(fā)射端按鍵后控制接收端兩個(gè)LED燈亮滅。其它功能可根據(jù)愛好自己添加。 本程序編譯軟件IAR。運(yùn)行平臺(tái)為ATmega16。晶振頻率為8MHZ,其他頻率也可以,但是要修改延時(shí)函數(shù)void inerDelay_us(uchar n),使其延時(shí)時(shí)間不變,不然運(yùn)行不成功(切記,經(jīng)驗(yàn)教訓(xùn)?。。┌l(fā)射程序:nrf24l01.htypedef unsigned char uchar;typedef unsigned int uint;/*NRF24L01端口定義*#define CE PORTA_Bit0#

2、define CSN PORTA_Bit1#define SCK PORTA_Bit2#define MOSI PORTA_Bit3#define Read_MISO PINA&(1<<4)#define Read_IRQ PINA&(1<<5)/*NRF24L01*#define TX_ADR_WIDTH 5 / 5 uints TX address width#define RX_ADR_WIDTH 5 / 5 uints RX address width#define TX_PLOAD_WIDTH 20 / 20 uints TX payload#

3、define RX_PLOAD_WIDTH 20 / 20 uints TX payloaduchar TX_ADDRESSTX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/本地地址uchar RX_ADDRESSRX_ADR_WIDTH= 0x34,0x43,0x10,0x10,0x01;/接收地址/*NRF24L01寄存器指令*#define READ_REG 0x00 / 讀寄存器指令#define WRITE_REG 0x20 / 寫寄存器指令#define RD_RX_PLOAD 0x61 / 讀取接收數(shù)據(jù)指令#define WR_TX_PLOAD 0x

4、A0 / 寫待發(fā)數(shù)據(jù)指令#define FLUSH_TX 0xE1 / 沖洗發(fā)送 FIFO指令#define FLUSH_RX 0xE2 / 沖洗接收 FIFO指令#define REUSE_TX_PL 0xE3 / 定義重復(fù)裝載數(shù)據(jù)指令#define NOP 0xFF / 保留/*SPI(nRF24L01)寄存器地址*#define CONFIG 0x00 / 配置收發(fā)狀態(tài),CRC校驗(yàn)?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式#define EN_AA 0x01 / 自動(dòng)應(yīng)答功能設(shè)置#define EN_RXADDR 0x02 / 可用信道設(shè)置#define SETUP_AW 0x03 / 收發(fā)地址寬度設(shè)置#

5、define SETUP_RETR 0x04 / 自動(dòng)重發(fā)功能設(shè)置#define RF_CH 0x05 / 工作頻率設(shè)置#define RF_SETUP 0x06 / 發(fā)射速率、功耗功能設(shè)置#define STATUS 0x07 / 狀態(tài)寄存器#define OBSERVE_TX 0x08 / 發(fā)送監(jiān)測(cè)功能#define CD 0x09 / 地址檢測(cè) #define RX_ADDR_P0 0x0A / 頻道0接收數(shù)據(jù)地址#define RX_ADDR_P1 0x0B / 頻道1接收數(shù)據(jù)地址#define RX_ADDR_P2 0x0C / 頻道2接收數(shù)據(jù)地址#define RX_ADDR_P3

6、 0x0D / 頻道3接收數(shù)據(jù)地址#define RX_ADDR_P4 0x0E / 頻道4接收數(shù)據(jù)地址#define RX_ADDR_P5 0x0F / 頻道5接收數(shù)據(jù)地址#define TX_ADDR 0x10 / 發(fā)送地址寄存器#define RX_PW_P0 0x11 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P1 0x12 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P2 0x13 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P3 0x14 / 接收頻道0接收數(shù)據(jù)長度#define RX_PW_P4 0x15 / 接收頻道0接收數(shù)據(jù)長度#define

7、RX_PW_P5 0x16 / 接收頻道0接收數(shù)據(jù)長度#define FIFO_STATUS 0x17 / FIFO棧入棧出狀態(tài)寄存器設(shè)置/*void Delay(unsigned int s);void inerDelay_us(unsigned char n);void init_NRF24L01(void);uint SPI_RW(uint uchar);uchar SPI_Read(uchar reg);void SetRX_Mode(void);uint SPI_RW_Reg(uchar reg, uchar value);uint SPI_Read_Buf(uchar reg, u

8、char *pBuf, uchar uchars);uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars);unsigned char nRF24L01_RxPacket(unsigned char* rx_buf);void nRF24L01_TxPacket(unsigned char * tx_buf);void Port_init_nRF24L01(void);/*長延時(shí)*void Delay(uint s)uint i;for(i=0; i<s; i+);for(i=0; i<s; i+);/*uchar sta;

9、 /狀態(tài)標(biāo)志#defineRX_DRsta&(1<<6)#define TX_DSsta&(1<<5)#defineMAX_RTsta&(1<<4)/*/*延時(shí)函數(shù)/*/void inerDelay_us(uchar n)uchar i,j; for(j=n;j>0;j-) for(i=80;i>0;i-);/*/*NRF24L01初始化/*/void init_NRF24L01(void) inerDelay_us(100); CE=0; / chip enable CSN=1; / Spi disable SCK=0;

10、 / Spi clock line init highSPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); / 寫本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); / 寫接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); / 頻道0自動(dòng)ACK應(yīng)答打開SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); / 允許接收地址只有頻道0,如果需要多頻道可以參考Page21 SPI_RW_

11、Reg(WRITE_REG + SETUP_RETR, 0x1a); /自動(dòng)重發(fā)10次SPI_RW_Reg(WRITE_REG + RF_CH, 0); / 設(shè)置信道工作為2.4GHZ,收發(fā)必須一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); /設(shè)置接收數(shù)據(jù)長度,本次設(shè)置為32字節(jié)SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); /設(shè)置發(fā)射速率為1MHZ,發(fā)射功率為最大值0dB/*/*函數(shù):uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI寫時(shí)序/*/uint SPI_RW(uin

12、t data)uchar i;/,temp=0; for(i=0;i<8;i+) / output 8-bit if(data & 0x80) MOSI=1 ; / output 'uchar', MSB to MOSI else MOSI=0; data = (data << 1); / shift next bit into MSB.SCK=1; / Set SCK high.if(Read_MISO) data |= 1; / capture current MISO bitSCK=0; / .then set SCK low again ret

13、urn(data); / return read uchar/*/*函數(shù):uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI時(shí)序/*/uchar SPI_Read(uchar reg)uchar reg_val;CSN = 0; / CSN low, initialize SPI communication.SPI_RW(reg); / Select register to read from.reg_val = SPI_RW(0); / .then read registervalueCSN = 1; / CSN high, terminate SPI co

14、mmunicationreturn(reg_val); / return register value/*/*功能:NRF24L01讀寫寄存器函數(shù)/*/uint SPI_RW_Reg(uchar reg, uchar value)uint status;CSN = 0; / CSN low, init SPI transactionstatus = SPI_RW(reg); / select registerSPI_RW(value); / .and write value to it.CSN = 1; / CSN high againreturn(status); / return nRF2

15、4L01 status uchar/*/*函數(shù):uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于讀數(shù)據(jù),reg:為寄存器地址,pBuf:為待讀出數(shù)據(jù)地址,uchars:讀出數(shù)據(jù)的個(gè)數(shù)/*/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; / Set CSN low, init SPI tranactionstatus = SPI_RW(reg); / Select register to writ

16、e to and read status ucharfor(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr+)pBufuchar_ctr = SPI_RW(0); / CSN = 1; return(status); / return nRF24L01 status uchar/*/*函數(shù):uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于寫數(shù)據(jù):為寄存器地址,pBuf:為待寫入數(shù)據(jù)地址,uchars:寫入數(shù)據(jù)的個(gè)數(shù)/*/uint SPI_Write_Buf(uchar reg,

17、uchar *pBuf, uchar uchars)uint status,uchar_ctr;CSN = 0; /SPI使能 status = SPI_RW(reg); for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr+) /SPI_RW(*pBuf+);CSN = 1; /關(guān)閉SPIreturn(status); / /*/*函數(shù):void SetRX_Mode(void)/*功能:數(shù)據(jù)接收配置 /*/void SetRX_Mode(void)CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); / IRQ收發(fā)完

18、成中斷響應(yīng),16位CRC,主接收CE = 1; inerDelay_us(130);/*/*函數(shù):unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:數(shù)據(jù)讀取后放如rx_buf接收緩沖區(qū)中/*/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf) unsigned char revale=0;sta=SPI_Read(STATUS);/ 讀取狀態(tài)寄存其來判斷數(shù)據(jù)接收狀況if(RX_DR)/ 判斷是否接收到數(shù)據(jù) CE = 0; /SPI使能SPI_Read_Buf(RD_RX

19、_PLOAD,rx_buf,TX_PLOAD_WIDTH);/ read receive payload from RX_FIFO bufferrevale =1;/讀取數(shù)據(jù)完成標(biāo)志SPI_RW_Reg(WRITE_REG+STATUS,sta); /接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志return revale;/*/*函數(shù):void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:發(fā)送 tx_buf中數(shù)據(jù)/*/void nRF24L01_TxPacket(unsigned char * tx_buf)

20、CE=0;/StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); / 裝載接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); / 裝載數(shù)據(jù)SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); / IRQ收發(fā)完成中斷響應(yīng),16位CRC,主發(fā)送CE=1; /置高CE,激發(fā)數(shù)據(jù)發(fā)送inerDelay_us(10);/*nRF24L01端口初始化*void Port_init_nRF24L01(void) DDRA_Bit

21、0=1; /CE設(shè)為輸出 DDRA_Bit1=1; /CSN設(shè)為輸出 DDRA_Bit2=1; /SCK設(shè)為輸出 DDRA_Bit3=1; /MOSI設(shè)為輸出 DDRA_Bit4=0; /MISO設(shè)為輸入 DDRA_Bit5=0; /IRQ設(shè)為輸入/SC12A.h#define SCL PORTC_Bit6#define SDA PORTC_Bit7#define Read_SDA (PINC&(1<<7)/#define ERR P1_3 / 指示通信過程有問題 #define CON_ADDR 0x81 / A6:0 + RWB = 81H ASEL 懸空 void P

22、ort_init_SC12A(void) DDRC_Bit6=1; /SCL設(shè)為輸出 DDRC_Bit7=1; /SDA設(shè)為輸出 PORTC_Bit6=1; PORTC_Bit7=1; unsigned int ReadKey(void) unsigned char bitnum,temp,addr; unsigned int key2byte; unsigned char bit_temp; addr=CON_ADDR; key2byte=0xffff; / EA=0; / 屏蔽全局中斷 SDA=0; / 拉低 SDA 端口送出 START 信號(hào) for(temp=0;temp<4;t

23、emp+) /延時(shí) /發(fā)送 8 位地址字節(jié) (A6:0+RWB) for(bitnum=0;bitnum<8;bitnum+) SCL=0; temp=addr&0x80; if(temp=0x80) SDA=1; else SDA=0; addr=addr<<1; for(temp=0;temp<4;temp+) /延時(shí) SCL=1; for(temp=0;temp<4;temp+) /延時(shí) SDA=1; /釋放 SDA 端口,將 SDA 設(shè)置為輸入端口 SCL=0; for(temp=0;temp<4;temp+) /延時(shí) SCL=1; for(

24、temp=0;temp<4;temp+) /延時(shí) / bit_temp=SDA; / if(bit_temp) /讀 ack 回應(yīng) / ERR=0; /ack 信號(hào)沒有讀到,指示通信有誤 /讀 16 位按鍵數(shù)據(jù)字節(jié)(D15:0) for(bitnum=0;bitnum<16;bitnum+) SCL=0; for(temp=0;temp<4;temp+) /延時(shí) SCL=1; for(temp=0;temp<4;temp+) /延時(shí) bit_temp=Read_SDA; if(bit_temp) key2byte=key2byte<<1; key2byte=

25、key2byte|0x01; else key2byte=key2byte<<1; SCL=0; SDA=1; for(temp=0;temp<4;temp+) /延時(shí) SCL=1; for(temp=0;temp<4;temp+) /延時(shí) SCL=0; SDA=0; /發(fā)送 NACK 信號(hào) for(temp=0;temp<4;temp+) /延時(shí) SCL=1; for(temp=0;temp<4;temp+) /延時(shí) SDA=1; /釋放 SDA 端口,將 SDA 設(shè)置為輸入端口 key2byte=key2byte0xffff; /EA=1; /全局中斷使

26、能 return(key2byte); /數(shù)據(jù)位為 1,說明相應(yīng)按鍵被觸摸。例如,返回值為 0x5000 說明按 /鍵 CIN1 和 CIN3 被觸摸。 /發(fā)射主程序#include <iom16.h>#include "nRF24L01.h"#include "SC12A.h"/*按鍵*#defineup !(PINC&(1<<0)#definedown !(PINC&(1<<1)#defineleft !(PINC&(1<<2)#defineright !(PINC&(1

27、<<3)/*端口初始化*void port_init(void) DDRA_Bit6=1; DDRA_Bit7=1; PORTA |= (1<<6)|(1<<7); /PA5 = 1,PA6 = 1,PA7 = 1 DDRC=0; PORTC=0xff;/*主函數(shù)* main()unsigned char TxBuf20=0; unsigned int key; uchar sign=0; port_init(); Port_init_SC12A(); Port_init_nRF24L01(); init_NRF24L01() ;while(1) key=R

28、eadKey(); if(up|(key=0x8000) TxBuf1=1; sign=1; if(down|(key=0x4000) TxBuf2=1; sign=1; if(left|(key=0x2000) TxBuf3=1; sign=1; if(right|(key=0x1000) TxBuf4=1; sign=1; if(sign) nRF24L01_TxPacket(TxBuf);/ Transmit Tx buffer data sign=0; TxBuf1=0; TxBuf2=0; TxBuf3=0; TxBuf4=0; sta = SPI_Read(STATUS); if(

29、sta = 0x2e) /當(dāng)發(fā)送完成時(shí)TX_DS = 1,PC3 = 0 PORTA &= (1 << 7); else PORTA |= (1 << 7); sta=0; SPI_RW_Reg(WRITE_REG + STATUS,0xff);/清除TX FIFO寄存器,避免數(shù)據(jù)不能及時(shí)更新 PORTA = (1 << 6); Delay(6000); Delay(6000); PORTA |= (1 << 7); Nrf24l01接收:delay.h#ifndef _IAR_DELAY_H#define _IAR_DELAY_H#in

30、clude <intrinsics.h>#define XTAL 8.0 /可定義為你所用的晶振頻率(單位Mhz)#define delay_us(x) _delay_cycles ( (unsigned long)(x * XTAL) ) #define delay_ms(x) _delay_cycles ( (unsigned long)(x * XTAL*1000) )#define delay_s(x) _delay_cycles ( (unsigned long)(x * XTAL*1000000) )#endif/1602.h/*設(shè)置管腳*/#define RS POR

31、TD_Bit0 #define RW PORTD_Bit1#define E PORTD_Bit2/*LCD1602控制指令*/#define LCD_Set 0x38 / 顯示初始化,16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口 ;#define LCD_Clear 0x01 / 清屏LCD ;#define LCD_Display1 0x0f / 顯示功能設(shè)置:開顯示,顯示光標(biāo),光標(biāo)閃爍 ;#define LCD_Display2 0x0c / 顯示功能設(shè)置:開顯示,不顯示光標(biāo),光標(biāo)不閃爍 ;#define LCD_Mode 0x06 / 設(shè)置光標(biāo)狀態(tài)默認(rèn)0x06,為讀一個(gè)字符光標(biāo)加1 ;#de

32、fine LCD_FirstLineAddress_Left 0x80 /設(shè)置初始化數(shù)據(jù)指針,指向 左半屏第一行首位 ; #define LCD_SecondLineAddress_Left (0x80+0x40) /設(shè)置初始化數(shù)據(jù)指針,指向 左半屏第二行首位 ;#define LCD_FirstLineAddress_Right (0x80+0x10) /設(shè)置初始化數(shù)據(jù)指針,指向 右半屏第一行首位 ; #define LCD_SecondLineAddress_Right (0x80+0x40+0x10) /設(shè)置初始化數(shù)據(jù)指針,指向 右半屏第二行首位 ;#define LCD_Move_Le

33、ft 0x18 / 整屏左移#define LCD_Move_Right 0x1c / 整屏右移/*端口初始化*/void Port_Init_1602()DDRD_Bit0 = 1; /控制端 RS 定義為輸出DDRD_Bit1 = 1; /控制端 RW 定義為輸出DDRD_Bit2 = 1; /控制端 E 定義為輸出DDRC = 0xFF; /數(shù)據(jù)端定義為輸出DDRD_Bit3 = 1; /背光控制端PORTD_Bit3 =1; /由三級(jí)管控制,高電平導(dǎo)通; 始終打開背光/*液晶1602 寫控制指令函數(shù)*/void Write_Command(unsigned char Command)R

34、S = 0 ; / 進(jìn)行指令的操作RW = 0 ; / 進(jìn)行寫操作PORTC = Command ; / 賦值指令E = 1 ; / 使能端拉高delay_ms(5); / 等待指令寫完E = 0 ; / 使能端拉低/*液晶1602 寫數(shù)據(jù)函數(shù)*/void Write_Data(unsigned char Data)RS = 1 ; / 進(jìn)行數(shù)據(jù)的操作RW = 0 ; / 進(jìn)行寫操作PORTC = Data ; / 賦值數(shù)據(jù)E = 1 ; / 使能端拉高delay_ms(5); / 等待數(shù)據(jù)寫完E = 0 ; / 使能端拉低/*液晶1602 使用初始化*/void LCD1602_Init()

35、E = 0;Write_Command(LCD_Set);Write_Command(LCD_Clear);Write_Command(LCD_Display2);Write_Command(LCD_Mode);/*液晶1602 清屏*/void LCD1602_Clear(void)Write_Command(LCD_Clear);/*液晶1602 左半屏顯示*/void LCD1602_Left_Display(unsigned char *table1 , unsigned char *table2)unsigned char i;Write_Command(LCD_FirstLineA

36、ddress_Left);delay_ms(1); /第一行顯示16個(gè)字符for(i=0;i<16;i+)Write_Data(table1i);delay_ms(1); Write_Command(LCD_SecondLineAddress_Left);delay_ms(1); /第二行顯示16個(gè)字符for(i=0;i<16;i+)Write_Data(table2i);delay_ms(1);/*液晶1602 右半屏顯示*/void LCD1602_Right_Display(unsigned char *table1 , unsigned char *table2)unsigned char i;Write_Command(LCD_FirstLineAddress_Right); /第一行顯示16個(gè)字符dela

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論