Thông báo

Collapse
No announcement yet.

lap trinh c cho vi khien

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

  • #16
    header.c
    sfr Data = 0x80;
    sbit LE0 = P2^7;
    sbit LE1 = P2^6;
    sbit LE2 = P2^5;

    sbit G_SW = P2^4;
    sbit G_LCD = P2^3;
    sbit Start = P1^0;

    sbit Sensor6 = P1^2;
    sbit Sensor5 = P1^3;
    sbit Sensor4 = P1^4;
    sbit Sensor3 = P1^5;
    sbit Sensor2 = P1^6;
    sbit Sensor1 = P1^7;//00xx0011
    //11001100
    sbit Press1 = P1^1;
    sbit Press2 = P3^6;
    sbit Press3 = P3^7;

    #define Forward 0xA0
    #define Reverse 0x20
    #define RunmaxF 0xDF
    #define RunmaxR 0x5F

    #define Off 0xFF


    //submotor interface
    #define Subreverse 0
    #define Subforward 1

    #define Run 2
    #define Stop 3

    void delay10ms(void)
    {
    long n;
    for(n=0;n<200;n++);
    }

    void delaylong(long m)
    {
    long n;
    for(n=0;n<m;n++);
    }


    // 00000 M n RF
    //runmaxF 1 1 0 1 1111
    // Forward 1 0 1 0 0000
    // Reverse 0 0 1 0 0000
    // RF n M 00000


    // Motor phu
    // 0 0
    // x x OF3 RF3 OF2 RF2 OF1 RF1
    //Motorphu Forward
    // 0 0 n n n n 0 1
    // 0 0 n n n n 0 0
    // 0 0 // x x OF3 RF3 OF2 RF2 OF1 RF1
    SHARE KHO PHIM LỚN

    Comment


    • #17
      main.c
      #include <AT89X52.H>
      #include <string.h>
      #include "header.c"
      #include "motor.c"
      #include "LCDheader.c"

      sfr16 timer=0x8B;

      unsigned char dem,Vspeed;
      unsigned char demvach,flagvach,demtemp,flagdem;

      void timer0(void) interrupt 1
      {
      Vspeed++;
      if(Vspeed==15) {EA=0;TR0=0;}
      }

      void Init_Counter(void)
      {
      TMOD=0x55;
      EA=0;
      TR0=TR1=1;
      }

      void Init_Timer(void)
      {
      TMOD=0x01;
      EA=1;
      TR0=TR1=1;
      }

      void counterreset(void)
      {
      TH0=TL0=TH1=TL1=0;
      }

      void golong(unsigned char sp1,sp2)
      {
      if((!Sensor4)&&(Sensor3)){motorright(Forwa rd+sp2,0);motorleft(Forward+sp1,0);}
      if((Sensor4)&&(!Sensor3)){motorright(Forwa rd+sp1,0);motorleft(Forward+sp2,0);}
      //if((!Sensor4)&&(!Sensor3)){motorright(Forw ard+sp1,0);motorleft(Forward+sp1,0);}
      if((!Sensor4)&&(!Sensor3)){bothmotor(Forwa rd+sp1,0);}
      if((Sensor3)&&(Sensor4)){
      if(!Sensor5){motorright(Forward+sp2,0);motorleft(F orward+sp1,0);}
      if(!Sensor2){motorright(Forward+sp1,0);motorleft(F orward+sp2,0);}
      if(!Sensor6){motorright(Forward+sp2,0);motorleft(F orward+sp1,0);}
      if(!Sensor1){motorright(Forward+sp1,0);motorleft(F orward+sp2,0);}

      }
      if(P1>0xFC){motorright(Forward+0,0);motorleft(Forw ard+0,0);}
      }

      //subroutine nhan swdip;
      void goleft(unsigned char sp)
      {long n=0;
      bothmotor(Reverse+10,1);
      Init_Counter();
      delaylong(10000);
      //motorleft(Reverse+6,0);
      motorright(Forward+sp,1);
      counterreset();

      while(TL1<250);
      bothmotor(Forward+10,1);
      }

      //goright
      void goright(unsigned char sp)
      {long n=0;

      bothmotor(Reverse+10,1);
      Init_Counter();
      delaylong(10000);
      //motorright(Reverse+10,0);
      motorleft(Forward+sp,1);
      counterreset();
      while(TL0<250);
      bothmotor(Forward+10,1);
      }

      void goright_back(unsigned char sp)
      {long n=0;
      Init_Counter();
      motorright(Reverse+sp,1);
      motorleft(Forward+4,1);
      counterreset();
      while(TL1<250);
      bothmotor(Forward+2,1);
      }

      void goline(unsigned char d,sp1,sp2)
      {//unsigned char demvach=0,flagvach,flag,count;
      unsigned char count,flag;
      flagvach=1;
      flag=flagdem=1;
      count=0;
      //counterreset();
      Vspeed=0;
      Init_Timer();
      while(demvach<d)
      {
      if(demvach<2)golong(14+Vspeed,8);else golong(31,16);

      if((!Sensor6)&&(flagvach)){ flagvach=0;
      if(flagdem){dem++;flagdem=0;}
      demvach++;
      LCDcontrol(0xc0);
      LCDwrites(demvach);
      }
      if(Sensor6) flagvach=1;
      }
      }

      //================================================== ============================
      // Subroutine Turnleft
      //================================================== ============================
      void INITIALIZATION(void)
      {
      //delaylong(10000);
      LE0=LE1=LE2=0;
      LCDinit();
      LCDputs("Press Start",1);
      while(Start);
      }

      main()
      {


      INITIALIZATION();
      demvach=P3&15;

      switch(demvach)
      {
      case 0:goto TEST_MOTOR;
      case 1:goto Run_long;
      case 2:goto Test_encoder;
      case 3:goto Go_Round;
      case 4:goto Dicheo;
      case 15: goto Ghidem;
      }

      TEST_MOTOR:
      Motorphu=0xFF;
      LCDcontrol(1);
      LCDputs("Motor check",1);
      LCDputs("Motor 1 ",2);

      while(1)
      {
      // LCDputs("Motor check",1);
      LCDputs("Motor 1 ",2);
      delaylong(10000);

      while(Press1){
      switch (P3&0xC0)
      {
      case 0x40:motor1(Subforward,1);break;
      case 0x80:motor1(Subreverse,1);break;
      case 0xC0:motor1(Stop,1);break;
      }
      }
      motor1(Stop,1);
      // LCDputs("Motor check",1);
      LCDputs("Motor 2 ",2);
      delaylong(10000);
      while(Press1){
      switch (P3&0xC0)
      {
      case 0x40:motor2(Subforward,1);break;
      case 0x80:motor2(Subreverse,1);break;
      case 0xC0:motor2(Stop,1);break;
      }
      }
      motor2(Stop,1);
      // LCDputs("Motor check",1);
      LCDputs("Motor 3 ",2);
      delaylong(10000);
      while(Press1){
      switch (P3&0xC0)
      {
      case 0x40:motor3(Subforward,1);break;
      case 0x80:motor3(Subreverse,1);break;
      case 0xC0:motor3(Stop,1);break;
      }
      }
      motor3(Stop,1);
      LCDputs("Motor left",2);
      delaylong(10000);
      demvach=0;
      while(Press1){
      if(!Press2) motorleft(Forward+demvach,1);
      if(!Press3) motorleft(Reverse+demvach,1);
      if(!Start){
      delaylong(2000);
      if(!Start) demvach++;
      if(demvach>31)demvach=0;
      LCDcontrol(0x80);
      LCDwrites(demvach);
      }
      }
      motorleft(Off,1);
      demvach=0;
      LCDputs("Motor right",2);
      delaylong(10000);
      while(Press1){
      if(!Press2) motorright(Forward+demvach,1);
      if(!Press3) motorright(Reverse+demvach,1);
      if(!Start){
      delaylong(2000);
      if(!Start) demvach++;
      if(demvach>31)demvach=0;
      LCDcontrol(0x80);
      LCDwrites(demvach);

      }

      }
      motorright(Off,1);

      LCDputs("Both Motor",2);
      delaylong(10000);
      while(Press1){

      if(!Press2) bothmotor(Forward+31,1);
      if(!Press3) bothmotor(Reverse+31,1);

      }
      bothmotor(Off,1);

      }//end of while motorcheck


      Run_long:
      LCDcontrol(1);
      LCDputs("Runlong",1);
      demvach=0;
      flagvach=1;
      while(1)
      {
      if(demvach<3) golong(15,8);
      if(demvach>3) golong(31,8);
      if((!Sensor6)&&(flagvach)){ flagvach=0;
      demvach++;
      LCDcontrol(0xc0);
      LCDwrites(demvach);
      }
      if(Sensor6) flagvach=1;
      if(demvach==12)break;
      while(Press1);

      goto Run_long;
      }
      //test encoder
      Test_encoder:
      while(Press1){
      LCDcontrol(0x80);
      LCDwrites(TL0);
      LCDcontrol(0xc0);
      LCDwrites(TL1);
      if(!Press2) counterreset();
      }
      LCDcontrol(1);
      motorright(Forward+16,0);motorleft(Forward+16,0);
      counterreset();
      while(1){
      LCDcontrol(0x80);
      LCDwrites(TL0);
      LCDcontrol(0xc0);
      LCDwrites(TL1);
      if(TL0>TL1){motorright(Forward+16,0);motorleft(For ward+8,0);}
      if(TL0<TL1){motorright(Forward+8,0);motorleft(F orward+16,0);}
      counterreset();
      delaylong(1000);
      }


      Go_Round:
      LCDcontrol(1);
      LCDputs("Go Round",1);
      demvach=0;
      while(1)
      {
      if(demvach<2) golong(15+5*dem,8);
      if(demvach>=2) golong(31,15);
      if((!Sensor6)&&(flagvach)){ flagvach=0;
      demvach++;
      LCDcontrol(0xc0);
      LCDwrites(demvach);
      }
      if(Sensor6) flagvach=1;
      if(demvach>12){demvach=0; goleft(15);}
      }
      Ghidem:
      LCDcontrol(1);
      LCDputs("Ghi diem",1);
      goline(9,31,15);
      goleft(20);
      goline(3,20,12);
      goleft(17);
      goline(1,31,15);
      goright_back(20);
      goline(9,31,15);
      motorleft(Off,0);
      motorright(Off,0);
      while(1);
      Dicheo:
      Init_Counter();
      motorleft(Reverse+10,1);
      motorright(Forward+16,0);
      counterreset();
      while(TL1<120);
      bothmotor(Forward+20,1);
      while(1);
      }
      SHARE KHO PHIM LỚN

      Comment


      • #18
        Để tui giải thích cụ thể nhé
        loại LCD được dùng ở đây là loai 16x2 ,được dùng để hiện thị các chiến thuật thi đấu ,được điều khiển bằng
        các phím bấm .
        Cấu tạo của LCD thì bác bít roài 8 chân dữ liệu ,1 chân RS ,1 chân enable ,1 chân RW ,còn G_LCD là dùng cho mục đích khác
        khai báo sbit G_LCD =P2^4

        hàm LCDcontrol được dùng để điều khiển con trỏ đến vị trí cần thiết (đầu dòng cuối dòng)

        void LCDputs(unsigned char *s,unsigned char row) xuất một chuỗi kí tự ra màn hình ở dòng thứ row

        chú ý biến s ở đây khai báo dạng con trỏ ,hàm này giúp bác xuất cả chuỗi ra màn hình ,chương trình sử dụng đến hàm thư viện string.h
        ,
        Toàn bộ chương trình thì rất phức tạp ,theo tôi ,bác cứ ngâm cứu dần thì sẽ hiểu

        Còn về lập trình điều khiển tỉ lệ PID thì tui chưa làm bao giờ ,chưa có kinh nghiệm (tui vẫn là sinh viên mà)
        lập trình điều khiển nhiệt độ thì có làm rồi nhưng ứng dụng có lẽ đơn giản thôi , chưa đến mức cao
        cấp như mấy bộ điều khiển nhiệt độ của bọn Siemens .
        SHARE KHO PHIM LỚN

        Comment


        • #19
          Cấu tạo của LCD thì bác bít roài 8 chân dữ liệu ,1 chân reset ,1 chân enable ,1 chân RW ,còn G_LCD là dùng cho mục đích khác
          Cái chân reset mà thiếu hiệp giaosucan đề cập đến ở trên thực tế cũng viết tắt là RS nhưng là viết tắt của Register Select chứ không phải ReSet. Tất nhiên chân này không dùng để Reset LCD mà dùng để chọn thanh ghi lệnh/thanh ghi dữ liệu trong LCD. Nếu RS = 0 thì tác động lên thanh ghi lệnh, RS = 1 thì tác động lên thanh ghi dữ liệu. "tác động" ở đây có thể là đọc hoặc ghi (tùy vào chân RW). Mạo muội đỡ lời thiếu hiệp.

          Comment


          • #20
            đa tạ bắc hiệp đã chỉ bảo
            hôm qua buồn ngủ quá nên viết vội , đúng là chân RS là register select
            SHARE KHO PHIM LỚN

            Comment


            • #21
              Chẳng hay Bắc Hiệp có tu luyện PLC bí kíp ko , để tiểu đệ có cơ hội thọ giáo
              đa tạ trước
              SHARE KHO PHIM LỚN

              Comment


              • #22
                oh rat rat cam on bac giaosucan bac da giup em rat nhiều,
                em se cố nghiên cứu nhưng CT bác pót lên.
                a` bác có thê cho em nick yahoo , hay số dien thoai nha bác không.
                mong được bác tiếp tục chi dẫn.
                ]
                thank
                thứ gì không mua được bằng tiền sẽ mua được bằng rất nhiều tiền!!

                Comment


                • #23
                  zô đây nè

                  http://www.freewebs.com/giaosucan/siemens.htm
                  mà bác ở đây dạy học trường nào
                  SHARE KHO PHIM LỚN

                  Comment


                  • #24
                    Lap trinh C

                    chao cac ban
                    minh muon lap trinh cho AT89cxx bang ngon ngu C nhung minh chua co CT dichi tu C
                    Ban nao co CT do cho minh xin voi nhe
                    cam on cac ban
                    Nguyen van hieu
                    nvhieu@yahoo.com
                    Lao động Là Vinh quang

                    Comment


                    • #25
                      Re: Lap trinh C

                      Nguyên văn bởi nvhieu
                      chao cac ban
                      minh muon lap trinh cho AT89cxx bang ngon ngu C nhung minh chua co CT dichi tu C
                      Ban nao co CT do cho minh xin voi nhe
                      cam on cac ban
                      Nguyen van hieu
                      nvhieu@yahoo.com
                      Bác chẳng chịu tìm hiểu đọc gì cả, bác QD có cho cái Link của Keil đó. Trinh dịch C cho VĐK 8951 thịnh hành ưa chuộng nhất hiện nay đó.
                      http://www.dientuvietnam.net/viewtopic.php?t=164
                      Xem kỹ một tý, rồi tải về.
                      Chúc thành công
                      -------------------

                      Comment


                      • #26
                        thanks bac ChiBang nhe.
                        Lao động Là Vinh quang

                        Comment


                        • #27
                          Ngoài keil C bạn có thể dùng phần mềm ride để lập trình cũng khá tốt
                          SHARE KHO PHIM LỚN

                          Comment


                          • #28
                            Tôi mới học 8051 lập trình bằng ASM sử dụng trình dich Reads51
                            khi khai báo chíp bằng dòng lệnh
                            #include <sfr51.inc>
                            lúc dịch no cứ báo lỗi là sao vậy mấy bác?
                            làm ơn chỉ giáo
                            cảm on may bac nhé

                            Comment


                            • #29
                              Reads51

                              Bạn post thử 1 đoạn CT lên xem thế nào, và nói rõ lỗi là gì. Có thể phần option lựa chọn chưa chuẩn hoặc trình dịch lỗi
                              Càng biết nhiều càng thấy mình biết ít.

                              Comment


                              • #30
                                bác giaosucan làm với LCD rồi à.Thế bác đã làm I2C chưa ,mong bác giuó đỡ chúng tôi nhé.Bác cõ vẻ thích 8051 của Philip nhỉ

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X