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


一、基本功能

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

二、原理图

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

三、程序

1.头文件及相关定义

代码如下:

#include <reg51.h>
#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
		}
	}
}


四、实验结果

在这里插入图片描述
实验调试结果如下:
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

  • 7
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,基于at89c51proteus仿真是一种电路仿真技术,可以模拟at89c51单片机的工作状态,以便进行电路设计和调试。通过proteus仿真,可以快速验证电路的正确性和稳定性,减少实际制作的成本和时间。同时,proteus仿真还可以进行电路参数分析和优化,提高电路性能和可靠性。 ### 回答2: AT89C51是一种常用的单片机芯片,它具有许多优点,例如:易于编程、成本低廉、功耗低等。在使用AT89C51芯片进行实验时,我们可以使用Proteus仿真来验证我们的电路设计是否正确。下面,我们来谈一下基于AT89C51Proteus仿真的相关内容。 首先,我们需要了解AT89C51芯片的结构和外接器件的作用。AT89C51是一个具有40个引脚的芯片,其中有许多引脚是用于接口的。在Proteus中,我们需要添加一个芯片模型,并将其与外空模型相连接,以便控制控制器与其他电路部分的交互。 其次,我们需要为芯片程序编写代码。在Proteus中,我们可以使用Keil IDE来编写程序,并且可以使用Proteus将程序加载到芯片模型中,以检查是否有语法错误或逻辑错误。同时,我们可以通过仿真来观察CPU的操作,并且可以通过断点来观察每个步骤执行的结果。 然后,我们需要为芯片模型添加一些组件,例如LCD显示屏、LED、继电器等。我们可以通过添加这些组件来模拟从AT89C51控制的外设,以确保我们的电路设计与预期的操作一致。 最后,在Proteus中,我们可以使用虚拟示波器来监视芯片的输入和输出信号,并观察芯片的行为。这对于调试电路非常重要。如果出现问题,我们需要观察输入和输出信号,以便找出并修复错误。 综上所述,Proteus仿真是一种优秀的电路设计工具,可以大大地简化AT89C51控制器的电路设计和调试,并减少实验时间和成本。在仿真时,我们可以快速验证电路设计的正确性,并修正错误。总之,使用Proteus仿真之前,必须要有充分的技术储备,技术先进程度不一,会直接影响到仿真的准确性和可靠性。 ### 回答3: AT89C51是一种8位微处理器,具有高性能和低功耗的特点,被广泛用于嵌入式系统、工控设备、汽车电子等领域。Proteus是一种虚拟电路设计软件,可以进行电子电路的仿真、布线和调试,是学习嵌入式系统和数字电路的必备工具。基于AT89C51Proteus仿真可以帮助学生深入了解AT89C51的工作原理和应用场景,同时也能让学生获得一定的电路设计和仿真经验。 首先,我们需要了解AT89C51的基本模块和工作原理。AT89C51主要由中央处理器、存储器、输入输出接口等模块组成,可以通过编程实现各种功能。AT89C51的工作模式包括中断、定时器、串口通信等,可以根据不同的应用场景进行选择。在Proteus中,我们可以通过添加AT89C51芯片及其外围电路、LED等组件来进行仿真,调试程序并查看输出结果。 其次,我们需要学习如何编写AT89C51程序,并进行仿真。编写程序需要理解AT89C51的指令集、寄存器和内存布局等,可以使用Keil C51等软件进行编写,并通过下载器将程序下载到AT89C51芯片中。在Proteus中,我们可以通过添加自定义程序文件的方式进行仿真,并查看程序的运行结果。 最后,我们需要进行电路的仿真调试,找出可能存在的问题并加以解决。调试过程中可以利用Proteus提供的调试功能和实时监测器,查看电路的电压、电流、波形等参数,并根据仿真结果进行修改和优化。通过反复的调试和优化,可以使电路的性能达到最佳状态。 综上所述,基于AT89C51Proteus仿真是学习嵌入式系统和数字电路的重要方式之一,可以帮助学生深入了解AT89C51的工作原理和应用场景,提高电路设计和调试能力,为未来的工程实践打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值