片机课程设计---电子琴设计.docx_第1页
片机课程设计---电子琴设计.docx_第2页
片机课程设计---电子琴设计.docx_第3页
片机课程设计---电子琴设计.docx_第4页
片机课程设计---电子琴设计.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京工程学院课程设计任务书 课 程 名 称 单片机原理及应用A 设 计 课 题 电子琴设计 院(系、部、中心) 自动化学院 专 业 自动化(数控技术) 班 级 数控094 姓 名 周 阳 学 号 203090809 起 止 日 期 2012.1.22012.1.6 指 导 教 师 葛红宇 目 录一、 设计目的及任务1、 设计目的2、 设计任务题目及要求二、 总体方案设计1、 设计任务分析2、 设计方案三、 设计原理1、 程序流程图2、 硬件原理图四、 模块设计1、 键盘扫描模块2、 定时器模块五、 调试过程1、 问题发现与解决六、 设计总结七、参考文献八程序清单一、设计目的及任务1课程设计应达到的目的(1)运用课程等知识,根据题目要求进行软硬件系统的设计和调试,从而加深对本课程知识点的理解,使学生综合应用知识能力、设计能力、调试能力及报告撰写能力等显著提高。(2)了解计算机发声原理, 进一步熟悉定时器编程方法及键盘扫描电路工作原理及编程方法。2课程设计题目及要求(1)、题目电子琴设计(2)、设计要求:利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7、8、9作为电子琴按键,其中17号键按下后即发出相应的音调。8号键按下后依次发出“1、2、3、4、5、6、7” 音调,9号键按下后依次发出“7、6、5、4、3、2、1” 音调,用8255的PA.0 口发出音频脉冲,驱动喇叭。利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调.定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平.由于定时参数不同,就发出了不同频率的脉冲. 本实验中按键一次,会发50个脉冲.发完后继续检测键盘,如果键还按下,继续发音。二、总体方案设计 1、设计任务分析本任务的要求是根据不同的数字键被按下后,发出相对应的音调,或者顺序、逆序连续的发出七中音调,不同音调的产生对喇叭发出不同频率的脉冲,而脉冲则是根据定时器中断产生正负脉冲的跳变,这样就形成了脉冲。与此同时,定时时间的长短,及频率的高低,是由定时间的初值决定的。通过以上的析,可以明确,本课题需要涉及到的就是键盘扫描,和定时器。围绕这两个模块,就可以制定出总体的设计方案。2、设计方案通过以上的分析,可以制定出以下的设计方案:(1)、 因为要用到9个按键,可以用4*4的矩阵键盘,对其中的9个按键进行标号,再根据键盘扫描的原理,就可以找出是哪个键被按下。(2)、不同频率的脉冲均通过定时器来产生,定时器的初值不同,计满溢出的频率也是不同的,从而正负电平的跳变的频率也不同,就产生了不停频率的脉冲,所以只需对定时器设置不同德计数初值,便可实现不同频率脉冲的产生。(3)、喇叭发声原理则是:对喇叭驱动电路交替的施加施加低电平,喇叭发声;否则就不发声。把这一原理和定时器中断产生的电平跳变相结合,就可以听到不同频率的音调。三、设计原理 1、程序流程图 根据上述的设计方案,可以用流程图画出本次课程设计的整体思路,在以下的流程图中,包括主程序和各个相关的子程序。 在程序中,首先是进行扫描,找出是哪个键被按下,然后根据相应的键号,采取不同的操作,以此构成循环 本程序中涉及到的子程序模块包括:键盘扫描子程序;定时器中断子程序;顺序连续发出1234567七个音调;连续发出7654321七个音调。 以下分别主程序各个相关的子程序:2、硬件原理图以下是电子琴电路的实际硬件原理图,主要是一个单片机,和一个8255以及一个喇叭组成。是通过8255的PA.0口发出脉冲,来产生不同频率的音调。单片机则是用到一个定时器,来产生定时中断。值得注意的是,由于电路图中是直接用P1口来进行键盘扫描的,则在实验箱上进行实物连接时,一定要把跳线器短接,否则将使键盘扫描不能正常工作。在连线时,不能使用已损坏的导线,并且把多余的导线放到一边,一面影响正常的工作。四模块设计1键盘扫描模块 通过键盘扫描的流程图可以清晰的知道其工作原理,可将其归纳为:先将P1的高四位置1,低四位置0,在读P1口的值,若读到的值得高四位不是全1,则代表有键按下或者是键盘抖动。为消除键盘抖动的影响,先采用延时,延时后重复上述操作,若读到的值得高四位不是全1,则代表确实有键按下。在有键按下的情况下,则可以找出是哪个键被按下,方法是:在值为0的那一行,继续赋零,其余行和所有列均给1,在此情况下,读出列的值,在列中,哪一列为0,则代表该列的键被按下。用上述的方法就可以找出被按下的键,然后将对应的键号取出,就可以在主程序中使用。2、定时器模块 定时器模块则是简单的运用定时器的中断,对于定时器而言,其初值不同,计数的溢出率就不同,又因为,每次定时器产生的中断将电平信号取反,就可以产生不同频率的脉冲,有了脉冲就可以驱动喇叭产生不同频率的音调。 以上就是该任务的两个模块,这都是简单的运用单片机键盘扫描知识和定时器的运用,其原理都是很基本的。五、调试过程 1、问题发现与解决 在进行调试是,还是发现了一些问题。但最终都得到解决。问题之一就是,在等待50脉冲时,由于while语句位置的使用不当,导致程序不能正常运行。其次,就是1234567七个音调的不准确,需要正确计算出定时器初值,而后在进行调试,就可以听到效果较好的其中音调。六、 设计总结在此次课程设计中,我通过实践操作,更好的正握了书本知识,尤其是键盘扫描模块,其次就是定时的使用,当然,对喇叭的发生原理也能掌握。另外,我还学到了如何正确,有效的调试程序。这说明,只有掌握正确的方法,才能提高效率。最重要的是,我的动手实践能力,得到了较大的提高。所以,此次的课程使劲儿还是受益颇多的。 七、 参考文献单片机原理及应用实验指导书,屈波等编,2007年单片机原理及应用,赵德安等编,机械工业出版社,2011单片机基础,李广弟等,北京航空航天大学出版社,2004年八、 程序清单以下是电子琴设计的程序:#include /头文件的说明#include /用于8255的使用#define uint unsigned int#define uchar unsigned char#define COM8255 XBYTE 0X8003 /8255的控制字地址#define PA XBYTE 0X8000 /8255端口A的地址uchar flag; /在键盘扫描时使用uchar key; /用于存放按键的对应标号uchar num; /用于对50次脉冲的电平跳变进行计数,跳变100次后就达到50次脉冲uint code table= 64100,64224,64333,64484,64577,64660,64734; /以上数组中的数分别是发出1234567七个音调的定时器的初值/子程序的说明void keyscan(); /键盘扫描void delay(); /简单的延时程序,用于键盘扫描时的消抖void shun(); /顺序播放1234567void ni(); /逆序播放7654321/简单的延时子程序,用于键盘扫描时消抖void delay() uchar a; a=250; while(a-);/键盘扫描/*键盘扫描的原理是:用P1口的高四位分别连接4*4键盘的行,P1口的低四位分别连接列,在进行键盘扫描时先判断是否有键按下,若消抖后仍有键按下,则找出是哪个键被按下*/void keyscan() flag=0; /变量赋初值 do P1=0xf0; /检查是否有键按下 flag=P1; flag=flag&0xf0; if(flag!=0xf0) /等待有键按下,若有键按下则向下执行 delay(); /延时消抖 P1=0xf0; /重新检测是否有键按下 flag=P1; flag=flag&0xf0; while(flag=0xf0); /确认有键按下后,找出是1至9个键中哪个键按下 if(flag=0xb0) /检查第三行 P1=0xbf; /*给第三行赋零值,检查该行哪个键被按下,哪一列电平被拉低,则该列的键被按下*/ flag=P1; flag=flag&0x0f; switch(flag) case 0x07:key=9;break; /*第三行中除了9号键外,其余键按下不采取操作*/ case 0x0b:key=0;break; case 0x0d:key=0;break; case 0x0e:key=0;break; if(flag=0xd0) /检查第二行 P1=0xdf; /*给第二行赋零值,检查该行哪个键被按下,哪一列电平被拉低,则该列的键被按下*/ flag=P1; flag=flag&0x0f; switch(flag) case 0x0e:key=8;break; /根据对应的键,对key赋值 case 0x0d:key=7;break; case 0x0b:key=6;break; case 0x07:key=5;break; if(flag=0xe0) /检查第一行 P1=0xef; /*给第一行赋零值,检查该行哪个键被按下,哪一列电平被拉低,则该列的键被按下*/ flag=P1; flag=flag&0x0f; switch(flag) case 0x0e:key=4;break; /根据对应的键,对key赋值 case 0x0d:key=3;break; case 0x0b:key=2;break; case 0x07:key=1;break; /顺序播放1234567七个音调void shun() /顺序播放 uchar i; /用于取数组中的对应的数 for(i=0;i7;i+) TH0=tablei/256; /定时器赋初值 TL0=tablei%256; TR0=1; / 开始计时 while(num100); /等待发出50个脉冲 TR0=0; /若已到50次脉冲,则关定时器 PA=0x01; /喇叭停止发声num=0; /num清零,准备下次计数 /逆序播放7654321七个音调void ni() /逆序播放 uchar i; /用于取数组中的对应的数 for(i=0;i7;i+) i=6-i; /逆序取数组中的数 TH0=tablei/256; /定时器赋初值 TL0=tablei%256; TR0=1; / 开始计时 while(num100); /等待发出50个脉冲 TR0=0; /若已到50次脉冲,则关定时器 PA=0x01; /喇叭停止发声num=0; /num清零,准备下次计数 /利用定时器的中断来产生脉冲void time() interrupt 1 /定时中断 TH0=tablekey/256; /每次定时产生中断,重新赋初值,可以产生连续的脉冲 TL0=tablekey%256; PA=PA;/对喇叭端口电平取反,形成脉冲 num+; /对正负电平数计数,其值时脉冲数的两倍 /主程序/主程序中根据键盘扫描得到是哪个键按下,来给定时器赋相应的初值,产生不同频率的脉冲void main() key=0; /key值清零,用于键盘扫描 num=0; /清零,用于脉冲计数 PA=1; /初始化,使喇叭不发声 TMOD=0x01; /用T0工作于方式1,用于定时 EA=1; /开总中断 ET0=1; /开T0中断 COM8255 = 0X80; /8255初始化,仅使用PA口,用于输出方式 while(1) do keyscan(); /*进行键盘扫描,若有键按下,则KEY的值会改变,跳出循环*/ while(key=0); /等待键按下 if(key8) key

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论