模拟MP3唱演唱歌曲

一、题目
模拟MP3唱演唱歌曲

二、目的与意义
本课程为培养学生计算机应用能力的实践性课程,也是一门重要的专业技术课程。它将使学生不仅理论上掌握单片微型计算机的基本原理、单片机应用系统的构成、系统程序设计,进一步加强学生单片机应用系统软、硬件开发的能力,并能将电路、模拟电子技术、数字电子技术和微机原理等课程的知识有机地结合起来,做到学用结合。课程采用项目组运作模式,使学生熟悉理论课程的相关知识,通过具体项目下达要求、验收方式等环节,充分发挥不同程度学生的学习积极性、创新精神及合作意识,培养学生的工程设计思想和科学研究能力,使学生在分析问题、解决问题和动手能力等方面有所提高,并了解工程项目设计实施的全过程,达到提高学生工程实践能力和素质的目标。

三、要求(包括原始数据、技术参数、设计要求、图纸量、工作量要求等)
1、设计时间:2周
2、分组:
(1)题目任选。(重复性不可超过30%)
(2)2-3人一组,自由组合。
(3)分工明确,小组成员分配任务量合适。
3、设计任务要求
设计任务相对独立完整,难易适宜,不同层次,并充分考虑学有余力的学生的扩展空间。
(1)完成对所选任务的分析报告。
(如:系统所需要完成的功能是什么,需要哪些硬件环境支持,小组成员分工、
的设计思想)
(2)完成硬件环境的检测程序。
蜂鸣器自检:确定蜂鸣器正确
LED(LCD) 显示器自检:确定LED(LCD) 显示器每一段均正确
键盘自检: 确定键盘正确
④其他
(3)完成系统的结构设计,画出任务流程框图。
(4)完成系统软件设计与调试。
(5)每小组写一份综合设计报告
主要内容:题目、分工情况、系统可行性分析、系统结构设计说明、程序结构框图设计说明、各模块设计说明、程序清单、体会。
4、设计理念
必须始终保持和发展本课程突出的教学特点:内容综合、按工程项目实施、学生设计自由度较大、对学生的综合能力要求高、挑战性强。
四、工作内容、进度安排
第一周:1、自由分组,选定任务,领硬件设备。(题目重复性不可超过30%)
2、完成对所选任务的分析报告。
(如:系统所需要完成的功能是什么,需要哪些硬件环境支持,小组
成员分工、确定自己的设计思想)
3、确定任务思路,完成硬件环境的检测程序。
4、画出主任务程序框图
5、指导教师分阶段检查各小组进度,给出成绩。
第二周:1、根据主任务程序框图,进行系统软件设计与调试
2、指导教师验收各小组成果,给出成绩
3、各小组交实践报告
4、交硬件设备
五、主要参考文献(三篇以上)
[1] 胡汉才.单片机原理及接口技术[M].北京:清华大学出版社.1996
[2] 李广弟等.单片机基础[M].北京航空航天出版社,2001.
[3] 刘守义等.单片机技术基础[M].西安电子科技大学,2007.
[4] 裴岩.刘利民.单片机系统综合设计与实践[M].内蒙古大学出版社.2003
[5] 李平等.单片机入门与开发[M].北京:机械工业出版社.2008:33-37.
[6] 高吉祥.全国大学生电子设计竞赛培训系列教程[M].北京:电子工业出版社.2007
审核意见

系(教研室)主任(签字)
指导教师下达时间 2021 年 3 月 1 日

指导教师签字:

一、设计目的与意义:
利用一个以8 位单片机为核心的小型单片机应用系统完成一个简单项目,从项目的可行性分析、硬件测试、系统的框图建造、到软件设计调试,综合运用所学课程的相关知识,掌握具有A/D、七段LED 显示、RS-485 通信、Watchdog 等接口电路的单片机应用系统的设计思想和方法。培养学生的工程设计思想和科学研究能力,使学生在分析问题、解决问题和动手能力等方面有所提高,初步达到能够设计、调试一个小型单片机应用系统系统,并了解工程项目设计实施的全过程。
二、硬件实验板介绍及硬件自检:
2.1、硬件图及相关说明
a.蜂鸣器由P2.3端口控制,低电平则发声,高电平则停止发声。
b.共有四个独立按键K1、K2、K3、K4分别由P1.0、P1.1、P1,2、P1.3控制。
c.数码管位选信号由P2.5、P2.6、P2.7控制。
d.数码管的段选信号由P0控制。
在这里插入图片描述
图1:蜂鸣器电路图
蜂鸣器的发声原理由振动装置和谐振装置组成,由上图可知,当三极管基极为低电平时三极管导通,三极管集电极有电流流过,蜂鸣器并联的二极管截至,蜂鸣器有电流流过,蜂鸣器内部通过电磁感应现象产生震动,蜂鸣器响。 在这里插入图片描述
图2:按键电路图
按键控制时需要注意SEL8的选通,由于单片机上电默认SEL8导通,故一般情况下不影响,但一旦出现干扰SEL8或需关闭SEL8的情况时,要再次使用按键需让SEL8选通。 在这里插入图片描述
图3:数码管电路图
本次单片机课设有5个数码管,由SEL1-SEL5控制数码管段选,P27,P26,P25控制SEL1-SEL5选通,由P00-P07控制数码管段选P00-P0^7接口输出后接反相器和保护电阻经总线到数码管,进而控制数码管显示的字符。此外还需注意数码管DT1只能显示4段LED其余4段为LED灯,因此在验证时需要分别验证。
2.2、自检子程序流程框图
硬件自检主要分为两部分,其一为按键控制LED灯和蜂鸣器自检,以及数码管自检,其主要流程图如下 在这里插入图片描述
图4:按键控制LED灯和蜂鸣器自检
在这里插入图片描述图5:数码管自检

2.3、硬件自检总结
2.3.1、蜂鸣器
蜂鸣器自检主要验证不同频率蜂鸣器发声状态,为了方便性,我们采用蜂鸣器响和不响的延时时间来控制蜂鸣器响的占空比,从而达到频率变换作用,使蜂鸣器发出不同频率的声音,本次自检采用的蜂鸣器响和不想的延时时间和对应响度频率占空比如下;
表1: 延时时间和对应响度频率占空比 在这里插入图片描述
2.3.2、数码管
数码管检测主要分为第一个数码管和第2-5个数码管检测,由于硬件原因,第一个数码管可显示的数为-1、1,由于第一个数码管的b、c、g、h、连接在LED灯上,故第一段数码管检测还需检测LED灯,对于第2-5个数码管的显示只需检测其显示数字0-9即可。数码管显示数字及其对应的16进制数如下表
表2:数码管显示数字及其对应的16进制数 在这里插入图片描述
第一段数码管检测检测LED灯 ,数码管显示LED灯及其对应的16进制数如下表 。
表3:数码管显示LED灯及其对应的16进制数
在这里插入图片描述
2.3.3、按键自检
按键自检不易观察因此配合蜂鸣器和LED这两种易于观察的硬件进行自检,通过按下不同的按键从而使不同的LED灯亮和不同频率的蜂鸣器响来判断是否对应的按键被按下。此外,按键自检时还需要注意按键抖动问题(如图6)。按键检测时需先判断案件是否按下,然后延时消抖再进行判断是否按下。
在这里插入图片描述
图6:按键特性
想用蜂鸣器模拟出音乐,就需要先把乐谱转换为十六进制数,简单看来音乐就是高低不一,长短不一声的音间隔不同时间的排列组合,所以乐谱改编成十六进制就是三个要素:音符即DO,RE,MI,FA,SO,LA,SI这七个不同音符,音高即高中低三种音,节拍即音符之间的间隔时长,所以基本思路是用根据这三要素定时器产生音频脉冲,不同音符对应频率如下表:
时间常数是按晶体频率11.0592MHz计算而得T值,即为时间常数值机器周
在这里插入图片描述
符的节拍,表4:音符节拍
下表为节拍码的对照。但如果1拍为0.4秒,1/4拍是0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如下表为1/4和1/8节拍的时间设定。 在这里插入图片描述
要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。 2.利用8051的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
3.例如频率为523Hz,其周期T=1/523=1912us,因此只要令计数器计时956us/1us=956,在每计数956次时将I/O反相,就可得到中音DO(523Hz)。
计数脉冲值与频率的关系公式如下:
N=Fi÷2÷Fr N:计数值;
Fi:内部计时一次为1us,故其频率为12MHz;
Fr:要产生的频率;
4.其计数值的求法如下:
T=65536-N=65536-Fi÷2÷Fr
例如:设K=65536,F=1000000=Fi=1MHz,求低音DO(261MHz)、中音DO(523MHz)、高音DO(1046MHz)的计数值。
T=65536-N=65536-Fi÷2÷Fr=65536-1000000÷2÷Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
中音DO的T=65536-500000/523=64580
高音DO的T=65536-500000/1047=65059
a.在蜂鸣器自检程序中,定义一个延时函数,通过延时的不同来控制声音的频率。
b.在数码管自检程序中,通过硬件电路图,设置合理的位选信号和段选信号,尝试数码管中的每个发光二极管依次点亮,看结果是否是每个都被依次点亮(DT1的LED灯也同时检测)。
c.在独立按键自检程序中,通过按键对蜂鸣器响的不同频率的控制来检测按键是否正常,即任何状态下,不同按键按下,蜂鸣器的频率不同,发出响声不同。
2.5、自检程序清单

a.蜂鸣器自检程序:

#include "reg51.h"
typedef unsigned int u16;
sbit beep=P2^3;  //定义蜂鸣器端口

void delay(u16 i)
{
  while(i--);  //一次大概1微秒us
}
void main()
{	 
  	 while(1)  
	   { 
		 beep=~beep;  //发生反转
	     delay(60000);
	   }
}

b.数码管蜂鸣器自检程序:

include "reg51.h"
unsigned int   snumber=0;
unsigned char code table1[]={0x8C,0X0c,0x40,0x20,0x10,0x02}  ;
unsigned char code table[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde}  ;

sbit BEEP=P2^3;

sbit C=P2^7;
sbit B1=P2^6;
sbit A=P2^5;  //sel1 led red green

sbit LED1=P0^1;
sbit LED2=P0^2;
sbit LED3=P0^3;//shuma
void delay(unsigned int j)
	{
	  unsigned int i=1000,k=0;
	  for(i=1000;i>0;i--)
	     {for(k=j;k>0;k--);	  	 
		 }
	}
void main (void)
{

  while(1)
   {

  A=0,B1=0,C=0;
  for(snumber=0;snumber<=5;snumber++)
  {
  	 P0=table1[snumber];	 
	 delay(100);
  }
  delay(100);
  BEEP=0;
  delay(100);	
  BEEP=1;
  delay(100);

  A=1,B1=1,C=1;
  delay(10);
  A=0,B1=0,C=1;
  for(snumber=0;snumber<=9;snumber++)
  {
  	 P0=table[snumber];	 
	 delay(100);
  }
  delay(100);
  BEEP=0;
  delay(100);	
  BEEP=1;
  delay(100);

  A=1,B1=1,C=1;
  delay(10);
  A=0,B1=1,C=0;
  for(snumber=0;snumber<=9;snumber++)
  {
  	 P0=table[snumber];	 
	 delay(100);
  }
  delay(100);
  BEEP=0;
  delay(100);	
  BEEP=1;
  delay(100);

	A=1,B1=1,C=1;
	delay(10);
	A=0,B1=1,C=1;
	for(snumber=0;snumber<=9;snumber++)
		{
 		P0=table[snumber];	 
 		delay(100);
			}
	delay(100);
	BEEP=0;
	delay(100);	
	BEEP=1;
	delay(100);

  A=1,B1=1,C=1;
  delay(10);
  A=1,B1=0,C=0;
  for(snumber=0;snumber<=9;snumber++)
  {
  	 P0=table[snumber];	 
	 delay(100);
  }
  delay(100);
  BEEP=0;
  delay(100);	
  BEEP=1;
  delay(100);

      }
}

c.独立按键蜂鸣器自检程序:

#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;

sbit k1=P1^0;sbit k2=P1^1;
sbit k3=P1^2;sbit k4=P1^3;
sbit beep=P2^3;
sbit C=P2^7;
sbit B1=P2^6;
sbit A=P2^5;  //sel1 led red green

unsigned char code table1[]={0x40,0x20,0x10,0x02,0x00}  ;
unsigned char	k=5;
unsigned int   snumber=0;
void delay(u16 i)
{
   while(i--);
}

void display(unsigned int j)
{

  A=0,B1=0,C=0;
  //P0=table1[3];
  delay(10);
  P0=table1[j];	 
  delay(100);
  delay(100);	
  delay(100);
  A=1,B1=1,C=1;  
 
}
unsigned int keyan()
{   
    if(k1==0)
	{
	  delay(100);
	  if(k1==0)
	  {
	     k=1;
	  }
	  
	}
	  if(k2==0)
	{
	  delay(100);
	  if(k2==0)
	  {
	     k=2;
	  }
	
	}
	 if(k3==0)
	{
	  delay(100);
	  if(k3==0)
	  {
	     k=3;
	  }
	 
	}
	  if(k4==0)
	{
	  delay(1000);
	  if(k4==0)
	  {
	     k=4;
	  }
	
	}
   return k;
}

void main()
{	
   while(1)
    { 
	   keyan();

	  switch (k)
	  { 
	  case 1:	display(0)  ; beep=0;delay(100);beep=1;delay(100); break;
	  case 2:	display(1)  ; beep=0;delay(400);beep=1;delay(200);break;
	  case 3:	display(2)  ; beep=0;delay(700);beep=1;delay(600);break;
	  case 4:	display(3)  ; beep=0;delay(1600);beep=1;delay(700);break;

	  }
       
    }
}

三、设计任务分析:
3.1、任务内容
a.蜂鸣器可以发出优美的音乐
b.键盘可以切歌,暂停
c.数码管显示当前曲目
3.2、任务分工
:独立按键自检,换歌功能,主程序、流程框图、说明书编写
景丽娜框图、说明书编写
:数码管自检,音符曲谱编写,计时功能,主程序、说明书编写
3.3、设计思路
主程序功能:执行程序时可以播放歌曲(歌曲预先通过计算,将乐谱转换为定时器预设值并以数组的形式存在程序中),同时受到开关的控制。开关k2有暂停键/播放功能,还有k1切歌键可以换下一首歌播放。显示曲目由数码管显示数字,由数字123等代表曲目。
3.4、程序流程框图
在这里插入图片描述

图7: 主程序流程图

3.5、程序清单
曲谱表中每项两个字节,前一个字节为音符,后一个字节为持续时间。 如果曲谱表中的下一个音符为00,则静音指定的持续时间,之后继续。 如果曲谱表中的下一个音符为0xFF,则静音30之后,重新开始播放曲谱。 如果曲谱表中的下一个音符与当前音符相同,则播放完本音符后,静音暂停一拍,然后再继续。 其它情况则正常取出音符、持续时间来播放 。

/换目的,用于切换///与暂停,要找一首歌的程序没有/

#include<reg51.h>
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
typedef unsigned int u16;	  
typedef unsigned char u8;
	
sbit beep=P2^3;
sbit k2=P1^0;    //暂停 播放
sbit k3=P1^1;	   //上一首
sbit k1=P1^2;  //换歌   只有在播放时才能换歌  ,xiayishou

sbit la=P2^7;sbit lb=P2^6;sbit lc=P2^5;

uchar m,n,k,nu;
u8 xinff = 0;
unsigned int   snumber=0;
unsigned char code table1[]={0x8C,0X0c,0x40,0x20,0x10,0x02}  ;
unsigned char code table[]={0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde,0xde/* g*/,0xf2/**** e*****/}  ;
uchar code T[49][2]={
   
   {0,0},{0xF8,0x8B},{0xF8,0xF2},{0xF9,0x5B},{0xF9,0xB7},{0xFA,0x14},{0xFA,0x66},{0xFA,0xB9},{0xFB,0x03},{0xFB,0x4A},{0xFB,0x8F},{0xFB,0xCF},{0xFC,0x0B},{0xFC,0x43},{0xFC,0x78},{0xFC,0xAB},{0xFC,0xDB},{0xFD,0x08},{0xFD,0x33},{0xFD,0x5B},{0xFD,0x81},{0xFD,0xA5},{0xFD,0xC7},{0xFD,0xE7},{0xFE,0x05},{0xFE,0x21},{0xFE,0x3C},{0xFE,0x55},{0xFE,0x6D},{0xFE,0x84},{0xFE,0x99},{0xFE,0xAD},{0xFE,0xC0},{0xFE,0x02},{0xFE,0xE3},{0xFE,0xF3},{0xFF,0x02},{0xFF,0x10},{0xFF,0x1D},{0xFF,0x2A},{0xFF,0x36},{0xFF,0x42},{0xFF,0x4C},{0xFF,0x56},{0xFF,0x60},{0xFF,0x69},{0xFF,0x71},{0xFF,0x79},{0xFF,0x81}};
uchar code music0[][2]={
   
   {0,4},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},{0,4},{17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{21,4},{24,4},{21,4},{21,4},{19,4},{19,16},{0,4},{17,4},{19,4},{17,4},{17,4},{19,4},{17,4},{19,4},{19,4},{21,8},{24,4},{21,4},{21,12},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{14,8},{19,4},{21,4},{24,4},{21,4},{19,16},{0,4},{24,4},{24,4},{21,4},{19,4},{21,4},{12,8},{19,4},{21,4},{24,4},{19,4},{17,16},{0,4},{17,4},{19,4},{21,4},{24,4},{26,4},{24,4},{22,4},{24,4},{21,4},{21,4},{19,4},{19,12},{12,4},{21,8},{19,4},{19,8},{17,16},{0xFF,0xFF}};//青花瓷
uchar code music2[][2]={
   
   {0,4},{23,4},{16,4},{19,4},{21,2},{23,2},{23,16},{26,4},{28,4},{28,4},{26,4},{23,16},{23,4},{28,4},{28,4},{23,4},{21,16},{26,4},{23,2},{26,2},{19,4},{21,2},{19,2},{16,16},{28,16},{0,8},{19,2},{21,2},{23,2},{26,2},{28,8},{28,6},{26,2},{23,4},{23,2},{31,2},{28,8},{26,4},{26,2},{28,2},{26,4},{21,2},{26,2},{23,16},{21,6},{21,2},{21,4},{16,4},{19,4},{21,2},{23,2},{21,8},{23,4},{23,2},{26,2},{21,2},{23,2},{19,2},{14,2},{16,12},{16,4},{16,2},{14,2},{11,4},{19,2},{16,2},{16,16},{23,4},{23,4},{21,4},{19,2},{16,2},{16,16},{21,4},{21,2},{19,2},{21,4},{23,2},{21,2},{21,16},{19,4},{16,2},{19,2},{16,4},{14,2},{11,2},{11,12},{11,2},{14,2},{16,4},{16,2},{14,2},{11,4},{19,2},{16,2},{16,12},{19,2},{21,2},{23,4},{23,4},{21,4},
{26,2},{23,2},{23,12},{23,2},{26,2},{28,4},{28,4},{28,4},{21,2},{23,2},{21,12},{19,2},{21,2},{23,6},{26,2},{23,6},{26,2},{23,4},{14,4},{16,16},
{0xFF,0xFF}};//酒醉的蝴蝶

uchar code music1[][2]={
   
   {0,4},//liangzhihudie
{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,16},{16,4},{19,4},{21,8},{21,4},{23,4},{21,4},{19,4},{16,4},{19,4},{14,24},{23,4},{21,4},{23,16},{23,4},{21,4},{23,4},{21,4},{19,24},{16,4},{19,4},{21,8},{21,4} ,{23,4},{21,4},{19,4},{16,4},{19,4},{19,4},{14,24},{23,4},{26,4},{26,16},{26,4},{28,4},{26,4},{23,24},{21,4},{23,4},{21,8},{21,4},{19,4},{16,4},{16,2},{19,2},{19,24},{0,20},{26,4},{26,4},{28,4},{31,4},{30,4},{30,4},{28,4},{23,4},{21,4},{21,4},{23,16},{0,4},{23,4},{23,4},{26,4},{28,8},{28,12},{23,4},{16,4},{23,4},{21,4}	,{0xFF,0xFF}};
void delay(uchar p)
{
uchar i,j; 
for(;p>0;p--)
for(i=181;i>0;i--)
for(j=181;j>0;j--);
}
void pause()
{
uchar i,j;
for(i=150;i>0;i--)
for(j=150;j>0;j--);

}
void delayziji(u16 i)//1us
{
while(i--);	}
void Delay500ms()	





//@12MHz500ms
{
	unsigned char i, j, k;
	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
		  while (--k);
		} while (--j);
	} while (--i);
}
uchar stop=0;
void scan()	                     {
  P2=0xff;
  if(k2==0)								 
  {
	pause();
    pause();
  if(k2==0)   stop++;									 
  stop=stop%2;
  if(stop%2==1)  TR0=0;
  while(stop%2)
  {
  if(k2==0)								 
    {
      pause();
      pause();
   if(k2==0)   stop++;
    }
   }
  }
}
void display(unsigned char );
//
void T0_int() interrupt 1  //
{
beep=!beep;
TH0=T[m][0]; TL0=T[m][1];
scan ();
if(nu==1) display(1);
if(nu==2) display(2);
if(nu==3) display(3);
}
//
void yinyue1()
{
  uchar i=0;
  uchar k=0; 
  while(1)
 { switch(k)

    {
     case 0:
        {
			m=music0[i][0];
			n=music0[i][1];
          if(m==music0[i+1][0]) 
       {
	TR0=1;delay(n);TR0=0;display(1);pause();i++; 
			}
           break;
        }
    } 
  if(m==0x00)// 开始
  {
			TR0=0;	display(1);
			delay(n);i++;
	} 
  else if(m==0xFF)//播放结束
  {	  
	  TR0=0;delay(30);i=0;
		k++;	goto huange1;
	} 
  else
  {	 
	  TR0=1;delay(n);i++;
	}
	if(k1 == 0)			 
{	 
		delayziji(100);
		if(k1 == 0)	
		  {	
		   goto huange1;
		  }
		while(!k1);
	  }	
	  if(k3 == 0)			 //??
	  {	   
		  delayziji(100);
		  if(k3 == 0)	
		  {	 
			 xinff=1;
		    goto huange1;
		  }
			while(!k3);
	  }	
}	
huange1:;
}
void yinyue2()
{
  uchar i=0;
  uchar k=0; 
  while(1)
  {
    switch(k)
    {
     case 0:
 {
		m=music1[i][0];
		n=music1[i][1];
     if(m==music1[i+1][0]) {
	 TR0=1;delay(n);TR0=0;display(2);pause();i++; 
		}
   break;
          }
    }
  if(m==0x00)
  {
	  TR0=0;delay(n);i++;
	} 
  else if(m==0xFF)
  {
	  TR0=0;delay(30);i=0;
		k++;	goto huange2;
	} 
  else
  {
	TR0=1;	
    delay(n);
    i++;
	}
	if(k1 == 0)			 //
	  {
		  delayziji(100);
		  if(k1 == 0)	
		  {
	 goto huange2;
		  }
			while(!k1);
	  }		
   	if(k3 == 0)			 
	  {
		  delayziji(100);
		  if(k3 == 0)	
		  {
			 xinff=2;
		    goto huange2;
		  }
			while(!k3);
	  }	
}
huange2:
;
}
   void yinyue3()
{
  uchar i=0;
  uchar k=0; 
  while(1)
  {	
    switch(k)
    {
     case 0:
        {
			m=music2[i][0];
			n=music2[i][1];
          if(m==music2[i+1][0]) 
           {
			TR0=1;delay(n);TR0=0;display(3);pause();i++; 
			}
           break;
        }
    } 
  if(m==0x00)//
  {
	  TR0=0;delay(n);i++;
	} 
  else if(m==0xFF)//播放结束
  {
	  TR0=0;delay(30);i=0;
		k++;  goto huange3;
	} 
  else
  {
	  TR0=1;delay(n);i++;
	}
	if(k1 == 0)			 
	  {
		delayziji(100);
		if(k1 == 0)	
		  {
		   goto huange3;
		  }
	while(!k1);
	  }	
	  if(k3 == 0)			 
	  {
		  delayziji(100);
		  if(k3 == 0)	
		  {  xinff=0;
		    goto huange3;
		  }
			while(!k3);
	  }	
}
huange3:
;
}
void main()
{ 	
  display(1);
  TMOD=0x01; EA=1; ET0=1;
	while(1)
	{	
		switch(xinff)
		{	case 0:
	{nu=1;	yinyue1();break;  }
		   case 1:
{ nu=2;  yinyue2();break;	}
			case 2:
	{nu=3;   yinyue3();break; }}
		xinff++;
		if(xinff == 3)
		 {   xinff = 0;}	
	}		
}
void display(unsigned char i )
{
  lc=0,lb=1,la=1;
  P0=table[i];	
  lc=1,lb=1,la=1; 
}

3.6、实验结果分析
当接通电源后,开始播放第一首歌,在歌曲播放过程中,按下暂停键可以停止当前歌曲播放,再次按下暂停键可继续播放当前音乐,在播放过程中按下换歌键,可以切换到下一首歌,在播放过程中按下上一首换歌键,可以切换到上一首歌,在一首歌曲结束后,会自动播放下一首。
四、设计体会

首先在做本次实验的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片机实习,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
在完成单片机课程设计后,我们发现我们还有很多不足,所学到的知识还远远不够,以至于还有一些功能不能完美实现。但通过学习这一次实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是硬件方面。从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。

经过这段时间的单片机实训,使我学到了很多知识,在以前的上课学习过程中,只是机械的学习一些字符,语句的应用,而很难有这样的机会来编写一段程序,并有这样的硬件环境来实现自己的程序,使自己编写的东西可以直观的体现出来。看到程序可以在仿真器的帮助下实现一些功能,感觉很有成就感。我们运用到了以前所学的专业课知识,如:C语言、微型计算机原理与接口技术。但是在程序的编写过程中则遇到了许多的问题,这就需要和同组同学在一起讨论,将大家好的想法结合在一起,这样才可以用最简单最少的程序来实现最多,做好的作用。这次的实践当中使我又一次更加深刻的意识到团队合作的重要性。产品的设计需要我们把自己当成客户,看看如果别人向我们推荐这个产品我们是否需要。作为一个开发者,要考虑周全产品的实际功能。

经过这两个星期的单片机课程设计,我们的模拟MP3演唱歌曲也有收获。在这个过程中,我深深体会到了理论与实际的不同,理论到实践的过程中还有很长的路要走,在刚开始看到硬件电路图的时候,我基本什么都不明白,通过前两天的硬件自检程序的编写检测,也让我对我们所面临的硬件有了更深的理解,也将自己编写的程序比较直观的显示出来,这是较于以往比较难得的机会,让我也有了很多新的认识。因为我们的题目是MP3演唱歌曲,会有换歌,暂停键,播放键的设计,特别是在暂停播放的时候,我们本可以用中断直接去控制,中断结束后就可以直接回去在继续播放,但是由于没有外部中断可以利用,我们只能是通过程序的方式去控制,大大的加大了难度以及复杂度。
但是在这个过程中,也正是这些种种的困难,让我对c语言以及硬件电路有了更深的认识。让我更有感触的是,我们彼此之间的合作,我们一起讨论问题,解决问题,培养了团队意识。最后,十分感谢老师的耐心指导,没有您们的帮助,我们也不会这么顺利的完成。我也希望能将这次实践中学到的经验和知识,可以运用到日后的学习生活中。

五、参考资料
1、胡汉才.单片机原理及接口技术[M].北京:清华大学出版社.1996
2、李广弟等.单片机基础[M].北京航空航天出版社,2001.
3、刘守义等.单片机技术基础[M].西安电子科技大学,2007.
4、裴岩.刘利民.单片机系统综合设计与实践[M].内蒙古大学出版社.2003
5、李平等.单片机入门与开发[M].北京:机械工业出版社.2008:33-37.
6、高吉祥.全国大学生电子设计竞赛培训系列教程[M].北京:电子工业出版社.2007
7、《单片机系统综合设计与实践》教材 主编:裴岩 刘利民 内蒙古大学出版社。

猜你喜欢

转载自blog.csdn.net/qq_43543515/article/details/114689272
mp3