汽车传感器与单片机接口技术 大作业学号: 姓名: 班级: 学院: 2018年10月 选题与设计要求 课题:播放音乐 设计要求: 使用蜂鸣器实现两首音乐播放,采用独立按键K1,K2进行控制,要求开机后,按下K1开始播放音乐,按下K2实现音乐切换。(可采用延时函数方式或定时器方式实现音乐播放) 硬件设计 设计原理 设计采用89c51单片机作为微控制器,其运行速度可达到1us,我们利用其内部可配置16位定时器对端口的不同时间的取反实现对声音的控制;采用无源蜂鸣器作为发声元件,无源蜂鸣器的声音控制完全依赖于其输入频率的不同,这正是我们需要的发声元件;采用按键进行播放和切歌控制,独立按键具有较好的响应和用户发聩,是常用的控制元件,为了实现系统的快速响应,我们将独立按键接到了单片机外部中断端口,并且在算法上,给控制信号做了特殊优化,实现了系统的快速响应。 解决方案与资源分配 该系统主要功能分别为:按键控制和音乐播放; 按键控制:我们首先尝试用查询方式设置按键,最后发现,查询方式在切歌是存在一定程度的延时或者不响应;因此,考虑到本系统只有两个按键,没有其他外部设备,所以我们将按键接在了外部中断端口;在提高切歌速度的同时简化了代码; 音乐播放:音乐播放最开始我们采用延时方式进行操作,发现其代码过于复杂,并且不便于移植和增加功能;因此,考虑到代码的直观性和执行效率,我们采用了定时器方式控制蜂鸣器输入频率从而达到播放音乐效果,代码直观且容易修改。 系统总体结构 (系统结构图) 仿真图) 软件设计 程序设计说明 程序采用定时器作为音乐播放控制,分别将每个音调的频率进行宏定义,封装成数组方便使用,同时把每个音符的节拍也封装成数组,从而用两个数组存储我们要播放的音乐,在程序执行时,我们通过调用数组里的音调也就是其对应的频率进行定时器初值的计算,然后同过改变定时器的初值达到改变音调的目的;通过节拍延时,实现不同的节拍。 控制方面,采用外部中断控制开始和歌曲选择标志,主程序通过对标志的判断实现功能切换。 程序流程图 (流程图) 软件代码 /****************************************************************************************** 基于51的音乐播放器 采用定时器0播放音乐,外部中断0和外部中断1控制切歌; *******************************************************************************************/ #include sbit sound=P2^0; //蜂鸣器端口定义; unsigned int C; //定时器初值该变量(由这个变量改变频率发出不同声音); unsigned char MusicAB;//两首歌切换标志; unsigned char MusicStart; //播放开始按键; unsigned char INT; //切换键响应标志;(按下切换触发中断后使程序快速反应,无延迟切歌); //以下是C调低音的音频宏定义 #define l_dao 262 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 286 //将“l_re”宏定义为低音“2”的频率286Hz #define l_mi 311 //将“l_mi”宏定义为低音“3”的频率311Hz #define l_fa 349 //将“l_fa”宏定义为低音“4”的频率349Hz #define l_sao 392 //将“l_sao”宏定义为低音“5”的频率392Hz #define l_la 440 //将“l_a”宏定义为低音“6”的频率440Hz #define l_xi 494 //将“l_xi”宏定义为低音“7”的频率494Hz //以下是C调中音的音频宏定义 #define dao 523 //将“dao”宏定义为中音“1”的频率523Hz #define re 587 //将“re”宏定义为中音“2”的频率587Hz #define mi 659 //将“mi”宏定义为中音“3”的频率659Hz #define fa 698 //将“fa”宏定义为中音“4”的频率698Hz #define sao 784 //将“sao”宏定义为中音“5”的频率784Hz #define la 880 //将“la”宏定义为中音“6”的频率880Hz #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 //《渴望》片头曲的一段简谱 unsigned int code fA[]={	re,mi,re,dao,l_la,dao,l_la,	l_sao,l_mi,l_sao,l_la,dao,	l_la,dao,sao,la,mi,sao,	re,	mi,re,mi,sao,mi,	l_sao,l_mi,l_sao,l_la,dao,	l_la,l_la,dao,l_la,l_sao,l_re,l_mi,	l_sao,	re,re,sao,la,sao,	fa,mi,sao,mi,	la,sao,mi,re,mi,l_la,dao,	re,	mi,re,mi,sao,mi,	l_sao,l_mi,l_sao,l_la,dao,	l_la,dao,re,l_la,dao,re,mi,	re,	l_la,dao,re,l_la,dao,re,mi,	re,	0xff}; //以0xff作为音符的结束 //改编版两只老虎 unsigned int code fB[] = { dao, re, mi, dao,	dao, re, mi, dao,	mi, fa, sao,	mi, fa, sao,	sao, la, sao,fa, mi, dao,	sao, la, sao,fa, mi, dao,	dao, sao, dao,	dao, sao, dao,	0xff};	//以下是简谱中每个音符的节拍 //"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位 unsigned char code JPA[ ]={	4,1,1,4,1,1,2,	2,2,2,2,8,	4,2,3,1,2,2,	10,	4,2,2,4,4,	2,2,2,2,4,	2,2,2,2,2,2,2,	10,	4,4,4,2,2,	4,2,4,4,	4,2,2,2,2,2,2,	10,	4,2,2,4,4,	2,2,2,2,6,	4,2,2,4,1,1,4,	10,	4,2,2,4,1,1,4,	10	}; unsigned char code JPB[ ] = {	2, 2, 2, 2,	2,	2, 2, 2, 2,	2,	2, 2, 2,	4,	2, 2, 2,	4,	2, 2, 2, 2, 2, 2,	4,	2, 2, 2, 2, 2, 2,	4,	2, 2, 4,	4,	2, 2, 4,	4, }; void delay() //200ms延时 { unsigned char i,j;	for(i=0;i