1、该设计在主函数里只写了遥控器按键无线控制其他32单片机LED的亮灭,无线收发采用NRF2401模块,外部扩展了6轴MPU6050模块与4针I2C控制的OLED模块,遥感通过32芯片的ADC采集引脚采集遥感不同方向的电压值控制。
2、电路原理图
3、程序(基于正点原子实验33 NRF24L01无线通信实验程序修改)
main函数修改
int main(void)
{
u8 key,mode;
u16 t=0;
u8 tmp_buf[33];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组二
delay_init(168); //初始化延时
uart_init(115200); //串口波特率115200
LED_Init(); //初始LED
LCD_Init(); //LCD初始化
KEY_Init(); //按键初始化
NRF24L01_Init(); //初始化NRF24L01
POINT_COLOR=RED;//设置为红色字体
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"NRF24L01 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/9");
while(NRF24L01_Check())
{
LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"NRF24L01 OK");
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)//按下K0,为接收模式
{
mode=0;
break;
}else if(key==KEY1_PRES)//按下K1,为发送模式
{
mode=1;
break;
}
t++;
if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode KEY1:TX_Mode"); //闪烁显示提示
if(t==200)
{
LCD_Fill(10,150,230,150+16,WHITE);
t=0;
}
delay_ms(5);
}
LCD_Fill(10,150,240,166,WHITE);//清空上面显示
POINT_COLOR=BLUE;//设置为蓝色字体
if(mode==0)//接收模式
{
LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");
LCD_ShowString(30,170,200,16,16,"Received DATA:");
NRF24L01_RX_Mode();
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0)//显示接收消息
{
tmp_buf[32]=0;//加入字符串结束符
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
switch(tmp_buf[0])
{
case 'A'://接收到A,LED都灭PF2,PF3高电平PF4,PF5低电平
LED0 = 1;
LED1 = 1;
GPIO_SetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
GPIO_ResetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
// delay_ms(500);
// GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
break;
case 'B':
LED0 = 1;
LED1 = 0;
GPIO_SetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
GPIO_ResetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
// delay_ms(100);
// GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
break;
case 'C':
LED0 = 0;
LED1 = 1;
GPIO_SetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
// delay_ms(500);
// GPIO_ResetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
break;
case 'D':
LED0 = 0;
LED1 = 0;
GPIO_SetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
// delay_ms(100);
// GPIO_ResetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
break;
}
}
else
delay_us(100);
};
}
else//发送模式
{
LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Mode");
NRF24L01_TX_Mode();
mode = 0;//有一段延时没有发送则为接收模式
while(1)
{
key = KEY_Scan(1); //获取键值
if(key)
{
switch(key)
{
case WKUP_PRES: //按下KEY_UP发送A
mode='A';
LED0=!LED0;
break;
case KEY0_PRES:
mode='D';
LED0=!LED0;
break;
case KEY1_PRES:
mode='C';
LED1=!LED1;
break;
case KEY2_PRES:
mode='B';
LED0=!LED0;
LED1=!LED1;
break;
}
}else
{
tmp_buf[0] = mode;
tmp_buf[31] = 0; //?????
if(NRF24L01_TxPacket(tmp_buf) == TX_OK)
{
LCD_ShowString(30,170,239,32,16,"Sended DATA:");
LCD_ShowString(30,190,lcddev.width-1,32,16,tmp_buf);
}
else
{
LCD_Fill(0,170,lcddev.width,170+16*3,WHITE);
LCD_ShowString(30,170,lcddev.width-1,32,16,"Send Failed ");
};
mode = 0;
delay_ms(10);
}
}
}
}
LED函数配置
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
GPIO_ResetBits(GPIOF, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
1、该设计在主函数里只写了遥控器按键无线控制其他32单片机LED的亮灭,无线收发采用NRF2401模块,外部扩展了6轴MPU6050模块与4针I2C控制的OLED模块,遥感通过32芯片的ADC采集引脚采集遥感不同方向的电压值控制。
2、电路原理图
3、程序(基于正点原子实验33 NRF24L01无线通信实验程序修改)
main函数修改
int main(void)
{
u8 key,mode;
u16 t=0;
u8 tmp_buf[33];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组二
delay_init(168); //初始化延时
uart_init(115200); //串口波特率115200
LED_Init(); //初始LED
LCD_Init(); //LCD初始化
KEY_Init(); //按键初始化
NRF24L01_Init(); //初始化NRF24L01
POINT_COLOR=RED;//设置为红色字体
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"NRF24L01 TEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2014/5/9");
while(NRF24L01_Check())
{
LCD_ShowString(30,130,200,16,16,"NRF24L01 Error");
delay_ms(200);
LCD_Fill(30,130,239,130+16,WHITE);
delay_ms(200);
}
LCD_ShowString(30,130,200,16,16,"NRF24L01 OK");
while(1)
{
key=KEY_Scan(0);
if(key==KEY0_PRES)//按下K0,为接收模式
{
mode=0;
break;
}else if(key==KEY1_PRES)//按下K1,为发送模式
{
mode=1;
break;
}
t++;
if(t==100)LCD_ShowString(10,150,230,16,16,"KEY0:RX_Mode KEY1:TX_Mode"); //闪烁显示提示
if(t==200)
{
LCD_Fill(10,150,230,150+16,WHITE);
t=0;
}
delay_ms(5);
}
LCD_Fill(10,150,240,166,WHITE);//清空上面显示
POINT_COLOR=BLUE;//设置为蓝色字体
if(mode==0)//接收模式
{
LCD_ShowString(30,150,200,16,16,"NRF24L01 RX_Mode");
LCD_ShowString(30,170,200,16,16,"Received DATA:");
NRF24L01_RX_Mode();
while(1)
{
if(NRF24L01_RxPacket(tmp_buf)==0)//显示接收消息
{
tmp_buf[32]=0;//加入字符串结束符
LCD_ShowString(0,190,lcddev.width-1,32,16,tmp_buf);
switch(tmp_buf[0])
{
case 'A'://接收到A,LED都灭PF2,PF3高电平PF4,PF5低电平
LED0 = 1;
LED1 = 1;
GPIO_SetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
GPIO_ResetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
// delay_ms(500);
// GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
break;
case 'B':
LED0 = 1;
LED1 = 0;
GPIO_SetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
GPIO_ResetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
// delay_ms(100);
// GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
break;
case 'C':
LED0 = 0;
LED1 = 1;
GPIO_SetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_3);
// delay_ms(500);
// GPIO_ResetBits(GPIOF, GPIO_Pin_4 | GPIO_Pin_5);
break;
case 'D':
LED0 = 0;
LED1 = 0;
GPIO_SetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
GPIO_ResetBits(GPIOF, GPIO_Pin_2 | GPIO_Pin_5);
// delay_ms(100);
// GPIO_ResetBits(GPIOF, GPIO_Pin_3 | GPIO_Pin_4);
break;
}
}
else
delay_us(100);
};
}
else//发送模式
{
LCD_ShowString(30,150,200,16,16,"NRF24L01 TX_Mode");
NRF24L01_TX_Mode();
mode = 0;//有一段延时没有发送则为接收模式
while(1)
{
key = KEY_Scan(1); //获取键值
if(key)
{
switch(key)
{
case WKUP_PRES: //按下KEY_UP发送A
mode='A';
LED0=!LED0;
break;
case KEY0_PRES:
mode='D';
LED0=!LED0;
break;
case KEY1_PRES:
mode='C';
LED1=!LED1;
break;
case KEY2_PRES:
mode='B';
LED0=!LED0;
LED1=!LED1;
break;
}
}else
{
tmp_buf[0] = mode;
tmp_buf[31] = 0; //?????
if(NRF24L01_TxPacket(tmp_buf) == TX_OK)
{
LCD_ShowString(30,170,239,32,16,"Sended DATA:");
LCD_ShowString(30,190,lcddev.width-1,32,16,tmp_buf);
}
else
{
LCD_Fill(0,170,lcddev.width,170+16*3,WHITE);
LCD_ShowString(30,170,lcddev.width-1,32,16,"Send Failed ");
};
mode = 0;
delay_ms(10);
}
}
}
}
LED函数配置
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
GPIO_ResetBits(GPIOF, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
举报