Thông báo

Collapse
No announcement yet.

Dùng 8051 tạo ra nhạc ?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Dùng 8051 tạo ra nhạc ?

    Mình có nghe nói dùng 8051 mắc với 1 chiếc loa có thể phát được 1 số bài hát đơn giản . Như Happy Birth Day chẳng hạn !
    Có bác nào biết chỉ giúp em với ?
    ( Hinh như là tạo xung dao động ở chân chip tùy mỗi nốt nhạc có 1 tần sổ riêng hay sao ý?)
    Trả lời giúp em nha !

  • #2
    Trong âm nhạc bạn phải nắm đuợc 2 điểm chính là : cao độ và trường độ.

    Cao độ : đô, rê, mi ... do tần số quyết định => ở đây bạn cần tạo ra một delay có thời gian trễ điều chỉnh được (mỗi nốt có một giá trị tần số chuẩn bạn phải tìm hiểu tài liệu để biết tần số đó là bao nhiêu rồi tính toán lại giá trị đưa vào mới chính xác ).

    Trường độ : độ ngân dài ... do vòng lặp quyết định, mỗi một nốt nhạc sau khi phát ra thời gian ngân dài hay ngắn tuỳ thuộc vào số lần mà nó lặp lại => ở đây có một biến quy định số lần lặp.

    Gộp 2 cái đó lại ta đưa vào một procedure gồm 2 tham biến (cđ, tđ).

    Sau khi hoàn thành xong 3 bước trên để soạn ra một bản nhạc bạn bắt đầu lần lượt đưa giá trị vào procedure như sau :
    procedure(cđ1,td1), procedure(cđ2,td2)......

    Như vậy khi chương trình đuợc chạy, máy sẽ lần lượt nhảy vào procedure, và phát ra từng nốt nhạc cho bạn

    Yêu cầu tối thiểu bạn phải nắm một chút về nhạc lý căn bản mới có thể đọc đuợc các nốt trên một "bản nhạc" và trường độ của nó
    Chính thức phát hành mạch điều khiển LED FireStar1
    Yêu mến tất cả anh em dientuvietnam.net

    Comment


    • #3
      Cảm ơn bạn nha!
      Nhưng cho mình hỏi hàm delay tạo ra tần số cho mỗi nốt cần viết như thế nào?
      Bạn có chương trình mẫu không cho mình tham khảo với?

      Comment


      • #4
        tự đi mà viết đi chứ hàm này mà ko viết được thì còn làm ăn gì nữa

        Comment


        • #5
          cái nì tui viết từ hồi napoleon cởi truồng tắm mưa nè.có gì coi được thì coi he.
          Attached Files
          Cty TNHH Cơ Điện tử Hiệp Phát.
          ------------------------------------------
          Trần Hoàng Giang
          11-04-1985

          Mobil: 0905 438 533

          Comment


          • #6
            Mình mới học về 8051 mà đã biết gì đâu !
            Thế loa nên mắc như thế nào các bác có cần mắc thêm gì nữa không?mắc vào chân nào?(AT89C51 nha )

            Comment


            • #7
              nghe thử 2 bản này :romance ,darato
              Attached Files

              Comment


              • #8
                em cũng làm thế này: mua mấy chip nhạc ngoài chợ về, dùng cooledit hiện sóng lên máy tính để xem tần số, độ ngân dài của mỗi nốt nhạc rồi từ đó viết code, dùng 2timer: 1 để điều khiển 1 chân vdk nháy theo tần số và 1 để điều khiển độ ngân dài của nốt nhạc. 1con 89C2051 nạp được gần 20 bài, như vậy thì ok, nhưng khi cố tận dụng thêm vòng lặp để nháy led cho đẹp thì nhạc bị cà giựt, hix
                Phạm Minh Tuấn

                (+84) 982006467

                Comment


                • #9
                  Bác nào có sơ đồ lắp cái này ko? Cho em xin với! Lần đầu tiên làm cái này mà

                  Comment


                  • #10
                    Trên mạng có code rồi, chỉ cần con 89c2051 là làm được thôi, gọn nhẹ rẻ tiền. Chú nào chưa làm được thì chịu khó google, có đủ cả, chịu khó học tí nhạc lý (như anh đây này :>). Các bác khác làm được rồi thì cũng đừng tinh vi ví lại dấu ghề, chỉ cho các iem ý một tí đê

                    =====)))))
                    (Sắp tết rồi, tự dưng mình mấu chiến thế)

                    Comment


                    • #11
                      Nguyên văn bởi opendoor2507 Xem bài viết
                      Trên mạng có code rồi, chỉ cần con 89c2051 là làm được thôi, gọn nhẹ rẻ tiền. Chú nào chưa làm được thì chịu khó google, có đủ cả, chịu khó học tí nhạc lý (như anh đây này :>). Các bác khác làm được rồi thì cũng đừng tinh vi ví lại dấu ghề, chỉ cho các iem ý một tí đê

                      =====)))))
                      (Sắp tết rồi, tự dưng mình mấu chiến thế)
                      Bác đang giấu nghề đây thôi..! Tui không biết tìm sao nên mới hỏi xin chứ, nếu tôi biết seach thì đâu có xin. Viết code thì tôi ok rồi, nhưng không biết cái mạch ráp sao nữa nên mới hỏi xin các bác cái sơ đồ nguyên lý thôi. Bác nào có cho em xin cái

                      Comment


                      • #12
                        tạo nhạc = VDK thì chỉ dừng ở mức đơn âm , cao thủ nào có giải pháp để tạo nhạc đa âm chưa ? mà chỉ sd 1 con VDK thui ! tui đang cố mày mò cái này mà chưa tìm ra đc hướng đi

                        Comment


                        • #13
                          Nguyên văn bởi Zz_Bi_zZ Xem bài viết
                          tạo nhạc = VDK thì chỉ dừng ở mức đơn âm , cao thủ nào có giải pháp để tạo nhạc đa âm chưa ? mà chỉ sd 1 con VDK thui ! tui đang cố mày mò cái này mà chưa tìm ra đc hướng đi
                          Tớ thì ngu về nhạc nhưng tớ code được
                          Nhạc đa âm thì nó như thế nào để tớ nghĩ giải thuật

                          Tớ có thể phát đồng thời 4-5 kênh nhạc như bạn thaithienanh mô tả ở trên thì trộn lại nó có ra đa kênh không nhỉ.

                          Comment


                          • #14
                            Tớ thì ngu về nhạc nhưng tớ code được
                            Nhạc đa âm thì nó như thế nào để tớ nghĩ giải thuật

                            Tớ có thể phát đồng thời 4-5 kênh nhạc như bạn thaithienanh mô tả ở trên thì trộn lại nó có ra đa kênh không nhỉ.
                            cái này tui cũng đã nghĩ , tui định phát mỗi loa nhỏ mỗi laọi nhạc cụ , gộp các loa nhỏ này lại thành 1 hộp nhỏ thì ta đc 1 máy MP3 đa âm , âm thanh nổi . Nhưng còn về phần điều khiển , chỉ sd 1 con VDK thì cực khó , nếu mỗi nhạc cụ 1 con VDDK thì dễ

                            phát đồng thời 4-5 kênh cùng lúc ! tui nghĩ ta tính toán thời gian khá khó , & chỉ có thể phát nối tiếp

                            Comment


                            • #15
                              Nguyên văn bởi irf540 Xem bài viết
                              cái nì tui viết từ hồi napoleon cởi truồng tắm mưa nè.có gì coi được thì coi he.
                              [code]
                              Code:
                              #include<AT89S53.h>
                              unsigned char preloadTH=0xFF,preloadTL=0xFF;
                              unsigned int pointer=0,ii=0,jj;
                              //octa: 0
                              //key            C     C#    D     D#    E    F     F#    G    G#    A    A#    B  
                              code float key_octa0[]={16.35,17.32,18.35,19.45,20.6,21.83,23.12,24.5,25.96,27.5,29.14,30.87};
                              code unsigned int chuan=200;
                              code float crystal=11.0592;
                              
                              //music
                              code unsigned char music[]=
                              {
                              	"4d~,4d~,3g~,3a~,4d.,4d~,4g~,4a~,4b~,4a=,4g=,4d.,4e~,3a~,4c~,3g~,3a~,4d~,4d ,4d=,4c=,3a~,4c~,3g~,3a~,4do",
                              	"4g~,4g~,4d~,3a~,4g.,4g~,4a~,4g~,4b=,4a=,4g~,4d.,4g~,4e ,4e~,4d~,4c ,4d~,4d~,3a~,4d~,3b~,3a~,3go,4d ,4go",
                              	"4go,4a ,4b~,4a~,4F~,4g.,4d~,4g~,4a~,4a=,4b=,4a~,4g.,4d~,3a ,3a ,3a~,4d ,4d~,4d ,3a=,3b=,3a~,3g.,4b=,4a=",
                              	"4g~,4d~,4g~,4d~,3a.,4g~,4g ,4F~,4a~,5d.,4a=,4b=,4d ,3a ,4go,4d~,4d~,3g~,3a~,4do,4g~,4g~,4d~,3a~,4go,4g~",
                              	"4d~,4g~,4a~,4A ,4a~,5d~,4b~,4a~,4g~,4F~,4g ,4d ,4d ,4g~,4a~,4A ,4a~,5d~,4b~,4a~,4g~,4F~,4go,s"
                              };
                              void doitanso(float tanso)
                              {
                              	unsigned int giatrinap;
                              		giatrinap=65536-(unsigned int)((1000000*crystal)/(24*tanso));
                              		preloadTL=(unsigned char)giatrinap;
                              		preloadTH=(unsigned char)(giatrinap>>8);	
                              }
                              void key(unsigned char octa,unsigned char k)
                              {
                              	float tanso;
                              	switch (k)
                              	{
                              		case 'c' : tanso=key_octa0[0];  break;
                              		case 'C' : tanso=key_octa0[1];  break;
                              		case 'd' : tanso=key_octa0[2];  break;
                              		case 'D' : tanso=key_octa0[3];  break;
                              		case 'e' : tanso=key_octa0[4];  break;
                              		case 'f' : tanso=key_octa0[5];  break;
                              		case 'F' : tanso=key_octa0[6];  break;
                              		case 'g' : tanso=key_octa0[7];  break;
                              		case 'G' : tanso=key_octa0[8];  break;
                              		case 'a' : tanso=key_octa0[9];  break;
                              		case 'A' : tanso=key_octa0[10]; break;
                              		case 'b' : tanso=key_octa0[11]; break;
                              	}
                              	switch (octa)
                              	{
                              		case '1' : tanso*=2;   break;	
                              		case '2' : tanso*=4;   break;
                              		case '3' : tanso*=8;   break;
                              		case '4' : tanso*=16;  break;
                              		case '5' : tanso*=32;  break;
                              		case '6' : tanso*=64;  break;
                              		case '7' : tanso*=128; break;
                              		case '8' : tanso*=256; break;
                              	}
                              	doitanso(tanso);
                              }
                              unsigned int trave(unsigned int ms)
                              {
                              	unsigned int a;
                              	a=preloadTH;
                              	a=a<<8|preloadTL;
                              	return (ms*crystal*1000)/12/(65536-a);
                              }
                              unsigned int tempo(unsigned char tem)
                              {
                              switch (tem)
                              	{
                              		case '=' : return trave(chuan);  	break;
                              		case '~' : return trave(chuan*2);  	break;
                              		case ' ' : return trave(chuan*4);  	break;
                              		case '.' : return trave(chuan*6);  	break;
                              		case 'o' : return trave(chuan*8);	break;
                              	}
                              }
                              unsigned char ngattimer_0() interrupt 1
                              {
                                  P2_0=!P2_0;
                              	TL0=preloadTL;
                              	TH0=preloadTH;
                              	if(ii==0)
                              		{
                              			if(music[pointer]=='s')
                              				TR0=0;
                              			key(music[pointer],music[pointer+1]);
                              			jj=tempo(music[pointer+2]);
                              		}
                              	ii++;
                              	if(ii==jj)
                              		{
                              			ii=0;
                              			pointer+=4;
                              		}	
                              }
                              void main(void)
                              {
                              	TMOD=17;
                              	TL0=0xff;
                              	TH0=0xff;
                              	ET0=1;
                              	EA=1;
                                  TR0=1;
                                  while(1);
                              }
                              coppy đoạn mã của đồng chí irf540 & F7 thì tui thấy có vài thông báo sau
                              - interrupt() may not receive or return value(s)
                              - mảng music[] out of bounds
                              tui cũng thấy hơi lạ , hay là tui chưa gặp kiểu này
                              Code:
                              unsigned char ngattimer_0() interrupt 1
                              tui chữa lại void ngattimer_0() interrupt 1 thì ko lỗi
                              còn cái mảng music kia thì chưa bit phải chữa ntn ? thử khai báo unsigned long vẫn chưa đc

                              Comment

                              Về tác giả

                              Collapse

                              hoainamctin Tìm hiểu thêm về hoainamctin

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X