kalimba - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 kalimba

简介:本项目通过51单片机配合鼠标按键和蜂鸣器,制作了一个简单的卡林巴电子琴,一共13个琴键,可以演奏很多音乐。

开源协议: MIT

(未经作者授权,禁止转载)

创建时间: 2021-04-26 18:46:07
更新时间: 2022-11-03 15:19:34
描述

项目渲染图:

 

kPFJdxuFH6RQoBumGvChZKFtTFa4lDxWQO82W3vA.png

 

软件源代码

 

 

#include "stc15.h"

#define     MAIN_Fosc       24000000   //时钟频率24M

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

sbit  P_PWM = P1^4;    //PWM引脚

u16    PWM_high;

void Pin_Init()
{
    P1 = P3 = P5 = 0xff;
    P_PWM = 0;
    P1M1 &= ~(1 << 4);
    P1M0 |=  (1 << 4);
}


u16 cur_tune = 0; //用来记录当前频率

void PWM_SetTune(u16 tune)
{
    cur_tune = tune;
    if(tune == 0)
    {
        TR0 = 0;
        PT0 = 0;
        TMOD = 00;
        TMOD = 0;
        INT_CLKO =  0;
        P1M0 = 0;
        P_PWM = 0;
    }
    else
    {
        EA = 0;
        PT0 = 1;
        P1M0 |=  (1 << 4);

        TR0 = 0;
        PT0 = 1;
        TMOD &= ~0x03;
        TMOD &= ~0x04;
        INT_CLKO |=  0x01;

        PWM_high =65535UL -  1000000UL/tune;
        TH0 = (u8)(PWM_high >> 8);
        TL0 = (u8)PWM_high;
        TR0 = 1;
    }
}

char last_value[13]= {1,1,1,1,1,1,1,1,1,1,1,1,1}; //记录13个按键上次的按键值
char now_value[13] = {1,1,1,1,1,1,1,1,1,1,1,1,1}; //记录13个按键当前的按键值

//每个按键对应的频率,采用的是五声音接
u16 tune[13] = {262, 294, 330,392,440,523, 587, 660,784,880, 1046,1174,1318};

void main()
{
    int i = 0;
    Pin_Init();
    PWM_SetTune(0);

    while (1)
    {
        now_value[0] = P10;
        now_value[1] = P37;
        now_value[2] = P11;
        now_value[3] = P36;
        now_value[4] = P12;
        now_value[5] = P33;
        now_value[6] = P13;
        now_value[7] = P32;
        now_value[8] = P15;
        now_value[9] = P31;
        now_value[10] = P54;
        now_value[11] = P30;
        now_value[12] = P55;

        for(i=0; i<13; i++)
        {
            if(last_value[i] != now_value[i]) //
            {
                if(now_value[i] == 0)
                {
                    PWM_SetTune(tune[i]);
                }
                else if (cur_tune == tune[i])
                {
                    PWM_SetTune(0);
                }
                last_value[i] = now_value[i];
            }
        }

        if( (last_value[0] == 1) &&
            (last_value[1] == 1) &&
            (last_value[2] == 1) &&
            (last_value[3] == 1) &&
            (last_value[4] == 1) &&
            (last_value[5] == 1) &&
            (last_value[6] == 1) &&
            (last_value[7] == 1) &&
            (last_value[8] == 1) &&
            (last_value[9] == 1) &&
            (last_value[10] == 1) &&
            (last_value[11] == 1) &&
            (last_value[12] == 1))
        {
            PWM_SetTune(0);
        }
    }
}

 

设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
工程视频/附件
暂无
工程成员
侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP