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

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

    Em sửa mãi mà không ra xin mấy pro giúp em với ạ :
    #include<regx52.h>
    #include<stdio.h>
    unsigned int soxung;
    float tocdo;
    unsigned char dem;
    sbit RS =P1^0;
    sbit RW =P1^1;
    sbit EN =P1^2;
    char x;
    void delay(unsigned long int t)
    {
    unsigned long int i;
    for (i=0;i<n;i++)
    }

    void busy(void)
    {
    p2=0xff;
    RS=0;
    do {EN=1; //k cho fep tin hieu vao LCD
    delay(10);
    En=0;
    x=p2;
    x=x&0x80;
    }
    while (x!=0x80)
    }

    void ghilenh(unsigned char lenh)
    { busy();
    p2=lenh;
    RS=0; RW=0;EN=1;
    delay(50);
    }

    void ghidulieu(unsigned char data)
    { busy();
    p2=data;
    RS=1; RW=0; EN=1;
    delay(50);
    EN=0;
    delay(50);
    }

    void ghikytu(char *s)
    {while(*s)
    {ghidulieu(*s);
    s++;
    }
    }
    void hienthi(int data)
    {if (data<10)
    ghidulieu(data);
    if (data<100)
    { ghidulieu(data/10);
    data=data%10;
    ghidulieu(data);
    }
    if (data<1000)
    { ghidulieu(data/100);
    data=data%100;
    ghidulieu(data/10);
    data=data%10;
    ghidulieu(data);
    }
    if (data<10000)
    { ghidulieu(data/1000);
    data=data%1000;
    ghidulieu(data/100);
    data=data%100;
    ghidulieu(data/10);
    data=data%10;
    ghidulieu(data);
    }
    }
    void khoitaoLCD(void)
    { ghilenh(0x03);
    ghilenh(0x38);
    ghilenh(0x06);
    ghilenh(0x0e);
    }
    void ngatngoai0() interrupt 0
    {dem++;
    if (dem==20)
    {dem=o;TH0=0;
    tocdo=soxung/100;
    soxung=0;
    TH0=-50000/256;
    TL0=-50000/256;
    }}

    void ngatngoai1() interrupt 2
    {
    soxung++; }


    voi main()
    {TMOD=0x21;
    TL1=TH1=-3;TH0=-50000%256;
    TL0=-50000%256;
    SCON=0X52;
    IT1=1;
    IR1=0X85 //NGAT NGOAI 0 & 1
    dem=0;
    khoitaoLCD();
    while(1)
    {ghidulieu(0x01);
    ghidulieu(0x08);
    ghikytu(vantoc:v/s);
    hienthi(soxung);
    soxung=0; tocdo=0;
    TR0=1;//cho fep timer hoat dong
    }
    }

  • #2
    void ngatngoai0() interrupt 0
    {dem++;
    if (dem==20)
    {dem=o;TH0=0;
    tocdo=soxung/100;
    soxung=0;
    TH0=-50000/256;
    TL0=-50000/256;
    }}
    it nhất cũng có lỗi ở đây
    chương trình hiển thị rườm rà khó kiểm soát

    Comment


    • #3
      anh ơi! " dem=0" là sau khi hết 0.1 giây thì bắt đầu đếm lại từ đầu mà

      Comment


      • #4
        bài này em dùng encoder 100 xung/vong dùng 8051 điều khiển,và dùng bộ ngắt ngoài 0 và 1 ạ

        Comment


        • #5
          void ghidulieu(unsigned char data)
          { busy();
          p2=data;
          RS=1; RW=0; EN=1;
          delay(50);
          EN=0;
          delay(50);
          }
          chương trình của bạn có quá nhiều lỗi bạn không thể giải quyết được là đúng thôi, phần hiển thị dùng phương pháp tra bảng chứ không ai làm như bạn cả, tim thêm trên diễn đàn đi nhé

          Comment


          • #6
            đặt tên không được trùng với tù khóa của C, ngắt cũng có lỗi, túm lại là bạn viết chương trình như thế không ai muốn đọc cả, học hỏi cách viết chương trình từ các anh trên diễn đàn đi

            Comment


            • #7
              Viết sai cú pháp nhiều quá.
              Khi biên dịch thấy thông báo lỗi nào thì kick đôi vào dòng thông báo đó, con trỏ sẽ nhảy lên dòng có lỗi và xem lỗi vì sao và sửa nó.
              Một số lỗi nhìn qua sẽ thấy này:
              - Hàm delay có biến n chưa định nghĩa
              - Tên thanh ghi Port là P2 chứ ko phải là p2
              - Ở trên đã định nghĩa EN thì ở dưới cũng phải là EN, chứ không phải là En
              - Biến dem = 0; chứ không phải dem = o;
              - IR1 là cái gì vậy ?

              Comment


              • #8
                ai sưa cho e cái code này với !em thử mãi rùi mà vẫn chưa chạy
                #include <reg52.h>
                #include <intrins.h>
                #include <stdio.h>
                #include <string.h>
                #include <stdlib.h>
                unsigned long int n,dem;
                double vong_giay;

                //=======khai bao chan LCD===========
                sbit RS=P2^0;
                sbit RW=P2^1;
                sbit EN=P2^2;
                //=======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
                RW=0; //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
                RW=0; //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 char t)
                {
                unsigned char v;
                if(t<10)
                {
                LCD_ghi_dulieu(t+48); //doi sang ASCII
                }
                else if(t<100)
                {
                LCD_ghi_dulieu(t/10+48); //so hang chuc
                LCD_ghi_dulieu(t%10+48); //so hang don vi
                }
                else
                {
                v=t/10;
                LCD_ghi_dulieu(v/10+48); // so hang tram
                LCD_ghi_dulieu(v%10+48); //so hang chuc
                LCD_ghi_dulieu(t%10+48); //so hang don vi
                }
                }
                //======Loi chao dau chuong trinh======
                void main(void)
                { 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_caidat();
                while(1)
                {
                LCD_dieukhien(0x80); //dua con tro LCD ve dau hang 1
                LCD_chuoi(":");
                Hienthi_LCD(vong_giay);
                LCD_dieukhien(0xC0); //dua con tro ve dau hang 2
                LCD_chuoi("BAI TAP LON VDK"); //dua chuoi chu len LCD
                delay_ms(500);
                LCD_dieukhien(0x01); //xoa man hinh
                } }
                void ngatT1(void) interrupt 3
                {
                n=TH0*256+256*TL0;
                vong_giay=n;//xung encoder dem 100xung/vong
                }

                Comment


                • #9
                  Nguyên văn bởi thang_tdh Xem bài viết
                  ai sưa cho e cái code này với !em thử mãi rùi mà vẫn chưa chạy
                  #include <reg52.h>
                  #include <intrins.h>
                  #include <stdio.h>
                  #include <string.h>
                  #include <stdlib.h>
                  unsigned long int n,dem;
                  double vong_giay;

                  //=======khai bao chan LCD===========
                  sbit RS=P2^0;
                  sbit RW=P2^1;
                  sbit EN=P2^2;
                  //=======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
                  RW=0; //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
                  RW=0; //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 char t)
                  {
                  unsigned char v;
                  if(t<10)
                  {
                  LCD_ghi_dulieu(t+48); //doi sang ASCII
                  }
                  else if(t<100)
                  {
                  LCD_ghi_dulieu(t/10+48); //so hang chuc
                  LCD_ghi_dulieu(t+48); //so hang don vi
                  }
                  else
                  {
                  v=t/10;
                  LCD_ghi_dulieu(v/10+48); // so hang tram
                  LCD_ghi_dulieu(v+48); //so hang chuc
                  LCD_ghi_dulieu(t+48); //so hang don vi
                  }
                  }
                  //======Loi chao dau chuong trinh======
                  void main(void)
                  { 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%6;
                  TR0=TR1=1;
                  LCD_caidat();
                  while(1)
                  {
                  LCD_dieukhien(0x80); //dua con tro LCD ve dau hang 1
                  LCD_chuoi(":");
                  Hienthi_LCD(vong_giay);
                  LCD_dieukhien(0xC0); //dua con tro ve dau hang 2
                  LCD_chuoi("BAI TAP LON VDK"); //dua chuoi chu len LCD
                  delay_ms(500);
                  LCD_dieukhien(0x01); //xoa man hinh
                  } }
                  void ngatT1(void) interrupt 3
                  {
                  n=TH0*256+256*TL0;
                  vong_giay=n;//xung encoder dem 100xung/vong
                  }
                  bạn chạy thử xem sao:
                  Code:
                         #include <reg52.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=P2^0;
                  sbit RW=P2^1;
                  sbit EN=P2^2;
                  //=======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
                  RW=0; //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
                  RW=0; //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;
                  }
                  độ chính xác bạn tự tính nhé.
                  |

                  Comment


                  • #10
                    haizzz a chữa nó còn ko chạy nữa những dòng code còn rối hơn e !nhưg dù sao cũng cảm ơn anh nhé !thanks

                    Comment


                    • #11
                      Chào các bạn!Mình cung dang lam de tài này.Mình có 1 số thắc mắc mong các bạn giúp đỡ:
                      -Mình ko dùng encoder để đo tốc độ động cơ mà dùng cảm biến hồng ngoại.Mình ko hiểu giả sự encoder nó còn cho mình biết là bao nhiêu xung/vòng,Vậy nếu dùng cảm biến hồng ngoại thì làm sao để biết được bao nhiêu xung/vong nhỉ?
                      Click image for larger version

Name:	61178751167265822604.jpg
Views:	1
Size:	61.9 KB
ID:	1353652 mạch mô fong của mình có dạng này!

                      Comment


                      • #12
                        bác nào có code asm vdk 8051 điều khiển động cơ bước và hiện thị tốc độ của nó không up lên cho em xin để em tham khảo với.

                        Comment


                        • #13
                          Nguyên văn bởi vannhubk Xem bài viết
                          Chào các bạn!Mình cung dang lam de tài này.Mình có 1 số thắc mắc mong các bạn giúp đỡ:
                          -Mình ko dùng encoder để đo tốc độ động cơ mà dùng cảm biến hồng ngoại.Mình ko hiểu giả sự encoder nó còn cho mình biết là bao nhiêu xung/vòng,Vậy nếu dùng cảm biến hồng ngoại thì làm sao để biết được bao nhiêu xung/vong nhỉ?
                          [ATTACH=CONFIG]35282[/ATTACH] mạch mô fong của mình có dạng này!
                          Nếu bạn dùng cảm biến thì phải tự tạo một cái đĩa có khoét lỗ trên đó (kiểu như cánh quạt) và lắp trên trục động cơ và cho cảm biến chiếu qua các lỗ đó ++> tùy theo số lỗ trên đĩa tròn đó là có thể biết được tốc độ của động cơ.
                          Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
                          http://diencongnghiep360.com/
                          http://tudienhathe.vn/

                          Comment


                          • #14
                            Bạn ơi !Mình chưa hiểu đoạn code thời gian lấy mẫu này:
                            TH1=9216/256;//T trich mau 10ms
                            TL1=9216%256;ri
                            TH0=TL0=0;
                            TR0=TR1=1;
                            Mong bạn giải thích chỗ thời gian lấy mẫu giùm mình nhé!!
                            Cho mình hỏi luôn thêm 1 xíu nhé!Mình lấy xung từ encoder vô ngắt ngoài!nhưng tại sao lại dùng timer 0 để đếm còn timer 1 để ngắt(trong khi 2 chân timer 0 và timer 1 chả nối vs bên ngoài cả!
                            Cảm ơn các bạn!Mong các ban giúp đỡ!!!

                            Comment


                            • #15
                              đây là sơ đồ mạch của mình [IMG][/IMG]Click image for larger version

Name:	nhu1.jpg
Views:	1
Size:	112.0 KB
ID:	1353982Mình dùng 89c2051 và cảm biến mình lấy về chỉ được 1 xung/1 vòng và nối vs ngẳt ngoài,vậy mình phải lấy mẫu ở thời gian bao nhiêu để đáp ứng đc MCu!Mong cac bạn giúp đỡ!!

                              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