📄 receive.c
字号:
#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 RX2_EN 15
//通信方式设置
#define CM 14
//发射数据速率
#define RFDR_SB 13
//晶振频率 3位
#define XO_F 10
//发射输出电源 2位
#define RF_PWF 8
//频道设置 7位
#define RF_CH# 1
//接受或发射操作 RXEN
#define RX_EN 0
#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)
unsigned char buffer[32]="";
unsigned char buf_cnt=0;
void delay_us(unsigned int i)//8.000M晶振 延时i+2us
{
if(i==0)
return;
while(i--)
{
NOP();
NOP();
}
}
;
void UART_init(void)//串口通信初始化
{
UCSRB = BIT(TXEN); //允许串口发送
UCSRA = BIT(U2X);//双倍速
UBRR=25; //波特率设置成38.4k UCSRC = BIT(URSEL)|BIT(UCSZ1)|BIT(UCSZ0); //8位数据位+1位stop位
}
void putchar(unsigned char DataLength)//数据长度单位为bit
{
unsigned char i;
for (i=0 ;i<DataLength;i++) //将发送缓冲区的数据发送
{
while(!(UCSRA&(1<<UDRE)));
UDR=buffer[i];
}
/*if(DataLength&7!=0)
{
while(!(UCSRA&(1<<UDRE)));
UDR=buffer[i]&(0xff<<(8-DataLength&7));
}*/
}
unsigned char configr[15]=
{
0x20, //接受频道2有效数据的长度
0x30, //接受频道1有效数据的长度 48bit
0x0a,0x0b,0x0c,0x0d,0x0e,//接受频道2的地址,最高为5个字节
0xaa,0xac,0xac,0xac,0x1a, //接受频道1的地址,最高为5个字节
0x78, //接受频道地址位数(6位)30bit;8位或16位CRC校验(1位);使能CRC校验(1位),
0x47,0x65 //常用器件配置
}
;
unsigned char rec_char() //shockburst方式接受一个字节的数据
{
unsigned char data=0;
signed char i=8;
while(i>=1)
{
--i;
set_clk1();
NOP();
NOP();
NOP();
NOP();
data|=(chk_data()<<i);
clr_clk1();
NOP();
}
return data;
}
void trans(unsigned char *p,unsigned char len)//发送len个字节的数据
{
signed char i;
unsigned char len1;
for(len1=0;len1<len;len1++)
{
for(i=7;i>=0;i--)
{
if(CHKBIT(p[len1],i)!=0)
set_data();
else
clr_data();
NOP();
NOP();
NOP();
NOP(); // Ts 延时大于500ns
set_clk1();
NOP();
NOP();
NOP();
NOP(); //延时大约500ns
clr_clk1();
}
}
}
void init_conf()
{
DDRD=0XF8;
clr_ce();
set_cs();
delay_us(5);
trans(configr,15);
clr_cs();
}
void receive()
{
PORTD&=0xf3;
DDRD&=(~BIT(DATA))&(~BIT(DR1));
set_ce();
clr_clk1();
delay_us(200);//模式转换时间
while(chk_dr1()==0);
buf_cnt=0;
//clr_clk1();
//clr_ce();
while(chk_dr1()==1)
{
buffer[buf_cnt]=rec_char();
buf_cnt++;
}
clr_ce();
}
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x0f;
PORTB = 0x00;
DDRB = 0x02;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xF8;
}
void main(void)
{
port_init();
UART_init();
set_pwr_up();
delay_us(3000);
init_conf();
//PORTB|=BIT(PB1);
while(1)
{
receive();
PORTB=~PORTB;
putchar( buf_cnt);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -