毕业论文
您现在的位置: 电子琴 >> 电子琴优势 >> 正文 >> 正文

基于51单片机电子琴的设计附源码及论文

来源:电子琴 时间:2022/9/12
白癜风精细化诊疗 http://disease.39.net/bjzkbdfyy/171020/5778560.html

单片机最小系统

单片机最小系统

单片机最小系统说明:

时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。

时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。

一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。

单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。

数码管显示系统显示系统采用2位数码管来显示,LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示sP,即点),每个发光二极管的阳极连在一起,如图(图3-3)所示。这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。为方便起见,本文主要讨论共阴八段LED数码显示管,其他类形的显示管与其类似。

LED灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如H,G,F,E,D,C,B,A全亮显示为8,采用共阴极连接驱动代码,代码表如下表所示。

驱动代码表

数码管显示电路

按键输入模块

蜂鸣器电路模块

软件设计与分析该系统由延时子函数、初始化子函数、数码管显示子函数、高低音选择子函数、播放音乐子函数、演奏模式子函数、定时器0中断子函数、外部0中断子函数、定时器1中断子函数、主函数和数据定义这几部分组成。

各部分软件分析延时子函数//延时子函数

voiddelay(uintz)

{

uintx,y;

for(x=z;x0;x--)

for(y=;y0;y--);    

}

初始化子函数//初始化子函数

voidinit()

{

beep=0;

D1=1;

D2=0;

EA=1;//开总中断

TCON=0x01;//外部中断0设置为边沿触发

EX0=1;//开外部中断0

ET0=1;

ET1=1;

TMOD=0x11;//定时器0,1工作在定时状态,均为方式1

}

数码管显示子函数//数码管显示子函数

voiddisplay1()

{

in(table1[aa]);//再传段码

out();

W1=0;;

delay(1);//延迟时间2ms以内

W1=1;

in(table1[cc+1]);//再传段码

out();

W2=0;

delay(1);//延迟时间2ms以内

W2=1;

}

高低音选择子函数//高低音选择子函数

voidyinjie()

{

if(k10==0)

{  

delay(5);

if(k10==0)

{

aa=10;

bb=0;//返回10为seg[10]显示C

}

}

if(k9==0)

{  

delay(5);

if(k9==0)

{  

aa=11;

bb=1;//返回11为seg[11]显示L

}

}

if(k11==0)

{  

delay(5);

if(k11==0)

{  

aa=12;

bb=2;//返回12为seg[12]显示H

}

}

if(aa==0)

{

aa=13;

}

}

播放音乐子函数//播放音乐子函数

voiddisplay_music()

{  

TH0=table2[table4[i]-1];

TL0=table3[table4[i]-1];

while(flag==0)

{  

if(i32)

{

TR0=1;

delay(57*table5[i]);

i++;

}

if(i==32)

{

i=0;

}

}  

}

演奏模式子函数//演奏模式子函数

voiddisplay_play()

{

TR0=0;

TR1=0;

yinjie();

WE2=1;//关数码管2

WE1=0;//开数码管1

P0=table1[aa];

if(aa!=13flag==1)

{  

if(k1==0)

{  

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;  

while(k1==0)

{  

cc=0;

display1();

}

}

if(k2==0)

{  

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;

while(k2==0)

{  

cc=1;

display1();

}

}  

if(k3==0)

{    

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;

while(k3==0)

{  

cc=2;

display1();

}

}

if(k4==0)

{

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;

while(k4==0)

{  

cc=3;

display1();    

}

}

if(k5==0)

{  

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;

while(k5==0)

{

cc=4;

display1();

}

}

if(k6==0)

{  

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;

while(k6==0)

{

cc=5;

display1();              

}

}

if(k7==0)

{    

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

TR1=1;  

while(k7==0)

{

cc=6;

display1();  

}

}    

}

}

外部0中断子函数//外部0中断子函数

voidwb0()interrupt0

{

if(k8==0)

{

delay(5);

while(k8==0);

flag=~flag;

D1=~D1;

D2=~D2;

}    

}

定时器0中断子函数//定时器0中断子函数

voidt0()interrupt1

{  

TR0=0;

TH0=table2[table4[i]-1];

TL0=table3[table4[i]-1];

beep=~beep;

TR0=1;

}

3.2.9定时器1中断子函数

//定时器1中断子函数

voidt1()interrupt3

{  

TR1=0;

TH1=table2[7*bb+cc];

TL1=table3[7*bb+cc];

beep=~beep;

TR1=1;

}

3.2.10主函数

//主函数

voidmain()

{

init();

while(1)

{  

if(flag==0)

display_music();

else

display_play();

}

}

示例图:

下载:%77%77%77%2e%6c%61%6e%7a%6f%75%73%2e%63%6f%6d/%69%32%62%72%75%38%64

转载请注明:http://www.0431gb208.com/sjszjzl/1501.html