找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5244|回复: 2
收起左侧

stm32f103R6,PWM控制蜂鸣器频率串口输出(附带源码和仿真图)

[复制链接]
ID:766423 发表于 2020-6-1 12:42 | 显示全部楼层 |阅读模式
代码仅供参考,小白一枚,请多指教。其中利用了system,TIM2,USART1,按键中断等stm32基本设置。
仿真.PNG 51hei.png 源代码.PNG

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "KEY-LED.h"
  3. #include "bsp_usart.h"
  4. #include <string.h>
  5. #include "bsp_systick.h"
  6. #include "bsp_time.h"


  7. void Delay( uint32_t t );
  8. void RCC_Configuration(void);
  9. void EXTI_Configration(void);
  10. void NVIC_Configration(void);

  11. uint16_t Key_Value=0;

  12. void Delay( uint32_t t )
  13. {       
  14.                 while(--t);
  15. }

  16. void RCC_Configration(void)
  17. {
  18. ErrorStatus HSEStartUpStatus;         /* 定义枚举类型变量 HSEStartUpStatus */

  19.         /* 复位系统时钟设置*/
  20.         RCC_DeInit();
  21.         /* 开启HSE*/
  22.         RCC_HSEConfig(RCC_HSE_ON);
  23.         /* 等待HSE起振并稳定*/
  24.         HSEStartUpStatus = RCC_WaitForHSEStartUp();
  25.         /* 判断HSE起是否振成功,是则进入if()内部 */
  26.         if(HSEStartUpStatus == SUCCESS)
  27.         {
  28.                 /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
  29.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
  30.                 /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
  31.                 RCC_PCLK2Config(RCC_HCLK_Div1);
  32.                 /* 选择PCLK1时钟源为 HCLK(AHB) 8分频   9M*/
  33.                 RCC_PCLK1Config(RCC_HCLK_Div1);
  34. //                /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为4,则PLL输出频率为 8MHz * 4 = 32MHz */
  35. //                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
  36. //                /* 使能PLL */
  37. //                RCC_PLLCmd(ENABLE);
  38. //                /* 等待PLL输出稳定 */
  39. //                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  40.                 /* 选择SYSCLK时钟源为HSE */
  41.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  42.                 /* 等待HSE成为SYSCLK时钟源 */
  43.                 while(RCC_GetSYSCLKSource() != 0x04);
  44.         }
  45. }       
  46. void EXTI_Configration()
  47. {
  48.                 EXTI_InitTypeDef  EXTI_InitStructure;
  49.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
  50.                 //调用GPIO_EXTILineConfig函数分配引脚
  51.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  52.                 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);
  53.     //调用EXTI_Init函数配置外部中断
  54.           EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line13;
  55.           EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  56.           EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
  57.           EXTI_InitStructure.EXTI_LineCmd=ENABLE;
  58.           EXTI_Init(&EXTI_InitStructure);
  59.          
  60. }
  61. /*配置中断优先级*/
  62. void NVIC_Configration ( )
  63. {
  64.         NVIC_InitTypeDef NVIC_InitStructure;
  65.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  66.        
  67.         NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
  68.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  69.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  70.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  71.   NVIC_Init(&NVIC_InitStructure);
  72.        
  73.         NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
  74.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  75.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  76.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  77.   NVIC_Init(&NVIC_InitStructure);
  78.        
  79.         NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  80.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  81.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  82.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  83.   NVIC_Init(&NVIC_InitStructure);
  84.        
  85.         NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  86.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  87.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  88.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  89.   NVIC_Init(&NVIC_InitStructure);
  90. }

  91. void SoftTimerInit(void)
  92. {
  93.   bsp_StartAutoTimer(Key_Scan_TMR_ID,10);
  94. }

  95. int main()
  96. {       
  97.         RCC_Configration();
  98.   Key_Configration();
  99.         NVIC_Configration();
  100.         bsp_InitSysTick();
  101.   SoftTimerInit();       
  102.         EXTI_Configration();
  103.   TIM2_Configuration(5000);
  104.   USART1_Configration();

  105.   printf("--------嵌入式创新设计--------\r\n");
  106.   printf("基于stm32的PWM波调节蜂鸣器频率\r\n");
  107.         printf("------------------------------\r\n");
  108.         printf("key1频率减小      key2频率增加\r\n");       
  109.        
  110. while(1)
  111. {

  112.                  if( bsp_CheckTimer(Key_Scan_TMR_ID) )
  113.          {
  114.                  Key_Value = Key_Prosse();
  115.          }
  116.          if(gKey.KeyStatu == 1)
  117.          {
  118.            if(Key_Value == 1)
  119.                  {
  120.                          Key_Value=0;
  121.                          
  122.                          if(TIM2->ARR < 10000)
  123.                          {
  124.                                  TIM2->ARR += 500;
  125.                          }
  126.                          else if(TIM2->ARR >= 10000)
  127.                          {
  128. //                                 TIM2->ARR = 10000;
  129.                                  printf("超过范围\r\n");
  130.                          }
  131.                  }                         
  132.                  else if(Key_Value == 2)
  133.                  {
  134.                           Key_Value=0;
  135.                          
  136.                          if(TIM2->ARR > 500)
  137.                          {
  138.                            TIM2->ARR -= 500;
  139.                          }
  140.                           else if(TIM2->ARR <= 500)
  141.                          {
  142. //                                 TIM2->ARR = 500;
  143.                                  printf("超过范围\r\n");
  144.                          }       
  145.                  }
  146.                  TIM2->CCR2=(TIM2->ARR)/2;
  147.          }
  148. }
  149. }        
复制代码

所有资料51hei提供下载:
创新设计.7z (315.86 KB, 下载次数: 199)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:743715 发表于 2020-6-14 11:17 | 显示全部楼层
大佬,这个led和数码管没反应啊,这个有什么作用?
回复

使用道具 举报

ID:607298 发表于 2020-9-27 18:28 | 显示全部楼层
感谢分享,正要用这颗芯片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表