资源描述:
《c51单片机课程设计——电子琴》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、课程设计报告姓名:曹飞龙班级:101班学号:10101230课程设计名:简易电子琴指导老师:胡启龙1一、概述:本系统设计制作一个可演奏的电子琴。综合应用了两项设计:(1)能产生纯音,了解音调高低的控制方法,用键盘代替电子琴的键盘,控制演奏音乐。(2)演奏一支乐曲(天空之城)。那音阶要怎么使用C51单片机产生呢?C51在这项工作中运用它哪些资源呢?我们怎么实现一个按键对应一个音阶呢?二、系统描述:(1)我们从初中开始就知道,声音是由振动产生的,基本的这7个音阶的频率之间满足某种数学关系由低到高排列的自然音,所以我们可以通过改变单片机输出频率就
2、可以得到不同的音阶;(2)为了得到精确的频率(周期的倒数),我们可以使用C51单片机定时中断模块。(3)通过判断按键是否被按下,然后执行该按键按下时的函数(在程序中是改变T1的初值得到实现)。需要注意的是,在该程序中让8051的内部定时器使其工作在计数器模式MODE1下,改变记数值TH0及TL0以产生不同频率的方法。例如频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时956/1=956在每记数9次时将I/O口反相,就可得到中音D0(523HZ)。记数脉冲值与频率的关系公式如下:N=Fi/2/FrN:记数值 F
3、i:内部计时一次为1微秒.故其频率为1MHZ Fr;要产生的频率1起记数值的求法如下:T=65536-N=65536-Fi/2/Fr例如:设K=65536,F=1000000=Fi=1MHZ,求低音D0(523HZ),高音的D0(1046HZ)的记数值。T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr低音D0的T=65536-500000/262=63627中音D0的T=65536-500000/523=64580低音D0的T=65536-500000/1047=6505
4、9详细的音阶频率与计数初值可参考附录一;三、电路设计1.单片机最小系统模块2.三极管信号放大模块扬声器发出对应音符模块如下:13.按键电路模块:1四.程序设计:本系统的程序流程图如下:开始模块初始化音乐控制按键是否按下?播放音乐音符按键是否按下?播放音符按键所对应的音符终止1程序如下:#include#defineucharunsignedchar#defineuintunsignedintsbitkongzhi=P1^1;sbitfm=P1^0;//蜂鸣器输出的IO口uchartimeh,timel,i=8,t;//ti
5、meh,timel为定时器高低4位,i为演奏音符个数ucharcodeyinyue[]={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,0x8
6、3,0x71,0x71,0x83,0x91,0x91,0xA1,0x82,0x83,0x71,0x61,0x61,0x72,0x51,0x66,0xff};//---------------------------简谱---------------------------------------//1-7代表中音do~si,8代表高音doucharcodeyinfu[]={0x11,0x21,0x31,0x41,0x51,0x61,0x71,0x81,0xff};//----------------------------简谱音调对应的定时
7、器初值---------------------------ucharcodecuzhi[]={0xff,0xff,//占位符0xFC,0x44,0xFC,0xAD,0xFD,0x0A,0xFD,0x34,0xFD,0x83,0xFD,0xC8,0xFE,0x06,//中音do~si的T计数初值0xFE,0x22,0xFE,0x57,0xFE,0x85,0xFE,0x9B,0xFE,0xC2,0xFE,0xE4,0xFF,0x03};//高音do的T计数初值voiddelay1ms(unsignedintms);//延时ms毫秒子程序voi
8、ddelay165ms(uintz);//延时165ms,即1/4拍子程序voidkeysong();//演奏子程序intkey();voidsong();main(){kong