Thông báo

Collapse
No announcement yet.

giúp mình code đo tốc độ động cơ vs

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

  • giúp mình code đo tốc độ động cơ vs

    Code:
    #include <REGX51.H>
    sbit A1 = P1^0;
    sbit A2 = P1^1;
    sbit A3 = P1^2;
    sbit A4 = P1^3;
    unsigned char so[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    unsigned char xung,i;             
    unsigned int k;
    void delay(int time)	 // ham delay phuc vu quet led
    {int n;
    for(n=0;n<time;n++)
    {
    ;
    }
    }
    void quetled7()				 // ham quet led 7
    {   ////////////////	   hang nghin
             A1 = 1;
             P2 = so[i/1000];
    		 delay(50);
    		 A1 = 0;
    		 P2=0xff;
    //////////////////////////		 hang tram
             A2=1;
    		 P2=so[(i/100)%10];
    		 delay(50);
    		 A2=0;
    		 P2=0xff;
    /////////////////////////////////		  hang chuc
             A3=1;
    		 P2=so[(i/10)%10];
    		 delay(50);
    		 A3=0;
    		 P2=0xff;
    ////////////////////////////////		hang don vi
             A4=1;
    		 P2=so[i%10];
    		 delay(50);
    		 A4=0;
    		 P2=0xff;
    }									
    void khoitaotimer()				   // 
    {         TMOD = 0X01;			   // timer0 che do 1
              IE   = 0x82;			   
    		  TH0  = 0xC3;			   // tre 50us
    		  TL0  = 0x50;
    		  EA   = 1;
    		  ET0  = 1;
    		  TR0  = 1;
    }
    void khoitaongatngoai()
    {         EA=0;
              EX0=1;
              IT0=1;
    		  EA=1;
    }
    void isr_timer0() interrupt 1
    {         TF0=0;
              TR0=0;
    		  quetled7();
    		  k++;
    		  TH0=0xC3;				   // gia tri nap lai
    		  TL0=0x50;
    		  if(k==20)
    		  {
    		   i=((xung/32)*60);                          // vong/phut
    		   k=0;
    		   }
    		   TR0=1;
    }
    void isr_ex0() interrupt 0
    {           
    xung++;
    }
    void main()
    {khoitaotimer();
    khoitaongatngoai();
    while(1);
    }
    mình đang học đến phần này nhưng mà bị mắc. mong các bạn giúp đỡ.
    thanks.!
    Nguyễn Huy Biên - 01649 802 694
    gmail :

  • #2
    Nguyên văn bởi bienhou Xem bài viết
    Code:
    #include <REGX51.H>
    sbit A1 = P1^0;
    sbit A2 = P1^1;
    sbit A3 = P1^2;
    sbit A4 = P1^3;
    unsigned char so[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    unsigned char xung,i;             
    unsigned int k;
    void delay(int time)	 // ham delay phuc vu quet led
    {int n;
    for(n=0;n<time;n++)
    {
    ;
    }
    }
    void quetled7()				 // ham quet led 7
    {   ////////////////	   hang nghin
             A1 = 1;
             P2 = so[i/1000];
    		 delay(50);
    		 A1 = 0;
    		 P2=0xff;
    //////////////////////////		 hang tram
             A2=1;
    		 P2=so[(i/100)%10];
    		 delay(50);
    		 A2=0;
    		 P2=0xff;
    /////////////////////////////////		  hang chuc
             A3=1;
    		 P2=so[(i/10)%10];
    		 delay(50);
    		 A3=0;
    		 P2=0xff;
    ////////////////////////////////		hang don vi
             A4=1;
    		 P2=so[i%10];
    		 delay(50);
    		 A4=0;
    		 P2=0xff;
    }									
    void khoitaotimer()				   // 
    {         TMOD = 0X01;			   // timer0 che do 1
              IE   = 0x82;			   
    		  TH0  = 0xC3;			   // tre 50us
    		  TL0  = 0x50;
    		  EA   = 1;
    		  ET0  = 1;
    		  TR0  = 1;
    }
    void khoitaongatngoai()
    {         EA=0;
              EX0=1;
              IT0=1;
    		  EA=1;
    }
    void isr_timer0() interrupt 1
    {         TF0=0;
              TR0=0;
    		  quetled7();
    		  k++;
    		  TH0=0xC3;				   // gia tri nap lai
    		  TL0=0x50;
    		  if(k==20)
    		  {
    		   i=((xung/32)*60);                          // vong/phut
    		   k=0;
    		   }
    		   TR0=1;
    }
    void isr_ex0() interrupt 0
    {           
    xung++;
    }
    void main()
    {khoitaotimer();
    khoitaongatngoai();
    while(1);
    }
    mình đang học đến phần này nhưng mà bị mắc. mong các bạn giúp đỡ.
    thanks.!
    Phải nói trước là mình không biết gì về lập trình bằng ngôn ngữ C cả. Nhưng mình thấy bạn đưa cái code đó lên thì có ích gì trong khi bạn không nói rõ bạn mắc ở chỗ nào và phần cứng bạn ghép nối ra sao thì có đến THÁNH cũng không biết phải giúp bạn thế nào !

    Comment


    • #3
      mình bị mắc ở chỗ là. tốc độ hiển thị lên ko đúng. cái sai trông thấy là nó ko giữ ở 1 giá trị mà laary lung tung
      Nguyễn Huy Biên - 01649 802 694
      gmail :

      Comment


      • #4
        thực ra cái này nó cũng tùy loại code, vs các mạch đơn giản thì nhìn code cũng biết dc nguyên lý. nhưng hầu hết đều phải có nguyên lý kèm theo, ku ko post nguyên lý nên thì khó mà đọc đc
        Website chính thức đổi địa chỉ website thành
        Mời các bạn ghé thăm !!!

        Comment


        • #5
          vâng. đây và code và mô phỏng của e. mong mọi người giúp đỡ New folder (2).rar
          Nguyễn Huy Biên - 01649 802 694
          gmail :

          Comment


          • #6
            thay 2 biến xung,i bằng biến 16bit
            Code:
            if(k==20)//khi mô phỏng tăng thời gian lấy mẫu để thấy giá trị(hoặc mô phỏng xung bằng tần số cao hơn)
                      {
                       i=((xung/32)*60);
                       k=0;
                       xung=0;
                       }
            Last edited by tdm; 12-06-2012, 22:23.
            |

            Comment


            • #7
              vâng. e cám ơn bác. e sửa luôn đây
              Nguyễn Huy Biên - 01649 802 694
              gmail :

              Comment


              • #8
                nên x60 trước rồi chia 32 vì chia cho 32 trước nó sẽ bị ăn bớt phần dư ngay từ đầu => gây sai số. còn về toán học thì nhân hay chia trước k ảnh hưởng j nhưng cái này là c và nó làm tròn
                Website chính thức đổi địa chỉ website thành
                Mời các bạn ghé thăm !!!

                Comment


                • #9
                  Nguyên văn bởi mast090 Xem bài viết
                  nên x60 trước rồi chia 32 vì chia cho 32 trước nó sẽ bị ăn bớt phần dư ngay từ đầu => gây sai số. còn về toán học thì nhân hay chia trước k ảnh hưởng j nhưng cái này là c và nó làm tròn
                  ok. thanks a Nam nhé.
                  Nguyễn Huy Biên - 01649 802 694
                  gmail :

                  Comment


                  • #10
                    cho e hỏi thêm chút ạh. bây h e muốn thêm phần PWM thì nên dùng timer1 hay dùng luôn timer0 để tạo ạh. và dùng timer1 có ảnh hưởng gì đến timer0 hay ko ạh
                    Nguyễn Huy Biên - 01649 802 694
                    gmail :

                    Comment


                    • #11
                      Code:
                      #include <REGX51.H>
                      sbit A1 = P1^0;
                      sbit A2 = P1^1;
                      sbit A3 = P1^2;
                      sbit A4 = P1^3;
                      sbit TANG=P1^4;
                      sbit GIAM=P1^5;
                      unsigned char so[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
                      unsigned char xung,i;             
                      unsigned int k;
                      unsigned char dem,tocdo;
                      ///////////////////////////////////////
                      void delay(int time)	 // ham delay phuc vu quet led
                      {int n;
                      for(n=0;n<time;n++)
                      {
                      ;
                      }
                      }
                      //////////////////////////////////////
                      void quetled7()				 // ham quet led 7
                      {   ////////////////	   hang nghin
                               A1 = 1;
                               P2 = so[i/1000];
                      		 delay(50);
                      		 A1 = 0;
                      		 P2=0xff;
                      //////////////////////////		 hang tram
                               A2=1;
                      		 P2=so[(i/100)%10];
                      		 delay(50);
                      		 A2=0;
                      		 P2=0xff;
                      /////////////////////////////////		  hang chuc
                               A3=1;
                      		 P2=so[(i/10)%10];
                      		 delay(50);
                      		 A3=0;
                      		 P2=0xff;
                      ////////////////////////////////		hang don vi
                               A4=1;
                      		 P2=so[i%10];
                      		 delay(50);
                      		 A4=0;
                      		 P2=0xff;
                      }									
                      /////////////////////////////////////
                      void khoitaotimer()				   // 
                      {         TMOD = 0X01;			   // timer0 che do 1
                                IE   = 0x82;			   
                      		  TH0  = 0xC3;			   // tre 50us
                      		  TL0  = 0x50;
                      		  EA   = 1;
                      		  ET0  = 1;
                      		  TR0  = 1;
                      		  
                      }
                      ////////////////////////////
                      void khoitaongatngoai()
                      {         EA=0;
                                EX0=1;
                                IT0=1;
                      		  EA=1;
                      }
                      ///////////////////////////////////////////
                      void isr_timer0() interrupt 1
                      {         TF0=0;
                                TR0=0;
                      		  quetled7();
                      		  k++;
                      		  TH0=0xC3;				   // gia tri nap lai
                      		  TL0=0x50;
                      		  if(k==20)
                      		  {
                      		   i=((xung*60)/32);	// vong/phut encoder dung loai 32x 
                      		   k=0;
                      		   xung=0;
                      		   }
                      		   TR0=1;
                      }
                      //////////////////////////////////
                      
                      void khoitaotimer1()
                      {           TMOD=0x20;        //timer 1 che do 2 auto reload
                                  IE=0x88;             // EA=0, ET1=1;
                                  TH1=-100;
                                  TL1=-100;
                      			ET1=1;
                                  EA=1;
                                  TR1=1;
                      }
                      /////////////////////////////////////////
                      void isr_timer1() interrupt 3
                      {          TF1=0;
                                 TR1=0;
                                 dem++;
                                 if(dem>100)
                                 dem=0;
                                 if(dem<tocdo)
                                 P1_6=1;
                                 else
                                 P1_6=0;
                                 TR1=1;
                      }
                      ///////////////////////        phim nhan
                      void phimnhan()
                      {
                      //////////////////////////
                                if((TANG==0)&&(GIAM==1))
                      		  while(!TANG)
                      		  {
                                tocdo=tocdo+10;
                                if(tocdo==110)tocdo=100;
                      		  }
                      ////////////////////////////////
                                if((GIAM==0)&&(TANG==1))
                      		  while(!GIAM)
                      		  {
                                tocdo=tocdo-10;
                                if(tocdo==-10)tocdo=0;
                      }		  }
                      ///////////////////////////////////				ham ngat ngoai
                      void isr_ex0() interrupt 0
                      {           
                      xung++;
                      }
                      ////////////////////////////////////// ham chinh
                      void main()
                      {
                      khoitaotimer();
                      khoitaotimer1();
                      khoitaongatngoai();
                      {
                      {while(1)
                      phimnhan();
                      }
                      }
                      }
                      CÁC BÁC GIÚP E TẠI SAO THÊM TIMER1 ĐỂ TẠO PWM THÌ TIMER0 LẠI KO CHẠY.
                      E CÁM ƠN
                      Nguyễn Huy Biên - 01649 802 694
                      gmail :

                      Comment


                      • #12
                        lý do rất đơn giản vì chú chưa hiểu thanh ghi TMOD, khi khai báo TMOD người ta sẽ khai báo cho cả 2 timer nếu chú dùng đồng thời và song song luôn chứ ko khai báo riêng rẽ.
                        Code:
                        void khoitaotimer()				   // 
                        {         TMOD = 0X01;			   // timer0 che do 1
                                  IE   = 0x82;			   
                        		  TH0  = 0xC3;			   // tre 50us
                        		  TL0  = 0x50;
                        		  EA   = 1;
                        		  ET0  = 1;
                        		  TR0  = 1;
                        void khoitaotimer1()
                        {           TMOD=0x20;        //timer 1 che do 2 auto reload
                                    IE=0x88;             // EA=0, ET1=1;
                                    TH1=-100;
                                    TL1=-100;
                        			ET1=1;
                                    EA=1;
                                    TR1=1;
                        }
                        		  
                        }
                        thế này sau khi khởi tạo TMOD chế đó 1 timer0 xong nó lại bị rs thành chế độ 2 timer 1.
                        viết lại
                        TMOD=0x21, ngoài ra IE cũng vậy, nếu đã dùng cả IE thì khai báo ngắt cho cả 2 timer luôn, nếu khai báo riêng rẽ thì đọc tên ngắt ra mà sét giá trị cho nó. IE cũng đã bao gồm cả EA nên k cần phải sét lại EA=1 nữa
                        Website chính thức đổi địa chỉ website thành
                        Mời các bạn ghé thăm !!!

                        Comment


                        • #13
                          hì. e hiểu rồi. cám ơn bác nhiều@@
                          Nguyễn Huy Biên - 01649 802 694
                          gmail :

                          Comment

                          Về tác giả

                          Collapse

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

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

                          Collapse

                          Đang tải...
                          X