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

📄 transmit.c

📁 采用大规模专用射频集成电路nRF2401A设计、实现短距离无线数据传输设备
💻 C
字号:
//**********************FileName:无线数据传输C代码******************************
//*************************ICCAVR6.31A编译**************************************
//******************************************************************************
#include <iom16v.h>
#include <macros.h>


#define	SETBIT(x,y) (x|=(1<<y))      //set bit y in byte x
#define	CLRBIT(x,y) (x&=(~(1<<y)))   //clear bit y in byte x
#define	CHKBIT(x,y) ((x&(1<<y))>>y)       //check bit y in byte x

#define PWR_UP  	 PD7
#define CE      	 PD6
#define CS			 PD5
#define CLK1		 PD4
#define DATA   		 PD3
#define DR1			 PD2

#define set_pwr_up()	SETBIT(PORTD,PWR_UP)
#define clr_pwr_up()    CLRBIT(PORTD,PWR_UP)
#define set_ce()  	    SETBIT(PORTD,CE)
#define clr_ce()  		CLRBIT(PORTD,CE)
#define set_cs()   		SETBIT(PORTD,CS)
#define clr_cs()        CLRBIT(PORTD,CS)
#define set_clk1()   	SETBIT(PORTD,CLK1)
#define clr_clk1()      CLRBIT(PORTD,CLK1)
#define set_data()  	SETBIT(PORTD,DATA)
#define clr_data()  	CLRBIT(PORTD,DATA)
#define chk_dr1()  		CHKBIT(PIND,DR1)
#define chk_data()  	CHKBIT(PIND,DATA)
//-----------------------------------------------------------------------------
//*************************全局变量定义**************************************//
//-----------------------------------------------------------------------------

volatile unsigned char cnt=0;
unsigned char pw_data[11]={0xff,0xff,0xff,0xff,0x17,0x01,0x02,0x03,0x04,0x05,0x06};	     //nRF2401a发送的数据
unsigned char data_cnt=11;			     //发送数据的字节数

//----------------------------------------------------------------------------
//*********************************延时子函数*********************************
//----------------------------------------------------------------------------
void delay_1ms(void)                   //1ms延时
{
    unsigned int i;
    for(i=0;i<(unsigned int)(1142);i++)//晶振为8MHz,1142=143*xtal-2 xtal为晶振
       ;
}

void delay(unsigned int n)            //整数倍ms延时
{  
   unsigned int i=0;
   for(i=0;i<n;i++)
   delay_1ms();
 }
 

void delay_us(unsigned int i)//8.000M晶振 延时i+2.5us  i=0时为1.75us
{
 if(i==0)
 return;
 while(i--)
 {
 NOP();
 NOP();
 }
 
}
;

 void delay_2_5us()
{
   
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
   
 };
 void delay_2_375us()
{
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
   
    };

 void delay_1_875us()
{
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
    NOP();
   
 };
 void delay_1us()
 {
  NOP();
 }

  
 
//------------------------------------------------------------------------------
//********************************RF寄存器配置**********************************
//------------------------------------------------------------------------------
unsigned char RFConf[2]=
{
   
    0x07,								  //使能第二频道(1位) 通信方式设置(1位) 发射数据速率(1位)	
										  // 晶振频率 3位	发射输出电源功率 2位 
	0x64			 				      //频道设置 7位 接受或发射操作 
};

void trans(unsigned char *p,unsigned char len,signed char ii)//发送len个字节的数据
{
 signed char  i;
 unsigned char len1;
 for(len1=0;len1<len;len1++)
 {
	 for(i=ii;i>=0;i--)
	 {
		 if(CHKBIT(p[len1],i)!=0)
		 set_data();
		 else
		 clr_data(); 		  
		   
		   NOP();		 
		   NOP();		   // Ts 延时大于500ns
		 set_clk1(); 
		   
		   NOP();
		   NOP();    //延时大约500ns
		 clr_clk1();
	 }
 }
}


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



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();
 
 DDRD=0XF8;
 set_ce();
 delay_us(189); 	
  NOP();
  NOP();
  NOP();
  NOP();
  NOP();
  NOP();
 trans2(pw_data,data_cnt);
 
 clr_ce(); 
 
}
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0x85; //setup
 TCNT1L = 0xEE;
  TCCR1B = 0x04; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 //TIMER1 has overflowed
 TCNT1H = 0x85; //reload counter high value
 TCNT1L = 0xEE; //reload counter low value
 if(cnt<200)
 {
  transmit();
  PORTB=~PORTB;
  cnt++;
  
 }
 
}
//**************************I/O口初始化**************************************//
void init_IO(void)
 { 
 PORTA = 0x00;
 DDRA  = 0x0f;
 PORTB = 0x00;
 DDRB  = 0x02;
 PORTC = 0x00; 
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0xfa;
  
  }  




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

void main(void)
{  
  unsigned char FrameMark;
  unsigned char FrameLength;
  CLI();              //关中断
  init_IO();          //IO口初始化
  TIMSK = 0x04; //timer interrupt sources
  timer1_init();
  set_pwr_up();
  delay_us(3000);//延时3m
  init_conf();//初始化NRF2401a配置寄存器
  SEI();              //开中断
  //transmit();
  transform(pw_data,data_cnt);
  while(1)            //完成MCU接收PC机数据(USART),MCU发送数据至nRF2401a,nRF2401a
	                  //将接收至MCU的数据发送出去
  {
  
	
} 
}

⌨️ 快捷键说明

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