简易电子琴单片机原理及应用实训报告.docx

上传人:b****6 文档编号:8263350 上传时间:2023-01-30 格式:DOCX 页数:17 大小:54.94KB
下载 相关 举报
简易电子琴单片机原理及应用实训报告.docx_第1页
第1页 / 共17页
简易电子琴单片机原理及应用实训报告.docx_第2页
第2页 / 共17页
简易电子琴单片机原理及应用实训报告.docx_第3页
第3页 / 共17页
简易电子琴单片机原理及应用实训报告.docx_第4页
第4页 / 共17页
简易电子琴单片机原理及应用实训报告.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

简易电子琴单片机原理及应用实训报告.docx

《简易电子琴单片机原理及应用实训报告.docx》由会员分享,可在线阅读,更多相关《简易电子琴单片机原理及应用实训报告.docx(17页珍藏版)》请在冰豆网上搜索。

简易电子琴单片机原理及应用实训报告.docx

简易电子琴单片机原理及应用实训报告

桂林电子科技大学信息科技学院

《单片机原理及应用》实训报告

学号

姓名张天瀛

指导教师:

易艺,马姝靓,于新业,梁晓梅

2013年9月13日

 

实训题目:

简易电子琴

1系统设计

1.1设计要求

1.1.1设计任务

基于AT89S52芯片制作简易电子琴,完成1-7弹奏与音乐播放任务。

1.1.2性能指标要求

1、设计简易电子琴硬件电路,电子琴能够弹奏1~7音符或其高低音,并能够通过数码管显示对应的音符(如果使用高音或低音,则在数码管上方和下方分别放置一个发光二极管,以区分数码管所显示音符为高音还是低音);

2、编写电子琴程序,某音符的按键按下,数码管显示对应的音符,且蜂鸣器发出该音符的声音,声音持续到按键释放(如果是高音,则数码管上方的发光二极管点亮,如果是低音,则数码管下方的发光二极管点亮,其他情况发光二极管都不亮);

3.通过按键控制播放已存放的音乐;

4.选作:

其他特殊功能(如开机播放音乐)。

1.2设计思路及设计框图

1.2.1设计思路

1、根据设计任务和性能指标要求选择总体方案,画出设计框图;

2、参阅相关资料,根据设计框图和发放的元件进行单元电路的设计;

3、绘制原理图,搭建电路板;

4、编写LED驱动程序,能够对应点亮相应的LED;

5、编写数码管程序,对数码管进行测试,使之能循环显示0到9;

6、编写按键程序,能够将按键和LED及数码管对应起来;

7、驱动蜂鸣器程序,完成简易电子琴功能;

8、编写播放音乐程序;

9、写实训报告(包括设计与调试的全过程,附上有关资料、电路图和心得体会)。

1.2.2总体设计框图

 

单片机

LED+数码管

蜂鸣器

及驱动

2各个模块程序的设计

程序设计流程图

 

详细程序:

主程序头文件与声明:

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitspeak1=P1^6;

sbits=P1^7;

sbitled0=P1^0;

sbitled1=P1^1;

sbitk1=P1^4;

ucharn=0;//节拍常数变量

对应音调1、2、3、4、5、6、7:

uintcodefre[]={64579,64685,64778,64820,64898,64968,65030};

数码管显示:

ucharcodeshumaguan[]={

0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,

0x63,0x85,0x61,0x71};

uchark;

ucharj;

uchartemp;

ucharflag;

uintscale;

voiddelay_ms(uintx);

voiddelay(unsignedcharm);

voidmain()

{

while

(1)

{

while(k1==1)

{

TMOD=0x21;

//定时器0工作于16位定时方式,定时器1工作在8位自动重装

EA=1;

ET0=1;

ET1=1;

TH1=0x06;

TL1=0x06;

TR1=1;

speak1=1;

s=1;

temp=0;

flag=0;

led0=1;

led1=1;

scale=0;

按键扫描

while(k1==1)

{

temp=P0;

if((temp|0x80)!

=0xff)

{

delay_ms(10);

temp=P0;

if((temp|0x80)!

=0xff)

{

switch(temp)

{case0xfe:

k=1;break;

case0xfd:

k=2;break;

case0xfb:

k=3;break;

case0xf7:

k=4;break;

case0xef:

k=5;break;

case0xdf:

k=6;break;

case0xbf:

k=7;break;

}

if(flag==0)

{

TH0=fre[k-1]/256;

TL0=fre[k-1]%256;

TR0=1;

flag=1;

s=0;

P2=shumaguan[k];

led0=0;

scale++;

if(scale==10)

scale=0;

TR2=1;

}

}

}

temp=P0;

if((temp|0x80)==0xff)

{

delay_ms(10);

temp=P0;

if(temp==0xff)

{

TR0=0;

speak1=1;

s=1;

led0=1;

}

}

}

}

if(k1==0)

{

ucharp,m;

uchari=0;

j=0;

TMOD=0x21;

TH0=0xd8;

TL0=0xef;

ET0=1;

TH1=0x06;

TL1=0x06;

ET1=1;

TR1=1;

while(k1==0)

{

led0=0;

p=music_tab[i];

if(p==0x00)

{

i=0;

delay_ms(100);

}

else

if(p==0xff)

{

i=i+1;

delay_ms(10);

TR0=0;

}

else

{

m=music_tab[i++];

n=music_tab[i++];

}

TR0=1;

while(n!

=0&&k1==0)//节拍

{

speak1=~speak1;

scale++;

if(scale==10)

scale=0;

delay(m);//音调即音调的频率

}

TR0=0;

s=0;

P2=shumaguan[j++];

if(j==16)

j=0;

}

}

}

}

中断子程序:

voidtime0()interrupt1

{

if(k1==1)

{

TH0=fre[k-1]/256;

TL0=fre[k-1]%256;

speak1=~speak1;

flag=0;

}

if(k1==0)

{

TH0=0Xd8;

TL0=0Xef;

n--;

}

}

voidtime1()interrupt3

{

uchart;

t++;

if(t==10)

{

t=0;

led1=0;

}

if(scale==t)

led1=1;

}

voiddelay(unsignedcharm)

{

uinti;

i=3*m;

while(--i);

}

voiddelay_ms(uintx)//ms级延时

{

while(x--)

{

uchari;

for(i=0;i<131;i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

3调试过程

通过调试,发现数码管显示不正常,播放音乐效果失灵,调试后依然没能完整解决,验收过程前再次询问老师以期结果。

4功能测试

4.1测试仪器与设备

万用表,下载线,计算机。

4.2性能指标测试

顺利实现1-7弹奏,数码管运行效果趋于不良,音乐播放功能受损。

4.3误差分析

误差方面主要是音准问题,1-7弹奏中可以明显发现音准错误,根据频率换算完成的中断时间并不能完全保证音准,还需要更多调试。

5实训心得体会

本次实训中学到了许多知识,增强了自身实际动手能力,非常感谢老师与同学们给予的帮助与支持。

对于本次实训完成的电子琴,即便完成了实训,不足之处依然不胜枚举,让人略感沮丧,好在不足之处可以弥补,透过实训所学到的关于硬件与软件的知识然我感到受益匪浅。

首先就硬件而言,透过本次实训基本了解了电子产品的开发流程与外围电路的设计与搭建,对52系单片机的工作原理以及各接口功能有了更加深刻的理解。

在软件方面,本次实训中我更加清楚的理解了52系单片机寄存器与内部编程规则以及如何控制外围电路。

所有这一切都来自于本次动手去完成实训,事实证明,实践出真知,动手远比理论获益更丰。

最后,再一次向本次实训中向我伸出援手的老师与同学表示感谢,谢谢。

6参考文献

谢自美.《电子线路设计·实验·测试》(第二版)。

武汉:

华中科技大学出版社,2000

陈涛.《单片机应用及C51程序设计》(第二版)。

北京:

机械工业出版社,2010

喻宗泉.《单片机原理与应用技术》。

西安:

西安电子科技大学出版社,2006

附录

附录1:

原理图

 

实际原理图有所改动与参考原理图有出入,以上为老师给出参考原理图。

附录2:

程序清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitspeak1=P1^6;

sbits=P1^7;

sbitled0=P1^0;

sbitled1=P1^1;

sbitk1=P1^4;

ucharn=0;

uintcodefre[]={64579,64685,64778,64820,64898,64968,65030};

ucharcodeshumaguan[]={

0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,

0x63,0x85,0x61,0x71};

uchark;

ucharj;

uchartemp;

ucharflag;

uintscale;

voiddelay_ms(uintx);

voiddelay(unsignedcharm);

voidmain()

{

while

(1)

{

while(k1==1)

{

TMOD=0x21;

EA=1;

ET0=1;

ET1=1;

TH1=0x06;

TL1=0x06;

TR1=1;

speak1=1;

s=1;

temp=0;

flag=0;

led0=1;

led1=1;

scale=0;

while(k1==1)

{

temp=P0;

if((temp|0x80)!

=0xff)

{

delay_ms(10);

temp=P0;

if((temp|0x80)!

=0xff)

{

switch(temp)

{case0xfe:

k=1;break;

case0xfd:

k=2;break;

case0xfb:

k=3;break;

case0xf7:

k=4;break;

case0xef:

k=5;break;

case0xdf:

k=6;break;

case0xbf:

k=7;break;

}

if(flag==0)

{

TH0=fre[k-1]/256;

TL0=fre[k-1]%256;

TR0=1;

flag=1;

s=0;

P2=shumaguan[k];

led0=0;

scale++;

if(scale==10)

scale=0;

TR2=1;

}

}

}

temp=P0;

if((temp|0x80)==0xff)

{

delay_ms(10);

temp=P0;

if(temp==0xff)

{

TR0=0;

speak1=1;

s=1;

led0=1;

}

}

}

}

if(k1==0)

{

ucharp,m;

uchari=0;

j=0;

TMOD=0x21;

TH0=0xd8;

TL0=0xef;

ET0=1;

TH1=0x06;

TL1=0x06;

ET1=1;

TR1=1;

while(k1==0)

{

led0=0;

p=music_tab[i];

if(p==0x00)

{

i=0;

delay_ms(100);

}

else

if(p==0xff)

{

i=i+1;

delay_ms(10);

TR0=0;

}

else

{

m=music_tab[i++];

n=music_tab[i++];

}

TR0=1;

while(n!

=0&&k1==0)

{

speak1=~speak1;

scale++;

if(scale==10)

scale=0;

delay(m);

}

TR0=0;

s=0;

P2=shumaguan[j++];

if(j==16)

j=0;

}

}

}

}

voidtime0()interrupt1

{

if(k1==1)

{

TH0=fre[k-1]/256;

TL0=fre[k-1]%256;

speak1=~speak1;

flag=0;

}

if(k1==0)

{

TH0=0Xd8;

TL0=0Xef;

n--;

}

}

voidtime1()interrupt3

{

uchart;

t++;

if(t==10)

{

t=0;

led1=0;

}

if(scale==t)

led1=1;

}

voiddelay(unsignedcharm)

{

uinti;

i=3*m;

while(--i);

}

voiddelay_ms(uintx)

{

while(x--)

{

uchari;

for(i=0;i<131;i++)

{

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

}

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

当前位置:首页 > 法律文书 > 起诉状

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

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