|
同學(xué)的無線防丟器,利用2個(gè)52單片機(jī)+2個(gè)NRF24L01無線模塊做的分從機(jī)主機(jī),主機(jī)的板子上面有蜂鳴器,能夠報(bào)警,從機(jī)放在防丟失的目標(biāo)上
我的理解:
從機(jī) 開機(jī)后亮燈,初始化單片機(jī)電平,重復(fù)下面步驟
發(fā)送信息,發(fā)送成功則燈亮一下,發(fā)送超時(shí)則燈不亮
Tx_Buf[0] = 0xa1;
Tx_Buf[1] = 1;
Tx_Buf[2] = 1;
Transmit(Tx_Buf);
led = 0;
delay_1ms(100);
sta=SPI_Read(READ_REG + STATUS);
if(TX_DS) //當(dāng)前STATUS狀態(tài) 發(fā)送中斷應(yīng)使bit5 = 1
{
SPI_RW_Reg(WRITE_REG + STATUS,sta);
}
還有
SPI_RW_Reg(WRITE_REG + STATUS,sta);看不懂
主機(jī) 開機(jī)后亮燈,初始化單片機(jī)電平,接收模式,重復(fù)下面步驟:
接收到信號(hào)并核對(duì),如果正確就亮燈,3秒內(nèi)沒有接到就報(bào)警
對(duì)
if(nRF24L01_RxPacket(Rx_Buf))
這段的意思不太清楚
還有就是主機(jī)接收到信號(hào)后是不是在三秒后才會(huì)再次開始接收信號(hào)
希望各位能夠指點(diǎn)一下,感激不盡!
下面是從機(jī)程序
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號(hào)整型 宏定義 變量范圍0~65535
- sbit led = P2^7; //信號(hào)發(fā)射指示燈發(fā)光二極管定義
- //****************************************IO端口定義***************************************
- sbit CE = P2^2;
- sbit SCK = P2^1;
- sbit MISO = P2^0;
- sbit CSN = P2^3;
- sbit MOSI = P2^4;
- sbit IRQ = P2^5;
- //******************************************************************************************
- uchar bdata sta; //狀態(tài)標(biāo)志
- sbit RX_DR =sta^6;
- sbit TX_DS =sta^5;
- sbit MAX_RT =sta^4;
- //*********************************************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 32 // 32 uints TX payload
- #define RX_PLOAD_WIDTH 32 // 32 uints TX payload
- uchar code TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x11,0x05}; //本地地址
- uchar code RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x00,0x05}; //接收地址
- uchar idata Tx_Buf[TX_PLOAD_WIDTH]={0x01,0x02,0x03,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,
- 0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff};//發(fā)送數(shù)據(jù)
- uchar Rx_Buf[RX_PLOAD_WIDTH];//接收數(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校驗(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è)置
- #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 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ù)長(zhǎng)度
- #define RX_PW_P1 0x12 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P2 0x13 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P3 0x14 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P4 0x15 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P5 0x16 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態(tài)寄存器設(shè)置
- /******************************************延時(shí)函數(shù)********************************************************/
- /***********************1ms延時(shí)函數(shù)*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /************************************IO 口模擬SPI總線 代碼************************************************/
- uchar SPI_RW(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- MOSI=(byte&0x80);
- byte=(byte<<1);
- SCK=1;
- byte|=MISO;
- //led=MISO;Delay(150);
- SCK=0;
- }
- return(byte);
- }
- uchar SPI_RW_Reg(uchar reg,uchar value) // 向寄存器REG寫一個(gè)字節(jié),同時(shí)返回狀態(tài)字節(jié)
- {
- uchar status;
- CSN=0;
- status=SPI_RW(reg);
- SPI_RW(value);
- CSN=1;
- return(status);
- }
- uchar SPI_Read (uchar reg )
- {
- uchar reg_val;
- CSN=0;
- SPI_RW(reg);
- reg_val=SPI_RW(0);
- CSN=1;
- return(reg_val);
- }
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status,byte_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // 選擇寄存器寫入和讀取狀態(tài)字節(jié)
- for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 然后寫所有字節(jié)在緩沖區(qū)(* pBuf)
- SPI_RW(*pBuf++);
- CSN = 1; // Set CSN high again
- return(status); // nRF24L01返回狀態(tài)字節(jié)
- }
- /*******************************發(fā)*****送*****模*****式*****代*****碼*************************************/
- void TX_Mode(void)
- {
- CE=0;
- SPI_RW_Reg(FLUSH_TX,0x00);
- SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // tx地址來nRF24L01寫道
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // RX_Addr0 tx adr一樣為自動(dòng)ack
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a); // 500us + 86us, 10 重發(fā)...1a
- SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 選擇RF信道40
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長(zhǎng)度,本次設(shè)置為2字節(jié)
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
- CE=1;
- delay_1ms(100);
- }
- void Transmit(unsigned char * tx_buf)
- { //傳輸
- 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ā)送
- delay_1ms(150);
- }
- /******************主程序**********************/
- void main()
- {
- led = 0; //開機(jī)點(diǎn)亮一下紅燈
- delay_1ms(200);
- P0 = P1 = P2 = P3 = 0xff; //初始化單片機(jī)IO口為高電平
- while(1)
- {
- Tx_Buf[0] = 0xa1;
- Tx_Buf[1] = 1;
- Tx_Buf[2] = 1;
- Transmit(Tx_Buf);
- led = 0;
- delay_1ms(100);
- sta=SPI_Read(READ_REG + STATUS);
- if(TX_DS) //當(dāng)前STATUS狀態(tài) 發(fā)送中斷應(yīng)使bit5 = 1
- {
- SPI_RW_Reg(WRITE_REG + STATUS,sta);
- }
- if(MAX_RT) //如果是發(fā)送超時(shí)
- {
- SPI_RW_Reg(WRITE_REG + STATUS,sta);
- }
- led = 1;
- delay_1ms(800);
- }
- }
- 下面是主機(jī)程序
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號(hào)整型 宏定義 變量范圍0~65535
- sbit beep=P2^6;
- sbit led = P2^7;
- /***********************1ms延時(shí)函數(shù)*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- //****************************************IO端口定義***************************************
- sbit CE = P2^2;
- sbit SCK = P2^1;
- sbit MISO = P2^0;
- sbit CSN = P2^3;
- sbit MOSI = P2^4;
- sbit IRQ = P2^5;
- //******************************************************************************************
- uchar bdata sta; //狀態(tài)標(biāo)志
- sbit RX_DR =sta^6;
- sbit TX_DS =sta^5;
- sbit MAX_RT =sta^4;
- //*********************************************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 32 // 32 uints TX payload
- #define RX_PLOAD_WIDTH 32 // 32 uints TX payload
- uchar code TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x00,0x10,0x05}; //本地地址
- uchar code RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x41,0x10,0x10,0x05}; //接收地址
- uchar Tx_Buf[TX_PLOAD_WIDTH]={0x01,0x02,0x03,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,
- 0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xaa,0xbb,0x11,0x22,0x33,0xee,0xff};//發(fā)送數(shù)據(jù)
- uchar Rx_Buf[RX_PLOAD_WIDTH];//接收數(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校驗(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è)置
- #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 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ù)長(zhǎng)度
- #define RX_PW_P1 0x12 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P2 0x13 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P3 0x14 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P4 0x15 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define RX_PW_P5 0x16 // 接收頻道0接收數(shù)據(jù)長(zhǎng)度
- #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態(tài)寄存器設(shè)置
- /************************************IO 口模擬SPI總線 代碼************************************************/
- uchar SPI_RW(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- MOSI=(byte&0x80);
- byte=(byte<<1);
- SCK=1;
- byte|=MISO;
- //led=MISO;Delay(150);
- SCK=0;
- }
- return(byte);
- }
- uchar SPI_RW_Reg(uchar reg,uchar value) // 向寄存器REG寫一個(gè)字節(jié),同時(shí)返回狀態(tài)字節(jié)
- {
- uchar status;
- CSN=0;
- status=SPI_RW(reg);
- SPI_RW(value);
- CSN=1;
- return(status);
- }
- uchar SPI_Read (uchar reg )
- {
- uchar reg_val;
- CSN=0;
- SPI_RW(reg);
- reg_val=SPI_RW(0);
- CSN=1;
- return(reg_val);
- }
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status,byte_ctr;
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // 選擇寄存器寫入和讀取狀態(tài)字節(jié)
- for(byte_ctr=0; byte_ctr<bytes; byte_ctr++) // 然后寫所有字節(jié)在緩沖區(qū)(* pBuf)
- SPI_RW(*pBuf++);
- CSN = 1; // Set CSN high again
- return(status); // nRF24L01返回狀態(tài)字節(jié)
- }
- /*******************************接*****收*****模*****式*****代*****碼*************************************/
- uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
- {
- uchar status,i; // 交易
- CSN = 0; // Set CSN low, init SPI tranaction
- status = SPI_RW(reg); // 選擇寄存器寫入和讀取的狀態(tài) uchar
- for(i=0;i<uchars;i++)
- pBuf[i] = SPI_RW(0); //
- CSN = 1;
- return(status); // return nRF24L01 status uchar
- }
- /******************************************************************************************************/
- /*函數(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_PLOAD,rx_buf,RX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
- revale =1; //讀取數(shù)據(jù)完成標(biāo)志
- //Delay(100);
- }
- SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到數(shù)據(jù)后RX_DR,TX_DS,MAX_PT都置高為1,通過寫1來清楚中斷標(biāo)志
- return revale;
- }
- /****************************************************************************************************/
- /*函數(shù):void RX_Mode(void)
- /*功能:數(shù)據(jù)接收配置
- /****************************************************************************************************/
- void RX_Mode(void)
- {
- CE=0;
- SPI_RW_Reg(FLUSH_RX,0x00);
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // Enable Auto.Ack:Pipe0
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // Enable Pipe0
- SPI_RW_Reg(WRITE_REG + RF_CH, 40); // Select RF channel 40
- SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //設(shè)置接收數(shù)據(jù)長(zhǎng)度,本次設(shè)置為32字節(jié)
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // TX_PWR:0dBm, Datarate:1Mbps, LNA:HCURR
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0F);
- CE=1;
- delay_1ms(130);
- }
- /******************主程序**********************/
- void main()
- {
- static uchar value=8;
- led = 0; //開機(jī)點(diǎn)亮一下紅燈
- delay_1ms(200);
- P0 = P1 = P2 = P3 = 0xff; //初始化單片機(jī)IO口為高電平
- RX_Mode();
- while(1)
- {
- if(nRF24L01_RxPacket(Rx_Buf))
- {
- if(Rx_Buf[1] == 1)
- {
- led = 0 ;
- value = 15; //3秒
- }
- }
- delay_1ms(200);
- led = 1 ; //關(guān)閉接收指示燈
- if(value == 0) //報(bào)警
- {
- beep = ~beep;
- }
- else
- {
- value --; //減1
- beep = 1; //關(guān)閉報(bào)警
- }
- }
- }
復(fù)制代碼
|
|