生产实习报告单片机电子琴.docx
《生产实习报告单片机电子琴.docx》由会员分享,可在线阅读,更多相关《生产实习报告单片机电子琴.docx(31页珍藏版)》请在冰豆网上搜索。
![生产实习报告单片机电子琴.docx](https://file1.bdocx.com/fileroot1/2023-4/19/e28b9722-f055-4529-aa5f-8df3443f76f4/e28b9722-f055-4529-aa5f-8df3443f76f41.gif)
生产实习报告单片机电子琴
生产实习报告--单片机电子琴
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;ifor(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