Thông báo

Collapse
No announcement yet.

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

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

  • đế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!!

  • #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


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

      Comment


      • #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


        • #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


          • #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


            • #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


              • #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


                • #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


                  • #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


                    • #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


                      • #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


                        • #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


                          • #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


                            • #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...
                              X