生产实习报告单片机电子琴.docx

上传人:b****2 文档编号:1764526 上传时间:2023-05-01 格式:DOCX 页数:31 大小:453.22KB
下载 相关 举报
生产实习报告单片机电子琴.docx_第1页
第1页 / 共31页
生产实习报告单片机电子琴.docx_第2页
第2页 / 共31页
生产实习报告单片机电子琴.docx_第3页
第3页 / 共31页
生产实习报告单片机电子琴.docx_第4页
第4页 / 共31页
生产实习报告单片机电子琴.docx_第5页
第5页 / 共31页
生产实习报告单片机电子琴.docx_第6页
第6页 / 共31页
生产实习报告单片机电子琴.docx_第7页
第7页 / 共31页
生产实习报告单片机电子琴.docx_第8页
第8页 / 共31页
生产实习报告单片机电子琴.docx_第9页
第9页 / 共31页
生产实习报告单片机电子琴.docx_第10页
第10页 / 共31页
生产实习报告单片机电子琴.docx_第11页
第11页 / 共31页
生产实习报告单片机电子琴.docx_第12页
第12页 / 共31页
生产实习报告单片机电子琴.docx_第13页
第13页 / 共31页
生产实习报告单片机电子琴.docx_第14页
第14页 / 共31页
生产实习报告单片机电子琴.docx_第15页
第15页 / 共31页
生产实习报告单片机电子琴.docx_第16页
第16页 / 共31页
生产实习报告单片机电子琴.docx_第17页
第17页 / 共31页
生产实习报告单片机电子琴.docx_第18页
第18页 / 共31页
生产实习报告单片机电子琴.docx_第19页
第19页 / 共31页
生产实习报告单片机电子琴.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

生产实习报告单片机电子琴.docx

《生产实习报告单片机电子琴.docx》由会员分享,可在线阅读,更多相关《生产实习报告单片机电子琴.docx(31页珍藏版)》请在冰点文库上搜索。

生产实习报告单片机电子琴.docx

生产实习报告单片机电子琴

生产实习报告--单片机电子琴

1基础部分

1.1设计任务

按照给定电路原理图,进行单片机最小系统的焊接:

包括单片机、开关、插排、复位电路和晶振电路,正确焊接后,电路可以进行程序的下载。

设计并焊接简单外围电路,包括:

LED与独立按键、蜂鸣器、双位数码管。

 

使用汇编或C语言编写程序,使本电路完成以下功能:

 

LED跑马灯、双位数码管对应计数 ,方式一(始终一个方向)、方式(左右循环),可准确确定周期T。

每次第一个LED亮起的时候蜂鸣器响一声(t秒)提示 。

按键控制:

一共三个按键分别实现以下功能 

暂停:

检测该按键有效按下后,LED和数码管暂停,再次检测按键按下后,继续执行当前循环; 

复位:

检测该按键有效按下后,LED和数码管归零重新开始以当前模式循环 ;

模式转换:

正常运行状态,检测该按键有效按下后,数码管显示不变,LED显示从当前方式转换成另一方式继续执行。

1.2设计思路

先设计好外围电路模块的原理图。

根据自己的板子的实际情况安排布线并依据原理图进行焊接。

再设计程序流程图,分别编写简单程序调试各个外围电路是否可以正常工作。

学习使用单片机程序开发环境,编译下载程序等。

 

比如:

单独的跑马灯;双位数码管按秒计数;蜂鸣器1s一响;按键控制LED点亮(8个按键对应8个LED)。

设计程序运行的状态图以及程序流程图,编写程序代码并调试。

 

1.3原理图

 

1.4PCB图

器件名称

实物图片

数量

器件名称

实物图片

数量

单片机STCS90C52RC

1

四角按键开关

4

单排插针(4针)

1

六角自锁开关

1

30pF瓷片电容

2

10KΩ电阻

1

晶振11.0592M

1

导线

若干

10uf电解电容

1

万能版

1

编程接口板

1

杜邦线

4

40脚IC座

1

LED(红色)

8

双位数码管

1

三极管8050

3

1KΩ电阻

14

排阻

1

1.5器件清单

表1-1器件清单

(1)

1.6程序流程图

图主程序流程图图数码管子程序

1.7程序代码

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

ucharcodeleds1[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};//P0口控制8位LED

ucharcodeleds2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,

0xef,0xf7,0xfb,0xfd};

sbitle1=P3^5;//左边数码管位选

sbitle2=P3^4;//右边数码管位选

sbitfeng=P3^7;//蜂鸣器控制位

sbitkey1=P2^0;//模式切换

sbitkey2=P2^1;//暂停和开始

sbitkey3=P2^2;//功能复位

uintti,count,shi1,ge1,k;

uintflag=1;

voiddelay()//延时固定时间

{inti,j;

for(i=500;i>0;i--)

for(j=100;j>0;j--);

}

voiddelayms(uintms)//延时ms毫秒

{

inti,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

 

voidkeyscan()

{

if(key2==1)

{

delayms(10);

if(key2==1)

{

while(key2);

TR0=!

TR0;

P2=0x00;

}

}

if(key1==1)

{

delayms(10);

if(key1==1)

{

while(key1);

flag=!

flag;//flag=1为默认模式1,为0为模式2

P2=0x00;

}

}

if(key3==1)

{

delayms(10);

if(key3==1)

{

while(key3);

count=0;

P0=0xfe;

}

}

}

voidinit()

{

P0=0xfe;//二极管

P2=0x00;//按键

le1=0;

le2=0;

feng=0;

TMOD=0x01;//设置定时器1工作模式设置T0/T1

TH0=(65536-45872)/256;//给定时器装入初值

TL0=(65536-45872)%256;

EA=1;//打开中断

ET0=1;//打开定时器中断

TR0=0;

}

voiddisplay(uintshi,uintge)//数码管扫描

{uinti,j;

i=shi;

j=ge;

le1=0;

le2=0;

P1=table[i];

le1=1;

delayms(10);

le1=0;

P1=table[j];

le2=1;

delayms(10);

}

intmain()

{

init();

while

(1)

{

if(feng==1&&TR0==0&&k==0)

{

delay();

feng=0;

}

shi1=count/10;

ge1=count%10;

keyscan();

display(shi1,ge1);

}

}

voidtimer()interrupt1

{

TH0=(65536-45872)/256;//定时时间为1s,公式

TL0=(65536-45872)%256;

ti++;

if(ti==20)//每累加到20的时间为1秒

{

ti=0;//ti标志置0

count++;

if(count==100)

count=0;

if(flag==1)

{

k=count%8;

P0=leds1[k];

if(k==0)

feng=1;

else

feng=0;

}

else

{

k=count%14;

P0=leds2[k];

if(k==0)

feng=1;

else

feng=0;

}

}

}

2提高部分

2.1设计任务

在基础项目的前提下设计电子琴,让电子琴可以播放简单的歌曲,可以用按键进行简单的弹奏。

在弹奏过程中,led灯会根据不同的按键,点亮不同的灯。

2.2设计思路

先设计好外围电路模块的原理图。

根据自己的板子的实际情况安排布线画出PCB图,并依据PCB图进行焊接。

焊接完成之后根据设计任务设计程序流程图,再根据流程图编写程序,下载到单片机之后根据硬件情况进行调试。

直到完成设计任务为止。

2.3原理图

2.4PCB图

2.5器件清单

表2-1器件清单

(2)

器件名称

实物图片

数量

器件名称

实物图片

数量

四角按键开关

18

LED

8

蜂鸣器

1

杜邦线

9

2.6程序流程图

2.7程序代码

2.7.1头文件

#ifndef__SOUNDPLAY_H_REVISION_FIRST__

#define__SOUNDPLAY_H_REVISION_FIRST__

//**************************************************************************

#defineSYSTEM_OSC11059200//定义晶振频率12000000HZ

#defineSOUND_SPACE4/5//定义普通音符演奏的长度分率,//每4分音符间隔

#defineplay1

#definestop0

sbitBeepIO=P3^7;//定义输出管脚

unsignedintcodeFreTab[12]={262,277,294,311,330,349,369,392,415,440,466,494};//原始频率表

unsignedcharcodeSignTab[7]={0,2,4,5,7,9,11};//1~7在频率表中的位置

unsignedcharcodeLengthTab[7]={1,2,4,8,16,32,64};

unsignedcharSound_Temp_TH0,Sound_Temp_TL0;//音符定时器初值暂存

unsignedcharSound_Temp_TH1,Sound_Temp_TL1;//音长定时器初值暂存

charstate_song;

//**************************************************************************

voidInitialSound(void)

{

BeepIO=0;

Sound_Temp_TH1=(65535-(1/1200)*SYSTEM_OSC)/256;//计算TL1应装入的初值(10ms的初装值)

Sound_Temp_TL1=(65535-(1/1200)*SYSTEM_OSC)%256;//计算TH1应装入的初值

TH1=Sound_Temp_TH1;

TL1=Sound_Temp_TL1;

TMOD|=0x11;

ET0=1;

ET1=0;

EX0=1;

EX1=1;

TR0=0;

TR1=0;

EA=1;

IT0=1;

IT1=1;

}

voidint0()interrupt0

{

state_song=stop;

}

voidBeepTimer0(void)interrupt1//音符发生中断

{

BeepIO=!

BeepIO;

TH0=Sound_Temp_TH0;

TL0=Sound_Temp_TL0;

}

voidint1()interrupt2

{

state_song=play;

}

voidPlay(unsignedchar*Sound,unsignedcharSignature,unsignedOctachord,unsignedintSpeed)

{

unsignedintNewFreTab[12];//新的频率表

unsignedchari,j;

unsignedintPoint,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength;

unsignedcharTone,Length,SL,SH,SM,SLen,XG,FD;

for(i=0;i<12;i++)//根据调号及升降八度来生成新的频率表

{

j=i+Signature;

if(j>11)

{

j=j-12;

NewFreTab[i]=FreTab[j]*2;

}

else

NewFreTab[i]=FreTab[j];

if(Octachord==1)

NewFreTab[i]>>=2;

elseif(Octachord==3)

NewFreTab[i]<<=2;

}

SoundLength=0;

while(Sound[SoundLength]!

=0x00)//计算歌曲长度

{

SoundLength+=2;

}

Point=0;

Tone=Sound[Point];

Length=Sound[Point+1];//读出第一个音符和它时时值

LDiv0=12000/Speed;//算出1分音符的长度(几个10ms)

LDiv4=LDiv0/4;//算出4分音符的长度

LDiv4=LDiv4-LDiv4*SOUND_SPACE;//普通音最长间隔标准

TR0=0;

TR1=1;

while(Point

{

SL=Tone%10;//计算出音符

SM=Tone/10%10;//计算出高低音

SH=Tone/100;//计算出是否升半

CurrentFre=NewFreTab[SignTab[SL-1]+SH];//查出对应音符的频率

if(SL!

=0)

{

if(SM==1)CurrentFre>>=2;//低音

if(SM==3)CurrentFre<<=2;//高音

Temp_T=65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值

Sound_Temp_TH0=Temp_T/256;

Sound_Temp_TL0=Temp_T%256;

TH0=Sound_Temp_TH0;

TL0=Sound_Temp_TL0+12;//加12是对中断延时的补偿

}

SLen=LengthTab[Length%10];//算出是几分音符

XG=Length/10%10;//算出音符类型(0普通1连音2顿音)

FD=Length/100;

LDiv=LDiv0/SLen;//算出连音音符演奏的长度(多少个10ms)

if(FD==1)

LDiv=LDiv+LDiv/2;

if(XG!

=1)

if(XG==0)//算出普通音符的演奏长度

if(SLen<=4)

LDiv1=LDiv-LDiv4;

else

LDiv1=LDiv*SOUND_SPACE;

else

LDiv1=LDiv/2;//算出顿音的演奏长度

else

LDiv1=LDiv;

if(SL==0)LDiv1=0;

LDiv2=LDiv-LDiv1;//算出不发音的长度

if(SL!

=0)

{

TR0=1;

for(i=LDiv1;i>0;i--)//发规定长度的音

{

while(TF1==0);

TH1=Sound_Temp_TH1;

TL1=Sound_Temp_TL1;

TF1=0;

}

}

if(LDiv2!

=0)

{

TR0=0;BeepIO=0;

for(i=LDiv2;i>0;i--)//音符间的间隔

{

while(TF1==0);

TH1=Sound_Temp_TH1;

TL1=Sound_Temp_TL1;

TF1=0;

}

}

Point+=2;

Tone=Sound[Point];

Length=Sound[Point+1];

}

BeepIO=0;

}

//****************************************************************

#endif

2.7.2程序

#include

#include"soundplay.h"

#defineucharunsignedchar

#defineuintunsignedint

ucharcodetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,

0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};

uchartemp;

uinti,j;

voiddelay(uintx){

uinti;

for(i=0;i

}

voiddou()

{

uintx=150;

while(x--){

BeepIO=0;

delay(120);

BeepIO=1;

delay(120);}

}

voidre()

{

uintx=150;

while(x--){

BeepIO=0;

delay(115);

BeepIO=1;

delay(115);}

}

voidmi()

{

uintx=150;

while(x--){

BeepIO=0;

delay(110);

BeepIO=1;

delay(110);}

}

voidfa()

{

uintx=150;

while(x--){

BeepIO=0;

delay(105);

BeepIO=1;

delay(105);}

}

voidso()

{

uintx=150;

while(x--){

BeepIO=0;

delay(100);

BeepIO=1;

delay(100);}

}

voidla()

{

uintx=150;

while(x--){

BeepIO=0;

delay(95);

BeepIO=1;

delay(95);}

}

voidsi()

{

uintx=150;

while(x--){

BeepIO=0;

delay(90);

BeepIO=1;

delay(90);}

}

voiddoo()

{

uintx=150;

while(x--){

BeepIO=0;

delay(85);

BeepIO=1;

delay(85);}

}

voiddou2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(80);

BeepIO=1;

delay(80);}

}

voidre2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(75);

BeepIO=1;

delay(75);}

}

voidmi2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(70);

BeepIO=1;

delay(70);}

}

voidfa2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(65);

BeepIO=1;

delay(65);}

}

voidso2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(60);

BeepIO=1;

delay(60);}

}

voidla2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(55);

BeepIO=1;

delay(55);}

}

voidsi2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(50);

BeepIO=1;

delay(50);}

}

voiddoo2()

{

uintx=150;

while(x--){

BeepIO=0;

delay(45);

BeepIO=1;

delay(45);}

}

voidDelay1ms(unsignedintcount)

{

unsignedinti,j;

for(i=0;i

for(j=0;j<120;j++);

}

//*****************************Music******************************************************

//生日快乐

unsignedcharcodeMusic_Girl[]={0x19,0x67,0x19,0x04,0x1A,0x02,0x19,0x02,0x15,0x02,

0x1B,0x01,0x19,0x67,0x19,0x04,0x1A,0x02,0x19,0x02,

0x20,0x02,0x1F,0x01,0x19,0x67,0x19,0x04,0x23,0x02,

0x21,0x02,0x1F,0x02,0x1B,0x0C,0x1A,0x02,0x18,0x67,

0x18,0x04,0x21,0x02,0x1F,0x02,0x20,0x02,0x1F,0x01,

0x00,0x00};

//一只哈巴狗

unsignedcharcodeMusic_Same[]={0x15,0x02,0x15,0x02,0x15,0x02,0x16,0x02,0x17,0x16,

0x17,0x02,0x17,0x02,0x17,0x02,0x18,0x02,0x19,0x16,

0x1A,0x02,0x1A,0x02,0x19,0x02,0x18,0x02,0x17,0x16,

0x19,0x02,0x19,0x02,0x16,0x03,0x17,0x03,0x15,0x16,

0x15,0x02,0x15,0x02,0x15,0x02,0x16,0x02,0x19,0x16,

0x17,0x02,0x17,0x02,0

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2