• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      22. 電子琴
      文章長度[] 加入時間[2008/5/30] 更新時間[2025/5/16 5:10:53] 級別[0] [評論] [收藏]
       
      1.  實驗任務
      (1.       由4X4組成16個按鈕矩陣,設計成16個音。
      (2.       可隨意彈奏想要表達的音樂。
      2. 電路原理圖
      圖4.22.1
      3. 系統板硬件連線
      (1.       把“單片機系統”區域中的P1.0端口用導線連接到“音頻放大模塊”區域中的SPK IN端口上;
      (2.       把“單片機系統“區域中的P3.0-P3.7端口用8芯排線連接到“4X4行列式鍵盤”區域中的C1-C4 R1-R4端口上;
      4.  相關程序內容
      (1.       4X4行列式鍵盤識別;
      (2.       音樂產生的方法;
      一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可,F在以單片機12MHZ晶振為例,例出高中低音符與單片機計數T0相關的計數值如下表所示

      音符
      頻率(HZ)
      簡譜碼(T值)
      音符
      頻率(HZ)
      簡譜碼(T值)
      低1 DO
      262
      63628
      # 4 FA#
      740
      64860
      #1 DO#
      277
      63731
      中 5 SO
      784
      64898
      低2 RE
      294
      63835
      # 5 SO#
      831
      64934
      #2 RE#
      311
      63928
      中 6 LA
      880
      64968
      低 3 M
      330
      64021
      # 6
      932
      64994
      低 4 FA
      349
      64103
      中 7 SI
      988
      65030
      # 4 FA#
      370
      64185
      高 1 DO
      1046
      65058
      低 5 SO
      392
      64260
      # 1 DO#
      1109
      65085
      # 5 SO#
      415
      64331
      高 2 RE
      1175
      65110
      低 6 LA
      440
      64400
      # 2 RE#
      1245
      65134
      # 6
      466
      64463
      高 3 M
      1318
      65157
      低 7 SI
      494
      64524
      高 4 FA
      1397
      65178
      中 1 DO
      523
      64580
      # 4 FA#
      1480
      65198
      # 1 DO#
      554
      64633
      高 5 SO
      1568
      65217
      中 2 RE
      587
      64684
      # 5 SO#
      1661
      65235
      # 2 RE#
      622
      64732
      高 6 LA
      1760
      65252
      中 3 M
      659
      64777
      # 6
      1865
      65268
      中 4 FA
      698
      64820
      高 7 SI
      1967
      65283

      下面我們要為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數據
      低音0-19之間,中音在20-39之間,高音在40-59之間
      TABLE:        DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
                         DW 0,63731,63928,0,64185,64331,64463,0,0,0
                         DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
                         DW 0,64633,64732,0,64860,64934,64994,0,0,0
                         DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
                         DW 0,65085,65134,0,65198,65235,65268,0,0,0
                         DW 0
      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. 匯編源程序
      KEYBUF      EQU 30H
      STH0        EQU 31H
      STL0        EQU 32H
      TEMP        EQU 33H
                  ORG 00H
                  LJMP START
                  ORG 0BH
                  LJMP INT_T0
      START:      MOV TMOD,#01H
                  SETB ET0
                  SETB EA
      WAIT:  
                  MOV P3,#0FFH
                  CLR P3.4
                  MOV A,P3
                  ANL A,#0FH 
                  XRL A,#0FH
                  JZ NOKEY1
                  LCALL DELY10MS
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY1
                  MOV A,P3
                  ANL A,#0FH
                  CJNE A,#0EH,NK1
                  MOV KEYBUF,#0
                  LJMP DK1
      NK1:        CJNE A,#0DH,NK2
                  MOV KEYBUF,#1
                  LJMP DK1
      NK2:        CJNE A,#0BH,NK3
                  MOV KEYBUF,#2
                  LJMP DK1
      NK3:        CJNE A,#07H,NK4
                  MOV KEYBUF,#3
                  LJMP DK1
      NK4:        NOP
      DK1:   
                  MOV A,KEYBUF
                  MOV DPTR,#TABLE
                  MOVC A,@A+DPTR
                  MOV P0,A
                  MOV A,KEYBUF
                  MOV B,#2
                  MUL AB
                  MOV TEMP,A
                  MOV DPTR,#TABLE1
                  MOVC A,@A+DPTR
                  MOV STH0,A
                  MOV TH0,A
                  INC TEMP
                  MOV A,TEMP
                  MOVC A,@A+DPTR
                  MOV STL0,A
                  MOV TL0,A
                  SETB TR0
      DK1A:       MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JNZ DK1A
                  CLR TR0
      NOKEY1:
                  MOV P3,#0FFH
                  CLR P3.5
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY2
                  LCALL DELY10MS
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY2
                  MOV A,P3
                  ANL A,#0FH
                  CJNE A,#0EH,NK5
                  MOV KEYBUF,#4
                  LJMP DK2
      NK5:        CJNE A,#0DH,NK6
                  MOV KEYBUF,#5
                  LJMP DK2
      NK6:        CJNE A,#0BH,NK7
                  MOV KEYBUF,#6
                  LJMP DK2
      NK7:        CJNE A,#07H,NK8
                  MOV KEYBUF,#7
                  LJMP DK2
      NK8:        NOP
      DK2:   
                  MOV A,KEYBUF
                  MOV DPTR,#TABLE
                  MOVC A,@A+DPTR
                  MOV P0,A
                  MOV A,KEYBUF
                  MOV B,#2
                  MUL AB
                  MOV TEMP,A
                  MOV DPTR,#TABLE1
                  MOVC A,@A+DPTR
                  MOV STH0,A
                  MOV TH0,A
                  INC TEMP
                  MOV A,TEMP
                  MOVC A,@A+DPTR
                  MOV STL0,A
                  MOV TL0,A
                  SETB TR0
      DK2A:       MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JNZ DK2A
                  CLR TR0
      NOKEY2:
                  MOV P3,#0FFH
                  CLR P3.6
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY3
                  LCALL DELY10MS
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY3
                  MOV A,P3
                  ANL A,#0FH
                  CJNE A,#0EH,NK9
                  MOV KEYBUF,#8
                  LJMP DK3
      NK9:        CJNE A,#0DH,NK10
                  MOV KEYBUF,#9
                  LJMP DK3
      NK10:       CJNE A,#0BH,NK11
                  MOV KEYBUF,#10
                  LJMP DK3
      NK11:       CJNE A,#07H,NK12
                  MOV KEYBUF,#11
                  LJMP DK3
      NK12:       NOP
      DK3:
                  MOV A,KEYBUF
                  MOV DPTR,#TABLE
                  MOVC A,@A+DPTR
                  MOV P0,A
                  MOV A,KEYBUF
                  MOV B,#2
                  MUL AB
                  MOV TEMP,A
                  MOV DPTR,#TABLE1
                  MOVC A,@A+DPTR
                  MOV STH0,A
                  MOV TH0,A
                  INC TEMP
                  MOV A,TEMP
                  MOVC A,@A+DPTR
                  MOV STL0,A
                  MOV TL0,A
                  SETB TR0
      DK3A:       MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JNZ DK3A
                  CLR TR0
      NOKEY3:
                  MOV P3,#0FFH
                  CLR P3.7
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY4
                  LCALL DELY10MS
                  MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JZ NOKEY4
                  MOV A,P3
                  ANL A,#0FH
                  CJNE A,#0EH,NK13
                  MOV KEYBUF,#12
                  LJMP DK4
      NK13:       CJNE A,#0DH,NK14
                  MOV KEYBUF,#13
                  LJMP DK4
      NK14:       CJNE A,#0BH,NK15
                  MOV KEYBUF,#14
                  LJMP DK4
      NK15:       CJNE A,#07H,NK16
                  MOV KEYBUF,#15
                  LJMP DK4
      NK16:       NOP
      DK4:   
                  MOV A,KEYBUF
                  MOV DPTR,#TABLE
                  MOVC A,@A+DPTR
                  MOV P0,A
                  MOV A,KEYBUF
                  MOV B,#2
                  MUL AB
                  MOV TEMP,A
                  MOV DPTR,#TABLE1
                  MOVC A,@A+DPTR
                  MOV STH0,A
                  MOV TH0,A
                  INC TEMP
                  MOV A,TEMP
                  MOVC A,@A+DPTR
                  MOV STL0,A
                  MOV TL0,A
                  SETB TR0
      DK4A:       MOV A,P3
                  ANL A,#0FH
                  XRL A,#0FH
                  JNZ DK4A
                  CLR TR0
      NOKEY4:
                  LJMP WAIT
      DELY10MS:
                  MOV R6,#10
      D1:         MOV R7,#248
                  DJNZ R7,$
                  DJNZ R6,D1
                  RET
      INT_T0:
                  MOV TH0,STH0
                  MOV TL0,STL0
                  CPL P1.0
                  RETI
      TABLE:      DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
                  DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
      TABLE1:     DW 64021,64103,64260,64400
                  DW 64524,64580,64684,64777
                  DW 64820,64898,64968,65030
                  DW 65058,65110,65157,65178
                  END
      7.  C語言源程序
      #include <AT89X51.H>
      unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
                                  0x66,0x6d,0x7d,0x07,
                                  0x7f,0x6f,0x77,0x7c,
                                  0x39,0x5e,0x79,0x71};
      unsigned char temp;
      unsigned char key;
      unsigned char i,j;
      unsigned char STH0;
      unsigned char STL0;
      unsigned int code tab[]={64021,64103,64260,64400,
                                64524,64580,64684,64777,
                                64820,64898,64968,65030,
                                65058,65110,65157,65178};
      void main(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)
                      {
                        case 0x0e:
                          key=0;
                          break;
                        case 0x0d:
                          key=1;
                          break;
                        case 0x0b:
                          key=2;
                          break;
                        case 0x07:
                          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)
                      {
                        case 0x0e:
                          key=4;
                          break;
                        case 0x0d:
                          key=5;
                          break;
                        case 0x0b:
                          key=6;
                          break;
                        case 0x07:
                          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)
                      {
                        case 0x0e:
                          key=8;
                          break;
                        case 0x0d:
                          key=9;
                          break;
                        case 0x0b:
                          key=10;
                          break;
                        case 0x07:
                          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)
              &nbswitch(temp)
                      {
                        case 0x0e:
                          key=12;
                          break;
                        case 0x0d:
                          key=13;
                          break;
                        case 0x0b:
                          key=14;
                          break;
                        case 0x07:
                          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;
                  }
              }     
          }
      }
      void t0(void) interrupt 1 using 0
      {
        TH0=STH0;
        TL0=STL0;
        P1_0=~P1_0;
      }
      sp;       {
                        case 0x0e:
                          key=12;
                          break;
                        case 0x0d:
                          key=13;
                          break;
                        case 0x0b:
                          key=14;
                          break;
                        case 0x07:
                          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;
                  }
              }     
          }
      }
      void t0(void) interrupt 1 using 0
      {
        TH0=STH0;
        TL0=STL0;
        P1_0=~P1_0;
      }
      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版