Thông báo

Collapse
No announcement yet.

[Xin giúp đỡ] Timer 8051

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

  • [Xin giúp đỡ] Timer 8051

    Em xin hỏi là: ví dụ em khởi tạo TMOD và IE để dùng Timer1 làm bộ định thời timer nhưng sau đó em khởi tạo TMOD và IE để làm bộ đếm counter có được không Tại em test thử thấy nó không chạy được, vậy các anh có giải pháp nào cho yêu cầu bài toán của em không . Em xin cảm ơn

  • #2
    Điều này rất đơn giản, bạn chỉ cần thay đổi bit timer/counter thì sẽ thực hiện được yêu cầu này. Bít này ở trên thanh ghi TMOD thì phải ( tôi quên rồi). Bạn nên post code để mọi người dễ góp ý.
    Thân.

    Comment


    • #3
      #include <REGX51.H>
      #include <stdio.h>
      #include <ctype.h>
      #define leddo P1_0
      #define ledxanh P1_1
      #define R8051 P2_0
      #define RCOM P2_1

      unsigned int i = 0;
      unsigned int d = 0;
      void init_UART()
      {
      SCON = 0x50; /* Che do 1: 8-bit UART, cho phep truyen */
      TMOD = 0x20; /* timer 1 che do 2: 8-Bit tu dong nap lai. */
      TH1 = 0xfd ; /* toc do 9600 baud */
      TL1 = 0xfd ;
      TI = 0; /* co ngat nha^n.=0*/
      RI=0; /* co ngat' truye^n =0*/
      TR1 = 1; /* timer 1 run */
      ES =1;
      EA = 1;
      R8051 = 0;
      RCOM = 0;
      }

      void init_Counter()
      {
      TR1 = 0;
      IE = 0x8A;
      TMOD = 0xD9; //mode 1 (16bits)
      TH1 = 0x00;
      TL1 = 0x00;
      P3_5 = 1;
      TR1 = 1;
      TF0 = 1; //bat dau ngat timer0
      }


      void receive()
      {
      R8051 = 0;
      RCOM = 0;
      }
      void send(char c)
      {
      R8051 = 1;
      RCOM = 1;
      SBUF=c;
      while(TI == 0);
      TI = 0;
      R8051 = 0;
      RCOM = 0;
      }

      void Timer0() interrupt 1
      {
      i++;
      P2_3 = 0;
      TR0 = 0; //tam dung timer0
      TH0 = 0x3C; //nap lai gia tri
      TL0 = 0xB0;
      if(i == 21)
      {
      i=0;
      TR1 = 0;
      }
      TR0 = 1;
      }

      void nhan(void) interrupt 4 //Chuong trinh con dung ngat noi tiep
      {
      if(RI)
      {
      ACC = SBUF;
      RI=0;
      if (ACC == 66)
      {
      ES = 0;
      P2_2 = 0;
      init_Counter();
      P2_2 = 1;
      while(TR1 == 1);
      P2_2 = 0;
      ACC = toascii(TL1);
      }
      else
      {
      P2_2 = 1;
      }
      }
      }

      void Main()
      {
      init_UART();
      while(1);
      }
      Em cũng thay đổi rồi nhưng không được ạ . Code của em la truyền thông UART khi phát hiện điều kiện thì đổi TMOD và IE để dùng làm counter nhưng không được

      Comment


      • #4
        chính xác hơn là em không thể nhảy vào ngắt Timer0 sau khi đổi IE và TMOD

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...
        X