当前位置:文档之家› 音乐中断 在定0专业综合利用定时器的中断方式控制歌曲的播放

音乐中断 在定0专业综合利用定时器的中断方式控制歌曲的播放

中北大学信息商务学院课程设计说明书学生姓名:牛登峰学号:1305034140 学院:信息与通信工程学院专业:电子信息工程题目:专业综合实践之单片机部分:利用定时器的中断方式控制歌曲的播放指导教师:王浩全杨鹏职称: 教授助教2016 年 12 月01日中北大学信息商务学院课程设计任务书2016/2017学年第1学期学院:中北大学信息商务学院专业:电子信息工程学生姓名:牛登峰学号:1305034140课程设计题目:专业综合实践之单片机部分:利用定时器的中断方式控制歌曲的播放起迄日期:11月28日~12月09日课程设计地点:系实验室指导教师:王浩全杨鹏下达任务书日期:2016 年 11 月28日课程设计任务书课程设计任务书设计说明书应包括以下主要内容:qu dong ying yue mo kuai Yang sheng qi xia(1)封面:课程设计题目、班级、姓名、指导教师、时间(2)设计任务书(3)目录(4)设计方案简介(5)设计条件及主要参数表(6)设计主要参数计算(7)设计结果(8)设计评述,设计者对本设计的评述及通过设计的收获体会(9)参考文献课设题目:利用定时器的中断方式控制歌曲的播放班级13050341学号1305034140姓名牛登峰指导老师:王浩全,杨鹏时间:2016 .12. 11目录1实验设计 (8)2设计方案及原理 (9)3硬件设计 (10)4程序设计 (11)5系统调试 (14)6实验心得 (14)7中断介绍 (17)8参考文献 (17)1.1 设计目的此次制作的音乐播放器,只需将音乐编码导入C语言程序,经过KEIL软件运行生成HEX文件,经BDM下载器导入单片机中即可。

可以同时生成多首歌曲的音乐编码,再次我选择了两首歌的音乐编码。

学生自己动手就可以制作属于自己的个性化的音乐播放器,通过自己动手将所学的单片机知识应用到实践中。

1.2 设计要求设计一个基于AT89C51的音乐播放器,利用软件编程和相应的硬件电路实现不同歌曲的播放,先利用KEIL软件编程,再用PROTEUS仿真实现,生成可执行的HEX 文件,最后焊接实物电路。

1.3 设计方法采用AT89C51单片机、蜂鸣器,晶体振荡器,晶体管2N2905,复位开关为主要硬件。

PROTEUS仿真软件设计和C语言编程方法实现播放器的模拟,用AT89C51实现音乐编码的处理,用晶体管2N2905对电路中电流放大,进而驱动蜂鸣器播放音乐。

2 设计方案及原理按照系统设计要求,将系统分为主控模块,电源电路复位电路、晶振电路、功率放大电路,蜂鸣器发声电路等模块。

系统框图如图1所示。

图1 系统组成框图AT89C51简介AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压,高性能CMOS 8位微处理器,俗称单片机。

AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。

单片机的可擦除只读存储器可以反复擦除100次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。

AT89C51单片机外形及引脚排列如图2所示。

图2 AT89C51单片机引脚图3硬件设计3.1晶振电路晶振电路,对于单片机系统而言是必须的,因为单片机内部是由各种各样的数字逻辑器件构成,而这些器件又必须按时间顺序完成。

所以在管脚的XTAL1和XTAL2引脚外接石英晶体和俩个谐振电容,电容采用2个30pf电容,采用12M的石英晶体。

这样就可以构成单片机的基本时钟电路,时钟频率为12M。

如图2所示图2晶振电路3.2 复位电路复位电路是对单片机进行初始化操作,使单片机处于一个确定的初始状态。

而要AT89S51复位得在RESET引脚上加5V的高电平信号就可以了。

复位电路参数为30U的电解电容和1kΩ的电阻。

如图3为单片机的复位电路。

图3复位电路3.3功率放大电路功率放大电路对工作电流进行放大,因为单片机电路本身的电流不足以带动蜂鸣器发生,加一个三极管放大器2N2905可以带动蜂鸣器发生。

图4功率放大电路图5 最终程序图4实验程序设计//用定时器T0的中断实现"樱花草"的播放#include<reg51.h> //包含51单片机寄存器定义的头文件sbit sound=P1^0; //将sound位定义为P3.7unsigned int C; //储存定时器的定时常数//以下是C调低音的音频宏定义#define l_dao 262 //将“l_dao”宏定义为低音“1”的频率2#define l_re 286 //将“l_re”宏定义为低音“2”的频率2#define l_mi 311 //将“l_mi”宏定义为低音“3”的频率3#define l_fa 349 //将“l_fa”宏定义为低音“4”的频率3#define l_sao 392 //将“l_sao”宏定义为低音“5”的频率3#define l_la 440 //将“l_a”宏定义为低音“6”的频率4#define l_xi 494 //将“l_xi”宏定义为低音“7”的频率4//以下是C调中音的音频宏定义#define dao 523 //将“dao”宏定义为中音“1”的频率5#define re 587 //将“re”宏定义为中音“2”的频率5#define mi 659 //将“mi”宏定义为中音“3”的频率65#define fa 698 //将“fa”宏定义为中音“4”的频率698Hz#define sao 784 //将“sao”宏定义为中音“5”的频率7#define la 880 //将“la”宏定义为中音“6”的频率88#define xi 987 //将“xi”宏定义为中音“7”的频率523H//以下是C调高音的音频宏定义#define h_dao 1046 //将“h_dao”宏定义为高音“1”的频率1046Hz #define h_re 1174 //将“h_re”宏定义为高音“2”的频率1174Hz #define h_mi 1318 //将“h_mi”宏定义为高音“3”的频率1318Hz #define h_fa 1396 //将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 //将“h_sao”宏定义为高音“5”的频率1567Hz #define h_la 1760 //将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 //将“h_xi”宏定义为高音“7”的频率1975Hz/*******************************************函数功能:1个延时单位,延时200ms******************************************/void delay(){unsigned char i,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}/*******************************************函数功能:主函数******************************************/void main(void){unsigned char i,j;//以下是《渴望》片头曲的一段简谱unsigned int code f[]={mi,re,dao,l_sao,dao,mi,re,mi,re, //每行对应一小节音符dao,l_mi,l_la,dao,l_xi,dao,xi,la,l_la,l_xi,l_la,l_sao,l_sao,dao,dao,fa,mi,re,dao,mi,re,mi,re, //接下来重复前三节dao,l_sao,dao,mi,re,mi,re,dao,l_mi,l_la,dao,l_xi,dao,xi,la,l_la,l_xi,l_la,l_sao,l_sao,dao,dao,fa,mi,re,dao,mi,re,mi,dao,re,dao,l_xi,l_la,l_sao,dao,mi,fa,mi,re,mi,dao,dao,re,dao,l_xi,l_la,sao,dao,mi,fa,mi,re,la,sao,mi,sao,sao,mi,re,re,sao,sao,mi,sao,sao,mi,re,dao,dao,re,mi,mi,sao,mi,re,re,sao,mi,dao,re,mi,sao,re,re,la,sao,mi,sao,sao,mi,re,re,sao,sao,mi,sao,sao,mi,re,dao,dao,re,mi,mi,sao,mi,re,re,sao,mi,dao,re,mi,sao,re,re,mi,dao,dao,mi,re,mi,dao,mi,re,dao,mi,re,mi,dao,dao,mi,re,mi,sao,mi,re,dao,mi,re,0xff}; //以0xff作为音符的结束标志//以下是简谱中每个音符的节拍//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位unsigned char code JP[ ]={ 3,1,2,2,2,2,4,3,1,2,2,2,2,4,2,1,1,4,2,1,1,6,1,1,2,2,2,1,1,4,3,1, //:接下来重复前三节2,2,2,2,4,3,1,2,2,2,2,4,2,1,1,4,2,1,1,6,1,1,2,2,2,1,1,6,2,6,2,2,1,1,2,2,2,1,1,6,2,6,1,1,6,1,1,2,2,2,1,1,4,3,1,2,2,2,1,1,4,3,1,2,2,2,1,1,4,2,1,1,4,2,1,1,4,3,1,2,2,2,2,2,4,3,1, //:表示重复前三节2,2,2,1,1,4,3,1,2,2,2,1,1,4,2,1,1,4,2,1,1,4,3,1,2,2,2,1,1,6,2,16,2,2,2,2,2,2,4,2,2,2,2,8,2,2,2,2,6,1,1,12,3,1,};EA=1; //开总中断ET0=1; //定时器T0中断允许TMOD=0x00; // 使用定时器T0的模式1(13位计数器)while(1) //无限循环{i=0; //从第1个音符f[0]开始播放while(f[i]!=0xff) //只要没有读到结束标志就继续播放{C=460830/f[i];TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法TR0=1; //启动定时器T0for(j=0;j<JP[i];j++) //控制节拍数delay(); //延时1个节拍单位TR0=0; //关闭定时器T0i++; //播放下一个音符}while(1);}}/***********************************************************函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波************************************************************/void Time0(void ) interrupt 1 using 1{sound=!sound; //将P3.7引脚输出电平取反,形成方波TH0=(8192-C)/32; //可证明这是13位计数器TH0高8位的赋初值方法TL0=(8192-C)%32; //可证明这是13位计数器TL0低5位的赋初值方法}5中断介绍EA:中断总控制 1 开启0关闭ET0 :定时器0溢出中断 1开启0关闭要点:中断号计算5系统仿真及调试软件调试,先编写显示程序并进行硬件的正确性检验,然后分别进行主程序,音乐播放程序和定时程序的编译和调试;硬件调试,仔细检查电路有没有漏接或是错接的地方,再接一个电压表检查供给蜂鸣器的电压是否合适,调节电阻的阻值以调节工作电路的阻值。

相关主题