新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 22. 電子琴

        22. 電子琴

        作者: 時間:2016-11-18 來源:網絡 收藏
        1.實驗任務
        (1.由4X4組成16個按鈕矩陣,設計成16個音。
        (2.可隨意彈奏想要表達的音樂。
        2.電路原理

        圖4.22.1
        3.系統板硬件連線
        (1.把“單片機系統”區域中的P1.0端口用導線連接到“音頻放大模塊”區域中的SPKIN端口上;
        (2.把“單片機系統“區域中的P3.0-P3.7端口用8芯排線連接到“4X4行列式鍵盤”區域中的C1-C4R1-R4端口上;
        4.相關程序內容
        (1.4X4行列式鍵盤識別;
        (2.音樂產生的方法;
        一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。現在以單片機12MHZ晶振為例,例出高中低音符與單片機計數T0相關的計數值如下表所示
        音符
        頻率(HZ)
        簡譜碼(T值)

        音符
        頻率(HZ)
        簡譜碼(T值)
        低1DO
        262
        63628
        #4FA#
        740
        64860
        #1DO#
        277
        63731
        中5SO
        784
        64898
        低2RE
        294
        63835
        #5SO#
        831
        64934
        #2RE#
        311
        63928
        中6LA
        880
        64968
        低3M
        330
        64021
        #6
        932
        64994
        低4FA
        349
        64103
        中7SI
        988
        65030
        #4FA#
        370
        64185
        高1DO
        1046
        65058
        低5SO
        392
        64260
        #1DO#
        1109
        65085
        #5SO#
        415
        64331
        高2RE
        1175
        65110
        低6LA
        440
        64400

        #2RE#
        1245
        65134
        #6
        466
        64463
        高3M
        1318
        65157
        低7SI
        494
        64524
        高4FA
        1397
        65178
        中1DO
        523
        64580
        #4FA#
        1480
        65198
        #1DO#
        554
        64633
        高5SO
        1568
        65217
        中2RE
        587
        64684
        #5SO#
        1661
        65235
        #2RE#
        622
        64732
        高6LA
        1760
        65252
        中3M
        659
        64777
        #6
        1865
        65268
        中4FA
        698
        64820
        高7SI
        1967
        65283
        下面我們要為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數據
        低音0-19之間,中音在20-39之間,高音在40-59之間
        TABLE:DW0,63628,63835,64021,64103,64260,64400,64524,0,0
        DW0,63731,63928,0,64185,64331,64463,0,0,0
        DW0,64580,64684,64777,64820,64898,64968,65030,0,0
        DW0,64633,64732,0,64860,64934,64994,0,0,0
        DW0,65058,65110,65157,65178,65217,65252,65283,0,0
        DW0,65085,65134,0,65198,65235,65268,0,0,0
        DW0
        2、音樂的音拍,一個節拍為單位(C調)
        曲調值
        DELAY

        曲調值
        DELAY
        調4/4
        125ms

        調4/4
        62ms
        調3/4
        187ms

        調3/4
        94ms
        調2/4
        250ms

        調2/4
        125ms
        對于不同的曲調我們也可以用單片機的另外一個定時/計數器來完成。
        下面就用AT89S51單片機產生一首“生日快樂”歌曲來說明單片機如何產生的。
        在這個程序中用到了兩個定時/計數器來完成的。其中T0用來產生音符頻率,T1用來產生音拍。
        5.程序框圖
        開始

        行列式鍵盤按鍵按下成功否?

        識別按鍵功能

        根據按鍵功能,裝入音符T值到T0中

        啟動T0工作

        行列式鍵盤按鍵釋放成功否?

        停止T0工作

        T0初始化并開中斷允放T0中斷


        T0中斷入口

        重裝TH0,TL0初值

        P1.0取反

        中斷返回

        圖4.22.2
        6.匯編源程序
        KEYBUFEQU30H
        STH0EQU31H
        STL0EQU32H
        TEMPEQU33H
        ORG00H
        LJMPSTART
        ORG0BH
        LJMPINT_T0
        START:MOVTMOD,#01H
        SETBET0
        SETBEA
        WAIT:
        MOVP3,#0FFH
        CLRP3.4
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY1
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY1
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK1
        MOVKEYBUF,#0
        LJMPDK1
        NK1:CJNEA,#0DH,NK2
        MOVKEYBUF,#1
        LJMPDK1
        NK2:CJNEA,#0BH,NK3
        MOVKEYBUF,#2
        LJMPDK1
        NK3:CJNEA,#07H,NK4
        MOVKEYBUF,#3
        LJMPDK1
        NK4:NOP
        DK1:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,KEYBUF
        MOVB,#2
        MULAB
        MOVTEMP,A
        MOVDPTR,#TABLE1
        MOVCA,@A+DPTR
        MOVSTH0,A
        MOVTH0,A
        INCTEMP
        MOVA,TEMP
        MOVCA,@A+DPTR
        MOVSTL0,A
        MOVTL0,A
        SETBTR0

        DK1A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK1A
        CLRTR0
        NOKEY1:
        MOVP3,#0FFH
        CLRP3.5
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY2
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY2
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK5
        MOVKEYBUF,#4
        LJMPDK2
        NK5:CJNEA,#0DH,NK6
        MOVKEYBUF,#5
        LJMPDK2
        NK6:CJNEA,#0BH,NK7
        MOVKEYBUF,#6
        LJMPDK2
        NK7:CJNEA,#07H,NK8
        MOVKEYBUF,#7
        LJMPDK2
        NK8:NOP
        DK2:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,KEYBUF
        MOVB,#2
        MULAB
        MOVTEMP,A
        MOVDPTR,#TABLE1
        MOVCA,@A+DPTR
        MOVSTH0,A
        MOVTH0,A
        INCTEMP
        MOVA,TEMP
        MOVCA,@A+DPTR
        MOVSTL0,A
        MOVTL0,A
        SETBTR0
        DK2A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK2A
        CLRTR0
        NOKEY2:
        MOVP3,#0FFH
        CLRP3.6
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY3
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY3
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK9
        MOVKEYBUF,#8
        LJMPDK3
        NK9:CJNEA,#0DH,NK10
        MOVKEYBUF,#9
        LJMPDK3
        NK10:CJNEA,#0BH,NK11
        MOVKEYBUF,#10
        LJMPDK3
        NK11:CJNEA,#07H,NK12
        MOVKEYBUF,#11
        LJMPDK3
        NK12:NOP
        DK3:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,KEYBUF
        MOVB,#2
        MULAB
        MOVTEMP,A
        MOVDPTR,#TABLE1
        MOVCA,@A+DPTR
        MOVSTH0,A
        MOVTH0,A
        INCTEMP
        MOVA,TEMP
        MOVCA,@A+DPTR
        MOVSTL0,A
        MOVTL0,A
        SETBTR0

        DK3A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK3A
        CLRTR0
        NOKEY3:
        MOVP3,#0FFH
        CLRP3.7
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY4
        LCALLDELY10MS
        MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JZNOKEY4
        MOVA,P3
        ANLA,#0FH
        CJNEA,#0EH,NK13
        MOVKEYBUF,#12
        LJMPDK4
        NK13:CJNEA,#0DH,NK14
        MOVKEYBUF,#13
        LJMPDK4
        NK14:CJNEA,#0BH,NK15
        MOVKEYBUF,#14
        LJMPDK4
        NK15:CJNEA,#07H,NK16
        MOVKEYBUF,#15
        LJMPDK4
        NK16:NOP
        DK4:
        MOVA,KEYBUF
        MOVDPTR,#TABLE
        MOVCA,@A+DPTR
        MOVP0,A
        MOVA,KEYBUF
        MOVB,#2
        MULAB
        MOVTEMP,A
        MOVDPTR,#TABLE1
        MOVCA,@A+DPTR
        MOVSTH0,A
        MOVTH0,A
        INCTEMP
        MOVA,TEMP
        MOVCA,@A+DPTR
        MOVSTL0,A
        MOVTL0,A
        SETBTR0
        DK4A:MOVA,P3
        ANLA,#0FH
        XRLA,#0FH
        JNZDK4A
        CLRTR0
        NOKEY4:
        LJMPWAIT
        DELY10MS:
        MOVR6,#10
        D1:MOVR7,#248
        DJNZR7,$
        DJNZR6,D1
        RET
        INT_T0:
        MOVTH0,STH0
        MOVTL0,STL0
        CPLP1.0
        RETI
        TABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H
        DB7FH,6FH,77H,7CH,39H,5EH,79H,71H

        TABLE1:DW64021,64103,64260,64400
        DW64524,64580,64684,64777
        DW64820,64898,64968,65030
        DW65058,65110,65157,65178
        END
        7.C語言源程序
        #include
        unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
        unsignedchartemp;
        unsignedcharkey;
        unsignedchari,j;
        unsignedcharSTH0;
        unsignedcharSTL0;
        unsignedintcodetab[]={64021,64103,64260,64400,
        64524,64580,64684,64777,
        64820,64898,64968,65030,
        65058,65110,65157,65178};
        voidmain(void)
        {
        TMOD=0x01;
        ET0=1;
        EA=1;
        while(1)
        {
        P3=0xff;
        P3_4=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=0;
        break;
        case0x0d:
        key=1;
        break;
        case0x0b:
        key=2;
        break;
        case0x07:
        key=3;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        STH0=tab[key]/256;
        STL0=tab[key]%256;
        TR0=1;
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        TR0=0;
        }
        }

        P3=0xff;
        P3_5=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=4;
        break;
        case0x0d:
        key=5;
        break;
        case0x0b:
        key=6;
        break;
        case0x07:
        key=7;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        STH0=tab[key]/256;
        STL0=tab[key]%256;
        TR0=1;
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        TR0=0;
        }
        }

        P3=0xff;
        P3_6=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=8;
        break;
        case0x0d:
        key=9;
        break;
        case0x0b:
        key=10;
        break;
        case0x07:
        key=11;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        STH0=tab[key]/256;
        STL0=tab[key]%256;
        TR0=1;
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        TR0=0;
        }
        }
        P3=0xff;
        P3_7=0;
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        for(i=50;i>0;i--)
        for(j=200;j>0;j--);
        temp=P3;
        temp=temp&0x0f;
        if(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        switch(temp)
        {
        case0x0e:
        key=12;
        break;
        case0x0d:
        key=13;
        break;
        case0x0b:
        key=14;
        break;
        case0x07:
        key=15;
        break;
        }
        temp=P3;
        P1_0=~P1_0;
        P0=table[key];
        STH0=tab[key]/256;
        STL0=tab[key]%256;
        TR0=1;
        temp=temp&0x0f;
        while(temp!=0x0f)
        {
        temp=P3;
        temp=temp&0x0f;
        }
        TR0=0;
        }
        }
        }
        }

        voidt0(void)interrupt1using0
        {
        TH0=STH0;
        TL0=STL0;
        P1_0=~P1_0;
        }


        關鍵詞: 電子琴單片

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 莆田市| 澄江县| 游戏| 冕宁县| 莱阳市| 民权县| 河东区| 大新县| 师宗县| 鄂托克前旗| 娄底市| 博爱县| 大安市| 永仁县| 连平县| 高要市| 清流县| 赤城县| 军事| 平顶山市| 壶关县| 皮山县| 乌鲁木齐县| 临江市| 广河县| 沂南县| 金华市| 孟连| 德钦县| 双辽市| 成武县| 中西区| 昌图县| 福州市| 山东省| 古蔺县| 都匀市| 德令哈市| 南京市| 邵阳市| 莆田市|