单片机课程设计(论文)电子音调发生器.doc

上传人:文库蛋蛋多 文档编号:4147793 上传时间:2023-04-07 格式:DOC 页数:13 大小:390.50KB
返回 下载 相关 举报
单片机课程设计(论文)电子音调发生器.doc_第1页
第1页 / 共13页
单片机课程设计(论文)电子音调发生器.doc_第2页
第2页 / 共13页
单片机课程设计(论文)电子音调发生器.doc_第3页
第3页 / 共13页
单片机课程设计(论文)电子音调发生器.doc_第4页
第4页 / 共13页
单片机课程设计(论文)电子音调发生器.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《单片机课程设计(论文)电子音调发生器.doc》由会员分享,可在线阅读,更多相关《单片机课程设计(论文)电子音调发生器.doc(13页珍藏版)》请在三一办公上搜索。

1、电子音调发生器姓 名 XXX 所在学院 电子信息工程学院 专业班级 通信XXXX 学 号 XXXXX 指导教师 XXXXXX 日 期 2011 年 12月 12日 电子音调发生器一、实验目的 :1 了解计算机发声原理。2 熟悉定时器和键盘扫描电路的工作原理及编程方法。二、实验内容和要求:利用所焊电路板上的开关k0-k7和蜂鸣器设计电子音调发生器,要求:1利用所焊电路板上开关k0-k7进行音调选择,即拨动不同的开关产生不同的音调,依次拨动K0K7,蜂鸣器发出1234567i八个音调。2编写2支歌曲,并可进行选择播放。三、实验原理:音节由不同频率的方波产生,音节与频率的关系如表1所示。要产生音频方

2、波,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出方波的I/0反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。在单片机STC89C51RC上,产生方波的I/O脚选用P1.2,通过跳线选择器JP1将单片机的P1.2与蜂鸣器的驱动电路相连。这样P1.2输出不同频率的方波,蜂鸣器便会发出不同的声音。另外,音乐的节拍是由延时实现的,如果1拍为0.4秒,1/4拍是0.1秒。只要设定延时时间,就可求得节拍的时间。延时作为基本延时时间,节拍值只能是它的整数倍, 每个音节相应的定时器初值X可按下法计算:

3、(1/2)*(1/f)=(12/fose)*(216-x)即 x=216-(fose/24f)其中f:音调频率,当晶振fose=11.0592MHz时,音节“1”相应的定时器初值为x,则可得x=63777D=F921H 其它的可同样求得。表1:音符频率(HZ)计数初值(H)低音5196F6D1低音6220F7D1低音7247F8B6中音1262F921中音2294F9E1中音3330FA8C中音4349FAD8中音5392FB68中音6440FBE9高音7494FC5B高音1523FC8F高音2587FCEF高音3659FD45高音4698FD6C高音5784FDB4利用计时器计时此半周期时间

4、,每当计时到后就将输出方波的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚得到此频率的方波。音乐程序查表原理:乐谱格式:每字节的高字节为音符代码,低字节为节拍代码音调高低 1 2 3音高 低 中 高节拍代码 1 2 3 4 5 6 8 节拍 1/1 1 3/2 1 1(1/2) 2 2(1/2) 四、试验设计:总体来说,本实验分为两大部分:由开关控制的音阶播放程序;由单片机控制的自动音阶播放程序(音乐程序)。这个实验使用了8个按键对应8个1234567i音节,在使用两个按键来做不同歌曲的切换播放。实验箱硬件连接如图所示: 74LS2441A1 1Y11A2 1Y21A3 1

5、Y3 1A4 1Y4 2A1 2Y1 2A2 2Y22A3 2Y32A4 2Y41G2GP87C52X2P3.0P3.1P3.2P3.3 P3.4P3.5 P1.2 P3.6P3.7TXDRXD图1 键盘、蜂鸣器连接电路图2 按键复位电路 图3 晶振电路实验总体流程图如下图所示:进入主程序音乐播放读开关查表,判断是哪个键按下发出对应音阶开始P1.6,P1.7是否为0有无键按下Y结束YN图4 实验流程图流程图描述:如图上图所示,程序开始时先判断P1.6,P1.7口的电位,若为0则转到音乐播放程序播放音乐;若为1,则进行键盘扫描、消抖,通过查表判断哪个键按下,通过P1.2输出不同频率的方波,驱动蜂

6、鸣器发音。五、实验程序:#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit speaker=P12; /定义音乐输出端口,需要连接到对应的喇叭,请参考电路图sbit P1_2=P12;sbit P1_6=P16;sbit P1_7=P17;sbit P1_4=P14;sbit P1_0=P10;unsigned char timer0h,timer0l,time,num,high; /音调,高低音,拍长(半拍为1) /菊花台code unsigned char sszymmh1= 3,1,2, 3,1,1, 2,1,1, 3,1,4, 3,1,1, 5,

7、1,1, 3,1,1, 2,1,1, 3,1,4, 1,1,2, 1,1,1, 2,1,1, 3,1,1, 5,1,1, 3,1,2, 2,1,2, 2,1,1, 1,1,1, 2,1,4, 3,1,3, 5,1,1, 3,1,1, 6,1,1, 5,1,3, 6,1,1, 5,1,1, 5,1,1, 3,1,1, 5,1,4, 3,1,2, 2,1,1, 3,1,1, 5,1,2, 3,1,1, 2,1,1, 2,1,1, 1,1,4 ;/ Yesterday once more“昨日重现”code unsigned char sszymmh2= 1,1,1, 2,1,1, 3,1,2, 5

8、,1,2, 5,1,1, 3,1,1, 5,1,1, 3,1,1, 6,1,1, 5,1,2, 3,1,3, 3,1,1, 5,1,1, 6,1,2, 7,1,2, 3,1,1, 5,1,2, 6,1,7, 3,1,1, 5,1,1, 6,1,2, 3,2,2, 2,2,1, 1,2,3, 7,1,2, 5,1,1, 3,1,2, 5,1,2, 2,1,8, 1,2,1, 2,2,1, 3,2,1, 3,2,1, 3,2,1, 3,2,3, 2,2,1, 1,2,1, 7,1,1, 1,2,1, 7,1,1, 6,1,3, 3,1,1, 5,1,7, 1,2,1, 2,2,1, 3,2,1,

9、3,2,1, 3,2,1, 3,2,1, 3,2,2, 2,2,1, 1,2,1, 7,1,1, 1,2,1, 7,1,1, 6,1,3, 3,1,1, 2,1,6, 2,1,1, 3,1,1, 4,1,1, 5,1,6, 3,1,1, 2,1,1, 1,1,2 ; / 音阶频率表 高八位code unsigned char FREQH= 0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, /1,2,3,4,5,6,7,8,i 0xFC,0xFD,0xFD,0xFD,0xFD,0xFE, 0x

10、FE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, ; / 音阶频率表 低八位code unsigned char FREQL= 0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6, 0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, /1,2,3,4,5,6,7,8,i 0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, ;unsigned char idata Memory50;/*/* 延时函数 */*/void delay(unsigned

11、 char t) unsigned char t1; unsigned long t2; for(t1=0;t1t;t1+) for(t2=0;t28000;t2+) TR0=0;P1_2=1; void delay1(unsigned char t) unsigned char t1; unsigned long t2; for(t1=0;t1t;t1+) for(t2=0;t250;t2+) TR0=0;P1_2=1; void delay2(unsigned char t) unsigned char t1; unsigned long t2; for(t1=0;t1t;t1+) for

12、(t2=0;t280;t2+) ; TR0=0;P1_2=1; void delay3(unsigned char t) unsigned char t1; unsigned long t2; for(t1=0;t1t;t1+) for(t2=0;t24000;t2+) TR0=0;P1_2=1; /*/* 键盘函数 */*/unsigned char key()unsigned char KValue,temp;KValue=P3;if(KValue=0xff)return(0);delay2(10);KValue=P3;if(KValue=0xff)return(0);/若尚未返回,说明一

13、定有1位或者多位被按下for(;)temp=P3;if(temp=0xff)break;/等待按键释放return(KValue);unsigned char key1() unsigned char KValue,temp;P2|=0x7f;KValue=P2;if(KValue=0xff)return(0);delay2(10);KValue=P2;if(KValue=0xff)return(0);/若尚未返回,说明一定有1位或者多位被按下for(;)temp=P2;if(temp=0xff)break;/等待按键释放return(KValue);/*/* 定时器中断函数 */*/void

14、 t0int() interrupt 1 TR0=0; speaker=!speaker; TH0=timer0h; TL0=timer0l; TR0=1; /*/* 音乐处理函数 */*/void song() TH0=timer0h; TL0=timer0l; TR0=1; delay(time); void song1() TH0=timer0h; TL0=timer0l; TR0=1; delay1(400); void song2() TH0=timer0h; TL0=timer0l; TR0=1; delay3(time); /*/* 主函数 */*/ void main(void

15、) unsigned char k,i,j,KValue,KValue1; TMOD=1; /置CT0定时工作方式1 EA=1;j=0; ET0=1;/IE=0x82 /CPU开中断,CT0开中断 for(;)while(!P1_7)i=0; while(i195) /音乐数组长度 ,唱完从头再来 k=sszymmh2i+7*sszymmh2i+1-1; timer0h=FREQHk; timer0l=FREQLk; time=sszymmh2i+2; i=i+3; song();while(!P1_6)i=0; while(i111) /音乐数组长度 ,唱完从头再来 k=sszymmh1i+

16、7*sszymmh1i+1-1; timer0h=FREQHk; timer0l=FREQLk; time=sszymmh1i+2; i=i+3; song();KValue=key();switch(KValue)case 0xFE:timer0h=0xF9;timer0l=0x21;num=1;high=0;Memoryj+=num;song1();break;case 0xFD:timer0h=0xF9;timer0l=0xE1;num=2;high=0;Memoryj+=num;song1();break;case 0xFB:timer0h=0xFA;timer0l=0x8C;num=

17、3;high=0;Memoryj+=num;song1();break;case 0xF7:timer0h=0xFA;timer0l=0xD8;num=4;high=0;Memoryj+=num;song1();break;case 0xEF:timer0h=0xFB;timer0l=0x68;num=5;high=0;Memoryj+=num;song1();break;case 0xDF:timer0h=0xFB;timer0l=0xE9;num=6;high=0;Memoryj+=num;song1();break;case 0xBF:timer0h=0xFC;timer0l=0x5B;

18、num=7;high=0;Memoryj+=num;song1();break; case 0x7F:timer0h=0xFC;timer0l=0x8F;num=7;high=0;Memoryj+=num;song1();break; KValue1=key1();switch(KValue1)case 0xFE:timer0h=0xFC;timer0l=0x8F;num=1;high=1;Memoryj+=num+7;song1();break;case 0xFD:timer0h=0xFC;timer0l=0xEE;num=2;high=1;Memoryj+=num+7;song1();br

19、eak;case 0xFB:timer0h=0xFD;timer0l=0x44;num=3;high=1;Memoryj+=num+7;song1();break;case 0xF7:timer0h=0xFD;timer0l=0x6B;num=4;high=1;Memoryj+=num+7;song1();break;case 0xEF:timer0h=0xFD;timer0l=0xB4;num=5;high=1;Memoryj+=num+7;song1();break;case 0xDF:timer0h=0xFD;timer0l=0xF4;num=6;high=1;Memoryj+=num+

20、7;song1();break;case 0xBF:timer0h=0xFE;timer0l=0x2D;num=7;high=1;Memoryj+=num+7;song1();break;六、试验元件清单元件名称型号数量单片机STC89C51RC1个晶振JY11.05921个独石电容30P2个无缘蜂鸣器1个无锁开关8个有锁开关3个三极管BC5561个极性电容10uF1个电阻10K/1K2/1发光二极管1个洞洞板单孔1快排针单排两排排线若干杜邦头80个铜柱4个表一:试验元件清单七、实验总结本次电子音调发声器设计实验使我对单片机有了更深入的认识。由于之前单片机实验的基础,我对本次课设的基本流程已经

21、有了一定了解,所以实验思路还是很容易确定的。但是在实验过程中,也遇到了不少问题。因为对汇编语言还不是太熟悉,之前先用汇编写了一个程序,但是老是出错,或者是在烧写程序的时候老是提示程序太大,导致一直都不成功,所以最后换成了比较熟悉的C语言程序。不过在考完试之后,问了许多同学,他们也有同样的问题。经过自己查阅资料和询问同学才得知,原来是因为自己一开始定义初始地址的时候太大了,导致跳出了单片机芯片的存储范围。这次试验是我第一次使用单片机这种集成的芯片焊接电路,使用起来比较方便,中途也没有出现烧坏电路的情况,这是比较欣慰的,因为以前我焊接的电路老是出现一些小问题。通过这次试验,让我对单片机有了一个更深的认识,若以后还用到单片机的话将会更加容易多了。也让我知道了烧写程序的流程,现在我们班的很多同学都来找我帮他们烧写程序,这让我感到挺自豪的。我挺感谢老师有这次试验给我们去做。确实,我一直认为只有通过自己去设计和实验才能更加容易理解课本上的内容,因为只有自己去做的时候,才会发现自己还有哪些问题不懂,只有通过查相关资料和询问老师和同学,才能让自己更加明白和理解。同时也还能锻炼自己的动手能力。八、参考文献1.戴胜华,蒋大明,杨式武,赵俊慧.单片机原理与应用M.北京:清华大学出版社,北京交通大学出版社,20052.李勋,刘源.单片机实用教程M.北京:北京航空航天大学出版社,1999

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号