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

                              • Ng.Phuong.5
                                Khi in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau.
                                Không biết có ai sửa được vấn đề này không ạ? Hay đây là mặc định của orcad 9.2 rồi ạ ?
                                Các cách em xem trên diễn đàn thử rồi nhưng không được ạ...
                                hôm nay, 19:47
                              • Ng.Phuong.5
                                Khi in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Không biết...
                                hôm nay, 19:45
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Không biết...
                                hôm nay, 19:45
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Mấy con...
                                hôm nay, 19:44
                              • viettinh
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi viettinh
                                Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                                Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                                hôm nay, 18:12
                              • nguyendinhvan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi nguyendinhvan
                                Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                                Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                                Cách đơn giản...
                                hôm nay, 00:04
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Mấy con...
                                Hôm qua, 22:44
                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                                Hôm qua, 19:02
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                                Hôm qua, 15:43
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                                Hôm qua, 15:28
                              Đang tải...
                              X