c51单片机课程设计——电子琴.doc
课程设计报告姓名:曹 飞 龙班级:101班学号:课程设计名:简易电子琴指导老师:胡启龙一、概述:本系统设计制作一个可演奏的电子琴。综合应用了两项设计:(1)能产生纯音,了解音调高低的控制方法,用键盘代替电子琴的键盘,控制演奏音乐。(2)演奏一支乐曲(天空之城)。 那音阶要怎么使用C51单片机产生呢?C51在这项工作中运用它哪些资源呢?我们怎么实现一个按键对应一个音阶呢?二、系统描述:(1)我们从初中开始就知道,声音是由振动产生的,基本的这7个音阶的频率之间满足某种数学关系由低到高排列的自然音,所以我们可以通过改变单片机输出频率就可以得到不同的音阶;(2)为了得到精确的频率(周期的倒数),我们可以使用C51单片机定时中断模块。(3)通过判断按键是否被按下,然后执行该按键按下时的函数(在程序中是改变T1的初值得到实现)。需要注意的是,在该程序中让8051的内部定时器使其工作在计数器模式MODE1下,改变记数值TH0及TL0以产生不同频率的方法。例如频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时956/1=956在每记数9次时将I/O口反相,就可得到中音D0(523HZ)。记数脉冲值与频率的关系公式如下:N=Fi/2/Fr N:记数值Fi:内部计时一次为1微秒故其频率为1MHZ Fr;要产生的频率起记数值的求法如下:T65536N65536Fi2Fr例如:设K65536,FFi1MHZ,求低音D0(523HZ),高音的D0(1046HZ)的记数值。T65536N65536Fi2Fr655362Fr65536Fr低音D0的T6553626263627中音D0的T6553652364580低音D0的T65536104765059详细的音阶频率与计数初值可参考附录一;三、电路设计1单片机最小系统模块2.三极管信号放大模块扬声器发出对应音符模块如下:3.按键电路模块:四程序设计:本系统的程序流程图如下:开始模块初始化音乐控制按键是否按下?播放音乐音符按键是否按下?播放音符按键所对应的音符终止程序如下:#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit kongzhi=P11;sbit fm=P10; /蜂鸣器输出的IO口uchar timeh,timel,i=8,t; /timeh,timel为定时器高低4位,i为演奏音符个数uchar code yinyue=0x63,0x71,0x83,0x71,0x82,0xA2,0x76,0x32,0x32,0x63,0x51,0x62,0x82,0x54,0x32,0x32,0x42,0x32,0x42,0x11,0x32,0x81,0x81,0x81,0x73,0x41,0x41,0x71,0x74,0x63,0x71,0x83,0x71,0x82,0xA2,0x74,0x31,0x31,0x63,0x51,0x62,0x82,0x54,0x31,0x42,0x83,0x71,0x71,0x83,0x91,0x91,0xA1,0x82,0x83,0x71,0x61,0x61,0x72,0x51,0x66,0xff;/-简谱-/1-7代表中音dosi,8代表高音douchar code yinfu=0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81,0xff;/-简谱音调对应的定时器初值-uchar code cuzhi= 0xff,0xff, /占位符0xFC,0x44,0xFC,0xAD,0xFD,0x0A,0xFD,0x34,0xFD,0x83,0xFD,0xC8,0xFE,0x06, /中音dosi的T计数初值0xFE,0x22,0xFE,0x57,0xFE,0x85,0xFE,0x9B,0xFE,0xC2,0xFE,0xE4,0xFF,0x03; /高音do的T计数初值void delay1ms(unsigned int ms); /延时ms毫秒子程序void delay165ms(uint z); /延时165ms,即1/4拍子程序void keysong(); /演奏子程序int key();void song();main()kongzhi=1;EA=1; /开总中断ET0=1; /开定时器0TMOD=0x01; /定时器0工作在方式1TH0=0;TL0=0;TR0=1;P3=0xff;while(1) if(kongzhi=0)song();elsekey(); keysong(); void song()uint temp;uchar jp; /jp是简谱18的变量t=0;while(1)temp=yinyuet; if(temp=0xff) break; /到曲终则跳出循环 jp=temp/16; /取数的高4位作为音调if(jp!=0)timeh=cuzhijp*2; /取T的高4位值timel=cuzhijp*2+1; /取T的低4位值elseTR0=0;fm=1; /关蜂鸣器delay165ms(temp%16); /取数的低4位作为节拍TR0=0; /唱完一个音停10msfm=1;delay1ms(10); TR0=1; t+;TR0=0;fm=1;void timer0() interrupt 1 /定时器0溢出中断子程序用于产生各种音调TH0=timeh;TL0=timel;fm=fm; /产生方波void keysong()uint temp;uchar jp; /jp是简谱18的变量i=key();delay1ms(50);if(i!=8)TR0=1;temp=yinfui; jp=temp/16; /取数的高4位作为音调if(jp!=0)timeh=cuzhijp*2; /取T的高4位值timel=cuzhijp*2+1; /取T的低4位值elseTR0=0;fm=1; /关蜂鸣器delay165ms(temp%16); /取数的低4位作为节拍TR0=0; /唱完一个音停10msfm=1;delay1ms(10); /TR0=1;/i+;TR0=0;fm=1;int key()switch(P2)case 0xfe: return 0;case 0xfd: return 1;case 0xfb: return 2;case 0xf7: return 3;case 0xef: return 4;case 0xdf: return 5;case 0xbf: return 6;case 0x7f: return 7;default: return 8;/函数名:delay165ms/函数功能:采用软件实现延时约z*165ms/形式参数:无 /返回值:无void delay165ms(uint z) /延时165ms,即1/4拍uint x;for(x=0;x<z;x+) delay1ms(165);/函数名:delay1ms/函数功能:采用软件实现延时约ms*1ms/形式参数:无 /返回值:无void delay1ms(unsigned int ms) unsigned int i,j; for(j=0;j<ms;j+) for(i=0;i<0x100;i+); 五制作与调试: 最后制作出的成品:六测试结果。该成品外观虽然不够美观,但是播放音乐功能,一个按键对应一个音阶的功能十分到位。总的来说,对于该成品老师和同学达成了同一共识:虽然丑了点,但很“温柔”(声音较小)。七结论。本次综合设计主要涉及硬件和软件两方面的内容,通过这次课程,我的硬件和软件开发能力都获得了提高。首先硬件方面,更加熟悉了51单片机的结构以及它的实用,基本了解了电子产品的开发流程和所要做的工作。 通过课程设计,我学到了很多,这些不仅仅局限于巩固复习了课本上知识点,还锻炼了自己分析问题以及动手实际操作的能力,将以前学过的零散的知识串到一起,学以致用。本系统基本上实现了按下键盘,扬声器播放对应的音符,同时单个程序也能播放歌曲,不足之处在于不能将按键和播放音乐的程序不能完美融合,只能在一定范围内满足按键或播放歌曲一种需要,且播放的声音太小,放大电路的选择方面的工作做得不是很好。附录一:音阶频率与计数初值对照表:音符频率计数处之音符频率计数初值音符频率计数初值低音12200xefa9中音14400xf7d8高音18800xfbef低音22470xf173中音24940xf8bd高音29880xfc62低音32770xf307中音35540xf987高音311090xfcc7低音42940xf3c8中音45870xf9e4高音411750xfcf6低音53300xf51e中音56590xfa90高音513180xfd4b低音63700xf64c中音67400xfb29高音614800xfd98低音74150xf75a中音78310xfbb1高音716610xfddc