单片机实验四(电子琴自动演奏)

一、实验设备

PC机一台、实验箱一台。

二、实验内容

实现电子琴功能,自动演奏歌曲《葫芦娃》片段,并设置两个按键来实现歌曲的“暂停”和“开始/停止”。

图1 《葫芦娃》曲谱片段

三、实验步骤

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

图2 时钟树的配置

②分析实验得,需要打开定时器并开启PWN波输出,设置PWN波Prescaler为83即可,Counter Period和pulse进行不报错设置(如图3所示)。

图3 定时器的配置

③分析实验得,需要两个按键来实现控制功能,打开两个GPIO并设置为输入模式(如图4所示)。

图4 GPIO开关的配置

④生成配置代码,进入到KEIL中完成相关功能代码,先进行KEIL的常规配置,设置晶振频率为8MHz,并设置硬件调试模式为J-LINK/J-TRACE Cortex,先根据曲谱写入曲谱数组,并写入pwn波输出函数,在while循环中使用递增不断改变曲谱的值,根据曲谱的值改变频率从而改变音调,从而实行歌曲的自动循环演奏,根据对两个按键的扫描通过改变play的值,来完成歌曲的暂停与播放,并通过改变i的值为0来实现歌曲的从头播放,编译下载后,进行硬件连线从而实现实验功能。

//曲谱
uint8_t num[75] = {0,0,	1,1,1,1,3,3,3,		1,1,1,1,3,0,0,		6,6,6,6,6,5,6,6,5,5,1,1,3,3,0,0,0,		8,6,6,5,6,6,5,5,1,1,2,2,0,0,	7,7,7,7,7,7,5,3,3,3,3,5,5,5,5,5,5,0};
//电子琴
  while (1)
  {
		flag = KEY_Scan();
		if(flag!=0)
		{
				if(flag == 1)
				{
					if(play == 0){play = 1;i = 0;}
					else play = 0;	
				}
				else if(flag == 2)
				{
					if(play == 0)play = 1;
					else play = 0;
				}
		}		
		if(play == 1)
		{
			key = num[i];
			i++;
			if(i >= 75) i = 0;
			switch(key)
			{
				case 0:
				{
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);
					break;
				}
				case 1:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/262);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/262*0.9);
					break;
				}
				case 2:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/294);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/294*0.9);
					break;
				}
				case 3:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/330);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/330*0.9);
					break;
				}
				case 4:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/349);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/349*0.9);
					break;
				}
				case 5:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/392);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/392*0.9);
					break;
				}
				case 6:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/440);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/440*0.9);
					break;
				}
				case 7:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/492);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/492*0.9);
					break;
				}
				case 8:
				{
					__HAL_TIM_SetAutoreload(&htim1,1000000/523);
					__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,1000000/523*0.9);
					break;
				}
			}
			HAL_Delay(200);	
	}
		else if(play == 0)__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_2,0);

四、实验收获

 

①学会了在以不同按键实现不同功能的工程中,在按键扫描函数中加入按键正忙变量,来避免出现按键冲突。

②学会了自主设计单片机时,如何规划单片机代码的实现顺序,来逐步验证功能,防止一次性敲完所有代码后,在一次性验证时出现问题,排查错误范围太广。

③通过这次的实验,将理论的单片机知识和实际中的具体问题方案联系了起来,加深了对具体知识的印象,体会了通过STM32分析问题、设计/开发具体问题方案的过程。

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32是由意法半导体(STMicroelectronics)公司推出的基于ARM Cortex-M内核的高性能、低功耗、高性价比32位微控制器系列。自其面世以来,STM32凭借其广泛的适用性和卓越的特性,已成为嵌入式系统设计领域的主流选择之一,广泛应用于工业控制、消费电子、物联网、汽车电子、医疗设备、智能家居等多个领域。 内核与架构 STM32产品线采用了不同版本的ARM Cortex-M内核,包括M0、M0+、M3、M4、M7等,分别对应不同级别的性能需求。这些内核提供单周期乘法、硬件除法、DSP指令集、浮点单元(FPU)等功能,以满足不同应用场景中的计算密集型任务需求。处理器架构遵循哈佛结构,具有独立的指令总线和数据总线,确保高效的代码执行和数据访问。 丰富的外设与接口 STM32微控制器集成了丰富的外设资源,以适应各种复杂系统设计。这些外设包括但不限于: 通信接口:如USART、UART、SPI、I2C、CAN、USB(全速/高速)、Ethernet、无线连接模块(如BLE、Wi-Fi)等,用于实现设备间的串行通信和网络连接。 定时器:多种通用定时器、高级定时器、基本定时器以及PWM输出,支持定时、计数、脉冲捕获、电机控制等多种功能。 模拟外设:高精度ADC(模数转换器)、DAC(数模转换器)、比较器、温度传感器等,用于采集和处理模拟信号。 存储器:内置Flash和SRAM,容量从几KB到几MB不等,满足不同应用的数据存储和运行空间需求。部分型号还支持外部存储器接口(如FSMC、Octo-SPI)以扩展存储能力。 安全与保护机制:如加密加速器、安全单元、内存保护单元(MPU)、看门狗定时器、时钟安全系统(CSS)等,保障系统安全稳定运行。 开发环境与生态系统 STM32拥有强大的软件支持和生态系统,简化开发流程并加速产品上市时间: 开发工具:官方提供STM32CubeMX初始化配置工具,帮助开发者快速进行项目设置、外设配置及代码生成。此外,还有STM32CubeIDE集成开发环境,集成了编译器、调试器和仿真器支持。 软件库:STM32Cube软件包包含HAL(硬件抽象层)库和LL(低层)库,前者提供跨平台、跨系列的统一API接口,后者直接面向寄存器提供高效访问。同时,还提供各类外设驱动、中间件组件(如FreeRTOS、FatFS、LwIP等)以及特定应用框架(如STM32Cube.AI for AI推理)。 社区与资源:ST官方社区、论坛、博客、技术文档、培训材料、应用笔记、用户案例等资源丰富,为开发者提供全方位的技术支持和交流平台。 产品线与封装 STM32产品线按性能、功耗、外设组合等特性划分为多个子系列,如STM32F、STM32L、STM32G、STM32H等,每个子系列下又包含多种型号,以适应不同成本、性能、尺寸和功耗要求。封装形式多样,从小型QFN、LQFP到大型BGA,满足不同应用场景的封装密度和散热需求。 综上所述,STM32微控制器以其强大的内核性能、丰富的外设集成、完善的开发支持和广泛的市场应用,为嵌入式系统设计提供了高度灵活且极具竞争力的解决方案。
第一节 “快速入门”实验例程 实验一 WAVE6000集成开发环境的使用练习…………………………………(4) 实验二 基于WAVE6000 集成开发环境的仿真与调试………………………(9) 实验三 Keil C51集成开发环境的使用练习…………………………………(12) 实验 伟福®仿真器基于Keil C51 集成开发环境的仿真与调试…………(18) 实验五 KEIL®仿真器基于Keil C51集成开发环境的仿真与调试……………(20) 实验六 基于键盘显示的仿真、调试与实验方法……………………………(23) 第二节 “纯软件类” 实验例程(模拟调试) 实验七 拆字程序………………………………………………………………(29) 实验八 拼字程序………………………………………………………………(30) 实验九 数据区传递子程序……………………………………………………(31) 实验十 数据排序实验…………………………………………………………(32) 实验十一 清零程序………………………………………………………………(33) 第三节 “CPU资源” 实验例程(模拟调试/硬件实验) 实验十二 定时器实验…………………………………………………………(34) 实验十三 计数器实验…………………………………………………………(37) 实验十 INT0 中断实验………………………………………………………(40) 实验十五 INT1中断实验………………………………………………………(42) 实验十六 串行口实验 …………………………………………………………(43) 实验十七 P1口输入、输出实验………………………………………………(44) 实验十八 P3.0口输入、P1口输出实验………………………………………(47) 第节 “传统模块” 实验例程(硬件实验) 实验十九 八段码管显示实验…………………………………………………(50) 实验二十 键盘扫描显示实验…………………………………………………(53) 实验二十一 A/D0809转换实验…………………………………………………(55) 实验二十二 D/A0832转换实验…………………………………………………(57) 实验二十三 步进电机控制………………………………………………………(59) 实验二十 8255控制交通灯实验………………………………………………(64) 实验二十五 双机通讯实验………………………………………………………(67) 实验二十六 电子音响驱动实验…………………………………………………(69) 实验二十七 定时器输出PWM实验………………………………………………(70) 实验二十八 555电路实验………………………………………………………(71) 实验二十九 运算放大器实验……………………………………………………(72) 第五节 “新型模块” 实验例程(硬件实验) 实验三十 点阵式LCD122X32液晶显示屏实验………………………………(75) 实验三十一 128X64点阵式液晶模块实验………………………………………(82) 实验三十二 16X2字符式液晶模块………………………………………………(86) 实验三十三 16X16点阵LED 广告屏实验………………………………………(87) 实验三十 接触式 IC卡读写模块……………………………………………(89) 实验三十五 串行E2PROM24C02实验……………………………………………(92) 实验三十六 串行模数转换TLC549实验 ………………………………………(94) 实验三十七 串行数模转换TLC5615实验………………………………………(97) 实验三十八 串行时钟DS1302实验 ……………………………………………(99) 实验三十九 USB1.1接口模块演示实验………………………………………(103) 实验十 RS485 通讯接口实验 ……………………………………………(105) 第六节 “传感器类” 实验例程(硬件实验) 实验十一 电阻式温度测量实验……………………………………………(108) 实验十二 DS18B20 一线式数字温度传感器 ………………………………(110) 实验十三 验…………………………………………………(113) 实验 ……………………………………………………(117) 实验十五 霍尔传感器实验……………………………………………………(119) 第七节 “自由创新” 实验例程(需另配相应器件) (硬件实验) 实验十七 8031最小系统组成实验(AT89C51)…………………………(122) 实验十八 程序存储器扩展实验……………………………………………(125) 实验十九 静态数据存储器扩展实验………………………………………(127) 实验五十 并行I/O口扩展实验 ……………………………………………(129) 实验五十一 串转并的IO口实验 ……………………………………………(132) 实验五十二 并转串的IO口实验 ……………………………………………(134) 实验五十三 多个外中断源扩展实验…………………………………………(136) 实验五十 8155接口芯片使用实验 …………………………………………(138) 实验五十五 并行键盘、显示接口芯片8279使用实验………………………(141) 实验五十六 可编程计数/定时器8253实验 …………………………………(145) 实验五十七 AT89C2051控制步进电机…………………………………………(147) 实验五十八 译码器实验………………………………………………………(149) 实验五十九 微型打印机打印字符………………………………………………(152) 第八节 “扩展模块” 实验例程(需选配相应模块) 实验六十 V/F电压频率转换实验………………………………………(153) 实验六十一 F/V 频率电压转换实验…………………………………………(155) 实验六十三 AD574 转换模块…………………………………………………(156) 实验六十六 非接触式IC 卡读写模块………………………………………(158) 实验六十七 ISD1420 语音录放模块实验……………………………………(161) 实验六十八 基于以太网接口TCP/IP模块实验………………………………(163) 实验七十一 CAN- bus 接口控制实验…………………………………………(166) 第九节 “综合设计” 实验例程 实验七十六 工业顺序控制(INT0 INT1)综合实验…………………………(167) 实验七十七 电子时钟(定时/计数器定时实验)……………………………(169) 实验七十八 万年历时钟实验 …………………………………………………(171) 实验七十九 电子琴演奏实验…………………………………………………(175) 实验八十 直流电机转速测量与控制实验…………………………………(176) 实验八十一 MCS51单片机与IBM微机通信……………………………………(180)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值