单片机PWM技术实现音乐播放教程

版权申诉
0 下载量 41 浏览量 更新于2024-10-10 收藏 93KB RAR 举报
资源摘要信息: "playing_music_with_C.rar_pwm 播放" 在本节中,我们将深入探讨利用PWM(脉冲宽度调制)技术,结合时钟中断功能,使用单片机上的蜂鸣器来播放音乐的基础知识。首先,我们将会对标题中提到的PWM播放进行解释,然后探讨如何使用时钟中断来控制音乐的节拍,最后我们将分析文件列表中提供的文件内容,以了解它们在项目中的具体作用。 首先,PWM是一种广泛应用于电子领域中的技术,它能够通过调整脉冲宽度(即在一个周期内脉冲的高电平时间长度)来控制输出的平均电压值。在单片机应用中,PWM可以用来控制蜂鸣器发出不同频率的声音,从而演奏出不同的音调。通过改变PWM的占空比(脉冲宽度与周期的比率),可以使得蜂鸣器发出各种音符。 时钟中断是单片机中一个非常重要的功能,它允许单片机在固定的时间间隔内产生中断,执行预先设定好的中断服务程序。在音乐播放的上下文中,时钟中断可以用来控制音乐的节拍和节奏,确保音乐的播放节奏准确无误。 现在让我们来分析一下提供的文件列表,以便更好地理解这些文件在音乐播放项目中扮演的角色: 1. playmusic_Opt.Bak:这可能是一个包含优化选项的备份文件,包含了项目配置或者代码优化的设置。 2. playmusic_Uv2.Bak:这个文件可能是另一个备份文件,具体作用可能依赖于所使用的开发环境,例如Keil uVision2的项目配置备份。 3. music.c:这是一个C语言源代码文件,很可能包含了控制音乐播放的主逻辑,定义了音乐的音调、节拍和旋律。 4. playmusic.hex:这是一个编译后的十六进制文件,它是可烧录到单片机中的最终文件格式,包含了能够控制PWM输出的具体指令。 5. playmusic.lnp:这个文件可能是一个项目日志文件,记录了项目编译过程中的各种日志信息。 6. music.LST:通常是一个列表文件,列出了程序的汇编语言版本,可能包含关于程序如何在硬件上执行的具体细节。 7. playmusic.M51:这个文件名暗示它可能是针对8051单片机系列的汇编语言源代码文件,包含了音乐播放的汇编指令。 8. music.OBJ:这是一个目标文件,通常是编译器生成的中间文件,包含未经链接的机器码。 9. playmusic.Opt:这可能是一个包含编译优化设置的文件。 10. 单片机音乐中音调和节拍的确定方法.pdf:这个文件显然是一个教程或指南,描述了如何在单片机中确定音调和节拍,以及如何编写代码以实现音乐播放。 总结来说,利用PWM和时钟中断实现音乐播放涉及到硬件编程和软件设计的综合技能。硬件方面需要对单片机的PWM功能和时钟中断有深入的了解,软件方面需要编写能够精确控制这些硬件功能的代码。通过上述文件列表,我们可以看到一个完整的项目包含了从源代码编写到最终烧录的所有步骤,以及中间的调试和优化过程。这些文件共同构成了一个完整的单片机音乐播放项目,展示了将数字信号转换为可听音乐的整个流程。

package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.content.pm.PackageManager; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import java.io.File; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements MediaPlayer.OnCompletionListener { //获取音频存放路径 String musicfilePate = Environment.getExternalStorageDirectory().getPath() + "/Music/"; //音频播放列表 ArrayList<String> musicPate = new ArrayList<>(); //音频播放类 public static MediaPlayer parser = new MediaPlayer(); //下标 int i = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } else { //已经授权 File file = new File(musicfilePate); File[] files = file.listFiles(); for (File f : files){ String filePath = f.getAbsolutePath(); musicPate.add(filePath); System.out.println(musicPate); } playing(musicPate.get(i)); } } void playing(String path){ parser.reset(); try { //为播放器对象设置音频 parser.setOnCompletionListener(this); //设置音频流类型 parser.setAudioStreamType(AudioManager.STREAM_MUSIC); //设置播放的音频文件路径 parser.setDataSource(path); //播放准备 parser.prepare(); //开始播放 parser.start(); } catch (Exception e) { e.printStackTrace(); } } @Override public void onCompletion(MediaPlayer mediaPlayer) { //歌曲切换播放 i++; if (i>musicPate.size()-1){ i=0; } playing(musicPate.get(i)); } }

2023-06-01 上传

import cv2 import sys import os import time from PyQt5 import QtGui #重新导入 from PyQt5 import QtCore #重新导入 from showPic import Ui_MainWindow from PyQt5.QtCore import * from PyQt5.QtGui import * #导入的外面 from PyQt5.QtWidgets import * camera_path = 0 # 0:自带摄像头 1:外接摄像头 "xxx.mp4" "rtsp://admin:pwd@192.168.2.10/cam/..." capture = cv2.VideoCapture(camera_path) # 初始化播放器 流媒体 fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', 'V') # XVID/DIVX MPEG MJPG X264 video_writer = cv2.VideoWriter("image/myself.mp4", fourcc, 25, (960, 540)) # 存放路径、、帧率fps、尺寸(且保证下面的frame也是这个尺寸) class videoShow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.dir_path = r"E:\pycharm\new_subject\image/" self.pushButton_play.clicked.connect(self.play_video) self.pushButton_pause.clicked.connect(self.pause_video) def play_video(self): self.playing = True def pause_video(self): self.playing = False def timer_pic(self): image_name = self.dir_path + self.file_list[self.n] url = image_name pic_image = cv2.imread(url) pic_image = cv2.cvtColor(pic_image, cv2.COLOR_BGR2RGB) # 将BGR格式图像转换成RGB height, width = pic_image.shape[:2] pixMap = QImage(pic_image.data, width, height, width*3, QImage.Format_RGB888) # 将RGB格式图像转换为八位图 pixMap = QPixmap.fromImage(pixMap) ratio = max(width/self.label.width(), height/self.label.height()) pixMap.setDevicePixelRatio(ratio) # 根据图片比例显示 self.label.setAlignment(Qt.AlignCenter) # 设置居中 self.label.setPixmap(pixMap) if self.playing: flag, frame = capture.read() if flag is False: return frame = cv2.resize(frame, (960, 540)) video_writer.write(frame) cv2.namedWindow("video", 0) cv2.imshow("video", frame) key = cv2.waitKey(25) if key == 27: video_writer.release() cv2.destroyAllWindows() sys.exit(0) if __name__ == '__main__': app = QApplication(sys.argv) ui = videoShow() ui.show() sys.exit(app.exec_()) 优化这段代码,实现录制视频以及点击按钮实现录制、播放、暂停

2023-07-15 上传