Thông báo

Collapse
No announcement yet.

Phân biệt hàng chục và hàng đơn vị trong C với Led 7 thanh

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

  • Phân biệt hàng chục và hàng đơn vị trong C với Led 7 thanh

    Chào các bạn!
    Mình cũng mới học lập trình C với VDK 8051
    Mình đang làm bài tập hiển thị ra LED 7 thanh, đếm số lùi
    Nhưng mình ko biết làm sao để cho VDK phân biệt dc đâu là led hiển thị hàng chục, đâu là led hiển thị hàng đơn vị.
    Mọi ng` có kinh nghiệm hay có tài liệu gì giúp mình với
    Chương trình của mình viết bằng C

  • #2
    VDK ko phân biệt đc đâu bạn,bạn phải tự phân biệt ^.^
    Trước hết bạn phải tính
    chục=số / 10;
    đ vị=số % 10;
    Bạn dùng 2 LED7 đoạn,1 LED hiển thị số hang chục,LED kia hiển thị số hàng đơn vị
    Thân!

    Comment


    • #3
      ví dụ mình muốn cho 2 con led 7 thanh đếm lùi từ 45 về ko như thế này thì nó có chạy ko nhỉ . Dùng cổng P1 để nối cho 2 con led, qua bộ 7447
      #include <AT9X51.h>
      int x1;
      char led[] = { 0x3F, 0x16, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67 };

      void delay(unsigned int x)
      {
      unsigned char j;
      unsigned char i;
      for(i=0;i<=x;i++)
      {
      for(j=0;j<=1000;j++)
      {}
      }
      }

      void main (void)
      {
      P1=0;
      x1=45;
      while(1);
      for(x1=45; x1>0; x1--)
      {
      led1 = x1/10;
      led2 = x1%10;
      P1 = led[x1];
      delay(1000);
      }
      }

      code như thế này thì chắc là nó vẫn ko phân biệt dc đâu là led hàng chục, đâu là led hàng đơn vị.
      Vậy sau khi mình tính toán như vậy rồi, mình sẽ phải khai báo như thế nào để VDK hiểu mình muốn quy ước con led 1 là để hiển thị hàng chục, con led2 là để hiển thị hàng đơn vị.
      Cấu trúc ctrinh này mình làm tương tự như cái ví dụ trong sách của Ngô Diên Tập

      Comment


      • #4
        Sao P1=led[x1] được ?
        Vậy bạn dùng công thức tính ra giá trị led1, led 2 để làm gì ?
        Bạn có thể cho biết mạch của bạn nối thế nào không ?

        Comment


        • #5
          Mình nối P1.0 đến P1.3 với led1, P1.4 đến P1.7 với led2.
          Nếu nối như vậy thì thay lệnh P1 = led[x1] mình sẽ thay bằng lệnh gì nhỉ

          Comment


          • #6
            Nói như vậy thì bạn đã dùng tới 2 IC giải mã, không dùng phương pháp quét led, và cũng chẳng biết bạn điều khiển mức tích cực là 0 hay 1 nữa.
            Cái bạn cần hiện thị là chữ số hàng chục(led1) và hàng đơn vị(led2), biến x1 của bạn chỉ là biến đếm thôi. Do đó:
            P1= led[led1]; // Hang chục
            P1= led[led2]; // Hàng đơn vị.
            Phương pháp của bạn khá phức tạp, bạn nên dùng phương pháp quét led.

            Comment


            • #7
              Mình nối P1.0 đến P1.3 với led1, P1.4 đến P1.7 với led2.
              Nếu nối như vậy thì thay lệnh P1 = led[x1] mình sẽ thay bằng lệnh gì nhỉ
              1/Bạn thử up sơ đồ nguyên lý lên xem, tôi đoán rằng bạn sử dụng 2 IC giải mã BCD sang 7 thanh (7447). Chắc bạn mô phỏng trên proteus phải không, nên mới sẵn có IC, thực tế thì không cần dùng thêm 2 con này cho tốn kém. Nếu bạn dùng 2 con 7447 thì không cần phải define bảng LED code. Mỗi con 7447 nó có một tổ hợp trạng thái đầu ra ứng với các tổ hợp đầu vào. Các tổ hợp đầu ra này tương ứng điều khiển LED 7 thanh sáng thành các con số. Vì thế khi bạn out dữ liệu ra, muốn sáng số nào thì đưa tổ hợp đầu vào tương ứng cho 7447. ví dụ: Muốn sáng số 0 thì đưa vào đầu vào 7447 là 0000. sáng số 1 thì đưa vào 0001.
              2/7447 chỉ tương thích với LED A chung. Ngoài ra với 8051 người ta chỉ dùng với LED A chung thôi vì 8051 hút dòng tốt, nhưng khả năng bơm dòng thì rất dở hơi.
              3/
              Vậy sau khi mình tính toán như vậy rồi, mình sẽ phải khai báo như thế nào để VDK hiểu mình muốn quy ước con led 1 là để hiển thị hàng chục, con led2 là để hiển thị hàng đơn vị.
              Vi điều khiển nó không quy định, mà là do bạn quy định. Bạn đặt 2 con led cạnh nhau, con nào ở trước đó là số hàng chục, con nào đứng sau là số hàng đơn vị (theo đúng quy ước của hệ thập phân). Không cần biết đó là LED1 hay LED2 nhưng khi bạn out hàng đơn vị thì phải out ra LED đặt sau, out hàng chục phải out ra LED đặt trước, nếu không thì nó sẽ bị ngược.
              For a better world

              Comment


              • #8
                Đây là sơ đồ nguyên lý của mình
                Nó đơn giản thôi, cái cốt lõi là mình muốn lập đoạn code để VDK hiểu dc là mình muốn tín hiệu xuất ra led nào là số hàng chục, led nào là số hàng đơn vị.
                Thì những cái như led đứng trc là hàng chục , đứng sau là hàng đơn vị là những cái quy ươc quá rõ ràng, bất thành văn rồi.
                Khi lập mã, mình có phải khai báo cho VDK biết con 7447 dc nối với chân nào ko nhỉ?
                Và phải khai báo như thế nào đây, 1 con 7447 có 4 chân dc nối với 8051, mình chưa biết cách khai báo kiểu đó.
                Các bạn thử cho mình 1 đoạn ví dụ cho cái mạch trên của mình xem, có lẽ mình sẽ nhanh hiểu hơn như thế này, và các bạn lãi đỡ phải bực mình vì những câu hỏi có phần ngớ ngẩn ^ ^
                Mình có dùng 7447 thì mới có những cái vướng mắc này mà, quét LED thì có phải phân vân chục đơn vị như thế này đâu bạn ơi
                Attached Files

                Comment


                • #9
                  Bạn tham khảo cách nối chân 7447 và code ở đây

                  Comment


                  • #10
                    thanks bạn, đã biết dc cách khai báo rồi, nhưng vẫn chưa hình dung ra dc cách để phân biệt dc hàng chục và hàng đơn vị. Hay như trong ví dụ trên, nếu muốn đếm từ 1 -20 thì mình sẽ phải làm như thế nào?
                    Những bài về trường hợp đếm này mình cũng đã tìm thấy mấy bài, nhưng họ toàn viết bằng ASM cả nên mình ko hiểu dc ( các bạn thông cảm, mình mới học C thôi, ASM còn chưa kịp làm quen )http://dientuvietnam.net/forums/show...t=1195&page=79

                    Comment


                    • #11
                      hic, ko lẽ nếu ko dùng quét Led thì box 8051 ko ai cho đếm dc từ 1 đến 20 bằng C sao ??????

                      Comment


                      • #12
                        Bạn cảm thấy bực mình vì không có ai trả lời câu hỏi của bạn sao? Bạn mới tìm hiểu và đưa ra một số câu hỏi mà bạn cảm thấy đó là những câu hỏi "ngẩn ngơ" nhưng chẳng có ai bực mình hay trách bạn cả. Tuy nhiên tất cả mọi người ai cũng có công việc của mình, kể cả Mod của các box cũng không có ai ngồi cả ngày để trực trả lời câu hỏi của các bạn đâu. Người ta còn phải kiếm sống chứ. Vì thế tôi nghĩ nếu bạn post lên một câu hỏi mà chưa nhận được câu trả lời thì hãy kiên nhẫn một chút. Thay vì ngồi chờ một cách thụ động bạn hãy search, và tự tìm hiểu thêm, vấn đề này không phải bây giờ mới có bạn hỏi, nó đã được hỏi và giải thích không biết bao nhiêu lần rồi. Những câu hỏi kiểu như:
                        hic, ko lẽ nếu ko dùng quét Led thì box 8051 ko ai cho đếm dc từ 1 đến 20 bằng C sao ??????
                        sẽ chẳng có ai trả lời cho bạn đâu.

                        Về câu hỏi của bạn:
                        Nó đơn giản thôi, cái cốt lõi là mình muốn lập đoạn code để VDK hiểu dc là mình muốn tín hiệu xuất ra led nào là số hàng chục, led nào là số hàng đơn vị.
                        VDK nó sẽ chẳng bao giờ hiểu được đâu là LED hàng chục, đâu là LED hàng đơn vị. Thậm chí nó chẳng cần biết thiết bị ngoại vi bên ngoài đang kết nối với nó là gì. Vấn đề là ở bạn, bạn thiết kế phần cứng cho nó. Bạn bảo nó out một tổ hợp logic ra cổng P0 thì nó sẽ out ra cho bạn. Còn tổ hợp logic đó làm sáng LED hàng chục hay là LED hàng đơn vị là do cách thiết kế ngoại vi bên ngoài của bạn mà thôi. VDK nó không quan tâm, và cũng không hiểu được.

                        VDK nó chỉ biết và có thể phân biệt chính xác các ngoại vi on-chip của nó, còn các ngoại vi off chíp thì hoàn toàn phụ thuộc vào người thiết kế

                        Và phải khai báo như thế nào đây, 1 con 7447 có 4 chân dc nối với 8051, mình chưa biết cách khai báo kiểu đó.
                        Khi phần cứng đã nối đúng, bạn chẳng cần phải khai báo cái gì hết. Bạn căn cứ vào các chân mà mình đã nối và bảo thằng VDK nó out các trạng thái tương ứng với đầu vào của 7447 là chúng nó hiểu nhau. Trong trình soạn thảo, để cho chương trình sáng sủa thì bạn có thể define tên của các chân nối này theo ý bạn cho dễ hiểu.
                        Thì những cái như led đứng trc là hàng chục , đứng sau là hàng đơn vị là những cái quy ươc quá rõ ràng, bất thành văn rồi.
                        Nếu bạn đã biết quy ước này là rõ ràng, là luật bất thành văn thì xin hãy làm theo nó, chẳng cần phải sáng tạo thêm điều gì cả. Bởi vì từ trước đến nay các đại hiệp lừng danh thiên hạ hay hậu bối vô danh tiểu tốt đều làm như thế. Còn về lý do thì bởi vì bạn đang làm với hệ nhúng. Mà hệ nhúng thì phần mềm nó liên quan trực tiếp đến phần cứng. Mỗi khi phần cứng thay đổi thì phần mềm cũng phải thay đổi theo. Không có một chương trình phần mềm nào dùng được cho mọi mạch khi phần cứng khác nhau.
                        For a better world

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X