单片机电子琴设计报告.docx
- 文档编号:12375281
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:36
- 大小:175.95KB
单片机电子琴设计报告.docx
《单片机电子琴设计报告.docx》由会员分享,可在线阅读,更多相关《单片机电子琴设计报告.docx(36页珍藏版)》请在冰点文库上搜索。
单片机电子琴设计报告
单片机
课程设计报告
设计题目单片机电子琴
摘要
随着社会的发展进步,音乐逐渐成为我们生活中很重要的一部分,有人曾说喜欢音乐的人不会向恶。
我们都会抽空欣赏世界名曲,作为对精神的洗礼。
本论文设计一个基于单片机的简易电子琴。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本系统是以51系列单片机AT89C51为主控制器,附有矩阵键盘、LED显示管、扬声器组成。
系统完成显示输入信息、播放相应音符等基本功能。
本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。
关键词:
AT89C51,矩阵键盘,LED显示管,蜂鸣器,1602液晶显示,1307时钟芯片。
第1章概述----------------------------------------------------------------------------------4
第2章课程设计任务及要求-----------------------------------------------------------4
2.1设计任务-------------------------------------------------------------------------------4
2.2设计要求-------------------------------------------------------------------------------4
第3章系统设计-----------------------------------------------------------------------------5
3.1设计方案-------------------------------------------------------------------------------5
3.2系统设计--------------------------------------------------------------------------------5
3.2.2系统流程图-----------------------------------------------------------------------5
3.2.2系统原理图------------------------------------------------------------------------7
3.3文件程序代码---------------------------------------------------------------------------7
第4章心得体会-----------------------------------------------------------------------------42
第1章概述
单片微型计算机是大规模集成电路技术发展的产物,属第四代电子计算机,它具有高性能、高速度、体积小、价格低廉、稳定可靠、应用广泛的特点。
它的应用必定导致传统的控制技术从根本上发生变革。
因此,单片机的开发应用已成为高科技和工程领域的一项重大课题。
电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。
它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。
本文的主要内容是用单片机为核心控制元件,设计一个电子琴。
以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有16个按键和扬声器。
本文主要对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,最终可随意弹奏想要表达的音乐。
并且本文分别从原理图,主要芯片,各模块原理及各模块的程序的调试来详细阐述。
本系统是简易电子琴的设计,按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放器对应的音符。
通过设计本系统可了解单片机的基本功能。
对单片机的了解有一个小的飞跃。
第2章课程设计任务及要求
2.1设计任务
1、任务
设计一简易电子琴,要求能够发出1,2,3,4,5,6,7等7个音符,具有一般演奏功能。
2.2设计要求
1)具有一般演奏功能,利用所给键盘的1,2,3,4,5,6,7,8八个键,能够发出8个不同的音调,并且要求按下按键发声,松开延时一段时间停止,中间再按别的键则发另一个音调的声音
2)具有自动播放已存曲目功能
3)显示当前正在播放的歌曲的名称和歌词
4)显示北京时间
第3章系统设计
3.1设计方案
该电路由时钟模块,液晶模块,键盘扫描模块组成。
时钟模块:
由时钟模块1307实现,能够正确显示北京时间,以及扩展显示星期等等。
液晶模块:
将时钟模块的信息正确的显示到液晶显示屏上,使用1602的液晶。
键盘扫描模块:
对十六个按键进行逐次扫描,扫描到前八个按键时,蜂鸣器依次发出1,2,3,4,5,6,7,8的音调声,岸其余按键时,可以跳转到不同的曲目以及液晶模块显示,保留几个按键做以后的扩展用。
3.2系统设计
3.2.1系统流程图
分析各项设计要求后,可绘制如下程序流程图
3.2.2系统原理图
3.3文件程序代码
(1).液晶模块头文件
sbitLCD_RS=P3^6;
sbitLCD_RW=P3^5;
sbitLCD_EN=P3^3;
sfrLCDData=0x80;
voidLCDWrite(bitcd,unsignedcharinput);
voidLCDWait(unsignedcharCiShu);
voidLCDDelay();
voidLCDInitialize();
voidLCDPrintString(unsignedcharx,unsignedchary,unsignedchar*string);
voidLCDPrintNumber(unsignedcharx,unsignedchary,unsignedcharbits,unsignedintnumber);
unsignedcharReadState();
voidLCDInitialize()
{
LCDDelay();
LCDWrite(0,0x38);
LCDDelay();
LCDWrite(0,0x38);
LCDDelay();
LCDWrite(0,0x38);
LCDDelay();
LCDWrite(0,0x38);
LCDDelay();
LCDWrite(0,0x08);
LCDDelay();
LCDWrite(0,0x01);
LCDDelay();
LCDWrite(0,0x06);
LCDDelay();
LCDWrite(0,0x0c);
}
voidLCDWrite(bitcd,unsignedcharDATA)
{
LCDWait(20);
LCD_RS=cd;
LCD_RW=0;
LCD_EN=0;
LCDData=DATA;
LCD_EN=1;
LCD_EN=0;
}
voidLCDPrintString(unsignedcharx,unsignedchary,unsignedchar*string)
{
unsignedcharaddress;
address=x+(1-y)*0x40+0x80;
LCDWrite(0,address);
while(*string!
='\0')
{
LCDWrite(1,*string);
string++;
}
}
voidLCDPrintNumber(unsignedcharx,unsignedchary,unsignedcharWeiShu,unsignedintnumber)
{
unsignedcharaddress;
unsignedcharj,temp[5];
address=x+(1-y)*0x40+0x80;
LCDWrite(0,address);
//if(number>0)
{
temp[0]=(number%100000)/10000+48;
temp[1]=(number%10000)/1000+48;
temp[2]=(number%1000)/100+48;
temp[3]=(number%100)/10+48;
temp[4]=number%10+48;
for(j=5-WeiShu;j<5;j++)
{
LCDWrite(1,temp[j]);
}
}
}
voidLCDWait(unsignedcharCiShu)
{
unsignedchari;
for(i=0;i { if(ReadState()&0x80)continue; elsebreak; } } unsignedcharReadState() { unsignedchartemp; P0=0xff; LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_EN=1; temp=LCDData; LCD_EN=0; returntemp; } voidLCDDelay() { unsignedinta; for(a=0;a<1000;a++); } (2).时钟芯片模块头文件 voidiicdelay(unsignedinttimes); voidiicstart() { MDE=1; MDO=1; iicdelay (2); MCO=1; iicdelay (2); MDO=0; iicdelay (2); } voidiicstop() { MDE=1; MDO=0; iicdelay (2); MCO=1; iicdelay (2); MDO=1; } voidiicack() { MDE=1; MCO=0; MDO=0; iicdelay (2); MCO=1; iicdelay (2); MCO=0; iicdelay (1); MDO=1; } voidiicnack() { MDE=1; //MCO=0; MDO=1; iicdelay (2); MCO=1; iicdelay (2); MCO=0; } bitiicreadack() { bitack; MCO=0; iicdelay (2); MDE=1; MDO=1; MCO=1; iicdelay (2); MDE=0; ack=MDI; MCO=0; returnack; } voidiicwriteda(unsignedcharda) { unsignedchari; MDE=1; for(i=0;i<8;i++) { MCO=0; iicdelay(0); if((da< MDO=1; else MDO=0; iicdelay (2); MCO=1; iicdelay(3); } MCO=0; } unsignedchariicreadda() { unsignedcharda; inti; da=0; MDE=1; MDO=1; MDE=0; for(i=0;i<8;i++) { MCO=0; iicdelay(3); MCO=1; iicdelay (1); if(MDI==1) {da=da<<1;da++;} else da=da<<1; } MCO=0; returnda; } voidiicdelay(unsignedintt) { unsignedinti,j; for(i=0;i for(j=5;j>0;j--); } voidReadTime(unsignedcharTIME[7]) { bitEATemp; unsignedchartemp; EATemp=EA; iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicstop(); iicdelay (1); iicstart(); iicwriteda(0xd1); iicreadack(); TIME[0]=iicreadda(); iicack(); TIME[1]=iicreadda(); iicack(); TIME[2]=iicreadda(); iicack(); TIME[3]=iicreadda(); iicack(); TIME[4]=iicreadda(); iicack(); TIME[5]=iicreadda(); iicack(); TIME[6]=iicreadda(); iicnack(); iicstop(); iicdelay (1); TIME[0]=((TIME[0]&0x7f)>>4)*10+(TIME[0]&0x0f);//second TIME[1]=((TIME[1]&0x7f)>>4)*10+(TIME[1]&0x0f);//minute if(TIME[2]&0x40) { if(TIME[2]&0x20)temp=0x80;elsetemp=0x40; TIME[2]=((TIME[2]&0x1f)>>4)*10+(TIME[2]&0x0f);//hour TIME[2]|=temp; } else { TIME[2]=((TIME[2]&0x3f)>>4)*10+(TIME[2]&0x0f); } TIME[3]=TIME[3]&0x07;//week TIME[4]=((TIME[4]&0x3f)>>4)*10+(TIME[4]&0x0f);//date TIME[5]=((TIME[5]&0x1f)>>4)*10+(TIME[5]&0x0f);//month TIME[6]=(TIME[6]>>4)*10+(TIME[6]&0x0f);//year EA=EATemp; } voidSetTime(unsignedcharTIME[7]) { bitEATemp; unsignedchartemp=0; unsignedcharTimeTemp[7]; EATemp=EA; for(temp=0;temp<7;temp++)TimeTemp[temp]=TIME[temp]; temp=0; TimeTemp[6]=((TimeTemp[6]/10)<<4)+(TimeTemp[6]%10); TimeTemp[5]=((TimeTemp[5]/10)<<4)+(TimeTemp[5]%10); TimeTemp[4]=((TimeTemp[4]/10)<<4)+(TimeTemp[4]%10); TimeTemp[3]=((TimeTemp[3]/10)<<4)+(TimeTemp[3]%10); if((TimeTemp[2]&0xc0)==0x00) { TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10); } else { if((TimeTemp[2]&0xc0)==0x01)temp=0x40;elsetemp=0x60; TimeTemp[2]&=0x3f; TimeTemp[2]=((TimeTemp[2]/10)<<4)+(TimeTemp[2]%10); TimeTemp[2]|=temp; } TimeTemp[1]=((TimeTemp[1]/10)<<4)+(TimeTemp[1]%10); TimeTemp[0]=((TimeTemp[0]/10)<<4)+(TimeTemp[0]%10); TimeTemp[0]&=0x7f; iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicwriteda(TimeTemp[0]); iicreadack(); iicwriteda(TimeTemp[1]); iicreadack(); iicwriteda(TimeTemp[2]); iicreadack(); iicwriteda(TimeTemp[3]); iicreadack(); iicwriteda(TimeTemp[4]); iicreadack(); iicwriteda(TimeTemp[5]); iicreadack(); iicwriteda(TimeTemp[6]); iicreadack(); iicstop(); iicdelay (1); EA=EATemp; } voidSwitchRTC(unsignedcharSWITCH) { unsignedchartemp; bitEATemp; EATemp=EA; iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicstop(); //iicdelay (1); iicstart(); iicwriteda(0xd1); iicreadack(); temp=iicreadda(); iicnack(); iicstop(); //iicdelay (1); if(SWITCH)temp&=0x7f; elsetemp|=0x80; iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicwriteda(temp); iicreadack(); iicstop(); //iicdelay (1); EA=EATemp; (3)主体程序 #include #include #include #include sbitlie0=P2^3; sbitlie1=P2^2; sbitlie2=P2^1; sbitlie3=P2^0; sbitPWM1=P2^6; unsignedchartemp; unsignedcharkey; unsignedcharSTH0,STL0; unsignedcharjishi=0; unsignedcharn=0;//n为节拍常数变量 unsignedchara[7]={00,59,19,3,4,8,10}; unsignedcharb[7]; voiddelay1s(void) { unsignedchari,k; for(k=100;k>0;k--) for(i=100;i>0;i--); } /*定时器0中断*/ voidTIMER0(void)interrupt1 { TH0=STH0; TL0=STL0; PWM1=~PWM1; } /*定时器1中断*/ voidint0()interrupt3//采用中断3控制节拍节拍延时 {TH1=0xd8; TL1=0xef; n--; } /*定时器2中断*/ voidint1()interrupt5//采用中断3控制节拍节拍延时 {TH2=0xd8; TL2=0xef; n--; } voiddelay(unsignedcharm)//控制频率延时 { unsignedi=3*m; while(--i); } voiddelayms(unsignedchara)//豪秒延时子程序 { while(--a);//采用while(--a)不要采用while(a--);各位可编译一下看看汇编结果就知道了! } unsignedintcodetab[]={0xfc43,0xfd08,0,0,0xfd08,0xfd32,0,0,0xfd81,0xfdc7,0,0,0xfe05,0xfe21,0,0,}; /*unsignedcharcodetable[]={0x03,0x9f,0x25,0x0d, 0x99,0x49,0x41,0x1f, 0x01,0x09,0x11,0xc1, 0x63,0x85,0x61,0x71,0xff};*/ unsignedcharcodemusic_tab_1[]={ /*1*/ 0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20, 0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10, 0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x2b,0x20, 0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20, 0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10, 0x2b,0x60, /*2*/ 0x20,0x20,0x20,0x10,0x20,0x10,0x20,0x20,0x20,0x20, 0x20,0x20,0x1c,0x20,0x20,0x20,0x24,0x20, 0x26,0x20,0x1c,0x20,0x19,0x20,0x18,0x10, 0x19,0x10,0x20,0x30,0x01,0x20,0x20,0x10,0x20,0x10, 0x1c,0x20,0x30,0x20,0x30,0x20,0x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电子琴 设计 报告