单片机电子琴设计报告.docx

上传人:b****5 文档编号:8385869 上传时间:2023-01-30 格式:DOCX 页数:30 大小:174.34KB
下载 相关 举报
单片机电子琴设计报告.docx_第1页
第1页 / 共30页
单片机电子琴设计报告.docx_第2页
第2页 / 共30页
单片机电子琴设计报告.docx_第3页
第3页 / 共30页
单片机电子琴设计报告.docx_第4页
第4页 / 共30页
单片机电子琴设计报告.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

单片机电子琴设计报告.docx

《单片机电子琴设计报告.docx》由会员分享,可在线阅读,更多相关《单片机电子琴设计报告.docx(30页珍藏版)》请在冰豆网上搜索。

单片机电子琴设计报告.docx

单片机电子琴设计报告

课程设计报告

设计题目单片机电子琴

 

第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

 

以单片机作为主控核心,与键盘、扬声器等模块组成核心主控制模块,在主控模块上设有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,0x2b,0x20,

0x26,0x20,0x20,0x20,0x01,0x20,0x20,0x20,

0x24,0x20,0x20,0x20,0x26,0x10,0x2b,0x20,0x30,0x10,

0x2b,0x60,

//1176711237755

0x30,0x40,0x18,0x20,0x19,0x20,0x1c,0x20,0x19,0x10,

0x18,0x10,0x18,0x20,0x2b,0x20,0x13,0x20,0x19,0x20,

0x19,0x20,0x20,0x10,0x20,0x10,

 

//63221117

0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,

0x18,0x40,0x18,0x20,0x19,0x20,

 

//6711237755

0x1c,0x20,0x19,0x10,0x18,0x10,0x18,0x20,0x15,0x20,

0x13,0x20,0x19,0x20,0x19,0x20,0x20,0x10,0x20,0x10,

//632211

0x1c,0x20,0x13,0x10,0x15,0x10,0x15,0x20,0x18,0x20,

0x18,0x60,

//00000

0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x40,0x01,0x60,

 

//1155555577755

0x18,0x10,0x18,0x10,0x10,0x20,0x10,0x10,0x1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1