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

📄 transmit.c

📁 采用大规模专用射频集成电路nRF2401A设计、实现短距离无线数据传输设备
💻 C
📖 第 1 页 / 共 2 页
字号:
	 NOP();
 } 
 return data;
}

//------------------------------------------------------------------------------
//******************************初始化nRF2401a配置寄存器**************************
//------------------------------------------------------------------------------
void init_conf()
{
 DDRD=0XF8;
 clr_ce();
 set_cs();
 delay_us(5);
 trans(RFConf,15,7); 
 clr_cs(); 
 }

//%%%%%%%%%%%%%%%%%%%%%%%%%%%USART串口模块%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//
//-----------------------------------------------------------------------------
//**************************串口发送数据函数***********************************
//-----------------------------------------------------------------------------
//说明:串口数据发送采用查询方式
//入口: buffer[BUFF_SIZE]=通讯缓冲区,通讯缓冲区第3字节=帧长
void putchar(char FrameLength ,char FrameMark)//帧长,帧标志
{
 int  i;
 while(wr_index0 == BUFF_SIZE);//发送缓冲区满,等待 
 while(!(UCSRA&(1<<UDRE)));    //判断上次发送有没有完成
 UDR=0xff;

 while(!(UCSRA&(1<<UDRE)));
 UDR=0x81;                     //发送帧头 0xff81
 
 while(!(UCSRA&(1<<UDRE)));                   
 UDR= FrameLength ;            //发送帧长  帧长=帧标志(1字节)+数据长度
 
 while(!(UCSRA&(1<<UDRE)));
 UDR=FrameMark;                //发送帧标志 

 for (i=0 ;i<FrameLength-1;i++) //将发送缓冲区的数据发送
    {  
    while(!(UCSRA&(1<<UDRE)));
	UDR=tx_buffer[i];
	} 
}

void putchar2()
{
 while(!(UCSRA&(1<<UDRE)));    //判断上次发送有没有完成
 UDR=0xAA;
}




//------------------------------------------------------------------------------
//**************************串口接收中断服务程序********************************
//------------------------------------------------------------------------------
//说明:串口数据接收采用中断方式
//说明: 将本次接收的数据保存到通讯缓冲区
//外部数据设备与无线数据传输设备间的双向数据传输使用相同的帧格式,
//帧头(固定为0xFF81)    帧长(1个字节)  帧标志(1个字节)  数据(不超过254字节)

#pragma interrupt_handler UART_RXC: 12
void UART_RXC(void)                         //串口接收中断函数
  {  char a;
      CLI();        //////////////////////////////      //关中断
     if(rx_buffer_ok== 0 )        //如果一帧没有接收完成
	 
     {   
	 if(rx_buffer[0]!=0xff)
	   wr_index=0;
	 rx_buffer[wr_index] = UDR;
	   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置给一个变量,关闭中断
   }


unsigned char getchar(void)//从缓冲区取数据
{
   unsigned char temp;
   if(wr_index==rd_index)
   return 0;
   else 
       {
	   temp=rx_buffer[rd_index];
	   if(rd_index<(BUFF_SIZE-1))
	          rd_index++;
	    else
		     rd_index=0;
		}
	return temp;
}

//*****************************波特率设置函数**********************************//
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 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();              //开中断
  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==0x01)    //帧标志为0x01,波特率设置(1字节)
     { 
	   DataBaud=rx_buffer[4];
	   tx_buffer[0]=DataBaud;
	   putchar(0x02,0x11);  //波特率已设置,帧标志定义值12H,返回给PC机
	   delay(10);
	   DataBaudSet();       //完成波特率设置
     }      
    
	 
	if(FrameMark==0x02)    //帧标志为0x02,设置发送的数据,并且发送
     {
       for(i=0;i<rx_buffer[2]-1;i++)
	   { 
	      pw_data[i]=rx_buffer[i+4] ;//更改NRF2401a发送的数据
	       tx_buffer[i]=rx_buffer[i+4];
		  } 
	   data_cnt=rx_buffer[2]-1;
	   CLI();
	   transmit();
	   SEI();
	   PORTB=~PORTB;
	   putchar(rx_buffer[2],0x12);          //已设置,帧标志定义值12H,返回给PC机
	   
     } 
	  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 + -