Thông báo

Collapse
No announcement yet.

vi điều khiển 8051

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

  • vi điều khiển 8051

    em có bài toán về ma trận phím viết bằng 89c51, đã viết rồi nhưng không sửa được mong các coa thủ trên 4rum giúp em với!
    //cho ma trận phím 4x4. khi ấn phím nào thì bật sáng phím đó trên led 7thanh.
    //đây là code em viết
    #include <REGX51.H>
    void tre(unsigned int t)
    {
    unsigned int i,j;
    for (i=0;i<t;i++)
    for(j=0;j<201;j++);
    }
    void quetphim()
    {
    P2=0xff; //set cac hang len muc cao
    if (P2_7==0)
    hang1();
    if (P2_6==0)
    hang2();
    if (P2_5==0)
    hang3();
    if (P2_4==0)
    hang4();
    }
    void khongbam()//cac led 7 thanh hien so 0
    {
    P2=0x0f;
    P1=0x40;
    P3=0x40;
    }
    void hang1()
    {
    P2=0xef;
    if (P2_3==0)
    nut1();
    if(P2_2==0)
    nut2();
    if(P2_1==0)
    nut3();
    if(P2_0=0)
    nut4();
    }
    void hang2()
    {
    P2=oxbf;
    if(P2_3==0)
    nut5();
    if(P2_2==0)
    nut6();
    if(P2_1==0)
    nut7();
    if(P2_0==0)
    nut8();
    }
    void hang3()
    {
    P2=0xdf;
    if(P2_3==0)
    nut9();
    if(P2_2==0)
    nut10();
    if(P2_1==0)
    nut11();
    if(P2_0==0)
    nut12();
    }
    void hang4()
    {
    P2=0x1f;
    if(P2_3==0)
    nut13();
    if(P2_2==0)
    nut14();
    if(P2_1==0)
    nut15();
    if(P2_0==0)
    nut16();
    }
    void nut1()
    {
    chongrung();
    P1=0x79; //bat so 1 tren led 7 thanh noi voi port1
    P3=0x40; //bat so 0 tren led 7 seg noi voi port3
    }
    void nut2()
    {
    chongrung();
    P1=0x24;
    P3=0x40;
    }
    void nut3()
    {
    chongrung();
    P1=0x30;
    P3=0x40;
    }
    void nut4()
    {
    chongrung();
    P1=0x19;
    P3=0x40;
    }
    void nut5()
    {
    chongrung();
    P1=0x12;
    P3=0x40;
    }
    void nut6()
    {
    chongrung();
    P1=0x03
    P3=0x40;
    }
    void nut7()
    {
    chongrung();
    P1=0x78;
    P3=0x40;
    }
    void nut8()
    {
    chongrung();
    P1=0x00;
    P3=0x40;
    }
    void nut9()
    {
    chongrung();
    P1=0x10;
    P3=0x40;
    }
    void nut10()
    {
    chongrung();
    P3=0x79;
    P1=0x40;
    }
    void nut11()
    {
    chongrung();
    P3=0x79;
    P1=0x79;
    }
    void nut12()
    {
    chongrung();
    P3=0x79;
    P1=0x24;
    }
    void nut13()
    {
    chongrung();
    P3=0x79;
    P1=0x30;
    }
    void nut14()
    {
    chongrung();
    P3=0x79;
    P1=0x19;
    }
    void nut15()
    {
    chongrung();
    P3=0x79;
    P1=0x12;
    }
    void nut16()
    {
    chongrung();
    P3=0x79;
    P1=0x03;
    }
    void chongrung()
    tre(50);
    void main()
    {
    while (1)
    {
    quetphim();
    }
    }

  • #2
    em có bài toán về ma trận phím viết bằng 89c51, đã viết rồi nhưng không sửa được mong các coa thủ trên 4rum giúp em với!
    Tôi nghĩ lỗi của bạn nằm ở đây:
    P2=0xff; //set cac hang len muc cao
    - Bạn nối 4 hàng và 4 cột của ma trận phím đều vào port 2. Khi bạn đặt P2 = 0xff trước khi quét phím, vậy thì khi một phím được bấm, sẽ chẳng có hàng nào chuyển xuống mức thấp , nên không một lệnh if nào được thực hiện cả.

    - Thuật toán quét phím bạn có thể thực hiện như sau:
    + B1: Đặt các hàng làm đầu vào, các cột làm đầu ra mức thấp
    +B2: Lần lượt kiểm tra các hàng xem có phím nào được bấm hay không.
    +B3: Nếu một hàng có phím bấm thì đặt hàng đó làm đầu ra mức thấp, đặt các cột làm đầu vào.
    +B4: Lần lượt kiểm tra các cột xem phím bấm nằm ở cột nào.

    - Chương trình hiển thị số thứ tự của phím bạn nên sử dụng ngắt timer.
    - Chương trình của bạn viết hơi phức tạp. Bạn có thể tham khảo một chương chương trình mẫu trong file tôi gửi kèm.
    Attached Files
    For a better world

    Comment


    • #3
      cảm ơn bác toan.vn nhá!
      nhưng sao bác lại phải sử dụng timer thế. có vẻ phức tạp thêm rôi, mô phỏng không chạy được mặc dù code dúng rồi.

      Comment


      • #4
        nhưng sao bác lại phải sử dụng timer thế. có vẻ phức tạp thêm rôi, mô phỏng không chạy được mặc dù code dúng rồi.
        - Sorry, tại tôi không dùng mô phỏng bao giờ, nhưng đối với bài toán quét phím trên mạch thật, bạn nên quét LED bằng ngắt timer, để tiết kiệm thời gian xử lý của CPU. CPU sẽ dành nhiều thời gian cho việc quét phím hơn.

        Thân mến,
        For a better world

        Comment


        • #5
          uh! thanks bạn toan.lv nhé tiện đây giúp tôi cái bài bắt xườn xung luôn nhé.
          //cho 2 cảm biến thông qua gắn vào chân P@_0 và P2_4. P2_0 gắn ở lối vào còn P2_4 ở //lối ra của 1 phòng chờ . Hãy bật đèn xanh khi ki số người trong phòng <=15, đèn đỏ khi //lớn hơn 20 người và còn lạ bật đèn vàng.
          #include <REGX51.H>
          #define dendo P1_0
          #define denvang P1_1
          #define denxanh P1_2
          void main ()
          {
          bit oldP2_0,newP2_0,oldP2_4,newP2_4;
          unsigned char vao,ra;
          vao=0; ra=0;
          while(1)
          {
          oldP2_0=newP2_0;
          newP2_0=P2_0;
          oldP2_4=newP2_4;
          newP2_4=P2_4;
          if((P2_0==1)&&(newP2_0==0))
          {
          if(oldP2_4==1)
          {
          vao++;
          if(vao<=15)
          denxanh=0;//bat den xanh
          else if((vao>15)&&(vao<=20))
          {
          denvang=0;//bat den vang
          denxanh=1;//tat den xanh
          }
          else if (vao>20)
          {
          dendo=0;//bat den do
          denvang=1;//tat den vang
          }
          }
          else
          {
          ra--;

          if(15<(vao-ra)<21)
          {
          denxanh=dendo=1;
          denvang=0;
          }
          else if((vao-ra)>20)
          {
          denvang=1;
          dendo=0;
          }
          else if (vao==ra)
          {
          dendo=1;
          denxanh=0;

          }
          }
          }
          }

          Comment


          • #6
            //cho 2 cảm biến thông qua gắn vào chân P@_0 và P2_4. P2_0 gắn ở lối vào còn P2_4 ở //lối ra của 1 phòng chờ . Hãy bật đèn xanh khi ki số người trong phòng <=15, đèn đỏ khi //lớn hơn 20 người và còn lạ bật đèn vàng.
            Bạn thử đưa bài toán và thiết kế của bạn lên thì mới phân tích được. Nếu chỉ nối 2 cảm biến vào VDK ở lối vào và lối ra như vậy thì làm thế nào để phân biệt được các trường hợp sau:
            +Hai người hoặc lớn hơn 2 người cùng đi ra (hoặc đi vào) một lúc (chắc là cửa phải lớn chứ không thể nhỏ để chỉ 1 người đi vừa).
            +Hai người đi vào và đi ra trên cùng 1 cửa.

            Thân mến,
            For a better world

            Comment


            • #7
              đó là thiết kế của tui rồi đó bác ạ. còn phần cứng thì ghépdddown giản thôi với proteus 2min là song mà. 2 cảm biến tương ứng với hai nút bấm gắn vào P2_0 và P2_4 thôi. còn đèn đỏ tới P1_0, đèn vàng tới P1_1, đèn xanh tới P1_2. bác giúp tôi với nhé! với trường hợp chỉ có 1 người ầo và ra thôi , đơn giản ấy mà.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X