📄 tx_data.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 + -