基于51单片机低中高音7键电子琴音乐播放器

基于51单片机电子琴音乐播放器

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.可以使用按键切换音乐播放模式和弹奏模式;

2.LED灯显示在使用哪种模式;

3.音乐播放模式播放音乐《两只老虎》;

4.弹奏模式可以切换低中高音;

5.数码管实时显示弹奏的音调;

​演示视频:

基于51单片机低中高音7键电子琴音乐播放器 

#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 table1[]={   
						0x3F,/*0*/
						0x06,/*1*/
						0x5B,/*2*/
						0x4F,/*3*/
						0x66,/*4*/
						0x6D,/*5*/
						0x7D,/*6*/
						0x07,/*7*/
						0x7F,/*8*/
						0x6F,/*9*/
						0x37,/*N*///中音	
						0x38,/*L*///低音
						0x76,/*H*///高音
						0x79 /*E*/
					};//共阴极数码管
uchar code table2[]={		 
						0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音
						0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位
						0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
                	};//音阶频率表 低八位
uchar code table3[]={		
						0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音
						0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位
						0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
					};
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 init()
{
	beep=0;
	D1=1;
	D2=0;
	EA=1;//开总中断
	TCON=0x01;//外部中断0设置为边沿触发
	EX0=1;//开外部中断0
	ET0=1;
	ET1=1;
	TMOD=0x11;//定时器0,1工作在定时状态,均为方式1
}
//数码管显示子函数
void display1()
{
	in(table1[aa]);  //再传段码
	out();
	W1=0;;
	delay(1);             //延迟时间2ms以内
	W1=1;
	in(table1[cc+1]);  //再传段码
	out();
	W2=0;
	delay(1);             //延迟时间2ms以内
	W2=1; 
}
//高低音选择子函数
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();	
			}
		}		
	}
}

硬件设计

使用元器件:

单片机:AT89C51;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

电阻 0.5欧;铝电解电容器 47uF;

74HC595驱动数码管模块;

晶振 12MHZ;瓷片电容器 30pF;

铝电解电容器 47uF;

发光二级管;蜂鸣器;

按键;单片机底座;

导线:若干;

结构图:

设计资料

01 仿真图

本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!

音乐模式

弹奏模式(低、中、高音)

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计报告

八千字设计报告,具体如下!

05 设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、pcb电路图,参考论文、元件清单等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

  • 34
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值