Thông báo

Collapse
No announcement yet.

Test giúp mình cái lỗi lập trình C 8051 với

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

  • Test giúp mình cái lỗi lập trình C 8051 với

    mình muốn viết một đoạn c dùng ngắt timer, cho port P1 sáng đều từ P1.0 tới P1.7.
    code mình đây:
    #include <Regx51.h>
    sbit led1= P1^1;
    sbit led2= P1^2;
    sbit led3= P1^3;
    sbit led4= P1^4;
    sbit led5= P1^5;
    sbit led6= P1^6;
    sbit led7= P1^7;
    sbit led8= P1^0;
    P1 = 1;
    void timer0()interrupt 1 //ngat timer 0
    {
    P0 = P0<<1;
    P1 = P1<<1;
    }
    void ti0() // khoi tao bo dinh thoi timer 0
    {
    unsigned int t;
    for(t=0;t<20000;t++)
    {
    EA = 0;
    TMOD = 0x01;
    TH0 = 0x3C;
    TL0 = 0xB0;
    ET0 = 1;
    EA = 1;
    TR0 = 1;
    }
    }
    main()
    {

    int i;
    p1= 1;


    ti0();

    while(1);
    }
    mình muốn ban đầu sẽ là P1.0 sáng thôi, rồi dịch trái cho nó sáng từ P1.0 tới P1.7 ấy mà, nhưng nó chỉ sáng một lần, mình muốn lặp lại hoài thì phải làm sao?? mình mới học nên còn gà quá. hjhj

  • #2
    anh dùng phép dịnh trái của P1 nhưng anh chỉ khai báo P1=1 (00000001)có 1 lần lên khi anh dịnh hết 8 lần thì P1=00000000,vậy dịnh tiếp thì cũng chỉ còn tòan bit 0 thui.anh phải thêm 1 lệnh if(P1=0) P1=1; vào sau P1=P1<<1;vs cả anh chỗ anh set P1=1 ở dưới chỗ lệnh sbit để làm gì vậy??viết thế máy nó báo lỗi đó.
    đó là ý kiến của em,có gì sai sót mong mọi người chỉ bảo.

    Comment


    • #3
      Nguyên văn bởi lehieu1603 Xem bài viết
      void timer0()interrupt 1 //ngat timer 0
      {
      P0 = P0<<1;
      P1 = P1<<1;
      }
      void ti0() // khoi tao bo dinh thoi timer 0
      {
      unsigned int t;
      for(t=0;t<20000;t++)
      {
      EA = 0;
      TMOD = 0x01;
      TH0 = 0x3C;
      TL0 = 0xB0;
      ET0 = 1;
      EA = 1;
      TR0 = 1;
      }
      }
      mình thì mình chưa lập trình C cho 8051, nhưng mà theo như đoạn code phục vụ cho ngắt timer 0 thì sau khi thực hiện xong chương trình ngắt chưa có lệnh xóa cờ ngắt của timer 0 là TF0 ( TF0=0)
      để cho timer có thể đếm lại,
      thứ hai là dùng timer 0 ở mode 1 ( 16 bit) nhưng sau trình phục vụ ngắt timer 0 không có lệnh để nạp lại giá trị ban đầu cho timer 0 như thế TH0=0, và TL0=0, ( lại đếm từ đầu rồi).
      và lý do cuối cùng là trong C nếu dùng dịch bit thì nó không dịch như trong ASM, mà như bạn magic_kid đã nói là dịch xong hết thì giá trị của nó là 0, nên phải có lệnh để đặt lại giá trị cho Px.
      à, cho mình hỏi luôn, trong hàm con khởi tạo bộ định thời có cái vòng lặp dùng biến t để làm gì,
      theo như mình thấy thì nó lặp đi lặp lại 20000 lần mỗi cái công việc ghi mấy giá trị như code của bạn vào các thanh ghi ???

      Comment


      • #4
        Nguyên văn bởi hoadang Xem bài viết
        mình thì mình chưa lập trình C cho 8051, nhưng mà theo như đoạn code phục vụ cho ngắt timer 0 thì sau khi thực hiện xong chương trình ngắt chưa có lệnh xóa cờ ngắt của timer 0 là TF0 ( TF0=0)
        để cho timer có thể đếm lại,
        thứ hai là dùng timer 0 ở mode 1 ( 16 bit) nhưng sau trình phục vụ ngắt timer 0 không có lệnh để nạp lại giá trị ban đầu cho timer 0 như thế TH0=0, và TL0=0, ( lại đếm từ đầu rồi).
        và lý do cuối cùng là trong C nếu dùng dịch bit thì nó không dịch như trong ASM, mà như bạn magic_kid đã nói là dịch xong hết thì giá trị của nó là 0, nên phải có lệnh để đặt lại giá trị cho Px.
        à, cho mình hỏi luôn, trong hàm con khởi tạo bộ định thời có cái vòng lặp dùng biến t để làm gì,
        theo như mình thấy thì nó lặp đi lặp lại 20000 lần mỗi cái công việc ghi mấy giá trị như code của bạn vào các thanh ghi ???
        mình thì viết ASM, nói bạn việc nhỏ là cấu trúc ngắt timer của 89 khi có ngắt sẽ tự xóa cờ ngắt TFx nên ko cần phải xóa nữa.

        Comment


        • #5
          Nguyên văn bởi chung1608 Xem bài viết
          mình thì viết ASM, nói bạn việc nhỏ là cấu trúc ngắt timer của 89 khi có ngắt sẽ tự xóa cờ ngắt TFx nên ko cần phải xóa nữa.
          , cảm ơn chung1608 nhiều nha,
          và xin lỗi bạn chủ thớt vì nói sai,...ngại quá...

          Comment


          • #6
            Nguyên văn bởi lehieu1603 Xem bài viết
            mình muốn viết một đoạn c dùng ngắt timer, cho port P1 sáng đều từ P1.0 tới P1.7.
            code mình đây:
            #include <Regx51.h>
            sbit led1= P1^1;
            sbit led2= P1^2;
            sbit led3= P1^3;
            sbit led4= P1^4;
            sbit led5= P1^5;
            sbit led6= P1^6;
            sbit led7= P1^7;
            sbit led8= P1^0;
            P1 = 1;
            void timer0()interrupt 1 //ngat timer 0
            {
            P0 = P0<<1;
            P1 = P1<<1;
            }
            void ti0() // khoi tao bo dinh thoi timer 0
            {
            unsigned int t;
            for(t=0;t<20000;t++)
            {
            EA = 0;
            TMOD = 0x01;
            TH0 = 0x3C;
            TL0 = 0xB0;
            ET0 = 1;
            EA = 1;
            TR0 = 1;
            }
            }
            main()
            {


            p1= 1;


            ti0();

            while(1);
            }
            mình muốn ban đầu sẽ là P1.0 sáng thôi, rồi dịch trái cho nó sáng từ P1.0 tới P1.7 ấy mà, nhưng nó chỉ sáng một lần, mình muốn lặp lại hoài thì phải làm sao?? mình mới học nên còn gà quá. hjhj
            viết thử lai như sau:
            Code:
                 #include <Regx51.h>
            sbit led1= P1^1;
            sbit led2= P1^2;
            sbit led3= P1^3;
            sbit led4= P1^4;
            sbit led5= P1^5;
            sbit led6= P1^6;
            sbit led7= P1^7;
            sbit led8= P1^0;
            int i=0;
            void timer0()interrupt 1 //ngat timer 0
            {
            if(i<=8)
            {
            P0 = P0<<1;
            P1 = P1<<1;
            i++;
            }
            else
            {
            i=0;
            P1 =1;
            }
            }
            void ti0() // khoi tao bo dinh thoi timer 0
            {
            unsigned int t;
            for(t=0;t<20000;t++)
            {
            EA = 0;
            TMOD = 0x01;
            TH0 = 0x3C;
            TL0 = 0xB0;
            ET0 = 1;
            EA = 1;
            TR0 = 1;
            }
            }
            main()
            {
            P1= 1;
            ti0();
            while(1)
            {
            }
            }
            Last edited by tdm; 28-11-2011, 22:46.
            |

            Comment


            • #7
              Bác suy nghĩ như thế nào mà viết chương trình khởi tạo Timer 0 thế kia?
              Đường đến những ngày vinh quang không còn xa
              Con đường chúng ta... chúng ta đã chọn.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X