Thông báo

Collapse
No announcement yet.

Sửa code đo tốc độ động cơ dùng 8051 hiênt thị LCD em với

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

  • #16
    Sao lại dùng ngắt ngoài để đếm xung ?
    Để đo tốc độ tốt nhất là dùng Timer ở chế độ counter. Sau khi reset timer 1 thời gian định trước sẽ cho đọc giá timer này, kết hợp với thời gian trễ sẽ được tốc độ xung => tốc độ động cơ.
    Không ai dùng ngắt ngoài để đo tốc độ động cơ cả. Lý do bạn tự tìm hiểu nhé

    Comment


    • #17
      Bạn nào giải thích đoạn code này cho mình với:
      include <regx51.h>
      #include <intrins.h>
      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      unsigned int n,dem;
      unsigned int vong_giay=0;

      //=======khai bao chan LCD===========
      sbit RS=P3^0;
      sbit EN=P3^1;

      //=======Ham tao tre============
      void delay_ms(int n)
      {
      int k,j;
      for(k=0;k<n;k++)
      {
      for(j=0;j<500;j++);
      }
      }
      //========Ham ghi lenh len LCD=========
      void LCD_dieukhien(unsigned char x)
      {
      RS=0; //thanh ghi lenh
      //chon che do ghi
      P1 =x;
      EN=1;
      EN=0; //tin hieu cho phep
      delay_ms(5);
      }
      //========Ham ghi 1 ki tu len LCD=======
      void LCD_ghi_dulieu(unsigned char y)
      {
      RS=1; //thanh ghi du lieu
      //che do ghi
      P1=y;
      EN=1;
      EN=0; //tin hieu cho phep
      delay_ms(5);
      }
      //===========Setup LCD ban dau===============
      void LCD_caidat()
      {
      LCD_dieukhien(0x38); // DL = N =F =1 che do 8 bit du lieu, 2 dong, font 5*10
      LCD_dieukhien(0x0C); // D=1 bat hien thi, C=B=0 tat con tro
      LCD_dieukhien(0x06); // i/d = 1 ,s =0 ko dich con tro va dich hien thi
      LCD_dieukhien(0x01); // xoa man hinh dua con tro ve vi tri dau
      delay_ms(15);
      }
      //=======Ham ghi 1 chuoi ki tu len LCD=========
      void LCD_chuoi(unsigned char *s)
      {
      while (*s)
      {
      LCD_ghi_dulieu(*s);
      s++;
      }
      }

      void Hienthi_LCD(unsigned int t)
      {
      LCD_ghi_dulieu(t/1000+0x30);
      LCD_ghi_dulieu((t%1000)/100+0x30);
      LCD_ghi_dulieu(((t%1000)%100)/10+0x30);
      LCD_ghi_dulieu(((t%1000)%100)%10+0x30);
      }
      //======Loi chao dau chuong trinh======
      void main(void)
      {
      LCD_caidat();

      LCD_dieukhien(0x80); //dua con tro LCD ve dau hang 1
      LCD_chuoi("Toc_Do:");
      LCD_dieukhien(0xC0); //dua con tro ve dau hang 2
      LCD_chuoi("BAI TAP LON VDK"); //dua chuoi chu len LCD
      delay_ms(500);
      TMOD=0X15;//timer 0 che do dem xung,timer 1 o che do 1 16bit
      IE=0X88;//cho phep ngat
      IP=0X08;//uu tien ngat timer 1
      TH1=9216/256;//T trich mau 10ms
      TL1=9216%256;
      TR0=TR1=1;
      //LCD_dieukhien(0x01); //xoa man hinh
      while(1)
      {
      }
      }
      void ngatT1(void) interrupt 3
      {
      TR0=TR1=0;
      n=TH0*256+256*TL0;
      vong_giay=n;//xung encoder dem 100xung/vong
      LCD_dieukhien(0x80); //dua con tro LCD ve dau hang 1
      LCD_chuoi("Toc_Do:");
      Hienthi_LCD(vong_giay);
      TH1=9216/256;//T trich mau 10ms
      TL1=9216%256;
      TH0=TL0=0;
      TR0=TR1=1;
      }
      Giải thuật mình đửa ra là :n[vòng/phút]=(60*so_xung)Ts* N0) trong đó N0 số xung trong 1 vòng,Ts:khoảng thời gian lấy mẫu,so_xung:số xung đếm được trong thời gian Ts.
      Mình ko hiểu đoạn code trên dùng giai thuât j!Mong các bạn giúp đỡ!^^,

      Comment


      • #18
        ai có báo cáo về đề tài này thì cho mình với

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...
        X