标题:
nrf24l01无线报警器主机和丛机源码
[打印本页]
作者:
854100995
时间:
2018-2-28 08:40
标题:
nrf24l01无线报警器主机和丛机源码
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
作者:
持勤补拙
时间:
2018-3-3 10:27
回去试着安装一个在贵重物品上面
作者:
持勤补拙
时间:
2018-3-3 10:31
CE和IRQ为何共用一个IO口呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1