当前位置:   article > 正文

单片机实验二(GPIO口输入+定时器实验)_单片机实验二电子琴

单片机实验二电子琴

一、实验设备

PC机一台、实验箱一台。

二、实验内容

实现电子琴功能,控制不同的开关,可以实现不同频率的音频输出,完成歌曲《一闪一闪亮晶晶》的演奏,曲谱如图1所示,各个音符对应的频率如表1所示。

表1 音符及频率对应关系

   音符频率(Hz)
    DO  262
    RE    294
MI330
FA349
SOL392
LA440
(高)DO1523

图1  《一闪一闪亮晶晶》曲谱

三、实验过程

①先在CUBE软件中进行硬件的图形化配置,选择STM32F407ZE芯片后,先进行常规的RCC和SYS设置,并配置时钟树使得HCLK为168MHz(如图2所示),在项目管理中进行项目的命名、存放地址、IDE等配置。

图2 时钟树的配置

②分析实验得,需要用到定时器的PWN输出,打开定时器并开启PWN输出功能,配置使得定时器Prescaler为83,Counter Period和pulse进行不报错的配置即可(如图3所示),在KEIL中会使用函数再进行配置。

图3 定时器的配置

③分析实验得,需要打开八个按键来完成音调的输出,打开八个GPIO开启输入模式(如图4所示)。

图4 GPIO的配置 

④生成配置代码,进入到KEIL中完成相关功能代码,先进行KEIL的常规配置,设置晶振频率为8MHz,并设置硬件调试模式为J-LINK/J-TRACE Cortex。

⑤在gpio中定义一个按键扫描函数来扫描对应按键的按下,并在main函数中调用按键扫描函数,输入PWN波输出函数,并根据对应按键的按下来调用定时器的函数改变PWN波输出的频率(音调)和占空比(音量),编译下载后,进行硬件连线从而实现实验功能。

  1. //按键扫描函数
  2. uint8_t KEY_Scan()
  3. {
  4. if(KEY1 == 0||KEY2 == 0||KEY3 == 0||KEY4 == 0||KEY5 == 0||KEY6 == 0||KEY7 == 0||KEY8 == 0)
  5. {
  6. HAL_Delay(20);
  7. if(KEY1 == 0) return 1;
  8. else if(KEY2 == 0) return 2;
  9. else if(KEY3 == 0) return 3;
  10. else if(KEY4 == 0) return 4;
  11. else if(KEY5 == 0) return 5;
  12. else if(KEY6 == 0) return 6;
  13. else if(KEY7 == 0) return 7;
  14. else if(KEY8 == 0) return 8;
  15. }
  16. return 0;
  17. }
  1. //音调输出函数
  2. {
  3. key = KEY_Scan();
  4. switch(key)
  5. {
  6. case 0:
  7. {
  8. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
  9. break;
  10. }
  11. case 1:
  12. {
  13. __HAL_TIM_SetAutoreload(&htim1,1000000/262);
  14. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/262*0.9);
  15. break;
  16. }
  17. case 2:
  18. {
  19. __HAL_TIM_SetAutoreload(&htim1,1000000/294);
  20. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/294*0.9);
  21. break;
  22. }
  23. case 3:
  24. {
  25. __HAL_TIM_SetAutoreload(&htim1,1000000/330);
  26. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/330*0.9);
  27. break;
  28. }
  29. case 4:
  30. {
  31. __HAL_TIM_SetAutoreload(&htim1,1000000/349);
  32. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/349*0.9);
  33. break;
  34. }
  35. case 5:
  36. {
  37. __HAL_TIM_SetAutoreload(&htim1,1000000/392);
  38. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/392*0.9);
  39. break;
  40. }
  41. case 6:
  42. {
  43. __HAL_TIM_SetAutoreload(&htim1,1000000/440);
  44. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/440*0.9);
  45. break;
  46. }
  47. case 7:
  48. {
  49. __HAL_TIM_SetAutoreload(&htim1,1000000/492);
  50. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/492*0.9);
  51. break;
  52. }
  53. case 8:
  54. {
  55. __HAL_TIM_SetAutoreload(&htim1,1000000/523);
  56. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/523*0.9);
  57. break;
  58. }
  59. }

四、实验收获

①学会了PWN输出频率的计算公式:PWN波频率=定时器的输入时钟频率/[(PRESCALE+1)*(Counter Period+1)]

②学会了PWN输出高低电平的机制,计数值<PULSE值,PWN波输出有效电平,而在计数值>PULSE时,PWN波输出无效电平,PULSE值小于Counter Period

③学会了PWN波占空比的计算公式:占空比=高电平时间/周期=PULSE/Counter Period(有效电平为高电平)= PULSE/Counter Period(有效电平为低电平)。

④学会了对GPIO输入的读取,以及常用的按键扫描函数代码及按键消抖功能。

⑤学会了在CUBE中对GPIO输入和定时器PWN波输出的配置和在KEIL软件中的调用,并学会了在KEIL软件中改变定时器频率和占空比的函数调用。

⑥学会了在.h文件中对GPIO读取函数进行宏定义来增加代码可读性并减小编程工作量的方法。

⑦每一个PWN输出模式对应的输出管脚是不一样的,一种输出模式可能对应着多个输出管脚,要观察配置中的输出端口,以防硬件连接出错。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/302019
推荐阅读
相关标签
  

闽ICP备14008679号