RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

đến số từ 1 đến 99

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • nhuhung135
    Thành viên mới
    • May 2011
    • 16

    #1

    đến số từ 1 đến 99

    mình mới học vi diều khiển . Mình muốn làm mạch đến số từ 1 đến 99 . nhưng mình ko biết muốn cho hiển thị trễ một giây,ví dụ hiển thị số 0 đến số 1 trễ với nhau là một giây thì ko biết phải dùng lệnh nào!!!hix Mong các bạn giúp mình với!!!
    dưới đây là code của mình
    #include <REGX52.H>
    #include<stdio.h>
    #include<math.h>
    unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90};
    unsigned char donvi,chuc,so;
    int j; int i;
    void tre(void)
    {
    TMOD=0x02;
    TH0=TL0-50;
    TR0=1;
    while(!TF0);
    TF0=0;
    TL0= 0;
    }
    void wait(void)
    {
    for(i=1;i<=10000;++i)
    tre();
    }
    void main(void)
    {
    chuc=so/10;
    donvi=so%10;
    while(1)
    {
    for(so=0;so<=99;++so)
    wait_a_second();
    {
    P1= 0xfd;
    P2=M[donvi];
    tre();
    P1=0xfe;
    P2=M[chuc];
    tre();
    }
    }
    }
    nếu dùng code này thì mạch hiển thị sẽ chạy nhanh kinh khủng chả dõ gì luôn!!!!!!!!!! hix. các bạn giúp mình với!!!!! xin đa ta!!
  • Multi System
    Thành viên tích cực
    • Feb 2008
    • 671

    #2
    Muốn số đếm tăng lên 1 đơn vị sau 1s thì nên dùng Timer (tương đối chính xác). Trước hết cần biết mình dùng thạch anh có tần số dao động là bao nhiêu, từ đấy sẽ tính toán được giá trị cần nạp cho THx và TLx.
    Để hiển thị được các giá trị đếm liên tục và đẹp mắt thì nên dùng phương pháp quét Led trong ngắt.
    Ví dụ hàm delay theo đơn vị sec dùng Timer với tần số thạch anh là 12MHz:
    PHP Code:
    void delay(unsigned char sec){
       while(sec--){
             unsigned int temp;             
             temp=1000;
             while(temp--) {
                    TMOD=0x01;   //Timer0, Mode 1
                       
                    TH0=0xFC;
                    TL0=0x18 ;
                    TR0=1;
                    while(!TF0);
                    TR0=0;
                    TF0=0;
                        
                    }
             }
     } 
    
    như vậy muốn giá trị đếm tăng lên 1 sau mỗi giây ta chỉ cần gọi hàm delay(1);
    Ví dụ:
    PHP Code:
    void main(){
       .....
        while(1){
           GiaTriDem ++;
           delay(1);
        }
    } 
    

    Comment

    • nhuhung135
      Thành viên mới
      • May 2011
      • 16

      #3
      Xin đa tạ bạn rất nhiệu !!!!!!!!!
      để mình thử xem dược không nhé!

      Comment

      • dva_1991
        Thành viên mới
        • May 2011
        • 7

        #4
        mình cũng đã lập trình về bài này rồi.chạy ok luôn .mô phỏng trên protuos rồi
        đây là code:
        $include(reg51.inc)
        org 0000h
        mov r0,#00h
        mov r1,#00h
        mov dptr,#ma
        x1:
        mov a,r0
        movc a,@a+dptr
        mov p2,a

        mov a,r1
        movc a,@a+dptr
        mov p1,a

        lcall tre
        inc r0
        cjne r0,#10,x1
        mov r0,#00h
        inc r1
        cjne r1,#10,x1
        mov r1,#00h
        jmp x1
        tre:mov r2,#255
        de :mov r3,#10
        be:mov r4,#50
        djnz r4,$
        djnz r3,be
        djnz r2,de
        ret
        ma:db 0fch,60h,0dah,0f2h,66h,0b6h,3eh,0e0h,0feh,0e6h
        end
        chúc bạn thành công

        Comment

        • nhuhung135
          Thành viên mới
          • May 2011
          • 16

          #5
          thanks bạn nhé !!!! hix !!mình mới bắt đầu học vi điều khiển nên mình mới chỉ nguyên cứu bằng trình dịch keill C thôi cái của bạn đành tìm hiểu sau vậy!!!!!!!!

          Comment

          • 0977817726
            Thành viên chính thức
            • May 2010
            • 36

            #6
            hàm "wait_a_second();" Bạn viết chỗ nào nhỉ? Sao mình chỉ thấy bạn sử dụng nó mà không thấy bạn viết nó nhỉ. Bạn viết thế này là ok mà "for(so=0;so<=99;++so) //Đếm
            wait();// Chờ 1s"
            Đúng như bạn Multi System nói bạn nên viết hàm quét LED sẽ hay hơn.

            Comment

            • nhuhung135
              Thành viên mới
              • May 2011
              • 16

              #7
              uhm!! xin lỗi bạn ha!! hj mình viết nhầm ấy mà . Đó phải là wait() như bạn nói đúng không nhưng minh thử rồi làm như vậy thì mạch sẽ không chạy luôn!!!!!!!!!!
              Bạn thử xem lại hộ mình với!!

              Comment

              • 0977817726
                Thành viên chính thức
                • May 2010
                • 36

                #8
                Bạn thử xem nha.
                #include <REGX52.H>
                #include<stdio.h>
                #include<math.h>
                unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90};
                unsigned char donvi,chuc,so;
                int j,i;
                void tre(void)
                {
                TMOD=0x02;
                TH0=TL0-50;
                TR0=1;
                while(!TF0);
                TF0=0;
                TL0= 0;
                }
                void wait(void)
                {
                for(i=1;i<=10000;++i)
                tre();
                }
                void xoa(void)
                {
                P1=0xff;
                P2=0x00;
                }
                void hien_thi(unsigned char m)
                {
                chuc = m/10;
                donvi=m%10;
                while(1)
                {
                P1=0xfe;
                P2=M[chuc];
                tre();
                xoa();
                P1=0xfd;
                P2=M[donvi];
                tre();
                xoa();
                }


                }
                void main(void)
                {
                while(1)
                {
                for(i=0;i<100;i++)
                {
                hien_thi(i);
                wait;
                }
                }
                }

                Comment

                • namngockute
                  Thành viên mới
                  • Mar 2011
                  • 15

                  #9
                  bạn thêm delay(1000); vào mỗi lần hiện thị
                  "Hoa vô tình hoa trôi theo nước
                  Nước vô tình nước để hoa trôi
                  Anh vô tình khi không nghe gió nói
                  Gió nói rằng "em vẫn mãi yêu anh!"

                  Comment

                  • swat_heliket
                    Thành viên chính thức
                    • Apr 2011
                    • 52

                    #10
                    sao cod cua bạn 0977817726 mình thử trên proteus thì nó báo lỗi và cpu load 100%. là do cod hay do prteus vậy bạn ???

                    Comment

                    • nhuhung135
                      Thành viên mới
                      • May 2011
                      • 16

                      #11
                      Nguyên văn bởi 0977817726 Xem bài viết
                      Bạn thử xem nha.
                      thanhks bạn nha !! với code nay thì đã hiểu hơn nhiều!!!!!

                      Comment

                      • nhuhung135
                        Thành viên mới
                        • May 2011
                        • 16

                        #12
                        ec!!!! ban oi code cua bạn mình cho chạy thử rồi . nhưng vẫn cứ chạy loạn cả lên chẳng nhìn thấy hình gì cả bạn ah!!!

                        Comment

                        • kissyou
                          Thành viên chính thức
                          • Sep 2009
                          • 85

                          #13
                          Nguyên văn bởi nhuhung135 Xem bài viết
                          mình mới học vi diều khiển . Mình muốn làm mạch đến số từ 1 đến 99 . nhưng mình ko biết muốn cho hiển thị trễ một giây,ví dụ hiển thị số 0 đến số 1 trễ với nhau là một giây thì ko biết phải dùng lệnh nào!!!hix Mong các bạn giúp mình với!!!
                          dưới đây là code của mình
                          #include <REGX52.H>
                          #include<stdio.h>
                          #include<math.h>
                          unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x90};
                          unsigned char donvi,chuc,so;
                          int j; int i;
                          void tre(void)
                          {
                          TMOD=0x02;
                          TH0=TL0-50;
                          TR0=1;
                          while(!TF0);
                          TF0=0;
                          TL0= 0;
                          }
                          void wait(void)
                          {
                          for(i=1;i<=10000;++i)
                          tre();
                          }
                          void main(void)
                          {
                          chuc=so/10;
                          donvi=so%10;
                          while(1)
                          {
                          for(so=0;so<=99;++so)
                          wait_a_second();
                          {
                          P1= 0xfd;
                          P2=M[donvi];
                          tre();
                          P1=0xfe;
                          P2=M[chuc];
                          tre();
                          }
                          }
                          }
                          nếu dùng code này thì mạch hiển thị sẽ chạy nhanh kinh khủng chả dõ gì luôn!!!!!!!!!! hix. các bạn giúp mình với!!!!! xin đa ta!!

                          Bạn nên tạo 1 cờ để hạn nút. Nếu ấn nút thì biến tăng 1, giữ mãi thì ko tăng.

                          Comment

                          • nhuhung135
                            Thành viên mới
                            • May 2011
                            • 16

                            #14
                            Nguyên văn bởi namngockute Xem bài viết
                            bạn thêm delay(1000); vào mỗi lần hiện thị
                            thêm như thế nào cơ !!! bạn nói dõ giup mình với !!hix mình mới học vi điều khiển!!!!

                            Comment

                            • nhquangdt3k5
                              Thành viên tích cực
                              • Nov 2010
                              • 433

                              #15
                              Nguyên văn bởi nhuhung135 Xem bài viết
                              thêm như thế nào cơ !!! bạn nói dõ giup mình với !!hix mình mới học vi điều khiển!!!!
                              bạn có thể làm như thế này nhé:
                              tạo một biến đếm và dùng timer cứ 1s cho biến đếm ý tăng lên 1 đơn vị bằng cách tính toán giá trị timer cho phù hợp sau đó lấy giá trị đếm được cho nó hiển thị ra số bắng cách chia cho 10 để lấy hàng chục và lấy giá trị đếm được - 10*hangchuc = đơn vị sau đó công việc còn lại chỉ là quét led thôi. ban đầu cho led hàng chục sáng led đơn vị tắt delay_ms(10) sau đó lại cho hàng đơn vị led hàng chục tắt. cứ như vậy trong 1 thời điểm chỉ có 1 led sáng nhưng do hiện tượng lưu ảnh chúng ta vẫn có thể nhìn thấy tất cả led đều sáng.
                              Never forget who you are!

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...