课程设计任务书课程名称单片机原理及应用课程设计院(系、部、中心)通信工程学院专业通信工程1.课程设计应达到的目的本课程是继《单片机原理及应用B》课程之后,训练学生综合运用上述课程知识,进行单片机软件、硬件系统设计与调试,使学生加深对单片机结构、工作原理的理解,提高学生综合应用知识的能力、分析解决问题的能力和单片机最小应用系统的设计技能。通过课程设计,达到理论与实际应用相结合,增强学生对综合电子系统设计的理解,掌握单片机原理就应用的设计方法以及C51编程的能力,并能够在这个基础上进行实际项目的程序设计及软硬件调试,增强学生的工程实践能力。2.课程设计题目及要求带存储播放功能的简易电子琴设计要求:利用行列式键盘和数码管,来控制并显示和产生不同频率的声音。其他扩展功能学生可自己添加,功能不限定与此。3.课程设计任务及工作量的要求〔包括课程设计计算说明书、图纸、实物样品等要求〕(1)了解相关理论知识,掌握基本的原理,理解相关特殊功能寄存器的设置。(2)完成电路板的组装(3)完成硬件电路的测试、以及软件的编程(4)最终完成具体的课设任务。4.主要参考文献1.张洪润等.单片机应用设计200例.北京:北京航空航天大学出版社,20062.胡汉才.单片机原理及其接口技术.北京:清华大学出版社,20103.夏继强等.单片机实验与实践教程.北京:北京航空航天大学出版社,20064.倪晓军等.单片机原理与接口技术教程.北京:清华大学出版社,20075(1)硬件方面:单片机。4*4行列式键盘,蜂鸣器,独立数码管,独立建。硬件部分采用逐列扫描,16个键位对应16个音,不断检测16键位,当某个键位被按下,先检测哪一列再检测哪个按键被按下,同时设置四个功能键,p1.0,p1.1播放歌曲,p1.2暂停,p1.3复位,可控制歌曲的播放。插入图片(2)音乐频率一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。单片机12MHZ晶振,高中低音符与单片机计数T0相关的计数值如下表所示:音符频率简码值(T值)低3M33064021低4FA34964103低5SO39264260低6LA44064400低7SI49464524中1DO52364580中2RE58764684中3M65964777中4FA69864820中5SO78464898中6LA88064968中7SI98865030高1DO106465058高2RE117565110高3M131865157高4FA1397651786程序设计的流程图如下图,不断检测16个音阶键或功能键哪个被按下,当音阶键被按下时,发出对应的音;当功能键被按下时,执行相应的功能。然后再检测按键释放成不成功,也就是平时所说的松手检测,不成功就不断再检测,成功就停止工作。插入图片7心得体会:通过这次课程设计,我学到了很多书本上学不到的知识与经验,同时也遇到了很多问题,并在这个过程中逐步尝试去解决他们,提高自己的实践能力,硬件设计上我发现通过不同的I/O口可以节省端口资源的利用,部分端口上的需求可以通过软件解决。从语法错误到程序功能的实现,前前后后也是改了又改,这次课程设计使我意识到很多存在的问题,必须在单片机方面读更多的书,更深入的去探究,去挖掘这些问题的答案。8源程序#includereg51.h#defineucharunsignedchar#defineuintunsignedintsbitbuz=P2^3;//定义蜂鸣器uchartemp,key;sbits1=P1^0;//定义功能键1sbits2=P1^1;//定义功能键2sbits3=P1^2;//定义功能键3sbits4=P1^3;uintcodetable[]={64021,64103,64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178};//频率uintcodexable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};voiddelay(uintz)//延时程序{uintx,y;for(x=z;x0;x--)for(y=110;y0;y--);}voidinitialize(){P1=0xff;//起初数码管不显示任何数}voidmain(){TMOD=0x01;EA=1;//开总中断ET0=1;//开定时器0中断while(1){P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0)//检测第一行按键{delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xee:key=0,P0=xable[0];break;case0xde:key=1,P0=xable[1];break;case0xbe:key=2,P0=xable[2];break;case0x7e:key=3,P0=xable[3];break;}TH0=table[key]/256;TL0=table[key]%256;TR0=1;while(temp!=0xf0)//松手检测{temp=P3;temp=temp&0xf0;}TR0=0;buz=1;}}P3=0xfd;//检测第二行按键temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xed:key=4,P0=xable[4];break;case0xdd:key=5,P0=xable[5];break;case0xbd:key=6,P0=xable[6];break;case0x7d:key=7,P0=xable[7];break;}TH0=table[key]/256;TL0=table[key]%256;TR0=1;while(temp!=0xf0){temp=P3;temp=temp&0xf0;}TR0=0;buz=1;}}P3=0xfb;//检测第三行按键temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xeb:key=8,P0=xable[8];break;case0xdb:key=9,P0=xable[9];break;case0xbb:key=10,P0=xable[10];break;case0x7b:key=11,P0=xable[11];break;}TH0=table[key]/256;TL0=table[key]%256;TR0=1;while(temp!=0xf0){temp=P3;temp=temp&0xf0;}TR0=0;buz=1;}}P3=0xf7;//检测第四行按键temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){case0xe7:key=12,P0=xable[12];break;case0xd7:key=13,P0=xable[13];break;case0xb7:key=14,P0=xable[14];break;case0x77:key=15,P0=xable[15];break;}TH0=table[key]/256;TL0=table[key]%256;TR0=1;while(temp!=0xf0){temp=P3;temp=temp&0xf0;}TR0=0;buz=1;}}if(s1==0)//功能键1{delay(10);if(s1==0){TR0=1;while(1){if(s3==0)//功能键3{delay(1);if(s3==0){TR0=~TR0;//设置启动\暂停while(!s3);}}key=4;//祝你生日快乐TH0=table[key]/256;TL0=table[key]%256;delay(150);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(150);key=5;TH0=table[key]/256;TL0=table[key]%256;delay(300);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(300);key=7;TH0=table[key]/256;TL0=table[key]%256;delay(300);key=6;TH0=table[key]/256;TL0=table[key]%256;delay(600);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(150);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(150);key=5;TH0=table[key]/256;TL0=table[key]%256;delay(300);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(300);key=8;TH0=table[key]/256;TL0=table[key]%256;delay(300);key=6;TH0=table[key]/256;TL0=table[key]%256;delay(300);buz=1;while(!s1);//松手检测}}}if(s2==0)//功能键2{delay(10);if(s2==0){TR0=1;while(1){if(s3==0)//功能键3{delay(10);if(s3==0){TR0=~TR0;}}key=4;//找朋友TH0=table[key]/256;TL0=table[key]%256;delay(400);key=5;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=5;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(800);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=7;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=6;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=5;TH0=table[key]/256;TL0=table[key]%256;delay(400);key=4;TH0=table[key]/256;TL0=table[key]%256;delay(800);key=2;TH0=table[key]/256;TL0=table[key]%256;delay(800);buz=1;while(!s2);//松手