标题: STM32f103单片机按键控制sg90舵机代码 [打印本页]

作者: GLP800    时间: 2021-4-24 10:21
标题: STM32f103单片机按键控制sg90舵机代码
最近学习了stm32,就想用它来控制舵机,然后写下这篇文章分享给大家,如果有理解不到位的地方欢迎大家指正。(我使用的是stm32f103rc型号的开发板,其实也可以用在stm32f103c8上面)
按键控制舵机主要就是通过按键中断来进行pwm舵机函数从而进行控制舵机

单片机源程序如下:
  1. #include "key.h"
  2. #include "delay.h"

  3. void KEY_Init(void)
  4. {
  5.         
  6.         GPIO_InitTypeDef GPIO_InitStructure;

  7.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

  8.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
  9.         
  10.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;//PA15
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  12.          GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOA15
  13.         
  14.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13;//PC5
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  16.          GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5

  17.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉         
  19.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
  20.         
  21. }
  22. //按键处理函数
  23. //返回按键值
  24. //mode:0,不支持连续按;1,支持连续按;
  25. //返回值:
  26. //0,没有任何按键按下
  27. //KEY0_PRES,KEY0按下
  28. //KEY1_PRES,KEY1按下
  29. //WKUP_PRES,WK_UP按下
  30. //注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
  31. u8 KEY_Scan(u8 mode)
  32. {         
  33.         static u8 key_up=1;//按键按松开标志
  34.         if(mode)key_up=1;  //支持连按                  
  35.         if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))
  36.         {
  37.                 delay_ms(10);//去抖动
  38.                 key_up=0;
  39.                 if(KEY0==0)return KEY0_PRES;
  40.                 else if(KEY1==0)return KEY1_PRES;
  41.                 else if(WK_UP==1)return WKUP_PRES;
  42.         }else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;              
  43.         return 0;// 无按键按下
  44. }
复制代码
这里因为喔只有一个sg90所以我只在WK_UP按键的中断函数中加入了pwm舵机函数,其它的按键大家可以加入其它的外设来达到按键控制外设的目的。
  1. #include "exti.h"
  2. #include "led.h"
  3. #include "key.h"
  4. #include "delay.h"
  5. #include "usart.h"
  6. #include "pwm.h"

  7.          


  8. //外部中断初始化函数
  9. void EXTIX_Init(void)
  10. {

  11.            EXTI_InitTypeDef EXTI_InitStructure;
  12.            NVIC_InitTypeDef NVIC_InitStructure;

  13.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟

  14.           KEY_Init();//初始化按键对应io模式
  15.           PWM_Init();

  16.     //GPIOC.1 中断线以及中断初始化配置
  17.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);

  18.           EXTI_InitStructure.EXTI_Line=EXTI_Line1;
  19.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  20.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
  21.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  22.           EXTI_Init(&EXTI_InitStructure);                 //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  23.     //GPIOC.13          中断线以及中断初始化配置
  24.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);

  25.           EXTI_InitStructure.EXTI_Line=EXTI_Line13;
  26.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  27.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  28.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  29.           EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  30.     //GPIOA.0          中断线以及中断初始化配置
  31.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);

  32.            EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  33.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  34.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  35.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  36.           EXTI_Init(&EXTI_InitStructure);                //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器



  37.           NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //使能按键所在的外部中断通道
  38.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
  39.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;                                        //子优先级1
  40.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  41.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  42.                
  43.                 NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //使能按键所在的外部中断通道
  44.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  45.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
  46.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  47.           NVIC_Init(&NVIC_InitStructure);


  48.            NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                        //使能按键所在的外部中断通道
  49.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2,
  50.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;                                        //子优先级1
  51.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  52.           NVIC_Init(&NVIC_InitStructure);

  53. }


  54. void EXTI0_IRQHandler(void)
  55. {
  56.   delay_ms(10);    //消抖
  57.         if(WK_UP==1)
  58.         {         
  59.                 LED0=!LED0;
  60.                 LED1=!LED1;        
  61.                 pwm();
  62.         }
  63.         EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
  64. }
  65. void EXTI1_IRQHandler(void)
  66. {                        
  67.         delay_ms(10);   //消抖                        
  68.         if(KEY0==0)        {
  69.                 LED0=!LED0;
  70.         }
  71.           EXTI_ClearITPendingBit(EXTI_Line1);    //清除LINE5上的中断标志位  
  72. }


  73. void EXTI15_10_IRQHandler(void)
  74. {
  75.   delay_ms(10);    //消抖                        
  76.   if(KEY1==0)        {
  77.                 LED1=!LED1;
  78.         }
  79.          EXTI_ClearITPendingBit(EXTI_Line13);  //清除LINE15线路挂起位
  80. }
复制代码
因为篇幅的限制,大家可以自行下载源码查看。
51黑下载: 按键控制舵机.7z (186.19 KB, 下载次数: 109)

作者: llt9394    时间: 2021-7-16 10:20
舵机自增的程序呢?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1