Nguyên văn bởi dinhnam123
Xem bài viết
Viet Code giup em voi
Collapse
X
-
cai này mình làm rồi, nhưng viêt asembly!^^Nguyên văn bởi zangseik Xem bài viếtDù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
cần thì mail cho mình :dinhnambkhn@gmail.com
Leave a comment:
-
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:
-
nếu bạn muốn tốc độ nó tăng giảm được thì để cái dòng #define usestepCode:#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(); }
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:
-
Anh kiểm tra giúp em nốt luôn đi a,a viết em không biết sai ở đâuNguyên văn bởi youaremylife Xem bài viếttó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.
. a giúp e với
Leave a comment:
-
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:
-
con 8051 làm gì có thanh ghi CMOD CR.. nhỉ. bạn dùng loại nào vậyNguyê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;
}
} ;
}
}
}
Leave a comment:
-
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!Nguyên văn bởi zangseik Xem bài viếtA ơ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:
-
tóm lại là viết bằng asm hay cNguyên văn bởi zangseik Xem bài viếtA ơ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
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 FilesLast edited by youaremylife; 29-11-2012, 02:00.
Leave a comment:
-
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áiNguyên văn bởi youaremylife Xem bài viếtMì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
Leave a comment:
-
Từ chương trình dưới đây theo a nên loại bỏ những gìNguyên văn bởi zangseik Xem bài viếtthuc 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
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:
-
Đâ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 emNguyê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!
//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:
-
Đưa code của bạn lên đây cho mọi người tham khảo và sửa chữa giúp!Nguyên văn bởi zangseik Xem bài viếtem 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
Leave a comment:
Bài viết mới nhất
Collapse
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
Hôm qua, 14:33 -
-
bởi Nexus 6PMạch này chỉ chạy cho LED 10W trở xuống, còn muốn chạy Led công suất cao thì sao bác thớt ơi?-
Channel: Điện tử công suất
Hôm qua, 10:49 -
-
Trả lời cho Tìm VR 5 chânbởi dinhthuong80Cảm ơn bác bqviet . Nhưng hình như các VR 5 chân của linhkienchatluong là loại có 2 chân là công tắc đóng mở. Thấy trên Shopee có chỗ bán linh kiện đàn Organ, mà không biết đúng loại không, với lại sao ... mắc dữ dội luôn ấy!!!
...-
Channel: Hướng dẫn tìm thông tin linh kiện
19-10-2026, 11:30 -
-
Trả lời cho Tìm VR 5 chânbởi bqvietTrang sản phẩm này có loại 5 chân và 8 chân
https://linhkienchatluong.vn/chiet-a...doi_s1595.aspx
Ngoài ra một trang cùng cấp với nó có loại 6 chân nữa, chắc đủ cho người muốn tìm....-
Channel: Hướng dẫn tìm thông tin linh kiện
17-10-2026, 17:19 -
-
bởi dinhthuong80Chào cả nhà, chúc cuối tuần vui vẻ!
Hôm nay mình lên đây nhờ ai biết chỉ dùm biến trở 5 chân này tên gọi là gì, có thể mua ở đâu vậy? Xin cám ơn nhiều! ...-
Channel: Hướng dẫn tìm thông tin linh kiện
-

Leave a comment: