PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   cho em hỏi về mạch và lập trình cho pic 16F877A (http://www.picvietnam.com/forum/showthread.php?t=11241)

ngosythuat 22-09-2011 11:31 PM

cho em hỏi về mạch và lập trình cho pic 16F877A
 
1.các anh cho em hỏi em muốn tạo các nút ấn chọn sân và reset thì phải mắc mạch và viết code như thế nào ạ.
2.em viết một chương trìnnh con để rẽ trái cho robot dùng 6 led cảm biến từ 1 đến 6, không phụ thuộc led 0 và led 7 như sau có đúng không
void turn_left()
{
do
{
motor_left_stop();
motor_right_forward();
}while(0bx000000x||0bx100000x||0bx110000x||0bx0110 00x);

hangocminh1989 25-09-2011 06:31 PM

xin lỗi, bạn cho mình hỏi 1 câu hơi ngu. bạn viết cái này có biên dịch được không? chạy thì chạy như thế nào?

ngosythuat 25-09-2011 07:07 PM

Trích:

Nguyên văn bởi hangocminh1989 (Post 50084)
xin lỗi, bạn cho mình hỏi 1 câu hơi ngu. bạn viết cái này có biên dịch được không? chạy thì chạy như thế nào?

ừ thì tại tớ mới tìm hiểu nên chưa biết nó thế nào mới hỏi bạn thông cảm
chương trình để điều khiển cho robot rẽ trái. tớ dùng 8 con led dò đường cho dữ liệu vào cổng D. tớ dùng 6 con từ 1>6 để thực hiện việc dò đường và quay. còn 2 con 0 và 7 làm việc khác. thì t viết đoạn chương trình như vậy có được ko. bạn biết làm thế nào thì chỉ giùm tớ

void turn_left()
{
switch (SENSOR)
{
case 0bx001100x: sang_trai(); break;
case 0bx000110x: sang_trai(); break;
case 0bx000011x: sang_trai(); break;
case 0bx000001x: sang_trai(); break;
case 0bx000000x: sang_trai(); break;
case 0bx100000x: sang_trai(); break;
case 0bx110000x: sang_trai(); break;
case 0bx011000x: di_thang(); break;
}
}

hangocminh1989 26-09-2011 10:47 PM

tớ cũng chẳng biết cái chương trình con bạn viết thế nào, nhìn vào cái này thấy có chút vấn đề chỗ 2 biến x đầu và x cuối của portb, mình share cho bạn tài liệu này, mình mong là nó có ích

hangocminh1989 26-09-2011 10:50 PM

1 Attachment(s)
ớ, quên, hì hì, tài liệu đây

ngosythuat 27-09-2011 09:11 PM

ừ. thanks bạn cái này tớ cũng có rồi. tớ đọc cái tài liệu này xong tớ viết cái đó. ý của tớ là khi không cần quan tâm tới cái rb0 với rb7 thì viết vậy có được không. mà bạn có cách nào hay chỉ tớ cái

ngosythuat 27-09-2011 09:18 PM

à cho tớ hỏi về cái tài liệu bạn gửi đó sao đầu vào cảm biến là portD sao trong chương trình lại viết
/* CHƯƠNG TRÌNH CHÍNH */
void main ()
{
TRISC=0x00; // PORTC là ngõ ra ( động cơ)
TRISD=0x00; // PORTD là ngõ vào (cảm biến quang)
PORTC=0x00; // Khởi tạo giá trị ban đầu 0x00 cho PORTC
while(1)
{
switch (SENSOR)
{
case 0b00011000: forward(); break;
case 0b00001100: turn_left(); break;
case 0b00000110: turn_left(); break;
case 0b00000011: turn_left(); break;
case 0b00000001: turn_left(); break;
case 0b00110000: turn_right(); break;
case 0b01100000: turn_right(); break;
case 0b11000000: turn_right(); break;
case 0b10000000: turn_right(); break;
}}
}

lionking 28-09-2011 12:14 AM

Trích:

Nguyên văn bởi ngosythuat (Post 50142)
à cho tớ hỏi về cái tài liệu bạn gửi đó sao đầu vào cảm biến là portD sao trong chương trình lại viết
/* CHƯƠNG TRÌNH CHÍNH */
void main ()
{
TRISC=0x00; // PORTC là ngõ ra ( động cơ)
TRISD=0x00; // PORTD là ngõ vào (cảm biến quang)
PORTC=0x00; // Khởi tạo giá trị ban đầu 0x00 cho PORTC
while(1)
{
switch (SENSOR)
{
case 0b00011000: forward(); break;
case 0b00001100: turn_left(); break;
case 0b00000110: turn_left(); break;
case 0b00000011: turn_left(); break;
case 0b00000001: turn_left(); break;
case 0b00110000: turn_right(); break;
case 0b01100000: turn_right(); break;
case 0b11000000: turn_right(); break;
case 0b10000000: turn_right(); break;
}}
}


viết vầy gọn hơn

while(1)
{

if( SENSOR == 24 )
{
forward() ;
}
else
{
if( SENSOR < 24 )
{
turn_left();
}
else
{
turn_right();
}

}
}

ngosythuat 29-09-2011 09:14 AM

Trích:

Nguyên văn bởi lionking (Post 50152)
viết vầy gọn hơn

while(1)
{

if( SENSOR == 24 )
{
forward() ;
}
else
{
if( SENSOR < 24 )
{
turn_left();
}
else
{
turn_right();
}

}
}

viết thế được hả bạn

chairman_t 29-09-2011 09:46 AM

bạn à, nếu ngõ vào cảm vào biến thì trisd = 0xff, thứ hai nữa : chẵn hạn khi lệch trái nhiều 00000001 và lệch trái nhẹ hơn là 00000100 thì turnright ở 2 trường hợp này tốc độ của bánh trái sẽ khác nhau.

ngosythuat 29-09-2011 10:30 AM

Trích:

Nguyên văn bởi chairman_t (Post 50204)
bạn à, nếu ngõ vào cảm vào biến thì trisd = 0xff, thứ hai nữa : chẵn hạn khi lệch trái nhiều 00000001 và lệch trái nhẹ hơn là 00000100 thì turnright ở 2 trường hợp này tốc độ của bánh trái sẽ khác nhau.

tớ đang làm chương trình con quay trái cho robot tớ chỉ dùng 6 cảm biến từ 1 đến 6 thôi, còn con 0 và 7 để làm việc khác. bạn có thuật toán nào hay chỉ cho tớ với

chairman_t 29-09-2011 12:34 PM

thế này nhé khi đến ngã tư cần rẽ trái(giả sử bit6=bên trái), cho bánh phải quay thuận ,bánh trái quay ngược đồng thời bit6 đi qua vạch( đèn cảm biến của bạn sẽ sáng rồi tắt) dùng While(bit6==1) chờ nó tắt, cho 2 bánh dừng, thế thôi.

lionking 29-09-2011 03:09 PM

Trích:

Nguyên văn bởi ngosythuat (Post 50202)
viết thế được hả bạn

0b00011000 tương đương với 24 ở hệ thập phân , nên nấy giá trị 24 làm mốc để so sánh

ngosythuat 29-09-2011 09:06 PM

thanks mọi người. có gì khúc mắc hôm sau tớ hỏi mọi người tiếp


Múi giờ GMT. Hiện tại là 06:39 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam