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

📄 transmit.c

📁 采用大规模专用射频集成电路nRF2401A设计、实现短距离无线数据传输设备
💻 C
📖 第 1 页 / 共 2 页
字号:
	   wr_index++;  	  
	   if(wr_index>=2) 
	   {if((rx_buffer[0]==0xff)&&(rx_buffer[1]==0x81)) //帧头为数据帧开始标志,固定为0FF81H 
	    {    
		rx_buffer_top= 1;//帧头标志,为1,判断帧头正确
	    }
	   else { rx_buffer_top= 0;
	   		  wr_index=0;}
	        
	   }
	   if((rx_buffer_top== 1)&&(wr_index>2))
	   { 
	    if ( wr_index > BUFF_SIZE )
	    //当缓冲器溢出时
        {
        wr_index= 0 ; //缓冲器写指针=0 
        }
        //当缓冲器未溢出时
        else if ( wr_index >= rx_buffer[2]+3 ) //判断是否接收完一帧数据 
                                        //(说明:缓冲区第3字节为帧长,代表从帧标志
									   //开始至本帧结束的所有数据的字节数)
        //当一帧数据接受完毕
        {
        rx_buffer_ok= 1 ; //一帧数据接收完成标志,置1为接收完成
		wr_index=0;
		rx_buffer_top=0;
        }
    }
	SEI();/////////////////////////
   }
      else { a=UDR;}  //接收完成则将UDR置给一个变量,关闭中断
   }



//*****************************波特率设置函数**********************************//
void DataBaudSet(void)
{   if(DataBaud==0x01)
	         UBRR=416;                 //Band=2400
	else if(DataBaud==0x02)
	         UBRR=207;                 //Band=4800
    else if(DataBaud==0x03)
	          UBRR=103;                  //Band=9600
	else if(DataBaud==0x04)
	          UBRR=68;                  //Band=14.4K
	else if(DataBaud==0x05)
	          UBRR =51;                 //Band=19.2K
    else if(DataBaud==0x06)
	          UBRR=34;                  //Band=28.8K
	else if(DataBaud==0x07)
	          UBRR=25;                  //Band=38.4K
    else if(DataBaud==0x08)
	          UBRR=16;                   //Band=57.6K
	else if(DataBaud==0x09) 
	          UBRR=12;                   //Band=76.8K
	else if(DataBaud==0x0A)
	         UBRR=8;                  //Band=115.2K
	
	//UBRR = fosc/(16*baud)-1;
	//fosc=8MHz	 
}
void transform(unsigned char *p,unsigned char len)
{
unsigned char  i,j=5;
 for(i=len;i>j; i--) 

 p[i]^=((p[i-1]<<7)|(p[i]>>1)); 
 
 p[5]^=p[5]>>1;
 
 
}
void trans2(unsigned char *p,unsigned char len)//直接方式向nfr2401a发送len个字节的数据
{
 signed char  i;
 unsigned char len1=0;
 while(len1<len)
	{
		
		PORTD^=(p[len1]&0x80)>>4;	//1.5	   
        delay_2_375us();
		PORTD^=(p[len1]&0x40)>>3;		//	1.625
		delay_2_5us();
		PORTD^=(p[len1]&0x20)>>2;		//1.5
		delay_2_5us();
		NOP();
		PORTD^=(p[len1]&0x10)>>1;			//1.375
		delay_2_5us();
		NOP();
		NOP();
		PORTD^=(p[len1]&0x08);		//1.25
		delay_2_5us();
		NOP();
		PORTD^=(p[len1]&0x04)<<1;	
		delay_2_5us();
		PORTD^=(p[len1]&0x02)<<2;	
		delay_2_375us();
		PORTD^=(p[len1]&0x01)<<3;	
		delay_1_875us();	/**/
		len1++;
	}
	NOP();
	delay_1us();
	clr_data();
		
}  
void transmit()
{
 clr_data();
 transform(pw_data,data_cnt);
 DDRD=0XF8;
 set_ce();
 delay_us(189); 	
  NOP();
  NOP();
  NOP();
  NOP();
  NOP();
  NOP();
 trans2(pw_data,data_cnt);
 
 clr_ce(); 
 
}
//-----------------------------------------------------------------------------
//********************************串口初始化函数*****************************//
//-----------------------------------------------------------------------------
void UART_init(void)
  {
    UCSRB = BIT(RXCIE)| BIT(RXEN) |BIT(TXEN);  //允许串口发送和接收,
                                               //并响应接收完成中断
	UCSRA = BIT(U2X);//双倍速
	//设置串口波特率
	
	DataBaudSet();     //初始化设置成38.4k                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
    
	UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0);   //8位数据位+1位stop位 
	  
  }


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%UART串口模块END%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%// 

//**************************I/O口初始化**************************************//
void init_IO(void)
 { 
 PORTA = 0x00;
 DDRA  = 0x0f;
 PORTB = 0x00;
 DDRB  = 0x02;
 PORTC = 0x00; 
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xfa;
  
  }  



//****************************** Watchdog定时器初始化***********************//
void watchdog_init(void)
{  
 WDR();           //防止设置时WATCHDOG超时
 WDTCR=0x0f;      //使能WATCHDOG,采用1MHz的2048分频
}

  
//********************************主函数*************************************// 
//1、MCU完成接收PC机数据(USART中断接收),将接收到的数据发送给nRF2401a
//   nRF2401a将从MCU接收到的数据发送出去

void main(void)
{  
  unsigned char FrameMark;
  unsigned char FrameLength;
  CLI();              //关中断
  init_IO();          //IO口初始化
  UART_init();        //初始化UART  
  set_pwr_up();
  delay_us(3000);//延时3m
  init_conf();//初始化NRF2401a配置寄存器
  SEI();              //开中断
  //transmit();
  while(1)            //完成MCU接收PC机数据(USART),MCU发送数据至nRF2401a,nRF2401a
	                  //将接收至MCU的数据发送出去
  {
  buf_cnt=0;
  if (rx_buffer_ok==1)     //串口一帧数据接收完成
    { 
     unsigned  char i; 
     FrameMark=rx_buffer[3];
     FrameLength=rx_buffer[2];
	 if(FrameMark==0x02)    //帧标志为0x02,设置发送的数据,并且发送
     {
	 unsigned char cnt=6;
	
       /*for(i=0;i<cnt;i++)
	   { 
	      pw_data[i+5]=rx_buffer[i+4] ;//更改NRF2401a发送的数据
	       
       } 
	  */
	  pw_data[6]=rx_buffer[4] ;
	  pw_data[7]=rx_buffer[5] ;
	  pw_data[8]=rx_buffer[6] ;
	  pw_data[9]=rx_buffer[7] ;
	  pw_data[10]=rx_buffer[8] ;
	  pw_data[11]=rx_buffer[9] ;
	  
	   transmit();
	   PORTB=~PORTB;
	   for(i=0;i<cnt;i++)
	   { 
	     
	       tx_buffer[i]=rx_buffer[i+4];
		  } 
	   putchar(rx_buffer[2],0x12);          //已设置,帧标志定义值12H,返回给PC机
	   
     } 
      if(FrameMark==0x01)    //帧标志为0x01,波特率设置(1字节)
     { 
	   DataBaud=rx_buffer[4];
	   tx_buffer[0]=DataBaud;
	   putchar(0x02,0x11);  //波特率已设置,帧标志定义值12H,返回给PC机
	   delay(10);
	   DataBaudSet();       //完成波特率设置
     }      
    
	 
	
	  if(FrameMark==0x03)            //帧标志为0x03,读配置寄存器中的配置
	  {
	     for(i=0;i<15;i++)
		 {
		    tx_buffer[i]=RFConf[i];
		 }
		  putchar(0x10,0x13);           //已设置,帧标志定义值13H,返回给PC机
	   
	  }
	   if(FrameMark==0x04)            //帧标志为0x04,写配置寄存器中的配置
	  {
	     for(i=0;i<15;i++)
		 {
		  	RFConf[i]=rx_buffer[i+4];
		    tx_buffer[i]=rx_buffer[i+4];
		 }
		  putchar(0x10,0x14);           //已设置,帧标志定义值14H,返回给PC机
	   	  init_conf();
	  }
	  
     if(FrameMark==0x05)            //帧标志为0x05,发送
	 
     { 
	 tx_buffer[0]=rx_buffer[3];
	 putchar(0x01,0x15);       //已设置,帧标志定义值15H,返回给PC机
     transmit();
	 PORTB=~PORTB; 
	   
     }
	 if(FrameMark==0x06)	//帧标志为0x06,接收数据
	 {
	  PORTD&=0xf3;
  	  DDRD&=(~BIT(DATA))&(~BIT(DR1));
  	  set_ce();
	  putchar(0x01,0x16);//已设置,帧标志定义值16H,返回给PC机
	  clr_clk1();
	 }
	  if(FrameMark==0x07)            //帧标志为0x07,停止接收
	  {
	   clr_ce();
	   putchar(0x01,0x17);//已设置,帧标志定义值17H,返回给PC机
	  }
	  
	 rx_buffer_ok=0;
     wr_index=0; 	
  }	 
  while(chk_dr1())
    {
	
       	tx_buffer[buf_cnt]=rec_char();
		buf_cnt++;
		
    }
	if(buf_cnt!=0)
	{
	PORTB=~PORTB; 
	 putchar(buf_cnt+1,0xff);
	} 
} 
}

⌨️ 快捷键说明

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