【51单片机】【protues仿真】基于51单片机矩阵电子琴系统
目录
一、主要功能
二、使用步骤
三、硬件资源
四、软件设计
五、实验现象
一、主要功能
1、数码管显示
2、矩阵按键和独立按键
3、蜂鸣器模块进行播放
4、内置16首歌曲
5、LED灯显示当前模式
二、使用步骤
本项目采用51单片机、矩阵键盘(4×4或更大)、蜂鸣器/扬声器输出模块,部分设计扩展了数码管用于音阶和模式显示。矩阵键盘作为琴键输入,通过行列扫描检测按键触发,蜂鸣器通过定时器中断生成不同频率的音频信号。
三、硬件资源
1、51单片机核心模块
2、矩阵按键模块
3、独立按键模块
4、蜂鸣器模块
5、LED灯模块
6、数码管显示模块
四、软件设计
#include <reg51.h>
#include <absacc.h>
#include <stdio.h>
#include <math.h> //头文件
#define uchar unsigned char
#define uint unsigned int //宏定义
uchar STH0;
uchar STL0;
bit FY=0;
uchar Song_Index=0,Tone_Index=0;
uchar k, key;
sbit SPK=P3^7 ;
sbit LED1=P3^5;
sbit LED2=P3^4;
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0xa3,0x8c,0xc8};
unsigned char code num1[]= " Music: ";
uchar code Song[][100]=
{
{12,10,9,9,10,8,9,10,
12,10,9,9,5,10,11,10,
10,10,14,10,9,8,7,8,
9,10,13,6,8,10,9,6,
8,7,5,6,12,10,9,9,
9,10,8,9,10,12,10,9,
9,9,5,10,11,10,10,10,
14,10,9,8,7,8,9,10,
13,6,8,10,9,6,8,7,
5,6,-1},
{13,12,10,12,15,13,
12,13,10,12,13,12,10,8,6,12,
10,9,9,10,12,12,13,10,9,
8,12,10,9,8,6,8,5,-1},
{10,10,11,10,9,8,9,12,9,9,
8,8,9,8,7,6,7,10,7,7,
6,9,10,9,8,6,5,9,10,9,
8,6,6,9,10,9,8,6,7,8,-1},
{5,3,5,8,6,8,
5,5,1,2,3,2,1,2,5,
3,5,8,7,6,8,5,5,2,
3,4,0,1,6,8,8,7,6,
7,8,6,7,8,6,6,5,3,
1,2,5,3,5,8,7,6,8,
5,5,2,3,4,0,1,-1},
{5,6,8,6,6,5,6,5,3,5,
5,6,8,6,6,5,6,5,6,1,
1,2,3,2,2,2,1,2,1,6,
3,2,5,6,8,6,6,5,6,5,
6,1,1,2,3,4,4,5,6,6,
5,6,8,6,8,6,5,5,1,6,
5,5,6,8,3,2,3,1,-1},
{5,9,10,9,10,12,13,12,8,9,
10,13,12,10,12,12,13,15,13,12,
10,12,10,8,9,10,8,6,10,9,
12,9,10,9,10,12,13,12,8,9,
10,13,12,12,13,15,13,
12,10,12,10,8,6,10,9,8,6,
8,9,9,8,-1},
{5,8,9,10,9,10,11,12,12,12,
11,10,9,5,8,9,10,11,12,12,
12,13,12,9,10,8,8,6,9,9,
10,10,8,12,8,12,8,7,8,8,6,
9,9,10,10,12,12,
12,13,12,9,10,8,
5,8,9,10,9,10,11,12,12,12,
11,10,9,5,8,9,10,9,10,11,
12,12,12,9,10,8,8,6,9,9,
10,10,8,12,8,12,12,7,8,-1},
{8,9,10,8,8,9,10,8,10,11,12,10,11,12,
12,13,12,11,10,8,12,13,12,11,10,8,8,5,8,8,5,8,-1},
void delay1 (uint ms)
{
uchar t;
while (ms--)
for(t=0;t<120;t++);
}
void delay(void)
{
uchar i;
for (i=300;i>0;i--);
}
void main(void)
{
SPK=0;
LED1=1;
LED2=0;
P0=0xc0;
IE=0x87;
TMOD=0x01;
IT0=1;
IT1=1;
while(1)
{
anjian();
}
五、实验现象
演示视频: