基于AT89C51的多音乐播放器Proteus仿真实验

文章目录

  • 一、基本功能
  • 二、原理图
  • 三、程序
    • 1.头文件及相关定义
    • 2.主函数
  • 四、实验结果
  • 总结


一、基本功能

开机后顺序播放曲目,曲目序号数码管显示;
设置单曲循环按键,按下时单曲循环,释放时接续顺序播放;
节拍时间实现方式,下发任务时分别指定基于定时器或软件延时实现;
设计选歌,暂停功能。电路工作时任意时刻,都可进入选歌状态(外部中断控制),指示灯阵列显示同步响应;
电子琴按键及显示,通过按钮或开工选择进入电子琴模式,按下矩阵键盘按键,数字键1到7,产生低音1到7。同时数码管显示当前音符;

二、原理图

系统采用AT89C51作为系统主控。
单片机P0口连接指示灯,能够反馈系统运行模式及音乐播放模式;
P1口连接矩阵按键,能够判断矩阵按键的按下松开;
P2口连接数码管,数码管共阴极连接,显示正在播放音乐的序号;
通过一个四输入与门判断是否开启中断;
P3.7口控制蜂鸣器发声。
基于AT89C51的多音乐播放器Proteus仿真实验_第1张图片

三、程序

1.头文件及相关定义

代码如下:

#include 
#include "SoundPlay.h"

uchar Run_Mode=1; //运行模式/电子音0/放音乐1
uchar Break_Flag=0; //退出标志位
uchar Key_Pushdown=0; //按键按下标志位
char  Number=0; //按下按键标号
uchar Music_Select=0; //选择歌曲
uchar Music_Mode=0; //音乐播放模式/循环0/单曲1
uchar Music_Number=1; //正在播放的音乐序号
uchar Tone_High=0; //音高

void exint0_INIT(); //中断
uchar Keys_Scan(char* number); //按键扫描
void Delay1ms(unsigned int count); //延时


sbit CS1 = P0^0;//指定歌曲指示灯
sbit CS2 = P0^1;//电子音指示灯
sbit CS3 = P0^2;//放音乐指示灯
sbit CS4 = P0^3;//顺序播放指示灯
sbit CS5 = P0^4;//单曲循环指示灯

#define uchar unsigned char
#define uint unsigned int

//共阳数码管编码表
uchar code table1[] =
{0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

//共阴数码管编码表	 
uchar code table2[] =
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

2.主函数

代码如下:

/********************主函数*****************/
void main()
{
    P2=0x00;
	exint0_INIT();
	InitialSound();
	CS2=0;

	while(1)
	{
		
    if(Run_Mode==1) //放音乐模式
		{	//曲目选择
			EX0=1; //外部中断0 使能
			CS2=1; //电子音指示灯灭
			CS3=0; //放音乐指示灯亮
			CS4=0; //顺序播放指示灯亮

			 

		    if(Music_Select==0 && Music_Number==1) //播放第1首
			   {P2 = table2[Music_Number];
			   Play(Music_Girl,0,Tone_High,360);
			   		if(Music_Mode==0)
					{ Music_Number++;}
				}

			else if(Music_Select==0 && Music_Number==2) //播放第2首
			  {P2 = table2[Music_Number];
			  Play(Music_Same,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}
			  
			else if(Music_Select==0 && Music_Number==3)	//播放第3首
			  {P2 = table2[Music_Number];
			  Play(Music_Two,0,Tone_High,360);}
			  
			else if(Music_Select==0 && Music_Number==4)	//播放第4首
			  {P2 = table2[Music_Number];
			  Play(Music_Tiger,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}
			  
			else if(Music_Select==0 && Music_Number==5)	//播放第5首
			  {P2 = table2[Music_Number];
			  Play(Music_Xing,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}
			 
			else if(Music_Select==0 && Music_Number==6)	//播放第6首
			  {P2 = table2[Music_Number];
			  Play(Music_Cong,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}

			else if(Music_Select==0 && Music_Number==7)	//播放第7首
			  {P2 = table2[Music_Number];
			  Play(Music_Nian,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}
			  
			else if(Music_Select==0 && Music_Number==8)	//播放第8首
			  {P2 = table2[Music_Number];
			  Play(Music_Ri,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}
			  
			else if(Music_Select==0 && Music_Number==9)	//播放第9首
			  {P2 = table2[Music_Number];
			  Play(Music_Tong,0,Tone_High,360);
			  		if(Music_Mode==0)
					{ Music_Number++;}}
			  		   
			
				if(Music_Number>9)
				{
					Music_Number=1;
				}
			
		}
	else
		{
		  Key_Pushdown=Keys_Scan(&Number);
		

	    if(Key_Pushdown==1)	//有按键按下
			{					  
			  Key_Pushdown=0; //按键按下标志位复位

				if(Number==4) //按键按下4 放音乐模式
				{
					Run_Mode=1;	//放音乐
					EX0=1; //外部中断0 使能
					CS2=1; //电子音指示灯灭
			   		CS3=0; //放音乐指示灯亮
					CS4=0; //顺序播放指示灯亮
				}			  
				if(Number==15)	//音符1
				{
				  Sound_Temp_TH0  = (65535-1000000/262)/256;   //音符定时器
		 	    Sound_Temp_TL0  = (65535-1000000/262)%256;
				}
				else if(Number==14)	//音符2
				{
				  Sound_Temp_TH0  = (65535-1000000/294)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/294)%256;					
				}
				else if(Number==13)	//音符3
				{
				  Sound_Temp_TH0  = (65535-1000000/330)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/330)%256;					
				}
				else if(Number==12)	//音符4
				{
				  Sound_Temp_TH0  = (65535-1000000/369)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/369)%256;					
				}
				else if(Number==11)	//音符5
				{
				  Sound_Temp_TH0  = (65535-1000000/415)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/415)%256;					
				}
				else if(Number==10)	//音符6
				{
				  Sound_Temp_TH0  = (65535-1000000/466)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/466)%256;					
				}
				else if(Number==9) //音符7
				{
				  Sound_Temp_TH0  = (65535-1000000/500)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/500)%256;					
				}
				else if(Number==8) //音符8
				{
				  Sound_Temp_TH0  = (65535-1000000/600)/256;
		 	    Sound_Temp_TL0  = (65535-1000000/600)%256;					
				}
				if(Number>=8)
				  TR0=1; //定时器启动位 开启定时器
			}
			else
			{
				TR0=0;
			}

			P1=0xF0; //1111 0000
		}
	}
}


四、实验结果

基于AT89C51的多音乐播放器Proteus仿真实验_第2张图片
实验调试结果如下:
1)开机后实现顺序播放曲目,曲目序号数码管显示;
2)设置单曲循环按键,实现按下时单曲循环,释放时接续顺序播放;
3)下发任务时分别指定基于定时器或软件实现延时;
4)实现9种选歌及暂停功能。实现电路工作时任意时刻,都可进入选歌状态(外部中断控制),指示灯阵列显示同步响应;
5)实现电子琴按键及数码管对应显示,通过按钮选择进入电子琴模式,按下矩阵键盘按键,数字键1到7,产生低音1到7。同时数码管显示当前音符。


总结

资源获取:https://download.csdn.net/download/weixin_51306846/87120580?spm=1001.2014.3001.5501
或者
https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.621e3d0dEwkjCO&ft=t&id=693303725859

你可能感兴趣的:(c语言,51单片机,单片机)