CHƯƠNG 8 :
LƯU ĐỒ GIẢI THUẬT VÀ CHƯƠNG
TRÌNH
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 149
Luận văn tốt nghiệp GVHD : Thầy Nguyễn Thiện Thành
4
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 150
Nhận tín hiệu đk
tốc độ từ máy tính
i–
Luận văn tốt nghiệp GVHDAbs(Qttrá
: Thầy Nguyễ
n
Qtphải) < 5
5
N
Thiện Thành
Y
Nhận tín hiệu
đkChạ
từ ymá
y ntính
thẳ
g
Qttrái > Qtphải
N
Y
N
Rẽ trái
Thoát chế độ
tự động
Y
3
Rẽ phải
3
Kết thúc
8.2. Chương trình viết bằng assembly cho vi xử lý 89C51 :
;ĐOẠN KHAI BÁO CÁC BIẾN
ORG 0000H
DECLARE:
RRI EQU 20H
RLE EQU 21H
;CHỨA GIÁ TRỊ QUANG TRỞ BÊN PHẢI
; CHỨA GIÁ TRỊ QUANG TRỞ BÊN TRÁI
TAM EQU 22H
;BIẾN TẠM DÙNG ĐỂ ĐẢO BIT
CBKC EQU 23H CÁCH
INPUT
EQU 24H
CONTROL EQU 25H
TỰ ĐỘNG
VTOC EQU 26H
;CHỨA GIÁ TRỊ CẢM BIẾN KHOẢNG
;GIÁ TRỊ NHẬN VỀ TỪ MÁY TÍNH
;BIẾN XÁC ĐỊNH ĐK BẰNG TAY HAY
;BIẾN DÙNG ĐỂ THAY ĐỔI TỐC ĐỘ
MANUAL EQU 27H
;BIẾN DÙNG ĐỂ ĐK BẰNG TAY
BIEN_TRUYEN EQU 28H;BIẾN XÁC ĐNH THỨ TỰ TRUYỀN
MOV MANUAL,#0
MOV SCON,#01010010B
MOV TMOD,#21H
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 151
Luận văn tốt nghiệp GVHD : Thầy Nguyễn Thiện Thành
MOV TH1,#-3
SETB TR1
;PHẦN CHƯƠNG TRÌNH CHÍNH
MAIN:
MOV
P2,#40H
MOV
P1,#00H
JNB
RI,$
LCALL
INCHAR
;PHẦN CHƯƠNG TRÌNH XÉT CHẾ ĐỘ ĐIỀU KHIỂN
XET_AUTO:
CJNE
A,#6,XET_MANUAL
MOV
INPUT,#1
MOV
BIEN_TRUYEN,#0
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 152
GVHD : Thầy Nguyễn Thiện Thành
Luận văn tốt nghiệp
SJMP
AUTO
XET_MANUAL:
CJNE
A,#7,XET_STOP
MOV
INPUT,#2
LJMP
L_MANUAL
XET_STOP:
CJNE
A,#8,MAIN
SJMP
MAIN
;ĐOẠN CHƯƠNG TRÌNH ĐIỀU KHIỂN TỰ ĐỘNG
AUTO:
JNB
P3.2,INTERRUPT
JNB
P3.3,INTERRUPT_LEFT
JNB
P3.4,INTERRUPT_RIGHT
LCALL
CB_QUANG
LCALL
BINARY_BCD
OUTPUT:
JNB
TI,SKIP1
MOV A,BIEN_TRUYEN CJNE
A,#0,TRUYEN_QTRO
TRUYEN_CBKC:
MOV
A,CBKC
LCALL
OUTCHAR
INC
BIEN_TRUYEN
SJMP
SKIP1
TRUYEN_QTRO:
LCALL
QTRO_LEFT
JNB
TI,$
LCALL
LCALL
OUTCHAR
QTRO_RIGHT
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 153
MOV
BIEN_TRUYEN,#0
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
JNB
TI,$
LCALL
OUTCHAR
SKIP1:
CLR
SUBB
C
A,#10
JC
MAIN1
MAIN1:
MOV
A,CBKC
SUBB
A,#128
JC
THOÁT
MAIN1
MOV
;NẾU KHOẢNG CÁCH >128 THÌ
R1,#20
LJMP
STOP
;ĐOẠN CHƯƠNG TRÌNH XỬ LÝ VA CHẠM
INTERRUPT:
MOV
R3,#20
LOOP5:
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DRIVE_NGHICH
DJNZ
R3,LOOP5
MOV
R3,#40
LOOP6:
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DRIVE_RIGHT
DJNZ
R3,LOOP6
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 154
MOV
LOOP7:
R3,#40
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DJNZ
DRIVE_THUA
N
R3,LOOP7
SJMP
AUTO
INTERRUPT_LEFT:
MOV
R3,#20
LOOP8:
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DRIVE_RIGHT
DJNZ
R3,LOOP8
MOV
R3,#30
LOOP9:
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DRIVE_THUA
DJNZ
N
R3,LOOP9
LJMP
AUTO
INTERRUPT_RIGHT:
MOV
R3,#20
LOOP10:
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DRIVE_LEFT
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 155
DJNZ
R3,LOOP10
MOV
LOOP11:
R3,#30
Luận văn tốt nghiệp
LCALL
CB_QUANG
LCALL
BINARY_BCD
LCALL
DRIVE_THUAN
DJNZ
R3,LOOP11
LJMP
AUTO
GVHD : Thầy Nguyễn Thiện Thành
MAIN1:
JNB
RI,SKIP2
LCALL
INCHAR
MOV
INPUT,A
CJNE
A,#6,XET7
MOV
BIEN_TRUYEN,#0
LJMP
AUTO
CJNE
A,#7,XET8
LJMP
L_MANUAL
CJNE
A,#8,SKIP2
LJMP
MAIN
XET6:
XET7:
XET8:
SKIP2:
CLR
C
MOV
A,RLE
SUBB
A,RRI
JC
MAIN2
SUBB
A,#5
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 156
JNC
LEFT
THUAN:
LCALL
DRIVE_THUAN
LJMP
AUTO
MAIN2:
Luận văn tốt nghiệp
CLR
C
MOV
A,RRI
SUBB
A,RLE
SUBB
A,#5
JC
THUAN
GVHD : Thầy Nguyễn Thiện Thành
RIGHT:
LCALL
DRIVE_RIGHT
LJMP
AUTO
LCALL
DRIVE_LEFT
LJMP
AUTO
LEFT:
;ĐOẠN CHƯƠNG TRÌNH XỬ LÝ DỪNG
STOP:
DRIVE_THUA
N
LCALL
DJNZ R1,STOP
MOV P2,#40H
MOV P1,#00H
MOV INPUT,#0
MOV A,CBKC
JNB
TI,$
OUTCHAR
LCALL
STOP1:
VAN_TOC
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 157
LCALL
DISPLAY
LCALL
JNB
RI,SKIP3
INCHAR
LCALL
CJNE A,#8,SKIP3
LJMP MAIN
SKIP3:
SJMP STOP1
Luận văn tốt nghiệp
GVHD
: Thầy
Nguyễ
n Thiện
Thành
;ĐOẠN CHƯƠNG TRÌNH ĐIỀU KHIỂN BẰNG NÚT NHẤN
L_MANUAL:
MOV P2,#40H
MOV P1,#00H
JNB
RI,SKIP4
INCHAR
LCALL
XET_GIAM:
CJNE A,#23,XET_TANG
INC
INPUT
SJMP SKIP4
XET_TANG:
CJNE A,#36,CONTINUE
DJNZ INPUT,SKIP4
MOV INPUT,#1
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 158
SJMP SKIP4
CONTINUE:
MOV MANUAL,A
XET_6:
CJNE A,#6,XET_7
LJMP AUTO
XET_7:
CJNE A,#7,XET_8
LJMP L_MANUAL
XET_8:
CJNE A,#8,SKIP4
LJMP MAIN
SKIP4:
MOV A,MANUAL
CJNE A,#0,M_FORWARD
LJMP L_MANUAL
Luận văn tốt
GVHD
: Thầy
nghiệp
Nguyễ
n Thiện
Thành
M_FORWARD:
CJNE
A,#1,M_LEFT
LCALL
DRIVE_THUAN
LJMP
L_MANUAL
M_LEFT:
CJNE
A,#2,M_BACK
LCALL
DRIVE_LEFT
LJMP
L_MANUAL
M_BACK:
CJNE
A,#3,M_RIGHT
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 159
LCALL
DRIVE_NGHICH
LJMP
L_MANUAL
M_RIGHT:
CJNE
A,#4,L_MANUAL
LCALL
DRIVE_RIGHT
LJMP
END_MAIN:
L_MANUAL
;KẾT THÚC CHƯƠNG TRÌNH CHÍNH
;CHƯƠNG TRÌNH CON ĐIỀU KHIỂN CHẠY
TỚI DRIVE_THUAN:
MOV
R0,#0
LOOP1:
MOV
A,R0
INC
R0
MOV
DPTR,#TABLE
MOVC
A,@A+DPTR
MOV
P2,#40H
MOV
P1,A
MOV
VTOC,INPUT
;ĐOẠN CHƯƠNG TRÌNH THAY ĐỔI TỐC ĐỘ
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
CHANGE1:
LCALL
DISPLAY
LCALL
VAN_TOC
DJNZ
VTOC,CHANGE1
CJNE
RET
R0,#8,LOOP1
;CHƯƠNG TRÌNH CON CHẠY LÙI
DRIVE_NGHICH:
MOV
R4,#8
LOOP2:
DEC
R4
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 160
MOV
A,R4
MOV
DPTR,#TABLE
MOVC
A,@A+DPTR
MOV
P2,#40H
MOV
P1,A
LCALL
DISPLAY
LCALL
VAN_TOC
CJNE
RET
R4,#0,LOOP2
;CHƯƠNG TRÌNH CON RẼ PHẢI
DRIVE_RIGHT:
MOV R0,#0
LOOP3:
MOV A,R0
INC
R0
MOV DPTR,#RTABLE MOVC
A,@A+DPTR
MOV P2,#40H
MOV P1,A
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
MOV VTOC,INPUT
;ĐOẠN CHƯƠNG TRÌNH THAY ĐỔI TỐC ĐỘ
CHANGE2:
LCALL
LCALL
DISPLAY
VAN_TOC
DJNZ
VTOC,CHANGE2
CJNE
RET
R0,#8,LOOP3
;CHƯƠNG TRÌNH CON RẼ TRÁI
DRIVE_LEFT:
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 161
MOV
R0,#0
LOOP4:
MOV
A,R0
INC
R0
MOV
DPTR,#LTABLE
MOVC
A,@A+DPTR
MOV
P2,#40H
MOV
P1,A
MOV
VTOC,INPUT
;ĐOẠN CHƯƠNG TRÌNH THAY ĐỔI TỐC ĐỘ
CHANGE3:
LCALL
DISPLAY
LCALL
VAN_TOC
DJNZ VTOC,CHANGE3
CJNE R0,#8,LOOP4
RET
;CHƯƠNG TRÌNH CON ĐỌC QUANG TRỞ BÊN PHẢI
QTRO_RIGHT:
MOV
DPTR,#2001H
MOVX
@DPTR,A
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
LCALL
DELAY120us
MOVX
A,@DPTR
MOV
TAM,A
LCALL
DAO_BIT
MOV
RRI,A
RET
;CHƯƠNG TRÌNH CON ĐỌC QUANG TRỞ BÊN TRÁI
QTRO_LEFT:
MOV
DPTR,#2002H
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 162
MOVX
@DPTR,A
LCALL
DELAY120us
MOVX
A,@DPTR
MOV
TAM,A
LCALL
DAO_BIT
MOV
RET
RLE,A
;CHƯƠNG TRÌNH CON ĐỌC CẢM BIẾN KHOẢNG CÁCH
CB_QUANG:
MOV
DPTR,#2000H
MOVX
@DPTR,A
LCALL
DELAY120us
MOVX
A,@DPTR
MOV
TAM,A
LCALL
DAO_BIT
MOV
CBKC,A
RET
;CHƯƠNG TRÌNH CON XUẤT 1 BYTE LÊN MÁY TÍNH
OUTCHAR:
CLR TI
MOV
SBUF,A
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
RET
;CHƯƠNG TRÌNH CON NHẬN 1 BYTE VỀ TỪ MÁY TÍNH
INCHAR:
CLR
MOV
RI
A,SBUF
CLR
C
SUBB
RET
A,#48
;CHƯƠNG TRÌNH CON ĐẢO THỨ TỰ BIT
DAO_BIT:
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 163
MOV
R1,#8
SHIFT:
MOV
A,TAM
RLC
A
MOV
TAM,A
MOV
A,R2
RRC
A
MOV
R2,A
DJNZ
RET
R1,SHIFT
;CHƯƠNG TRÌNH CON DELAY 120us
DELAY120us:
MOV
7FH,#60
DJNZ
7FH,$
RET
;CHƯƠNG TRÌNH CON HIỂN THỊ GIÁ TRỊ CẢM BIẾN KHOẢNG
CÁCH DISPLAY:
PUSH
ACC
MOV
A,R6
ANL A,#0FH
Luận văn tốt nghiệp
MOV
DPTR,#TAB
MOVC
A,@A+DPTR
MOV
P0,A
MOV
P2,#60H
GVHD : Thầy Nguyễn Thiện Thành
NOP
NOP
MOV
P2,#80H
MOV
P1,#08H
LCALL
DELAY
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 164
MOV
A,R6
SWAP
A
ANL
A,#0FH
MOV
DPTR,#TAB
MOVC
A,@A+DPTR
MOV
P0,A
MOV
P2,#60H
NOP
NOP
MOV
P2,#80H
MOV
P1,#04H
LCALL
DELAY
MOV
A,R5
ANL
A,#0FH
MOV
DPTR,#TAB
MOVC
A,@A+DPTR
MOV
P0,A
MOV
P2,#60H
NOP
NOP
MOV
P2,#80H
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
MOV
P1,#02H
LCALL
DELAY
POP
ACC
RET
;CHƯƠNG TRÌNH CON HIỂN THỊ TỐC ĐỘ
VAN_TOC:
PUSH
ACC
MOV
A,INPUT
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 165
MOV
DPTR,#TAB
MOVC
A,@A+DPTR
MOV
P0,A
MOV
P2,#60H
NOP
NOP
MOV
P2,#80H
MOV
P1,#01H
LCALL
DELAY
POP
RET
ACC
;CHƯƠNG TRÌNH CON BIẾN ĐỔI SỐ BINARY THÀNH SỐ BCD
BINARY_BCD:
PUSH
ACC
MOV
B,#10
MOV
A,CBKC
DIV
AB
MOV
R6,B
;R6 CHỨA SỐ
HÀNG ĐƠN VỊ
MOV
B,#10
DIV
AB
MOV
R5,A
;R5 CHỨA SỐ
HÀNG CHỤC
MOV
A,B
Luận văn tốt
nghiệp
SWAP
GVHD : Thầy Nguyễn
Thiện Thành
A
ORL A,R6
MOV R6,A
POP
;R6 CHỨA SỐ HÀNG CHỤC_ĐƠN VỊ
ACC
RET
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 166
;CHƯƠNG TRÌNH CON DELAY 400ms
DELAY:
MOV
TH0,#HIGH(-400)
MOV
TL0,#LOW(-400)
SETB
TR0
JNB
TF0,$
CLR
TF0
CLR
RET
TR0
;BẢNG THAM CHIẾU HIỂN THỊ LED
TAB: DB
0C0H
DB
0F9H
DB
0A4H
DB
0B0H
DB
99H
DB
92H
DB
82H
DB
0F8H
DB
80H
DB
90H
;BẢNG THAM CHIẾU CHO ROBOT CHẠY TỚI_LÙI
TABLE:
DB
00010001B
DB
00110011B
DB
00100010B
Luận văn tốt nghiệp
DB
01100110B
DB
01000100B
DB
11001100B
DB
10001000B
DB
10011001B
GVHD : Thầy Nguyễn Thiện Thành
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 167
;BẢNG THAM CHIẾU CHO ROBOT RẼ TRÁI
LTABLE:
DB
00000001B
DB
00000011B
DB
00000010B
DB
00000110B
DB
00000100B
DB
00001100B
DB
00001000B
DB
00001001B
;BẢNG THAM CHIẾU CHO ROBOT RẼ PHẢI
RTABLE:
DB
DB
00010000B
00110000B
DB
00100000B
DB
01100000B
DB
01000000B
DB
11000000B
DB
10000000B
DB
10010000B
END
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
8.3. Chương trình viết bằng C để huấn luyện cho mạng Neuron :
#include<stdlib.h> #include<conio.h>
#include<graph.h>
#include<float.h>
#include<math.h> #include<stdio.h>
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 168
#define n0 4
#define n1 6
/*input layer */
/*hidden layer */
#define n2 1
/*output layer */
struct videoconfig vc; float uk[11],uk_1,yk1[11],yk,yk_1;
/*define variable used */ float netin0[n0],netin1[n1],netin2[n2];
float bias1[n1],prdlbs1[n1]; float weight1[n1][n0],weight2[n2]
[n1]; float prdlwt1[n1][n0],prdlwt2[n2][n1]; float
actv1[n1],netout; float Icoef,motum,rms; unsigned seed_int,
seed_u; int epochs,h; int eph_pts=500,rcl_pts=100; float
inwtsc=10.0; float xxo,yyo; float
timegrph,ukgrph,yk1grph,netoutgrph; main() {
char ch,ch1;
_setvideomode(_VRES16COLOR); /*VRES16COLOR FOR VGA */
_getvideoconfig(&vc);
xxo=60;
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
yyo=vc.numypixels/2.0;
_setlogorg(xxo,yyo);
printf("\n\nlearn ? (y/n)");
ch=getche();
if(ch=='y')
{
printf("\n\nlearning coeffcient ?");
scanf("%f",&Icoef);
printf("\nmomentum ?");
scanf("%f",&motum);
printf("\nseed_int ?");
scanf("%d",&seed_int);
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 169
printf("\nseed_u ?");
scanf("%d",&seed_u);
printf("\nepochs of training ?");
scanf("%lu",&epochs);
initialise();
learn();
savewt();
getch();
seewt();
}
printf("\nrecall now ?(y/n)");
ch=getche();
{
if (ch=='y')
readwt();
getche();
recall();
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
}
printf("\nexit ?(y/n)\n");
ch1=getche();
if
(ch1='y')
{ _clearscreen(_GCLEARSCREEN);
_setvideomode(_DEFAULTMODE);
}
} initialise()
{
int i,j;
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 170
srand(seed_int); for(j=0;j
+)
{
bias1[j]=(2.0*(float)rand()/RAND_MAX-1.0)/inwtsc;
prdlbs1[j]=0.0;
for(i=0;i
{
weight1[j][i]=(2.0*(float)rand()/RAND_MAX-1.0)/inwtsc;
prdlwt1[j][i]=0.0;
}
}
for(j=0;j
{
for(i=0;i
{
weight2[j][i]=(2.0*(float)rand()/RAND_MAX-1.0)/inwtsc;
prdlwt2[j][i]=0.0;
}
}
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
} comptout()
{
register int i,j;
float
ea,eb;
for(j=0;j
{
netin1[j]=bias1[j];
for(i=0;i
netin1[j]+=weight1[j][i]*netin0[i];
ea=(float)exp((float)netin1[j]);
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 171
eb=(float)exp((float)((-1.0)*netin1[j]));
actv1[j]=(ea-eb)/(ea+eb);
}
for(j=0;j
{
netin2[j]=0.0;
for (i=0;i
netin2[j]+=weight2[j][i]*actv1[i];
netout=netin2[j];
}
}
comptwt()
{ register int i,j; float
error1[n1],error2[n2],sum1[n1]; float
delwt1[n1][n0],delwt2[n2][n1]; float
delbs1[n1]; for(j=0;j
{
Luận văn tốt nghiệp
error2[j]=yk1[h]-netout;
GVHD : Thầy Nguyễn Thiện Thành
for (i=0;i
delwt2[j]
[i]=Icoef*error2[j]*actv1[i]+motum*prdlwt2[j][i];
}
for(j=0;j
{
sum1[j]=0.0;
for(i=0;i
sum1[j]+=error2[i]*weight2[i][j];
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 172
error1[j]=(1.0+actv1[j])*(1.0-actv1[j])*sum1[j];
delbs1[j]=Icoef*error1[j]+ motum * prdlbs1[j];
for (i=0 ;i
delwt1[j][i] = Icoef*error1[j]*netin0[i]+motum*prdlwt1[j][i];
}
for(j=0;j
{
bias1[j]+=delbs1[j];
prdlbs1[j]=delbs1[j];
for
(i=0;i
{
weight1[j][i]+=delwt1[j][i];
prdlwt1[j]
[i]=delwt1[j][i];
}
}
for (j=0;j
{
for (i=0;i
{
weight2[j][i]+=delwt2[j][i];
prdlwt2[j]
[i]=delwt2[j][i];
Luận văn tốt nghiệp
GVHD : Thầy Nguyễn Thiện Thành
}
}
} learn()
/*train net
*/
{ FILE*fptr; register
int k; srand(seed_u);
for (k=0;k
SVTH : Hoàng Trung Hiếu & Nguyễn Trung Dũng trang 173