|
avr單片機(jī)源程序如下:
- //ICC-AVR application builder : 2018/6/1 21:34:07
- // Target : M16
- // Crystal: 8.0000Mhz
- #include <iom16v.h>
- #include <macros.h>
- #include "SPI.h"
- #include"key.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define IRQ 0 //輸入
- #define MISO 1 //輸入
- #define MOSI 2 //輸出
- #define SCK 3 //輸出
- #define CSN 4 //輸出
- #define CE 5 //輸出
- //================== NRF24L01的接收和發(fā)送地址 ===================
- #define TX_ADR_WIDTH 5 // 5個字節(jié)的TX地址長度
- #define RX_ADR_WIDTH 5 // 5個字節(jié)的RX地址長度
- #define PLOAD_WIDTH 12 // 1-32 字節(jié) 數(shù)據(jù)設(shè)定長度
- #define TX_PLOAD_WIDTH 32 // ?個字節(jié)的TX數(shù)據(jù)長度
- #define RX_PLOAD_WIDTH 32 // ?個字節(jié)的RX數(shù)據(jù)長度
- //================== NRF24L01寄存器指令 =======================
- #define READ_REG 0x00 // 讀寄存器
- #define WRITE_REG 0x20 // 寫寄存器
- #define RD_RX_PLOAD 0x61 // 讀取接收數(shù)據(jù)
- #define WR_TX_PLOAD 0xA0 // 寫待發(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校驗?zāi)J揭约笆瞻l(fā)狀態(tài)響應(yīng)方式
- #define EN_AA 0x01 // 自動應(yīng)答功能設(shè)置
- #define EN_RXADDR 0x02 // 可用信道設(shè)置
- #define SETUP_AW 0x03 // 收發(fā)地址寬度設(shè)置
- #define SETUP_RETR 0x04 // 自動重發(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)測功能
- #define CD 0x09 // 地址檢測
- #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 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 RX_PW_P5 0x16 // 接收頻道0接收數(shù)據(jù)長度
- #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態(tài)寄存器設(shè)置
- //uchar TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定義一個靜態(tài)發(fā)送地址
- uchar TX_ADDRESS[5]={0x00,0x00,0x00,0x00,0xA2};//接收本機(jī) 地址
- uchar RX_ADDRESS[5]={0x00,0x00,0x00,0x00,0xA1};//發(fā)送目標(biāo) 地址
- uchar TX_ADDRESS1[5]={0x00,0x00,0x00,0x00,0xA1};//接收本機(jī) 地址
- uchar RX_ADDRESS1[5]={0x00,0x00,0x00,0x00,0xA2};//發(fā)送目標(biāo) 地址
- uchar RX_BUF[RX_ADR_WIDTH]={0x00,0x00,0x00,0x00,0x00}; //接收數(shù)據(jù)存放數(shù)組
- uchar TX_BUF[TX_ADR_WIDTH]={0x00,0x01,0x02,0x03,0x04}; //發(fā)送的數(shù)據(jù)
- uchar flag=0;
- //US
- void delayus(uint i)
- {
- uchar j;
- while(i)
- {
- for(j=0;j<=7;j++)
- {
- NOP();
- }
- i--;
- }
- }
- void delay_ms(uint i)
- {
- while(i--)
- {
- unsigned int j;
- for(j=1;j<=1332;j++);
- }
- }
- // 這個函數(shù)設(shè)置nRF24L01為接收模式,等待接收發(fā)送設(shè)備的數(shù)據(jù)包
- /**************************************************/
- void RX_Mode(void)
- {
- RET_CE;
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應(yīng)答
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
- SPI_RW_Reg(WRITE_REG + RF_CH, 0x40); // 選擇射頻通道0x40
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_ADR_WIDTH); // 接收通道0選擇和發(fā)送通道相同有效數(shù)據(jù)寬度
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 數(shù)據(jù)傳輸率1Mbps,發(fā)射功率0dBm,低噪聲放大器增益
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校驗,上電,接收模式
- EST_CE; // 拉高CE啟動接收設(shè)備
-
- }
- //這個函數(shù)設(shè)置nRF24L01為發(fā)送模式,(CE=1持續(xù)至少10us),
- //130us后啟動發(fā)射,數(shù)據(jù)發(fā)送結(jié)束后,發(fā)送模塊自動轉(zhuǎn)入接收模式等待應(yīng)答信號。
- /**************************************************/
- void TX_Mode(uchar * BUF)
- {
- RET_CE;
- SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_ADR_WIDTH); // 寫數(shù)據(jù)包到TX FIFO
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應(yīng)答
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自動重發(fā)延時等待250us+86us,自動重發(fā)10次
- SPI_RW_Reg(WRITE_REG + RF_CH, 0x40); // 選擇射頻通道0x40
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 數(shù)據(jù)傳輸率1Mbps,發(fā)射功率0dBm,低噪聲放大器增益
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校驗,上電
- EST_CE;
- }
- /*
- void main(void)
- {
- uchar s=0x00;
- DDRB=0xff;
- DDRC=0xff;
- PORTB=0x00;
- PORTC=0x00;
- ioinit();
- delay_ms(10);
- SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS1, TX_ADR_WIDTH); // 寫入發(fā)送地址
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS1, TX_ADR_WIDTH); // 接收設(shè)備接收通道0使用和發(fā)送設(shè)備相同的發(fā)送地址
- RX_Mode();
- while(1)
- {
- if(!(PINA&0x01))
- {EST_IRQ ; s=SPI_Read(READ_REG + STATUS);
- if(s&0x40) //接收到數(shù)據(jù)標(biāo)志
- {
- SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, RX_ADR_WIDTH);
- SPI_RW_Reg(WRITE_REG + STATUS, s);
- }}
- if((RX_BUF[0]==0x00)&&(RX_BUF[1]==0x01)&&(RX_BUF[2]==0x02)&&(RX_BUF[3]==0x03)&&(RX_BUF[4]==0x04))
- PORTB=0xff;
- if((RX_BUF[0]==0x01)&&(RX_BUF[1]==0x01)&&(RX_BUF[2]==0x02)&&(RX_BUF[3]==0x03)&&(RX_BUF[4]==0x04))
- PORTB=0x00;
- }
- }
- */
- //按鍵修改發(fā)送數(shù)組的值SPI_Write_Buf(WR_TX_PLOAD, TxBuf, PLOAD_WIDTH);
- void anjian(void)
- {
- switch(key())
- {
- case 1: break;
- case 2: TX_BUF[0]=0x00;SPI_Write_Buf(WR_TX_PLOAD, TX_BUF, TX_ADR_WIDTH);break;// 更新數(shù)據(jù)包到TX FIFO
- case 3: TX_BUF[0]=0x01;PORTB=0xff;SPI_Write_Buf(WR_TX_PLOAD, TX_BUF, TX_ADR_WIDTH);break;// 更新數(shù)據(jù)包到TX FIFO
- }
- }
- void main(void)
- {
- unsigned char HXout,HGout,FYout;//控制參數(shù)輸出值 0~128~255
- unsigned char HangXiang=128,HengGun=128,FuYang=128;//微調(diào)變量
- uchar s=0x00;
- DDRD&=0x1f;
- PORTD|=0xe0;//按鍵初始化
- DDRB=0xff;
- DDRC=0xff;
- PORTB=0x00;
- TCCR0=0x0b;//CTC工作模式 64分頻
- TCNT0=0x00;
- TIMSK=0x02;//比較匹配中斷允許
- TIFR=0x02;//寫1清0
- OCR0=0xfa;//定時2ms
- SEI();//開啟總中斷 to初始化
- ioinit();
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
無線 NRF24L01.rar
(281.08 KB, 下載次數(shù): 45)
2018-9-3 21:28 上傳
點擊文件名下載附件
ICC編譯器 下載積分: 黑幣 -5
|
|