单片机课程设计电子琴.docx
- 文档编号:11239741
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:12
- 大小:19.19KB
单片机课程设计电子琴.docx
《单片机课程设计电子琴.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子琴.docx(12页珍藏版)》请在冰豆网上搜索。
单片机课程设计电子琴
南京工程学院
课程设计任务书
课程名称单片机原理及应用A
设计课题电子琴设计
院(系、部、中心)自动化学院
专业自动化(数控技术)
班级数控094
姓名周阳
学号203090809
起止日期2012.1.2~2012.1.6
指导教师葛红宇
目录
一、设计目的及任务
1、设计目的
2、设计任务题目及要求
二、总体方案设计
1、设计任务分析
2、设计方案
三、设计原理
1、程序流程图
2、硬件原理图
四、模块设计
1、键盘扫描模块
2、定时器模块
五、调试过程
1、问题发现与解决
六、设计总结
七、参考文献
八.程序清单
一、设计目的及任务
1.课程设计应达到的目的
(1)运用<<单片机原理及应用A>>课程等知识,根据题目要求进行软硬件系统的设计和调试,从而加深对本课程知识点的理解,使学生综合应用知识能力、设计能力、调试能力及报告撰写能力等显著提高。
(2)了解计算机发声原理,进一步熟悉定时器编程方法及键盘扫描电路工作原理及编程方法。
2.课程设计题目及要求
(1)、题目
电子琴设计
(2)、设计要求:
利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7、8、9作为电子琴按键,其中1~7号键按下后即发出相应的音调。
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
#defineuintunsignedint
#defineucharunsignedchar
#defineCOM8255XBYTE[0X8003]//8255的控制字地址
#definePAXBYTE[0X8000]//8255端口A的地址
ucharflag;//在键盘扫描时使用
ucharkey;//用于存放按键的对应标号
ucharnum;//用于对50次脉冲的电平跳变进行计数,跳变100次后就达到50次脉冲
uintcodetable[]={64100,64224,64333,64484,64577,64660,64734};
//以上数组中的数分别是发出1234567七个音调的定时器的初值
//子程序的说明
voidkeyscan();//键盘扫描
voiddelay();//简单的延时程序,用于键盘扫描时的消抖
voidshun();//顺序播放1234567
voidni();//逆序播放7654321
//简单的延时子程序,用于键盘扫描时消抖
voiddelay()
{
uchara;
a=250;
while(a--);
}
//键盘扫描
/*键盘扫描的原理是:
用P1口的高四位分别连接4*4键盘的行,P1口的低四位分别连接列,在进行键盘扫描时先判断是否有键按下,若消抖后仍有键按下,则找出是哪个键被按下*/
voidkeyscan()
{
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)
{
case0x07:
key=9;break;/*第三行中除了9号键外,其余键按下不采取操作*/
case0x0b:
key=0;break;
case0x0d:
key=0;break;
case0x0e:
key=0;break;
}
}
if(flag==0xd0)//检查第二行
{
P1=0xdf;/*给第二行赋零值,检查该行哪个键被按下,哪一列电平被拉低,则该列的键被按下*/
flag=P1;
flag=flag&0x0f;
switch(flag)
{
case0x0e:
key=8;break;//根据对应的键,对key赋值
case0x0d:
key=7;break;
case0x0b:
key=6;break;
case0x07:
key=5;break;
}
}
if(flag==0xe0)//检查第一行
{
P1=0xef;/*给第一行赋零值,检查该行哪个键被按下,哪一列电平被拉低,则该列的键被按下*/
flag=P1;
flag=flag&0x0f;
switch(flag)
{
case0x0e:
key=4;break;//根据对应的键,对key赋值
case0x0d:
key=3;break;
case0x0b:
key=2;break;
case0x07:
key=1;break;
}
}
}
//顺序播放1234567七个音调
voidshun()//顺序播放
{
uchari;//用于取数组中的对应的数
for(i=0;i<7;i++)
{
TH0=table[i]/256;//定时器赋初值
TL0=table[i]%256;
TR0=1;//开始计时
while(num<100);//等待发出50个脉冲
}
TR0=0;//若已到50次脉冲,则关定时器
PA=0x01;//喇叭停止发声
num=0;//num清零,准备下次计数
}
//逆序播放7654321七个音调
voidni()//逆序播放
{
uchari;//用于取数组中的对应的数
for(i=0;i<7;i++)
{
i=6-i;//逆序取数组中的数
TH0=table[i]/256;//定时器赋初值
TL0=table[i]%256;
TR0=1;//开始计时
while(num<100);//等待发出50个脉冲
}
TR0=0;//若已到50次脉冲,则关定时器
PA=0x01;//喇叭停止发声
num=0;//num清零,准备下次计数
}
//利用定时器的中断来产生脉冲
voidtime()interrupt1//定时中断
{
TH0=table[key]/256;//每次定时产生中断,重新赋初值,可以产生连续的脉冲
TL0=table[key]%256;
PA=~PA;//对喇叭端口电平取反,形成脉冲
num++;//对正负电平数计数,其值时脉冲数的两倍
}
//主程序
//主程序中根据键盘扫描得到是哪个键按下,来给定时器赋相应的初值,产生不同频率的脉冲
voidmain()
{
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(key<8)
{
key--;//key值减1后就可在数组中取到对应的取值
TH0=table[key]/256;//定时器赋初值
TL0=table[key]%256;
TR0=1;//开定时器
while(num<100);//等待产生50个脉冲
TR0=0;//50次脉冲后关定时器
PA=0x01;//停止喇叭发声
num=0;//num清零,为下次计数做好准备
}
if(key==8)
{
shun();//8键按下,进行顺序播放
}
if(key==9)
{
ni();//9键按下,进行逆序播放
}
key=0;//key重新赋零,用于下一次键盘扫描
}}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 电子琴