Thông báo

Collapse
No announcement yet.

[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
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

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

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


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


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


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


          • #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, 20:22.
            |

            Comment


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


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


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

                  Comment


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


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