当前位置:首页 > nrf24l01无线温度传输—51单片机
无线温度传输系统
学校:安徽工业大学 学院:电气信息学院
由于最近要毕业设计了,老师让我做无线通信,然后我上网找了很多资料,决定用24L01做,经过一段时间的摸索,终于实现了24L01的无线温度传输。以下是我的程序,可供大家参考(当中在贴吧中学到了很多关于24l01的知识)。
发射端程序:
#include
#define uchar unsigned char
#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;//标志
sbit CE=P1^1; //发射高电平大于10MS 接收高电平 sbit CSN=P1^2; //低电平ISP使能 sbit SCK=P1^3; //下降沿 sbit MOSI=P1^4; //MCU出 sbit MISO=P1^5; //MCU入 sbit IRQ=P1^6; //中断 uchar bdata sta;
sbit RX_DR =sta^6; //接收数据准备就绪 sbit TX_DS =sta^5; //已发送数据 sbit MAX_RT =sta^4; sbit DQ=P3^3;
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; }
void delay_ms(unsigned int x) {
unsigned int i,j; for(i=0;i j=108; while(j--); } } 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_Read_Buf(uchar reg, uchar *pBuf, uchar bytes) { uchar status,byte_ctr; CSN = 0; status = SPI_RW(reg); for(byte_ctr=0;byte_ctr } 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 CSN = 1; return(status); } void TX_Mode(void) { CE=0; SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS/*接收模块的地址*/, TX_ADR_WIDTH/*地址宽度5*/); SPI_Write_Buf(WRITE_REG + RX_ADDR_P0/*通道0 接收数据地址*/, TX_ADDRESS, TX_ADR_WIDTH); SPI_Write_Buf(WR_TX_PLOAD,/*写待发数据指令a0*/ tx_buf, TX_PLOAD_WIDTH/*20*/); 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(RX_DR) // { // SPI_Read_Buf(RD_RX_PLOAD/*读取接收数据指令*/,rx_buf/*数组[20]*/,TX_PLOAD_WIDTH/*20*/); // flag=1; // } if(MAX_RT) { SPI_RW_Reg(FLUSH_TX/*冲洗发送FIFO指令*/,0); } SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中断 } //以下是DS18B20的操作程序
共分享92篇相关文档