基于STC89C52的控制NRF24L01的程序这个是发送程序改一下可以作为接收程序.docx
- 文档编号:2141253
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:19
- 大小:17.92KB
基于STC89C52的控制NRF24L01的程序这个是发送程序改一下可以作为接收程序.docx
《基于STC89C52的控制NRF24L01的程序这个是发送程序改一下可以作为接收程序.docx》由会员分享,可在线阅读,更多相关《基于STC89C52的控制NRF24L01的程序这个是发送程序改一下可以作为接收程序.docx(19页珍藏版)》请在冰点文库上搜索。
基于STC89C52的控制NRF24L01的程序这个是发送程序改一下可以作为接收程序
这是init.c文件
#include"comm.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharxdatadate_time[6];
ucharxdatai2c_buf[8];
ucharxdataresult;
ucharxdatare_buf[16];
ucharxdatare_cnt;
ucharcheck_sum;
ucharflag_init;
ucharxdataflag_end;
ucharxdataflag_uart_busy;
uintr_cnt;
ucharflag_ex0_isr;
//ucharxdatayear,month,day0;
ucharxdatac_year,c_month,c_day0;
ucharxdatatx_buf1[20];
ucharxdatatx_buf2[20];
ucharxdatatx_buf3[20];
ucharxdatatx_buf4[20];
uintrun_cnt;
/*
================================================================================
*Name:
DelayMs()
*Description:
delaysometimes
*Input:
None
*Output:
None
*Note:
None
================================================================================
*/
voidinit_uart(void)
{
uchari;
TMOD|=0x20;
TH1=0Xfd;
TL1=0Xfd;
SCON=0X50;
TR1=1;
ES=1;
IT0=1;//低电平触发外部中断
EX0=1;//允许外部中断
//-----------------------------------------
for(i=0;i<20;i++)
{
tx_buf1[i]=1;
tx_buf2[i]=2;
tx_buf3[i]=2;
tx_buf4[i]=2;
}
}
/*
================================================================================
*Name:
DelayMs()
*Description:
delaysometimes
*Input:
None
*Output:
None
*Note:
None
================================================================================
*/
////////////////////////////////////////////////////////////////////////////////////////////////
voidsend_one_byte(unsignedchartad)
{
uchartemp;
if(ES==1)
{
ES=0;
temp=1;
}
TI=0;
SBUF=tad;//发送数据os_wait2(K_TMO,1);
while(TI==0);
TI=0;
flag_uart_busy=1;
if(temp==1)
{
ES=1;
}
}
/*
================================================================================
*Name:
DelayMs()
*Description:
delaysometimes
*Input:
None
*Output:
None
*Note:
None
================================================================================
*/
voidjob0(void)//_TASK_0
{
uchartemp;
uchari;
run_led=0;
temp=0x10;
flag_init=0;
init_uart();
flag_uart_busy=1;
P0=0xff;
red_led=1;
run_led=1;
i=1;
if(i==2)
{
RX_Mode();
TX_Mode();
}
init_io();
delay_ms(550);
delay100();
TX_Mode();
send_one_byte(0);
flag_ex0_isr=0;
}
//---------------------------------------------------
voidtask1(void)//_task_1
{
uchari;
run_cnt++;
if(run_cnt>20)
{
run_cnt=0;
flag_init=1;
for(i=0;i<7;i++)
{
tx_buf1[i]=i2c_buf[6-i];
}
check_sum=0;
for(i=0;i<19;i++)
{
check_sum+=tx_buf1[i];
}
tx_buf1[19]=check_sum;
nRF24L01_TxPacket(tx_buf1);
for(i=0;i<7;i++)
{
tx_buf1[i]=i2c_buf[6-i];
send_one_byte(i2c_buf[i]);
}
for(i=0;i<4;i++)
{
send_one_byte(0xff);
}
send_one_byte(check_sum);
}
}
这是main.c文件
#include"comm.h"
#defineucharunsignedchar
#defineuintunsignedint
//---------------------------------------------------
uchart0_isr_cnt;
uintt2_isr_cnt;
uchartemp;
sbitEXT0=P3^2;//外部中断管脚
ucharbdatasta;
sbitRX_DR=sta^6;
sbitTX_DS=sta^5;
sbitMAX_RT=sta^4;
//---------------------------------------------------
voidmain(void)
{
//uchari;
job0();
flag_end=0;
t2_isr_cnt=0;
EA=1;
//check_sum=0;
//------------------------------
while
(1)
{
task1();
if(flag_ex0_isr==1)
{
flag_ex0_isr=0;
}
sta=SPI_Read(STATUS);
if(RX_DR==1||TX_DS==1||MAX_RT==1)
{
IE0=1;//请求中断
}
if(sta!
=0x0e&&sta!
=0x1e)
{
send_one_byte(sta);
}
if(flag_end==1)
{
red_led=1;
re_cnt=0;
}
}
}
//---------------------------------------------------
//---------------------------------------------------
voidint_ext0(void)interrupt0
{
red_led=0;
sta=SPI_Read(STATUS);
if(RX_DR==1)
{
SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);
SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中断
temp=0x55;
}
if(TX_DS==1)
{
SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中断
temp=0x66;
}
elseif(MAX_RT==1)
{
SPI_RW_Reg(FLUSH_TX,0);
SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中断
temp=0x77;
}
red_led=1;
flag_ex0_isr=1;
}
//---------------------------------------------------
这是nrf2401.c文件
#include"comm.h"
ucharconstTX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//DefineastaticTXaddress
ucharxdatarx_buf[TX_PLOAD_WIDTH];
ucharxdatatx_buf[TX_PLOAD_WIDTH];
/**************************************************
Function:
delay100();
Description:
delay100ms
/**************************************************/
voiddelay100(void)
{
ucharx;
uchary;
for(x=0;x<100;x++)
{
for(y=0;y<100;y++)
_nop_();
}
}
/*************************************************/
voiddelay_ms(unsignedintx)
{
unsignedinti,j;
i=0;
for(i=0;i { j=208; while(j--); } } /**************************************************/ voidinit_io(void) { CE=0; CSN=1; SCK=0; } /************************************************** Function: SPI_RW(); Description: WritesonebytetonRF24L01,andreturnthebyteread fromnRF24L01duringwrite,accordingtoSPIprotocol /**************************************************/ ucharSPI_RW(ucharbyte) { ucharbit_ctr; for(bit_ctr=0;bit_ctr<8;bit_ctr++)//output8-bit { MOSI=(byte&0x80);//output'byte',MSBtoMOSI byte=(byte<<1);//shiftnextbitintoMSB.. SCK=1;//SetSCKhigh.. byte|=MISO;//capturecurrentMISObit SCK=0;//..thensetSCKlowagain } return(byte);//returnreadbyte } /**************************************************/ /************************************************** Function: SPI_RW_Reg(); Description: Writesvalue'value'toregister'reg' /**************************************************/ ucharSPI_RW_Reg(BYTEreg,BYTEvalue) { ucharstatus; CSN=0;//CSNlow,initSPItransaction status=SPI_RW(reg);//selectregister SPI_RW(value);//..andwritevaluetoit.. CSN=1;//CSNhighagain return(status);//returnnRF24L01statusbyte } /**************************************************/ /************************************************** Function: SPI_Read(); Description: ReadonebytefromnRF24L01register,'reg' /**************************************************/ BYTESPI_Read(BYTEreg) { BYTEreg_val; CSN=0;//CSNlow,initializeSPIcommunication... SPI_RW(reg);//Selectregistertoreadfrom.. reg_val=SPI_RW(0);//..thenreadregistervalue CSN=1;//CSNhigh,terminateSPIcommunication return(reg_val);//returnregistervalue } /**************************************************/ /************************************************** Function: SPI_Read_Buf(); Description: Reads'bytes'#ofbytesfromregister'reg' TypicallyusedtoreadRXpayload,Rx/Txaddress /**************************************************/ ucharSPI_Read_Buf(BYTEreg,BYTE*pBuf,BYTEbytes) { ucharstatus,byte_ctr; CSN=0;//SetCSNlow,initSPItranaction status=SPI_RW(reg);//Selectregistertowritetoandreadstatusbyte for(byte_ctr=0;byte_ctr pBuf[byte_ctr]=SPI_RW(0);//PerformSPI_RWtoreadbytefromnRF24L01 CSN=1;//SetCSNhighagain return(status);//returnnRF24L01statusbyte } /**************************************************/ /************************************************** Function: SPI_Write_Buf(); Description: Writescontentsofbuffer'*pBuf'tonRF24L01 TypicallyusedtowriteTXpayload,Rx/Txaddress /**************************************************/ ucharSPI_Write_Buf(BYTEreg,BYTE*pBuf,BYTEbytes) { ucharstatus,byte_ctr; CSN=0;//SetCSNlow,initSPItranaction status=SPI_RW(reg);//Selectregistertowritetoandreadstatusbyte for(byte_ctr=0;byte_ctr SPI_RW(*pBuf++); CSN=1;//SetCSNhighagain return(status);//returnnRF24L01statusbyte } /**************************************************/ /************************************************** Function: RX_Mode(); Description: ThisfunctioninitializesonenRF24L01deviceto RXMode,setRXaddress,writesRXpayloadwidth, selectRFchannel,datarate&LNAHCURR. Afterinit,CEistoggledhigh,whichmeansthat thisdeviceisnowreadytoreceiveadatapacket. /**************************************************/ voidRX_Mode(void) { CE=0; SPI_Write_Buf(WRITE_REG+RX_ADDR_P0,TX_ADDRESS,TX_ADR_WIDTH);//UsethesameaddressontheRXdeviceastheTXdevice SPI_RW_Reg(WRITE_REG+EN_AA,0x01);//EnableAuto.Ack: Pipe0 SPI_RW_Reg(WRITE_REG+EN_RXADDR,0x01);//EnablePipe0 SPI_RW_Reg(WRITE_REG+RF_CH,40);//SelectRFchannel40 SPI_RW_Reg(WRITE_REG+RX_PW_P0,TX_PLOAD_WIDTH);//SelectsameRXpayloadwidthasTXPayloadwidth SPI_RW_Reg(WRITE_REG+RF_SETUP,0x07);//TX_PWR: 0dBm,Datarate: 2Mbps,LNA: HCURR SPI_RW_Reg(WRITE_REG+CONFIG,0x0f);//SetPWR_UPbit,enableCRC(2bytes)&Prim: RX.RX_DRenabled.. CE=1;//SetCEpinhightoenableRXdevice //Thisdeviceisnowreadytoreceiveonepacketof16bytespayloadfromaTXdevicesendingtoaddress //'3443101001',withautoacknowledgment,retransmitcountof10,RFchannel40anddatarate=2Mbps. } /**************************************************/ /************************************************** Function: TX_Mode(); Description: ThisfunctioninitializesonenRF24L01deviceto TXmode,setTXaddress,setRXaddressforauto.ack, fillTXpayload,selectRFchannel,datarate&TXpwr. PWR_UPisset,CRC(2bytes)isenabled,&PRIM: TX. ToDo: Onehighpulse(>10us)onCEwillnowsendthis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C52 控制 NRF24L01 程序 这个 发送 一下 可以 作为 接收