Thông báo

Collapse
No announcement yet.

Viet Code giup em voi

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

  • Viet Code giup em voi

    Dùng 3 phím bấm,với phím bấm 1 tốc đô motor nhanh,pb2 toc do vua,pb3 dung.
    Click image for larger version

Name:	mophong.jpg
Views:	1
Size:	111.3 KB
ID:	1415213
    em xin cam on nhieu,
    ductuandtvt@gmail.com

  • #2
    Mình sẽ ko viết code cho bạn mình chỉ gợi ý thôi:
    Để thay đổi tốc độ động cơ bạn dùng kỹ thuật PWM
    Một biến duty, biến trạng thái status
    khi bấm nút chạy nhanh PN thì duty = 100, status = 1;
    khi bấm nút chạy chậm PC thì duty = 70(tùy), status = 1;
    khi bấm nút dừng PD thì duty = 0, status = 0;
    Chương trình kiểm tra nút nhấn phải có phần chống nảy.
    Tốt nhất bạn nên tự viết code sau đó mang lên ae góp ý cho

    Comment


    • #3
      Nguyên văn bởi youaremylife Xem bài viết
      Mình sẽ ko viết code cho bạn mình chỉ gợi ý thôi:
      Để thay đổi tốc độ động cơ bạn dùng kỹ thuật PWM
      Một biến duty, biến trạng thái status
      khi bấm nút chạy nhanh PN thì duty = 100, status = 1;
      khi bấm nút chạy chậm PC thì duty = 70(tùy), status = 1;
      khi bấm nút dừng PD thì duty = 0, status = 0;
      Chương trình kiểm tra nút nhấn phải có phần chống nảy.
      Tốt nhất bạn nên tự viết code sau đó mang lên ae góp ý cho
      thuc su la e moi dang tim hieu ve ngon ngu lap trinh thoi,nhieu cai e k ro.a viet giup em kai,em cam on nhieu

      Comment


      • #4
        Nguyên văn bởi zangseik Xem bài viết
        thuc su la e moi dang tim hieu ve ngon ngu lap trinh thoi,nhieu cai e k ro.a viet giup em kai,em cam on nhieu
        Làm ơn gõ tiếng Việt có dấu đi bạn ơi !

        Comment


        • #5
          Nguyên văn bởi Ck33spkt Xem bài viết
          Làm ơn gõ tiếng Việt có dấu đi bạn ơi !
          vâng.bài toán của em là dùng 3 phím bấm, với phím bấm 1 tốc độ nhanh,phím bấm 2 tốc độ chậm hơn còn phím bấm 3 tốc độ dừng lại.ở mỗi tốc độ nhanh chậm thi moto quay 1 tốc độ ổn định.mong a giúp đỡ

          Comment


          • #6
            Nguyên văn bởi zangseik Xem bài viết
            vâng.bài toán của em là dùng 3 phím bấm, với phím bấm 1 tốc độ nhanh,phím bấm 2 tốc độ chậm hơn còn phím bấm 3 tốc độ dừng lại.ở mỗi tốc độ nhanh chậm thi moto quay 1 tốc độ ổn định.mong a giúp đỡ
            Mình không có thời gian để viết code hoàn chỉnh giúp bạn được. Chỉ tham khảo cho bạn về mặt ý tưởng được thôi, theo mình là thế này:
            Chắc bạn điều khiển động cơ DC thông thường. Nếu bình thường thì bạn chỉ cấp nguồn DC phù hợp, liên tục là nó chạy liên tục ở một tốc độ nào đó. Bây giờ bạn đang cấp nguồn, bạn ngắt nguồn ra thì tốc độ động cơ giảm dần, nếu bạn không cấp nguồn tiếp thì tốc độ sẽ giảm về 0 và động cơ dừng lại không quay nữa. Nhưng khi bạn vừa ngắt nguồn rồi lại cấp nguồn thì động cơ chỉ giảm tốc độ rồi lại chạy tiếp. Nếu bạn cứ cấp nguồn rồi lại cắt, cấp nguồn rồi lại cắt, lặp lại công việc trên một cách liên tục và rất nhanh thì bạn sẽ thấy động cơ quay liên tục chỉ có điều là tốc độ quay sẽ chậm hơn so với khi bạn cấp nguồn liên tục thôi.
            Lợi dụng thực tế trên thì người ta dùng VĐK để cho nó đảm nhiệm việc cấp nguồn và cắt nguồn cho động cơ của bạn (việc này nó làm rất nhanh và thời gian cấp chính xác hơn bạn tự tay cấp nguồn cho động cơ của mình nhiều). Vì thế, theo yêu cầu của bạn thì bạn chỉ cần viết sẵn một chương trình con. Công việc của nó là tạo ra mức logic 1 và mức logic 0 ở một chân nào đó (ví dụ chân p2.1 chẳng hạn). Khi được gọi thì nó tạo ra mức logic 1 trong 1 khoảng thời gian t1 nào đó, rồi lại chuyển về mức logic 0 trong 1 khoảng thời gian t0 nào đó, rồi cho lặp lại công việc trên.
            Ở chương trình chính thì bạn cho con VĐK nó dò phím bấm, khi phím 1 được bấm thì bạn tạo ra mức logic 1 ở chân p2.1 để cho động cơ chạy liên tục (như khi bạn cấp nguồn DC), rồi khi nó dò được phím 2 bấm chẳng hạn thì bạn cho nó gọi chương trình con mà bạn vừa viết sẵn ban nãy, rồi lại tiếp tục dò phím, gặp phím 1 thì lại tạo ra mức logic 1 ở chân p2.1, gặp phím 3 thì bạn chỉ việc tạo ra mức logic 0 là động cơ của bạn sẽ dừng.
            Ở đây mình lấy mức logic 1 là VĐK điều khiển việc cấp nguồn để động cơ chay, mức logic 0 là cắt nguồn của động cơ.

            Comment


            • #7
              Nguyên văn bởi Ck33spkt Xem bài viết
              Mình không có thời gian để viết code hoàn chỉnh giúp bạn được. Chỉ tham khảo cho bạn về mặt ý tưởng được thôi, theo mình là thế này:
              Chắc bạn điều khiển động cơ DC thông thường. Nếu bình thường thì bạn chỉ cấp nguồn DC phù hợp, liên tục là nó chạy liên tục ở một tốc độ nào đó. Bây giờ bạn đang cấp nguồn, bạn ngắt nguồn ra thì tốc độ động cơ giảm dần, nếu bạn không cấp nguồn tiếp thì tốc độ sẽ giảm về 0 và động cơ dừng lại không quay nữa. Nhưng khi bạn vừa ngắt nguồn rồi lại cấp nguồn thì động cơ chỉ giảm tốc độ rồi lại chạy tiếp. Nếu bạn cứ cấp nguồn rồi lại cắt, cấp nguồn rồi lại cắt, lặp lại công việc trên một cách liên tục và rất nhanh thì bạn sẽ thấy động cơ quay liên tục chỉ có điều là tốc độ quay sẽ chậm hơn so với khi bạn cấp nguồn liên tục thôi.
              Lợi dụng thực tế trên thì người ta dùng VĐK để cho nó đảm nhiệm việc cấp nguồn và cắt nguồn cho động cơ của bạn (việc này nó làm rất nhanh và thời gian cấp chính xác hơn bạn tự tay cấp nguồn cho động cơ của mình nhiều). Vì thế, theo yêu cầu của bạn thì bạn chỉ cần viết sẵn một chương trình con. Công việc của nó là tạo ra mức logic 1 và mức logic 0 ở một chân nào đó (ví dụ chân p2.1 chẳng hạn). Khi được gọi thì nó tạo ra mức logic 1 trong 1 khoảng thời gian t1 nào đó, rồi lại chuyển về mức logic 0 trong 1 khoảng thời gian t0 nào đó, rồi cho lặp lại công việc trên.
              Ở chương trình chính thì bạn cho con VĐK nó dò phím bấm, khi phím 1 được bấm thì bạn tạo ra mức logic 1 ở chân p2.1 để cho động cơ chạy liên tục (như khi bạn cấp nguồn DC), rồi khi nó dò được phím 2 bấm chẳng hạn thì bạn cho nó gọi chương trình con mà bạn vừa viết sẵn ban nãy, rồi lại tiếp tục dò phím, gặp phím 1 thì lại tạo ra mức logic 1 ở chân p2.1, gặp phím 3 thì bạn chỉ việc tạo ra mức logic 0 là động cơ của bạn sẽ dừng.
              Ở đây mình lấy mức logic 1 là VĐK điều khiển việc cấp nguồn để động cơ chay, mức logic 0 là cắt nguồn của động cơ.
              Cảm ơn gợi ý của anh nhiều,em mới tìm hiểu về VDK thôi,e sẽ nghiên cứu từ gợi ý đó.có gì thì em hỏi sau,rất mong a giúp đỡ

              Comment


              • #8
                em vẫn chưa viết được nak a nào viết dùm luôn cho em tham khảo cái được không

                Comment


                • #9
                  Nguyên văn bởi zangseik Xem bài viết
                  em vẫn chưa viết được nak a nào viết dùm luôn cho em tham khảo cái được không
                  Đưa code của bạn lên đây cho mọi người tham khảo và sửa chữa giúp!

                  Comment


                  • #10
                    Nguyên văn bởi Ck33spkt Xem bài viết
                    Đưa code của bạn lên đây cho mọi người tham khảo và sửa chữa giúp!
                    Đây là đoạn em thao khảo được trên mạng,nhưng bị thiếu hay sao ma không build được.a xem giúp em
                    //Chuong trinh dk toc do dong co dc 1 fa
                    #include <regx52.h>
                    #include <DELAY.H>

                    ////////////////////////////// khai bao tay game///////////////////

                    #define tien P1_1
                    #define lui P1_3
                    #define stop P1_2
                    #define nhanh P1_0
                    #define cham P1_4
                    #define td_nhanh 150
                    #define td_cham 30


                    /////////////////////////////////////////////////////////////////////////////

                    #define motor P1_5


                    ///////////////////////pwm/////////////////////////////////////////////////
                    void dieu_xung()
                    {
                    CMOD=0;
                    CR=1;
                    CCAPM3=0x42;
                    CCAP3H=0;
                    }

                    //******************** chuong trinh chinh **************************************
                    unsigned char luu;
                    void Main()
                    {
                    dieu_xung();
                    while(1)
                    {
                    if(!stop) {
                    motor=0;
                    delay(100);
                    motor_dao=1;
                    delay(100);
                    luu=0;
                    };
                    if(!nhanh){
                    motor=0;
                    delay(100);
                    motor=td_nhanh;
                    luu=td_nhanh;
                    };
                    if(!cham){
                    motor=0;
                    delay(100);
                    motor=td_cham;
                    luu=td_cham;
                    };
                    if(!tien){
                    motor=0;
                    delay(100);
                    motor_dao=1;
                    delay(100);
                    motor=luu;
                    while(stop&&lui)
                    {
                    if(!nhanh){
                    motor=td_nhanh;
                    luu=td_nhanh;
                    };
                    if(!cham){
                    motor=td_cham;
                    luu=td_cham;
                    };
                    }
                    };
                    if(!lui){
                    motor=0;
                    delay(100);
                    motor_dao=0;
                    delay(100);
                    motor=luu;
                    while(tien&&stop){
                    if(!nhanh){
                    motor=td_nhanh;
                    luu=td_nhanh;
                    }
                    else if(!cham){
                    motor=td_cham;
                    luu=td_cham;
                    }
                    } ;
                    }
                    }
                    }

                    Comment


                    • #11
                      Nguyên văn bởi zangseik Xem bài viết
                      thuc su la e moi dang tim hieu ve ngon ngu lap trinh thoi,nhieu cai e k ro.a viet giup em kai,em cam on nhieu
                      Từ chương trình dưới đây theo a nên loại bỏ những gì
                      UpDown EQU 00H ; đặt tên bit 00h là updown

                      StartEnd EQU 01H ; đặt tên bit 01h là startend

                      LAMPCODE EQU 21H ; đặt tên thanh ghi 21h là lampcode

                      ORG 0000H ; địa chỉ thanh ghi khởi đầu

                      JMP MAIN ; nhẩy đến tên nhãn

                      ORG 30H ; vùng địa chỉ bên ngoài chức năng ngắt



                      MAIN: ; đặt tên nhãn dùng cho lệnh nhẩy

                      MOV SP,#5FH ; chọn địa chỉ làm ngăn xếp

                      MOV P3,#0FFH ; đặt trị 11111111b vào Port p3 để tắt 8 led

                      ; điều kiện khởi đầu

                      CLR UpDown ; đặt bit 0 vào bit updown

                      CLR StartEnd ; đặt bit 0 vào bit startend

                      MOV LAMPCODE,#0FEH ; chuyển trị 11111110b vào lampcode



                      LOOP: ; đặt tên nhãn dùng cho lệnh nhẩy

                      CALL KEY ; gọi chương trình dò phím, tên nhãn key

                      JNB F0,LNEXT ; cho nhẩy theo bit f0

                      CALL KEYPROC ; gọi chương trình xử lý phím



                      LNEXT: ; đặt tên nhãn dùng cho lệnh nhẩy

                      CALL LAMP ; gọi chương trình điều khiển 8 Led trên Port p3

                      JMP LOOP ; quay lại tên nhãn loop



                      DELAY: ; chương trình tạo trể

                      MOV R7,#100 ; đặt trị 100 vào thanh ghi r7



                      D1: ; đặt tên nhãn dùng cho lệnh nhẩy

                      MOV R6,#100 ; đặt trị 100 vào thanh ghi r6

                      DJNZ R6,$ ; nhẩy tại chổ, chờ trị trong r6 bằng 0

                      DJNZ R7,D1 ; giảm trị trong r7 theo bước -1, r7=0?, định hướng nhẩy

                      RET ; qua lại sau lệnh call delay



                      ;----------------------------------------

                      KEYPROC: ; chương trình xử lý phím

                      MOV A,B ; chuyển trị trong b vào thanh ghi a

                      JB ACC.2,KeyStart ; xét bit acc.2 để định hướng nhẩy

                      JB ACC.3,KeyOver ; xét bit acc.3 để định hướng nhẩy

                      JB ACC.4,KeyUp ; xét bit acc.4 để định hướng nhẩy

                      JB ACC.5,KeyDown ; xét bit acc.5 để định hướng nhẩy

                      JMP KEY_RET ; nhẩy về tên nhãn key_ret



                      KeyStart: ; trình vào mode khởi động

                      SETB StartEnd ; đặt bit startend lên 1, cho khởi động

                      JMP KEY_RET ; nhẩy đến tên nhãn key_ret



                      KeyOver: ; trình cho tắt, kết thúc

                      CLR StartEnd ; đặt bit startend xuống 0, kết thúc

                      JMP KEY_RET ; nhẩy đến tên nhãn key_ret



                      KeyUp: ; trình cho 8 Led dời qua phải

                      SETB UpDown ; đặt bit updown lên 1, dời qua phải

                      JMP KEY_RET ; nhẩy đến tên nhãn key_ret



                      KeyDown: ; trình cho 8 Led dời qua trái

                      CLR UpDown ; đặt bit updown xuống 0, dời qua trái



                      KEY_RET: ; đặt tên nhãn dùng cho lệnh nhẩy

                      RET ; quay lại sau lệnh call keyproc



                      KEY: ; đặt tên nhãn dùng cho lệnh nhẩy, trình dùng dò phím

                      CLR F0 ; xóa bit f0

                      ORL P1,#00111100B ; lấy logic OR trị 00111100b và Port p1

                      MOV A,P1 ; chuyển trị hiện có của p1 vào thanh ghi a

                      ORL A,#11000011B ; lấy logic OR a và 11000011b, xét trạng thái 4 phím

                      CPL A ; lấy bù a, đảo 8 bit trong thanh ghi a

                      JZ K_RET ; xét trị trong thanh a, có bằng 0 không? để nhẩy

                      CALL DELAY ; cho gọi chương trình trể

                      OR P1,#00111100B ; lại lấy logia OR trị 00111100b cho Port p1

                      MOV A,P1 ; lại chuyển trị hiện có của Port p1 vào thanh ghi a

                      ORL A,#11000011B ; cho lấy logic OR trị trong a và trị 11000011b

                      CPL A ; lại cho bù a, đảo 8 bit trong thanh ghi a

                      JZ K_RET ; lại xét trị trong thanh a, có bằng 0? để nhẩy

                      MOV B,A ; chuyển trị trong a vào thanh b

                      SETB F0 ; đặt bit kiểm tra f0 lên 1, báo đã có phím nhấn



                      K_RET: ; đặt tên nhãn dùng cho lệnh nhẩy

                      ORL P1,#00111100B ; Lấy logic OR trị hiện có trong p1 và 00111100b

                      MOV A,P1 ; chuyển trị hiện có trên Port p1 vào thanh ghi a

                      ORL A,#11000011B ; lấy logic OR trị trong a và 11000011b

                      CPL A ; lấy bù a, đảo 8 bit trong thanh ghi a

                      JZ K_RET1 ; xét trị trong a có bằng 0 không? để nhẩy

                      JMP K_RET ; nhẩy đến tên nhãn k_ret



                      K_RET1: ; đặt tên nhãn dùng cho lệnh nhẩy

                      RET ; quay lại sau lệnh call key



                      D500MS: ; chương trình làm trể

                      PUSH PSW ; tạm cho cất trị trong thanh ghi psw vào ngăn xếp

                      SETB RS0 ; đặt trị rs0 trong thanh ghi trạng thái psw lên 1

                      MOV R7,#200 ; chuyển trị 200 vào thanh ghi r7



                      D51: ; đặt tên nhãn dùng cho lệnh nhẩy

                      MOV R6,#250 ; đặt trị 250 vào thanh ghi r6



                      D52: ; đặt tên nhãn dùng cho lệnh nhẩy

                      NOP ; dòng không tác vụ

                      NOP ; dòng không tác vụ

                      NOP ; dòng không tác vụ

                      NOP ; dòng không tác vụ

                      DJNZ R6,D52 ; giảm trị trong r6 theo bước -1, r6=0?, chọn hướng nhẩy

                      DJNZ R7,D51 ; giảm trị trong r7 theo bước -1, r7=0?, chọn hướng nhẩy

                      POP PSW ; lấy lại trị trước đó cho thanh ghi psw

                      RET ; quay lại sau lệnh gọi call d500ms



                      LAMP: ; chương trình điều khiển 8 Led trên Port p3

                      JB StartEnd,LampStart ; chọn hướng nhẩy theo bit startend

                      MOV P3,#0FFH ; đặt trị 11111111b vào Port p3, tắt hết 8 Led

                      JMP LAMPRET ; nhẩy về tên nhãn lampret



                      LampStart: ; đặt tên nhãn cho lệnh nhẩy, trình dời 8 bit trong a qua trái

                      JB UpDown,LAMPUP ; nhẩy theo bit updown

                      MOV A,LAMPCODE ; chuyển trị trong lampcode cho thanh ghi

                      RL A ; cho quay vòng 8 bit trong thanh ghi aqua hướng trái

                      MOV LAMPCODE,A ; chuyển trị trong a vào lampcode

                      MOV P3,A ; cho xuất trị trong a ra Port p3

                      CALL D500MS ; gọi chương trình làm chậm d500ms

                      JMP LAMPRET ; nhẩy về tên nhãn lampret



                      LAMPUP: ; đặt tên nhãn cho lệnh nhẩy, trình cho dời 8 bit qua phải

                      MOV A,LAMPCODE ; chuyển trị trong lampcode vào thanh ghi a

                      RR A ; cho quay vòng 8 bit trong a qua hướng phải

                      MOV LAMPCODE,A ; chuyển trị trong a vào lampcode

                      MOV P3,A ; xuất trị trong a ra Port p3

                      CALL D500MS ; cho gọi chương trình trể d500ms



                      LAMPRET: ; đặt tên nhãn cho lệnh nhẩy

                      RET ; quay lại sau lệnh call

                      END ; dừng biên dịch tại dòng này

                      Comment


                      • #12
                        Nguyên văn bởi youaremylife Xem bài viết
                        Mình sẽ ko viết code cho bạn mình chỉ gợi ý thôi:
                        Để thay đổi tốc độ động cơ bạn dùng kỹ thuật PWM
                        Một biến duty, biến trạng thái status
                        khi bấm nút chạy nhanh PN thì duty = 100, status = 1;
                        khi bấm nút chạy chậm PC thì duty = 70(tùy), status = 1;
                        khi bấm nút dừng PD thì duty = 0, status = 0;
                        Chương trình kiểm tra nút nhấn phải có phần chống nảy.
                        Tốt nhất bạn nên tự viết code sau đó mang lên ae góp ý cho
                        A ơi.a có thể hướng dẫn thêm cho em dược cái không,như a nói thì phải viết như thế nào,em mới bắt đầu học,nhưng lại cần kết quả sớm,nên không thể tự viết trong thời gian ngắn đươc,a viết giúp em cái

                        Comment


                        • #13
                          Nguyên văn bởi zangseik Xem bài viết
                          A ơi.a có thể hướng dẫn thêm cho em dược cái không,như a nói thì phải viết như thế nào,em mới bắt đầu học,nhưng lại cần kết quả sớm,nên không thể tự viết trong thời gian ngắn đươc,a viết giúp em cái
                          tóm lại là viết bằng asm hay c

                          chương trình gửi lên chỉ mang tính tham khảo, chỉ thể hiện lại nôi dung đã nói trước đó, muốn build được thì phải sửa lại thêm.
                          Attached Files
                          Last edited by youaremylife; 29-11-2012, 03:00.

                          Comment


                          • #14
                            Nguyên văn bởi zangseik Xem bài viết
                            A ơi.a có thể hướng dẫn thêm cho em dược cái không,như a nói thì phải viết như thế nào,em mới bắt đầu học,nhưng lại cần kết quả sớm,nên không thể tự viết trong thời gian ngắn đươc,a viết giúp em cái
                            Bạn định viết bằng C hay ASM? ASM thì hi vọng còn có thể giúp bạn được một vài chỗ chứ C thì chịu hẳn rồi!

                            Comment


                            • #15
                              Nguyên văn bởi zangseik Xem bài viết
                              Đây là đoạn em thao khảo được trên mạng,nhưng bị thiếu hay sao ma không build được.a xem giúp em
                              //Chuong trinh dk toc do dong co dc 1 fa
                              #include <regx52.h>
                              #include <DELAY.H>

                              ////////////////////////////// khai bao tay game///////////////////

                              #define tien P1_1
                              #define lui P1_3
                              #define stop P1_2
                              #define nhanh P1_0
                              #define cham P1_4
                              #define td_nhanh 150
                              #define td_cham 30


                              /////////////////////////////////////////////////////////////////////////////

                              #define motor P1_5


                              ///////////////////////pwm/////////////////////////////////////////////////
                              void dieu_xung()
                              {
                              CMOD=0;
                              CR=1;
                              CCAPM3=0x42;
                              CCAP3H=0;
                              }

                              //******************** chuong trinh chinh **************************************
                              unsigned char luu;
                              void Main()
                              {
                              dieu_xung();
                              while(1)
                              {
                              if(!stop) {
                              motor=0;
                              delay(100);
                              motor_dao=1;
                              delay(100);
                              luu=0;
                              };
                              if(!nhanh){
                              motor=0;
                              delay(100);
                              motor=td_nhanh;
                              luu=td_nhanh;
                              };
                              if(!cham){
                              motor=0;
                              delay(100);
                              motor=td_cham;
                              luu=td_cham;
                              };
                              if(!tien){
                              motor=0;
                              delay(100);
                              motor_dao=1;
                              delay(100);
                              motor=luu;
                              while(stop&&lui)
                              {
                              if(!nhanh){
                              motor=td_nhanh;
                              luu=td_nhanh;
                              };
                              if(!cham){
                              motor=td_cham;
                              luu=td_cham;
                              };
                              }
                              };
                              if(!lui){
                              motor=0;
                              delay(100);
                              motor_dao=0;
                              delay(100);
                              motor=luu;
                              while(tien&&stop){
                              if(!nhanh){
                              motor=td_nhanh;
                              luu=td_nhanh;
                              }
                              else if(!cham){
                              motor=td_cham;
                              luu=td_cham;
                              }
                              } ;
                              }
                              }
                              }
                              con 8051 làm gì có thanh ghi CMOD CR.. nhỉ. bạn dùng loại nào vậy
                              Nguyễn Huy Biên - 01649 802 694
                              gmail :

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X