标题: 求指导 一个51单片机的简易电子琴程序,想自己编程学习一下 [打印本页]

作者: 指尖蝴蝶    时间: 2020-7-7 20:25
标题: 求指导 一个51单片机的简易电子琴程序,想自己编程学习一下
内容: 1、用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符 1,2,3,4,5,6,7, ;
2、键按下的时间长短表征节拍的长短;
3、用蜂鸣器发出声音;
4、点阵实时动态显示音符高低(自由显示)。要求:1、根据设计内容,设计系统硬件结构,画出系统流程图。2、应用Keil、Proteus软件开发应用系统并仿真调试。
作者: 热污染翁热无    时间: 2020-7-7 20:25
用Proteus8.8打开,代码里里面也有,楼主可以参考学习一下

51hei.png (29.2 KB, 下载次数: 152)

51hei.png

简易电子琴.zip

47.1 KB, 下载次数: 40, 下载积分: 黑币 -5


作者: 热污染翁热无    时间: 2020-8-25 13:38
#include "reg51.h"
#define uint unsigned int
#define uchar unsigned char
#define KEYPORT P1
#define SMGPORT P0
#define delayValue 15//延时
sbit buzzer=P2^3;
uint value=0;
uchar code dis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管
uint  code tone[8]={0xfc44,0xfcac,0xfd09,0xfd34,0xfd82,0xfdc8,0xfe06,0xfe22};//音色
uchar code button_Sel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//按键执行,0有效
void Button_Scan(void);
void Handler(void);
void delay_ms(uint k);
void delay_ms(uint k)
{
        uint j=0,i=0;
        for(j=0;j<k;j++)
                for(i=0;i<118;i++);
}

void Button_Scan(void)
{       
        KEYPORT=0xff;//给按键高电平
        if(KEYPORT==button_Sel[0])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[0])
                {
                        value=tone[0];//播放音节
                        SMGPORT=dis[1];//数码管亮1
                }
        }
        if(KEYPORT==button_Sel[1])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[1])
                {
                        value=tone[1];
                        SMGPORT=dis[2];
                }
        }
        if(KEYPORT==button_Sel[2])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[2])
                {
                        value=tone[2];
                        SMGPORT=dis[3];
                }
        }
        if(KEYPORT==button_Sel[3])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[3])
                {
                        value=tone[3];
                        SMGPORT=dis[4];
                }
        }
        if(KEYPORT==button_Sel[4])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[4])
                {
                        value=tone[4];
                        SMGPORT=dis[5];
                }
        }
        if(KEYPORT==button_Sel[5])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[5])
                {
                        value=tone[5];
                        SMGPORT=dis[6];
                }
        }
        if(KEYPORT==button_Sel[6])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[6])
                {
                        value=tone[6];
                        SMGPORT=dis[7];
                }
        }
        if(KEYPORT ==button_Sel[7])
        {
                delay_ms(delayValue);
                if(KEYPORT==button_Sel[7])
                {
                        value=tone[7];
                        SMGPORT=dis[8];
                }
        }
}

void Handler(void)
{
        if(KEYPORT==0xff)
        {
                P2=0xff;
                TR1=0;
                buzzer=1;//蜂鸣器响
        }
        else          
        {
                TR1=1;
        }
}

void main(void)
{
        ET1=1;
        TMOD |=0x10;//使用定时器T1的模式1
        TH1=(65536-500)/256;//取初值的高八位数
        TL1=(65536-500)%256;//取初值的底八位数
        P0=0x00;
        EA=1;
        while(1)
        {
       
          Button_Scan();//按键扫描函数
          Handler();
                  
        }

}

void Time1_Handler(void) interrupt 3 using 1
{
        buzzer=~buzzer; //取反
        TH1=value/256;
        TL1=value%256;
}



作者: qinkang189    时间: 2022-4-4 15:58
你好!如果我需要按下一个按键,响三个音,音的间隔为0.5S该怎么改呢?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1