发射端代码
#include <reg52.h> // 51单片机通用寄存器地址库,52也部分通用
#include <stdio.h>
#include <string.h> // 字符串功能函数库
#include "api.h" // NRF24L01的SPI寄存器地址库
#include "ds18b20.h" // OLED屏幕功能函数库
#include "lcd1602.h"
#include "smg.h"
#include <intrins.h>
#define uchar unsigned char // uchar宏定义
#define uint unsigned int // uint宏定义
sbit CE = P1^2;
sbit CSN = P1^3;
sbit SCK = P1^7;
sbit MOSI= P1^1;
sbit MISO= P1^6;
sbit IRQ = P1^4; //射频接口配置
/***************************************************/
#define TX_ADR_WIDTH 32 // 32字节宽度的发送/接收地址
#define TX_PLOAD_WIDTH 26 // 数据通道有效数据宽度
uchar code TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址
uchar RX_BUF[TX_PLOAD_WIDTH]; //定义接收窗口数组
uchar TX_BUF[TX_PLOAD_WIDTH]; //定义发送窗口数组
uchar box[TX_PLOAD_WIDTH]; //定义过渡数据包数组
uchar flag;
uchar str[TX_PLOAD_WIDTH]; //定义字符串数组
uchar bdata sta;
float Q,F,num;
sbit RX_DR = sta^6;
sbit TX_DS = sta^5;
sbit MAX_RT = sta^4; //配置NRF射频模块中断接口
/**************************************************
函数: init_io()
描述:
初始化IO
/**************************************************/
void init_io(void)
{
CE = 0; // 待机
CSN = 1; // SPI禁止
SCK = 0; // SPI时钟置低
IRQ = 1; // 中断复位
memset(&str,0,sizeof(str)); // 清空字符串数组
memset(&TX_BUF,0,sizeof(TX_BUF)); // 清空发送窗口数组
memset(&box,0,sizeof(box)); // 清空过渡数据包数组
TMOD = 0X15;//定时器计数器工作方式配置
TH0=0;
TL0=0;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA = 1; //总中断打开
ET0 = 1; //中断运行
ET1 = 1;
TR0 = 1; //运行控制位
TR1 = 1;
}
/**************************************************/
/**************************************************
函数:delay_ms()
描述:
延迟x毫秒
/**************************************************/
/**************************************************/
/**************************************************
函数:SPI_RW()
描述:
根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01
读出一字节
/**************************************************/
uchar SPI_RW(uchar byte)
{
uchar i;
for(i=0; i<8; i++) // 循环8次
{
MOSI = (byte & 0x80); // byte最高位输出到MOSI
byte <<= 1; // 低一位移位到最高位
SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据
byte |= MISO; // 读MISO到byte最低位
SCK = 0; // SCK置低
}
return(byte); // 返回读出的一字节
}
/**************************************************/
/**************************************************
函数:SPI_RW_Reg()
描述:
写数据value到reg寄存器
/**************************************************/
uchar SPI_RW_Reg(uchar reg, uchar value)
{
uchar status;
CSN = 0; // CSN置低,开始传输数据
status = SPI_RW(reg); // 选择寄存器,同时返回状态字
SPI_RW(value); // 然后写数据到该寄存器
CSN = 1; // CSN拉高,结束数据传输
return(status); // 返回状态寄存器
}
/**************************************************/
/**************************************************
函数:SPI_Read()
描述:
从reg寄存器读一字节
/**************************************************/
uchar SPI_Read(uchar r