第一篇:基于java的音樂播放器課程設計報告
Java課程設計報告
題目:java音樂播放器
姓
名 學
號 院
系 班
級 專
業 任課教師
1.設計內容及要求
能夠實現簡單的音樂播放器功能,如:打開本地文件,播放,暫停,停止,背景播放,單曲循環等等,界面充實,交互友好,可以添加多首歌曲目錄
一個簡單的基于java語言的音樂播放器,菜單欄:文件,播放控制和播放列表,文件菜單包含打開、循環和退出三個菜單項;播放控制菜單包含播放、暫停和停止三個菜單項,播放列表菜單則是當向里面添加歌曲之后才能夠查看到里面所包含的歌曲目錄。當播放歌曲時,可以調節音量大小或者設置是否靜音;可以查看當前播放音樂的相關屬性,如:歌曲名,歌手,發布時間,所屬專輯等等。
2.需求分析
1、時間跟蹤條:根據歌曲播放的進度,控制條自動進行追蹤,用戶可以
隨時了解歌曲的播放進度
2、音量控制鍵:可以點擊該控鍵進行音量大小的調節以及是否靜音的設
置
3、屬性查詢鍵:通過該控鍵,用戶可以查看當前播放音樂的相屬性,獲
取關于該歌曲的用戶所需的相關信息。
4、菜單欄:
①文件:
打開:用戶通過該菜單項打開本地音樂文件,聽任何用戶想
聽的歌曲
循環:通過循環設置,用戶可以重復的播放一首喜歡的歌曲
退出:退出音樂播放器,及退出該程序
②播放控制:
播放:選擇歌曲之后,通過點擊播放菜單項啟動播放器播
放音樂
暫停:暫停當前正在播放的音樂
停止:停止當前正在播放的音樂
③播放列表:當用戶通過文件打開本地音樂文件后,及相當于在
播放列表里面添加了歌曲,及形成相應的歌曲播放目錄
3.總體設計
結合需求分析來看,整個設計包含了簡單的菜單欄,根據用戶需求設置了三個簡單的實現基本操作的菜單,分別是:文件,播放控制,播放列表;根據具體的操作每個菜單還包含了相應的菜單項,文件:打開,循環,退出;播放控制:播放,暫停,停止;播放列表則沒有菜單項,該菜單就是用來顯示或者查看相應的歌曲目錄的。
該音樂播放器設置了兩個窗口,運行程序時打開的初始化歡迎界面,用戶可以根據自己的需求進行菜單欄里面的基本操作和相應的設置,當用戶添加或者打開音樂播放文件的時候,程序將會顯示出第二個音樂文件播放窗口,與此同時,第一個初始化窗口將會自動隱藏,在音樂播放窗口里面用戶可以進行相關的音樂播放的控制操作。
當用戶進入音樂播放窗口時,該窗口有幾個快捷控制的控鍵:時間追蹤軸:可以實現播放的前進、后退功能,根據用戶需求調節音樂的播放進度等;音量控制:設置靜音,打開揚聲器或者調節音量大?。徊シ帕斜恚翰榭串斍安シ乓魳返南嚓P屬性。4.主要功能設計流程
5.系統實現及測試:
(一)JMF(java媒體框架)簡介
JMF 即Java媒體框架。其核心框架支持不同媒體,如音頻輸出和視頻輸出,包括時間的時鐘同步。它是一個標準的擴展框架,允許用戶制作純音頻流和視頻流。
JMF實際上是Java的一個類包。它包括了一個開放的媒體架構,可使開發人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內插組件。
JMF軟件是Java Media系列軟件的一部分。采用各種Java Media API,軟件開發商人員就能容易、快速地為他們已有的各種應用程序和客戶端,Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就是 說,各種Java Media API發揮了Java平臺的固有優勢,將“編寫一次,到處運行”的能力擴展到了圖像、影像和數字媒體等各種應用領域,從而大大縮減了開發時間和降低了開發 成本。
在開發JMF 應用程序之前要完全理解JMF 的體系架構、接口和類。就拿我們的家用攝像機系統作個例子。首先用攝像機拍攝內容,拍攝下來的內容錄制在DV帶中。DV帶可以放在放像機里播放、放像機提供視頻信號給電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從音箱里聽到聲音。JMF API 提供的也是同樣的模型。
JMF 提供的模型可大致分為七類
* 數據源(Data source)
* 截取設備(Capture Device,包括視頻和音頻截取設備)
* 播放器(Player)
* 處理器(Processor)
* 數據池(DataSink)
* 數據格式(Format)
* 管理器(Manager)
如果只是想觀看捕獲的內容,只需要使用捕獲數據源創建播放器Player即可。如果想把捕獲的數據發送到網絡或者保存起來,就需要創建處理器Processor。
基本步驟是首先獲取視頻、音頻捕獲設備的信息,然后再根據取得的設備信息確定設備的位置。找到設備的位置以后,調用ManageCreatePlayer方法創建Player,當Player開始播放的時候,就開始了捕獲的過程。
有多種方法獲得捕獲設備信息,可以通過查詢指定的格式,也可以查詢特定的設備名字。Player準備好播放數據,當Player發出這個事件時,就可以獲取播放器的可視面板和控制面板了。具體步驟如下:
1.先把所有的捕獲設備調出來
2.創建Player,當Play開始的時候,就開始了音頻捕獲的過程
3.以MediaLocator為參數,創建Player 4.為PLAYER添加監聽器,以便監聽RealizeComplete事件
(二)代碼實現
(1)添加庫、包等相關文件 import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.PrefetchCompleteEvent;import javax.media.RealizeCompleteEvent;import javax.media.*;import javax.swing.*;import java.awt.*;
import java.awt.event.*;
(2)初始化窗口 ①界面
②代碼實現
public void setupMenu(){
Menu f = new Menu(“文件”);
MenuItem mi = new MenuItem(“打開”);
CheckboxMenuItem cbmi = new CheckboxMenuItem(“循環”, false);MenuItem ee = new MenuItem(“退出”);f.add(mi);f.add(cbmi);f.add(ee);
mi.addActionListener(this);cbmi.addActionListener(this);ee.addActionListener(this);f.addSeparator();f.addSeparator();f.addSeparator();
Menu l = new Menu(“播放列表”);Menu c = new Menu(“播放控制”);
MenuItem move = new MenuItem(“播放”);MenuItem pause = new MenuItem(“暫?!?;MenuItem stop = new MenuItem(“停止”);move.addActionListener(this);pause.addActionListener(this);stop.addActionListener(this);c.add(move);c.add(pause);c.add(stop);
c.addSeparator();c.addSeparator();c.addSeparator();
MenuBar mb = new MenuBar();mb.add(f);mb.add(c);mb.add(l);
setMenuBar(mb);}
(3)音樂播放窗口機基本功能的實現 ①界面
②代碼實現
public void actionPerformed(ActionEvent e){
String cufile, selectfile, currentDirectory;if(e.getActionCommand().equals(“退出”)){
dispose();
return;}
if(e.getActionCommand().equals(“播放”)){ if(player!= null)
player.start();return;
} if(e.getActionCommand().equals(“暫?!?)
{
if(player!= null)
player.stop();return;}
if(e.getActionCommand().equals(“停止”)){
if(player!= null){
player.stop();
player.setMediaTime(new Time(0));} return;}
if(e.getActionCommand().equals(“打開”)){
FileDialog fd = new FileDialog(this, “打開媒體文件”, FileDialog.LOAD);fd.setVisible(true);
if(fd.getFile()== null)
return;
selectfile = fd.getFile();
currentDirectory = fd.getDirectory();
cufile = currentDirectory + selectfile;
MenuItem mi = new MenuItem(selectfile);mi.setActionCommand(cufile);MenuBar mb = getMenuBar();Menu m = mb.getMenu(2);mi.addActionListener(this);m.add(mi);} else {
cufile = e.getActionCommand();selectfile = cufile;}
if(player!= null)
player.close();try {
player = Manager.createPlayer(new MediaLocator(“file:” + cufile));}catch(Exception e2)
{
System.out.println(e2);return;}
if(player == null){
System.out.println(“無法創建播放器”);return;}
first = false;
setTitle(selectfile);
player.addControllerListener(this);player.prefetch();}
public void itemStateChanged(ItemEvent arg0){ }
public static void main(String[] args){
new MediaPlayer(“播放器”);}
public void controllerUpdate(ControllerEvent e){
Container tainer = getContentPane();if(e instanceof ControllerClosedEvent){
if(vc!= null){
remove(vc);vc = null;}
if(cc!= null){
remove(cc);cc = null;} }
if(e instanceof EndOfMediaEvent){
player.setMediaTime(new Time(0));if(loop)
player.start();return;}
if(e instanceof PrefetchCompleteEvent){
player.start();return;}
if(e instanceof RealizeCompleteEvent){
vc = player.getVisualComponent();if(vc!= null)
tainer.add(vc, BorderLayout.CENTER);
cc = player.getControlPanelComponent();cc.setBackground(Color.blue);if(cc!= null)
{ tainer.add(cc, BorderLayout.SOUTH);if(vc!= null){
pack();return;}
Else {
setSize(300, 75);setVisible(true);return;} } }
}
6.總結與說明
在做寫程序實現功能的過程中,界面和基本功能的設計需要較強的邏輯思維,一不小心就容易出錯,在具體的功能設計和實現的過程中要盡可能用最簡單的語句實現基本的播放器功能。我覺得可以設計更多的菜單及菜單項目從而實現更多的功能,如:刪除,保存等,還可以實現更多的背景效果或者更多可選擇的皮膚,還可以對按鈕添加音效效果,這樣感覺整個音樂播放器更具有靈活性,媒體感更強烈一些,界面會更加豐富和生動一些。
通過自己做課程設計,自己設計界面,功能和設計功能的代碼實現,將理論知識運用到實際操作中,加深了對理論知識的理解和記憶,在做程序設計的過程中,對很多代碼的多次操作和重復使用,使得對很多基本的代碼和相關的操作能夠牢固的記憶。
第二篇:基于java的音樂播放器課程設計報告
Java課程設計報告
題目:java音樂播放器
姓
名 學
號 院
系 班
級 專
業 任課教師
1.設計內容及要求
能夠實現簡單的音樂播放器功能,如:打開本地文件,播放,暫停,停止,背景播放,單曲循環等等,界面充實,交互友好,可以添加多首歌曲目錄
一個簡單的基于java語言的音樂播放器,菜單欄:文件,播放控制和播放列表,文件菜單包含打開、循環和退出三個菜單項;播放控制菜單包含播放、暫停和停止三個菜單項,播放列表菜單則是當向里面添加歌曲之后才能夠查看到里面所包含的歌曲目錄。當播放歌曲時,可以調節音量大小或者設置是否靜音;可以查看當前播放音樂的相關屬性,如:歌曲名,歌手,發布時間,所屬專輯等等。
2.需求分析
1、時間跟蹤條:根據歌曲播放的進度,控制條自動進行追蹤,用戶可以
隨時了解歌曲的播放進度
2、音量控制鍵:可以點擊該控鍵進行音量大小的調節以及是否靜音的設
置
3、屬性查詢鍵:通過該控鍵,用戶可以查看當前播放音樂的相屬性,獲
取關于該歌曲的用戶所需的相關信息。
4、菜單欄:
①文件:
打開:用戶通過該菜單項打開本地音樂文件,聽任何用戶想
聽的歌曲
循環:通過循環設置,用戶可以重復的播放一首喜歡的歌曲
退出:退出音樂播放器,及退出該程序
②播放控制:
播放:選擇歌曲之后,通過點擊播放菜單項啟動播放器播
放音樂
暫停:暫停當前正在播放的音樂
停止:停止當前正在播放的音樂
③播放列表:當用戶通過文件打開本地音樂文件后,及相當于在
播放列表里面添加了歌曲,及形成相應的歌曲播放目錄
3.總體設計
結合需求分析來看,整個設計包含了簡單的菜單欄,根據用戶需求設置了三個簡單的實現基本操作的菜單,分別是:文件,播放控制,播放列表;根據具體的操作每個菜單還包含了相應的菜單項,文件:打開,循環,退出;播放控制:播放,暫停,停止;播放列表則沒有菜單項,該菜單就是用來顯示或者查看相應的歌曲目錄的。
該音樂播放器設置了兩個窗口,運行程序時打開的初始化歡迎界面,用戶可以根據自己的需求進行菜單欄里面的基本操作和相應的設置,當用戶添加或者打開音樂播放文件的時候,程序將會顯示出第二個音樂文件播放窗口,與此同時,第一個初始化窗口將會自動隱藏,在音樂播放窗口里面用戶可以進行相關的音樂播放的控制操作。
當用戶進入音樂播放窗口時,該窗口有幾個快捷控制的控鍵:時間追蹤軸:可以實現播放的前進、后退功能,根據用戶需求調節音樂的播放進度等;音量控制:設置靜音,打開揚聲器或者調節音量大小;播放列表:查看當前播放音樂的相關屬性。4.主要功能設計流程
5.系統實現及測試:
(一)JMF(java媒體框架)簡介
JMF 即Java媒體框架。其核心框架支持不同媒體,如音頻輸出和視頻輸出,包括時間的時鐘同步。它是一個標準的擴展框架,允許用戶制作純音頻流和視頻流。
JMF實際上是Java的一個類包。它包括了一個開放的媒體架構,可使開發人員靈活采用各種媒體回放、捕獲組件,或采用他們自己的定制的內插組件。
JMF軟件是Java Media系列軟件的一部分。采用各種Java Media API,軟件開發商人員就能容易、快速地為他們已有的各種應用程序和客戶端,Java小程序增添豐富的媒體功能,如流式視頻、3D圖像和影像處理等。就是 說,各種Java Media API發揮了Java平臺的固有優勢,將“編寫一次,到處運行”的能力擴展到了圖像、影像和數字媒體等各種應用領域,從而大大縮減了開發時間和降低了開發 成本。
在開發JMF 應用程序之前要完全理解JMF 的體系架構、接口和類。就拿我們的家用攝像機系統作個例子。首先用攝像機拍攝內容,拍攝下來的內容錄制在DV帶中。DV帶可以放在放像機里播放、放像機提供視頻信號給電視機,提供音頻信號給音箱,這樣我們就可以在電視機上看到畫面,從音箱里聽到聲音。JMF API 提供的也是同樣的模型。
JMF 提供的模型可大致分為七類
* 數據源(Data source)
* 截取設備(Capture Device,包括視頻和音頻截取設備)
* 播放器(Player)
* 處理器(Processor)
* 數據池(DataSink)
* 數據格式(Format)
* 管理器(Manager)
如果只是想觀看捕獲的內容,只需要使用捕獲數據源創建播放器Player即可。如果想把捕獲的數據發送到網絡或者保存起來,就需要創建處理器Processor。
基本步驟是首先獲取視頻、音頻捕獲設備的信息,然后再根據取得的設備信息確定設備的位置。找到設備的位置以后,調用ManageCreatePlayer方法創建Player,當Player開始播放的時候,就開始了捕獲的過程。
有多種方法獲得捕獲設備信息,可以通過查詢指定的格式,也可以查詢特定的設備名字。Player準備好播放數據,當Player發出這個事件時,就可以獲取播放器的可視面板和控制面板了。具體步驟如下:
1.先把所有的捕獲設備調出來
2.創建Player,當Play開始的時候,就開始了音頻捕獲的過程
3.以MediaLocator為參數,創建Player 4.為PLAYER添加監聽器,以便監聽RealizeComplete事件
(二)代碼實現
(1)添加庫、包等相關文件 import javax.media.ControllerEvent;import javax.media.ControllerListener;import javax.media.EndOfMediaEvent;import javax.media.PrefetchCompleteEvent;import javax.media.RealizeCompleteEvent;import javax.media.*;import javax.swing.*;import java.awt.*;
import java.awt.event.*;
(2)初始化窗口
1代碼實現
private void init(){
// TODO Auto-generated method stub
this.setLayout(new BorderLayout());
JPanel lrcPanel = new JPanel();
JPanel controP= new JPanel();
jta = new JTextArea(22,35);
jta.setBackground(Color.black);
jta.setLineWrap(true);
jta.setWrapStyleWord(true);
jta.setEditable(false);
lrcPanel.add(new JScrollPane(jta));
lrcPanel.setBackground(Color.black);
lrcPanel.setVisible(true);
JButton Jstart= new JButton(“");Jstart.setIcon(new ImageIcon(”start.png“));
Jstart.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent arg0){
// TODO Auto-generated method stub
start();} });JButton Jpause=new JButton();Jpause.setIcon(new ImageIcon(”停止.png“));Jpause.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){
stop();
} });JButton Jnext =new JButton();Jnext.setIcon(new ImageIcon(”next.png“));Jnext.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent e){
// TODO Auto-generated method stub
next();} });JButton Jprior =new JButton();Jprior.setIcon(new ImageIcon(”back.png“));Jprior.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){
back();} });controP.setLayout(new FlowLayout());controP.add(Jprior);controP.add(Jstart);controP.add(Jpause);
} controP.add(Jnext);
this.add(lrcPanel,BorderLayout.CENTER);this.add(controP,BorderLayout.SOUTH);
(3)音樂播放窗口機基本功能的實現 ①界面
②代碼實現
// 播放方法
public void start(){
if(isplaying==false){
try {
player =
Manager.createPlayer(new File(mp3List.get
(mp3NO)).toURI().toURL());
jta.setText(null);
} catch(NoPlayerException e){
// TODO 自動生成 catch BufferedReader(new FileReader(lcf));
String s;
塊
e.printStackTrace();
System.out.println(”不能播放此文件!“);
return;
} catch(IOException e){
// TODO 自動生成 catch 塊
e.printStackTrace();
return;
}
if(player == null){
System.out.println(”播放文件為空!“);
return;
}
player.addControllerListener(this);
// 提取媒體內容
player.prefetch();
isplaying=true;//正在播放一首歌
setLrc();
} }
private void setLrc(){
// TODO Auto-generated method stub
File lrcfile = new File(lrcpath);
if(!lrcfile.exists()){
lrcfile.mkdir();
}
String lrcFName = getlrcFName();
BufferedReader bReader;
File lcf= new File(lrcpath+lrcFName+”.lrc“);
System.out.println(lcf.getName());
try {
bReader = new while((s=bReader.readLine())!= null){
jta.append(” “+s);
jta.append(”n“);
}
} catch(Exception e){
// TODO Auto-generated catch block
jta.setText(”沒有歌詞“);
System.out.println(”沒有歌詞文件!“);
}
}
private String getlrcFName(){//解析歌曲名;
// TODO Auto-generated method stub
String musicPath = mp3List.get(mp3NO);
String s =musicPath.substring(11);
System.out.println(s);
String []str = s.split(”.“);
String lrcFName=str[0];
System.out.println(lrcFName);
return lrcFName;}
public void stop(){
player.stop();
isplaying=false;}
public void next(){
if(isplaying==true)
stop();
if(mp3NO mp3NO++; start(); } else{ jta.setText(”沒有下一首了 // 當提取媒體的內容結束 if(e instanceof PrefetchCompleteEvent){ System.out.println(“內容結束”); player.start(); return; }(<_>“); } } public void back(){ if(isplaying) stop(); if(mp3NO>0){ mp3NO--; start(); } else jta.setText(”已經是第一首歌了(<_>)“);} public void controllerUpdate(ControllerEvent e){ // 當媒體播放結束時,循環播放 if(e instanceof EndOfMediaEvent){ isplaying=false; mp3NO++; System.out.println(mp3NO); if(mp3NO < mp3List.size()){ this.start(); } return; } // 當實例化后 if(e instanceof RealizeCompleteEvent){ System.out.println(”實例化“); // pack();//執行pack()操作 return; } } public void setMp3List(){ File file = new File(musicpath); if(!file.exists()){ file.mkdir(); } File[] mcFiles; mcFiles = file.listFiles(); if(mcFiles!=null){ for(File f : mcFiles){ System.out.println(f.getPath()); mp3List.add(f.getPath()); } }else System.out.println(”MyMusic中沒有歌曲文件"); } 6.總結與說明 在做寫程序實現功能的過程中,界面和基本功能的設計需要較強的邏輯思維,一不小心就容易出錯,在具體的功能設計和實現的過程中要盡可能用最簡單的語句實現基本的播放器功能。我覺得可以設計更多的菜單及菜單項目從而實現更多的功能,如:刪除,保存等,還可以實現更多的背景效果或者更多可選擇的皮膚,還可以對按鈕添加音效效果,這樣感覺整個音樂播放器更具有靈活性,媒體感更強烈一些,界面會更加豐富和生動一些。 通過自己做課程設計,自己設計界面,功能和設計功能的代碼實現,將理論知識運用到實際操作中,加深了對理論知識的理解和記憶,在做程序設計的過程中,對很多代碼的多次操作和重復使用,使得對很多基本的代碼和相關的操作能夠牢固的記憶。 山西大學 課程設計報告 題 目:基于QT的音樂播放器 系 別: 軟件學院 班 級: 1522班 姓 名:賈夢潔 學 號: 同組組員: 設計時間: 2017年12月22日----2017年12月30日 公司名稱: 上海杰普軟件科技有限公司 目 錄 第一章 引言.......................................1 第二章 軟件分析與設計.............................2 2.1軟件需求分析........................................2 2.2開發環境............................................3 2.3軟件概要設計........................................3 第三章 軟件功能實現...............................4 3.1軟件總體架構........................................5 3.2軟件功能流程........................................5 3.3具體功能實現........................................6 第四章 軟件測試..................................16 第五章 總結......................................17 第一章 引言 計算機技術的飛速發展大大提高了人們的工作效率,尤其是互聯網技術更是很大程度上豐富和方便了人們的生活。近些年來,人們的生活水平也在不斷提升,在物質豐富的條件下,人們開始在工作之余關注娛樂,期望在其它方面釋放工作壓力,同時培養自己的興趣愛好,隨之而來的是人們對多媒體應用的關注,許多電影播放平臺、音樂播放軟件等逐漸深入人們的生活,并慢慢地成為人們生活重要組成部分。 目前,互聯網上已經擁有大量的音樂播放軟件,這些軟件是各個軟件供應商的商品關鍵組成部分,當前其實現技術較復雜,在功能方面相當完備且強大,如何簡單、高效、方便地設計實現一款小巧美觀的音樂播放器軟件成為人們關注的熱點?;谠搯栴},本文設計并實現了基于Qt的音樂播放軟件,該軟件能夠便捷、高效地為用戶展示音樂播放界面,方便的進行歌曲播放和控制功能。本文的工作分為軟件界面設計和軟件功能實現兩部分,其中,軟件界面設計工作主要包括用戶界面設計實現;各個功能模塊實現工作主要包括后臺程序編碼設計模塊化完成設計等內容。 該音樂播放軟件以Qt開發平臺中實現歌曲播放的相應功能為基本框架設計,通過C++語言編程實現各個功能函數,軟件設計方面采用模塊化的軟件設計思想實現,具有友好的用戶交互界面和高承載能力的運行穩定性。 第二章 軟件分析與設計 2.1 軟件需求分析 在設計實現音樂播放器軟件的同時,可以對目前存在的不同類型的音樂播放器進行廣泛深入的研究,查看軟件可能需要的需求內容。因此,需要對具體問題進行具體分析,深入挖掘其需要實現的系統功能,以方便后面對軟件構架的設計工作。需求分析的過程,是開發人員對音樂播放器工作過程的認識與熟悉的過程,也是對軟件內部工作流程進行計算機建模的過程,最終目的是通過需求分析了解用戶需求實現的功能,根據用戶提出的需求設計好系統的概念模型,對用戶提出的需求進行計算機方法的描述,并建立相應配套的需求分析文檔,設計好系統的具體實現方案。 在設計實現基于Qt的音樂播放器的同時,考慮到音樂播放器的實際工作環境,可以確定的是該軟件應當擁有以下幾個方面的特性: (1)基本功能 隨著電腦終端的擴大化,PC機上各種軟件也不計其數。為了使用戶體驗及軟件質量都達到一定的完備性,我們需要保證一定的基礎功能?;谌诵曰嵌?,開發設計基礎功能,使用戶可以流暢使用軟件。在進行功能劃分的過程當中,可以采用模塊化的功能設計思想,對功能的劃分盡可能的細致,做到不遺漏。例如,應當有播放模式的選擇,音樂列表的選擇,音量高低的調試等。(2)穩定性 基于QT的音樂播放器是一款娛樂軟件,更需要保證軟件的穩定性,以使用戶體驗達到最高。若播放器不穩定,則用戶體驗這一指標則會大幅下降。 (3)聯通性 移動設備日益增長,微博、微信等交流平臺在市場中也占據重要地位。為迎合這一現象,QT音樂播放器必須進行一定的互聯網聯通性??梢赃M行音樂分享、轉發評論等。這樣可以實現軟件之間的交流結合,有利于軟件的推廣。同時也有利于通過大數據分析,得到聽眾最喜愛聽的歌曲,符合大眾口味。 2.2 開發環境 操作系統:Windows 10 開發平臺:Qt 使用語言:C++ 2.3 軟件概要設計 在軟件概要設計階段,是基于整個系統需要實現的功能,對物業管理信息系統的整體架構進行科學合理的設計,使之有一定的規律可以遵循,不進行盲目的設計工作,這對于后期的程序編碼和系統的來說意義重大。在對音樂播放器軟件進行軟件需求分析之后,針對需求 分析的結果,對系統進行了整體的架構設計。 設計實現的音樂播放器軟件,從軟件的架構來看,主要包括兩個功能部分:軟件的歌曲播放部分和圖標最小化功能實現部分。其中,歌曲播放部分主要實現該軟件的主要功能,即選擇歌曲和播放歌曲;另一部分則是最小化后軟件的實現,主要包括顯示、登錄、設置、檢查更新、退出。以上是對該音樂播放器軟件的整體工作架構進行的設計,該步驟是后續進一步進行系統功能實現的基礎。 第三章 軟件功能實現 在設計實現基于Qt的音樂播放器軟件的同時,充分考慮了Qt的語言特性和開發環境,發揮了其在用戶界面應用程序開發當中的優勢,對音樂播放器軟件進行了開發。根據前文對該音樂播放器軟件的 需求分析,以及對軟件的設計分析結果,結合實際使用當中可能使用到的軟件功能,并采用了軟件工程中模塊化的開發思想,完成了該音樂播放器軟件的開發,下面分別對軟件中重要的功能模塊的實現方法及實現效果進行詳細的介紹和分析。 3.1 總體架構 通過在需求階段對系統的總體功能的分析,我們得到了這個音樂播放器軟件的總體功能結構,它應包括四大基本功能模塊。 (1)選擇歌曲文件模塊:用戶可以方便的查詢環境當中存在的歌曲列表信息,并找到滿意歌曲的位置和具體的歌曲內容。 (2)歌曲播放模塊:用戶根據所選擇的具體歌曲讓該軟件對歌曲進行播放,并且可以實時查看歌曲的播放狀態。 (3)播放狀態控制模塊:用戶可以查看成自己在歌曲播放過程中進度情況,并可以隨時更改歌曲的播放進度信息。 (4)第二界面模塊:用戶可以進入第二個更為簡潔的界面進行播放、暫停、切換等操作。 3.2 軟件功能流程 整個軟件所設計的工作流程如下: (1)開始。進入Qt界面開始運行軟件。 (2)播放歌曲。該部分是音樂播放器軟件最主要的功能部分,播放歌曲的功能實現需要相對復雜的函數調用來實現,在軟件開發的過程 當中有具體的實現代碼。 (3)播放設置。該部分的實現是進一步提高用戶的使用體驗,方便用戶根據其自身的需求對所播放的歌曲進行進度控制,可以暫停歌曲的播放,也可以繼續歌曲的播放功能,同時也可以進行音量的調控,以及對歌曲播放的順序進行調整,比如順序播放、單曲循環等。(4)第二界面。點擊shrink按鈕可跳轉至第二界面,進行播放切換歌曲等操作,也可以進行最小化。 (5)結束。點擊關閉軟件,結束軟件運行。 3.3 具體功能實現 本人完成了本次音樂播放器中的歌曲導入模塊以及播放歌曲的初步工作,具體的實現過程如下。 3.3.1歌曲導入(1).h文件 歌曲導入部分的代碼函數名稱以及相應的函數聲明完成在settingwiget.h的頭文件下,先對命名空間進行前向聲明,對類內的對象和方法進行聲明,具體代碼如下: #ifndef SETTINGWIGET_H #define SETTINGWIGET_H #include namespace Ui { class settingwiget;} class settingwiget : public QWidget { Q_OBJECT public: explicit settingwiget(QWidget *parent = 0);~settingwiget(); void initSystemSetting(void); bool writeInit(QString path, QString user_key, QString user_value);bool readInit(QString path, QString user_key, QString &user_value); private slots: void on_pb_save_clicked(); void on_pb_cancle_clicked(); void on_tb_lyricsPath_clicked(); void on_tb_songsPath_clicked(); void on_pb_save_destroyed(); private: Ui::settingwiget *ui;}; #endif // SETTINGWIGET_H (2).cpp文件 配置文件寫入和讀取的方法完成在settingwiget.cpp文件內,代碼如下: settingwiget::settingwiget(QWidget *parent): QWidget(parent), ui(new Ui::settingwiget){ ui->setupUi(this); SongsFile::m_songPath.clear();LyricsFile::m_lyricPath.clear();} settingwiget::~settingwiget(){ delete ui;} bool settingwiget::writeInit(QString path, QString user_key, QString user_value){ if(path.isEmpty()|| user_key.isEmpty()){ return false;} else { //創建配置文件操作對象 QSettings *config = new QSettings(path, QSettings::IniFormat); //將信息寫入配置文件 config->beginGroup(“config”);config->setValue(user_key, user_value);config->endGroup(); return true;} } bool settingwiget::readInit(QString path, QString user_key, QString &user_value){ user_value = QString(“");if(path.isEmpty()|| user_key.isEmpty()){ return false;} else { //創建配置文件操作對象 QSettings *config = new QSettings(path, QSettings::IniFormat); //讀取用戶配置信息 user_value = config->value(QString(”config/“)+ user_key).toString(); return true;} } 界面設計中按鈕的具體功能也對應在settingwiget.cpp文件內,代碼如下: void settingwiget::on_tb_songsPath_clicked(){ SongsFile::m_songPath = QFileDialog::getExistingDirectory();ui->le_songsPath->setText(SongsFile::m_songPath);} void settingwiget::on_tb_lyricsPath_clicked(){ LyricsFile::m_lyricPath = QFileDialog::getExistingDirectory();ui->le_lyricsPath->setText(LyricsFile::m_lyricPath);} void settingwiget::on_pb_save_clicked(){ writeInit(QString(”../user.ini“), ”SONGPATH“, SongsFile::m_songPath);writeInit(QString(”../user.ini“), ”LYRICPATH“, LyricsFile::m_lyricPath); initSystemSetting();this->hide();} void settingwiget::on_pb_cancle_clicked(){ this->hide();} void settingwiget::initSystemSetting(void){ readInit(QString(”../user.ini“), ”SONGPATH“, SongsFile::m_songPath);readInit(QString(”../user.ini“), ”LYRICPATH“, LyricsFile::m_lyricPath); ui->le_songsPath->setText(SongsFile::m_songPath);ui->le_lyricsPath->setText(LyricsFile::m_lyricPath);} void settingwiget::on_pb_save_destroyed(){} 其中,cpp文件內的頭文件為: #include ”settingwiget.h“ #include ”ui_settingwiget.h“ #include 3.3.2歌曲播放的部分功能(1).h文件 musicplayer.h的頭文件下,采用枚舉類型對播放模式進行聲明,寫入信號和槽方便傳值,對歌曲播放邏輯、歌曲列表獲取邏輯、歌曲歌詞獲取邏輯的對象、方法進行聲明,具體代碼如下: #ifndef MUSICPLAYER_H #define MUSICPLAYER_H #include #include #include ”songsfile.h“ #include ”lyricsfile.h“ #define TIME_MS_DURATION 1000 #define INIT_SYSTEM_VOLUME 50 enum PlaybackMode //播放模式 { CURRENT_ITEM_ONCE = 0, //單曲播放 CURRENT_ITEM_IN_LOOP = 1, //單曲循環 SEQUENTIAL = 2, //順序播放 LOOP = 3, //列表循環 RANDOM = 4 //隨機播放 }; class MusicPlayer : public QObject { Q_OBJECT signals: void signalPositionChanged(QString updateTime);void signalDurationChanged(qint64 duration); public slots: void slotPositionChanged(qint64 position);void slotDurationChanged(qint64 duration); public: explicit MusicPlayer(QObject *parent = 0); const qint64 getTotalPlayerTime(void)const;void setTotalPlayerTime(const qint64 time); const qint64 getCurrentPlayerTime(void)const;void setCurrentPlayerTime(const qint64 time); /// 歌曲播放邏輯 QMediaPlayer ¤tMediaPlayer(void); /// 歌曲列表獲取邏輯 QMediaPlaylist &musicPlayList(void);QStringList &songsNameList(void); /// 歌曲歌詞獲取邏輯 void getCurrentSongLyric(void);QList private: /// 歌曲播放邏輯 qint64 m_totalPlayerTime;qint64 m_currentPlayerTime;QMediaPlayer m_player; /// 歌曲列表獲取邏輯 SongsFile *m_songsFile;QMediaPlaylist m_musicPlayList;QStringList m_songsNameList; /// 歌曲歌詞獲取邏輯 QList #endif // MUSICPLAYER_H (2).cpp文件 musicplayer.cpp的頭文件如下: #include ”musicplayer.h“ #include 同時在cpp文件內寫入了信號與槽傳值連接的方法,代碼如下: MusicPlayer::MusicPlayer(QObject *parent): QObject(parent){ m_songsFile = new SongsFile(this); m_songsFile->initSongsListAndSongsNameList(m_musicPlayList, m_songsNameList); m_player.setPlaylist(&m_musicPlayList);m_player.setVolume(INIT_SYSTEM_VOLUME);connect(&m_player, SIGNAL(durationChanged(qint64)), this, SLOT(slotDurationChanged(qint64)));connect(&m_player, SIGNAL(positionChanged(qint64)), this, SLOT(slotPositionChanged(qint64)));} 得到siganl后相應執行的槽函數(position),具體代碼如下: void MusicPlayer::slotPositionChanged(qint64 position){ m_currentPlayerTime = position / TIME_MS_DURATION;//歌曲進度條顯示 QTime currentTime((m_currentPlayerTime/3600)%60,(m_currentPlayerTime/60)%60, m_currentPlayerTime%60,(m_currentPlayerTime*1000)%1000);QTime totalTime((m_totalPlayerTime/3600)%60,(m_totalPlayerTime/60)%60, m_totalPlayerTime%60,(m_totalPlayerTime*1000)%1000); QString updateTime = currentTime.toString(”mm:ss“)+ ”/“+ totalTime.toString(”mm:ss"); emit signalPositionChanged(updateTime);} void MusicPlayer::slotDurationChanged(qint64 duration){ m_totalPlayerTime = duration / TIME_MS_DURATION;//TIME_MS_DURATION 1000 emit signalDurationChanged(m_totalPlayerTime);} 以及對播放時間、播放列表等的聲明,代碼如下: const qint64 MusicPlayer::getTotalPlayerTime(void)const { return m_totalPlayerTime / TIME_MS_DURATION;//INIT_SYSTEM_VOLUME 50 } void MusicPlayer::setTotalPlayerTime(const qint64 time){ m_totalPlayerTime = time;} const qint64 MusicPlayer::getCurrentPlayerTime(void)const { return m_currentPlayerTime;} void MusicPlayer::setCurrentPlayerTime(const qint64 time){ m_currentPlayerTime = time;} QMediaPlayer &MusicPlayer::currentMediaPlayer(void){ return m_player;} QMediaPlaylist &MusicPlayer::musicPlayList(void){ return m_musicPlayList;} QStringList &MusicPlayer::songsNameList(void){ return m_songsNameList;} void MusicPlayer::getCurrentSongLyric(void){ LyricsFile lyricsFile;m_lyricIndexList.clear();m_lyricContentList.clear();lyricsFile.getCurrentSongLyric(m_lyricIndexList, m_lyricContentList);} QList QStringList &MusicPlayer::lyricContentList(void)//歌詞內容列表 { return m_lyricContentList;} 第四章 軟件測試 軟件實現截圖如下:(1)主界面 (2)第二界面(3)最小化 第五章 總結 本次所設計的基于Qt的音樂播放器軟件,在Windows系統環境下可以成功的運行,對于預期的功能目標已經基本實現,其中包括歌曲的選擇,歌曲打開,歌曲播放,歌曲暫停,顯示歌曲播放的進度條等功能。該軟件的開發是在Qt Creator的開發環境下完成的程序編寫工作,該開發平臺簡單方便,操作快捷,可以直接在Windows系統平臺下安裝運行,完成代碼的編寫后,只需要直接點擊編譯和運行即可使音樂播放器開始工作,按用戶的選擇進行歌曲播放等功能,具有一定的實用性。 通過本次畢業設計,我終于明白了“看一萬行代碼,不如動手寫一行代碼”這一句真理,對于工科類的學生來說,除了加強對對書本里的理論知識的學習之外,更重要的是培養自己實踐動手的能力。這次畢業設計,讓我以后面對困難時變得更有耐心,對我來說,這一精力都是在以后的生活和學習中的很寶貴的財富,極大的影響我以后的成長和發展道路。 開發時間限制,我們小組實現了系統的基本功能,軟件可以實現基本功能,但是界面尚不夠美觀,系統也不夠完善,下一步,我們會 繼續改進系統。本次設計以及系統的實現讓我們認識到了以前很多沒有注意到的細節問題,讓我學到了不少的新知識。 package ChatClient; import java.awt.*;import java.net.*;import java.awt.event.*;import java.io.*;import java.applet.*;class AudioClipWindow extends Frame implements Runnable,ItemListener,ActionListener { Thread thread; Choice choice; URL url; AudioClip clip; Button buttonPlay,buttonLoop,buttonStop; String str; AudioClipWindow(ActionListener chatClient) { thread=new Thread(this); choice=new Choice(); choice.add(“陳綺貞-我在那一角落患過傷風.wav”); choice.add(“no one wants forever.wma.wav”); choice.add(“中島美嘉-雪之華(韓雪-飄雪)日文版.wav”); choice.addItemListener(this); buttonPlay=new Button(“播放”); buttonLoop=new Button(“循環”); buttonStop=new Button(“停止”); buttonPlay.addActionListener(this); buttonStop.addActionListener(this); buttonLoop.addActionListener(this); setLayout(new FlowLayout()); add(choice); add(buttonPlay); add(buttonLoop); add(buttonStop); setSize(350,120); setVisible(true); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); validate(); } public void itemStateChanged(ItemEvent e) { str=choice.getSelectedItem(); if(!(thread.isAlive())) { thread=new Thread(this); } try{ thread.start(); } catch(Exception ee){} } public void run() { try{ File file=new File(str); url=file.toURL(); clip=Applet.newAudioClip(url); } catch(Exception e) { System.out.println(e); } } public void actionPerformed(ActionEvent e) { if(e.getSource()==buttonPlay) { clip.play(); } else if(e.getSource()==buttonLoop) { clip.loop(); } if(e.getSource()==buttonStop) { clip.stop(); } } } 一. 課程設計目的 1.通過D/A裝換器產生模擬信號,使PC機作為簡易音樂播放器。2.了解利用數模轉換器產生音樂的基本方法。 二.課程設計任務 設計并實現一個鍵控音樂播放器。要求: (1)自己選用合適的芯片,不少于兩種。 (2)自行設計電路并使用匯編語言編寫程序完成鍵控音樂播放器功能。 (3)該播放器有若干首歌曲可以選擇,開始時輸出說明,要用戶選擇要播放的歌曲,然后根據用戶按鍵進行播放、退出或出錯提示。 三、總體設計方案 1、總體設計方案一 所有音樂都是由各個不同頻率的音階和其延續時間的長短來實現的。不同的音樂是由各個音階按某種排列各自播放一定時間形成的,將各音樂音階和其延續時間存在數據段中,然后根據不同按鍵值選擇不同的音階和時間表,再使用計數器產生該音階頻率。而我們學過的有計數器可以產生各種頻率,所以我們主要采用計數器8253產生各音符,用8255并行接口來控制揚聲器的開關,達到播放音樂的功能。 2、總體設計方案二 可以使用0832(數模轉換器)來產生頻率,原理圖: 更連續,效果更好點。 提出這個方案是因為我想產生模擬信號,來驅動揚聲器,這樣產生的聲音更加圓潤感覺我們想把一個周期的波形分成32份,然后每份給8253一個值讓他轉換成模擬信號,不同的頻率可以用8253計數器控制,比如要產生261Hz的頻率,使用1MHz的話,周期就為1/261=3.83ms,分成32份,每份間隔時間就是3.83ms/32=0.12ms,換句話說就是送計數器0的初值為1M/261/32=120次。 3、各個音符的對應頻率表: 音符 頻率/HZ 半周期/us 音符 頻率/HZ 半周期/us 低1DO 262 1908 #4FA# 740 0676 #1DO# 277 1805 中5SO 784 0638 低2RE 294 1700 #5SO# 831 0602 #2RE# 311 1608 中6LA 880 0568 低3M 330 1516 #6LA# 932 0536 低4FA 349 1433 中7SI 988 0506 #4FA# 370 1350 高1DO 1046 0478 低5SO 392 1276 #DO# 1109 0451 #5SO# 415 1205 高2RE 1175 0426 低6LA 440 1136 #2RE# 1245 0402 #6LA# 466 1072 高3M 1318 0372 低7SI 494 1012 高4FA 1397 0358 中1DO 523 0956 #4FA# 1480 0338 #1DO# 554 0903 高5SO 1568 0319 中2RE 578 0842 #5S0# 1661 0292 #2RE# 622 0804 高6LA 1760 0284 中3M 659 0759 #6LA# 1865 0268 中4FA 698 0716 高7SI 1976 0253 四.部分電路設計及功能解說 1、頻率發生電路 使用8253產生音符頻率。8253采用方式3,產生方波信號,根據輸入計數初值的不同產生不同頻率的方波信號來驅動揚聲器。 2、揚聲器開關控制電路 使用8255并行接口芯片來控制揚聲器的開和關,PC0始終接低電平,PA0和8253的OUT0接在與門上,這樣只有PA0=1時揚聲器才有可能開通,否則不發聲。關閉的方法是,從PC口讀入數據再從PA口輸出;而開揚聲器時只要在輸出PA口數據前對數據進行一個取反操作就可以了。 設某音符頻率為fHz,而CLK脈沖是1MHz,則計數初值N=1M/f。8253的控制端口為28BH,控制字為36H。五.硬件接線圖 六.軟件設計流程圖 1、總流程圖 開始輸出說明讀取按鍵是‘1’?N是‘2’?Y播放曲1Y播放曲2N是‘3’?Y播放曲3N是‘0’?Y結束Y選擇無效程序總流程圖 2、音樂播放子程序流程圖 開始保護現場曲N各音符頻率設置曲N各音符時間設置讀取頻率F頻率是-1 ?Y恢復現場N讀取時間T結束返回計算機計數次數送計數器,產生該頻率F信號啟動喇叭延時T關閉喇叭音符間延時播音流程圖 七.程序段功能匯總 1、MAIN程序 MAIN程序是總程序,輸出說明,等待用戶按鍵并讀取鍵值。根據不同的按鍵選擇調用播音子程序播放不同的歌曲。 2、PLAY子程序 PLAY子程序是播音子程序,SI指向音節表中的頻率,BP指向音節表中的時間。從SI的指向的音節表中取一個頻率,只要不是-1,即有效就再讀取時間,然后計算計數初值送入計數器,產生各種頻率。開啟揚聲器,根據所取的時間調用若干次延時子程序。這段時間揚聲器就發出該頻率的聲音,延時結束,就關閉揚聲器,調用音節之間的小延時程序。最后修改SI和BP,指向下一個頻率,重復上面的工作。 3、DELAY子程序和DELAY_OFF子程序 兩個都是子程序,采用空操作循環多次的方法,只是第二個延時時間較短,大概為5ms。八.程序清單 SSEG SEGMENT PARA STACK 'stack' dw 100h dup(0);Resize the stack by changing the number '100' SSEG ENDS DSEG SEGMENT ;TO DO: Add your program's data here INFO1 DB 0DH,0AH,'--------------------------',0DH,0AH,'THERE ARE 3 SONGS:',0DH,0AH,0DH,0AH,'$' INFO2 DB '1.HAPPY BIRTHDAY',0DH,0AH,'$' INFO3 DB '2.SHEEP',0DH,0AH,'$' INFO4 DB '3.RIVER',0DH,0AH,'$' INFO5 DB '0.EXIT',0DH,0AH,'$' INFO6 DB 'YOU HAVE CHOSEN :$' INFO7 DB 'THANK YOU FOR YOUR USE',0DH,0AH,'$' INFO8 DB '---------------------------',0DH,0AH,'PRESS THE KEY TO SELECT SONG!',0DH,0AH,'$' INFO9 DB 0DH,0AH,'-------------------',0DH,0AH,'|INVALID SELECTION|',0DH,0AH,'-------------------',0DH,0AH,'$' FREG1 DW 2 dup(262),294,262,349,262,262,294,262,392,249,262,262,523,440,349 ;曲1的頻率 DW 330,294,466,266,440,349,392,349,-1 TIME1 DW 1,1,2,2,2,4,1,1,2,2,2,4,1,1,2,2,2,2,4,1,1,2,2,2,4 ;曲1的時間 FREG2 DW 330,294,262,294,3 DUP(330) ;曲2的頻率 DW 3 DUP(294),330,392,392 DW 330,294,262,294,4 DUP(330)DW 294,294,330,294,262,-1 TIME2 DW 6 DUP(1),2 ;曲2的時間 DW 2 DUP(1,1,2)DW 12 DUP(1),4 FREG3 DW 330,392,330,294,330,392,330,294,330,330,392,330,294,262,294,330,392,294 ;曲3的頻率 DW 262,262,220,196,220,262,294,332,262,-1 TIME3 DW 3 DUP(2),1,1,2,1,1,4 ;曲3的時間 DW 2 DUP(2,2,1,1),4 DW 3 DUP(2,1,1,1),4 DSEG ENDS CSEG SEGMENT assume cs:CSEG, ds:DSEG, es:DSEG, ss:SSEG INIT PROC;Initialize procedure mov ax, dseg mov ds, ax mov es, ax;TO DO: Add your initialize code here(as your requirement)ret ;return to the MAIN procedure INIT ENDP MAIN PROC ;Here is your program entry point call INIT;call the INIT procedure to initialize the program ;**TO DO: Add your main code here** RE: MOV DX,28BH ;關閉揚聲器 MOV AL,89H OUT DX,AL MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL LEA DX,INFO1 MOV AH,09H INT 21H LEA DX,INFO2 INT 21H LEA DX,INFO3 INT 21H LEA DX,INFO4 INT 21H LEA DX,INFO5 INT 21H LEA DX,INFO8 INT 21H MOV AH,01H INT 21H CMP AL,'1' JE MUSIC1 CMP AL,'2' JE MUSIC2 CMP AL,'3' JE MUSIC3 CMP AL,'0' JE EXIT LEA DX,INFO9 MOV AH,09H INT 21H JMP RE ;輸出說明信息 ;讀取按鍵 ;根據不同的按鍵播放不同的曲子 ;無效選擇,輸出錯誤提示 MUSIC1: MOV SI,OFFSET FREG1 ;指向曲1的表 MOV BP,OFFSET TIME1 CALL PLAY JMP RE MUSIC2: MOV SI,OFFSET FREG2 ;指向曲2的表 MOV BP,OFFSET TIME2 CALL PLAY JMP RE MUSIC3: MOV SI,OFFSET FREG3 ;指向曲3的表 MOV BP,OFFSET TIME3 CALL PLAY JMP RE EXIT: MOV DX,28BH ;關閉揚聲器 MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL LEA DX,INFO7 ;輸出歡迎使用信息,增加界面友好度 MOV AH,09H INT 21H mov ax, 4c00h;The end of the program, return to the system MOV AL,89H OUT DX,AL int 21h MAIN ENDP ;TO DO: Add other procedures(PROC)here(as your requirement) ;THE PROGRAMME OF PLAYING THE MUSIC PLAY PROC ;PLAY子程序,功能上面介紹過 L1: MOV BX,DS:[SI] ;取頻率 CMP BX,-1 ;看是否有效 JE L0 ;無效就退出 MOV CX,DS:[BP] ;讀取時間 MOV DL,CL ;保存時間 ADD DL,30H MOV AH,02H INT 21H MOV DX,0FH ;計算計數初值,1M的十六進制為0F4240H MOV AX,4240H DIV BX MOV BX,AX MOV DX,283H ;設置計數器工作方式 MOV AL,36H OUT DX,AL MOV DX,280H ;輸入計數初值 MOV AX,BX OUT DX,AL MOV AL,AH OUT DX,AL MOV DX,28BH MOV AL,89H OUT DX,AL MOV DX,28AH IN AL,DX NOT AL MOV DX,288H OUT DX,AL ROD:CALL DELAY LOOP ROD MOV DX,28BH MOV AL,89H OUT DX,AL MOV DX,28AH IN AL,DX MOV DX,288H OUT DX,AL CALL DELAY_OFF ADD SI,2 ADD BP,2 JMP L1 L0: RET PLAY ENDP DELAY PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,09FH LL1:MOV CX,0FFFFH ;開揚聲器 ;延時 ;關揚聲器 ;延時子程序 ;循環這么多次 ;音節間延時 LOP: LOOP LOP DEC BX JNZ LL1 POP DX POP CX POP BX POP AX RET DELAY ENDP DELAY_OFF PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV BX,0FH LL2:MOV CX,0CFFFH LOP2: LOOP LOP2 DEC BX JNZ LL2 POP DX POP CX POP BX POP AX RET DELAY_OFF ENDP CSEG ENDS;TO DO: Add other segments here(as your requirement) END MAIN 九.試驗結果和分析 1、試驗結果: 程序初始運行界面 如果按錯了鍵,會出現如下界面 如果選擇正確,將出現如下界面: 2、分析 這是按照方案一做的結果,按1~3分別播放“生日快樂”等歌,但由于本組人對音樂都是外行,各音階頻率的排序和延時時間搭配不好,導致音樂嚴重走調,但基本能聽出不是噪音。 按照方案二做的電路和程序,無論怎么樣都不出聲,后來我們直接送數據到0832產生三角波信號(程序在我們的一次作業中寫的)。還是無法讓揚聲器發出聲音,因此按這個方案失敗了。 十.課程設計總結和體會 1.實驗過程中碰到了很多的難題和障礙,我認識到平時基礎知識的重要性,只有能夠熟練的掌握才能在實驗過程中得心應手,否則一步錯則整個試驗都會陷入困境,因而,嚴謹的態度是試驗成功的重要保障! 2.通過這次課程設計,我們對各個芯片有了進一步的了解,對各個芯片的功能有了更深刻的認識和體會,平時上課的理論知識只是停留在理論的層面,只有通過了這樣的試驗才能更好的體會到,做到了理論和實際的相結合,使理論知識真正運用到了實踐中去。在課程設計過程中,同組人員之間相互合作,共同研究使我更加堅信了團體的力量。在團體的共同協作和努力下,任何的難題都可以被解決! 3.我們大家在實驗的時候都團結合作,遇到問題時候一起探討,增強了我們的合作精神。 十一.參考文獻 1、《〈微機原理與接口技術〉學生實驗指導書》 揚州大學 羅加奇 2、《微機原理及應用》 機械工業出版社 胡鋼 主編第三篇:基于Qt的音樂播放器課程設計報告
第四篇:java音樂播放器源代碼(ChatClient)
第五篇:微機原理課程設計——音樂播放器