单片机电子琴设计报告文档格式.docx

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

单片机电子琴设计报告文档格式.docx

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

单片机电子琴设计报告文档格式.docx

设计一简易电子琴,要求能够发出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);

LCDWrite(0,0x08);

LCDWrite(0,0x01);

LCDWrite(0,0x06);

LCDWrite(0,0x0c);

}

voidLCDWrite(bitcd,unsignedcharDATA)

LCDWait(20);

LCD_RS=cd;

LCD_RW=0;

LCD_EN=0;

LCDData=DATA;

LCD_EN=1;

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)

unsignedcharj,temp[5];

//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<

CiShu;

i++)

if(ReadState()&

0x80)continue;

elsebreak;

}

unsignedcharReadState()

unsignedchartemp;

P0=0xff;

LCD_RS=0;

LCD_RW=1;

temp=LCDData;

returntemp;

voidLCDDelay()

unsignedinta;

for(a=0;

a<

1000;

a++);

(2).时钟芯片模块头文件

voidiicdelay(unsignedinttimes);

voidiicstart()

MDE=1;

MDO=1;

iicdelay

(2);

MCO=1;

MDO=0;

voidiicstop()

voidiicack()

MCO=0;

iicdelay

(1);

voidiicnack()

//MCO=0;

bitiicreadack()

bitack;

MCO=0;

MDE=0;

ack=MDI;

returnack;

voidiicwriteda(unsignedcharda)

unsignedchari;

for(i=0;

8;

{

iicdelay(0);

if((da<

<

i)&

0x80)

else

iicdelay(3);

}

unsignedchariicreadda()

unsignedcharda;

inti;

da=0;

if(MDI==1)

{da=da<

1;

da++;

da=da<

returnda;

voidiicdelay(unsignedintt)

unsignedinti,j;

t;

for(j=5;

j>

0;

j--);

voidReadTime(unsignedcharTIME[7])

bitEATemp;

unsignedchartemp;

EATemp=EA;

iicstart();

iicwriteda(0xd0);

iicreadack();

iicwriteda(0x00);

iicstop();

iicwriteda(0xd1);

TIME[0]=iicreadda();

iicack();

TIME[1]=iicreadda();

TIME[2]=iicreadda();

TIME[3]=iicreadda();

TIME[4]=iicreadda();

TIME[5]=iicreadda();

TIME[6]=iicreadda();

iicnack();

TIME[0]=((TIME[0]&

0x7f)>

>

4)*10+(TIME[0]&

0x0f);

//second

TIME[1]=((TIME[1]&

4)*10+(TIME[1]&

//minute

if(TIME[2]&

0x40)

0x20)temp=0x80;

elsetemp=0x40;

TIME[2]=((TIME[2]&

0x1f)>

4)*10+(TIME[2]&

//hour

TIME[2]|=temp;

}

0x3f)>

TIME[3]=TIME[3]&

0x07;

//week

TIME[4]=((TIME[4]&

4)*10+(TIME[4]&

//date

TIME[5]=((TIME[5]&

4)*10+(TIME[5]&

//month

TIME[6]=(TIME[6]>

4)*10+(TIME[6]&

//year

EA=EATemp;

voidSetTime(unsignedcharTIME[7])

unsignedchartemp=0;

unsignedcharTimeTemp[7];

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);

0xc0)==0x01)temp=0x40;

elsetemp=0x60;

TimeTemp[2]&

=0x3f;

TimeTemp[2]|=temp;

TimeTemp[1]=((TimeTemp[1]/10)<

4)+(TimeTemp[1]%10);

TimeTemp[0]=((TimeTemp[0]/10)<

4)+(TimeTemp[0]%10);

TimeTemp[0]&

=0x7f;

iicwriteda(TimeTemp[0]);

iicwriteda(TimeTemp[1]);

iicwriteda(TimeTemp[2]);

iicwriteda(TimeTemp[3]);

iicwriteda(TimeTemp[4]);

iicwriteda(TimeTemp[5]);

iicwriteda(TimeTemp[6]);

voidSwitchRTC(unsignedcharSWITCH)

//iicdelay

(1);

temp=iicreadda();

if(SWITCH)temp&

elsetemp|=0x80;

iicwriteda(temp);

EA=EATemp;

(3)主体程序

#include<

aduc848.h>

#include<

INTRINS.H>

LCD1602.h>

rtc.h>

sbitlie0=P2^3;

sbitlie1=P2^2;

sbitlie2=P2^1;

sbitlie3=P2^0;

sbitPWM1=P2^6;

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>

k--)

for(i=100;

i>

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;

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*/

//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

0x18,0x60,

//00000

0x

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

当前位置:首页 > 求职职场 > 面试

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

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