Viet Code giup em voi

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts

  • zangseik
    replied
    Nguyên văn bởi dinhnam123 Xem bài viết
    cai này mình làm rồi, nhưng viêt asembly!^^
    cần thì mail cho mình :dinhnambkhn@gmail.com
    A gửi giúp e,e cảm ơn

    Leave a comment:


  • dinhnam123
    replied
    Nguyên văn bởi zangseik Xem bài viết
    Dùng 3 phím bấm,với phím bấm 1 tốc đô motor nhanh,pb2 toc do vua,pb3 dung.
    [ATTACH=CONFIG]56097[/ATTACH]
    em xin cam on nhieu,
    ductuandtvt@gmail.com
    cai này mình làm rồi, nhưng viêt asembly!^^
    cần thì mail cho mình :dinhnambkhn@gmail.com

    Leave a comment:


  • zangseik
    replied
    e muốn tăng lên 6 nút nhấn ( 6 tốc độ) thì làm thế nào a

    Leave a comment:


  • zangseik
    replied
    Em đã xem bài.cảm ơn a đã giành thời gian cho e,e liên lạc với a sau

    Leave a comment:


  • youaremylife
    replied
    Code:
    #include <REGX51.H>
    #include <stdio.h>
    
    #define usestep
    
    #define BUTTON_PORT P2
    #define MASK_BUTTON 0x07
    #define BUTTON_STOP P2_0
    #define BUTTON_FAST P2_1
    #define BUTTON_LOW P2_2
    
    #define PERIOD   100
    #define DUTY_MIN  20 //percent of duty
    #define DUTY_MAX   (PERIOD)
    #ifdef usestep
    #define DUTY_STEP 10
    #endif
    
    #define PWM_PIN  P2_7
    #define disable_interrupt()  ET0 = 0
    #define reenable_interrupt() ET0 = 1
    
    #define Timer_Setup() EA =0; TMOD = 0x02; TH0 = 0x9B; TL0 = 0x9B; TR0 = 0 ; ET0 = 0; EA = 1
    #define Set_duty(t) PWM.duty = t
    
    unsigned char setduty;
    
    static data struct
    {
      	unsigned char count;
    	unsigned char duty;
    	unsigned char period;
    }PWM;
    
    static data union
    {
    	struct 
    	{
    		unsigned char  phase:1;
    		unsigned char  run:1;
    		unsigned char  error:1;
    		unsigned char  update:1;
    		unsigned char  Lowlimit:1;
    		unsigned char  Highlimit:1;
    		unsigned char  db:1;
    		unsigned char  RSTimer:1;
    	}bits;
    	unsigned char _byte;
    }status; // biến lưu trạng thái làm việc
    
    static data union
    {
    	struct 
    	{
    		unsigned char  stop:1;
    		unsigned char  fast:1;
    		unsigned char  low:1;
    		unsigned char  unused:5;
    	}bits;
    	unsigned char _byte;
    }button; // biến lưu trạng thái nút nhấn
    // PRIVATE PROTOTYPE
    void Init_System(void);
    unsigned char check_button(void);
    void delay_Ms(unsigned int tdelay);
    void timer_interrupt_handle(void) interrupt 1
    {
    	if(status.bits.run)
    	{
    		if(PWM.count <= PWM.duty)	PWM_PIN = 1;
    		else if(PWM.count <=PWM.period) PWM_PIN= 0;
    		else		status.bits.RSTimer = 1;
    		if(status.bits.RSTimer)
    		{
    			PWM.count = 0;
    			status.bits.RSTimer = 0;
    		}
    		else 			PWM.count += 10;
    	}else PWM_PIN = 0;
    	TF0 = 0; // xoa co ngat		
    }
    
    void main()
    {
    	Init_System();
    	while(1)
    	{
    		do
    			button._byte = check_button(); // kiem tra trang thai phim nhan
    		while(!button._byte); // cho den khi co nut nhan
    		if(button.bits.stop) // neu nut stop duoc nhan
    		{
    			disable_interrupt(); // khong cho timer hoat dong
    			TR0 = 0; //dung timer
    			TF0 = 0; //xoa co ngat
    			PWM_PIN = 0; // dung dong co
    			status.bits.error = 0; // xoa co loi
    			status.bits.run = 0; // dong co da dung
    		}
    		else // nút stop không được nhấn
    		{
    			if((button.bits.fast)&&(button.bits.low)) // neu cả hai nút nhấn cùng được bấm xem như lỗi và bỏ qua
    			{
    				status.bits.error = 1;			
    				// DO SOME THING
    			}
    			else 
    			{
    				if(button.bits.fast) // neu nut nhanh duoc nhan
    				{
    					#ifdef usestep		
    					if(!status.bits.Highlimit)
    					{
    						setduty = PWM.duty;
    						setduty += DUTY_STEP;
    						if(setduty >= DUTY_MAX) 
    						{
    							setduty = DUTY_MAX;
    							status.bits.Highlimit = 1;
    						}
    					}
    					else if(setduty < DUTY_MAX) status.bits.Highlimit = 0;
    					#else
    					setduty = (unsigned char)DUTY_MAX; 
    					#endif
    					Set_duty(setduty); // tinh nduty
    				}
    				if(button.bits.low) // neu nut nhanh duoc nhan
    				{
    					#ifdef usestep		
    					if(!status.bits.Lowlimit)
    					{
    						setduty = PWM.duty;
    						if(setduty > DUTY_STEP) 	setduty -= DUTY_STEP;
    						else setduty = DUTY_MIN;
    						if(setduty <= DUTY_MIN) 
    						{
    							setduty = DUTY_MIN;
    							status.bits.Lowlimit = 1;
    						}
    					}
    					else if(setduty > DUTY_MIN) status.bits.Lowlimit = 0;
    					#else
    					setduty  = (unsigned char)DUTY_MIN;
    					#endif
    					Set_duty(setduty); // tinh nduty						
    				}	
    				if(!status.bits.run)// neu dong co dang dung thi cho phep chay lai
    				{
    					status.bits.run = 1;
    					reenable_interrupt(); // cho phép timer hoạt động trở lại
    					TR0 = 1;
    				}
    			}
    		}
    	}
    }
    
    unsigned char check_button(void)
    {
    	unsigned char old_status,new_status;
    	old_status = (~BUTTON_PORT)&MASK_BUTTON; //&MASK_BUTTON
    	if(old_status)  // kha nang co nut nhan
    	{
    		delay_Ms(1000); // chong nhieu
    		new_status = (~BUTTON_PORT)&MASK_BUTTON; //&MASK_BUTTON
    		while((BUTTON_PORT&MASK_BUTTON) != MASK_BUTTON);
    		return old_status&new_status; // nếu trạng thái truoc va sau tuong ung cac nut la nhu nhau thi co nghia la nut do duoc nhan
    	}
    	return 0; // khong co nut nao duoc nhan
    }
    
    void delay_Ms(unsigned int tdelay)
    {
    	// TO DO
    	while(tdelay--);
    }
    
    // khoi tao
    void Init_System(void)
    {
    	status._byte = 0;
    	button._byte = 0;
    	setduty = (unsigned char)DUTY_MIN;
    	PWM.period = (unsigned char)PERIOD;
    	Set_duty(setduty);
    	P2 = 0xFF;
    	PWM_PIN = 0;
    	Timer_Setup();
    }
    nếu bạn muốn tốc độ nó tăng giảm được thì để cái dòng #define usestep
    không thì //#define usestep dòng đó chuơng trình sẽ chạy ở hai cấp tốc độ DUTY_MAX với DUTY_MIN mấy cái thiết lập bạn tự điền lấy

    Leave a comment:


  • zangseik
    replied
    Nguyên văn bởi youaremylife Xem bài viết
    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.
    Anh kiểm tra giúp em nốt luôn đi a,a viết em không biết sai ở đâu . a giúp e với

    Leave a comment:


  • zangseik
    replied
    PMW_PIN thì khai báo thế nào hả a

    Leave a comment:


  • zangseik
    replied
    C hay asm cũng được a à.miễn sao chương trinh chạy được.đó là mấy chương trình e lấy trên mạng thôi,e không hiểu nên nhờ mấy a giúp.e cảm ơn hồi đáp của mấy a

    Leave a comment:


  • bienhou
    replied
    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

    Leave a comment:


  • Ck33spkt
    replied
    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!

    Leave a comment:


  • youaremylife
    replied
    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, 02:00.

    Leave a comment:


  • zangseik
    replied
    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

    Leave a comment:


  • zangseik
    replied
    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

    Leave a comment:


  • zangseik
    replied
    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;
    }
    } ;
    }
    }
    }

    Leave a comment:


  • Ck33spkt
    replied
    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!

    Leave a 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...