课程设计按键控制电子琴.docx
《课程设计按键控制电子琴.docx》由会员分享,可在线阅读,更多相关《课程设计按键控制电子琴.docx(28页珍藏版)》请在冰豆网上搜索。
课程设计按键控制电子琴
课程设计--按键控制电子琴
课程设计说明书
课程名称:
《单片机技术》
设计题目:
按键控制电子琴
院(部):
电子信息与电气工程学院
学生姓名:
赫富强
学号:
201002010087
专业班级:
10级自动化
(2)班
指导教师:
丁莹亮
年月日
课程设计任务书
设计题目
按键控制电子琴
学生姓名
赫富强
所在院部
电子信息与电气工程学院
专业、年级、班
10级自动化2班
设计要求:
1、具有电源开关及指示灯,有复位按键;
2、按下按键有按键指示灯亮;
3、按下按键有对应的音符发出声音,并且有八个led灯能根据不同的音符有不同的闪亮;
4、单片机能够存储50个按键音符,且有播放和清除这些存储的按键音符的按键;
4、单片机中存储一首音乐,有按键可以播放它。
学生应完成的工作:
1、查找资料并绘制电路草图,寻找可行性方案(顾堃主要负责);
2、在专业软件上绘制精细电路图(赫富强主要负责);
3、依据设计要求画出流程图并编写出程序(赫富强主要负责);
4、在软件上进行可行性调试,并找出不足(李可主要负责);
5、将最合适的方案教给老师审核并领取元器件(李可主要负责);
6、在印刷版上焊接电路(朱金鹏主要负责);
7、将程序拷进单片机中并接入电源调试(朱金鹏主要负责);
8、写出课程设计说明书(顾堃主要负责)。
参考文献阅读:
[1]杜尚丰.CAN总线测控技术及其应用.北京:
电子工业出版社,2007.1
[2]王毅.单片机器件应用手册.北京:
人民邮电出版社,1994.4
[3]张毅刚.单片机原理及应用.北京:
高等教育出版社,2003.12
[4]阎石.数字电子技术基础(第五版).北京:
高等教育出版社,2005
[5]文涛.PROTEUS仿真软件应用.武汉:
华中科技大学出版社,2010.2
工作计划:
5月06日--5月07日:
硬件电路设计。
5月08日--5月10日:
软件流程图绘制及程序的编写。
5月13日--5月14日:
焊接制板。
5月15日--5月15日:
烧制程序。
5月16日:
电路调试。
任务下达日期:
2013年5月6日
任务完成日期:
2013年5月17日
指导教师(签名):
学生(签名):
按键控制电子琴
摘要:
本设计以AT89C52单片机为主芯片,在外围扩展和涉及有关的芯片及电路,用了AT89C52,晶振,发光二极管,7805,桥堆2W10,电容,电阻,按键等元件设计了一个具有电源开关及指示灯,复位键,并且由按键控制,能够发出对应音符的声音,能够由不同的音符发出不同对应的led灯不同组合的闪亮,而且还可以存储、播放、清除最多50个按键对应的音符,还自带了一首音乐可以有按键控制播放。
程序的设计可主要分为按键判别、发声及显示、存储及清除三部分。
关键词:
电子琴存储复位播放音乐
.
.
.
1.设计背景
1.1时代背景
单片机作为最典型的嵌入式系统,它的成功应用推动了嵌入式系统的发展。
近年来,除了各种类型的工控机,各种以通用微处理器构成的计算机方板模块、以通用微处理器为核,片内扩展一些外围功能电路单元构成的嵌入式微处理器,甚至单片形态的PC机等,都实现了嵌入式应用,成为嵌入式系统的庞大家族。
在当今社会,随着单片机档次的不断提高,功能的不断完善,其应用日趋成熟、应用领域日趋扩大,特别是工业测控、尖端武器和日用家电等领域更是因为有了单片机而生辉增色。
1.2社会背景
电子琴在人们日常生活中相当普遍,在各种音乐会中,在我们所听歌曲中它无处不在,随着生活质量的提高,人们对美的追求日益提高,这样以来电子琴的需求大大提高。
2.设计方案
2.1硬件设计方案
方案一:
由中断方式响应按下的键,本方案的优点是:
响应速度快,延时时间短;缺点是:
按键的抖动容易引起误操作,要想解决这个问题需要防抖电路,电路复杂,不容易焊接。
方案二:
由查询方式响应按下的键,本方案的优点是:
思路简单,可以利用软件消抖,可靠行好;缺点是:
按键的响应速度慢。
综上所述及本次课程设计的要求主要是锻炼我们利用单片机知识进行简单设计的能力,故选择方案二。
2.2软件设计方案
电子琴设计的系统这些要求编写出程序主流程图如图2.1:
图2.1主程序流程图
电子琴设计的编写主程序中调用程序的流程图如图2.2:
程序入口
确定按键值
按键值小于19?
按键值是19?
按键值是20?
按键值是21?
?
音符播放
led灯闪烁
存储音符按键
播放自带音乐
播放存储
清除存储
存储空间没满?
是
是
是
是
是
否
否
否
否
程序出口
否
图2.2调用程序流程图
3.方案实施
3.1硬件方案实施
3.1.1复位电路设计:
AT89C52的复位是由外部的复位电路来实现的。
复位引脚RST通过一个施密特触发器与复位电路相连,施密特触发器用来抑制噪声,在每个周期的S5P2,施密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
按键手动电平复位有电平方式和脉冲方式两种。
其中电平复位是通过RST端经电阻与电源vccrst接通而实现的,本次实验采用的是电平复位电路如图3.1:
图3.1电平复位电路
3.1.2时钟电路设计:
单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反相放大器的输入端为单片机的XTAL1,输出端为引脚XTAL2。
这两个引脚外部跨接石英振荡器X1和微调电容C3和C4,构成了稳定的自激振荡器。
而电容的大小会影响振荡的频率的高低、振荡器的稳定性和起振的快速性,因此对于电容选择是很关键的,我们这次设计的时钟电路采用了所提供的33pF电容可以构成稳定的自激振荡器电路。
并且选取的是振荡频率11.0925MHz。
如图3.2:
图3.2时钟电路
3.1.3电源电路设计:
电源电路主要用用于为整个系统提供电源。
我们日常用电都是220V的交流电,所以在设计电源时要先把交流电整成直流,然后再经过稳压管输出整个系统所需的稳定的直流电压。
整流主要采用2W10桥堆和电容滤波以得到基本稳定的输出电压。
稳压部分是采用常用的稳压管W7805得到稳定的输出正5V电压。
电源电路图如图3.3:
图3.3电源电路图
3.1.4LED闪亮电路设计:
LED主要是显示单片机的按键音符,单片机的P0.0-P0.7接发光二极管LED灯,采用的是阳极接5V电源的接法,发光二极管采用高亮led能耐大电流所以不用限流电阻。
LED闪亮电路图见图3.4:
图3.4LED闪亮电路图
3.1.5按键电路设计:
按键电路是矩阵电路,S1~S18按键用于音符;S19按键用于播放音乐;S20按键用于播放存储的音乐;S21按键用于清除存储。
按键电路图3.5所示;
图3.5按键电路图
3.1.6蜂鸣器电路设计:
由于蜂鸣器需要大电流才能驱动,所以电路采用npn驱动。
蜂鸣器电路如图3.6所示:
图3.6蜂鸣器电路图
3.2软件方案实施
3.2.1主程序
主程序流程图如图2.1。
主程序中包含定时器、蜂鸣器、按键的初始化,以开总中断,然后调用按键扫描程序。
程序如下:
main()
{
TMOD=0x10;//t1方式116t0,013
ET0=1;
TH0=0x4C;//定时器初始值
TL0=0x00;
EA=1;//开总中断
sound=0;
P2=0xFF;//置P2口
P1=0X00|0XF0;//将p1.0p1.1p1.2清零p1.3
delay(10);//延时
while
(1)
{
keydown();//调用按键判断检测程序
}
}
3.2.2调用程序
调用程序的流程图如图2.2。
函数keydown(void)完成判断是否按下按键,以及按下的键值并确定转向那个子程序;函数anjian_zhuanhuan(ucharfy)完成按下键的对应音符的转换为按键的处理准备;函数anjian_chuli(ucharconv1_ma)将转换的音符播放出来;函数_anjian_cunchu(uchar_key))将按键存储起来;函数_cunchu_bofang(void)将存储起来的按键播放;函数_bofang_yinyue(void)将自带的音乐播放出来。
清除存储是在程序中定义了一个全局变量,存储大于50时程序认为存储器满,清除时只需将其清零。
定时器的值是由音符频率决定的,在音乐播放中、音符播放、存储播放中作为决定音调。
详细程序见附件2。
4.结果与结论
4.1结果
两周忙碌后,我们基本完成了设计的要求:
画出电路图,流程图,焊接电路板等一系列学生该完成的工作,最终实现了电源电路,其指示灯亮;复位电路,按下复位后正唱复位;按下S1~S18能发出相应的音符并且led能响应闪亮,按下S19后可以播放自带音乐led能闪亮,按下S20后可以播放存储音乐led能闪亮,按下S21后可以清空存储。
总之,能够实现目标任务!
4.2结论
在设计过程中要紧扣主题也就是设计要求,根据要求构思硬件电路,并一步步列出程序框图并按照程序框图严格的进行编程,整个过程需连接的天衣无缝,方能得出最后的结果。
当然这个过程肯定不会很顺利,我们应该做好迎接一切困难准备并知难而进,只要按计划坚持下去,一定可以达到预期的结果。
其中有非常重要的一个环节就是最后的故障排查与调试,同时耐性是极其重要的。
带定时功能的闹铃时钟设计是单片机设计里很典型的一个课题,通过本次设计扩展了我们的知识面,增强了我们的实践能力,不论是在焊接电路,硬件设计还是编程,和对软件的掌握都大大的提高了。
5.收获与致谢
通过本次课程设计,我初步掌握了单片机设计的思路和方法,就是根据设计要求,先按模块进行硬件电路的设计和组合分配;列出主程序流程图,按顺序一步步编程,最后将软件程序与硬件电路结合,经过调试,最终实现所要求的功能。
虽然已经实习过好几次了,但自我感觉本次实习的意义深刻又重大,因为它将我们以前所学过的模电和电路知识与单片机天衣无缝的结合起来,真正的达到了理论与实践的结合,使我们受益匪浅。
还有就是和同学的合作是非常重要的,在焊接电路板时如果不是两个人合作,没有人监督,难免会出错,当我一人焊接的电路板不能工作又难检查错误时,我们果断决定了重新焊接,最终在我们的合作下焊接出了一个能够完全达到要求的板子同时让我们增进了友谊,锻炼了动手能力。
在此感谢丁莹亮老师对我们的严格要求和指导,还有学校给我们提供了这次宝贵的实习机会,这将对我们即将毕业进入工作产生很大的帮助,让我们对自己的专业有了更深的了解,为毕业设计点明了主题。
还要感谢我身边的同学对我的帮助和解惑。
经过实习设计,在合作方面,我学会了要合作,一个人做东西总要出错的,,为以后的工作打下坚实的基础;在学习方面,我更深的理解了单片机,一些单片机引脚已经知道怎么用了,至于程序这块还是不太熟练,以后要努力弥补。
最后感谢安阳工学院电子信息与电气工程系给我们这次机会,感谢老师们不辞辛劳的为我们购买元器件,感谢丁莹亮老师对我们的细心指导,谢谢您们。
6.参考文献
[1].杜尚丰.CAN总线测控技术及其应用.北京:
电子工业出版社,2007.1
[2].杜树春.单片机C语言和汇编语言混合编程实例详解.北京:
北京航空航天大学出版社,2006.6
[3].张毅刚.单片机原理及应用.北京:
高等教育出版社,2003.12
[4]阎石,数字电子技术基础(第五版)高等教育出版社2005
[5].张文涛.PROTEUS仿真软件应用.武汉:
华中科技大学出版社,2010.2
[6].王毅.单片机器件应用手册.北京:
人民邮电出版社,1994.4
7.附件
附件1:
总电路图
附件2:
程序
#include
//以下是C调低音的音频宏定义
#defineL1262//将"L1"宏定义为低音"1"的频率262Hz时间是1/262=3826/2us取半周期
#defineL2286//将"L2"宏定义为低音"2"的频率286Hz
#defineL3311//将"L3"宏定义为低音"3"的频率311Hz
#defineL4349//将"L4"宏定义为低音"4"的频率349Hz
#defineL5392//将"L5"宏定义为低音"5"的频率392Hz
#defineL6440//将"l_a"宏定义为低音"6"的频率440Hz
#defineL7494//将"L7"宏定义为低音"7"的频率494Hz
#defineZ1523//将"Z1"宏定义为中音"1"的频率523Hz
#defineZ2587//将"Z2"宏定义为中音"2"的频率587Hz
#defineZ3659//将"Z3"宏定义为中音"3"的频率659Hz
#defineZ4698//将"Z4"宏定义为中音"4"的频率698Hz
#defineZ5784//将"Z5"宏定义为中音"5"的频率784Hz
#defineZ6880//将"Z6"宏定义为中音"6"的频率880Hz
#defineZ7987//将"Z7"宏定义为中音"7"的频率523H
#defineH11046//将"H1"宏定义为高音"1"的频率1046Hz
#defineH21174//将"H2"宏定义为高音"2"的频率1174Hz
#defineH31318//将"H3"宏定义为高音"3"的频率1318Hz
#defineH41396//将"H4"宏定义为高音"4"的频率1396Hz
#defineH51567//将"H5"宏定义为高音"5"的频率1567Hz
#defineH61760//将"H6"宏定义为高音"6"的频率1760Hz
#defineH71975//将"H7"宏定义为高音"7"的频率1975Hz
#defineZR0//将"ZR"宏定义为无音
//以下是《天空之城》简谱//每行对应一小节音符
externunsignedintcodef[]={Z6,Z7,/**/H1,Z7,H1,H3,/**/Z7,Z3,Z3,/**/Z6,Z5,Z6,H1,/**/Z5,Z3,Z3,/**/Z4,Z3,Z4,H1,
Z3,H1,H1,H1,/**/Z7,Z4,Z4,Z7,/**/Z7,Z6,Z7,/**/H1,Z7,H1,H3,/**/Z7,Z3,Z3,/**/Z6,Z5,Z6,H1,
Z5,Z3,/**/Z4,H1,Z7,H1,/**/H2,H2,H2,H1,/**/H1,Z6,Z7,Z5,/**/Z6,H1,H2,/**/H3,H2,H3,H5,
H2,Z5,Z5,/**/H1,Z7,H1,H3,/**/H3,/**/Z6,H1,Z7,H2,/**/H1,Z5,Z5,/**/H4,H3,H2,H1,
H3,/**/Z3,H3,/**/H6,H5,H5,/**/H3,H2,H1,H1,/**/H2,H1,H2,H5,/**/H3,H3,
H6,H5,/**/H3,H2,H1,H1,/**/H2,H1,H2,Z7,/**/Z6,Z6,Z7,/**/Z6,
0xff};//以0xff作为音符的结束标志
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
externunsignedcharcodeJP[]={4,4,/**/12,4,8,8,/**/20,4,4,/**/12,4,8,8,/**/20,4,4,/**/12,4,4,12,
20,4,4,4,/**/12,4,8,8,/**/20,4,4,/**/12,4,8,8,/**/20,4,4,/**/12,4,8,8,
32,4,/**/8,4,6,8,/**/4,4,4,16,/**/8,4,6,8,/**/24,4,4,/**/12,4,8,8,
24,4,4,/**/4,4,8,8,/**/32,/**/4,8,8,6,/**/12,4,16,/**/8,8,8,8,
30,/**/20,8,/**/16,8,8,/**/4,4,16,8,/**/8,4,4,8,/**/20,8,
16,16,/**/4,20,8,/**/8,4,4,8,/**/20,4,4,/**/32,
};
#defineucharunsignedchar//宏的定义变量类型uchar代替unsignedchar
#defineuintunsignedint//宏的定义变量类型uint代替unsignedint
sbitsound=P1^3;
sbitled_l=P1^4;
ucharanjian_chuchu[50]={0};
ucharkey;//键顺序码
ucharcount;//存储计数
ucharcount50;//存储满
uintplay_ma;//音符
/*************************************************************
延时
*************************************************************/
voiddelay(ucharx)
{ucharj;
while((x--)!
=0)//CPU执行x*100次
{for(j=0;j<100;j++)
{;}
}
}
/*********************************************************
按键转换音符
*********************************************************/
uint_anjian_zhuanhuan(ucharfy)
{uintffy;
if(fy!
=0)
switch(fy)
{case1:
ffy=L1;break;
case2:
ffy=L2;break;
case3:
ffy=L3;break;
case4:
ffy=L4;break;
case5:
ffy=L5;break;
case6:
ffy=L6;break;
case7:
ffy=L7;break;
case8:
ffy=Z1;break;
case9:
ffy=Z2;break;
case10:
ffy=Z3;break;
case11:
ffy=Z4;break;
case12:
ffy=Z5;break;
case13:
ffy=Z6;break;
case14:
ffy=Z7;break;
case15:
ffy=H1;break;
case16:
ffy=H2;break;
case17:
ffy=H3;break;
case18:
ffy=H4;break;
case19:
ffy=H5;break;
case20:
ffy=H6;break;
case21:
ffy=H7;break;
default:
ffy=0;break;
}
returnffy;
}
/************************************************************
按键存储
************************************************************/
void_anjian_cunchu(uchar_key)
{
if(count<50)
{anjian_chuchu[count]=_key;
count=count+1;
}
else
count50=1;
}
/****************************************************************************
按键播放处理
*****************************************************************************/
voidanjian_chuli(ucharconv1_ma)
{ucharj;
EA=1;//开总中断
ET0=1;//定时器T0中断允许
play_ma=_anjian_zhuanhuan(conv1_ma);
if(play_ma!
=0)
{
P0=(uchar)play_ma;//亮灯
TH0=(8192-play_ma)/32;//可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-play_ma)%32;//可证明这是13位计数器TL0低5位的赋初值方法
TR0=1;//启动定时器T0
for(j=0;j<4;j++)//控制节拍数
delay(100);//延时1个节拍单位
TR0=0;//关闭定时器T0
}
P0=0xff;
sound=0;
}
/*************************************************************
键扫描子程序(3*4的矩阵)P2为列
*************************************************************/
voidkeyscan(void)
{uchartemp;
temp=0;
lab:
P2=0xFF;//高四位输入列为高电平
P1=0X00|0XF0;//P1.0P1.1P1.2为行p1.3行为低电平
delay
(1);//延时
temp=P2|0X80;//读P2口
delay
(1);//延时
if(temp==P2|0X80)
{delay
(1);
if(temp==P2|0X80)
{temp=~temp;
switch(temp)
{case1:
key=1;break;
case2:
key=2;break;
case4:
key=3;break;
case8:
key=4;break;
case16:
key=5;break;
case32:
key=6;break;
case64:
key=7;