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