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

📄 tx_data.c

📁 本程序
💻 C
字号:
#include <avr/io.h>
#include <avr/delay.h> 
#include <avr/signal.h>
#include <avr/interrupt.h>


#define SET_PWR PORTA|=(1<<7)
#define CLR_PWR PORTA&=~(1<<7)

#define SET_CE PORTA|=(1<<6)
#define CLR_CE PORTA&=~(1<<6)

#define SET_CS PORTA|=(1<<5)
#define CLR_CS PORTA&=~(1<<5)

#define SET_DR1 PORTA|=(1<<4)
#define CLR_DR1 PORTA&=~(1<<4)

#define SET_CLK1 PORTA|=(1<<1)
#define CLR_CLK1 PORTA&=~(1<<1)

#define SET_DATA PORTA|=(1<<0)
#define CLR_DATA PORTA&=~(1<<0)

//////////////变量定义/////////////////////////////////

unsigned char InitData[18];            //存储配置字
unsigned char TXData[5];
unsigned char temp;
unsigned int i,j,x;
volatile unsigned char pc_command;      //pc当前发出的命令

////////////////////函数声明//////////////////////////////

void init_io();    //初始化io口
void nrf2401_on();    //2401上电
void build_init_word_TX();       //建立配置字
void init_nrf2401();         //配置2401
void build_data(unsigned char n);       //建立要发送的数据
void send_data();            //发送数据
void init_USART(void);  //初始化串口
void put_c(unsigned char c);       //向串口发送数据

///////////////////////函数定义///////////////////////////

int main()
{
	MCUCR = 0x00;
	GICR  = 0x00;
	init_io();
	init_USART();
	nrf2401_on();
	build_init_word_TX();
	init_nrf2401();
	while(1);
	return 0;
}


SIGNAL(SIG_USART_RECV) //串口接收中断服务程序
{
	pc_command=UDR;	
	build_data(pc_command);
    send_data();
	_delay_ms(100);
	put_c(pc_command);
			
}



void init_USART(void)
{
	int baud = 51;
	UBRRH = (unsigned char)(baud>>8); //设置波特率 
	UBRRL = (unsigned char)baud;
	UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);      //初始化串口寄存器的控制位(1<<RXCIE)|(1<<TXCIE)|
	UCSRC = (1<<URSEL)|(3<<UCSZ0);    //设置帧格式8位1停止位         									
    sei();							  //使能全局中断
}

void put_c(unsigned char c) //发送采用查询方式
{
	while( !(UCSRA & (1<<UDRE)) );
	UDR=c;
}


void init_io()
{
	PORTA=0x00;         //pA口初始化为低电平
	DDRA=0xEF;         //pA4为输入,其他为输出
}

void nrf2401_on()
{
	SET_PWR;
	_delay_ms(3);	//延时3ms后完成上电
}

void build_init_word_TX()
{
	InitData[0]=0x8E;// 
	InitData[1]=0x08;// 
	InitData[2]=0x1C;// 
	InitData[3]=0x08;		//RX receiver 2, Datalength 8bit(1 byte)
	InitData[4]=0x08;		//RX receiver 1, Datalength 8bit(1 byte)
	InitData[5]=0x00;
	InitData[6]=0x1c;
	InitData[7]=0xcc;
	InitData[8]=0xcc;
	InitData[9]=0xcc;
	InitData[10]=0x00;
	InitData[11]=0xcc; 		//RX receiver 1 address   High byte
	InitData[12]=0xcc;		//RX receiver 1 address   High byte
	InitData[13]=0xcc;		//RX receiver 1 address   Low byte
	InitData[14]=0xcc;		//RX receiver 1 address   Low byte
	InitData[15]=0x83;		//this is for 32 bit address(Bit7-Bit2), 16bit CRC(Bit1), CRC enable(Bit0) for final chip	
	InitData[16]=0x4f;		//One receiver(Bit7), shock Mode(Bit6), Datarate(Bit5) 250K, crystal(Bit4-Bit2), RF Power(Bit1-Bit0)
	InitData[17]=0x04;		//Channel Number(Bit7-Bit1), RX/TX mode(Bit0)
}

void init_nrf2401()
{
	CLR_CE;						
	SET_CS;						//进入配置模式
	_delay_us(5);
	for (i=0;i<18;i++)     //装入配置字,最高为先进
	{
		temp=InitData[i];
		for (j=0;j<8;j++)
		{
			if(0x80&temp)
				SET_DATA;
			else 
				CLR_DATA;
			_delay_us(500);		
			SET_CLK1;
			_delay_us(500);
			CLR_CLK1;
			temp=temp<<1;
		}
	}
	_delay_us(500);
	CLR_CS;						//cs为低完成配置
	CLR_DATA;
}
 
void build_data(unsigned char n)
{
	TXData[0]=0xcc;		//MSB    ;RX receiver 1 address   High byte
	TXData[1]=0xcc;		//MSB-1  ;RX receiver 1 address   High byte
	TXData[2]=0xcc;		//MSB-2  ;RX receiver 1 address   Low byte
	TXData[3]=0xcc;		//MSB-3  ;RX receiver 1 address   Low  byte
	TXData[4]=n;	    //MSB-4  ;Data byte 9  
}


void send_data()
{
	SET_CE;
	_delay_us(5);
	CLR_CLK1;
	for(i=0;i<5;i++)
	{
		temp=TXData[i];
		for(j=0;j<8;j++)
		{
			if(0x80&temp)
				SET_DATA;
			else 
				CLR_DATA;
			_delay_us(500);			
			SET_CLK1;
			_delay_us(500);
			CLR_CLK1;
			temp=temp<<1;
		}
	}
	CLR_CE;   //开始发送
	CLR_DATA;	
	_delay_us(202);
	
}

⌨️ 快捷键说明

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