nrf24l01无线报警器
当两个单片机之间的无线通信消失时会发出警报
单片机源程序如下:
- #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)
|