完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想实现的功能就是用一个单片机通过按键控制另一个单片机的i/0口的输出,程序这样写可以吗?
自己调试的时候调不通,因为就只有两块开发板没其他工具所以也不知道是不是硬件的问题,所以先来问问程序有问题吗,多谢大神指教啊 #include #include #include "RF24.h" //****************************************长延时***************************************** void Delay(unsigned int s) { unsigned int i; for(i=0; i //****************************************************************************************** uint bdata sta; //状态标志 ***it RX_DR =sta^6; ***it TX_DS =sta^5; ***it MAX_RT =sta^4; /****************************************************************************************** /*延时函数 /******************************************************************************************/ void inerDelay_us(unsigned char n) { for(;n>0;n--) _nop_(); } //**************************************************************************************** /*NRF24L01初始化 //***************************************************************************************/ void init_NRF24L01(void) { inerDelay_us(100); CE=0; // chip enable CSN=1; // Spi disable SCK=0; // Spi clock line init high SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_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,主发送 } /**************************************************************************************************** /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI写时序 /****************************************************************************************************/ uint SPI_RW(uint uchar) { uint bit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit { MOSI = (uchar & 0x80); // output 'uchar', MSB to MOSI uchar = (uchar << 1); // shift next bit into MSB.. SCK = 1; // Set SCK high.. uchar |= MISO; // capture current MISO bit SCK = 0; // ..then set SCK low again } return(uchar); // return read uchar } /**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg) /*功能:NRF24L01的SPI读时序 /****************************************************************************************************/ uchar SPI_Read(uchar reg) { uchar reg_val; CSN = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue CSN = 1; // CSN high, terminate SPI communication return(reg_val); // return register value } /****************************************************************************************************/ /*功能:NRF24L01读写寄存器函数 /****************************************************************************************************/ uint SPI_RW_Reg(uchar reg, uchar value) { uint status; CSN = 0; // CSN low, init SPI transaction status = SPI_RW(reg); // select register SPI_RW(value); // ..and write value to it.. CSN = 1; // CSN high again return(status); // return nRF24L01 status uchar } /****************************************************************************************************/ /*函数: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; // Set CSN low, init SPI tranaction status = SPI_RW(reg); // Select register to write to and read status uchar for(uchar_ctr=0;uchar_ctr CSN = 1; return(status); // return nRF24L01 status uchar } /********************************************************************************************************* /*函数: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 CSN = 1; //关闭SPI return(status); // } /****************************************************************************************************/ /*函数:void SetRX_Mode(void) /*功能:数据接收配置 /****************************************************************************************************/ void SetRX_Mode(void) { 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接收缓冲区中 /******************************************************************************************************/ unsigned char 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); } /*********************************************************************************************************** /*功能:定义端口 /**********************************************************************************************************/ ***it KEY1 = P3^2; //按键1 ***it KEY2 = P3^3; //按键2 ***it KEY3 = P3^5; //按键3 ***it JDQ1 = P0^0; ***it JDQ2 = P0^1; ***it JDQ3 = P0^2; /*********************************************************************************************************** /*函数:main() /*功能:按键1,2,3分别对应独立按键17,18,19.分别控制继电器1,2,3. /**********************************************************************************************************/ void main() { char flag=0; unsigned char TxBuf[20]={0}; //发送 unsigned char RxBuf[20]={0}; //接受 init_NRF24L01(); //初始化 while(1) { if(KEY1==0) //按键1按下 { TxBuf[1]=1; flag=1; JDQ1=0; Delay(200); JDQ1=1; Delay(200); } if(KEY2==0) //按键2按下 { TxBuf[2]=1; flag=1; JDQ2=0; Delay(200); JDQ2=1; Delay(200); } if(KEY3==0) //按键3按下 { TxBuf[3]=1; flag=1; JDQ3=0; Delay(200); JDQ3=1; Delay(200); } if(flag==1) { nRF24L01_TxPacket(TxBuf); //发送数据 TxBuf[1]=0x00; //清零 TxBuf[2]=0x00; TxBuf[3]=0x00; flag=0; Delay(1000); } SetRX_Mode(); //设置成接受模式 RxBuf[1]=0x00; //接受的数组相应位清零 RxBuf[2]=0x00; RxBuf[3]=0x00; Delay(1000); nRF24L01_RxPacket(RxBuf); //接收数据 if(RxBuf[1]|RxBuf[2]|RxBuf[3]) { if(RxBuf[1]==1) { JDQ1 = 0; //继电器1打开 } if(RxBuf[2]==1) { JDQ2 = 0; //继电器2打开 } if(RxBuf[1]==1) { JDQ3 = 0; //继电器3打开 } Delay(3000); } RxBuf[1]=0x00; //清零 RxBuf[2]=0x00; RxBuf[3]=0x00; } } |
|
相关推荐
2个回答
|
|
呵呵,怪不得没有回答。不是一句话的事啊!我是做无线的,也是Proteus板块的版主。需要2401的驱动,我可以给你,来Proteus板块找我,并告诉我你的邮箱。
|
|
|
|
武力戡乱 发表于 2015-3-19 00:05 那个驱动你有没有呀 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
828 浏览 0 评论
824 浏览 0 评论
861 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
836 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1292 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11823 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-29 15:41 , Processed in 0.633346 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号