⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 NRF905驱动代码 // The content of this struct is nRF905 s initialize data. // CH_NO=1 433MHZ Normal O
💻 C
字号:
/*这份代码经源码格式软件格式化过
     yang_hx@neusoft.com      */

#include <STC89C51.h>
#include <intrins.h>

#define uchar unsigned char 
#define uint  unsigned int




#define WC		0x00			
// 写配置寄存器
#define RC		0x10 			
// 读配置寄存器
#define WTP		0x20 			
// 向 TX Payload  发送有效数据
#define RTP		0x21			
// 向  TX Payload  接受有效数据
#define WTA		0x22			
// 向TX Address  写入发送地址
#define RTA		0x23			
// 向  TX Address  读出要发送的地址
#define RRP		0x24			
// 从  RX Payload  读取有效数据
/*******************************************************************************************/
typedef struct RFConfig 
{
    uchar n ;
    uchar buf[10];
}
RFConfig ;

code RFConfig RxTxConf=
{
    10,
    0x4c,0x0c,0x44,0x20,0x20,0xcc,0xcc,0xcc,0xcc,0x58 
}
;



uchar data TxBuf[5]=
{
    0x01,0x02 
}
;
//uchar data RxBuf[32];

/*******************************************************************************************/
uchar bdata DATA_BUF ;
sbit flag=DATA_BUF^7 ;
sbit flag1=DATA_BUF^0 ;
/*******************************************************************************************/
sbit TX_EN=P3^5 ;
sbit TRX_CE=P3^4 ;
sbit PWR_UP=P1^7 ;
sbit MISO=P1^3 ;
sbit MOSI=P1^2 ;
sbit SCK=P1^1 ;
sbit CSN=P1^0 ;

sbit AM=P1^5 ;
sbit DR=P1^4 ;
sbit CD=P1^6 ;

sbit K=P3^2 ;
sbit LED=P2^7 ;


void InitIO(void);
// Initialize IO port
void Inituart(void);
// initialize 232 uart
void Config905(void);
// Config nRF905 module
void SetTxMode(void);
// Set nRF905 in Tx mode
void SetRxMode(void);
// Set nRF905 in Rx mode
void TxPacket(void);
// Send data by nRF905

void SpiWrite(uchar);
// Write data to nRF905

void Delay(uchar n);
// Delay 100us




///当前按纽设置
void ID(void)
{
    
    unsigned char temp;
	unsigned char jk ;
    
    P2=0XFF ;

	
    Delay(1);
    
    temp=P2 ; 
	for(jk=10;jk>0;jk--)
	{
	   if(P2!=temp) jk=10;
	   if((temp&0x1f)==0x00) jk=10 ;
	   
	 }	  
    P2=temp ;
    //写回数据,保证IO口不耗电
    
    temp&=0x1f ;
    //保留底5位
    //temp=0x01;
    TxBuf[2]=temp ;
	TxBuf[3]=temp ;
	TxBuf[4]=temp ;
    //保存入发射缓冲
    WDT_CONTR=0x3a ;
    //看门狗 262ms
}

void irq0_str(void)

{
    EX0=1 ;
    EA=1 ;
}


//S1有效  ,P32
void irq_ex(void)interrupt 0 
{
    unsigned char mm=20 ;
    
    
   // ID();
    while(mm--)
    {
        if(K==1)
        {
            return ;
        }
        
        Delay(1);
    }
    PWR_UP=1 ;
    // nRF905 power on
    
    SetRxMode();
	Delay(10);
    while(CD==1);

	Delay(10);
    
    LED=0 ;
    SetTxMode();
    // Set Tx Mode
    TxPacket();
	Delay(10);
    // Transmit Tx buffer data				// Scan key
    
    
    while(K==0)
    {
        SetRxMode();
	    Delay(10);
        while(CD==1);
		Delay(10);
        SetTxMode();
        // Set Tx Mode
        TxPacket();
		Delay(10);
        // Transmit Tx buffer data				// Scan key
        WDT_CONTR=0x3a ;
        //看门狗 262ms
    }
    
  //  WDT_CONTR=0x38 ;
  //  while(1);
    
    
    
}


void main(void)
{
    InitIO();
    // Initialize IO port
    
    
    TxBuf[0]=0x01 ;
    TxBuf[1]=0x02 ;
    
    Config905();
    // Config nRF905 module
    
    SetTxMode();
    // Set Tx Mode
    TxPacket();
    // Transmit Tx buffer data
    Delay(500);
    // delay for led light	
    
    //	SetRxMode();				// Set nRF905 in Rx mode
    
    //////////////////////以上为905初始化完毕//////////////////////////////////////////
    
    
    
    irq0_str();
    
    
    
    // circulation
    while(1)
    {
       // PWR_UP=0 ;
        // nRF905 power OFF
        
        WDT_CONTR=0x3a ;
        //看门狗 262ms
        
        ID();
        
       // LED=1 ;
        
       // PCON=0X02 ;
        //mcu poeer off																				 QQQQQQQQQQQQQQQQQQQQQQ

	   SetRxMode();
	    Delay(60);
        while(CD==1) LED=0;
        
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        
        
        
    }
}


/*******************************************************************************************/
//function InitIO();
/*******************************************************************************************/
void InitIO(void)
{
    
    CSN=1 ;
    // 关闭SPI					
    SCK=0 ;
    // Spi 空闲状态为0
    DR=1 ;
    // Init DR for input
    AM=1 ;
    // Init AM for input
    PWR_UP=1 ;
    // nRF905 power on
    TRX_CE=0 ;
    // Set nRF905 in standby mode
    TX_EN=0 ;
    // set radio in Rx mode	
}

/*******************************************************************************************/
//function Config905();
/*******************************************************************************************/
void Config905(void)
{
    uchar i ;
    CSN=0 ;
    // SPI开始
    SpiWrite(WC);
    // 写配置积存器命令
    // 写入配置数据
    for(i=0;i<RxTxConf.n;i++)
    {
        SpiWrite(RxTxConf.buf[i]);
    }
    CSN=1 ;
    // 关闭SPI
}
/*******************************************************************************************/
//function Delay100us();Delay 100us
/*******************************************************************************************/
void Delay(uchar n)
{
    uint i ;
    
    while(n--)
    for(i=0;i<20;i++)
    WDT_CONTR=0x3a ;
    //看门狗 262ms	
}
/*******************************************************************************************/
//function SpiWrite();
/*******************************************************************************************/
void SpiWrite(uchar byte)
{
    uchar i ;
    DATA_BUF=byte ;
    // Put function's parameter into a bdata variable		
    // Setup byte circulation bits
    for(i=0;i<8;i++)
    {
        //	Delay(1);
        // Put DATA_BUF.7 on data line
        if(flag)MOSI=1 ;
        else 
        MOSI=0 ;
        //	Delay(1);
        SCK=1 ;
        //	Delay(1);				// Set clock line high
        DATA_BUF=DATA_BUF<<1 ;
        // Shift DATA_BUF
        //Delay(1);
        SCK=0 ;
        // Set clock line low 
        //	Delay(1);
    }
}
/*******************************************************************************************/
//function SpiRead();

/*******************************************************************************************/
//function TxPacket();
/*******************************************************************************************/
void TxPacket(void)
{
    uchar i ;
    //Config905();				
    CSN=0 ;
    // 打开SPI	
    SpiWrite(WTP);
    // 写有效数据命令
    for(i=0;i<5;i++)
    {
        SpiWrite(TxBuf[i]);
        // 写入32个数据
    }
    CSN=1 ;
    // 关闭SPI						
    Delay(1);
    CSN=0 ;
    // 打开SPI	
    SpiWrite(WTA);
    // 写目的地址命令
    // 写入4个地址
    for(i=0;i<4;i++)
    {
        SpiWrite(RxTxConf.buf[i+5]);
    }
    CSN=1 ;
    // 关闭SPI
    TRX_CE=1 ;
    TRX_CE=1 ;
    // 启动发送
    Delay(1);
    // while (DR!=1);
    TRX_CE=0 ;
    // 发送完毕
}
/*******************************************************************************************/
//function RxPacket();

/*******************************************************************************************/
//function SetTxMode();
/*******************************************************************************************/
void SetTxMode(void)
{
    TX_EN=1 ;
    TRX_CE=0 ;
    Delay(50);
    // delay for mode change(>=650us)
}
/*******************************************************************************************/
//function SetRxMode();
/*******************************************************************************************/
void SetRxMode(void)
{
    TX_EN=0 ;
    TRX_CE=1 ;
    Delay(50);
    // delay for mode change(>=650us)				
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -