#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CE=P1^7;
sbit CSN=P1^6;
sbit SCK=P1^5;
sbit MOSI=P1^4;
sbit MISO=P1^3;
sbit IRQ=P1^2;
sbit FM=P2^4 ;
uchar str[4];
uchar status;
uchar flag=0,t0;
#define WRITE_REG 0x20
#define TX_ADDR 0x10
#define TX_ADR_WIDTH 5
uchar const TX_ADDRESS[TX_ADR_WIDTH]={0x00,0x01,0x02,0x03,0x04};
uchar const RX_ADDRESS[TX_ADR_WIDTH]={0x00,0x01,0x02,0x03,0x04};
#define EN_AA 0x01
#define SETUP_RETR 0x04
#define EN_RXADDR 0x02
#define RF_CH 0x05
#define RX_PW_P0 0x11
#define RX_PLOAD_WIDTH 32
#define RF_SETUP 0x06
#define RX_ADDR_P0 0x0a
#define WR_TX_PLOAD 0xA0
#define TX_PLOAD_WIDTH 32
#define RD_RX_PLOAD 0x61
#define CONFIG 0x00
#define STATUS 0x07
#define FIFO_STATUS 0x17
uint bdata sta; //状态标志
sbit RX_DR =sta^6;
sbit TX_DS =sta^5;
sbit MAX_RT =sta^4;
sbit DQ =P2^3;
void Delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
void inerDelay_us(unsigned char n)
{
for(;n>0;n--)
_nop_();
}
/****************************************************************************************************
/*函数:uint SPI_RW(uint uchar)
/*功能:NRF24L01的SPI写时序
/*上升沿写,下降沿读
/****************************************************************************************************/
uint SPI_RW(uint uc)
{
uint bit_ctr;
for(bit_ctr=0;bit_ctr<8;bit_ctr++) // 8位数据
{
MOSI = (uc & 0x80); // 向MOSI中写入高位
uc = (uc << 1); //左移一位
SCK = 1; // 拉高SCK
uc |= MISO; // 读取MISO中的一位
SCK = 0; // 拉低 SCK
}
return(uc); // return read uchar
}
/****************************************************************************************************
/*函数:uchar SPI_Read(uchar reg)
/*功能:读取一个reg寄存器的值
/****************************************************************************************************/
uchar SPI_Read(uchar reg)
{
uchar reg_val;
CSN = 0; // 开启SPI
SPI_RW(reg); // 写入读取操作指令+寄存器地址
reg_val = SPI_RW(0); // 读取寄存器值
CSN = 1; // 关闭SPI
return(reg_val); // 返回寄存器值
}
/****************************************************************************************************/
/*函数:uchar SPI_RW_Reg(uchar reg, uchar value)
/*功能:NRF24L01写寄存器函数
/****************************************************************************************************/
uint SPI_RW_Reg(uchar reg, uchar value)
{
uint status;
CSN = 0; // 开启SPI
status = SPI_RW(reg); // 写入写入操作指令+寄存器地址
SPI_RW(value); // 写入寄存器值
CSN = 1; // 关闭SPI
return(status); // 返回状态寄存器值
}
/****************************************************************************************************/
/*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于读数据
/*reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
/****************************************************************************************************/
uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; // 开启SPI
status = SPI_RW(reg); // 写入读取操作指令+寄存器地址
for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
pBuf[uchar_ctr] = SPI_RW(0); // 每位依次读取
CSN = 1; //关闭SPI
return(status); // 返回状态寄存器值
}
/*********************************************************************************************************
/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
/*功能: 用于写数据:
/*为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
/*********************************************************************************************************/
uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
{
uint status,uchar_ctr;
CSN = 0; //开启SPI
status = SPI_RW(reg); //写入写入操作指令+寄存器地址
for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
SPI_RW(*pBuf++); //依次写入
CSN = 1; //关闭SPI
return(status); //
}
//****************************************************************************************
/*NRF24L01初始化
//***************************************************************************************/
void init_NRF24L01(void)
{
inerDelay_us(100);
CE=0; // 射频停止工作
CSN=1; // 关闭SPI
SCK=0; // SPI时钟
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, TX_ADR_WIDTH); // 写接收端地址
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动 ACK应答允许
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21
SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致
SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
}
/****************************************************************************************************/
/*函数:void SetRX_Mode()
/*功能:数据接收配置
/****************************************************************************************************/
void SetRX_Mode()
{
CE=0;
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // IRQ收发完成中断响应,16位CRC ,主接收
CE = 1;
inerDelay_us(130);
}
/******************************************************************************************************/
/*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
/*功能:数据读取后放如rx_buf接收缓冲区中
/******************************************************************************************************/
uchar nRF24L01_RxPacket(unsigned char* rx_buf)
{
unsigned char revale=0;
sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况
if(RX_DR) // 判断是否接收到数据
{
CE = 0; //SPI使能
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
revale =1; //读取数据完成标志
}
SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
return revale;
}
/***********************************************************************************************************
/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
/*功能:发送 tx_buf中数据
/**********************************************************************************************************/
void nRF24L01_TxPacket(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); // 装载数据
// SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送
CE=1; //置高CE,激发数据发送
inerDelay_us(10);
}
/***********************************************************************************************************
/*函数:Ds18b20_delay()
/*18B20延时函数
/**********************************************************************************************************/
void Ds18b20_delay(uchar x)
{
uchar t;
for(t=0;t<x;t++)
;
}
/***********************************************************************************************************
/*函数:Init_Ds18b20
/*初始化18B20
/**********************************************************************************************************/
uchar Init_DS18B20()
{
uchar flag;
DQ=1;
Ds18b20_delay(2);//延迟6us
DQ=0;
Ds18b20_delay(200);//延迟480~960us
DQ=1;
Ds18b20_