Thông báo

Collapse
No announcement yet.

Tạo độ rộng xung

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

  • Tạo độ rộng xung

    Mấy anh giúp em với bài tập này với.
    Tạo xung vuông 10khz cố định. Nhấn nút key1(p3.7) thì độ rộng xung là 25%, nhấn key2(p3.6) thì độ rộng xung là 50%, nhấn key3(p3.5) thì độ rộng xung là 75%. Ngõ ra là p1.5
    em mới đc học vđk 8051 nên kt còn nông cạn. Mong các anh giúp cho. em dùng keil C

  • #2
    bác đặt các label mà bên trong label đó là chương trình con tạo xung như bác muốn rồi dùng JNB để nhảy tới label khi nút nhấn tương ứng được nhấn thôi

    Comment


    • #3
      bạn có cd cụ thể k.nói vậy mình k hiểu

      Comment


      • #4
        Bạn này độ lười quá cao, mình đã đưa link bài viết về PWM rồi, từ đó có thể tạo duty bằng tính toán động rồi nạp giá trị cho TH, TL. Hoặc tính toán tĩnh dùng macro rồi đặt label như bác ở trên có nói.

        Comment


        • #5
          #include <at89x52.h>

          // CLOCK_FREQ được tính bằng tần số thạch anh bạn dùng /12 (đối với họ 89xx)
          // Ví dụ nếu bạn dùng thạch anh 24Mhz-> CLOCK_FREQ=24.000.000/12=2.000.000
          // CLOCK_FREQ là số chu kỳ máy thực tế mà bạn có
          #define CLOCK_FREQ 1000000ul

          // Đây là tần số dao động bạn cần tạo
          #define FREQ 10000ul

          /*
          Để tạo ra tần số dao động là bao nhiêu thì bạn lấy số đó x2 sẽ được
          Tần số tràn thực tế của timer do vậy tần số thực tế bạn cần tạo là
          gấp 2 lần so với tần số mong muốn tạo ra.
          Chỗ này dùng để tính thời gian giữa 2 lần tràn của timer (2 lần tràn -> 1 xung)
          */
          #define TEMP1 (CLOCK_FREQ/(FREQ*2))

          // Đây là thời gian để nạp vào timer
          #define TEMP2 (65536-TEMP1)

          // Cổng nhận xung PWM
          #define LED P1_0

          // Lưu thời gian cần nạp vào timer để dùng tính toán sau này
          int time=TEMP2;

          // Thời gian 1% duty
          float _1percent=(TEMP1/100.0);

          // Duty bạn muốn tạo
          char duty=50;

          // Biến này lưu giá trị để nạp thêm hoặc giảm đi tạo duty
          int plustime;

          unsigned char xTH0, xTH1, xTL0, xTL1;

          // Những cài đặt cơ bản nhất
          void conf_main(void);
          void timer0(void);

          int main(void)
          {
          conf_main();
          TR0=1;
          EA=1;
          while(1)
          {
          PCON=IDL_;
          }
          }

          void timer0(void) interrupt TF0_VECTOR
          {
          LED=~LED;
          TR0=0;
          if(LED)
          {
          TH0=xTH0;
          TL0=xTL0;
          }
          else
          {
          TH0=xTH1;
          TL0=xTL1;
          }
          TR0=1;
          }

          void conf_main(void)
          {
          volatile int tmp;
          ;
          TMOD=0x01;
          ET0=1;
          TH0=time >> 8;
          TL0=time & 0xff;
          LED=0;

          // Tính thời gian cần cộng thêm hoặc trừ bớt đi để tạo duty
          plustime=(100-duty) * _1percent;
          // Bất cứ khi nào có sự thay đổi duty thì bạn cho đoạn code này vào
          tmp=time+plustime;
          xTH0=tmp>>8;
          xTL0=tmp&0xff;

          tmp=time-plustime;
          xTH1=tmp>>8;
          xTL1=tmp&0xff;
          }
          tren đấy là bài của bạn. bây h mình muốn tạo thêm nhiều xung thì mình đưa đoạn code này vào chô nào
          tmp=time+plustime;
          xTH0=tmp>>8;
          xTL0=tmp&0xff;

          tmp=time-plustime;
          xTH1=tmp>>8;
          xTL1=tmp&0xff;

          giải thích dùm mình đoạn code trên dc k. mình chưa hiểu. và đoạn code của bạn bị lỗi chỗ int time=TEMP2; và float _1percent=(TEMP1/100.0);

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X