下面把接收部分的代码发上来: #include <reg52.h> #include <ABSACC.h> #include <intrins.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int sbit Led1=P2^0; sbit Led2=P2^1; sbit Key=P3^7; uchar count; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~~F段码 //-------------------------------------------------------------------------------------------------------------- #define BYTE_BIT0 0x01 #define BYTE_BIT1 0x02 #define BYTE_BIT2 0x04 #define BYTE_BIT3 0x08 #define BYTE_BIT4 0x10 #define BYTE_BIT5 0x20 #define BYTE_BIT6 0x40 #define BYTE_BIT7 0x80 bdata unsigned char DATA_BUF; #define DATA7 ((DATA_BUF&BYTE_BIT7) != 0) #define DATA0 ((DATA_BUF&BYTE_BIT0) != 0) sbit flag =DATA_BUF^7; sbit flag1 =DATA_BUF^0; //-------------------------------------------------------------------------------------------------------------- #define TxRxBuf_Len 4 unsigned char TxRxBuffer[TxRxBuf_Len]; //-----------------------------------------------------NRF905端口配置------------------------------------------- sbit TXEN=P1^0; sbit TRX_CE=P3^2; sbit PWR=P1^1; sbit MISO=P1^6; sbit MOSI=P1^5; sbit SCK=P1^7; sbit CSN=P1^3; sbit AM=P1^4; sbit DR=P3^3; sbit CD=P1^2; //----------------------------------------------------数码管位选IO--------------------------------------------- sbit led1=P2^1; sbit led0=P2^0; sbit led2=P2^2; sbit led3=P2^3; //-------------------------------------------------------------------------------------------------------------- //uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码 //--------------------------------------------------------------------------------------------------------------- #define WC 0x00 #define RC 0x10 #define WTP 0x20 #define RTP 0x21 #define WTA 0x22 #define RTA 0x23 #define RRP 0x24 //--------------------------------------------NRF905寄存器配置-------------------------------------------------- unsigned char idata RFConf[11]= { 0x00, //配置命令// 0x4c, 0x0c, 0x44,0x04,0x04, 0xcc,0xcc,0xcc,0xcc, 0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振 }; //----------------------------------------------延时--------------------------------------------------------------- void Delay(uchar n) { uint k; while(n--) for(k=0;k<8;k++); } //----------------------------------------------------------------------------------------------------------------- void delay1(uint i) { for(;i>0;i--); } //---------------------------------------------------SPI读函数----------------------------------------------------- unsigned char SpiRead(void) { unsigned char j; for (j=0;j<8;j++) { DATA_BUF=DATA_BUF<<1; SCK=1; if (MISO) //读取最高位,保存至最末尾,通过左移位完成整个字节 { DATA_BUF|=BYTE_BIT0; } else { DATA_BUF&=~BYTE_BIT0; } SCK=0; } return DATA_BUF; } //---------------------------------------------------SPI写函数---------------------------------------------------- void SpiWrite(unsigned char send) { unsigned char i; DATA_BUF=send; for (i=0;i<8;i++) { if (DATA7) //总是发送最高位 { MOSI=1; } else { MOSI=0; } SCK=1; DATA_BUF=DATA_BUF<<1; SCK=0; } } //-----------------------------------------------初始化nRF905----------------------------------------------------- void nRF905Init(void) { CSN=1; // Spi disable SCK=0; // Spi clock line init low DR=0; // Init DR for input AM=0; // Init AM for input CD=0; // Init CD for input PWR=1; // nRF905 power on TRX_CE=0; // Set nRF905 in standby mode TXEN=0; // set radio in Rx mode } //-----------------------------------------------NRF905初始化寄存器----------------------------------------------------- void Config905(void) { uchar i; CSN=0; // Spi enable for write a spi command //SpiWrite(WC); // Write config command写放配置命令 for (i=0;i<11;i++) // Write configration words 写放配置字 { SpiWrite(RFConf[i]); } CSN=1; // Disable Spi } //-----------------------------------------------设置发送状态--------------------------------------------------- void SetRxMode(void) { TXEN=0; TRX_CE=1; Delay(1); // delay for mode change(>=650us) } //-------------------------------------------------判断数据接收状态----------------------------------------------------- unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready { if (DR=1&&TRX_CE==1 && TXEN==0) { // Delay(50) ; return 1; } else { return 0; } } //----------------------------------------------------读NRF905接收数据------------------------------------------------------------ void RxPacket(void) { uchar i; Delay(1); // TRX_CE=0; // Set nRF905 in standby mode Delay(100); TRX_CE=0; CSN=0; // Spi enable for write a spi command Delay(1); SpiWrite(RRP); for (i = 0 ;i < 4 ;i++) { TxRxBuffer[i]=SpiRead(); // Read data and save to buffer } CSN=1; Delay(10); TRX_CE=1; } //--------------------------------------------------------数据接收------------------------------------------------ void RX(void) { SetRxMode(); // Set nRF905 in Rx mode while (CheckDR()==0); Delay(10); RxPacket(); Delay(10); } //----------------------------------------------------------------------------------------------------------------- void delay50ms() { uchar i,j; for(i=5;i>0;i--) for(j=200;j>0;j--); } //--------------------------------显示子函数-------------------------------------------------------------------------- void display() { uchar highcount,lowcount; highcount=count/10; lowcount=count%10; P0=table[highcount]; Led1=1; Led2=0; delay50ms(); P0=table[lowcount]; Led1=0; Led2=1; delay50ms(); } //----------------------------------------------------------------------------------------------------------------- void main(void) { uchar k; count=0; nRF905Init(); Config905(); while(1) { for(k=30;k>0;k--) { display(); } RX(); Delay(10); CSN=0; if(TxRxBuffer[0]) { count=TxRxBuffer[0]; display(); } } } |
|