找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1277|回复: 0
收起左侧

基于单片机的电子琴 stc89c52

[复制链接]
ID:678816 发表于 2020-1-21 14:47 | 显示全部楼层 |阅读模式
/*
实验说明:
       
实验接线:
        1,静态数码管模块-->单片机管脚
        参考静态数码管显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
        2,矩阵按键模块-->单片机管脚
        参考矩阵按键实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
        3,蜂鸣器模块-->单片机管脚
        BEEP-->P20
       
实验现象:
        按下不同键,蜂鸣器发出不同声音,同时静态数码管上显示键值,这里仅仅是一个简单的调声程序,大家如要
        设计与实际电子琴功能,还需优化。
*/

#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit beep=P2^0;
#define GPIO_KEY P1

u8 KeyValue;        //用来存放读取到的键值
u8 value;
u8 smg[16]={~0x3F, ~0x06, ~0x5B, ~0x4F, ~0x66, ~0x6D, ~0x7D, ~0x07,
             ~0x7F, ~0x6F, ~0x77, ~0x7C, ~0x39, ~0x5E, ~0x79, ~0x71}; //0~A
void delay(u16 i)
{
        while(i--);
}
void KEY_Scan(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//读取按键是否按下
        {
                delay(1000);//延时10ms进行消抖
                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
                {       
                        //测试列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=1;break;
                                case(0X0b):        KeyValue=2;break;
                                case(0X0d): KeyValue=3;break;
                                case(0X0e):        KeyValue=4;break;
                        }
                        //测试行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
                        {
                                delay(1000);
                                a++;
                        }
                }
        }
}

void sound()
{
        u16 i=200;
        if(KeyValue==1)
        {
                KeyValue=0;
                P0=smg[0];
                while(i--)
                {
                        beep=~beep;                 //低音1
                        delay(380);
                }
               
        }

        if(KeyValue==2)
        {
                KeyValue=0;
                P0=smg[1];
                while(i--)
                {
                        beep=~beep;           //低音2
                        delay(341);
                }
               
        }

        if(KeyValue==3)
        {
                KeyValue=0;
                P0=smg[2];
                while(i--)
                {
                        beep=~beep;          //低音3
                        delay(303);
                }
        }

        if(KeyValue==4)
        {
                KeyValue=0;
                P0=smg[3];
                while(i--)
                {
                        beep=~beep;          //低音4
                        delay(286);
                }
        }

        if(KeyValue==5)
        {
                KeyValue=0;
                P0=smg[4];
                while(i--)
                {
                        beep=~beep;          //低音5
                        delay(255);
                }
        }

        if(KeyValue==6)
        {
                KeyValue=0;
                P0=smg[5];
                while(i--)
                {
                        beep=~beep;                //低音6
                        delay(227);
                }
        }

        if(KeyValue==7)
        {
                KeyValue=0;
                P0=smg[6];
                while(i--)
                {
                        beep=~beep;           //低音7
                        delay(203);
                }
        }

        if(KeyValue==8)
        {
                KeyValue=0;
                P0=smg[7];
                while(i--)
                {
                        beep=~beep;                //中音1
                        delay(191);
                }
        }

        if(KeyValue==9)
        {
                KeyValue=0;
                P0=smg[8];
                while(i--)
                {
                        beep=~beep;           //中音2
                        delay(170);
                }
        }

        if(KeyValue==10)
        {
                KeyValue=0;
                P0=smg[9];
                while(i--)
                {
                        beep=~beep;           //中音3
                        delay(152);
                }
        }

        if(KeyValue==11)
        {
                KeyValue=0;
                P0=smg[10];
                while(i--)
                {
                        beep=~beep;           //中音4
                        delay(143);
                }
        }

        if(KeyValue==12)
        {
                KeyValue=0;
                P0=smg[11];
                while(i--)
                {
                        beep=~beep;           //中音5
                        delay(128);
                }
        }

        if(KeyValue==13)
        {
                KeyValue=0;
                P0=smg[12];
                while(i--)
                {
                        beep=~beep;                //中音6
                        delay(114);
                }
        }

        if(KeyValue==14)
        {
                KeyValue=0;
                P0=smg[13];
                while(i--)
                {
                        beep=~beep;                //中音7
                        delay(101);
                }
        }

        if(KeyValue==15)
        {
                KeyValue=0;
                P0=smg[14];
                while(i--)
                {
                        beep=~beep;                //高音1
                        delay(96);
                }
        }

        if(KeyValue==16)
        {
                KeyValue=0;
                P0=smg[15];
                while(i--)
                {
                        beep=~beep;          //高音2
                        delay(85);
                }
        }
}
void time0init()
{
        TMOD=0X01;
        TH0=0XFc;
        TL0=0X18;
        TR0=1;
        ET0=1;
        EA=1;
}
void main()
{
        time0init();
        while(1);               
}
void tim0() interrupt 1
{
        TH0=0XFc;
        TL0=0X18;
        KEY_Scan();
        sound();               
}

基于单片机的智能电子琴设计.zip

17.48 KB, 下载次数: 11, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表