標(biāo)題: AT89C51簡(jiǎn)易電子琴設(shè)計(jì) 求制作思路 [打印本頁]

作者: 4676    時(shí)間: 2021-6-1 16:28
標(biāo)題: AT89C51簡(jiǎn)易電子琴設(shè)計(jì) 求制作思路
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請(qǐng)教一下大致的實(shí)現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實(shí)現(xiàn),謝謝大家
設(shè)計(jì)內(nèi)容:
用矩陣鍵盤代表琴鍵,至少能彈出8個(gè)音符,分別是:音符 1,2,3,4,5,6,7, 鍵
按下的時(shí)間長(zhǎng)短表征節(jié)拍的長(zhǎng)短
用蜂鳴器發(fā)出聲音
點(diǎn)陣實(shí)時(shí)動(dòng)態(tài)顯示音符高低  自由顯示
要用AT89C51來實(shí)現(xiàn)
作者: 把握機(jī)會(huì)    時(shí)間: 2021-6-20 14:13
#include <AT89X51.H>

sbit SPEAKER  = P3^7;
#define KEY  P1
unsigned char MUSIC;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]={
64021,64103,64260,64400,//低音3開始
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178
};

void main(void){
        TMOD=0x01;
        ET0=1;
        EA=1;
        KEY = 0xff;
        while(1){        
                if(KEY != 0xff){
                switch (~KEY){//顯示的列位置               
                                case 0x01://                       
                                        MUSIC = 7;      
                                        break;//               
                                case 0x02://                       
                                        MUSIC = 6;      
                                        break;//               
                                case 0x04://                       
                                        MUSIC = 5;      
                                        break;//               
                                case 0x08://                       
                                        MUSIC = 4;      
                                        break;//               
                                case 0x10://                       
                                        MUSIC = 3;      
                                        break;//               
                                case 0x20://                       
                                        MUSIC = 2;      
                                        break;//               
                                case 0x40://                       
                                        MUSIC = 1;      
                                        break;//               
                                case 0x80://                       
                                        MUSIC = 0;      
                                        break;//               
                }      

                    STH0=tab[MUSIC]/256;
                    STL0=tab[MUSIC]%256;
                    TR0=1;
                }else{
                    SPEAKER = 1;
                        TR0=0;
                }
    }
}
void t0(void) interrupt 1 using 0{
  TH0=STH0;
  TL0=STL0;
  SPEAKER=~SPEAKER;
}




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1