Đồ án vi điều khiển
Bài báo cáo vi điều khiển Robot do đường
I. Mạch
1. Mạch điều khiển 89S52
a. Mạch nguyên lý
RN 2
10K
Cx1 33pF
RES
X1
12Mhz
GND
Cx2 33pF
VCC
10
11
12
13
14
15
16
17
9
18
19
GND
T2/P1.0
T2 EX/P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
RXD/P3.0
TXD/P3.1
INT0/P3.2
INT1/P3.3
T0/P3.4
T1/P3.5
WR/P3.6
RD/P3.7
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
RESET
EA/VPP
XTAL1
XTAL2
IC1
ALE/PROG
PSEN
1 PNP1
+24V
D1
R3
1
2
HD4
D CL 0
D CR0
HD1
C1
104
BUT1
1
2
3
4
2
1
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
HD2
D CL 1
D CR1
2
1
1
2 DCR1
3
4
5 DCL1
6
7
8 +24V
9
10
11 GND
12
13 VCC
14 DK1
15 PWM1
HDC1
39
38
37
36
35
34
33
32
C2
104
HDC2
BUT0
SW1
1
2
3
4
SW2
GND
21
22
23
24
25
26
27
28
GND
C3
RN3
PWM0
DK0
PWM1
DK1
R1
RES
VCC
31
VCC
1
2
3
4
SW3
VCC
30
29
GND
1K
10uF
BUT1
BUT0
R2
250
LR1
SW2
LED
VCC
GND
3
2
1
JP1
3
1
IN
47
C4
C6
2200uF/16V104
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
10K
SW0
SW1
SW2
SW3
SW4
SW5
SW6
SW7
1
2
3
4
5
6
7
8
DD2
GND
A0
A1
A2
A3
A4
A5
A6
A7
SW1
SW3
SW5
SW7
5 10
4 9
3 8
2 7
1 6
VCC
GND
10K
HD3
1
2
SW0
SW2
SW4
SW6
DD1
RN 1
VCC
A1
A3
A5
A7
OUT
2
5 10
4 9
3 8
2 7
1 6
2
A0
A2
A4
A6
1
2 DCR0
3
4
5 DCL0
6
7
8 +24V
9
10
11 GND
12
13 VCC
14 DK0
15 PWM0
IC2
3
VCC
R4
270
C5
2200uF/16V
C7
104
LD1
GND
CDT - K9
1
Đồ án vi điều khiển
b. Mạch in
1
1
2
0
0
2
1
2
3
1
1
1
2
2
5
2
1
2
2
2
3
1
1
1
2
2
1
1
2
21
20
2
30
15
30
9
15
2
22
9
19
1
29
28
14
29
13
8
14
28
13
27
12
27
12
26
11
26
11
23
1
24
2
1
10
25
10
9
24
9
23
8
23
8
6
21
6
20
5
20
5
4
19
4
3
18
3
17
2
17
2
16
1
16
4
5
10
4
1
2
3
1
11
10
1
2
9
1
33
8
2
34
7
3
35
6
4
5
5
32
18
9
2
1
31
19
8
4
12
1
30
21
3
5
13
2
7
7
3
29
22
2
6
14
3
28
7
7
15
2
4
27
22
6
16
5
26
24
1
17
6
25
25
8
18
7
1
36
1
6
2
7
3
8
4
9
5
10
2
1
2
1
2
37
4
6
38
3
7
39
2
8
1
9
1
40
1
2
1
2
1
3
1
3
3
1
2
2
5
4
2
4
2
1
CDT - K9
2
Đồ án vi điều khiển
2. Mạch điều khiển động cơ “ IC MC 33486”
a. Mạch nguyên lý
HD-MC1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CHAN CAM
DCR0
DCL0
+24V
GND
+24V
R1
VCC
R2
LD1
270
LD2
PWM0 R3
270
DK0
VCC 19
PWM0 3
DK0 18
VCC 20
2
12
+24V 21
10
C1
47uF/50V GND 1
VCC
DK0
PWM0
10K
R4
GND
LD3
270
LD4
ST
IN1
IN2
WAKE
Cur R
NC
V+
NC
GND
OUT1
GLS1
5
DCR0
4
G
D 2
1
S 3
GND
OUT2
GLS2
MC1
Q1
IRF840
13
DCL0
17
G
D 2
1
Q2
IRF840
S 3
GND
b. Mạch in
2
1
2
2
1
1
2
1
15
2
2
1
1
2
2
1
1
14
13
13
1
12
2
11
21
3
10
9
5
1
8
7
2
6
5
4
3
3
2
2
1
1
CDT - K9
3
Đồ án vi điều khiển
3. Mạch so sánh (“IC LM358”)
a. Mạch nguyên lý
RN1 102
VCC
VCC
LD8
A7
LD7
A6
LD6
DD1
GND
VR1
VR2
GND
VCC
5
0
100K
GND
LDED0
5
LDED2
4
LDED4
3
LDED6
2
1
10
9
8
7
6
100K
VCC
3
IC1A
VR3
VR4
GND
2
100K
VCC
5
GND
3
7 A2
LDED2 6
100K
VCC
3
IC2A
VR5
GND
LDED0
LDED1
LDED2
LDED3
LDED4
LDED5
LDED6
LDED7
VCC
VR6
VCC
4
5
100K
GND
VCC
5
3
7 A4
LDED4 6
100K
1 A5
LDED5 2
IC3A
IC3B
VR7
VR8
GND
VCC
6
5
100K
103
1 A3
LDED3 2
IC2B
GND
1 A1
LDED1 2
IC1B
LDED1
LDED3
LDED5
LDED7
DD2
RN2
1
7 A0
LDED0 6
VCC
LD5
A5
LD4
A4
LD3
A3
LD2
A2
A1
A3
A5
A7
10
9
8
7
6
A0
5
4
3
2
1
A1
LD1
A0
A2
A4
A6
GND
7
LDED6 6
VCC
7
3
A6
100K
1
LDED7 2
A7
IC4A
IC4B
b. Mạch in
0
9
1
2
1
6
7
8
9
10
1
2
3
4
5
8
2
7
1
2
6
5
1
2
4
1
3
2
2
1
1
2
1
2
1
2
1
8
1
8
1
8
1
8
2
7
2
7
2
7
2
7
3
6
3
6
3
6
3
6
4
5
4
5
4
5
4
5
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
3
3
3
3
3
3
3
3
1
2
3
4
5
6
7
6
7
8
9
10
1
2
3
4
5
8
9
1
CDT - K9
4
Đồ án vi điều khiển
4. Mắt dò đường
a. Mạch nguyên lý
VCC
LDED0
5
LDED2
4
LDED4
3
LDED6
2
1
VCC
VCC
LDR1
LDED1
LDED3
LDED5
LDED7
10
9
8
7
6
VCC
LDR2
LDED0
VCC
LDR3
LDED1
R1
10K
DD1
VCC
LDR4
LDED2
R2
10K
VCC
LDR5
LDED3
R3
10K
R4
10K
VCC
VCC
LDR6
LDED4
LDR7
LDED5
R5
10K
LDR8
LDED6
R6
10K
LDED7
R7
10K
R8
10K
GND
GND
GND
GND
GND
VCC
VCC
VCC
VCC
R9
1K
R10
1K
LD1
R11
1K
LD2
GND
VCC
R12
1K
LD3
GND
GND
R13
1K
LD4
GND
GND
GND
GND
VCC
VCC
VCC
R14
1K
LD5
GND
R15
1K
LD6
GND
R16
1K
LD7
GND
GND
LD8
GND
b. Mạch in
10
9
8
7
6
5
4
3
2
1
3
0
1
2
2
1
1
2
1
2
2
1
1
2
1
2
1
2
2
1
1
2
1
2
1
2
2
1
1
2
2
2
2
1
2
2
2
1
1
1
2
2
2
1
1
1
2
1
2
2
2
1
1
2
1
1
2
2
2
1
1
1
1
2
2
1
1
CDT - K9
5
1
Đồ án vi điều khiển
II. CODE Robot dò đường
#include <REGX51.H>
//========= Định nghĩa chiều quay bánh==========
#define go 1
#define back 0
//------------------------------------------------------------------#define out 0xFF
// 0B11111111
//============= Định nghĩa mắt dò================
#define R7 0x7F
// 0B01111111
#define R6 0x3F
// 0B00111111
#define R5 0xBF // 0B10111111
#define R4 0x9F
// 0B10011111
#define R3 0xDF // 0B11011111
#define R2 0xAF // 0B11001111
#define R1 0xEF // 0B11101111
#define TT 0xE7
// 0B11100111
#define L1 0xF7 // 0B11110111
#define L2 0xF3 // 0B11110011
#define L3 0xFB // 0B11111011
#define L4 0xF9 // 0B11111001
#define L5 0xFD
// 0B11111101
#define L6 0xFA // 0B11111100
#define L7 0xFE // 0B11111110
//----------------------------------------------------------------// =========== Định nghĩa Pin xung PWM, Pin điều khiển=======
sbit xung=P2^0;
sbit dk1=P2^1;
sbit dk2=P2^3;
sbit xung2=P2^2;
//------------------------------------------------------------------------------------
CDT - K9
6
Đồ án vi điều khiển
// khai báo
unsigned char tocdo1,tocdo2 ;
unsigned char x=0,y=0;
unsigned long int counter0=0;
unsigned char INPUT;
// ==============Hàm tạo trễ===============
void delay(unsigned long int a)
{
unsigned long int i;
for (i=0;i<=a;i++);
}
//-------------------------------------------------------------//========== Đếm đường ngắt 0=================
void ngat0(void) interrupt 0
{
counter0++;
}
//------------------------------------------------------------//================ Điều khiển bánh trái==================
void banhtrai (unsigned char tocdo0,unsigned char chieu)
{
if (chieu==go)
{
TR0=1;
tocdo1=tocdo0;
dk1=1;
}
if (chieu==back)
{
TR0=1;
tocdo1=tocdo0;
dk1=0;
}
}
//----------------------------------------------------------------------------------CDT - K9
7
Đồ án vi điều khiển
// =============== Điều khiển bánh phải==================
void banhphai (unsigned char tocdo0,unsigned char chieu)
{
if (chieu==go)
{
TR1=1;
tocdo2=tocdo0;
dk2=1;
}
if (chieu==back)
{
TR1=1;
tocdo2=tocdo0;
dk2=0;
}
}
//-----------------------------------------------------------------------------------
//============ Tao Xung PWM bánh phải =============
void ngatt1 (void) interrupt 3
{
y++;
if( y==1)
{
TR1=0;
TL1=256-tocdo2;
xung2=1;
TR1=1;
}
if (y==2)
{
CDT - K9
8
Đồ án vi điều khiển
TR1=0;
TL1=256-(100-tocdo2);
xung2=0;
TR1=1;
y=0;
}
}
//----------------------------------------------------------------------//============ Tao Xung PWM bánh trái =============
void ngatt0 (void) interrupt 1
{
x++;
if (x==1)
{
TR0=0;
TL0=256-tocdo1;
xung=1;
TR0=1;
}
if (x==2)
{
TR0=0;
TL0=256-(100-tocdo1);
xung=0;
TR0=1;
x=0;
}
}
//----------------------------------------------------------------------CDT - K9
9
Đồ án vi điều khiển
//=============== Hàm do đường ================
void doduong(unsigned long int cm)
{
unsigned char nhotrai,nhophai;
unsigned char INPUT;
counter0=0;
while((100*cm)>=(counter0*18))
{
INPUT=P1; // mắt dò đượng nhận vào bằng PORT 1.
switch (INPUT)
{
case TT:
{
banhphai(50,go);
banhtrai(50,go);
nhophai=0;
nhotrai=0;
break;
}
case L1:
{
banhphai(55,go);
banhtrai(45,go);
nhophai=0;
nhotrai=0;
break;
}
case L2:
{
banhphai(60,go);
banhtrai(40,go);
nhophai=0;
nhotrai=0;
break;
CDT - K9
10
Đồ án vi điều khiển
}
case L3:
{
banhphai(65,go);
banhtrai(35,go);
nhophai=0;
nhotrai=0;
break;
}
case L4:
{
banhphai(70,go);
banhtrai(30,go);
nhophai=0;
nhotrai=0;
break;
}
case L5:
{
banhphai(75,go);
banhtrai(25,go);
nhophai=1;
nhotrai=0;
break;
}
case L6:
{
banhphai(80,go);
banhtrai(20,go);
nhophai=1;
nhotrai=0;
break;
}
case L7:
{
banhphai(85,go);
banhtrai(15,go);
nhophai=1;
nhotrai=0;
break;
CDT - K9
11
Đồ án vi điều khiển
}
case R1:
{
banhphai(45,go);
banhtrai(55,go);
nhophai=0;
nhotrai=0;
break;
}
case R2:
{
banhphai(40,go);
banhtrai(60,go);
nhophai=0;
nhotrai=0;
break;
}
case R3:
{
banhphai(35,go);
banhtrai(65,go);
nhophai=0;
nhotrai=0;
break;
}
case R4:
{
banhphai(30,go);
banhtrai(70,go);
nhophai=0;
nhotrai=0;
break;
}
case R5:
{
banhphai(25,go);
banhtrai(75,go);
nhophai=0;
nhotrai=1;
break;
CDT - K9
12
Đồ án vi điều khiển
}
case R6:
{
banhphai(20,go);
banhtrai(80,go);
nhophai=0;
nhotrai=1;
break;
}
case R7:
{
banhphai(15,go);
banhtrai(85,go);
nhophai=0;
nhotrai=1;
break;
}
case out:
{
if (nhotrai == 1)
{
banhphai(90,go);
banhtrai(10,back);
}
if (nhophai == 1)
{
banhphai(10,back);
banhtrai(90,go);
}
break;
}
default :
{
if(((INPUT!=R1)||(INPUT!=R2)||(INPUT!=R3)||(INPUT!=R4)||(INPUT!=R
5)||(INPUT!=R6)||(INPUT!=R7)||(INPUT!=L1)||(INPUT!=L2)||(INPUT!=L3
)||(INPUT!=L4)||(INPUT!=L5)||(INPUT!=L6)||(INPUT!=L7)||(INPUT!=out)
));
{
CDT - K9
13
Đồ án vi điều khiển
banhphai(50,go);
banhtrai(50,go);
}
break;
}
}
}
}
//-----------------------------------------------------------------------------//================ Hàm Stop===============
void stop(void)
{
TR0=0;
TR1=0;
xung=0;
dk1=0;
dk2=0;
xung2=0;
}
//-----------------------------------------------------------------// Hàm chính
void main (void)
{
TMOD=0x22;
IE=0x8B;
IT0=1;
IP=0;
while(1)
{
doduong(300); // dò đường 3m dừng.
stop();
while(1);
}
}
CDT - K9
14
Đồ án vi điều khiển
¾ Bài sử dụng các tài nguyên của 89S52 như sau:
o Timer 0,1 chế đỗ 8bit tạo xung dùng ngắt 1,3
o Ngắt ngoài 0 để đếm đường bằng Encoder
o PORT 1 để nhận tín hiệu từ mắt dò
o Và Pin I/O điều khiển
III. Đồ án Robot dò đường dùng vi điều khiển 89S52
Thực hiên đồ án: Phạm Văn Lượng
Lê Xuân Định
Nguyễn Trần Cường
Lớp: CDT- K9
CDT - K9
15