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

📄 wireless.h

📁 这是基于AVR的单片机程序。用于无线通信。
💻 H
字号:
#include "config.h"

#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

/*****************************************************
* 保存2401的配置信息 * 
******************************************************/

#define TEST_2 0x8E     //MSB D143~D136 
#define TEST_1 0x08     // D135~D128 
#define TEST_0 0x1C     // D127~D120
 
#define DATA1_W 0xE0   //0x20=28字节 //频道1 发送/接收数据长度(单位:Bit)
#define DATA2_W 0x10   //0x10=2 字节 //频道2 发送/接收数据长度(单位:Bit)
                      

//频道1 接收地址 (当前模块地址) 只使用到频道1 
#define ADDR1_4 0xcc   
#define ADDR1_3 0xcc 
#define ADDR1_2 0xcc 
#define ADDR1_1 0xcc 
#define ADDR1_0 0xcc
//频道2 接收地址  频道2未启用 
#define ADDR2_4 0x00 
#define ADDR2_3 0x1c 
#define ADDR2_2 0xcc 
#define ADDR2_1 0xcc 
#define ADDR2_0 0xcc

#define ADDR_W  0x10    //0x10=2字节 //发送/接收地址宽度(单位:Bit) 
#define CRC_L   0x1     //CRC模式 0:8位; 1:16位 
#define CRC_EN  0x1     //CRC校验 0:禁用 1:启用 

#define RX2_EN  0x0     //双频道功能 0:禁用; 1:启用 
#define CM      0x1     // 0:Direct mode; 1:ShockBurst mode 
#define RFDR_SB 0x0     //传输速率 0:250kbps; 1:1Mbps (250kbps比1Mbps传输距离更远) 
#define XO_F    0x3     //nRF2401晶振频率选16M
#define RF_PWR  0x3     //信号发射功率选0dbm

#define RF_CH   0x2     //Channel RF 频率设置 //Channel = 2400MHz + RF_CH * 1.0MHz 
#define RXEN    0x0     //0:Tx; 1:Rx //程序会通过SetTxMode/SetRxMode重新设置此项参数


//将设置信息组合成每个字节的数据信息 
#define  RFConfig_Bit0   TEST_2 
#define  RFConfig_Bit1   TEST_1 
#define  RFConfig_Bit2   TEST_0 
#define  RFConfig_Bit3   DATA2_W 
#define  RFConfig_Bit4   DATA1_W 
#define  RFConfig_Bit5   ADDR2_4
#define  RFConfig_Bit6   ADDR2_3 
#define  RFConfig_Bit7   ADDR2_2 
#define  RFConfig_Bit8   ADDR2_1 
#define  RFConfig_Bit9   ADDR2_0 
#define  RFConfig_Bit10  ADDR1_4 
#define  RFConfig_Bit11  ADDR1_3 
#define  RFConfig_Bit12  ADDR1_2 
#define  RFConfig_Bit13  ADDR1_1 
#define  RFConfig_Bit14  ADDR1_0 
#define  RFConfig_Bit15  (ADDR_W<<2 | CRC_L<<1 | CRC_EN) 
#define  RFConfig_Bit16  (RX2_EN<<7 | CM<<6 | RFDR_SB<<5 | XO_F <<2 | RF_PWR) 
#define  RFConfig_Bit17  (RF_CH<<1 | RXEN)


#define  CS       1<<23     //P0.23
#define  CE       1<<19     //P0.19
#define  PWR_UP   1<<25     //P0.25
#define  DR1      1<<16     //P0.16 连接EINT0
#define  DATA     1<<9      //P0.9 
#define  CLK1     1<<29     //P0.29

#define  LED0     1<<28     //P2.28
#define  LED1     1<<29     //P2.29
#define  KEY1     1<<20     //P0.20

#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0) 
#define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)

uint8 DATA_BUF; //用于ByteRead 和 ByteWrite函数 

uint8 TxAddress[]={0xcc,0xcc,0xcc,0xcc};//接收方通道硬件地址

//通过宏定义将18字节的寄存器参数按照各个功能分解,以便于参数的调整 
uint8  nRF2401_Conf[18] =
     { 
		 RFConfig_Bit0, RFConfig_Bit1, RFConfig_Bit2,
		 RFConfig_Bit3, RFConfig_Bit4, RFConfig_Bit5, 
		 RFConfig_Bit6, RFConfig_Bit7, RFConfig_Bit8, 
		 RFConfig_Bit9, RFConfig_Bit10, RFConfig_Bit11, 
		 RFConfig_Bit12, RFConfig_Bit13, RFConfig_Bit14, 
		 RFConfig_Bit15, RFConfig_Bit16, RFConfig_Bit17
     };
     
     
void Delay100(void)  //11.0592M晶振  868us 左右
  { 
	   uint32 i; 
	   for(i=0;i<100;i++); 
  }
  
void Delay(uint32 n)
{
	uint32 i;
	while(n--)
	for(i=0;i<100;i++);	
}
  


uint8 ByteRead(void) 
  { 
     uint8 i=0; 

     
     for (i=0;i<8;i++) 
        {   
          DATA_BUF=DATA_BUF<<1;
          
          
          IO0DIR = 0x22880000; 
          IO0SET = CLK1;
          
          
          if ((IO0PIN&DATA)) //读取最高位,保存至最末尾,通过左移位完成整个字节
             {  
                DATA_BUF|=BYTE_BIT0; 
             }
          else { 
                 DATA_BUF&=~BYTE_BIT0;
               } 
                 IO0CLR = CLK1; 
          }
      return DATA_BUF; 
   } 
   
   
   
void ByteWrite(uint8 send) 
  { 
     uint8 i; 
     DATA_BUF = send;
     
     IO0DIR|=DATA;   //DATA为输出
     
     IO0CLR = CLK1;
      
     for (i=0;i<8;i++) 
        {  
            if (DATA7) //总是发送最高位 
               { 
                  IO0SET = DATA; 
               } 
              else 
                  { 
                    IO0CLR = DATA; 
                  } 
                  
              IO0SET = CLK1; 
              DATA_BUF=DATA_BUF<<1; 
              IO0CLR = CLK1; 
         }
   }
      
   
   
void Config2401(void) //配置2401,写入初始化设置
   {   
       uint32 i=0;
       uint8 variablel;
       
       IO0DIR|=DATA;   //DATA为输出
        
	   IO0CLR = CS; 
	   IO0CLR = CE; 
	   IO0SET = PWR_UP; //上电
	    
	   for(i=0;i<30;i++)Delay100();//从上电到进入配置模式需要3ms的延时 
	   
	   IO0SET = CS; //使RF2401进入配置方式
	   IO0CLR = DATA;
	   IO0CLR = CLK1;
	   
	   Delay100();
	   
	   for(i=0;i<18;i++) 
	     { 
	        variablel=nRF2401_Conf[i]; 
	        ByteWrite(variablel); 
	      } 
	      
	      Delay100();
	      
	      IO0CLR = CS; //CS置低使配置有效 
	      
	      Delay100(); 
	} 
      
      
      
      
      
void SetTxMode(void)//设置为发送模式
    {  
        IO0DIR|=DATA;   //DATA为输出
        
        //设置为配置模式 
        IO0SET = PWR_UP;
        IO0CLR = CE; 
        IO0SET = CS; 
        Delay100(); 
        
        //配置寄存器0字节RXEN 设置为0:发送模式
        IO0CLR = DATA;
        IO0SET = CLK1; 
        IO0CLR = CLK1; 
        
        //设置为Activemodes(Tx)
        IO0CLR = CS; 
        IO0SET = CE;
        Delay100(); 
     }
     
     
     
     
void SetRxMode(void) //设置为接收模式
   { 
   
        IO0DIR|=DATA;   //DATA为输出
        
		Delay100(); 
		
		//设置为配置模式 
		IO0SET = PWR_UP; 
		IO0CLR = CE; 
		IO0SET = CS; 
		Delay100(); 
		
		//配置寄存器0字节RXEN 设置为1:接收模式 
		IO0SET = DATA; 
		IO0SET = CLK1; 
		IO0CLR = CLK1; 
		
		//设置为Activemodes(Rx) 
		IO0CLR = CS; 
		IO0SET = CE; 
		Delay100(); 
   }
   
   
   
   
//nRF2401数据发送函数 
void nRF2401_TxPacket(uint8 TxBuf[]) //发送TxBuf[]内的数据,长度由DATA1_W决定 
  { 
	   uint32 i; 
	   uint8 variable2;
	   
	   IO0SET = CE;
	    
	   Delay100(); 
	   
	   for(i=0;i<(ADDR_W/8);i++) //写入接收地址(按字节对齐) 
		 { 
		    variable2=TxAddress[i];
		    ByteWrite(variable2); 
		  } 
		  for(i=0;i<(DATA1_W/8);i++) //写入需要发送的数据(按字节对齐)
		     { 
		       variable2=TxBuf[i]; 
		       ByteWrite(variable2); 
		     } 
		IO0CLR = CE; //CE置低使发送有效 
		
		Delay100(); //时钟信号高电平保持 
		Delay100();
		Delay100();
		Delay100(); 
  }
  
  

//检查是否有数据需要接受 如果有,则保存至RxBuf[]
//返回值 0:没有接收到数据 1:接收到数据
uint8 nRF2401_RxPacket(uint8 *RxBuf) 
   { 
        uint32 i;
       
		
		if((IO0PIN&DR1)!=0) 
		  { 
		    for (i=0; i<(DATA1_W/8); i++) 
		       { 
		          *RxBuf = ByteRead(); 
		          RxBuf++; 
		       } 
		  return 1; 
		   } 
		  return 0; 
    }
    
    


⌨️ 快捷键说明

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