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

[Cần giúp đỡ] Mạch đếm ngược từ 9999 về 0 sử dụng 89c51 viết trên Keil C

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • thethe12
    Thành viên mới
    • Aug 2012
    • 15

    #1

    [Cần giúp đỡ] Mạch đếm ngược từ 9999 về 0 sử dụng 89c51 viết trên Keil C

    Tình hình là em mới tìm hiểu sơ qua về họ 8051, và đang tập tẹ làm cái mạch đếm ngược từ 9999 về 0 nhưng còn vướng mắc nhiều thứ nên mong các bác giúp dỡ.
    Linh kiện gồm 98c51, tụ , trở, tran ...
    Mạch của em đây:
    Click image for larger version

Name:	machdemnguoc.jpg
Views:	1
Size:	135.0 KB
ID:	1414226

    Code viết trên Keil C:
    Code:
    #include <regx51.h>
    #define led0 P1_0
    #define led1 P1_1
    #define led2 P1_2
    #define led3 P1_3
    unsigned char so[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
    int i;	
    void delay(unsigned int ms)	   // Tao ham tre
      {
       unsigned int k,j;
        for (k=0;k<ms;k++)
        for (j=0;j<120;j++)
        {} 
      }
    
    void hienthi()
     {
      P0=0xff;
      P1=0xff;
      
      P0=so[((i%1000)%100)%10];	//hien so hang don vi
      led0=0;
      delay(1);
      led0=1;
      
      P0=so[((i%1000)%100)/10];	 //hien so hang chuc
      led1=0;
      delay(1);
      led1=1;
       
      P0=so[(i%1000)/100];	  //hien so hang tram
      led2=0;
      delay(1);
      led2=1;
    
      P0=so[(i/1000)];		//hien so hang nghin
      led3=0;
      delay(1);
      led3=1;
     } 
    
    void main ()
     {
    
      while (1)
        {
    	 for(i=9999;i>=0;i--)
    	 {
    	  hienthi();
    	  delay(1000);
    	 }
    	}
     }
    Các bác xem em bị lỗi gì mà không chạy được.

    Mạch chạy trên Proteus và code trên Keil C của em đây.
    machdemnguoc.rar
    Mong các bác giúp đỡ :-s
  • hoadang
    Thành viên tích cực
    • Jun 2010
    • 191

    #2
    chạy thế nào được mà chạy, 4 led chung đường dữ liệu, mà bạn chỉ cho quét qua một lần rồi tăng lên số tiếp theo, sao mà hiển thị được. viết lại chương trình đi.

    Comment

    • bienhou
      Thành viên tích cực
      • Dec 2011
      • 971

      #3
      ko phải ko chạy mà nó bị nhảy led thời gian delay(1000) . theo hàm delay của bạn sẽ là 1s mà hàm quét của bạn là 1ms, như vậy nó sẽ nảy ko đúng đâu.
      bạn đặt biến i vào hàm ngắt timer, như vậy nó sẽ chính xác hơn
      Nguyễn Huy Biên - 01649 802 694
      gmail :

      Comment

      • thethe12
        Thành viên mới
        • Aug 2012
        • 15

        #4
        Nguyên văn bởi hoadang Xem bài viết
        chạy thế nào được mà chạy, 4 led chung đường dữ liệu, mà bạn chỉ cho quét qua một lần rồi tăng lên số tiếp theo, sao mà hiển thị được. viết lại chương trình đi.
        Em vẫn chưa rành lắm, bác chỉ dẫn e với :-s
        Nguyên văn bởi bienhou Xem bài viết
        ko phải ko chạy mà nó bị nhảy led thời gian delay(1000) . theo hàm delay của bạn sẽ là 1s mà hàm quét của bạn là 1ms, như vậy nó sẽ nảy ko đúng đâu.
        bạn đặt biến i vào hàm ngắt timer, như vậy nó sẽ chính xác hơn
        E vẫn chưa hiểu lắm, bác nói rõ , hoặc sửa lại cho e với, em mới làm quen với vdk mà

        Comment

        • bienhou
          Thành viên tích cực
          • Dec 2011
          • 971

          #5
          Code:
          #include <REGX51.H>
          unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
          unsigned char i=99;
          unsigned char n;
          unsigned char a=0;
          sbit A1=P1^0; // Anot led hang chuc
          sbit A2=P1^1;	 // Anot led hang don vi
          void delay(unsigned int time) //ham tre phuc vu quet led
          {unsigned int n;
          for(n=0;n<time;n++)
          {
          ;
          }
          }
          void hienthi()
          {// LED HANG CHUC
          
                    A1=1;
                    P2=M[i/10];
                    delay(50);
                    A1=0;	 // xoa led
                    P2=0xff;
          //............LED HANG DON VI
                    A2=1;
                    P2=M[i%10];
                    delay(50);
                    A2=0; 
                    P2=0xff;
          }
          void khoitao()
          { 
                    TMOD = 0x01;
                    IE = 0x82; 
                    TH0 = -5000/256; //tre 5ms
                    TL0 = -5000%256;
                    EA = 1;
                    ET0 = 1;
                    TR0 = 1;
          
          }
          void isr_timer0(void) interrupt 1
          { 
                    TF0 = 0;
                    TR0 = 0;
                    a++;
                    hienthi();
                    TH0 = -5000/256;
                    TL0 = -5000%256;	
                    TR0=1;
                    if(a==200)
                       {
                          a=0;
                          i--;
          
                       }
          
          }	
          void main()
          { 
          khoitao();
          {
          while(1)//{
          if(i==0)
          i=99;
          }
          
          }
          bạn tham khảo nhé
          Nguyễn Huy Biên - 01649 802 694
          gmail :

          Comment

          • tdm
            Thành viên tích cực
            • Sep 2005
            • 349

            #6
            Nguyên văn bởi thethe12 Xem bài viết
            Tình hình là em mới tìm hiểu sơ qua về họ 8051, và đang tập tẹ làm cái mạch đếm ngược từ 9999 về 0 nhưng còn vướng mắc nhiều thứ nên mong các bác giúp dỡ.
            Linh kiện gồm 98c51, tụ , trở, tran ...
            Mạch của em đây:
            [ATTACH=CONFIG]51533[/ATTACH]

            Code viết trên Keil C:
            Code:
            #include <regx51.h>
            #define led0 P1_0
            #define led1 P1_1
            #define led2 P1_2
            #define led3 P1_3
            unsigned char so[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
            int i;    
            void delay(unsigned int ms)       // Tao ham tre
              {
               unsigned int k,j;
                for (k=0;k<ms;k++)
                for (j=0;j<120;j++)
                {} 
              }
            
            void hienthi()
             {
              P0=0xff;
              P1=0xff;
              
              P0=so[((i%1000)%100)%10];    //hien so hang don vi
              led0=0;
              delay(1);
              led0=1;
              
              P0=so[((i%1000)%100)/10];     //hien so hang chuc
              led1=0;
              delay(1);
              led1=1;
               
              P0=so[(i%1000)/100];      //hien so hang tram
              led2=0;
              delay(1);
              led2=1;
            
              P0=so[(i/1000)];        //hien so hang nghin
              led3=0;
              delay(1);
              led3=1;
             } 
            
            void main ()
             {
            
              while (1)
                {
                 for(i=9999;i>=0;i--)
                 {
                  hienthi();
                  delay(1000);
                 }
                }
             }
            Các bác xem em bị lỗi gì mà không chạy được.

            Mạch chạy trên Proteus và code trên Keil C của em đây.
            machdemnguoc.rar
            Mong các bác giúp đỡ :-s
            em có thể sửa lại như sau:
            Code:
            #include <regx51.h>
            #define led0 P1_0
            #define led1 P1_1
            #define led2 P1_2
            #define led3 P1_3
            unsigned char so[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
            int i;
            int lap_1s;    
            void delay(unsigned int ms)       // Tao ham tre
              {
               unsigned int k,j;
                for (k=0;k<ms;k++)
                for (j=0;j<120;j++)
                {} 
              }
            
            void hienthi()
             {
              P0=0xff;
              P1=0xff;
              
              P0=so[((i%1000)%100)%10];    //hien so hang don vi
              led0=0;
              delay(2);
              led0=1;
              
              P0=so[((i%1000)%100)/10];     //hien so hang chuc
              led1=0;
              delay(2);
              led1=1;
               
              P0=so[(i%1000)/100];      //hien so hang tram
              led2=0;
              delay(2);
              led2=1;
            
              P0=so[(i/1000)];        //hien so hang nghin
              led3=0;
              delay(2);
              led3=1;
             } 
            
            void main ()
             {
              
              while (1)
                {
                 for(i=9999;i>=0;i--)
                 {
                  for(lap_1s=0;lap_1s<125;lap_1s++ ){//125*8ms(hàm hienthi)=1s
                  hienthi();}
                  }
                }
             }
            mô phỏng thay tranzitor bằng cổngnot.
            Attached Files
            Last edited by tdm; 11-09-2012, 19:22.
            |

            Comment

            • thethe12
              Thành viên mới
              • Aug 2012
              • 15

              #7
              Nguyên văn bởi tdm Xem bài viết
              em có thể sửa lại như sau:
              .....
              mô phỏng thay tranzitor bằng cổngnot.
              E chạy được rồi, cảm ơn bác nhiều
              Tiện thể bác cho e hỏi mô phỏng thì thay tranzitor bằng cổngnot .Vậy mạch thật để tranzitor theo như hình của e là ổn chưa, hay thông số phải như thế nào?

              Comment

              • tdm
                Thành viên tích cực
                • Sep 2005
                • 349

                #8
                Nguyên văn bởi thethe12 Xem bài viết
                E chạy được rồi, cảm ơn bác nhiều
                Tiện thể bác cho e hỏi mô phỏng thì thay tranzitor bằng cổngnot .Vậy mạch thật để tranzitor theo như hình của e là ổn chưa, hay thông số phải như thế nào?
                kích tranzitor em tham khảo hình sau:
                Attached Files
                |

                Comment

                • xuan dong
                  Thành viên mới
                  • Mar 2008
                  • 4

                  #9
                  Mình cũng mới tìm hiểu

                  Comment

                  • thuyetc2
                    Thành viên mới
                    • Feb 2013
                    • 3

                    #10
                    mấy anh giúp cho em cái code 8led: chảy từ 99999999->00000000. em moi học mong may anh gúp dùm. thanks

                    Comment

                    • thuyetc2
                      Thành viên mới
                      • Feb 2013
                      • 3

                      #11
                      Nguyên văn bởi thuyetc2 Xem bài viết
                      mấy anh giúp cho em cái code 8led: chảy từ 99999999->00000000. em moi học mong may anh gúp dùm. thanks
                      làm được rồi!thanks

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...