STM32
直播中

哈哈哈

9年用户 857经验值
擅长:可编程逻辑
私信 关注
[问答]

如何实现STM32F407ZET6遥控电路的设计?

如何实现STM32F407ZET6遥控电路的设计?

回帖(1)

吴秀英

2021-12-17 11:00:59
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);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分