目录
资料下载地址:基于51单片机电子琴
一、项目介绍
1、使用7个独立按键对应7个音符
2、有高中低三个音阶,并有显示电路。
3、可以播放音乐
二、原理图
三、仿真
四、程序
部分代码
#include<reg51.h>
#include<intrins.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit SDA1=P0^2;//串行数据输入,对应595的14脚SER
sbit SCL1=P0^1;//移位寄存器时钟输入,对应595的11脚SCK
sbit SCL2=P0^0;//存储寄存器时钟输入,对应595的12脚RCK
sbit W1=P0^3;
sbit W2=P0^4;
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit D1=P2^6;//播放音乐模式
sbit D2=P2^7;//弹奏模式
sbit k8=P3^2;//功能切换键
sbit k9=P3^3;//低音
sbit k10=P3^4;//中音
sbit k11=P3^5;//高音
sbit beep=P2^2;//蜂鸣器接口
uchar code table4[]={
1,2,3,1,
1,2,3,1,
3,4,5,
3,4,5,
5,6,5,4,3,1,
5,6,5,4,3,1,
1,12/*低音5*/,1,
1,12,1
};
uchar code table5[]={
4,4,4,4,
4,4,4,4,
4,4,8,
4,4,8,
2,1,2,1,4,4,
2,1,2,1,4,4,
4,4,6,
4,4,6
};
uchar i;
uchar key,aa=0;
uchar bb,cc;
bit flag=0;
//延时子函数
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=340;y>0;y--);
}
void in(uchar Data)
{
uchar i;
for(i=0;i<8;i++) //循环8次,刚好移完8位
{
Data<<=1;
SCL1=CY;
SDA1=1; //先将移位寄存器控制引脚置为低
_nop_();
_nop_();
SDA1=0;
}
}
void out()
{
SCL2=0; //先将存储寄存器引脚置为低
_nop_();
SCL2=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
_nop_();
SCL2=0;
}
//初始化子函数
void yinjie()
{
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;
}
}
//播放音乐子函数
void display_music()
{
TH0=table2[table4[i]-1];
TL0=table3[table4[i]-1];
while(flag==0)
{
if(i<32)
{
TR0=1;
delay(57*table5[i]);
i++;
}
if(i==32)
{
i=0;
}
}
}
//演奏模式子函数
void display_play()
{
TR0=0;
TR1=0;
yinjie();
in(table1[aa]); //再传段码
out();
W1=0;;
delay(1); //延迟时间2ms以内
W1=1;
if(aa!=13&&flag==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();
}
}
}
}
//主函数
void main()
{
init();
while(1)
{
if(flag==0)
display_music();
else
display_play();
}
}