基于51单片机的液晶显示的简易电子琴(源代码+仿真)

基于51单片机的液晶显示的简易电子琴(源代码+仿真)_第1张图片

 

通过矩阵键盘,放大电路,复位电路,晶振电路,功能选择电路,LCD显示电路构成

 

以下是部分代码 。


void main(void) //主函数
{ 
	LED1=0;  
	LED2=0; 

	IE=0x87;  //定义外部中断控制器
	TMOD=0x01;  //定义定时器0工作方式1
	IT0=1; 
	IT1=1; 
	lcd_init(); 
	init_play(); 
	while(1) 
	{ 
	    P1=0xf0; 
		if((P1&0xf0)!=0xf0) //判断 P1 口是否有变化
		{
	   		 anjian(); //读取键值
			 if(Mode==0) //如果是弹奏模式
			 {  
				S_TH0 = tab[k]/256; 
				S_TL0 = tab[k]%256; //根据 k 的值赋初值给 T0
				TR0 = 1; //打开定时器用于定时产生频率发生
				wr_com(0x89); 
				wr_dat(0x30+k/10); 
				wr_dat(0x30+k%10); 
				while ((P1&0xf0)!=0xf0); //按键不松开的话, T0 就一直产生频率
				TR0=0; //按键松开后关闭 T0 计时,频率停止
		  	 } 
			 else  //如果是播放模式(上面的 if 语句不成立就执行 else)
			 { 
				while (Mode==1) //进入播放模式
				{ 
					if(Song[k][Tone_Number]==-1) 
					{
						Tone_Number=0; 
						break; 
					} 
					wr_com(0x89); 
					wr_dat(0x30+Song[k][Tone_Number]/10); 
					wr_dat(0x30+Song[k][Tone_Number]%10); 
					S_TH0=(tab[Song[k][Tone_Number]])/256; 
					S_TL0=(tab[Song[k][Tone_Number]])%256; 

					TR0 = 1; //打开定时器定时开关
					delay1(300*Beat[k][Tone_Number]); //节拍数组延
					Tone_Number++; //变量加准备播放下一个音符
					TR0 = 0; //停止定时器
					anjian(); //扫描按键
					while((P1&0xf0)!=0xf0); 
				} 
		     } 
	      } 
     } 
} 
void EXO_IXT() interrupt 0 //外部中断 0
{ 		unsigned char j; 
		Mode=0; //弹奏模式
		LED1=1; 
		LED2=0;  //点亮弹奏模式指示灯
		Tone_Number=0;
		wr_com(0x01); 
		wr_com(0x80); 
		for(j=0;j<16;j++) 
		{
		   wr_dat(num_1[j]);
		} 
	
} 
void EX1_INT() interrupt 2 //外部中断 1
{ 
    unsigned char j; 
	Mode=1; //播放模式
	LED1=0;  
	LED2=1;
	wr_com(0x01);  
	wr_com(0x80); 
	for(j=0;j<16;j++) 
	{
	   wr_dat(num_2[j]);
	} 
} 
void time0_int(void) interrupt 1 using 0 //定时器 0
{	
	TH0 = S_TH0; //定时器赋初值
	TL0 = S_TL0; 
	SPKER=!SPKER; //喇叭引脚取反,产生频率的音乐
} 

基于51单片机的液晶显示的简易电子琴(源代码+仿真)_第2张图片

基于51单片机的液晶显示的简易电子琴(源代码+仿真)_第3张图片

哈哈哈哈哈哈,由于封装没画好,下图为惨烈的教训。

 

基于51单片机的液晶显示的简易电子琴(源代码+仿真)_第4张图片

链接:https://pan.baidu.com/s/1XhrUQqFtyu_Le3-jeH0SVQ   提取码:yi6o 
 

你可能感兴趣的:(51单片机)