nrf24l01無線報警器
當兩個單片機之間的無線通信消失時會發出警報
0.png (37.25 KB, 下載次數: 50)
下載附件
2018-2-28 16:34 上傳
單片機源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //*****************************************************************************************
- bit crrent=1; //定義DS18B20初始化返回值,表示初始化是否成功
- sbit beep=P0^0;
- sbit led=P0^1;
- uint value=0;
- uchar tflag; // 是否正負
- uchar data disdat[6];
- uchar data setdat[4];
- void writelcdcmd(uchar);
- void writelcddat(uchar);
- //*****************************************************************************************
-
- #define TX_ADR_WIDTH 5 // 發射地址的字節個數
- #define TX_PLOAD_WIDTH 2 //發射字節
- uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x55,0x10,0x10,0x01};
- uchar rx_buf[TX_PLOAD_WIDTH];
- uchar tx_buf[TX_PLOAD_WIDTH];
- uchar distance_data[2];
- uchar flag;//標志
- //nRF24L01引腳定義
- sbit CE = P2^7; // Chip Enable pin signal (output)
- sbit CSN = P2^2; // Slave Select pin, (output to CSN, nRF24L01)
- sbit IRQ = P2^7; // Interrupt signal, from nRF24L01 (input)
- sbit MISO = P2^5; // Master In, Slave Out pin (input)
- sbit MOSI = P2^3; // Serial Clock pin, (output)
- sbit SCK = P2^6; // Master Out, Slave In pin (output)
- uchar bdata sta;
- sbit RX_DR =sta^6; //接收數據準備就緒
- sbit TX_DS =sta^5; //已發送數據
- sbit MAX_RT =sta^4;
- unsigned char time; //設置全局變量,專門用于嚴格延時
- //*********************************************NRF24L01*************************************
-
- //***************************************NRF24L01寄存器指令*******************************************************
- #define READ_REG 0x00 // 讀寄存器指令
- #define WRITE_REG 0x20 // 寫寄存器指令
- #define RD_RX_PLOAD 0x61 // 讀取接收數據指令
- #define WR_TX_PLOAD 0xA0 // 寫待發數據指令
- #define FLUSH_TX 0xE1 // 沖洗發送 FIFO指令
- #define FLUSH_RX 0xE2 // 沖洗接收 FIFO指令
- #define REUSE_TX_PL 0xE3 // 定義重復裝載數據指令
- #define NOP 0xFF // 保留
- //*************************************SPI(nRF24L01)寄存器地址****************************************************
- #define CONFIG 0x00 // 配置收發狀態,CRC校驗模式以及收發狀態響應方式
- #define EN_AA 0x01 // 自動應答功能設置
- #define EN_RXADDR 0x02 // 可用信道設置
- #define SETUP_AW 0x03 // 收發地址寬度設置
- #define SETUP_RETR 0x04 // 自動重發功能設置
- #define RF_CH 0x05 // 工作頻率設置
- #define RF_SETUP 0x06 // 發射速率、功耗功能設置
- #define STATUS 0x07 // 狀態寄存器
- #define OBSERVE_TX 0x08 // 發送監測功能
- #define CD 0x09 // 地址檢測
- #define RX_ADDR_P0 0x0A // 頻道0接收數據地址
- #define RX_ADDR_P1 0x0B // 頻道1接收數據地址
- #define RX_ADDR_P2 0x0C // 頻道2接收數據地址
- #define RX_ADDR_P3 0x0D // 頻道3接收數據地址
- #define RX_ADDR_P4 0x0E // 頻道4接收數據地址
- #define RX_ADDR_P5 0x0F // 頻道5接收數據地址
- #define TX_ADDR 0x10 // 發送地址寄存器
- #define RX_PW_P0 0x11 // 接收頻道0接收數據長度
- #define RX_PW_P1 0x12 // 接收頻道0接收數據長度
- #define RX_PW_P2 0x13 // 接收頻道0接收數據長度
- #define RX_PW_P3 0x14 // 接收頻道0接收數據長度
- #define RX_PW_P4 0x15 // 接收頻道0接收數據長度
- #define RX_PW_P5 0x16 // 接收頻道0接收數據長度
- #define FIFO_STATUS 0x17 // FIFO棧入棧出狀態寄存器設置
- //**************************************************************************************
-
- void init_io(void)
- {
- CE=0;
- CSN=1;
- SCK=0;
- }
- uchar SPI_RW(uchar byte)//發送指令,接受狀態 ,返回值為狀態值
- {
- uchar bit_ctr;
- for(bit_ctr=0;bit_ctr<8;bit_ctr++)
- {
- MOSI = (byte&0x80);
- byte = (byte<<1);
- SCK = 1;
- byte|=MISO;
- SCK=0;
- }
- return(byte);
- }
- uchar SPI_RW_Reg(uchar reg, uchar value)
- {
- 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); //讀reg的內容
- CSN = 1;
- return(reg_val);
- }
- uchar SPI_Write_Buf(uchar reg, uchar *pBuf, uchar bytes)
- {
- uchar status,byte_ctr;
- CSN = 0;
- status = SPI_RW(reg);
- for(byte_ctr=0; byte_ctr<bytes; byte_ctr++)
- SPI_RW(*pBuf++);
- CSN = 1;
- return(status);
- }
- void TX_Mode(void)
- {
- CE=0;
- SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); /*接收模塊的地址*/
- SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); /*通道0 接收數據地址*/
- SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); /*寫待發數據指令a0*/
- SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); //數據通道0應答允許
- SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); //接收數據通道0允許
- SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1a);//等待 500+86us 自動重發10次
- SPI_RW_Reg(WRITE_REG + RF_CH,40);
- SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //數據傳輸率1Mbps ,發射功率0dBm
- SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); //配置寄存器
- CE=1;
- }
- void checkflag()
- { sta=SPI_Read(STATUS);//讀狀態寄存器
- if(MAX_RT)
- {
- SPI_RW_Reg(FLUSH_TX,0); //沖洗發送FIFO指令//
- }
- SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中斷
- }
- //**********************************主函數************************************************
- void main(void)
- {
- uchar xx;
- init_io();
- while(1)
- {
- checkflag();
- for(xx=0;xx<2;xx++)
- {
- tx_buf[xx]= 0x11; //發數據之前必須把要發送的數據裝入它
- }
- TX_Mode(); //必須啟動發送模塊
- }
- }
復制代碼
所有資料51hei提供下載:
nrf24l01無線報警器.zip
(80.19 KB, 下載次數: 32)
2018-2-28 08:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|