搜索
bottom↓
回复: 10

求教,杜洋的21键触摸电子琴。。。 有做过的吗?有问题。

[复制链接]

出0入0汤圆

发表于 2011-10-5 18:39:17 | 显示全部楼层 |阅读模式
最近看了杜洋的21键触摸电子琴,觉得挺有意思的。,。  于是拿着开发板模拟了一个,,,用的是STC12C5A60S2,   但是怎么调都不能达到杜洋的效果。
就是手触摸IO口连接的按键连上VCC就能发声。下面是程序
void INIT(void);
#include <reg52.h>
sfr P1M1=0x91;
sfr P1M0=0x92;
sfr P0M1=0x93;
sfr P0M0=0x94;
sfr P2M1=0x95;
sfr P2M0=0x96;
sfr P3M1=0xB1;
sfr P3M0=0xB2;
/*********************************************************************************************/
sbit SPEAKER  = P2^3;//扬声器
sbit KEY11          = P1^5;
sbit KEY12          = P1^4;
sbit KEY13          = P1^3;
sbit KEY14          = P1^2;
sbit KEY15          = P1^1;
sbit KEY16          = P1^0;
sbit KEY17          = P0^7;
sbit KEY21          = P0^2;
sbit KEY22          = P0^1;
sbit KEY23          = P0^0;
sbit KEY24          = P0^3;
sbit KEY25          = P0^4;
sbit KEY26          = P0^5;
sbit KEY27          = P0^6;
sbit KEY31          = P2^4;

sbit KEY33          = P2^2;
sbit KEY34          = P2^1;
sbit KEY35          = P2^0;
sbit KEY36          = P1^7;
sbit KEY37          = P1^6;
/*********************************************************************************************/
unsigned char MUSIC;
unsigned char STH0,STL0;
unsigned int code tab[]={ //音阶表
63628,63835,64021,64103,64260,64400,64524,  //低音1-7
64580,64684,64777,64820,64898,64968,65030,        //中音1-7
65058,65110,65157,65178,65217,65252,65283        //高音1-7
};


/*********************************************************************************************/
void delay1ms (unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
        unsigned int i;
        while( --a != 0){
                for(i = 0; i < 600; i++);
        }                                     
}/***************************************************************************************/
void INIT(void){//初始化程序
        TMOD=0x11;
        ET0=1;
        ET1=1;
        EA=1;
        P0M1 = 0xff;//I/O接口工作方式
        P0M0 = 0x00;//P0全为高阻输入
        P1M1 = 0xff;//高阻输入
        P1M0 = 0x00;
        P2M1 = 0xf7;//P2.3准双向,其他全为高阻输入
        P2M0 = 0x00;
        SPEAKER = 1;

}
/***************************************************************************************/
void main(void){
        INIT(); //初始化
        while(1){
               
                if(KEY37 == 1){delay1ms(20);if(KEY37 == 1){MUSIC = 20;}} //高音B(37)
                if(KEY36 == 1){delay1ms(20);if(KEY36 == 1){MUSIC = 19;}}
                if(KEY35 == 1){delay1ms(20);if(KEY35 == 1){MUSIC = 18;}}
                if(KEY34 == 1){delay1ms(20);if(KEY34 == 1){MUSIC = 17;}}
                if(KEY33 == 1){delay1ms(20);if(KEY33 == 1){MUSIC = 16;}}

                if(KEY31 == 1){delay1ms(20);if(KEY31 == 1){MUSIC = 14;}}
//3       
                if(KEY27 == 1){delay1ms(20);if(KEY27 == 1){MUSIC = 13;}}
                if(KEY26 == 1){delay1ms(20);if(KEY26 == 1){MUSIC = 12;}}
                if(KEY25 == 1){delay1ms(20);if(KEY25 == 1){MUSIC = 11;}}
                if(KEY24 == 1){delay1ms(20);if(KEY24 == 1){MUSIC = 10;}}
                if(KEY23 == 1){delay1ms(20);if(KEY23 == 1){MUSIC = 9;}}
                if(KEY22 == 1){delay1ms(20);if(KEY22 == 1){MUSIC = 8;}}
                if(KEY21 == 1){delay1ms(20);if(KEY21 == 1){MUSIC = 7;}}
//2       
                if(KEY17 == 1){delay1ms(20);if(KEY17 == 1){MUSIC = 6;}}
                if(KEY16 == 1){delay1ms(20);if(KEY16 == 1){MUSIC = 5;}}
                if(KEY15 == 1){delay1ms(20);if(KEY15 == 1){MUSIC = 4;}}
                if(KEY14 == 1){delay1ms(20);if(KEY14 == 1){MUSIC = 3;}}
                if(KEY13 == 1){delay1ms(20);if(KEY13 == 1){MUSIC = 2;}}
                if(KEY12 == 1){delay1ms(20);if(KEY12 == 1){MUSIC = 1;}}
                if(KEY11 == 1){delay1ms(20);if(KEY11 == 1){MUSIC = 0;}}
                 
                if(MUSIC != 0xff){ //如果有音阶数值(非0XFF时)
                    STH0=tab[MUSIC]/256; //将音阶的频率值装入定时器T0
                    STL0=tab[MUSIC]%256;
                    TR0=1; //启动定时器
                        MUSIC = 0xff; //清除寄存器
                }else{ //否则
                    SPEAKER = 1; //关扬声器
                        TR0=0; //关定时器
                }
    }
}
/***************************************************************************************/
void t0(void) interrupt 1 using 0{//定时器0产生音频
  TH0=STH0;
  TL0=STL0;
  SPEAKER=~SPEAKER; //取反频率产生音调
}



电路原理是一样的  ,,只不过我把IO口改了。

这个是杜洋的原理图
(原文件名:SCH_S.jpg)


有人做过吗?  指点指点吧

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-10-5 23:07:59 | 显示全部楼层
没人出过问题嘛?  汗

出0入0汤圆

发表于 2011-11-6 20:21:53 | 显示全部楼层
哥们 我做了 跟你一样 调整了I0口 一样的问题 也是用了60S2。。不知道你有情况了没

出0入0汤圆

发表于 2011-11-6 20:22:57 | 显示全部楼层
我QQ 76309696 可以指点下我。嘿嘿。

出0入0汤圆

发表于 2011-12-29 13:59:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-5-28 17:01:39 | 显示全部楼层
牛人!飘过

出0入0汤圆

发表于 2013-3-9 11:29:16 | 显示全部楼层
请教两个0.1pf的电容是干嘛用的啊,放哪,,还有为嘛没用三极管啊,,本人纯属业余,求解啊,

出0入0汤圆

发表于 2013-3-9 11:58:19 | 显示全部楼层
bulbul 发表于 2013-3-9 11:29
请教两个0.1pf的电容是干嘛用的啊,放哪,,还有为嘛没用三极管啊,,本人纯属业余,求解啊, ...

实心圈都接到GND上,空心圈都接到VCC上了

出0入0汤圆

发表于 2013-8-20 23:14:37 | 显示全部楼层
呵呵.........好像是i/o接口需要改一下哈...程序和电路图的接法不一样哦......

出0入0汤圆

发表于 2013-8-20 23:16:37 | 显示全部楼层
我想搞个MIDI键盘,不过好像是个大工程。

出0入0汤圆

发表于 2013-8-21 09:47:12 | 显示全部楼层
牛人,等楼主弄好了求分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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