Thông báo

Collapse
No announcement yet.

Phát nhạc ra loa

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

  • Phát nhạc ra loa

    Em đang làm cái đồng hồ số có chức năng hẹn giờ để phát nhạc ra loa cũng nối với PIC 16f887 . Code phát nhạc thì em đã viết được rồi. Phát riêng thì được nhưng em muốn vừa hiển thị đồng hồ (led 7 đoạn) vừa phát nhạc có được ko ạ? Em nghĩ hoài mà ko ra hướng.
    Nhân tiện em muốn hỏi là EEPROM của 16f887 em muốn dùng để ghi dữ liệu hẹn giờ vào EEPROM có được ko và ghi như thế nào ạ? Em cảm ơn

  • #2
    chú dùng ngắt timer kết hợp tra bảng để phát. Còn EEPROM thì tùy phần mềm biên dịch nó có lệnh truy xuất riêng

    Comment


    • #3
      em cũng thử dùng timer0 để phát, nhưng mỗi lần phát thì led nó lại nháy 1 cái

      Comment


      • #4
        Nguyên văn bởi emperordx Xem bài viết
        em cũng thử dùng timer0 để phát, nhưng mỗi lần phát thì led nó lại nháy 1 cái
        chú phải viết hàm ngắt 1 cách tối ưu sao cho thời gian làm trong hàm chỉ khoảng vài 100-200 uS thôi.

        Comment


        • #5
          #include <16F887.h>
          #FUSES NOWDT //No Watch Dog Timer
          #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
          #FUSES NOPUT //No Power Up Timer
          #FUSES MCLR //Master Clear pin enabled
          #FUSES NOPROTECT //Code not protected from reading
          #FUSES NOCPD //No EE protection
          #FUSES NOBROWNOUT //No brownout reset
          #FUSES IESO //Internal External Switch Over mode enabled
          #FUSES FCMEN //Fail-safe clock monitor enabled
          #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
          #FUSES NODEBUG //No Debug mode for ICD
          #FUSES NOWRT //Program memory not write protected
          #FUSES BORV40 //Brownout reset at 4.0V
          #FUSES RESERVED //Used to set the reserved FUSE bits
          #use delay(clock=12000000)
          #if defined(__PCM__)
          #use delay(clock=12000000)
          #elif defined(__PCH__)
          #fuses hs,NOWDT,NOPROTECT,NOLVP
          #endif
          #include <tones.c>
          #define SIZE 25
          const struct note
          {
          long tone;
          long length;
          } happy_bday[SIZE] = {
          C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, F_note[0],500, E_note[0],900,
          C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, G_note[0],500, F_note[0],900,
          C_note[0],350, C_note[0],100, C_note[1],500, A_note[0],500, F_note[0],500, E_note[0],500, D_note[0],900,
          Bb_note[0],350, Bb_note[0],100, A_note[0],500, F_note[0],500, G_note[0],500, F_note[0],1200};


          void main(void) {
          int i;

          while(TRUE)
          {
          for(i=0; i<SIZE; ++i)
          {
          generate_tone(happy_bday[i].tone,happy_bday[i].length);
          delay_ms(75);
          }
          }
          }
          code phát nhạc là như vậy nè, mỗi lần phát ra mất 75ms . như thế thì mỗi tiếng phát ra làm cho đèn bị nháy.

          Comment


          • #6
            Nguyên văn bởi emperordx Xem bài viết
            code phát nhạc là như vậy nè, mỗi lần phát ra mất 75ms . như thế thì mỗi tiếng phát ra làm cho đèn bị nháy.
            mình nghĩ ứng dụng này không quá khó với pic, đoạn code trên của bạn tôi chẳng thấy chỗ nào bạn điều khiển timer để phát xung cả, tôi không hiểu hàm generate_tone là hàm có sẵn hay tự bạn viết ra, nếu tự bạn viết ra thì bạn phải giải thích cho mọi người hoặc đưa code ra thì mọi người mới phân tích đc, nếu là hàm có sẵn thì bạn phải hiểu rõ tác dụng của nó là như thế nào, nếu nó đơn thuần chỉ generate tone (tạo xung) và trong khoảng thời gian trễ (bởi tham số đi sau) thì nó sẽ chiếm dụng thời gian của CPU, bạn nên hiểu rõ hơn về hàm này. Còn theo tôi, phát xung nên dùng 1 timer, không nên dùng cpu đảo trạng thái cổng và trễ để phát xung, cpu chỉ mất vài dòng lệnh để thiết lập tần số xung cho timer thôi (mất rất ít tg, ~ vài chục chu kỳ máy thôi cỡ vài micro giây thôi), thư 2, dùng một timer nữa (píc có nhiều timer) để đếm thời gian (giống như đồng hồ) nó sẽ tạo trễ và ngắt của nó sẽ cập nhật cho biến đếm thời gian, cpu chỉ phục vụ nó mỗi lúc có ngắt, cpu sẽ cập nhật biến đếm thời gian, các biến đếm thời gian sẽ dùng để báo khí nào đến lúc ngân hết một nốt nhạc (khi đó cpu sẽ cấu hình lại timer phát xung để phát với tần số của nốt nhạc tiếp thep), biến đếm thời gian khác sẽ dùng để báo khi nào phải quét led hiển thị, đại khái như thế ct chính sẽ phải kiểm tra các biến đếm thời gian mà quét , phat nhạc, đặt lại tần số cho timer phát tone. Đại khái thế, nếu có gì không rõ tôi sẽ giải thích thêm

            Comment


            • #7
              Cảm ơn bạn sinhluc, bài này mình đã viết cũng rất lâu rồi, đó chỉ là cái code mình đưa lên chưa dùng timer, nhưng giờ mình đã giải quyết đc vấn đề đó.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X