Điều khiển Máy vẽ bằng 89C51
-
Upload
vo-trong-hieu -
Category
Documents
-
view
59 -
download
4
Transcript of Điều khiển Máy vẽ bằng 89C51
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
TRÖÔØNG ÑAÏI HOÏC BAÙCH KHOA TP.HOÀ CHÍ MINHKHOA ÑIEÄN-ÑIEÄN TÖÛ
BOÄ MOÂN ÑIEÀU KHIEÅN TÖÏ ÑOÄNG
----------------------
LUAÄN VAÊN TOÁT NGHIEÄP
ÑEÀ TAØI:
ÑIEÀU KHIEÅN MAÙY VEÕ BAÈNG VI XÖÛ LYÙ
GVHD : THAÀY HOAØNG MINH TRÍ SVTH : TRAÀN HOAØI NAM MSSV : 49700926
NIEÂN KHOÙA 1997-2002
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
1
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Lôøi caûm ôn :
Em xin chaân thaønh caûm ôn thaày Hoaøng Minh Trí ñaõ taän tình höôùng daãn,giuùp ñôõ vaø ñoäng vieân em trong suoát thôøi gian thöïc hieän baøi luaän vaên toát nghieäp . Em xin chaân thaønh caûm ôn caùc thaày coâ tröôøng ÑHBK ,ñaëc bieät laø caùc thaày coâ Boä moân ÑKTÑ bôûi nhöõng kieán thöùc , nhöõng baøi hoïc boå ích maø thaày coâ ñaõ truyeàn daïy cho em trong 5 maêm hoïc.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
2
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MUÏC LUÏC Trang PHAÀN I : GIÔÙI THIEÄU 1 1/LÔØI GIÔÙI THIEÄU 1 2/SÔ LÖÔÏC VEÀ LUAÄN VAÊN 2 PHAÀN II : CAÙC THIEÁT BÒ ÑOÀ HOÏA 3 1/MOÄT SOÁ THIEÁT BÒ ÑOÀ HOÏA THOÂNG DUÏNG 3 2/GIÔÙI THIEÄU BAØN VEÕ TRONG LUAÄN VAÊN 6 PHAÀN III : ÑOÄC LAÄP THIEÁR BÒ 8 1/ÑOÄC LAÄP THIEÁT BÒ 8 2/ÖÙNG DUÏNG VAØO ÑEÀ TAØI 10 PHAÀN IV : GIÔÙI THIEÄU TAÄP TIN .DXF 11 1/GIÔÙI THIEÄU 11 2/CAÁU TRUÙC FILE .DXF 11 PHAÀN V : GIAÛI THUAÄT VEÕ 19 1/GIAÛI THUAÄT SINH ÑÖÔØNG THAÚNG 19 2/GIAÛI THUAÄT SINH ÑÖÔØNG TROØN 21 3/GIAÛI THUAÄT SINH ÑÖÔØNG SPLINE 25 PHAÀN VI : GIÔÙI THIEÄU VI XÖÛ LYÙ 8951 28 1/GIÔÙI THIEÄU AT89C51 28 2/TAÄP LEÄNH CUÛA AT89C51 32 3/MOÄT SOÁ CHÖÙC NAÊNG TRONG AT89C51 33
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
3
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù PHAÀN VII : COÅNG COM VAØ CAÙC CHUAÅN GIAO TIEÁP 39 1/GIAO TIEÁP VÔÙI MAÙY TÍNH 39 2/CAÙC CHUAÅN TRUYEÀN THOÂNG NOÁI TIEÁP 40 3/CHUAÅN RS-232 41 PHAÀN VIII :ÑOÄNG CÔ BÖÔÙC 44 1/GIÔÙI THIEÄU ÑOÄNG CÔ BÖÔÙC 44 2/MOÄT SOÁ MAÏCH ÑIEÀU KHIEÅN ÑOÄNG CÔ BÖÔÙC 49 3/DOØNG GIÔÙI HAÏN CUÛA ÑOÄNG CÔ BÖÔÙC 51 PHAÀN IX : TOÅNG KEÁT 53 PHAÀN X : PHUÏ LUÏC 54
PHAÀN IGIÔÙI THIEÄU
1/LÔØI GIÔÙI THIEÄU Tröôùc ñaây, ôû caùc maùy caét kim loaïi thoâng thöôøng, vieäc ñieàu khieån caùc chuyeån ñoäng cuõng nhö thay ñoåi vaän toác cuûa caùc boä phaän, maùy ñeàu thöïc hieän baèng tay. Vôùi caùch ñieàu khieån naøy thôøi gian phuï khaù lôùn, neân khoâng theå taêng naêng suaát lao ñoäng cuõng nhö ñaûm baûo ñoä chính xaùc cuûa vaät gia coâng.
Do ñoù ñeå giaûm thôøi gian phuï, ta caàn thieát tieán haønh töï ñoäng hoaù quaù trình ñieàu khieån. Vaø phöông phaùp gia coâng töï ñoäng ra ñôøi vôùi caùc daáu tì, cam treân truïc phaân phoái v.v…nhöng vaãn chöa ñaùp öùng ñöôïc nhu caàu saûn suaát, vì noù ruùt ngaén ñöôïc thôøi gian phuï nhöng thôøi gian chuaån bò saûn suaát
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
4
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù seõ daøi. Nhöôïc ñieåm naøy khoâng ñaùng keå neáu nhö saûn suaát ñöôïc soá löôïng lôùn, nhöng vôùi saûn suaát nhoû, maët haøng phaûi thay ñoåi thöôøng xuyeân, loaïi maùy naøy trôû neân baát tieän vaø khoâng kinh teá. Ñieàu naøy hình thaønh nhu caàu tìm moät phöông phaùp ñieàu khieån môùi, ñaûm baûo ñöôïc thôøi gian hieäu chænh maùy ñeå gia coâng töø loaïi chi tieát naøy sang loaïi chi tieát khaùc nhanh hôn. Vaø phöông phaùp ñieàu khieån theo chöônh trình ra ñôøi ñeå ñaùp öùng yeâu caàu ñoù
Ñieàu khieån theo chöông trình laø moät daïng ñieàu khieån töï ñoäng maø tín hieäu ñieàu khieån (tín hieäu ra) ñöôïc thay ñoåi theo moät qui luaät ñaõ ñöôïc ñònh tröôùc. Noùi caùch khaùc, treân maùy ñieàu khieån theo chöông trình, thöù töï giaù trò cuûa chuyeån ñoäng, cuõng nhö thöù töï cuûa caùc boä phaän maùy, ñoùng môû caùc heä thoáng laøm nguoäi, boâi trôn, thay dao… ñeàu ñöôïc thöïc hieän ñuùng theo moät trình töï ñaõ ñöôïc laäp trình saün. Caùc cô caáu mang chöông trình naøy ñöôïc ñaët vaøo thieát bò ñieàu khieån vaø maùy seõ laøm vieäc töï ñoäng theo chöông trình ñaõ cho.
Neáu caùc chöông trình treân ñöôïc ghi laïi baèng caùc daáu tì, baèng heä thoáng cam, baèng maãu cheùp hình… ta goïi heä thoáng ñieàu khieån ñoù laø heä thoáng ñieàu khieån phi soá. Neáu caùc chöông trình ñöôïc bieåu thò baèng caùc chöõ soá döôùi daïng maõ hieäu, ta goïi ñoù laø heä thoáng ñieàu khieån theo chöông trình soá.
Nhö vaäy ñieàu khieån theo chöông trình soá laø moät quaù trình töï ñoäng cho pheùp ñöa moät cô caáu di ñoäng töø vò trí naøy ñeán vò trí khaùc baèng moät leänh. Söï dòch chuyeån naøy coù theå laø löôïng di ñoäng thaúng hay goùc quay theo caùc baäc töï do.
Trong nhieàu tröôøng hôïp, phöông phaùp ñieàu khieån theo chöông trình soá ñöôïc thieát keá töï ñoäng hoaù vieäc di ñoäng moät cô caáu töø vò trí naøy ñeán vò trí khaùc, ta goïi laø “ñieàu khieån theo ñieåm”. Nhöng ta cuõng thöïc hieän deã daøng khi ruùt ngaén voâ haïn khoaûng caùch giöõa hai ñieåm di ñoäng keá tieáp nhau vaø seõ ñaït ñöôïc moät quaù trình ñieàu khieån quó ñaïo goïi laø “ñieàu khieån theo ñöôøng”.
Phöông phaùp ñieàu khieån chöông trình soá coù theå duøng ñeå di ñoäng baát kì moät cô caáu naøo ñöôïc truyeàn ñoäng baèng cô. Phaïm vi söû duïng cuûa noù raát roäng, nhöng chuû yeáu laø töï ñoäng hoaù maùy coâng cuï, vì lónh vöïc naøy bao goàm vieäc ñieàu khieån dao caét baèng caùc chöõ soá.
Chöông trình ghi baèng caùc chöõ soá ñöôïc thöïc hieän ôû ngoaøi maùy, döôùi daïng baêng xuyeân loã, baêng töø, ñóa töø, film… Caùc chöông trình naøy coù theå caát giöõ vaøo kho, ngaên tuû. Khi caàn söû duïng ta chæ caàn naïp noù vaøo maùy, ñeå maùy coù theå thöïc hieän chöông trình vaø ñieàu khieån caùc chuyeån ñoäng töông ñoái giöõa dao vaø phoâi.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
5
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Vì laøm caùc chöông trình soá coù theå tieán haønh xa maùy vaø maùy coù heä thoáng ño löôøng rieâng, neân heä thoáng naøy coù theå thay ñoåi deã daøng vaø nhanh choùng. Döïa treân phöông phaùp ñieàu khieån vò trí theo chöông trình soá ñaõ neâu, ñeà taøi cuûa luaän vaên naøy laø: ”Ñieàu khieån maùy veõ baèng vi xöû lyù”. Maùy veõ ñöôïc ñeà caäp ôû ñaây laø moät maùy veõ coù khaû naêng veõ lieân tuïc caùc ñöôøng neùt cuûa moät hình cho tröôùc (cuûa AutoCad).
2/ SÔ LÖÔÏC VEÀ LUAÄN VAÊN * Luaän vaên coù nhieäm vuï thieát keá moät maùy veõ coù khaû naêng ñoïc ñöôïc caùc taäp tin (file) .DXF cuûa AutoCad , sau ñoù ñònh daïng laïi file.DXF naøy (coù nghóa laø taïo ra moät file.TXT chöùa caùc thoâng tin veà ñieåm, ñöôøng caàn veõ ). Vieäc ñònh daïng ñöôïc thöïc hieän treân maùy tính (PC) , cuoái cuøng PC seõ truyeàn laàn löôït nhöõng thoâng tin trong file.TXT xuoáng vixöû lyù 8952 ñeà thöïc hieän thao taùc veõ. * Nhöõng coâng vieäc caàn thöïc hieän: - Phaàn cöùng : thieát keá maïch giao tieáp giöõa PC vaø 8952 theo chuaån RS-232. - Phaàn meàm: >Laäp trình cho vieäc ñoïc vaø ñònh daïng file.DXF treân PC (duøng DELPHI). >Laäp trình cho vi xöû lyù 8952 thöïc hieän thao taùc veõ.
3/ÖÙNG DUÏNG CUÛA ÑEÀ TAØI Vôùi caùch ñieàu khieån cuøng moät luùc söï dòch chuyeàn theo 2 truïc X,Y cuûa buùt veõ ñeå di chuyeån noù ñi theo moät ñöôøng xaùc ñònh , ñeà taøi khaúng ñònh ñöôïc söï toái öu vaø khaû thi cuûa vieäc ñieàu khieån vò trí lieân tuïc ñoái vôùi caùc maùy coâng cuï , vaø laø neàn taûng cho vieäc thieát keá maùy khoan , maùy caét… Ñeå coù theå öùng duïng vaøo trong saûn suaát , cuï theå laø trong caét may, ñoøi hoûi chuùng ta phaûi coù nhöõng maïch hoài tieáp veà töø caùc cô caáu chaáp haønh , nhöõng ñoäng cô coù coâng suaát lôùn hôn vôùi ñoä tin caäy cao hôn.
PHAÀN IICAÙC THIEÁT BÒ ÑOÀ HOÏA
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
6
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
1/ MOÄT SOÁ THIEÁT BÒ ÑOÀ HOÏA THOÂNG DUÏNG a/ Thieát bò queùt Raster :
Thieát bò queùt Raster (goïi taét laø Raster) cuõng laø moät loaïi thieát bò theå hieän (maøn hình) chính. Thieát bò Raster theå hieän hình aûnh töø nhöõng ñieåm maøu thay vì ñöôøng. Moãi ñieåm coøn goïi laø pixel.
Giôùi thieäu moät soá thieát bò Raster : -Maøn hình (Monitor):
Maøn hình hieån thò trong heä thoáng ñoà hoïa maùy tính laø caàu noái chính trong vieäc trao ñoåi thoâng tin giöõa ngöôøi söû duïng vaø heä thoáng. Coù nhieàu loaïi coâng ngheä ñöôïc söû duïng ñeå phoái hôïp caùc loaïi maøn hình ñoà hoïa. Ñoä phaân giaûi lieân quan ñeán khaû naêng maøn hình theå hieän caùc chi tieát. Caùc maøn hình ñaït ñeán ñoä phaân giaûi 1280x1024, ôû ñaây caùc con soá theå hieän caùc ñieåm coù theå phaân bieät treân maøn hình.
Sô ñoà phaân loaïi :
Hình: Caùc coâng ngheä söû duïng trong caáu taïo thieát bò hieån thò ñoà hoïa
Caùc kyù töï vaên baûn ñöôïc hình thaønh töø caùc maãu ñieåm. Ñöôøng thaúng vaø cung ñöôïc hình thaønh töø moät daõy caùc ñieåm thích hôïp. Vaø moät vuøng maøn hình coù theå ñöôïc toâ maøu ; ñôn giaûn laø taát caû caùc ñieåm trong vuøng ñöôïc laäp cuøng moät maøu.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
7
Maøn hình
Queùt vector
Queùt doøng
CRT maøu
Maøn hình phaúng
OÁng nhôù
CRT laøm töôi
Ñôn saéc Maøu
Tinh theå loûng
Baûng Plasma Phaùt quang
ñieän töû
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
AÛnh Raster ñöôïc ñaët trong moät vuøng nhôù goïi laø vuøng ñeäm khung (frame buffer). Thuaät ngöõ frame ñeå chæ moät aûnh ñôn. Trong moät vuøng ñeäm khung, vôùi tröôøng hôïp hai caáp thì chæ caàn moät bit cho moät ñieåm, khi giaù trò cuûa bit laø 0, thì ñieåm töông öùng cuûa aûnh coù maøu traéng, coøn neáu laø 1 thì ñieåm töông öùng coù maøu ñen. Vôùi aûnh maøu, ñeå bieåu dieãn moã ñieåm caàn nhieàu bit hôn.
Vuøng ñeäm khung : Vuøng ñeäm khung chieám raát nhieàu boä nhôù: giaû söû kích
thöôùc hình laø r doøng, c coät vaø caàn b bit cho moät ñieåm, thì caàn r*c*b bit. Moät thieát bò Raster chaát löôïng cao coù theå coù r=1024, c=1024, b=24, nhö theá caàn 25 trieäu bit (3MB). Nhö theá vuøng ñeäm naøy naèm ôû ñaäu vaø laøm sao truy caäp ñöôïc chuùng.
Vôùi moät soá heä Raster, vuøng ñeäm khung thöïc söï laø moät phaàn boä nhôù cuûa maùy. Chuùng ñöôïc goïi laø thieát bit-maped : boä xöû lyù coù theå truy xuaát töøng ñieåm, vaø coù moät maïch logic rieâng ñeå laøm töôi maøn hình. Ñeå taïo aûnh öùng duïng seõ ghi maøu (laø giaù trò) tröïc tieáp leân vò trí boä nhôù thích hôïp. Taïi caáp thaáp nhaát, seõ coù nhöõng chæ thò maùy laøm vieäc naøy. Tuy nhieân ñeå tieän lôïi ngöôøi ta taïo thuû tuïc SetPixel(row,col,A) ñeå naïp giaù trò A cho ñieåm taïi (row,col). -Maùy in kim: Cô caáu in cuûa maùy in ma traän ñieåm laø taäp hôïp töø 7 ñeán 24 caây kim cöùng saép xeáp treân ñaàu in, di chuyeån theo phöông naèm ngang treân maët tôø giaáy. Caùc maùy in naøy laøm vieäc nhö thieát bò queùt doøng vaø caàn coù söï chuyeån ñoåi cho caùc hình aûnh daïng queùt vector. Vieäc in maøu thöïc hieän nhôø söû duïng ruyban maøu. Caùc maøu boå sung ñöôïc taïo ra baèng caùch goõ hai vuøng ñeäm treân ruyban leân cuøng moät ñieåm treân giaáy. -Maùy in, veõ phun: Cuõng laø thieát bò queùt doøng (raster scan), noù laø thieát bò in maøu reû tieàn. Cô caáu cuûa noù goàm caùc ñaàu voøi möïc gaén ôû ñaàu in, di chuyeån treân beà maét tôø giaáy vaø phun möïc vôùi maøu saéc khaùc nhau. Caùc voøi phun ñöôïc gaén vôùi caùc hoác möïc baèng caùc raõnh raát nhoû bao boïc bôûi caùc tinh theå aùp ñieän. Moät xung ñieän ñaët vaøo tinh theå seõ taïo ra moät caùi giaät nheï, laøm baén ra moät gioït möïc. Ñoä phaân giaûi cuûa maùy in naøy ñöôïc quy ñònh bôûi kích thöôùc gioït möïc, hay laø kích thöôùc voøi phun taïo ra noù. Voøi phun thöôøng raát nhoû neân khi in thöôøng gaëp moät soá vaán ñeà phöùc taïp. -Maùy in laser: Laø thieát bò queùt doøng (raster scan), trong ñoù chuøm tia lazer queùt leân moät caùi troáng quay ñöôïc tích ñieän döông, phuû baèng moät lôùp selen. Phaàn maët troáng bò chieáu bôûi chuøm tia
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
8
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù lazer seõ bò maát ñieän tích döông. Nhöõng phaàn tích ñieän coøn laïi töông öùng vôùi nhöõng phaàn ñen treân giaáy. Moät lôùp boät tónh ñieän phuû leân caùc phaàn tích ñieän döông vaø ñöôïc truyeàn sang giaáy. Moät boä vi xöû lyù treân maùy in lazer seõ thöïc hieän chuyeån ñoåi sang daïng queùt doøng. -Maùy in tónh ñieän: Laø thieát bò naïp ñieän tích aâm cho caùc phaàn cuûa loaïi giaáy ñöôïc cheá taïo ñaëc bieät, sau ñoù laøm coâ ñaëc boät tónh ñieän daïng loûng, tích ñieän döông leân tôø giaáy. Boät tónh ñieän seõ phuû leân vaø laøm toái phaàn giaáy tích ñieän aâm. Ñaây laø thieát bò daïng queùt doøng, chöùa boä xöû lyù ñeå thöïc hieän vieäc chuyeån ñoåi.
b/ Thieát bò veõ ñöôøng :Coù hai daïng thöôøng gaëp nhaát cuûa maùy veõ laø daïng
phaúng vaø daïng troáng. -Maùy veõ daïng phaúng: Maùy veõ daïng phaúng truy caäp ñeán caùc vò trí xy treân maët phaúng baèng caùch chuyeån ñoäng caàn veõ gaén treân baøn veõ. Treân caàn veõ coù gaén moät caây vieát veõ coù theå chuyeån ñoäng doïc theo truïc x vaø truïc y. Caây vieát coù theå haï xuoáng hay nhaác leân, tuøy theo vieäc ñöôøng neùt hay thay ñoåi vò trí caây vieát. Tôø giaáy ñöôïc giöõ treân baøn veõ baèng tónh ñieän hoaëc chaân khoâng. -Maùy veõ daïng troáng: Maùy veõ daïng troáng coù moät vaøi ñieåm phöùc taïp hôn daïng phaúng, maëc duø caùc cheá ñoä hoaït ñoäng cô baûn laø töông töï nhau. Trong maùy veõ daïng troáng, tôø giaáy ñöôïc cuoán leân troáng veõ sao cho khoâng coù söï tröôït. Troáng seõ quay tôùi, quay lui, trong khi ñaàu veõ tröôït treân moät caàn veõ coá ñònh, truy caäp ñeán caùc ñieåm treân tôø giaáy.
Nhaän xeùt :Caùc thieát bò veõ ñöôøng (Line Drawing) chæ coù theå veõ
ñöôøng. Thoâng duïng nhaát laø buùt veõ Plotter. Khi plotter veõ ñöôøng, tröôùc heát buùt ñöôïc di chuyeån ñeán ñieåm ñaàu, ñaët buùt xuoáng, sau ñoù buùt di chuyeån theo ñöôøng thaúng tôùi ñaàu kia cuûa ñöôøng.
Caùc thieát bò veõ ñöôøng coù heä toïa ñoä ñònh saün cho buùt veõ, nhö trong hình döôùi ñaây :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
9x
y
(1023,767)
(0,0
Pen
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Buùt veõ ñöôïc chæ ñeán moät ñieåm cuï theå baèng caùch göûi cho Plotter toïa ñoä cuûa ñieåm. Thieát bò veõ ñöôøng coù saün moät soá thuû tuïc cô baûn, ví duï moät soá leänh cho buùt veõ nhö :
Pen_Up : nhaác buùt Pen_Down : ñaët buùt Go_To (x,y) : di chuyeån buùt ñeán ñieåm (x,y) Get_Pen (i) : ñoåi buùt hieän taïi thaønh buùt thöù i.Nhöõng leänh treân goïi laø leänh thieát laäp cheá ñoä (mode setting). Khi thieát bò nhaän ñöôïc leänh chuùng seõ thay ñoåi “traïng thaùi” maùy cho ñeán khi coù leänh thieát laäp cheá ñoä khaùc.Thieát bò phaûi ñöôïc göûi giaù trò (x,y) theo heä toïa ñoä cuûa noù, goïi laø toïa ñoä thieát bò.
2/ GIÔÙI THIEÄU BAØN VEÕ TRONG LUAÄN VAÊN
Maùy veõ ñöôïc thieát keá trong luaän vaên naøy laø maùy veõ ñöôïc ñieàu khieån theo chöông trình soá.
Phaàn chính cuûa maùy veõ goàm hai truïc X,Y ñeå ñieàu khieån vò trí qua laïi cuûa buùt veõ trong maët phaúng baûn veõ vaø truïc Z gaén tröïc tieáp vôùi buùt veõ ñeå ñieàu khieån nhaác buùt leân hay haï buùt xuoáng.
Moãi truïc X,Y ñöôïc caáu taïo goàm moät ñoäng cô böôùc coù truïc quay gaén lieàn vôùi moät vitme . Vitme laø moät truïc coù raêng xoaén, ñöôïc maøi kyõ. Neáu ta gaén moät vaät leân raêng xoaén cuûa vitme thì khi ñoäng cô quay, vitme seõ chuyeån chuyeån ñoäng quay thaønh chuyeån ñoäng tröôït cuûa vaät treân raêng xoaén. Tuøy theo chieàu quay cuûa ñoäng cô laø thuaän hay nghòch maø vaät seõ chuyeån ñoäng tôùi hay lui treân raêng xoaén.
Truïc X ñöôïc ñaët leân vitme cuûa truïc Y, coøn truïc Z laïi ñöôïc ñaët leân vitme cuûa truïc X. Keát quaû laø khi chæ quay moät ñoäng cô thì buùt veõ chæ di chuyeån theo moät truïc, coøn khi quay ñoàng thôøi hai ñoäng cô thì buùt veõ seõ di chuyeån theo hai truïc, vaø vieäc naøy daãn ñeán vieäc ta coù theå veõ ñöôïc caùc ñöôøng xieân vaø laø tieàn ñeà cho vieäc veõ caùc ñöôøng cong.
Truïc Z ñôn giaûn chæ laø moät nam chaâm ñieän coù truïc gaén vôùi buùt veõ duøng ñeå ñieàu khieån vò trí nhaác leân hay haï xuoáng cuûa noù. Khi coù doøng ñieän ñi qua nam chaâm, buùt seõ ñöôïc nhaác leân. Ngoaøi ra coøn moät soá coâng taéc haønh trình ñeå vieäc ñieàu khieån ñöôïc chính xaùc vaø deã daøng.
Tìm hieåu hai ñoäng cô böôùc cuûa hai truïc X,Y :Hai ñoäng cô böôùc trong moâ hình ñöôïc thieát keá nhö sau :- Ñoäng cô truïc X :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
10
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
o Quay thuaän : ñöa buùt veõ qua phaûi chieàu taêng x.
o Quay nghòch : ñöa buùt veõ qua traùi chieàu giaûm x.
- Ñoäng cô truïc Y :o Quay thuaän : ñöa buùt veõ leân treân chieàu taêng
y.o Quay nghòch : ñöa buùt veõ xuoáng döôùi chieàu
giaûm y.Truïc ñoäng cô gaén vôùi vitme coù ñoä phaân giaûi laø 0.1mm
öùng vôùi moät böôùc quay cuûa motor. Nghóa laø khi ñoäng cô quay moät böôùc thì vitme xoay laøm di chuyeån vaät gaén treân noù 0.1mm. Vôùi ñoä phaân giaûi naøy, ta coù theå veõ ñöôïc caùc ñöôøng neùt khaù mòn ñoøi hoûi ñoä phaân giaûi cao.
Khi vaän haønh, ñaàu chung cuûa caùc ñoäng cô noái leân nguoàn DC 5V, caùc ñaàu coøn laïi noái xuoáng mass hay khoâng laø do caùc bit ñieàu khieån.
……Giôùi thieäu ñoäng cô böôùc…..Ñoäng cô ñöôïc duøng trong moâ hình naøy laø loaïi
ñoäng cô böôùc nam chaâm vónh cöûu ñôn cöïc 6 ñaàu daây, ñieän aùp laøm vieäc 1.8VDC vaø goùc böôùc laø 1.8 ñoä.
Truïc Z vaø caùc coâng taéc haønh trình cuûa moâ hình :Truïc Z : Duøng nam chaâm ñieän 24VDC ñeå ñieàu khieån nhaác buùt hay haï buùt. Nam chaâm naøy caáu taïo chính goàm moät cuoän daây quaán quanh loõi saét coù theå di chuyeån töï do ôû giöõa. Khi coù doøng ñieän qua cuoän daây seõ taïo ra moät löïc töø huùt loõi saét leân treân. Döïa vaøo tính chaát naøy ta gaén buùt veõ vaøo loõi saét cuûa nam chaâm ñeå ñieàu khieån vò trí nhaác leân hay haï xuoáng cuûa buùt veõ.Khi vaän haønh, moät ñaàu daây cuûa nam chaâm luoân noái vôùi nguoàn 24VDC, ñaàu coøn laïi ñöôïc noái vôùi mass hay khoâng laø do 1 khoùa BJT.Ñeå giöõ coá ñònh buùt veõ khi di chuyeån hay ñang veõ, ñoàng thôøi ñeå xaùc ñònh traïng thaùi nhaác leân hay haï xuoáng cuûa buùt veõ, ngöôøi ta duøng moät coâng taéc haønh trình gaén lieàn vôùi truïc taùc ñoäng cuûa nam chaâm. Coâng taéc naøy moät ñaàu noái xuoáng mass, ñaàu kia noái vôùi moät bit ñieàu khieån (bit naøy bình thöôøng ñöôïc treo leân 5V). Khi buùt veõ nhaác leân thì bit naøy = 0 vaø ngöôïc laïi, khi khoâng nhaác thì bit = 1.Khi muoán nhaác buùt leân ta taùc ñoäng vaøo khoùa BJT doøng ñieän ñi qua cuoän daây buùt ñöôïc nhaác leân. Khi muoán haï buùt xuoáng coâng vieäc cuõng töông töï nhö treân. Chuù yù : phaûi ñoïc coâng taéc haønh trình cuûa buùt tröôùc khi taùc ñoäng vaøo BJT vaø
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
11
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù phaûi ngöng kích ngay khi buùt ñaõ ñoåi traïng thaùi vì neáu taùc ñoäng laâu seõ daãn ñeán cuoän daây nam chaâm bò chaùy (nam chaâm DC laøm vieäc ngaén haïn).Caùc coâng taéc haønh trình :Treân moâ hình coù 4 coâng taéc haønh trình (2 treân truïc X, 2 treân truïc Y) ñeå xaùc ñònh ñaàu truïc hay cuoái truïc töông öùng.Caùc coâng taéc naøy moät ñaàu ñöôïc noái xuoáng mass, ñaàu coøn laïi noái veà caùc bit ñieàu khieån.
Hình :Baøn veõ.
PHAÀN IIIÑOÄC LAÄP THIEÁT BÒ
1/ÑOÄC LAÄP THIEÁT BÒ * Chuùng ta ñaõ gaëp nhieàu daïng “leänh thieát bò” tuøy theo thieát bò. Caùc thieát bò veõ ñöôøng nhö Plotter thì coù caùc thuû tuïc Pen_Up, Pen_Down, Go_To (x,y). Thieát bò Raster thì coù caù thuû tuïc SetPixel, Line. Trong moïi tröôøng hôïp ta phaûi göûi ñi toïa ñoä thieát bò, vaø moãi thieát bò coùù rieâng heä toïa ñoä ñònh saün.
Ñieàu ñoù gaây ra hai vaán ñeà :- Khoù ñeå tìm hieåu caùc yù töôûng vaø phöông phaùp cô
baûn maø khoâng bieát chi tieát veà thieát bò.- Khoù thay ñoåi moät öùng duïng vieát cho thieát bò naøy
sang thieát bò khaùc.Nhö vaäy caàn phaûi “che giaáu” chi tieát veà thieát bò trong caùc thuû tuïc “ñieàu khieån” ñeå coù ñöôïc daïng giao tieáp thoáng nhaát cho öùng duïng.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
12
Ñoäng cô böôùc
Nam chaâm ñieän
Truïc ZCoâng taéc
haønh trình
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Ví duï : Chuùng ta caàn moät thuû tuïc nhö Draw_Line(x1,y1,x2,y2:real) ñeå veõ ñöôøng thaúng töø ñieåm (x1,y1) ñeán ñieåm (x2,y2).Beân trong laø nhöõng leänh coù theå phuï thuoäc toïa ñoä thieát bò, nhöng chöông trình öùng duïng khoâng caàn bieát chi tieát naøy. Vì vaäy noù ñöôïc xem nhö thuû tuïc ñoäc laäp thieát bò.
* Xuaát phaùt töø nhu caàu “Neáu ta duøng thieát bò ñoà hoïa khaùc, maø khoâng phaûi vieát laïi chöông trình ñieàu khieån hoaëc ngay caû khoâng caàn bieân dòch laïi, maø chæ caàn noái keát chöông trình ñieàu khieån thieát bò môùi”. Ñoäc laäp thieát bò seõ giuùp baïn laøm ñöôïc ñieàu aáy
Ñeå ñaûm baûo tính linh ñoäng, caùc tieâu chuaån ñoà hoïa ñaõ thieát laäp cho chöông trình öùng duïng caùc thay ñoåi toái thieåu, cho pheùp noù ñònh ñòa chæ caùc thieát bò nhaäp khaùc nhau. Khôûi ñaàu, ngöôøi laäp trình taïo ra moät heä thoáng toïa ñoä moâ hình, trong ñoù moâ taû moät ñoái töôïng goïi laø Heä toïa ñoä thöïc (World Coordinate_WC). Tieáp theo, ngöôøi laäp trình seõ moâ taû moät Heä thoáng toïa ñoä thieát bò chuaån (Normalized Device Coordinate_NDC), baèng caùch xaùc ñònh caùc vuøng hai chieàu cuûa beà maët quan saùt maø treân ñoù hình aûnh seõ xuaát hieän. Sau ñoù caùc toïa ñoä thieát bò chuaån seõ chuyeån sang toïa ñoä thieát bò (Device Coordinate).
Chöông trình öùng duïng seõ giao tieáp vôùi heä thoáng toïa ñoä chuaån theo caùch thöùc phuø hôïp, khoâng quan taâm ñeán thieát bò xuaát ñöôïc söû duïng. Do ñoù taïo ra ñöôïc söï ñoäc laäp thieát bò trong vieäc taïo aûnh cuûa ñoái töôïng. *Toïa ñoä thieát bò chuaån hoùa (NDC – Normalized Device Coordinate) :
KGS (Graphic Kernel System – moät heä chuaån quoác teá) ñònh nghóa toïa ñoä thieát bò ñöôïc chuaån hoùa (NDC) laø vuøng hình vuoâng vôùi goùc thaáp traùi laø (0,0) vaø goùc cao phaûi laø (1,1), nhö trong hình döôùi ñaây :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
13
Heä thoáng toïa ñoä thöïc
(WC)
Heä thoáng toïa ñoä
chuaån (NDC)
Heä thoáng toïa ñoä thieát
bò (DC)
Thieát bò vaät
lyù
Display
x
y
1
1
x1
y1
(x2,y2)
(x1,y1)
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Khoâng gian NDC laø heä toïa ñoä chuaån cho moïi thieát bò, vaø moät leänh nhö Draw_Line() seõ töï môû roäng khuoân naøy ñeå vöøa khôùp vôùi khuoân cuûa thieát bò. *AÙnh xaï NDC leân thieát bò :
Moãi laàn xuaát thuû tuïc LineNDC_() leân thieát bò phaûi aùnh xaï hình vuoâng ñôn vò cuûa hình vuoâng lôùn nhaát teân thieát bò goïi laø hình vuoâng thieát bò. Nghóa laø, cho ñieåm baát kyø P(x,y) trong NDC ta caàn tính toïa ñoä thieát bò töông öùng Q(dx,dy) trong hình vuoâng thieát bò, nhö trong hình döôùi ñaây :
Pheùp aùnh xaï naøy phaûi tæ leä. Vì vaäy dx phaûi aùnh xaï tuyeán tính theo x, sao cho :
dx=Ax+Bvaø dy=Cy+D
vôùi A,B,C,D laø haèng soá.
2/ÖÙNG DUÏNG VAØO ÑEÀ TAØI: - Sau ñaây laø ñoaïn chöông trình minh hoïa vieäc chuyeån ñoåi toïa ñoä cuûa caùc ñieåm , ñöôøng töø heä toïa ñoä trong AutoCad sang heä toïa ñoä trong PC vaø heä toïa ñoä baøn veõ. - Khai baùo bieán: p.x ; p.y :toïa ñoä trong AutoCad (Kích thöôùc baûn veõ laø Page_Width * Page_Height ) PC_p.x ; PC_p.y :toïa ñoä trong PC (Baøn veõ trong PC laø phaàn töû Image.canvas coù kích thöôùc 350*350). Mv_p.x ; Mv_p.y :toïa ñoä trong baøn veõ (Baøn veõ cuûa maùy veõ coù kích thöôùc 420*297). - Procedure Chuyen_doi_toa_do ();
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
14
1
1
x
y P
dx
dy
Q
NDCLargest Square
Device Coordinate
space
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Begin If (Page_Width div 350) > (Page_Height div 350) then Scale:=Round(Page_Width div 350)+1 else Scale:=Round(Page_Height div 350)+1; PC_p.x:=350 div 2 + p.x div Scale; PC_p.y:=350 div 2 –p.y div Scale ; Mv_p.x:=p.x*10; /* Moãi böôùc cuûa ñoäng cô buùt di chuyeån ñöôïc 0.1mm*/ Mv_p.y:=p.y*10; End.
PHAÀN IVGIÔÙI THIEÄU TAÄP TIN .DXF 1/GIÔÙI THIEÄU Ngoaøi Autocad coøn coù raát nhieàu phaàn meàm maùy tính phuïc vuï cho caùc muïc tieâu khaùc nhau vaø coù nhöõng theá maïnh khaùc nhau. Do ñoù, theá naøo cuõng coù luùc naûy sinh nhu caàu söû duïng baûn veõ ACAD trong nhöõng phaàn meàm khaùc, ñaëc bieät laø caùc phaàn meàm ñoà hoïa.
Neáu caùc phaàn meàm maùy tính khaùc cuõng ñoïc ñöôïc taäp tin .DWG nhö AUTOCAD thì khoâng coù vaán ñeà gì. Tuy nhieân, caáu
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
15
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù truùc tinh vi cuûa taäp tin Autocad .DWG ñöôïc haõng Autodesk giöõ kín, nhaèm taïo cho Autocad öu theá ñoäc quyeàn khai thaùc baûn veõ do chính mình taïo ra.
Nhöng ñeå taïo tính töông thích cuûa Autocad treân thò tröôøng ñoà hoïa, Autodesk ñaõ thöïc hieän chính saùch “môû cöûa” baèng caùch trang bò cho Autocad khaû naêng keát xuaát baûn veõ cuûa mình thaønh caùc daïng thöùc taäp tin thoâng duïng cuõng nhö ñeà ra moät daïng thöùc taäp tin baûn veõ ñôn giaûn hôn goïi laø DXF (Drawing data eXchange Format) vaø cho coâng boá roäng raõi caáu truùc cuûa noù.
Ta coù theå tìm thaáy nhieàu phaàn meàm lôùn nhoû khaùc nhau coù khaû naêng ñoïc vaø ghi taäp tin baûn veõ ôû daïng thöùc DXF. Quy caùch ghi baûn veõ ôû daïng thöùc DXF do haõng Autodesk ñeà ra vaø ñöôïc phoå bieán roäng raõi.
Do öu theá cuûa Autocad treân thò tröôøng caùc phaàn meàm thieát keá, DXF hieän ñaõ trôû thaønh moät tieâu chuaån coâng nghieäp. 2/CAÁU TRUÙC FILE DXF :
Taäp tin .DXF laø moät taäp tin vaên baûn ASCII bình thöôøng trong ñoù moâ taû caùc quy ñònh cuûa baûn veõ vaø moâ taû töøng ñoái töôïng. Noùi nhö vaäy coù nghóa laø baïn coù theå duøng nhöõng chöông trình soaïn thaûo vaên baûn ñeå môû taäp tin .DXF vaø söûa chöõa noäi dung cuûa noù. Caùch thöùc ghi thoâng tin nhö vaäy thöôøng lôùn, do ñoù Autocad coøn cho pheùp baïn ghi taäp tin .DXF theo moät daïng goïn hôn, khoâng thoâng qua maõ ASCII ñeå moâ taû baûn veõ. Ñoù laø tröôøng hôïp cuûa taäp tin .DXF daïng nhò phaân (Binary DXF). Trong ñeà taøi naøy chæ quan taâm ñeán DXF ASCII.
Veà baûn chaát file DXF goàm nhöõng boä maõ vaø giaù trò töông öùng. Nhöõng ñoaïn maõ, ñöôïc hieåu nhö nhöõng nhoùm maõ cho bieát daïng cuûa giaù trò theo sau. Söû duïng nhöõng nhoùm maõ vaø giaù trò, moät file DXF ñöôïc chia thaønh nhieàu phaàn, bao goàm nhieàu baûng döõ lieäu, moãi baûng döõ lieäu bao goàm moät nhoùm maõ vaø döõ lieäu töông öùng. Maõ vaø giaù trò töông öùng naèm treân cuøng doøng trong file DXF.
Moãi phaàn baét ñaàu baèng moät nhoùm maõ 0 theo sau bôûi chuoãi SECTION. Moãi phaàn bao goàm nhieàu nhoùm maõ vaø giaù trò ñònh nghóa nhöõng phaàn töû cuûa noù. Phaàn cuoái cuûa moät phaân ñoaïn vôùi kyù töï 0 vaø theo sau bôûi chuoãi ENDSEC.
Toaøn theå caáu taïo cuûa moät file DXF coù daïng nhö sau :Phaàn Header :
Thoâng thöôøng thoâng tin veà baûn veõ ñöôïc tìm trong phaàn naøy. Noù goàm coù moät baûng döõ lieäu veà soá cuûa phieân baûn Autocad vaø soá löôïng bieán heä thoáng. Moãi thoâng soá chöùa moät teân bieán vaø giaù trò töông öùng cuûa noù.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
16
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Phaàn CLASSES :
Giöõ nhöõng thoâng tin cho trình öùng duïng – xaùc ñònh ñaëc ñieåm classes, nhöõng tröôøng hôïp ñaëc bieät trong BLOCKS, ENTITIES, vaø döõ lieäu cuûa muïc OBJECTS.Phaàn TABLES :
Phaàn naøy chöùa nhöõng ñònh nghóa cuûa nhöõng kyù hieäu sau ñaây :
APPID (Application Identification Table)BLOCK_RECORD (Block Reference Table)DIMSTYLE (Dimension Style Table)LAYER (Layer Table)LTYPE (Linetype Table)STYLE (Text Style Table)UCS (User Coordinate System Table)VIEW (View Table)VPORT (Viewport Configuration Table)
Phaàn BLOCKS :Chöùa ñònh nghóa cuûa khoái vaø baûn veõ maø goäp thaønh
moãi khoái tham chieáu trong baûn veõ.Phaàn ENTITIES :
Phaàn chöùa nhöõng ñoái töôïng ñoà hoïa trong baûn veõ, bao goàm nhöõng khoái tham chieáu (thöïc theå cheøn vaøo).Phaàn OBJECTS :
Chöùa nhöõng ñoái töôïng khoâng ñoà hoïa trong baûn veõ.ENTITIES Section :
Phaàn naøy trình baøy caùc nhoùm maõ taäp trung vaøo ñoái töôïng ñoà hoïa. Caùc maõ naøy xuaát hieän trong phaàn ENTITIES cuûa moät file DXF vaø ñöôïc söû duïng bôûi caùc öùng duïng AutoLisp vaø ARX trong caùc danh saùch ñònh nghóa thöïc theå.
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng ARC : Nhoùm maõ Arc :
Group codes
Description
100 Subclass marker (AcDbCircle)
39 Thickness (optional; default = 0)
10 Center point (in OCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in OCS)
40 Radius
100 Subclass marker (AcDbArc)
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
17
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
50 Start angle
51 End angle
210Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng CIRCLE : Nhoùm maõ Circle :
Group codes
Description
100 Subclass marker (AcDbCircle)
39 Thickness (optional; default = 0)
10 Center point (in OCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in OCS)
40 Radius
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng ELLIPSE : Nhoùm maõ Ellipse :
Group codes
Description
100 Subclass marker (AcDbEllipse)
10 Center point (in WCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of center point (in WCS)
11 Endpoint of major axis, relative to the center (in WCS).DXF: X value; APP: 3D point.
21, 31 DXF: Y and Z values of endpoint of major axis, relative to the center (in WCS)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
18
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
40 Ratio of minor axis to major axis
41 Start parameter (this value is 0.0 for a full ellipse)
42 End parameter (this value is 2pi for a full ellipse)
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng LINE : Nhoùm maõ Line :
Group codes
Description
100 Subclass marker (AcDbLine)
39 Thickness (optional; default = 0)
10 Start point (in WCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of start point (in WCS)
11 End point (in WCS). DXF: X value; APP: 3D point
21, 31 DXF: Y and Z values of end point (in WCS)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng POINT : Nhoùm maõ Point :
Group codes Description
100 Subclass marker (AcDbPoint)
10 Point location (in WCS). DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of point location (in WCS)
39 Thickness (optional; default = 0)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
50 Angle of the X axis for the UCS in effect when the point was drawn (optional, default = 0); used when PDMODE is nonzero
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
19
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng POLYLINE : Nhoùm maõ Polyline :
Group codes Description
100 Subclass marker (AcDb2dPolyline or AcDb3dPolyline)
10 DXF: always 0APP: a "dummy" point; the X and Y values are always 0, and the Z value is the polyline's elevation (in OCS when 2D, WCS when 3D)
20 DXF: always 0
30 DXF: polyline's elevation (in OCS when 2D, WCS when 3D)
39 Thickness (optional; default = 0)
70 Polyline flag (bit-coded); default is 0:1 = This is a closed polyline (or a polygon mesh closed in the M direction).2 = Curve-fit vertices have been added.4 = Spline-fit vertices have been added.8 = This is a 3D polyline.16 = This is a 3D polygon mesh.32 = The polygon mesh is closed in the N direction.64 = The polyline is a polyface mesh.128 = The linetype pattern is generated continuously around the vertices of this polyline.
40 Default starting width (optional; default = 0)
41 Default ending width (optional; default = 0)
71 Polygon mesh M vertex count (optional; default = 0)
72 Polygon mesh N vertex count (optional; default = 0)
73 Smooth surface M density (optional; default = 0)
74 Smooth surface N density (optional; default = 0)
75 Curves and smooth surface type (optional; default = 0); integer codes, not bit-coded:0 = No smooth surface fitted5 = Quadratic B-spline surface6 = Cubic B-spline surface8 = Bezier surface
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng SPLINE :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
20
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Nhoùm maõ Spline :
Group codes
Description
100 Subclass marker (AcDbSpline)
210 Normal vector (omitted if the spline is nonplanar)DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of normal vector
70 Spline flag (bit coded):1 = Closed spline2 = Periodic spline4 = Rational spline8 = Planar16 = Linear (planar bit is also set)
71 Degree of the spline curve
72 Number of knots
73 Number of control points
74 Number of fit points (if any)
42 Knot tolerance (default = 0.0000001)
43 Control-point tolerance (default = 0.0000001)
44 Fit tolerance (default = 0.0000000001)
12 Start tangent--may be omitted (in WCS).DXF: X value; APP: 3D point.
22, 32 DXF: Y and Z values of start tangent—may be omitted (in WCS).
13 End tangent--may be omitted (in WCS).DXF: X value; APP: 3D point.
23, 33 DXF: Y and Z values of end tangent—may be omitted (in WCS)
40 Knot value (one entry per knot)
41 Weight (if not 1); with multiple group pairs, are present if all are not 1
10 Control points (in WCS) one entry per control point.DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of control points (in WCS) (one entry per control point)
11 Fit points (in WCS) one entry per fit point.DXF: X value; APP: 3D point
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
21
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
21, 31 DXF: Y and Z values of fit points (in WCS) (one entry per fit point)
Nhoùm maõ sau öùng duïng cho caùc ñoái töôïng TEXT : Nhoùm maõ Text :
Group codes Description
100 Subclass marker (AcDbText)
39 Thickness (optional; default = 0)
10 First alignment point (in OCS) DXF: X value; APP: 3D point
20, 30 DXF: Y and Z values of first alignment point (in OCS)
40 Text height
1 Default value (the string itself)
50 Text rotation (optional; default = 0)
41 Relative X scale factor—width (optional; default = 1).This value is also adjusted when fit-type text is used.
51 Oblique angle (optional; default = 0)
7 Text style name (optional, default = STANDARD)
71 Text generation flags (optional, default = 0):2 = Text is backward (mirrored in X),4 = Text is upside down (mirrored in Y)
72 Horizontal text justification type (optional, default = 0) integer codes (not bit-coded)0 = Left;1= Center; 2 = Right3 = Aligned (if vertical alignment = 0)4 = Middle (if vertical alignment = 0)5 = Fit (if vertical alignment = 0)See the following table for clarification
11 Second alignment point (in OCS). DXF: X value; APP: 3D point.This value is meaningful only if the value of a 72 or 73 group is nonzero (if the justification is anything other than baseline/left)
21, 31 DXF: Y and Z values of second alignment point (in OCS)
210 Extrusion direction. (optional; default = 0, 0, 1). DXF: X value; APP: 3D vector
220, 230 DXF: Y and Z values of extrusion direction
100 Subclass marker (AcDbText)
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
22
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
73 Vertical text justification type (optional, default = 0): integer codes (not bit- coded)0 = Baseline; 1 = Bottom; 2 = Middle; 3 = TopSee the following table for clarification.
Döôùi ñaây laø 1 ñoaïn nhoû cuûa 1file .DXF vôùi caùc thoâng tin veà 1ñoaïn thaúng (LINE) ñi töø (X0,Y0,Z0) ñeán (X1,Y1,Z1) : AcDbLine /* Baét ñaàu ñoaïn LINE*/ 10 /* Detect toïa ñoä X0*/0.0 /* X0=0*/ 20 /* Detect toïa ñoä Y0*/0.0 /*Y0=0*/ 30 /* Detect toïa ñoä Z0*/0.0 /*Z0=0*/ 11 /* Detect toïa ñoä X1*/100.0 /*X1=100*/ 21 /* Detect toïa ñoä Y1*/50.0 /* Y1=50*/ 31 /* Detect toïa ñoä X1*/0.0 /*Z1=0*/ 0
PHAÀN VGIAÛI THUAÄT VEÕ 1/GIAÛI THUAÄT SINH ÑÖÔØNG THAÚNG
a/ Nguyeân lyù chung :Treân maët phaúng baát kyø, moät ñieåm ñöôïc xaùc ñònh bôûi
caëp 2 giaù trò toïa ñoä : moät theo truïc x vaø moät theo truïc y
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
23
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
moâ taû khoaûng caùch töø ñieåm ñoù ñeán caùc truïc. Ñieåm seõ naèm treân ñöôøng thaúng khi giaù trò toïa ñoä ñieåm thoûa maõn phöông trình bieåu dieãn ñöôøng thaúng ñoù. Vieäc bieåu dieãn ñöôøng thaúng coù raát nhieàu phöông phaùp khaùc nhau.
Neáu 2 ñieåm vôùi toïa ñoä (x1,y1) vaø (x2,y2) ñöôïc söû duïng ñeå xaùc ñònh neân moät ñöôøng thaúng thì phöông trình cuûa ñöôøng thaúng qua hai ñieåm ñöôïc vieát laïi nhö sau :
Töø phöông trình naøy chuùng ta coù theå xaây döïng quaù trình veõ caùc ñöôøng thaúng khi cho x bieán thieân theo caùc khoaûng x vaø keát quaû ta coù theå thu ñöôïc giaù trò cuûa bieán y thay ñoåi vôùi caùc khoaûng y töông öùng (y=kx).
Do caùc ñöôøng thaúng ñöôïc moâ taû trong heä toïa ñoä thöïc khi hieån thò trong maùy tính, heä toïa ñoä chính laø löôùi nguyeân neân baûn chaát cuûa quaù trình veõ caùc ñöôøng thaúng chính laø söï nguyeân hoùa caùc toïa ñoä caùc ñieåm thuoäc ñöôøng thaúng vaø veõ caùc pixel töông öùng.
Nguyeân lyù chung laø cho moät thaønh phaàn toïa ñoä x hay y bieán ñoåi theo töøng ñôn vò vaø tính toïa ñoä nguyeân coøn laïi sao cho gaàn vôùi toïa ñoä thöïc nhaát. Vieäc quyeát ñònh choïn x hay y bieán ñoåi phuï thuoäc vaøo ñoä roäng cuûa ñöôøng thaúng.
b/ Giaûi thuaät trung ñieåm sinh ñöôøng thaúng (MidPoint) :
Giaûi thuaät ñieåm giöõa (Midpoint) ñöôïc Pitteway ñöa ra nhöõng naêm 1967 vaø ñöôïc VanAken aùp duïng cho vieäc sinh caùc ñöôøng thaúng vaø ñöôøng troøn naêm 1985 cho ra caùc coâng thöùc ñôn giaûn vaø taïo ñöôïc caùc ñieåm töông töï vôùi giaûi thuaät Bresenham.
Giaû söû ñieåm (xi,yi) laø ñieåm hieän thôøi vaø vôùi giaûi thuaät Bresenham, vieäc quyeát ñònh ñieåm A hay ñieåm B laø ñieåm keá tieáp laø vieäc löïa choïn giaù trò y i+1 hay yi döïa vaøo khoaûng caùch töø AS hay töø BS. Vaø nhö vaäy giaûi thuaät ñaõ boû qua yeáu toá ñaùnh giaù ñôn giaûn laø : ñieåm M, trung ñieåm cuûa ñoaïn AB, maø qua ñoù vieäc so saùnh chæ ñôn giaûn laø quaù trình xeùt xem M naèm treân hay döôùi ñöôøng thaúng caàn sinh.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
24
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Neáu M naèm döôùi thì ñieåm A ñöôïc choïn, neáu ngöôïc laïi M
naèm treân thì ñieåm B ñöôïc choïn. Giaû söû nhö ta coù phöông trình ñoaïn thaúng ñöôïc bieåu dieãn döôùi daïng khoâng töôøng minh cuøng vôùi caùc heä soá a,b nhö sau :
F(x,y) = ax+by+c = 0Neáu ñaët dx = x2-x1 vaø dy = y2-y1Phöông trình chuyeån veà daïng :
y = (dx/dy).x + BHay F(x,y) = dx.x-dy.y+B.dx = 0Nhö vaäy a=dx; b=-dy; c=B.dxVôùi phöông trình treân thì F(x,y) = 0 vôùi moïi ñieåm (x,y) naèm
treân ñöôøng thaúng, F(x,y)>0 vôùi caùc ñieåm naèm döôùi ñöôøng vaø <0 vôùi caùc ñieåm naèm phía treân ñöôøng thaúng.
Ñaët d = F(xi+1,yi+1/2) laø trung ñieåm cuûa ñoaïn AB, ta coù :di = a(xi+1)+b(yi+1/2)+c
Vieäc so saùnh, hay kieåm tra M seõ ñöôïc thay baèng vieäc xeùt giaù trò d. Neáu d>0 ñieåm B ñöôïc choïn, neáu d<0 ñieåm A ñöôïc choïn. Trong tröôøng hôïp d=0 chuùng ta coù theå choïn ñieåm baát kyø A hay B.- Neáu B ñöôïc choïn thì M seõ taêng theo x moät ñôn vò
Khi ñoù :di+1 = F(xi+2,yi+1/2) di+1 = di+a = di+dy
- Neáu A ñöôïc choïn thì M taêng theo 2 höôùng x vaø y cuøng moät ñôn vò.Khi ñoù :
di+1 = F(xi+2,yi+3/2) di+1 = di+a+b = di+dy-dx
Ñeå tính ñöôïc giaù trò d1, laø giaù trò ñaàu tieân cho quaù trình tính toaùn, thay vaøo coâng thöùc treân ta coù :
F(x1 + 1 , y1 + 1/2) = a(x1 + 1) + b(yi + 1/2) + c
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
25
A
B
M
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
= F(x1,y1) + a + b/2Vôùi (xi,yi) laø ñieåm ñaàu thuoäc ñöôøng thaúng F(x1,y1) = 0
d1 = a + b/2 = dy – dx/2
Hình : Löu ñoà giaûi thuaät trung ñieåm sinh ñöôøng thaúng
2/ GIAÛI THUAÄT SINH ÑÖÔØNG TROØN a/ Nguyeân lyù chung :
Phöông trình ñöôøng troøn ñi qua taâm (xc,yc) ñöôïc bieåu dieãn döôùi daïng toång quaùt
(x - xc)2 + (y – yc)2 = R2
vôùi R laø baùn kính cuûa ñöôøng troøn.Vieäc sinh ra ñöôøng troøn coù theå ñôn giaûn taïo thaønh khi
cho bieán x chaïy töø xc xc + R hay vôùi ñöôøng troøn taâm truøng vôùi goác toïa ñoä thì tham bieán x chaïy töø 0 R.
Vì ñöôøng troøn coù hình daïng cong neân maät ñoä ñieåm ñöôïc taïo ra daøn traûi khoâng ñeàu treân maøn hình Raster thoâng qua caùc giaù trò toïa ñoä ñöôïc tính theo coâng thöùc :
x = xc + rcosy = yc + rsin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
26
Baét ñaàu
x = x1
y = y1
dx = x2 – x1
dy = y2 – y1
d = dy – dx/2
Putpixel (x,y)
d <= 0 No
Yes d = d + dy - dx
y = y + 1d = d + dy
x < x2
Keát thuùc
Yes
No
x = x+1
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Thoâng thöôøng ñeå ruùt goïn giaûi thuaät ngöôøi ta chæ tính vôùi goùc baèng 450, maø töø ñoù laáy ñoái xöùng caùc cung ¼ khaùc qua goác truïc toïa ñoä, truïc tung hoaëc hoaønh.
Giaûi thuaät treân cöïc kyø phöùc taïp vì toàn taïi quaù nhieàu caùc pheùp tính nhaân vaø caên hay sin, cos… ñieàu ñoù laø nguyeân nhaân khieán giaûi thuaät khoâng ñöôïc söû duïng trong caùc chöông trình ñoà hoïa. Caùc giaûi thuaät thöïc teá trong caùc chöông trình ñoà hoïa thöôøng thoâng qua vieäc nguyeân hoùa caùc toïa ñoä döïa vaøo ñoä phaân giaûi cuûa maøn hình.
b/ Giaûi thuaät trung ñieåm veõ ñöôøng troøn :Nhö caùc tính naêng ñaõ phaân tích trong giaûi thuaät Midpoint
cho ñöôøng thaúng. Vieäc phaùt trieån giaûi thuaät sinh ñöôøng troøn cuõng thu ñöôïc caùc öu ñieåm töông töï. Quaù trình phaùt trieån giaûi thuaät ñöôïc xaây döïng nhö sau :
Laáy ¼ ñöôøng troøn laøm ví duï. Khi ñoù x chaïy töø 0 R/2
vaø giaû söû ñieåm treân ñöôøng troøn laø P coù toïa ñoä (x i,yi). Muïc ñích cuûa giaûi thuaät laø tìm ra ñieåm keá tieáp (x i+1,yi+1) vaø 2 söï löïa choïn laø A vaø B.
Theo nhö phöông trình ñöôøng troøn döôùi daïng khoâng töôøng minh :
F(x,y) = x2 + y2 –R2
Giaù trò döông cho nhöõng ñieåm ngoaøi ñöôøng troøn vaø giaù trò aâm cho nhöõng ñieåm naèm trong ñöôøng troøn. Ñieåm giöõa M cuûa A vaø B seõ quyeát ñònh vieäc löïa choïn. Neáu M<0 ñieåm A seõ laø ñieåm keá tieáp vaø ngöôïc laïi neáu M>0 thì B seõ laø ñieåm caàn tìm.
Giaù trò d cuûa trung ñieåm seõ ñöôïc tính theo coâng thöùc :di = F(xi + 1,yi – ½) = (xi + 1)2 + (yi – ½)2 – R2
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
27
A
B
M
P
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Nhö vaäy neáu di<0 thì ñieåm keá tieáp laø A seõ dòch 1 ñôn vò theo x vaø giaù trò di+1 ñöôïc tính theo coâng thöùc :
di+1 = F(xi + 2,yi – ½) = (xi + 2)2 + (yi – ½)2 – R2
di+1 = di + (2xi + 3) a = 2xi + 3Tröôøng hôïp di>0 thì ñieåm keá tieáp laø B seõ taêng giaù trò
theo x vaø giaûm theo y vôùi cuøng 1 ñôn vò.di+1 = F(xi + 2,yi – 3/2)
= (xi + 2)2 + (yi – 3/2)2 – R2
di+1 = di + (2xi –2yi + 5) b = 2xi –2yi + 5Giaù trò d1 taïi ñieåm ñaàu (x1,y1) coù toïa ñoä töông öùng laø
(0,R) vaø trung ñieåm tieáp theo ñöôïc suy ra laø (1,R-1/2). Theo coâng thöùc
di = F(1,R-1/2) = 1 + (R2 – R + ¼) – R2
= 5/4 - R
Hình: Löu ñoà giaûi thuaät trung ñieåm sinh ñöôøng troøn
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
28
Baét ñaàu
x = 0y = R
d = 5/4 - R
Putpixel (x,y)
d < 0 No
Yes d = d + 2(x-y) + 5
y = y - 1d = d + 2x + 3
x < R
Keát thuùc
Yes
No
x = x+1
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình: Löu ñoà giaûi thuaät 2 trung ñieåm sinh ñöôøng troøn
3/ GIAÛI THUAÄT SINH ÑÖÔØNG SPLINE a/ Giôùi thieäu B-Spline :
Ta ñaõ bieát caùc haøm lieân keát trôn Bezier söû duïng caùc ña thöùc Bernstein phuï thuoäc vaøo soá löôïng caùc ñieåm ñieàu khieån.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
29
Baét ñaàu
x = 0y = R
d1 = 5/4 – Rd2 = 5/2 – 2R
Putpixel (x,y)
d1>0,d2>0 Yes
No d1 = d1 + 2 – 2yd2 = d2 + 3 – 2y
y = y - 1
Keát thuùc
Yes
d1>0,d2<0
d1<0,d2<0
d1 = d1 + 2(x – y) + 5
d2 = d2 + 2(x – y) + 5
y = y – 1x = x + 1
y = 0
d1 = d1 + 3 + 2xd2 = d2 + 2 + 2x
x = x + 1
No
Yes
No
Yes
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Caùc ñöôøng cong naøy coù söï ñieàu khieån toaøn boä – di chuyeån moät ñieåm ñieàu khieån aûnh höôûng ñeán toaøn boä ñöôøng cong. Ñeå traùnh caùc ña thöùc baäc cao vaø giaûm söï aûnh höôûng moät caùch toång theå naøy, caùc ñöôøng cong Bezier thöôøng ñöôïc xaây döïng baèng caùch keát noái nhieàu phaân ñoaïn baäc thaáp hôn. Ñieàu naøy cho pheùp söï ñieàu khieån cuïc boä vaø coù quyeàn töï do thay ñoåi baäc taïi caùc ñieåm söû duïng tính lieân tuïc. Moãi phaân ñoaïn ñöôøng cong Bezier coù caùc tính chaát ñeà caäp ôû treân, nhöng ñöôøng cong phöùc hôïp coù nhöõng tính chaát khaùc. Phöôùng phaùp ñöôïc choïn ñeå keát noái caùc phaân ñoaïn vôùi nhau phuï thuoäc vaøo baäc mong muoán cuûa tính lieân tuïc. Neáu caùc phaân ñoaïn ñôn giaûn chæ coù chung caùc ñieåm cuoái thì xuaát hieän tính lieân tuïc C0. Tính lieân tuïc baäc cao hôn thu ñöôïc chæ baèng caùch buoäc theo caùc raøng buoäc hình hoïc taïi vò trí caùc ñænh.
Coù theå söû duïng caùc haøm lieân keát trôn B-Spline xen keõ (luaân phieân) vôùi caùc ña thöùc Bernstein ñeå taïo ra ñöôøng cong ña thöùc tham soá töøng khuùc rieâng leû thoâng qua moät soá ñieåm ñieàu khieån. Baäc cuûa ña thöùc coù theå ñöôïc ngöôøi thieát keá löïa choïn ñoäc laäp vôùi soá löôïng caùc ñieåm ñieàu khieån. Ñoù laø baäc cuûa caùc haøm lieân keát trôn hay caùc haøm cô sôû, maø noù ñieàu khieån baäc cuûa ñöôøng cong B-Spline cuoái cuøng. Caùc ñöôøng cong B-Spline keá thöøa söï ñieàu khieån cuïc boä, nghóa laø, khi moät ñænh dòch chuyeån, chæ moät vaøi phaân ñoaïn cuûa noù bò aûnh höôûng, phaàn coøn laïi cuûa ñöôøng cong khoâng thay ñoåi. Tính lieân tuïc giöõa caùc phaân ñoaïn B-Spline laø moät haøm coù baäc cuûa caùc haøm cô sôû. Do ñoù, tính lieân tuïc laø moät nhaân toá quan troïng trong vieäc haï baäc coù theå choïn bôûi ngöôøi thieát keá. Ñoái vôùi caùc öùng duïng nhö thieát keá caùc ñöôøng cong töï do, trong ñoù ñoä trôn laø moät tieâu chuaån quan troïng, tính lieân tuïc ñoä cong C2 ñöôïc öu tieân hôn. Ñieàu naøy ñöôïc thoûa maõn bôûi ñöôøng cong B-Spline baäc ba.
b/ Pheùp bieåu dieãn B-Spline toång quaùt :ÔÛ daïng toång quaùt, caùc ñöôøng cong B-Spline coù theå
bieåu dieãn baèng caùc haøm lieân keát trôn cuûa chuùng :
trong ñoù, Vi laø taäp hôïp caùc ñieåm ñieàu khieån vaø N i,k bieåu dieãn caùc haøm lieân keát trôn baäc (k-1) khi noù ñöôïc ñònh nghóa nhö moät ña thöùc baäc (k-1) töøng khuùc coù tính lieân tuïc Ck-2. Noùi caùch khaùc :
- Baäc cuûa ña thöùc khoâng vöôït quaù k-1 trong moãi ñoaïn [ti,ti+1]
- Vò trí vaø caùc ñaïo haøm baäc töø 1 ñeán (k-2) lieân tuïc.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
30
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Ñoái vôùi tröôøng hôïp B-Spline baäc ba :- k = 4- Baäc = (k-1) = 3- Tính lieân tuïc baäc hai ñöôïc thoûa maõn.Haøm lieân keát trôn thöù i laø Ni,k(t) ñöôïc ñònh nghóa baèng phöông trình ñeä quy sau
vaø
trong ñoù, veùc tô nuùt laø [ti,…,ti+k].Veùc tô nuùt coù aûnh höôûng ñaùng keá ñeán caùc haøm lieân
keát trôn Ni,k(t) vaø caû baûn thaân ñöôøng cong B-Spline.Caùc veùc tô nuùt coù theå phaân loaïi thaønh :- Ñeàu/ tuaàn hoaøn- Khoâng tuaàn hoaøn- Khoâng ñeàuVì caùc veùc tô nuùt aûnh höôûng ñeán hình daïng cuûa ñöôøng
B-Spline, ñieàu ñoù coù theå suy ra raèng caùc ñöôøng cong B-Spline cuõng coù söï phaân loaïi nhö treân.
i/ Ñeàu vaø tuaàn hoaøn :Veùc tô nuùt coù giaù trò caùch ñeàu nhau ti, sao cho ti – ti-
1 = a ñoái vôùi taát caû caù ñoaïn, vaø a laø soá thöïc. Ví duï : [0 1 2 3 4] vôùi a=1.
ii/ Khoâng tuaàn hoaøn :Moät veùc tô nuùt khoâng tuaàn hoaøn hoaëc môû coù
caùc giaù trò nuùt laëp laïi taïi caùc ñieåm cuoái, soá löôïng giaù trò laëp laïi naøy baèng caáp k cuûa haøm soá vaø caùc nuùt trong coù böôùc baèng nhau. Ví duï : Caáp 2, soá löôïng caùc nuùt 6 veùc tô nuùt [0 0 1 2 3 3]
iii/ Khoâng ñeàu :Trong veùc tô nuùt khoâng tuaàn hoaøn, giaù trò caù nuùt
xuaát hieän taïi caùc bieân ñöôïc laëp laïi vaø caùc nuùt beân trong coù böôùc baèng nhau. Neáu moät trong hai ñieàu kieän naøy khoâng ñöôïc thoûa maõn thì vectô nuùt goïi laø khoâng ñeàu. Ví duï : [0 1 2 3 3 4 5]
c/ Ñoaïn maõ chöông trình moâ taû phöông phaùp veõ ñöôøng B-Spline :Function Tinh_P(t) :
x:=0;y:=0;For k:=0 to Numpoints-1 do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
31
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Beginx:=x + Control_Point[k].x * N(k,m,t);y:=y + Control_Point[k].y * N(k,m,t);
End;{Control_Point laø maûng chöùa caùc ñieåm ñieàu khieån}{toïa ñoä môùi sau khi tính laø (x,y)}Function N(k,m,t) :
If m=1 then If (t<Knot[k])or(t>Knot[k+1]) then
N:=0Else
N:=1ElseBegin
denom1:=Knot[k+m-1] – Knot[k];If denom1<>0 then
Sum:=(t – Knot[k]) * N(k,m-1,t)Else
Sum:=0;denom2:=Knot[k+m] – Knot[k+1];If denom2<>0 then
Sum:=sum + (Knot[k+m] – t) * N(k+1,m-1,t);N:=sum;
End;{Knot laø maûng chöùa caùc veùc tô nuùt}
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
32
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
PHAÀN VIGIÔÙI THIEÄU VI XÖÛ LÍ 8951 1/ GIÔÙI THIEÄU VEÀ AT89C51 a/ Ñaëc ñieåm:
4 Kbyte EEPROM 128 byte RAM 4 port I/O 8 bit 2 boä ñònh thôøi 16 bit Giao tieáp noái tieáp 64K khoâng gian boä nhôù chöông trình môû roäng 64K khoâng gian boä nhôù döõ lieäu môû roäng Moät boä xöû lyù luaän lyù (thao taùc treân caùc bit ñôn) 210 bit ñöôïc ñòa chæ hoaù Boä nhaân/chia 4ms.
b/ Sô ñoà khoái & sô ñoà chaân 8951:
Hình : Sô ñoà khoái vi xöû lyù 8951
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
33
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình : Sô ñoà chaân 8951 c/ Sô löôïc veà caùc chaân cuûa 8951:
Port 0 (32 – 39): Laø moät port 2 chöùc naêng: 8 bit Data Bus & 8 bit thaáp Address Bus khi coù boä nhôù môû roäng.
Port 1 (1 – 8): Laø moät port I/O. Port 2 (21 – 28): Vöøa laøm port I/O, vöøa laø 8 bit cao
Address Bus khi coù boä nhôù môû roäng. Port 3 (10 – 17): Laø moät port coù coâng duïng keùp PSEN (Program Store Enable),(chaân 29): Laø tín hieäu ñieàu
khieån ñeå cho pheùp boä nhôù chöông trình môû roäng vaø thöôøng ñöôïc noái ñeán chaân OE (output enable) cuûa moät EPROM ñeå cho pheùp ñoïc caùc byte maõ leänh.
ALE (Address Latch Enable),(chaân 30): Khi port 0 ñöôïc duøng trong cheá ñoä vöøa laø Data Bus vöøa laø byte thaáp cuûa Address Bus thì ALE laø tín hieäu choát ñòa chæ vaøo moät thanh ghi beân ngoaøi trong nöõa ñaàu chu kyø boä nhôù. Sau ñoù port 0 duøng ñeå xuaát hoaëc nhaäp döõ lieäu trong nöõa sau cuûa chu kyø boä nhôù.
EA (External Access),(chaân 31): Tín hieäu vaøo EA neáu ôû möùc cao thì thöïc hieän chöông trình töø ROM noäi. Neáu ôû möùc thaáp, chöông trình chæ ñöôïc thi haønh töø boä nhôù môû roäng.
RST (reset),(chaân 9): 8951 seõ ñöôïc reset khi RST ôû möùc cao.
Caùc ngoõ vaøo boä dao ñoäng (chaân 18, 19) Caùc chaân nguoàn: chaân 40 noái vôùi Vcc, chaân 20 noái
vôùi GND.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
34
U 1
A T8 9 L V 5 1
91 81 9
20
2 9
3 0
3 1
40
12345678
2 12 22 32 42 52 62 72 8
1 01 11 21 31 41 51 61 7
3 93 83 73 63 53 43 33 2
R S TXTA L 2XTA L 1
GN
D
P S E N
A L E / P R O G
E A / V P P
VC
C
P 1 . 0P 1 . 1P 1 . 2P 1 . 3P 1 . 4P 1 . 5P 1 . 6P 1 . 7
P 2 . 0 / A 8P 2 . 1 / A 9
P 2 . 2 / A 1 0P 2 . 3 / A 1 1P 2 . 4 / A 1 2P 2 . 5 / A 1 3P 2 . 6 / A 1 4P 2 . 7 / A 1 5
P 3 . 0 / R XDP 3 . 1 / TXD
P 3 . 2 / I N TOP 3 . 3 / I N T1
P 3 . 4 / TOP 3 . 5 / T1
P 3 . 6 / W RP 3 . 7 / R D
P 0 . 0 / A D 0P 0 . 1 / A D 1P 0 . 2 / A D 2P 0 . 3 / A D 3P 0 . 4 / A D 4P 0 . 5 / A D 5P 0 . 6 / A D 6P 0 . 7 / A D 7
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù d /Toå chöùc boä nhôù:
Goàm coù 4K ROM noäi, 128 byte RAM noäi vaø coù theå môû roäng toái ña 64Kbyte boä nhôù chöông trình vaø 64Kbyte boä nhôù döõ lieäu.
RAM noäi: Bank thanh ghi (00H – 1FH): 8951 hoã trôï 8 thanh ghi (R0 –
R7), caùc leänh duøng thanh ghi R0 – R7 thì seõ ngaén hôn caùc leänh töông öùng nhöng duøng ñòa chæ tröïc tieáp. Caùc giaù trò döõ lieäu ñöôïc duøng thöôøng xuyeân neân duøng moät trong caùc thanh ghi naøy. Bank thanh ghi tích cöïc coù theå chuyeån ñoåi baèng caùch thay ñoåi caùc bit choïn bank thanh ghi trong PSW.
RAM ñòa chæ hoùa töøng bit (20H – 2FH) RAM ña duïng (30H – 7FH)Caùc thanh ghi chöùc naêng ñaëc bieät (80H – FFH):* PSW:
Bit Kyù hieäu
Ñòa chæ
YÙ nghóa
PSW.7 CY D7H Côø nhôù
PSW.6 AC D6H Côø nhôù phuï
PSW.5 F0 D5H Côø 0
PSW.4 RS1 D4H Bit 1 choïn bank thanh ghi
PSW.3 RS0 D3H Bit 0 choïn bank thanh ghi00=bank 0: ñòa chæ 00H-
07H01=bank 1: ñòa chæ 08H-
0FH10=bank 2: ñòa chæ 10H-
PSW.2 OV D2H Côø traøn
PSW.1 - D1H Döï tröõ
PSW.0 P D0H Côø parity chaün
* Thanh ghi B (F0H): ñöôïc duøng cuøng vôùi thanh ghi tích luõy A cho caùc pheùp toaùn nhaân, chia.
* Con troû ngaên xeáp (SP: 81H): chöùa ñòa chæ cuûa byte döõ lieäu hieän haønh treân ñænh cuûa ngaên xeáp.
* Con troû döõ lieäu (DPTR: 83H – 82H): ñöôïc duøng ñeå truy xuaát boä nhôù ngoaøi.
* Caùc thanh ghi port I/O: port 0, port 1, port 2, port 3* Caùc thanh ghi Timer: timer 0: 8CH – 8AH ; timer 1: 8DH –
8BH ; TMOD: 89H ; TCON: 88H
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
35
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
* Caùc thanh ghi port noái tieáp: SBUF: 99H ; SCON: 98H* Caùc thanh ghi ngaét: 8951 coù 5 nguoàn ngaét ñöôïc cho
pheùp baèng thanh ghi IE: A8H* Thanh ghi ñieàu khieån coâng suaát: PCON: 87H
e/ Traïng thaùi Reset :
Hình : Maïch resetTraïng thaùi cuûa taát caû caùc thanh ghi khi reset heä thoáng:
Thanh ghi Traïng thaùi
Ñeám chöông trình 0000 H
Tích luõy 00 H
B 00 H
PSW 00 H
SP 07 H
DPTR 0000 H
Port 03 FF H
IP XXX00000 B
IE 0XX00000 B
Caùc thanh ghi ñònh thôøi
00 H
SCON 00 H
SBUF 00 H
PCON (HMOS) 0XXXXXX B
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
36
5 V
1 0 u F
5 V
R S T
8 . 2 K
S W 1
1 0 0
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
PCON (CMOS) 0XXX0000 B
Khi reset trôû laïi möùc thaáp, vieäc thi haønh chöông trình luoân baét ñaàu ôû ñòa chæ ñaàu tieân trong boä nhôù chöông trình (0000H). Noäi dung cuûa RAM treân chip khoâng bò thay ñoåi bôûi leänh reset.
2/ TAÄP LEÄNH CUÛA AT89C51: a/ Cheá ñoä ñaùnh ñòa chæ: trong taäp leänh coù 8 cheá ñoä ñaùnh ñòa chæ
Ñòa chæ thanh ghi:
Maõ leänh n N nÑòa chæ thanh ghi
Ñòa chæ tröïc tieáp:
Maõ leänhÑòa chæ tröïc
tieápÑòa chæ tröïc tieáp
Ñòa chæ giaùn tieáp: R0,R1 ñöôïc duøng ñeå chöùa ñòa chæ oâ nhôù maø leänh taùc ñoäng ñeán. Ngöôøi ta qui öôùc duøng daáu @ tröôùc R0 hoaëc R1.
Maõ leänh iÑòa chæ giaùn tieáp
Ñòa chæ töùc thôøi:Ngöôøi ta duøng daáu # tröôùc caùc toaùn haïng töùc thôøi
Maõ leänhDöõ lieäu töùc
thôøiÑòa chæ töùc thôøi
Ñòa chæ töông ñoái: thöôøng duøng trong caùc leänh nhaûy. 8951 duøng giaù trò 8 bit coù daáu ñeå coäng theâm vaøo thanh ghi ñeám chöông trình (PC). Taàm nhaûy cuûa leänh naøy naèm trong khoaûng –128 ñeán 127 oâ nhôù.
Maõ leänhOffset töông
ñoái
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
37
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Ñòa chæ töông ñoái
Ñòa chæ tuyeät ñoái: chæ duøng trong caùc leänh ACALL vaø AJMP.
A10 – A8 Maõ leänh Offset töông ñoáiÑòa chæ tuyeät ñoái
Ñòa chæ daøi: duøng cho leänh LCALL vaø LJMP.
Maõ leänh A15 – A8 A7 – A0Ñòa chæ daøi
Ñòa chæ tham chieáu:
Ñòa chæ cô baûn Offset Ñòa chæ ñöôïc taùc ñoäng
PC hoaëc DPTR
+ ACC =
Ñòa chæ tham chieáu
b/ Taäp leänh: Taäp leänh cuûa 8951 ñöôïc chia laøm 4 nhoùm:
Soá hoïc: ADD, SUBB, MUL, DIV, ... Luaän lyù: ANL, ORL, XRL, SETB, CLR, RL, RR,.... Nhoùm leänh chuyeån döõ lieäu: MOV, MOVC, MOVX, POP,
PUSH, XCH,... Nhoùm leänh chuyeån ñieàu khieån: ACALL, LCALL, RET,
AJMP, LJMP, JZ, JB, CJNE,... 3 MOÄT SOÁ CHÖÙC NAÊNG CUÛA AT89C51 a/ Boä ñònh thôøi (Timer):
8951 coù hai timer 16 bit, moãi timer coù 4 caùch laøm vieäc. Ngöôøi ta söû duïng caùc timer ñeå: ñònh khoaûng thôøi gian; ñeám söï kieän hoaëc taïo toác ñoä baud cho port noái tieáp trong 8951.
Truy xuaát caùc timer cuûa 8951 duøng 6 thanh ghi chöùc naêng ñaëc bieät cho trong baûng sau:
SFR Muïc ñích Ñòa chæÑòa chæ hoùa
töøng bit
TCON Ñieàu khieån Timer 88H Coù
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
38
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
TMOD Cheá ñoä Timer 89H Khoâng
TL0 Byte thaáp cuûa Timer 0 8AH Khoâng
TL1 Byte thaáp cuûa Timer 1 8BH Khoâng
TH0 Byte cao cuûa Timer 0 8CH Khoâng
TH1 Byte cao cuûa Timer 1 8DH Khoâng
Thanh ghi cheá ñoä timer (TMOD):
Bit Teân Timer Moâ taû
7 GATE 1Bit (môû) coång, khi leân 1, timer chæ chaïyKhi INT1 ôû möùc cao
6 C/T 1
Bit choïn cheá ñoä counter/timer1 = boä ñeám söï kieän0 = Boä ñònh khoaûng
thôøi gian
5 M1 1 Bit 1 cuûa cheá ñoä (mode)
4 M0 1 Bit 0 cuûa cheá ñoä00=cheá ñoä 0: timer 13 bit01=cheá ñoä 1: timer 16 bit10=cheá ñoä 2: töï ñoäng
naïp laïi 8 bit11=cheá ñoä 3: taùch timer
3 GATE 0 Bit (môû) coång
2 C/T 0 Bit choïn counter/timer
1 M1 0 Bit 1 cuûa cheá ñoä
0 M0 0 Bit 0 cuûa cheá ñoä
Thanh ghi ñieàu khieån timer (TCON):
BitKyù
hieäuÑòa chæ
Moâ taû
TCON.7 TF1 8FH
Côø baùo traøn Timer 1. Ñaët bôûi phaàn cöùng khi traøn, ñöôïc xoùa bôûi phaàn meàm hoaëc phaàn cöùng khi boä xöû lyù chæ ñeán chöông trình phuïc vuï ngaét.
TCON.6 TR1 8EH Bit ñieàu khieån timer 1 chaïy. Ñaët/xoùa
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
39
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
baèng phaàn meàm ñeå cho timer chaïy/ngöng
TCON.5 TF0 8DH Côø baùo traøn timer 0TCON.4 TR0 8CH Bit ñieàu khieån timer 0 chaïy
TCON.3 IE1 8BH
Côø caïnh ngaét 1 beân ngoaøi. Ñaët bôûi phaàn cöùng khi phaùt hieän moät caïnh xuoáng ôû INT1; xoùa baèng phaàn meàm hoaëc baèng phaàn cöùng khi CPU chæ ñeán chöông trình phuïc vuï ngaét.
TCON.2 IT1 8AH
Côø kieåu ngaét 1 beân ngoaøi. Ñaët/xoùa baèng phaàn meàm ñeå ngaét ngoaøi tích cöïc caïnh xuoáng/möùc thaáp.
TCON.1 IE0 89H Côø caïnh ngaét 0 beân ngoaøiTCON.0 IT0 88H Côø kieåu ngaét 0 beân ngoaøi
b/ Port noái tieáp (serial port): 8951 coù moät port noái tieáp trong chip coù theå hoaït
ñoäng ôû nhieàu cheá ñoä treân moät daûi taàn soá roäng. Chöùc naêng chuû yeáu cuûa port noái tieáp laø thöïc hieän chuyeån ñoåi song song sang noái tieáp ñoái vôùi döõ lieäu xuaát, vaø chuyeån ñoåi noái tieáp sang song song vôùi döõ lieäu nhaäp.
Hai thanh ghi chöùc naêng ñaëc bieät cho pheùp phaàn meàm truy xuaát ñeán port noái tieáp laø: SBUF vaø SCON. Vieát vaøo SBUF ñeå naïp döõ lieäu seõ ñöôïc phaùt, vaø ñoïc SBUF ñeå truy xuaát döõ lieäu thu ñöôïc.
Thanh ghi ñieàu khieån port noái tieáp:
BitKyù
hieäuÑòa chæ
Moâ taû
SCON.7 SM0 9FH Bit 0 cuûa cheá ñoä port noái tieáp
SCON.6 SM1 9EH Bit 1 cuûa cheá ñoä port noái tieáp
SCON.5 SM2 9DH Bit 2 cuûa cheá ñoä port noái tieáp. Cho pheùp truyeàn thoâng ña xöû lyù trong caùc cheá ñoä 2 vaø 3; RI seõ khoâng bò taùc ñoäng neáu bit thöù 9 thu ñöôïc laø 0
SCON.4 REN 9CH Cho pheùp boä thu phaûi ñöôïc ñaët leân 1 ñeå thu caùc kyù töï
SCON.3 TB8 9BH Bit 8 phaùt, bit thöù 9 ñöôïc phaùt
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
40
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
trong caùc cheá ñoä 2 vaø 3; ñöôïc ñaët vaø xoùa baèng phaàn meàm
SCON.2 RB8 9AH Bit 8 thu, bit thöù 9 thu ñöôïc
SCON.1 TI 99H Côø ngaét phaùt. Ñaët leân 1 khi keát thuùc phaùt kyù töï; ñöôïc xoùa baèng phaàn meàm
SCON.0 RI 98H Côø ngaét thu. Ñaët leân 1 khi keát thuùc thu kyù töï; ñöôïc xoùa baèng phaàn meàm
Caùc cheá ñoä port noái tieáp:
SM0 SM1Cheá ñoä
Moâ taû Toác ñoä baud
0 0 0Thanh ghi
dòchCoá ñònh (FOSC/12)
0 1 1 UART 8 bit Thay ñoåi (ñaët baèng timer)
1 0 2 UART 9 bitCoá ñònh (Fosc chia cho 12
hoaëc 64)
1 1 3 UART 9 bit Thay ñoåi (ñaët baèng timer)
Toác ñoä baud port noái tieáp:
Toác ñoä baud
Taàn soá thaïch anh
SMODGiaù trò naïp laïi
vaøo TH1
Toác ñoä baud thaät
Sai soá
9600 12.000MHz 1 -7 (F9H) 8923 7
2400 12.000MHz 0 -13 (F3H) 2404 0.16
1200 12.000MHz 0 -26 (E6H) 1202 0.16
19200 11.059MHz 1 -3 (FDH) 19200 0
9600 11.059MHz 0 -3 (FDH) 9600 0
2400 11.059MHz 0 -12 (F4H) 2400 0
1200 11.059MHz 0 -24 (E8H) 1200 0
c/ Ngaét (Interrupt): Moät ngaét laø söï xaûy ra moät ñieàu kieän - moät söï kieän
– maø noù gaây ra treo taïm thôøi chöông trình trong khi ñieàu kieän ñoù ñöôïc phuïc vuï bôûi moät chöông trình khaùc. Chöông trình giaûi quyeát ngaét ñöôïc goïi laø chöong trình phuïc vuï ngaét (ISR: Interrupt Service Routine). Khi
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
41
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
ngaét xaûy ra, chöông trình chính taïm thôøi bò treo vaø reû nhaùnh ñeán ISR: ISR thöïc thi vaø keát thuùc baèng leänh trôû veà töø ngaét, chöông trình chính tieáp tuïc thöïc thi ôû choã maø noù taïm döøng.
Toå chöùc ngaét ôû 8951: 2 ngaét ngoaøi, 2 ngaét töø timer vaø 1 ngaét port noái tieáp. Taát caû caùc ngaét ñeàu maëc nhieân bò caám sau khi reset heä thoáng vaø ñöôïc cho pheùp töøng caùi moät baèng phaàn meàm. Khi coù hai hoaëc nhieàu ngaét ñoàng thôøi, hoaëc moät ngaét xaûy ra trong khi moät ngaét khaùc ñang ñöôïc phuïc vuï, coù caû hai söï tuaàn töï hoûi voøng vaø sô ñoà öu tieân hai möùc duøng ñeå xaùc ñònh vieäc thöïc hieän caùc ngaét.
Cho pheùp vaø caám caùc ngaét thoâng qua thanh ghi chöùc naêng ñaët bieät IE (Interrupt Enable)
BitKyù
hieäuÑòa chæ
bitMoâ taû (1=cho pheùp,
0=caám)
IE.7 EA AFH Cho pheùp/caám toaøn boä
IE.6 - AEH Khoâng ñöôïc ñònh nghóa
IE.5 ET2 ADH Cho pheùp ngaét töø Timer 2
IE.4 ES ACHCho pheùp ngaét töø Port noái
tieáp
IE.3 ET1 ABH Cho pheùp ngaét töø Timer 1
IE.2 EX1 AAH Cho pheùp ngaét ngoaøi 1
IE.1 ET0 A9H Cho pheùp ngaét töø Timer 0
IE.0 EX0 A8H Cho pheùp ngaét ngoaøi 0
Öu tieân ngaét: moãi nguoàn ngaét ñöôïc laäp trình rieâng vaøo moät trong hai möùc öu tieân qua thanh ghi chöùc naêng ñaëc bieät IP (Interrupt Priority)
BitKyù
hieäuÑòa
chæ bitMoâ taû (1=möùc cao hôn, 0=
möùc thaáp)
IP.7 - - Khoâng ñöôïc ñònh nghóa
IP.6 - - Khoâng ñöôïc ñònh nghóa
IP.5 PT2 BDH Öu tieân cho ngaét töø Timer 2
IP.4 PS BCH Öu tieân cho ngaét töø port noái tieáp
IP.3 PT1 BBH Öu tieân cho ngaét töø Timer 1
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
42
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
IP.2 PX1 BAH Öu tieân cho ngaét ngoaøi 1
IP.1 PT0 B9H Öu tieân cho ngaét töø Timer 0
IP.0 PX0 B8H Öu tieân cho ngaét ngoaøi 0
Hoûi voøng tuaàn töï: caùc bit côø taïo caùc ngaét ñöôïc toùm taét ôû baûng sau
Ngaét CôøThanh ghi SFR vaø vò
trí bit
Beân ngoaøi 0 IE0 TCON.1
Beân ngoaøi 1 IE1 TCON.3
Timer 1 TF1 TCON.7
Timer 0 TF0 TCON.5
Port noái tieáp TI SCON.1
Port noái tieáp RI
RI SCON.0
Xöû lyù ngaét: Khi ngaét xaûy ra vaø ñöôïc CPU chaáp nhaän, chöông trình chính bò ngaét quaõng. Nhöõng hoaït ñoäng sau xaûy ra: * Leänh hieän haønh hoaøn taát vieäc thöïc thi * Caát PC vaøo ngaên xeáp * Traïng thaùi ngaét hieän haønh ñöôïc caát beân trong * Caùc ngaét bò chaën ôû möùc ngaét * Naïp vaøo PC ñòa chæ vetor cuûa ISR * ISR thöïc thi
Caùc vector ngaét: Khi chaáp nhaän ngaét, giaù trò ñöôïc naïp vaøo PC ñöôïc goïi laø vector ngaét. Noù laø ñòa chæ baét ñaàu cuûa ISR cho nguoàn taïo ngaét. Caùc vector ngaét ñöôïc cho ôû baûng sau :
Ngaét Côø Ñòa chæ vector
Reset heä thoáng RST 0000H
Beân ngoaøi 0 IE0 0003H
Timer 0 TF0 000BH
Beân ngoaøi 1 IE1 0013H
Timer 1 TF1 001BH
Port noái tieáp (TI TI hoaëc RI 0023H
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
43
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
hoaëc RI)
PHAÀN VIICOÅNG COM VAØ CAÙC CHUAÅN GIAO TIEÁP 1/GIAO TIEÁP VÔÙI MAÙY TÍNH Caùc caùch giao tieáp vôùi maùy tính :
Ngaøy nay maùy tính ñöôïc duøng vaøo raát nhieàu vieäc vaø trôû neân raát phoå bieán trong cuoäc soáng cuõng nhö trong kyõ thuaät. Trong kyõ thuaät noù thöôøng ñöôïc duøng nhieàu nhaät laø ñeå thu thaäp döõ lieäu sau tính toaùn roài xuaát ra tín hieäu ñieàu
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
44
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù khieån cho caùc thieát bò beân ngoaøi. Ñeå caùc heä thoáng ño löôøng vaø ñieàu khieån gheùp noái vôùi maùy vi tính coù theå hoaït ñoäng ñöôïc thì ngoaøi phaàn thieát keá card giao tieáp vôùi maùy tính chuùng ta coøn phaûi coù phaàn meàm ñeå giao tieáp vôùi maïch ñieän beân ngoaøi. Muoán vieát ñöôïc phaàn meàm tröôùc heát chuùng ta phaûi naém ñöôïc caùc caùch giao tieáp vôùi maùy tính.
Coù ba caùch giao tieáp vôùi ngoaïi vi, tuøy töøng tröôøng hôïp maø ta coù caùc caùch giao tieáp khaùc nhau thích hôïp. a/ Giao tieáp qua Slot :
Trong maùy tính ngoaøi caùc Slot duøng cho caùc card I/O, card maøn hình v.v… Nhaø saûn xuaát ñaõ cheá taïo saün caùc Slot coøn troáng cho pheùp ngöôøi söû duïng coù theå gaén theâm caùc card khaùc do mình taïo ra. Moãi Slot ñeàu coù rieâng caùc ñöôøng data, caùc ñöôøng ñòa chæ, caùc nguoàn cung caáp 5V, 12V, GND vaø caùc ñöôøng ñieàu khieån nhö CLK, IRQ v.v… Vì vaäy neáu ta thieát keá card giao tieáp qua Slot seõ giaûm ñöôïc nhieàu linh kieän chaúng haïn nhö giaûm ñöôïc boä nguoàn beân ngoaøi, deã ñieàu khieån vaø do ñoù cuõng giaûm ñöôïc giaù thaønh cuûa maïch. Ñaây laø öu ñieåm lôùn cuûa caùch giao tieáp naøy. Ngoaøi ra coøn coù moät tieän lôïi khaùc laø qua Slot ta coù theå gaén nhieàu loaïi card 8 bit, 16 bit, 32 bit. Tuy nhieân beân caïnh ñoù cuõng coù nhieàu nhöôïc ñieåm : do card giao tieáp gaén beân trong maùy tính neân noù seõ coù moät kích thöôùc tieâu chuaån nhaát ñònh, do ñoù ngoaøi card giao tieáp ra chuùng ta coøn phaûi laøm theâm moät phaàn maïch nöõa ôû beân ngoaøi maùy tính neáu maïch cuûa ta coù quaù nhieàu linh kieän.
b/ Giao tieáp qua coång maùy in :Coång noái vôùi maùy in coøn ñöôïc goïi laø giao dieän
Centronics. Vieäc noái vôùi coång maùy in ñöôïc thöïc hieän qua oå caém 25 chaân ôû phía sau maùy tính. Ñaëc bieät ñaây khoâng chæ laø choã noái ñeå truyeàn döõ lieäu vôùi maùy in, maø khi söû duïng maùy tính cho muïc ñích ño löôøng vaø ñieàu khieån thì vieäc gheùp noái cuõng coù theå ñöôïc thöïc hieän qua coång naøy. Qua oå caém naøy döõ lieäu ñöôïc truyeàn ñi song song neân ñoâi khi coøn ñöôïc goïi laø coång gheùp noái song song vaø vì theá toác ñoä truyeàn döõ lieäu cuõng ñaït ñeán möùc ñaùng keå. Taát caû caùc ñöôøng daãn cuûa coång naøy ñeàu töông thích TTL, nghóa laø chuùng ñeàu cung caáp moät möùc ñieän aùp naèm giöõa 0V vaø 5V.
Beân caïnh 8 bit döõ lieäu coøn coù nhöõng ñöôøng daãn tín hieäu khaùc toång coäng ta coù trao ñoåi moät caùch rieâng bieät vôùi 17 ñöôøng daãn, bao goàm 12 ñöôøng daãn ra vaø 5 ñöôøng daãn vaøo.
Ngoaøi öu ñieåm laø toác ñoä truyeàn nhanh, döõ lieäu vaøo ra song song, thích hôïp cho vieäc öùng duïng vaøo ñieàu khieån, ño
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
45
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù löôøng caùc thieát bò ngoaïi vi coù kích thöôùc lôùn thì caùch giao tieáp naøy coù nhöôïc ñieåm laø loaïi truyeàn naøy deã bò nhieãu hôn loaïi truyeàn qua coång noái tieáp, caùp truyeàn coù quaù nhieàu sôïi vaø möùc tín hieäu naèm trong khoaûng 0V5V thì roõ raøng khoâng thích hôïp cho vieäc truyeàn ôû caùc khoaûng caùch xa. c/ Giao tieáp qua coång COM :
Caùch giao tieáp naøy ñöôïc söû duïng roäng raõi vaø phoå bieán nhaát. Noù giao tieáp theo chuaån RS-232, caùc bit döõ lieäu noái tieáp nhau treân moät ñöôøng truyeàn vaø thöôøng duøng ñeå giao tieáp maùy tính vôùi modem, mouse v.v… Döõ lieäu truyeàn döôùi daïng noái tieáp vôùi moät toác ñoä do ngöôøi laäp trình qui ñònh (1200bps, 2400bps, 4800bps, 9600bps, 14.4Kbps, 28.8Kbps, 33.6Kbps, 56Kbps). Chieàu daøi kí töï coù theå laø 5,6,7 hoaëc 8 bit keát hôïp vôùi caùc bit Start, Stop, Parity taïo thaønh moät Frame. Ngoaøi ñöôøng truyeàn döõ lieäu, port giao tieáp naøy coøn coù caùc ñöôøng ñieàu khieån, thu phaùt, kieåm tra loãi. Caùch giao tieáp naøy cho pheùp truyeàn ôû nhöõng khoaûng caùch lôùn vì khaû naêng gaây nhieãu laø khaù nhoû. Tröôùc kia toác ñoä truyeàn noái tieáp laø thaáp, ngaøy nay chuùng ñöôïc naâng leân cao hôn.
Vì luaän vaên naøy giao tieáp vôùi maùy tính qua coång COM neân döôùi ñaây ta giôùi thieäu chi tieát veà coång naøy.
2/CAÙC CHUAÅN TRUYEÀN THOÂNG NOÁI TIEÁP a/ Giao dieän RS-232 Giao dieän noái tieáp RS-232 hay coøn goïi laø V.24 moâ taû giao dieän aùp thuaàn tuùy.Caùc möùc logic High hoaëc Low ñeàu laø möùc ñieän aùp coù giaù trò töø +5V ñeán +15V hoaëc –5V ñeán –15V so vôùi ñöôøng daãn mass chung. Öu ñieåm ñaëc bieät cuûa loaïi giao dieän RS-232 naøy laø vieäc xöû lyù raát ñôn giaûn (cuï theå hôn laø tìm loãi raát nhanh) ñöôïc duøng raát phoå bieán vaø do vaäy khaû naêng giao tieá raát lôùn, haàu nhö taát caû caùc maùy tính PC ñeàu coù coång RS-232, soá thieát bò ngoaïi vi gheùp noái vôùi maùy tính qua giao dieän RS-232 cuõng coù soá löôïng ñoâng nhaát.Veà maët nhöôïc ñieåm, tröôùc heát phaûi keå ñeán khoaûng caùch truyeàn raát haïn cheá, sau ñaáy laø toác ñoä truyeàn döõ lieäu cöïc ñaïi chöa phaûi laø cao. b/ Giao dieän RS-422 Veà cô baûn coù theå xem giao dieän RS-422 nhö moät giao dieän caûi tieán töø RS-232.Nhöõng nhöôïc ñieåm nhö toác ñoä truyeàn khoâng cao cuõng nhö ñoä daøi ñöôøng daãn bò haïn cheá ôû giao dieän RS-232 ñeàu ñaõ ñöôïc khaéc phuïc.Giao dieän RS-422 cho pheùp taêng toác ñoä truyeàn döõ lieäu leân ñeán vaøi Mbit/s.Caùc vi maïch ñeäm thoâng thöôøng vaãn duøng cho giao dieän RS-232 nhö MAX 232 ñeàu khoâng ñöôïc söû duïng cho RS-422. Caùch truyeàn döõ
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
46
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù lieäu cuõng ñöôïc thay ñoåi nhöng veà baûn chaát thì vaãn laø truyeàn noái tieáp.Möùc logic khoâng tính theo söï thay ñoåi möùc tín hieäu so vôùi mass maø tính theo tín hieäu vi sai giöõa 2 ñöôøng daãn. Boä ñeäm ñöôøng daãn cuûa giao dieän RS-422 taïo ra 1 ñieän aùp vi sai baèng 5V, ñöôïc truyeàn qua daây 2 sôïi xoaén (twisted pair). Boä phoái hôïp möùc beân nhaän seõ ño vi sai ñieän aùp ñeå phaân bieät giöõa möùc High vaø Low. Baèng giao dieän naøy coù theå taêng khoaûng caùch truyeàn döõ lieäu leân ñeán 1200m. c/ Giao dieän RS-485 Giao dieän RS-485 laø keát quaû cuûa vieäc môû roäng tieâu chuaån RS-422. Vôùi cuøng ñoä daøi ñöôøng truyeàn vaø toác ñoä truyeàn cho pheùp giao dieän naøy cho pheùp nhieàu hôn 2 thaønh vieân tham gia (coù theå ñeán 32 thaønh vieân). Coù theå xem giao dieän RS-485 nhö 1 bus bôûi vì soá löôïng thaønh vieân tham gia truyeàn thoâng treân giao dieän RS-485 khoâng bò haïn cheá bôûi con soá 2 do ñaët tính 3 traïng thaùi cuûa töøng thaønh vieân rieâng leû. Möùc logic “1” ñöôïc aán ñònh töông töï nhö ôû giao dieän RS-422 nghóa laø naèm trong vuøng ñieän aùp töø -1,5V ñeán –6V,coøn möùc logic “0” thì trong vuøng ñieän aùp töø +1,5V ñeán +6V. Boä ñeäm ñöôøng daãn cuûa giao dieän RS-485 taïo ra 1 ñieän aùp vi sai baèng 5V treân 2 daây daãn truyeàn döõ lieäu,gioáng nhö trong tröôøng hôïp RS-422. 3/CHUAÅN RS-232
Chuaån RS-232 ñöôïc cheá taïo naêm 1969 do EIA saûn xuaát ñeå chæ roõ caùc keát noái ñöôøng ñieàu khieån vaø döõ lieäu noái tieáp giöõa moät modem vaø moät thieát bò ñaàu cuoái (terminal) hoaëc maùy tính. Chuaån naøy xem modem nhö laø moät DCE (Data Communication Equipment) vaø maùy tính hay thieát bò ñaàu cuoái nhö laø DTE (Data Terminal Equipment). Chuaån RS-232 duøng vôùi toác ñoä truyeàn döõ lieäu lôùn nhaát laø 20Kbps vôùi khoaûng caùch truyeàn lôùn nhaát gaàn 15m. Ñaây laø moät daïng giao tieáp loaïi TTL + boä kích ñöôøng daây khoâng caân baèng.
Vieäc moâ taû chuaån naøy ñöôïc chia laøm ba phaàn : Caùc ñaëc ñieåm kyõ thuaät veà ñieän, moâ taû caùc ñöôøng döõ lieäu, ñieàu khieån vaø söû duïng boä keát noái chaân ra. a/ Ñaëc ñieåm kyõ thuaät veà ñieän cuûa RS-232
Möùc ñieän aùp logic cuûa RS-232 laø hai khoaûng ñieän aùp giöõa +15V vaø –15V. Caùc ñöôøng döõ lieäu söû duïng möùc logic aâm : logic 1 coù ñieän theá giöõa -5V vaø –15V; logic 0 coù ñieän theá giöõa +5V vaø +15V. Tuy nhieân caùc ñöôøng ñieàu khieån (ngoaïi tröø ñöôøng TDATA vaø RDATA) söû duïng möùc logic döông : giaù trò TRUE = +5V ñeán +15V; vaø FALSE = -5V ñeán –15V.
ÔÛ chuaån giao tieáp naøy, giöõa ngoõ ra boä kích phaùt vaø ngoõ vaøo boä kích thu coù möùc nhieãu ñöôïc giôùi haïn laø 2V. Do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
47
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù vaäy ngöôõng lôùn nhaát cuûa ngoõ vaøo laø 3V, traùi laïi möùc 5V laø ngöôõng nhoû nhaát ñoái vôùi ngoõ ra. Ngoõ ra boä kích phaùt khi khoâng taûi coù ñieän aùp laø 25V.
Caùc ñaëc ñieåm veà ñieän bao goàm :- RL (Ñieän trôû taûi) : ñöôïc nhìn töø boä kích phaùt phaûi coù
giaù trò giöõa 7k vaø 3k.- CL (Ñieän dung taûi) : ñöôïc nhìn töø boä kích phaùt khoâng
ñöôïc vöôït quaù 2500pF.- Ñeå ngaên caûn söï giao ñoäng quaù möùc, toác ñoä thay
ñoåi (Slow Rate) cuûa ñieän aùp khoâng ñöôïc vöôït quaù 30V/s.
- Ñoái vôùi caùc ñöôøng ñieàu khieån, thôøi gian chuyeån cuûa tín hieäu (töø TRUE sang FALSE, hoaëc töø FALSE sang TRUE) khoâng ñöôïc vöôït quaù 1msec. Ñoái vôùi caùc ñöôøng döõ lieäu, thôøi gian chuyeån (töø 1 sang 0 hay töø 0 sang 1) phaûi khoâng vöôït quaù 4% thôøi gian cuûa 1 bit hay 1msec.
b/ Caùc ñöôøng döõ lieäu vaø ñieàu khieån cuûa RS-232 Caùc ñöôøng döõ lieäu :- TDATA (Transmitter data) : döõ lieäu ñöôïc truyeàn ñi töø
modem treân maïng ñieän thoaïi.- RDATA (Receiver data) : döõ lieäu ñöôïc thu bôûi modem
treân maïng ñieän thoaïi.Caùc ñöôøng baùo thieát bò saün saøng :- DSR (Data Reset Ready) : ñeå baùo raèng modem ñaõ saün
saøng.- DTR (Data Terminal Ready) : ñeå baùo raèng thieát bò ñaàu
cuoái ñaõ saün saøng.Caùc ñöôøng baét tay baùn song coâng :- RTS (Request To Send) : ñeå baùo raèng thieát bò ñaàu cuoái
yeâu caàu phaùt döõ lieäu.- CTS (Clear To Send) : modem ñaùp öùng yeâu caàu gôûi döõ
lieäu cuûa thieát bò ñaàu cuoái, cho bieát raèng thieát bò ñaàu cuoái coù theå söû duïng keânh ñeå truyeàn döõ lieäu.
Caùc ñöôøng traïng thaùi soùng mang vaø tín hieäu ñieän thoaïi :- CD (Carrier Detect) : modem baùo cho thieát bò ñaàu cuoái
bieát raèng ñaõ nhaän ñöôïc moät soùng mang hôïp leä töø maïng ñieän thoaïi.
- RI (Ring Indicator) : caùc modem töï ñoäng traû lôøi baùo raèng ñaõ phaùt hieän moät tín hieäu chuoâng töø maïng ñieän thoaïi.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
48
TDATA (Transmitter data)RDATA (Receiver data)
DTR (Data terminal ready)
DSR (Data set ready)
RTS (Request to send)
CD (Carrier detect)RI (Ring indicator)Signal groundChassis/Frame Ground
DTEDTE
(3) 2
Maïng ñieän thoaïi
(2) 3
(4) 20(6) 6(7) 4
2 (3)
3 (2)
20 (4)
6 (6)
4 (7)
5 (8)
8 (1)22 (9)7 (5)
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Boä keát noái RS-232 :Boä keát noái 9 chaân vaø 25 chaân :
P3
CONNECTOR DB9
5 9 4 8 3 7 2 6 1
P8
CONNECTOR DB25
13251224112310229218207196185174163152141
Caùc IC kích phaùt vaø thu cuûa RS-232 :Nhôø tính phoå bieán cuûa giao tieáp RS-232, ngöôøi ta ñaõ cheá
taïo ra caùc IC kích phaùt vaø thu. Hai vi maïch nhö vaäy ñöôïc Motorola saûn xuaát laø IC kích phaùt MC1488 vaø IC thu MC1489 coù daïng voû vuoâng. Moãi IC kích phaùt 1488 nhaän moät tín hieäu möùc TTL vaø chuyeån thaønh tín hieäu ôû ngoõ ra töông thích vôùi möùc ñieän aùp cuûa RS-232, IC thu 1489 phaùt hieän caùc möùc vaøo cuûa RS-232 vaø chuyeån chuùng thaønh caùc ngoõ ra möùc TTL.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
49
CTS (Clear to send)(8) 5(1) 8
(9) 22
(5) 7
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
PHAÀN VIIIÑOÄNG CÔ BÖÔÙC
1/GIÔÙI THIEÄU ÑOÄNG CÔ BÖÔÙC 1/Phaân loaïi ñoäng cô böôùc : a/ Giôùi thieäu :
Coù nhieàu caùc ñeå phaân loaïi ñoäng cô böôùc nhöng veà maët caáu taïo ñoäng cô böôùc coù theå ñöôïc chia laøm hai loaïi : ñoäng cô böôùc nam chaâm vónh cöûu vaø ñoäng cô böôùc töø trôû thay ñoåi (ngoaøi ra coøn coù moät loaïi ñoäng cô söû duïng caû hai nguyeân lyù treân ñöôïc goïi laø ñoäng cô hoãn hôïp). Neáu baïn khoâng theå bieát ñöôïc ñoäng cô cuûa baïn laø loaïi gì qua nhaõn ñöôïc ghi treân ñoäng cô thì baïn coù theå phaân bieät ñöôïc chuùng khi khoâng coù nguoàn cung caáp : ñoäng cô böôùc nam chaâm vónh cöûu coù xu höôùng “aên khôùp” vôùi nhau khi ta duøng tay quay rotor cuûa ñoäng cô; trong khi ñoù ñoäng cô böôùc töø trôû thay ñoåi haàu nhö laø quay troøn moät caùch töï nhieân khoâng bò giöõ laïi (chuùng coù theå bò khôùp nheï vì töø dö coøn hieän höõu trong rotor). Ngöôøi ta cuõng coù theå phaân bieät hai loaïi baèng ñoàng hoà Ohm : Ñoäng cô böôùc töø trôû thay ñoåi thöôøng coù 3 (coù theå coù 4) ñaàu daây, vôùi moät ñaàu daây chung; trong khi ñoù ñoäng cô böôùc nam chaâm vónh cöûu thöôøng coù hai cuoän daây ñoäc laäp vôùi nhau, coù hoaëc khoâng coù daây reõ. Daây reõ thöôøng coù trong ñoäng cô böôùc nam chaâm vónh cöûu ñôn cöïc.
Ñoä lôùn cuûa böôùc lôùn hay nhoû tuøy thuoäc vaøo loaïi ñoäng cô. Böôùc lôùn nhaát khoaûng 90 ñoä/böôùc, trong khi böôùc nhoû nhaát coù theå coù laø 1.8 hay coù khi 0.72 ñoä/böôùc. Vôùi moät boä ñieàu khieån, ñoäng cô böôùc ñeàu coù theå hoaït ñoäng ôû cheá ñoä half-step, hoaëc moät soá boä ñieàu khieån coù theå ñieàu khieån ñöôïc caùc böôùc raát nhoû micro-step.
Caû hai loaïi ñoäng cô böôùc nam chaâm vónh cöûu cuõng nhö ñoäng cô böôùc töø trôû thay ñoåi, khi ta cung caáp naêng löôïng cho moät cöïc, rotor (khoâng coù taûi) seõ töï giöõ vò trí coá ñònh cuûa noù (nhôø moment giöõ) vaø ñoäng cô chæ coù theå quay khi taùc
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
50
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ñoäng moät moment lôùn hôn moment giöõ cuûa ñoäng cô, taïi ñieåm naøy rotor seõ quay, vaø seõ coá giöõ ôû ñieåm keá tieáp.
b/ Ñoäng cô böôùc töø trôû thay ñoåi :
Hình : Ñoäng cô böôùc töø trôû thay ñoåiNeáu ñoäng cô böôùc coù 3 caëp cöïc thì ñöôïc keát noái nhö
hình veõ …. Vôùi moät ñaàu daây chung cho 3 cuoän daây. Thoâng thöôøng trong khi söû duïng ñaàu daây chung naøy thöôøng noái vôùi cöïc döông cuûa nguoàn cung caáp, caùc ñaàu daây coøn laïi seõ ñöôïc noái vôùi möùc thaáp moät caùch tuaàn töï.
Hình veõ treân laø moät ñoäng cô böôùc töø trôû thay ñoåi coù böôùc laø 30 ñoä. Rotor coù 4 raêng vaø stator coù 6 cöïc vôùi moãi cuoän daây quaán quanh 2 cöïc ñoái dieän. Khi cuoän daây soá 1 ñöôïc caáp ñieän, raêng rotor thöù X bò huùt veà phía cöïc cuûa cuoän daây naøy. Khi doøng ñieän qua cuoän soá 1 ngöng, cuoän soá 2 ñöôïc caáp ñieän thì rotor seõ quay 30 ñoä theo chieàu kim ñoàng hoà, luùc ñoù raêng rotor thöù Y seõ thaúng haøng vôùi cöïc soá 2.
Ñeå ñieàu khieån cho ñoäng cô quay lieân tuïc ta chæ vieäc caáp ñieän cho 3 cuoän daây moät caùch tuaàn töï nhö sau :
Cuoän daây 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1Cuoän daây 2 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0Cuoän daây 3 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 Thôøi gian --->
Ñoái vôùi caùc ñoäng cô coù 4 hay 5 cuoän daây thì caàn coù 5 hay 6 ñaàu daây vaø caùch ñieàu khieån thì töông töï nhö caùch ñieàu khieån ñoäng cô coù 3 cuoän daây. Nhöng caàn phaûi löu yù thöù töï kích caùc cuoän daây ñeå ñoäng cô hoaït ñoäng.
Hình.. laø moät ñoäng cô vôùi böôùc laø 30 ñoä vì chæ söû duïng moät soá ít rang rotor vaø cöïc stator. Neáu ta cheá taïo theâm nhieàu raêng rotor vaø cöïc stator thì seõ ñöôïc ñoäng cô vôùi böôùc nhoû hôn.
c/ Ñoäng cô ñôn cöïc :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
51
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình : Ñoäng cô böôùc ñôn cöïcÑoäng cô böôùc ñôn cöïc vôùi 5 hay 6 ñaàu daây ra thöôøng coù
daïng nhö hình veõ…Moãi cuoän daây coù moät ñaàu chung laø ñieåm giöõa cuûa cuoän daây. Khi vaän haønh ñieåm giöõa naøy thöôøng ñöôïc noái vôùi nguoàn cung caáp, moãi ñaàu coøn laïi seõ ñöôïc tuaàn töï noái xuoáng mass. Tuøy theo ñaàu naøo ñöôïc noái mass maø ta xaùc ñònh ñöôïc chieàu quay cuûa rotor.
Hình…laø moät ñoäng cô coù böôùc 30 ñoä. Rotor cuûa ñoäng cô laø moät nam chaâm vónh cöûu coù 6 cöïc (3 cöïc baéc, 3 cöïc nam) ñöôïc boá trí voøng quanh rotor. Ñeå cho böôùc cuûa rotor nhoû hôn nöõa, rotor phaûi coù nhieàu cöïc ñoái xöùng hôn. Ngaøy nay ñoäng cô böôùc nam chaâm vónh cöûu coù theå ñaït ñeán 1.8 ñoä/böôùc.
Nhö trong hình veõ, doøng ñieän chaïy töø ñieåm giöõa cuûa cuoän daây ñeán ñieåm cuoái laøm cho ñænh treân cuûa stator trôû thaønh cöïc baéc trong khi ñænh döôùi laø cöïc nam, noù huùt rotor veà vò trí nhö hình veõ.
Ñeå ñieàu khieån rotor quay ta chæ vieäc caáp ñieän cho hai cuoän daây nhö sau :
Cuoän daây 1a 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1Cuoän daây 1b 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0Cuoän daây 2a 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0Cuoän daây 2b 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 Thôøi gian --->
Cuoän daây 1a 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 Cuoän daây 1b 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0Cuoän daây 2a 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 Cuoän daây 2b 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 Thôøi gian --->
Chuù yù raèng hai nöõa cuûa cuøng moät cuoän daây khoâng bao giôø ñöôïc caáp ñieän ñoàng thôøi. Caû hai caùch kích nhö treân ñeàu laøm cho ñoäng cô böôùc 1 böôùc taïi moät thôøi ñieåm. Caùch ñaàu tieân chæ coù moät cuoän daây taïi moät thôøi ñieåm ñöôïc caáp ñieän neân tieâu toán naêng löôïng ít hôn. Caùch thöù hai thì taïi moät thôøi ñieåm coù hai cuoän daây ñöôïc caáp ñieän vaø nhö vaäy noù
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
52
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù toán nhieàu naêng löôïng hôn, nhöng buø laïi noù cung caáp moät moment lôùn gaáp 1,4 laàn caùch thöù nhaát.
Vò trí moãi böôùc ôû caùc caùch treân laø khaùc nhau neân khi phoái hôïp hai caùch kích treân ta seõ ñöôïc half-step. Nguyeân taéc kích nhö sau :Cuoän daây 1a 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 00 1 1 1Cuoän daây 1b 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0Cuoän daây 2a 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1Cuoän daây 2b 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 Thôøi gian ---> d/ Ñoäng cô löôõng cöïc :
Hình : Ñoäng cô böôùc löôõng cöïcÑoäng cô böôùc löôõng cöïc nam chaâm vónh cöûu ñöôïc caáu
taïo veà phaàn cô khí gioáng heät loaïi ñôn cöïc, nhöng moãi cuoän daây thì ñôn giaûn hôn nhieàu thay vì ñöôïc chia laøm hai nhö ôû ñoäng cô ñôn cöïc. Tuy nhieân maïch ñieàu khieån ñeå ñoåi chieàu quay ñoäng cô löôõng cöïc thì phöùc taïp hôn nhieàu.
Maïch ñieàu khieån cho moãi ñoäng cô yeâu caàu moät maïch caàu H (H-bridge) cho moãi cuoän daây. Noùi ngaén goïn maïch caàu H cho pheùp cung caáp naêng löôïng moät caùch ñoäc laäp moãi ñaàu cuoän daây. Tín hieäu ñieàu khieån tuaàn töï cho moãi böôùc ñöôïc cho döôùi ñaây. Daáu +,- cho ta thaáy chieàu cuûa doøng ñieän trong moãi cuoän daây.
Nuùt 1a +---+---+---+---
Nuùt 1b --+---+---+---+- Nuùt 2a -+---+---+---+--
Nuùt 2b ---+---+---+---+ Thôøi gian --->Hoaëc laøNuùt 1a ++--++--++--++--
Nuùt 1b --++--++--++--++Nuùt 2a -++--++--++--++-
Nuùt 2b +--++--++--++--+ Thôøi gian --->
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
53
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Thoâng thöôøng IC H-bridge coù moät tín hieäu cho pheùp xuaát vaø moät tín hieäu khaùc duøng ñeå ñieàu khieån chieàu quay cho moãi cöïc.
Cho pheùp 1 1010101010101010 1111111111111111Chieàu quay 1 1x0x1x0x1x0x1x0x 1100110011001100Cho pheùp 2 0101010101010101 1111111111111111Chieàu quay 2 x1x0x1x0x1x0x1x0 0110011001100110 Thôøi gian --->
Ta coù theå nhaän ra ñoäng cô böôùc löôõng cöïc nam chaâm vónh cöûu 4 ñaàu daây baèng caùch ño ñieän trôû giöõa caùc ñaàu daây ta seõ xaùc ñònh ñöôïc hai cuoän daây. Trong moãi cuoän daây neáu hai ñaàu ñöôïc maéc noái tieáp thì coù theå ñoäng cô aáy söû duïng ñieän aùp cao. Neáu chuùng ñöôïc maéc song song thì coù theå duøng ñieän aùp thaáp. Neáu chuùng ñöôïc noái noái tieáp vôùi ñieåm chung thì coù theå söû duïng nhö laø ñoäng cô ñôn cöïc.
e/ Ñoäng cô nhieàu pha :
Hình: Ñoäng cô 5 pha maéc hình saoÑoäng cô naøy hieám thaáy trong caùc ñoäng cô böôùc nam
chaâm vónh cöûu. Daây cuûa taát caû caùc cuoän daây ñöôïc noái noái tieáp tuaàn hoaøn, vôùi moät nuùt giöõa hai caëp cuoän daây treân ñöôøng troøn. Phoå bieán nhaát laø loaïi 3 pha hay 5 pha. Ñieàu khieån ñoäng cô naøy caàn ½ caàu H cho moãi cöïc cuûa rotor, nhöõng loaïi ñoäng cô naøy coù theå cung caáp moment lôùn hôn so vôùi nhöõng ñoäng cô khaùc cuøng kích thöôùc. Ñoäng cô 5 pha coù theå ñaït tôùi 0.72 ñoä/böôùc
Vôùi loaïi ñoäng cô 5 pha, seõ coù 10 böôùc cho moãi chu kyø nhö sau :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
54
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Nuùt 1 + + + - - - - - + + + + + - - - - - + + Nuùt 2 - - + + + + + - - - - - + + + + + - - -Nuùt 3 + - - - - - + + + + + - - - - - + + + +Nuùt 4 + + + + + - - - - - + + + + + - - - - -Nuùt 5 - - - - + + + + + - - - - - + + + + + - Thôøi gian --->
ÔÛ ñaây, nhö trong tröôøng hôïp ñoäng cô böôùc nam chaâm vónh cöûu ñôn cöïc, moãi cuoän daây ñöôïc noái vôùi nguoàn cung caáp hay noái mass. Ñeå yù raèng taïi moãi böôùc chæ coù moät ñaàu bò ñaûo chieàu.
Chuù yù raèng moät soá ñoäng cô 5 pha loaïi naøy coù theå coù 5 cuoän daây maéc song song vôùi 10 ñaàu daây. Nhöng loaïi daây naøy ñöôïc noái sao duøng 5 nöûa caàu H ñeå ñieàu khieån, hoaëc moãi cuoän daây coù theå ñöôïc ñieàu khieån bôûi maïch caàu H ñaày ñuû.
2/ MOÄT SOÁ MAÏCH ÑIEÀU KHIEÅN ÑOÄNG CÔ BÖÔÙC
Vì ñoäng cô söû duïng trong luaän vaên laø loaïi nam chaâm vónh cöûu neân ôû ñaây chæ xin giôùi thieäu moät soá maïch ñieàu khieån daønh cho loaïi ñoäng cô naøy. a/ Sô ñoà ñieàu khieån cô baûn :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
55
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình : Sô ñoà ñieàu khieån ñoäng cô böôùc nam chaâm vónh cöûu ñôn cöïc
Boä ñieàu khieån seõ göûi caùc tín hieäu ñieàu khieån töông öùng ñeå ñoùng hay môû khoùa cho pheùp naêng löôïng ñöôïc cung caáp cho caùc cuoän daây moät caùch tuaàn töï laøm cho ñoäng cô quay.
Ñeå traùnh doøng ñieän caûm öùng ta maéc theâm caùc diode nhö sau :
Hình Maïch ñieàu khieån coù maéc theâm diodeNhöõng diode theâm vaøo laø baét buoäc vì cuoän daây cuûa
ñoäng cô khoâng phaûi laø hai phaàn ñieän caûm rieâng bieät maø chuùng ñöôïc noái chung vôùi nhau nhö hình veõ vaø ñöôïc noái vôùi moät ñieän aùp coá ñònh. Trong hai ñaàu daây coøn laïi, neáu moät ñaàu bò keùo xuoáng thaáp thì ñaàu coøn laïi phaûi ñöôïc keùo leân cao vaø ngöôïc laïi. Khi moät khoùa chuyeån töø traïng thaùi ñoùng sang ngaét, doøng ñieän caûm öùng sinh ra coù theå seõ laøm hö maïch, ñieàu naøy ñöôïc haïn cheá baèng diode.
Moät tuï ñieän cuõng coù theå ñöôïc söû duïng ñeå haïn cheá ñieàu treân :
Hình: Maïch ñieàu khieån coù maéc theâm tuï b/ Moät soá maïch thöïc teá :
Trong caùc maïch ôû treân, chi tieát veà caùc khoùa ñöôïc boû qua, trong caùc kyõ thuaät neâu treân treân nguyeân taéc moïi loaïi khoùa ñeàu coù theå ñöôïc söû duïng nhö : Transistor, MosFET…
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
56
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình: Maïch khoùaMoïi khoùa treân ñaây ñeàu töông thích TTL. Nguoàn cung caáp
5V ñöôïc duøng ñeå cung caáp cho maïch. Ta duøng 7407 Open-collector ñeå laùi nhö hình treân. Vôùi nhöõng motor coâng suaát (5V24V) chæ caàn duøng ñôn giaûn nhö vaäy töông töï ñoäng cô DC.
Transistor SK3180 ñöôïc duøng ôû hình treân laø transistor coâng suaát gheùp Darlington vôùi heä soá khueách ñaïi hôn 1000; nhö vaäy 10mA qua ñieän trôû 470 ñuû ñeå chaïy ñöôïc motor. Boä ñeäm 7407 duøng ñeå laùi transistor gheùp Darlington coù theå ñöôïc thay theá baèng moïi ICñieän aùp cao Open-collector maø coù theå chòu ñöôïc doøng nhoû nhaát laø 10mA. Trong tröôøng hôïp transistor bò hö, IC Open-collector aùp cao duøng ñeå baûo veä phaàn maïch logic coøn laïi ñoái vôùi nguoàn ñoäng cô.
IRL 540 laø transistor coâng suaát tröôøng, noù ñöôïc cheá taïo coù theå chòu ñöôïc doøng 20A, ñieän aùp 100VDC keát quaû laø transistor naøy coù theå chòu ñöôïc doøng ñieän caûm öùng maø khoâng caàn thieát phaûi coù diode baûo veä. Ngoaøi ra transistor naøy coù thôøi gian ñoùng ngaét khoùa raát cao. Nhö vaäy neáu duøng diode baûo veä ta phaûi ñi keøm vôùi tuï ñieän. Trong tröôøng hôïp transistor bò hoûng, zener diode vaø ñieän trôû 100 seõ baûo veä maïch TTL.
Trong caùc thieát bò maø doøng cuoän daây nhoû hôn 500mA, hoï ULN200x cuûa haõng Allergro Microsystem, DS200x cuûa haõng National Semiconductor, cuõng nhö MC1413 ñeàu coù theå söû duïng toát.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
57
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình: IC ñieàu khieån motor böôùc hoï ULN2003IC ULN2003 laø moät maûng goàm 7 transistor gheùp
darlington (töông thích TTL).Ñieän trôû cöïc Base cuûa moãi transistor gheùp darlington
ñöôïc tính toaùn sao cho töông thích TTL. Cöïc E moãi transistor NPN gheùp darlington ñeàu ñöôïc noái xuoáng chaân soá 8. Moãi transistor ñeàu ñöôïc baûo veä bôûi 2 diode (baûo veä ngaén maïch vaø baûo veä doøng ñoå ngöôïc veà ôû moãi transistor, taát caû caùc diode naøy ñeàu ñöôïc noái vôùi chaân soá 9, neáu chaân soá 9 naøy ñöôïc noái vôùi aùp döông cuûa VCC thì diode naøy coù chöùc naêng baûo veä transistor choáng laïi doøng caûm öùng).
3/DOØNG GIÔÙI HAÏN CUÛA ÑOÄNG CÔ BÖÔÙC a/ Giôùi thieäu :
Moät soá ñoäng cô böôùc loaïi nhoû duøng cho ñaàu töø cuûa ñóa meàm trong PC thöôøng duøng ñieän aùp DC thaáp vaø doøng qua moãi cuoän daây cuûa motor thöôøng ñöôïc giôùi haïn baèng chính ñieän trôû noäi cuûa cuoän daây motor. Ñoái vôùi nhöõng motor coù moment lôùn thì ngöôïc laïi, ñieän trôû cuûa moãi cuoän daây raát nhoû, khi motor hoaït ñoäng thöôøng caàn moät maïch haïn doøng beân ngoaøi.
Khi ñieàu khieån theo kieåu micro-step, böôùc cuûa ñoäng cô raát nhoû cuõng ñoøi hoûi moät boä haïn doøng ngoaøi. b/ Haïn cheá doøng giôùi haïn :
Caùch ñôn giaûn nhaát ñeå haïn cheá doøng giôùi haïn laø duøng ñieän trôû. Ñaàu nhöõng naêm 1980 caùc nhaø saûn xuaát ñoäng cô hoïp laïi vaø ra quyeát ñònh trong data sheet cuûa moïi ñoäng cô ñeàu phaûi keøm theo maïch haïn doøng. Ví duï nhö trong hình sau ñaây :
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
58
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình: Maïch ñieàu khieån coù haïn doøngR1 trong hình giôùi haïn doøng qua cuoän daây. Cho giôùi haïn
cuûa doøng ñieän laø I vaø trôû cuûa cuoän daây motor laø R, theo ñònh luaät Ohm ta tính ñöôïc aùp cung caáp cöïc ñaïi laø I(RW+R1). Cho töø caûm cuûa cuoän daây motor laø LW, haèng soá thôøi gian cho
cuoän daây motor laø .
Hình: Ñoà thò doøng ñieän cuûa cuoän daâyHình treân cho thaáy aûnh höôûng cuûa ñieän trôû vaø ñieän
aùp heä thoáng vôùi doøng ñieän trong cuoän daây.Ñieän trôû R2 chæ duøng cho ñoäng cô ñôn cöïc. Trong maïch
caàu H duøng cho ñoäng cô löôõng cöïc, khi caùc khoùa ñeàu ñoùng thì doøng töø ñaát tôùi nguoàn cung caáp qua trôû R1, vaø nhö vaäy doøng nhanh choùng bò trieät tieâu. Trong ñoäng cô ñôn cöïc R2 ñöôïc duøng ñeå laøm ñöôïc ñieàu ñoù.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
59
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
PHAÀN IXTOÅNG KEÁT 1/ ÖU ÑIEÅM Coù theå noùi ñaây laø moät ñeà taøi luaän vaên toát nghieäp raát hay , noù giuùp sinh vieân cuûng coá nhöõng kieán thöùc ñaõ hoïc treân lôùp , ñoàng thôøi coù theâm nhöõng kinh nghieäm thöïc teá vaø nhöõng kieán thöùc môùi khi nghieân cöùu thöïc hieän. Trong luaän vaên naøy coù aùp duïng moät soá giaûi thuaät raát hay giuùp naâng cao toác ñoä xöû lyù , ví duï nhö giaûi “2 trung ñieåm sinh ñöôøng troøn”. Luaän vaên cuõng giuùp ta coù ñöôïc nhöõng hieåu bieát cô baûn nhaát veà AutoCad , moät trong nhöõng phaàn meàm kyõ thuaät ñöôïc söû duïng roäng raõi nhaát. 2/ HAÏN CHEÁ Do thôøi gian thöïc hieän luaän vaên coù haïn neân maùy veõ chæ coù theå veõ ñöôïc caùc ñöôøng cô baûn nhö LINE , POLYLINE , CIRCLE , SPLINE. Rieâng vôùi ñöôøng SPLINE toác ñoä veõ laø khaù chaäm. Do thôøi gian coù haïn maø baûn thaân quyeån baùo caùo luaän vaên naøy cuõng chæ noùi ñöôïc nhöõng yù cô baûn nhaát maø khoâng theå neâu leân chi tieát quaù trình thöïc hieän luaän vaên vaø haún cuõng khoâng traùnh khoûi nhöõng sô soùt trong khi ghi cheùp , em xin kính mong thaày coâ thoâng caûm.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
60
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
PHAÀN XPHUÏ LUÏC
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
61
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
Hình: Sô ñoà nguyeân lyù phaàn cöùng
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
P 0 . 3
TXD
R 9
R
P 0 . 0
P 1 . 1
P e n _ O u t
R XD
1 0 0
V C C
P 2 . 1
P 0 . 5
P 0 . 7
P 1 . 6
P 2 . 3
P 0 . 5
P 1 . 7
1 2 V
P 1 . 3
Y _ 1
V C C
P 1 . 4
1 2 V
Y _ 3
D 9
A 1 0 1 5
XTA L 1
P2
.2
X_ 2
P 2 . 5
2 2 0 / 1 W
V C C
X_ 0
P E N _ I N
P 3 . 3
A 1 0 1 5
P 0 . 2
C 2
2 2 p
V C C
S W 5
4 K 7
Ke
y2
X_ 2
V C C
2 2 / 1 w
V C C
C O M _ 3
P 3 . 2
12
D 4
C M T1 2
P 1 . 0
D 1
2 2 0
V C C
R S T
D 7
C M T1 2
D 4 6 8
V C C
P 1 . 2
X_ 0
P 3 . 4V C C
A 1 0 1 5
S W 3
P 0 . 1
2 2 0
S W 2
P 2 . 2
P 0 . 7
S W 4
8 K 2
K e y 1
2 2 0 u / 2 5 v
C O M _ 2
P e n _ O u t
H 1 0 6 1
1 0 u F
V C C
2 2 u / 3 5 v
0 . 1 u F
Y _ 3
0 . 1 u F
2 2 0
R
P 0 . 2
1 2 V
V C C
P 1
C O N N E C TO R D B 9
162738495
V C CP 0 . 2
G N D
U 1 3
4 0 5 0
357 6
4
9
18
1 11 41 3 1 6
2
1 01 21 5
I 1I 2I 3 O 3
O 2
I 4
VC
CG
ND
I 5I 6N C 1 N C 2
O 1
O 4O 5O 6
0 . 1 u F
0 . 1 u F
2 2 0
P 2 . 6
C o il
P 0 . 6
P 1 . 5
P 0 . 3
K e y 3
P 0 . 0
P 3 . 2
R XD
C M T1 2D 5
C M T1 2
-1 2 V
U 1 1
7 4 H C 5 7 3
1
10
1 1
20
1 91 81 71 61 51 41 31 2
23456789
O E
GN
D
L E
VC
C 1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q
1 D2 D3 D4 D5 D6 D7 D8 D
D 6
C M T1 2
TXD
P 0 . 4
P 0 . 1
P 3 . 4
1 0 u F
C
P 0 . 7
R 7
R
J P 7
H E A D E R 2
12
XTA L 2
V C C
1 2 V
P 2 . 0
0 . 1 u F
A 1 0 1 5
D 3
C M T1 2
V C C
P 3 . 5
R 1 9R
C
1 0 K1 2
3456789
1 0 u F
P 1 . 7
P 2 . 4
A 1 0 1 5
P2
.1
Y _ 0
R S T
-1 2 V
Y _ 2
P 0 . 3
X_ 3
X_ 3
P 1 . 1
P 3 . 6
X_ 1
U 1 8
M A X2 3 2 _ 0
1 38
1 1
1 0
1
34
5
261 2
9
1 4
7
16
15
R 1 I NR 2 I N
T1 I N
T2 I N
C 1 +
C 1 -C 2 +
C 2 -
V +V -R 1 O U T
R 2 O U T
T1 O U T
T2 O U T
VC
CG
ND
P 2 . 5
Y _ 0
2 K 2
P 0 . 3
Ke
y1
1 342
J P 1
H E A D E R 2
12
U 1 4
4 0 5 0
357 6
4
9
18
1 11 41 3 1 6
2
1 01 21 5
I 1I 2I 3 O 3
O 2
I 4
VC
CG
ND
I 5I 6N C 1 N C 2
O 1
O 4O 5O 6
XTA L 2
D 8
V C C
Ke
y0
P 0 . 0
2 2 0
P 3 . 7
C O M _ 2
P 3 . 5
P 0 . 6
P 0 . 4
P 2
C O N N E C TO R D B 2 5
1 32 5
1 22 4
1 12 3
1 02 2
92 1
82 0
71 9
61 8
51 7
41 6
31 5
21 4
1
C 3
2 2 p
2 7 0
P 2 . 4
R 1 0
P 0 . 0
X_ 1
P2
.3
P 0 . 4
U 1
A T8 9 L V 5 1
91 81 9
20
2 9
3 0
3 1
40
12345678
2 12 22 32 42 52 62 72 8
1 01 11 21 31 41 51 61 7
3 93 83 73 63 53 43 33 2
R S TXTA L 2XTA L 1
GN
D
P S E N
A L E / P R O G
E A / V P P
VC
C
P 1 . 0P 1 . 1P 1 . 2P 1 . 3P 1 . 4P 1 . 5P 1 . 6P 1 . 7
P 2 . 0 / A 8P 2 . 1 / A 9
P 2 . 2 / A 1 0P 2 . 3 / A 1 1P 2 . 4 / A 1 2P 2 . 5 / A 1 3P 2 . 6 / A 1 4P 2 . 7 / A 1 5
P 3 . 0 / R XDP 3 . 1 / TXD
P 3 . 2 / I N TOP 3 . 3 / I N T1
P 3 . 4 / TOP 3 . 5 / T1
P 3 . 6 / W RP 3 . 7 / R D
P 0 . 0 / A D 0P 0 . 1 / A D 1P 0 . 2 / A D 2P 0 . 3 / A D 3P 0 . 4 / A D 4P 0 . 5 / A D 5P 0 . 6 / A D 6P 0 . 7 / A D 7
U 1 0
7 4 H C 5 7 3
1
10
1 1
20
1 91 81 71 61 51 41 31 2
23456789
O E
GN
D
L E
VC
C 1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q
1 D2 D3 D4 D5 D6 D7 D8 D
R 1 8R
o . 1 u F
U 7L M 7 8 0 5 / TO
1
2
3V I N
GN
D
V O U T
K e y 0
Y _ 2
U 9
7 4 H C 5 7 3
1
10
1 1
20
1 91 81 71 61 51 41 31 2
23456789
O E
GN
D
L E
VC
C 1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q
1 D2 D3 D4 D5 D6 D7 D8 D
R 8
R
0 . 1 u F
P 0 . 2
Y _ 1
S W 6R 1 2
Ke
y3
K e y 2
P 3 . 6
1 1 . 0 5 9
P 1 . 3
P 0 . 1
P 3 . 3
XTA L 1
R 1 1
1 0 u F
C
C O M _ 3
V C C
S W 1
2 2 0
P 0 . 6
P2
.0
RP 0 . 5
1 0 u F
V C C
P 2 . 7
P 0 . 1
62
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CB3
Q12
NPN
D6
VCC
VCC
MotorX_3
MotorY_1
D22
JP7
24V out
12
R6
NPN
Q4
NPN
VCC
GND
D5
VCC
D20
VCC
1D
JP6
5V
12
R12
22
VCC
PEN_IN
Q14
NPN
VCC
MotorY_2
R7
470
D12
R17
680
H.1
Board coâng suaátA4
1 1Saturday, December 22, 2001
Title
Size Document Number Rev
Date: Sheet of
Q15
PNP
D18
R16
470
VCC
R5
680
D4
R14
680
24V
MotorX_0
VCC
VCC
CB8
CB6
JP2
HEADER 10
12345678910
R25
470
CB5
R15
22
D8
24V
CB2
D7
CB8
MotorX_1
D25
D9
R24
22
CB7
CB2
1B
MotorY_0
R9
22
Q18
NPNVCC CB7
D23
R22
470
MotorY_1
MotorX_2
VCC
1C
2C
Q9
PNP
MotorX_0
VCC
CB8
D16
MotorX_0
D14
R26
680
2B
R34
470
MotorY_0
PEN_IN
JP1
HEADER 16X2
1 23 45 67 89 1011 1213 1415 1617 1819 2021 2223 2425 2627 2829 3031 32
2D
CB6
R1
470
VCC
1B
MotorY_2
MotorX_2
VCC
D17
VCC
2D
R13
470
1C
D13
D10
Q7
PNP
2B
CB6
2A
CB1
CB4
CB2
D15
R11
680
VCC
CB3
D3
VCC
CB8
MotorX_3
CB7
R18
22
D21
Q8
NPN
R10
470
Q11
PNP
MotorY_1D19
R20
680
PEN_OUT
CB3
PEN_OUT
R8
680
VCC
PEN_IN
VCCD2R4
470
VCC
CB1
JP3
Motor X
123456
MotorY_0
R23
680
CB7R6
22
CB4
R2
680
MotorX_3
PEN_OUT
MotorX_1
R27
22
MotorY_3
CB5
Q17
PNP
1A
R19
470
VCC
CB5
D11
CB1
MotorY_3
1A
Q1
PNP
2A
D24
CB6
Q16
NPN
CB2
JP5
24V in
12
Rpack - 10K
CB3
R21
22
24V
1D
R3
22
MotorX_2
D1
Q3
PNP
Q5
PNP
Q13
PNP
VCC
VCC
MotorX_1
Q2
NPN
MotorY_3
JP4
Motor Y
123456
VCC
Q10
NPN
VCC
2C
CB1
VCC
VCC
CB4
MotorY_2
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-200263
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CB2
X2
Y2 (White)
L1 (Blue)
End Y
MotorY_3
Y2
CB2
CB2
CB8
CB4
Y3
Y5
Header 12 (on table)
<Doc>
Sô ñoà baøn veõA4
1 1Sunday, December 23, 2001
Title
Size Document Number Rev
Date: Sheet of
MotorY_1
GND
X3 (Orange)
X6
X6 (Blue)
Y4
VCC (5V) (Y2)
L1 (Blue)
MotorY_0
Motor YY
MotorY_2
CB4
VCC (5V)
CB2
MotorX_3
MotorX_2
PEN_IN
Board
MotorX_0
Y1
CB1 CB Pen (CB7)
CB8
Start X
L2 (Black)M
otorX_2
Y1 (Red)
L2 (Black)
GND
End X (CB4)Start X (CB3)
CB1
MotorX_1
CB1
CB5
Y5 (White)
End Y (CB2)
Y4
CB7
MotorY_0 MotorX_3
CB4
X5 (Pink)
BOTTOM
MotorX_1
MotorY_1
CB7
X2 (Red)
X1X3
Y4 (Red)
MotorX_0
VCC (5V)
CB8
VCC (24V)
CB Pen
MotorY_2
CB3
Y5
Y6 (White)
CB3
CB6
CB5
MotorY_2
End X
GND
MotorY_3
Y6
Y6
X5
CB1
MotorY_0
GND
MotorY_3
Motor X
CB3
Start Y
VCC (5V)
CB6
Y3 (White)
X4 (Yellow)
CB3
GND
MotorY_1
MotorX_3
CB7
Y3
VCC (5V)
PEN_IN
Caùc daây noái treân baøn veõ
Start Y (CB1)
X
MotorX_0
CB5
CB6
TOP
CB8
CB7
X4
VCC (5V)
GND
VCC (5V) (Y1)
X1 (Brown)
MotorX_1
CB6
PEN_IN
MotorX_2
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-200264
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù CHÖÔNG TRÌNH CHO PCunit MainEdit;
procedure TMainEditForm.Exit1Click(Sender: TObject);begin Close;end;
procedure TMainEditForm.OpenDXFfile1Click(Sender: TObject);begin OpenFileDialog.Filter:='DXF file(*.dxf)|*.dxf'; If OpenFileDialog.Execute then Begin With TEditForm.Create(self) do Open(OpenFileDialog.FileName); End;end;
procedure TMainEditForm.Tile1Click(Sender: TObject);begin Tile;end;
procedure TMainEditForm.Cascade1Click(Sender: TObject);begin Cascade;end;
procedure TMainEditForm.ArrangeIcon1Click(Sender: TObject);begin ArrangeIcons; end;
procedure TMainEditForm.About1Click(Sender: TObject);begin With TAbout.Create(self) do try ShowModal; finally Free; end;end;
procedure TMainEditForm.OpenCNCfile1Click(Sender: TObject);begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
65
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù OpenFileDialog.Filter:='Text file(*.txt)|*.txt'; If OpenFileDialog.Execute then With TEditForm.Create(self) do begin Open(OpenFileDialog.FileName); TransferToCNC1.Enabled:=False; DrawingCNC1.Enabled:=True; Destination:=OpenFileDialog.FileName; end;end;
procedure TMainEditForm.NewCNCfile1Click(Sender: TObject);begin NewForm.Show; NewForm.caption:='Untiled';end;
procedure TMainEditForm.FormCreate(Sender: TObject);begin{ With TStart.Create(self) do try ShowModal; finally Free; end;}end;end.
unit Edit;
var EditForm: TEditForm; Destination,PathName:string; f,fout:TextFile; x0,y0,Current_X,Current_Y:real;
const DefaultFileName='Untitled'; Send_File='c:\my documents\luan van\pc\huy.txt';
implementation
uses MainEdit, DrawForm;{$R *.dfm}Procedure TEditForm.Open(const Filename:string);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
66
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Begin PathName:=filename; Caption:=ExtractFileName(filename); Editor.Lines.LoadFromFile(PathName);End;procedure TEditForm.File1Click(Sender: TObject);begin MainEditForm.Exit1Click(Sender);end;
procedure TEditForm.OpenCNCfile1Click(Sender: TObject);begin MainEditForm.OpenCNCfile1Click(Sender);end;
procedure TEditForm.OpenDXFfile1Click(Sender: TObject);begin MainEditForm.OpenDXFfile1Click(Sender); TransferToCNC1.Enabled:=true;end;
procedure TEditForm.Exit1Click(Sender: TObject);begin MainEditForm.Exit1Click(sender);end;
procedure TEditForm.Tile1Click(Sender: TObject);begin MainEditForm.Tile1Click(Sender);end;
procedure TEditForm.Cascade1Click(Sender: TObject);begin MainEditForm.Cascade1Click(sender);end;
procedure TEditForm.ArrangeIcon1Click(Sender: TObject);begin MainEditForm.ArrangeIcon1Click(sender);end;
procedure TEditForm.About1Click(Sender: TObject);begin MainEditForm.About1Click(sender);end;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
67
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
procedure TEditForm.Print1Click(Sender: TObject);begin If PrintDialog1.Execute then Editor.Print(PathName);end;
procedure TEditForm.PrinterSetup1Click(Sender: TObject);begin PrinterSetupDialog1.Execute;end;
procedure TEditForm.FormCreate(Sender: TObject);begin PathName:=DefaultFileName; DrawingCNC1.Enabled:=False; x0:=0; y0:=0; Current_X:=0; Current_Y:=0;end;
procedure TEditForm.Close1Click(Sender: TObject);begin Close;{ TransferToCNC1.Enabled:=true;}end;
procedure TEditForm.FormClose(Sender: TObject; var Action: TCloseAction);begin Action:=caFree;end;
function no_blank(str:string):string;var i:integer;begin for i:=1 to length(str) do if str[i]=' ' then delete(str,i,1); no_blank:=str;end;
Procedure TEditForm.Process_G0(x1,y1:real);var str:string;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
68
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Begin If (RoundTo(x1,-1)<>RoundTo(Current_X,-1)) or(RoundTo(y1,-1)<>RoundTo(Current_Y,-1)) then begin writeln(fout,'G0'); str:=FloatToStrF(x1,ffNumber,16,6); writeln(fout,str); str:=FloatToStrF(y1,ffNumber,16,6); writeln(fout,str); Current_X:=x1; Current_Y:=y1; end;End;
procedure TEditForm.write_Arc(xc,yc,r,x2,y2:real);var str:string;Begin Str:=FloatToStrF(xc,ffNumber,16,6); writeln(fout,Str); Str:=FloatToStrF(yc,ffNumber,16,6); writeln(fout,Str); Str:=FloatToStrF(r,ffNumber,16,6); writeln(fout,Str); Str:=FloatToStrF(x2,ffNumber,16,6); writeln(fout,Str); Str:=FloatToStrF(y2,ffNumber,16,6); writeln(fout,Str); Current_X:=x2; Current_Y:=y2;End;
procedure TEditForm.ProcessSize;var str:string;begin readln(f,str); str:=no_blank(str); if str='10' then begin writeln(fout,'Size'); readln(f,str); str:=no_blank(str); writeln(fout,str); readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
69
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); str:=no_blank(str); writeln(fout,str); writeln(fout,'End Size'); end;end;
Procedure TEditForm.ProcessPoint;var str:string;Begin readln(f,str); writeln(fout,'AcDbPoint'); readln(f,str); str:=no_blank(str); writeln(fout,str); x0:=StrToFloat(Str); readln(f,str); readln(f,str); str:=no_blank(str); writeln(fout,str); y0:=StrToFloat(Str); writeln(fout,'End AcDbPoint');End;
Procedure TEditForm.ProcessLine;var str:string; x1,y1,temp:real;begin readln(f,str); str:=no_blank(str); while str<>'10' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); x1:=StrToFloat(Str)-x0; readln(f,str); str:=no_blank(str); while str<>'20' do begin readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
70
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù str:=no_blank(str); end; readln(f,str); str:=no_blank(str); y1:=StrToFloat(Str)-y0; Process_G0(x1,y1); writeln(fout,'G1'); readln(f,str); str:=no_blank(str); while str<>'11' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); temp:=StrToFloat(Str)-x0; Current_X:=temp; Str:=FloatToStrF(temp,ffnumber,16,6); writeln(fout,str); readln(f,str); str:=no_blank(str); while str<>'21' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); temp:=StrToFloat(Str)-y0; Current_Y:=temp; Str:=FloatToStrF(temp,ffnumber,16,6); writeln(fout,str);end;
procedure TEditForm.ProcessPolyline;var str:string; rem,check,closed_poly,first_Point:boolean; x1,y1,xb,yb:real;begin rem:=false; closed_poly:=false; First_Point:=True; readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
71
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù str:=no_blank(str); while str<>'70' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); if pos('1',str)<>0 then closed_poly:=true; readln(f,str); str:=no_blank(str); while str<>'10' do begin readln(f,str); str:=no_blank(str); end; check:=true; while check do begin readln(f,str); str:=no_blank(str); xb:=StrToFloat(Str)-x0; if closed_poly then x1:=xb; readln(f,str); readln(f,str); str:=no_blank(str); yb:=StrToFloat(Str)-y0; if First_Point then begin Process_G0(xb,yb); First_Point:=False; end; if closed_poly then begin y1:=yb; closed_poly:=false; rem:=true; end else begin writeln(fout,'G1'); Str:=FloatToStrF(xb,ffNumber,16,6); writeln(fout,str); Str:=FloatToStrF(yb,ffNumber,16,6); writeln(fout,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
72
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Current_X:=xb; Current_Y:=xb; end; readln(f,str); str:=no_blank(str); if str<>'10' then check:=false; end; if rem then begin writeln(fout,'G1'); Str:=FloatToStrF(x1,ffNumber,16,6); writeln(fout,str); Str:=FloatToStrF(y1,ffNumber,16,6); writeln(fout,str); end;end;
procedure TEditForm.ProcessCircle;var str:string; circheck:boolean; x1,y1,bk,ang1,ang2,Start_x,Start_y,End_X,End_Y:real; temp:integer;begin readln(f,str); str:=no_blank(str); while str<>'10' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); x1:=StrToFloat(Str)-x0; readln(f,str); str:=no_blank(str); while str<>'20' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); y1:=StrToFloat(Str)-y0; readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
73
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù str:=no_blank(str); while str<>'40' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); bk:=StrToFloat(str); readln(f,str); if pos('100',str)<>0 then circheck:=false else circheck:=true; if circheck then begin Process_G0(x1-bk,y1); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1,y1+bk); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1+bk,y1); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1,y1-bk); writeln(fout,'G2'); Write_Arc(x1,y1,bk,x1-bk,y1); Current_X:=x1-bk; Current_Y:=y1; end else begin readln(f,str); str:=no_blank(str); while str<>'50' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); ang1:=StrToFloat(str); readln(f,str); str:=no_blank(str); while str<>'51' do begin readln(f,str); str:=no_blank(str); end;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
74
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); str:=no_blank(str); ang2:=StrToFloat(str); If ang2<ang1 then ang2:=ang2+360; Start_X:=x1+bk*cos(ang1*pi/180); Start_Y:=y1+bk*sin(ang1*pi/180); End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); Process_G0(Start_X,Start_Y); temp:=((round(ang1) div 90)+1)*90; If temp>=ang2 then Begin writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End Else Begin temp:=((round(ang1) div 90)+2)*90; If temp>=ang2 then Begin temp:=temp-90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End Else Begin temp:=((round(ang1) div 90)+3)*90; If temp>=ang2 then Begin temp:=temp-180; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); temp:=temp+90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
75
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End Else Begin temp:=((round(ang1) div 90)+4)*90; If temp>=ang2 then Begin temp:=temp-270; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); temp:=temp+90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); temp:=temp+90; End_X:=x1+bk*cos(temp*pi/180); End_Y:=y1+bk*sin(temp*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End_X:=x1+bk*cos(ang2*pi/180); End_Y:=y1+bk*sin(ang2*pi/180); writeln(fout,'G3'); Write_Arc(x1,y1,bk,End_X,End_Y); End; End; End; End; End;End;
Procedure TEditForm.ProcessSpline;type RPoint=record x,y:real; end;var str:string; i:byte; numknots,numpoints:integer;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
76
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù knot:array[0..50]of real; control_point:array[0..50]of RPoint;begin readln(f,str); str:=no_blank(str); while str<>'72' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); numknots:=StrToInt(str); readln(f,str); str:=no_blank(str); while str<>'73' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); numpoints:=StrToInt(str); readln(f,str); str:=no_blank(str); while str<>'40' do begin readln(f,str); str:=no_blank(str); end; readln(f,str); str:=no_blank(str); for i:=0 to numknots-1 do begin knot[i]:=StrToFloat(str); readln(f,str); readln(f,str); end; for i:=0 to numpoints-1 do begin control_point[i].x:=StrToFloat(str); readln(f,str); readln(f,str); control_point[i].y:=StrToFloat(str); readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
77
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); readln(f,str); readln(f,str); end; Process_G0(control_point[0].x,control_point[0].y); writeln(fout,'Spline'); writeln(fout,'Num Knots'); writeln(fout,IntToStr(numknots)); writeln(fout,'Num Points'); writeln(fout,IntToStr(numpoints)); writeln(fout,'Knots'); for i:=0 to numknots-1 do writeln(fout,FloatToStr(knot[i])); writeln(fout,'Control points'); for i:=0 to numpoints-1 do begin writeln(fout,FloatToStr(control_point[i].x)); writeln(fout,FloatToStr(control_point[i].y)); end;end;
procedure TEditForm.TransfertoCNC1Click(Sender: TObject);var str:string;Begin if savedialog1.execute then begin destination:=savedialog1.filename; If Pos('.txt',Destination)=0 then Destination:=Destination+'.txt'; assignfile(f,pathname); reset(f); assignfile(fout,destination); rewrite(fout); Repeat readln(f,str); if str='AcDbPoint' then ProcessPoint; Until (Str='AcDbPoint') or (eof(f)); reset(f); while not eof(f) do begin readln(f,str); if str='$LIMMAX' then ProcessSize else if str='AcDbLine' then ProcessLine else if str='AcDbPolyline' then
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
78
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin readln(f,str); if pos('90',str)<>0 then ProcessPolyline; end else if str='AcDbCircle' then ProcessCircle else if str='AcDbSpline' then ProcessSpline; end; closefile(fout); closefile(f); With TEditForm.Create(Self) do Begin Open(Destination); TransferToCNC1.Enabled:=False; DrawingCNC1.Enabled:=True; End; TransferToCNC1.Enabled:=False; end;End;
procedure TEditForm.DrawingCNC1Click(Sender: TObject);var Arect:TRect; f1:textfile; str:string; Page_Width,Page_Height:Real;
begin Pre_Run_Draw; Drawing.Show; AssignFile(f1,Destination); Reset(f1); Readln(f1,str); If Drawing.Auto1.Checked then begin Drawing.Run.Enabled:=True; Drawing.Pause.Enabled:=True; Drawing.Stop.Enabled:=True; Drawing.Send.Enabled:=False; end Else if Drawing.Singlestep1.Checked then begin Drawing.Run.Enabled:=True; Drawing.Pause.Enabled:=True;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
79
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Drawing.Stop.Enabled:=True; Drawing.Send.Enabled:=False; end Else if Drawing.Command1.Checked then begin Drawing.Run.Enabled:=False; Drawing.Pause.Enabled:=False; Drawing.Stop.Enabled:=False; Drawing.Send.Enabled:=True; end; While Pos('Size',str)=0 do Readln(f1,str); If Str='Size' then Begin Readln(f1,Str); Page_Width:=StrToFloat(str); Readln(f1,Str); Page_Height:=StrToFloat(str); If (Page_Width/Drawing.Image1.Width)>(Page_Height/Drawing.Image1.Height) then Image_Scale:=Round(Page_Width/Drawing.Image1.Width)+1 Else Image_Scale:=Round(Page_Height/Drawing.Image1.Height)+1; End; Closefile(f1); With Drawing.Image1.Canvas do begin CopyMode:=cmWhiteness; Arect:=Rect(0,0,Drawing.Image1.width,Drawing.image1.Height); CopyRect(ARect,Drawing.Image1.Canvas,ARect); CopyMode:=cmSrcCopy; {pen.color:=ClBlack; with Drawing.image1 do canvas.Rectangle(C_P.x-round(table_width/2/Image_Scale),C_P.y-round(table_height/2/Image_Scale),C_P.x+round(table_Width/2/Image_Scale),C_P.y+round(table_height/2/Image_Scale));} pen.color:=ClBlue; moveto(0,C_P.y); lineto(Drawing.Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Drawing.Image1.Height); moveto(C_P.x,C_P.y); end;end;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
80
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
procedure TEditForm.NewCNCfile1Click(Sender: TObject);begin MainEditForm.NewCNCfile1Click(Sender);end;
Procedure TEditForm.Pre_Run_Draw;Var f:TextFile; f1:TextFile; cx,cy,r,Str:string; cur_x,cur_y,new_x,new_y:real; i,numknots,numpoints:integer; count:integer; Data:array[0..100]of real; temp:Real;Begin AssignFile(f,Destination); Reset(f); AssignFile(f1,Send_File); Rewrite(f1); Cur_x:=0; Cur_y:=0; count:=0; While (not Eof(f)) do Begin Readln(f,str); If Str='G0' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('L'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('i')*256+ord('n'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('e')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('t')*256+ord('o'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(':')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
81
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G0'); writeln(f1,FloatToStr(cur_x)); writeln(f1,FloatToStr(cur_y)); writeln(f1,'0'); writeln(f1,FloatToStr(new_x)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End Else if Str='G1' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('L'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('i')*256+ord('n'))/10;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
82
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù writeln(f1,FloatToStr(temp)); temp:=(ord('e')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('t')*256+ord('o'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(':')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G1'); writeln(f1,FloatToStr(cur_x)); writeln(f1,FloatToStr(cur_y)); writeln(f1,'0'); writeln(f1,FloatToStr(new_x)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
83
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Else if Str='G2' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('A'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('r')*256+ord('c'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord('t'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('o')*256+ord(':'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); cx:=str; readln(f,str); cy:=str; readln(f,str); r:=str; readln(f,str); new_x:=StrToFloat(str); readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
84
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G2'); writeln(f1,cx); writeln(f1,cy); writeln(f1,r); writeln(f1,FloatToStr(new_X)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End Else if Str='G3' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord(' ')*256+ord('A'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('r')*256+ord('c'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord('t'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('o')*256+ord(':'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord(' '))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); readln(f,str); cx:=str; readln(f,str); cy:=str; readln(f,str); r:=str; readln(f,str); new_x:=StrToFloat(str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
85
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù readln(f,str); new_y:=StrToFloat(str); str:='X='+FloatToStrF(new_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(new_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G3'); writeln(f1,cx); writeln(f1,cy); writeln(f1,r); writeln(f1,FloatToStr(new_X)); writeln(f1,FloatToStr(new_y)); Cur_x:=new_x; Cur_y:=new_y; End Else if Str='Num Knots' then Begin readln(f,str); numknots:=StrToInt(str); End Else if Str='Num Points' then Begin readln(f,str); numpoints:=StrToInt(str); End Else if Str='Knots' then Begin Data[0]:=(Numknots*256+numpoints)/10; inc(count); For i:=0 to numknots-1 do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
86
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin readln(f,str); data[i+1]:=Round(StrToFloat(str)*10)/10+0.1*i; inc(count); end; End Else if Str='Control points' then Begin Writeln(f1,'G9'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G6'); temp:=(ord('S')*256+ord('p'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('l')*256+ord('i'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('n')*256+ord('e'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord(' ')*256+ord('t'))/10; writeln(f1,FloatToStr(temp)); temp:=(ord('o')*256+ord(':'))/10; writeln(f1,FloatToStr(temp)); writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); writeln(f1,'G10'); for i:=1 to 5 do writeln(f1,'0'); For i:=0 to numpoints-1 do begin readln(f,str); Data[2*i+1+numknots]:=StrToFloat(str); inc(count); readln(f,str); Data[2*i+1+1+numknots]:=StrToFloat(str); inc(count); end; Cur_x:=Data[count-2]; Cur_y:=Data[count-1]; str:='X='+FloatToStrF(cur_x,ffnumber,7,1)+' '+'Y='+FloatToStrF(cur_y,ffnumber,7,1); while (length(str) MOD 10)<>0 do str:=str+' '; for i:=1 to length(str) do begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
87
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if (i MOD 10)=1 then writeln(f1,'G6'); if (i mod 2)=1 then temp:=ord(str[i]); if (i mod 2)=0 then begin temp:=temp*256+ord(str[i]); writeln(f1,FloatToStr(temp/10)); end; end;{for} writeln(f1,'G8'); for i:=1 to 5 do writeln(f1,'0'); While (count MOD 5)<>0 do begin Data[count]:=0; Inc(Count); end; For i:=0 to count-1 do Begin if (i MOD 5)=0 then writeln(f1,'G6'); writeln(f1,FloatToStr(Data[i])); End; writeln(f1,'G7'); writeln(f1,'0'); writeln(f1,'0'); writeln(f1,'0'); writeln(f1,FloatToStr(Cur_x)); writeln(f1,FloatToStr(Cur_y)); End; Application.ProcessMessages; End; {while} CloseFile(f); CloseFile(f1);End;end.
unit DrawForm;
Const Scale=10; Table_Width=297; Table_Height=420; Denom=32767;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
88
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù var Drawing: TDrawing; Connect_Flag,Transfer_Flag,AutoRun_Flag,Reset_Flag:Boolean; ComPort:byte; Image_Scale:byte; Data_In_Counter:byte; xy:Integer; Draw_Delay:word; C_P:Point; numknots,numpoints:integer; Knot:array[0..50]of integer; Control_Point:array[0..50]of Point;
implementationuses Edit,AutoRun;Var Auto:TRun; bitmap:TBitmap; Pause_Flag,Check_Border:Boolean;
{Terminated_Flag:boolean;}
{$R *.dfm}
Function N(k,m,t:integer):integer;var denom1,denom2,sum:integer;begin if m=1 then if (t<knot[k])or(t>knot[k+1]) then N:=0 else N:=Denom else begin denom1:=knot[k+m-1]-knot[k]; if denom1<>0 then sum:=(t-knot[k])*N(k,m-1,t) div denom1 else sum:=0; denom2:=knot[k+m]-knot[k+1]; if denom2<>0 then sum:=sum+(knot[k+m]-t)*N(k+1,m-1,t)div denom2; N:=sum; end;{else}
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
89
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end;
procedure TDrawing.ExitClick(Sender: TObject);begin Close;end;
procedure TDrawing.ConnectClick(Sender: TObject);begin If Connect_Flag=True then Begin Mscomm1.PortOpen:=False; Connect.Glyph.LoadFromFile('c:\my documents\luan van\Pc\Bmp\DriveDsc.Bmp'); Connect_Flag:=False; Connect.Hint:='Connect'; End Else Begin Connect.Glyph.LoadFromFile('c:\my documents\luan van\Pc\Bmp\DriveNet.Bmp'); Mscomm1.CommPort:=ComPort; Mscomm1.Settings:='9600,E,8,1'; Mscomm1.PortOpen:=true; Connect_Flag:=True; Connect.Hint:='Disconnect'; End;end;
procedure TDrawing.FormCreate(Sender: TObject);begin Reset_Flag:=True; Connect_Flag:=False; Transfer_Flag:=true; AutoRun_Flag:=False; Pause_Flag:=False; ComPort:=1; Com1.Checked:=true; Auto1.Checked:=true; Mscomm1.inputlen:=1; Mscomm1.RThreshold:=1; MScomm1.InputMode:=ComInputModeText; Image_Scale:=1; DrawSpeed.Position:=400; Draw_Delay:=800;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
90
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù C_P.x:=Image1.width div 2; C_P.y:=Image1.height div 2;end;
procedure TDrawing.COM1Click(Sender: TObject);begin ComPort:=1; Com1.Checked:=true;end;
procedure TDrawing.COM2Click(Sender: TObject);begin ComPort:=2; Com2.Checked:=true;end;
procedure TDrawing.Auto1Click(Sender: TObject);begin Auto1.Checked:=true; Run.Enabled:=true; Pause.Enabled:=True; Stop.Enabled:=True; Send.Enabled:=false; DrawMode.Caption:='Auto';end;
procedure TDrawing.Singlestep1Click(Sender: TObject);begin SingleStep1.Checked:=true; Run.Enabled:=true; Pause.Enabled:=True; Stop.Enabled:=True; Send.Enabled:=false; DrawMode.Caption:='Single Step';end;
procedure TDrawing.Command1Click(Sender: TObject);begin Command1.Checked:=true; Run.Enabled:=False; Pause.Enabled:=False; Stop.Enabled:=False; Send.Enabled:=True; DrawMode.Caption:='Command'; Edit1.ReadOnly:=False;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
91
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Edit2.ReadOnly:=False; Edit3.ReadOnly:=False; Edit4.ReadOnly:=False; Edit5.ReadOnly:=False; Edit6.ReadOnly:=False; Edit7.ReadOnly:=False;end;
Procedure TDrawing.Send_Command;Const n=30;var temp:Integer;Begin Notice.Caption:='Running'; temp:=StrToInt(Edit1.text); Send.Enabled:=False; mscomm1.Output:=Chr(Lo(temp)); Sleep(n); temp:=StrToInt(Edit2.text); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n); If temp=5 then Begin temp:=round(StrToFloat(Edit3.text)); Mscomm1.OutPut:=Chr(Hi(temp)); Sleep(n); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n); End {If} Else Begin temp:=round(StrToFloat(Edit3.text)*Scale); Mscomm1.OutPut:=Chr(Hi(temp)); Sleep(n); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n); End; {Else} temp:=round(StrToFloat(Edit4.text)*Scale); Mscomm1.OutPut:=Chr(Hi(temp)); Sleep(n); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n); temp:=round(StrToFloat(Edit5.text)*Scale); Mscomm1.OutPut:=Chr(Hi(temp));
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
92
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Sleep(n); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n); temp:=round(StrToFloat(Edit6.text)*Scale); Mscomm1.OutPut:=Chr(Hi(temp)); Sleep(n); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n); temp:=round(StrToFloat(Edit7.text)*Scale); Mscomm1.OutPut:=Chr(Hi(temp)); Sleep(n); Mscomm1.OutPut:=Chr(Lo(temp)); Sleep(n);End;
procedure TDrawing.DrawLine;var deltax,deltay,x1,x2,y1,y2:integer; dinc1,dinc2:integer; b,c,d:boolean;
begin x1:=p1.X div Image_Scale; y1:=p1.y div Image_Scale; x2:=p2.x div Image_Scale; y2:=p2.y div Image_Scale; a_s(x2,x1,deltax,b); a_s(y2,y1,deltay,c); if deltax>=deltay then begin d:=false; dinc2:=deltay-deltax; dinc1:=deltay; deltay:=-(deltax shr 1)+deltay; end else begin d:=true; dinc2:=deltax-deltay; dinc1:=deltax; deltax:=deltay; deltay:=-(deltay shr 1)+dinc1; end; while deltax>0 do begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
93
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if not(Pause_Flag) then BEGIN if deltay<0 then begin deltay:=deltay+dinc1; if d then if c then down else up else if b then left else right; end else begin deltay:=deltay+dinc2; if b then if c then DownLeft else UpLeft else if c then DownRight else UpRight; end; dec(deltax); Sleep(Draw_Delay); END;{if pause_flag} Application.ProcessMessages; end;end;
procedure TDrawing.A_S(a,b:integer;var kq:integer;var s:boolean);begin if a>=b then begin kq:=a-b; s:=false; end else
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
94
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin kq:=b-a; s:=true; end;end;procedure TDrawing.up;begin with Image1.canvas do LineTo(penpos.x,penpos.y-1); {Application.ProcessMessages;}end;
procedure TDrawing.down;begin with Image1.canvas do LineTo(penpos.x,penpos.y+1); {Application.ProcessMessages;}end;
procedure TDrawing.Right;begin with Image1.canvas do LineTo(penpos.x+1,penpos.y); {Application.ProcessMessages;}end;
procedure TDrawing.Left;begin with Image1.canvas do LineTo(penpos.x-1,penpos.y); { Application.ProcessMessages;}end;
procedure TDrawing.UpRight;begin with Image1.canvas do Lineto(penpos.x+1,penpos.y-1); {Application.ProcessMessages;}end;
procedure TDrawing.UpLeft;begin with Image1.canvas do LineTo(penpos.x-1,penpos.y-1); {Application.ProcessMessages;}
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
95
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end;
procedure TDrawing.DownRight;begin with Image1.canvas do LineTo(penpos.x+1,penpos.y+1); {Application.ProcessMessages;}end;
procedure TDrawing.DownLeft;begin with Image1.canvas do LineTo(penpos.x-1,penpos.y+1); {Application.ProcessMessages;}end;
Procedure TDrawing.Arc(xc,yc,r,x2,y2,n:integer);var d1,d2,x,y:integer; comp:integer;Begin xc:=xc div Image_Scale; yc:=yc div Image_Scale; x2:=x2 div Image_Scale; y2:=y2 div Image_Scale; r:=r div Image_Scale; d1:=1-2*r; d2:=1-r; xc:=C_P.x+xc; yc:=C_P.y-yc; With image1.Canvas do BEGIN {with} case n of 1:begin x:=penpos.x-xc; y:=yc-penpos.y; comp:=x2; end; 2:begin x:=yc-penpos.y; y:=xc-penpos.x; comp:=y2; end; 3:begin x:=xc-penpos.x;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
96
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù y:=penpos.y-yc; comp:=-x2; end; 4:begin x:=penpos.y-yc; y:=penpos.x-xc; comp:=-y2; end; end; {case} while x>comp do begin if not(Pause_Flag) then BEGIN if d1<0 then begin if d2<0 then begin d1:=d1+2*y+2; d2:=d2+2*y+3; y:=y+1; Direction1(n); end else begin d1:=d1+2*(y-x)+5; d2:=d2+2*(y-x)+5; y:=y+1; x:=x-1; Direction2(n); end; end else begin d1:=d1-2*x+3; d2:=d2-2*x+2; x:=x-1; Direction3(n); end; Sleep(Draw_Delay); END;{if pause_flag} Application.ProcessMessages; end; END; {with}End;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
97
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Procedure convert(var x,y:integer);var temp:integer;Begin temp:=x; x:=y; y:=temp;End;
Procedure TDrawing.Arc_QN(xc,yc,r,x2,y2,n:integer);var d1,d2,x,y:integer; comp:integer;Begin xc:=xc div Image_Scale; yc:=yc div Image_Scale; x2:=x2 div Image_Scale; y2:=y2 div Image_Scale; r:=r div Image_Scale; d1:=1-2*r; d2:=1-r; xc:=C_P.x+xc; yc:=C_P.y-yc; With image1.Canvas do BEGIN {with} case n of 1:begin x:=penpos.x-xc; y:=yc-penpos.y; comp:=y2; end; 2:begin x:=yc-penpos.y; y:=xc-penpos.x; comp:=-x2; end; 3:begin x:=xc-penpos.x; y:=penpos.y-yc; comp:=-y2; end; 4:begin x:=penpos.y-yc; y:=penpos.x-xc; comp:=x2;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
98
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end; end; {case} convert(x,y); while x>comp do begin If not(Pause_Flag) then BEGIN if d1<0 then begin if d2<0 then begin d1:=d1+2*y+2; d2:=d2+2*y+3; y:=y+1; Direction1_QN(n); end else begin d1:=d1+2*(y-x)+5; d2:=d2+2*(y-x)+5; y:=y+1; x:=x-1; Direction2_QN(n); end; end else begin d1:=d1-2*x+3; d2:=d2-2*x+2; x:=x-1; Direction3_QN(n); end; Sleep(Draw_Delay); END;{if pause_flag} Application.ProcessMessages; end; END; {with}End;
Procedure TDrawing.Direction1(n:integer);Begin case n of 1:Up; 2:Left; 3:Down;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
99
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù 4:Right; end;End;
Procedure TDrawing.Direction2(n:integer);Begin case n of 1:UpLeft; 2:DownLeft; 3:DownRight; 4:UpRight; end;End;
Procedure TDrawing.Direction3(n:integer);Begin case n of 1:Left; 2:Down; 3:Right; 4:Up; end;End;
Procedure TDrawing.Direction1_QN(n:integer);Begin case n of 1:Right; 2:Up; 3:Left; 4:Down; end;End;
Procedure TDrawing.Direction2_QN(n:integer);Begin case n of 1:DownRight; 2:UpRight; 3:UpLeft; 4:DownLeft; end;End;
Procedure TDrawing.Direction3_QN(n:integer);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
100
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Begin case n of 1:Down; 2:Right; 3:Up; 4:Left; end;End;
procedure TDrawing.MSComm1Comm(Sender: TObject);Var InStr:string;begin If MSComm1.CommEvent=2 then Begin InStr:=MSComm1.Input; If Length(InStr)=0 then begin SetLength(InStr,1); InStr[1]:=Chr(0); end; if (ord(InStr[1])=$FF)and(Edit2.Text<>'4') then begin Send_Command; Notice.Caption:=Notice.Caption+'(Data error !)'; end else if (ord(InStr[1])=$0F)and(Edit2.Text<>'4') then begin Notice.caption:=('Line is empty !'); Transfer_Flag:=true; Send.Enabled:=true; If (command1.checked)or(Reset_Flag) then Update.Enabled:=true; end else if (ord(InStr[1])=$F0)and(Edit2.Text<>'4') then begin ShowMessage('Emergency stop from MicroController!'); Halt; end else if (ord(InStr[1])=$3F)and(Edit2.Text<>'4') then begin ShowMessage('Error! Go out of table!'); Halt; end else
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
101
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin Inc(Data_In_Counter); If (Data_In_Counter mod 2)=0 then begin xy:=xy*256+Ord(InStr[1]); If xy>32767 then xy:=xy-65536; if Data_In_Counter=2 then Edit8.Text:=(FloatToStr(xy/scale)) Else begin Edit9.Text:=(FloatToStr(xy/scale)); Data_In_Counter:=0; Notice.caption:=('Line is empty !'); Send.Enabled:=True; end; end else xy:=ord(InStr[1]); end; End;end;
procedure TDrawing.UpdateClick(Sender: TObject);begin If Drawing.Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else begin Edit2.Text:='4'; Send_Command; end;end;
procedure TDrawing.FormClose(Sender: TObject; var Action: TCloseAction);begin If Mscomm1.PortOpen=true then begin Mscomm1.PortOpen:=False; Connect.Glyph.LoadFromFile('c:\my documents\luan van\Pc\Bmp\DriveDsc.Bmp'); Connect_Flag:=False; Connect.Hint:='Connect'; End; Run.Enabled:=true;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
102
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if Reset_Flag=False then begin {Auto.Terminate;} showmessage('Chaøo taïm bieät - Heïn gaëp laïi'); halt; end;end;
procedure TDrawing.RunClick(Sender: TObject);begin If Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else Begin Draw_Full; Edit1.ReadOnly:=True; Edit2.ReadOnly:=True; Edit3.ReadOnly:=True; Edit4.ReadOnly:=True; Edit5.ReadOnly:=True; Edit6.ReadOnly:=True; Edit7.ReadOnly:=True; Send.Enabled:=true; Reset_Flag:=false; Command1.Enabled:=False; If auto1.checked then begin AutoRun_Flag:=true; Update.enabled:=false; SingleStep1.Enabled:=False; end; If singleStep1.checked then auto1.Enabled:=False; {Auto:=TRun.Create(true); Auto.Resume;} Run_Draw; End;{else}end;
procedure TDrawing.SendClick(Sender: TObject);var str:string; m:byte; p1,p2,pc:Point; r:integer;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
103
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin AutoRun_Flag:=true; Update.Enabled:=False; If (Command1.checked)and(Transfer_Flag) then Begin If Drawing.Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else Begin Reset_Flag:=false; str:=Edit2.text; If Str='0' then Begin Edit5.Text:='0'; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Send_Command; Image1.canvas.pen.color:=clgreen; DrawLine(p1,p2); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; End Else If Str='1' then Begin Edit5.Text:='0'; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Send_Command; image1.canvas.pen.color:=clred; DrawLine(p1,p2); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; End Else if Str='2' then Begin p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text));
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
104
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x<=0)and(p2.y>0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; if Check_Error(StrToFloat(Edit3.Text),StrToFloat(Edit4.Text),StrToFloat(Edit5.Text) ,StrToFloat(Edit6.Text),StrToFloat(Edit7.Text)) then Begin Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; End Else ShowMessage('Data Error: End Point is not on circle!'); End Else If Str='3' then Begin p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text)); pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x<0)and(p2.y>=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
105
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if Check_Error(StrToFloat(Edit3.Text),StrToFloat(Edit4.Text),StrToFloat(Edit5.Text) ,StrToFloat(Edit6.Text),StrToFloat(Edit7.Text)) then begin Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc(pc.x,pc.y,r,p2.x,p2.y,m); Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; end else ShowMessage('Data Error: End Point is not on circle!'); End Else If Str='5' then Begin Edit4.Text:='0'; Edit5.Text:='0'; Transfer_Flag:=false; Send_Command; End Else If Str='6' then Begin Transfer_Flag:=false; Send_Command; End Else If Str='8' then Begin Edit3.Text:='0'; Edit4.Text:='0'; Edit5.Text:='0'; Transfer_Flag:=false; Send_Command; End; End;{Else} End;{if}end;
procedure TDrawing.PauseClick(Sender: TObject);begin {If auto.Suspended then begin Auto.Resume; pause.Flat:=false;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
106
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Stop.Enabled:=True; end Else begin Auto.Suspend; pause.Flat:=true; Stop.Enabled:=False; end;} If Pause_Flag then begin Pause_Flag:=False; pause.Flat:=false; Stop.Enabled:=True; end Else begin Pause_Flag:=true; pause.Flat:=true; Stop.Enabled:=False; end;end;
procedure TDrawing.StopClick(Sender: TObject);begin Close;end;Procedure Check_Out_Of_Table;Begin with bitmap.Canvas do begin if (penpos.X<(C_P.x-round(table_width/2/Image_Scale))) or (penpos.X>(C_P.x+round(table_Width/2/Image_Scale))) or (penpos.Y<(C_P.y-round(table_height/2/Image_Scale))) or (penpos.Y>(C_P.y+round(table_height/2/Image_Scale))) then Begin ShowMessage('Caûnh baùo: Hình veõ cuûa baïn ñaõ ra khoûi baøn veõ'); Check_Border:=false; End;{if} end;{with}End;procedure TDrawing.PreviewClick(Sender: TObject);var f:textfile; str:string;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
107
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù p1,p2,pc:point; m:byte; t,k,i,r:integer; Arect:TRect; Data:array[0..100]of real; temp:integer;begin If Preview.flat then begin Bitmap.Free; Preview.flat:=false; With Drawing.Image1.Canvas do begin CopyMode:=cmWhiteness; Arect:=Rect(0,0,Drawing.Image1.width,Drawing.image1.Height); CopyRect(ARect,Drawing.Image1.Canvas,ARect); CopyMode:=cmSrcCopy; pen.color:=ClBlue; moveto(0,C_P.y); lineto(Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Image1.Height); moveto(C_P.x,C_P.y); Draw_Delay:=1200-DrawSpeed.Position; Run.Enabled:=true; connect.Enabled:=true; pause.Enabled:=true; stop.Enabled:=true; ResetMachine.Enabled:=true; end; end else Begin Check_Border:=true; Bitmap:=TBitmap.Create; Bitmap.Width:=image1.Width; bitmap.Height:=image1.Height; Preview.Flat:=true; Draw_Delay:=0; Run.Enabled:=False; connect.Enabled:=False; pause.Enabled:=False; stop.Enabled:=False; ResetMachine.Enabled:=False; AssignFile(f,Destination);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
108
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Reset(f); p1.x:=0; p1.y:=0; While (not Eof(f)) do Begin Readln(f,str); If Str='G0' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clgreen; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); if check_border then Check_Out_Of_Table; p1:=p2; End Else If Str='G1' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clred; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); If Check_Border then Check_Out_Of_Table; p1:=p2; End Else if (Str='G2') then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
109
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clred; with Bitmap.canvas do begin Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); MoveTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); end; If check_Border then Check_Out_Of_Table; p1:=p2; End Else If Str='G3' then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str); p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clred; with Bitmap.canvas do begin Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); MoveTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); end; If check_Border then Check_Out_Of_Table; p1:=p2; End
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
110
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Else if str='Num Knots' then Begin readln(f,str); numknots:=StrToInt(str); End{numknots} Else if str='Num Points' then Begin readln(f,str); numpoints:=StrToInt(str); End{numpoints} Else if str='Knots' then Begin for i:=0 to numknots-1 do begin readln(f,str); Knot[i]:=Round(StrToFloat(str)*10); end; End Else if str='Control points' then Begin for i:=0 to numpoints-1 do begin Readln(f,str); Control_Point[i].x:=Round(StrToFloat(str)*10); readln(f,str); Control_Point[i].y:=Round(StrToFloat(str)*10); end; Bitmap.canvas.pen.color:=clred; P1.x:=Control_Point[0].x div 10 div Image_Scale; P1.y:=Control_Point[0].y div 10 div Image_Scale; Bitmap.Canvas.LineTo(p1.x+C_P.x,C_P.y-p1.y); for i:=knot[0] to knot[numknots-1] do begin p2.x:=0; p2.y:=0; for k:=0 to numpoints-1 do begin temp:=N(k,4,i); p2.x:=p2.x+Control_Point[k].x*temp div denom; p2.y:=p2.y+Control_Point[k].y*temp div denom; end; p2.x:=p2.x div 10 div Image_Scale; p2.y:=p2.y div 10 div Image_Scale; with bitmap.Canvas do Begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
111
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù if p2.x>p1.x then begin lineto(penpos.X+1,penpos.y); inc(p1.x); end else if p2.x<p1.x then begin lineto(penpos.X-1,penpos.y); dec(p1.x); end; if p2.y>p1.y then begin lineto(penpos.X,penpos.y-1); inc(p1.y); end else if p2.y<p1.y then begin lineto(penpos.X,penpos.y+1); dec(p1.y); end; End;{With} end;{for} p1.x:=bitmap.canvas.penpos.x; p1.y:=bitmap.canvas.penpos.y; If check_Border then Check_Out_Of_Table; End; End; {while} Closefile(f); with image1.canvas do begin pen.color:=ClBlack; Rectangle(C_P.x-round(table_width/2/Image_Scale),C_P.y-round(table_height/2/Image_Scale),C_P.x+round(table_Width/2/Image_Scale),C_P.y+round(table_height/2/Image_Scale)); pen.color:=ClBlue; moveto(0,C_P.y); lineto(Drawing.Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Drawing.Image1.Height); moveto(C_P.x,C_P.y); end; Image1.Canvas.CopyMode:=cmSrcAnd; Image1.Canvas.Draw(0,0,bitmap); end;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
112
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end;
procedure TDrawing.ResetMachineClick(Sender: TObject);var ARect:TRect;begin If Mscomm1.PortOpen=False then ShowMessage('Com Port is not opened !') Else Begin Reset_Flag:=true; Edit2.Text:='0'; Edit3.Text:=Edit6.Text; Edit4.Text:=Edit7.Text; Edit5.Text:='0'; Edit6.Text:='0'; Edit7.Text:='0'; Transfer_Flag:=false; Send_Command; Update.Enabled:=false; With Image1.Canvas do begin CopyMode:=cmWhiteness; Arect:=Rect(0,0,Image1.width,image1.Height); CopyRect(ARect,Image1.Canvas,ARect); CopyMode:=cmSrcCopy; pen.color:=ClBlue; moveto(0,C_P.y); lineto(Image1.Width,C_P.y); moveto(C_P.x,0); lineto(C_P.x,Image1.Height); moveto(C_P.x,C_P.y); end; Auto1.Enabled:=True; SingleStep1.Enabled:=True; End;{else}end;
procedure TDrawing.FormCloseQuery(Sender: TObject; var CanClose: Boolean);begin if Reset_Flag=false then If MessageDlg('Do you want to reset machine?',mtConfirmation,[mbYes,mbNo],0)=mrYes then ResetMachineClick(sender);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
113
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end;
procedure TDrawing.DrawSpeedChange(Sender: TObject);begin Draw_Delay:=1200-DrawSpeed.Position;end;
procedure TDrawing.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);begin If Preview.Flat then with image1.Canvas do begin CopyMode:=cmMergePaint; Draw(Penpos.X-C_P.x,penpos.Y-C_P.y,Bitmap); CopyMode:=cmSrcAnd; Draw(X-C_P.x,-C_P.y+Y,Bitmap); Moveto(X,Y); end;end;Function TDrawing.check_error(I,J,R,X,Y:real):Boolean;var temp:real;Begin Check_Error:=True; temp:=Sqr(X-I)+Sqr(Y-J)-Sqr(R); temp:=sqrt(abs(temp)); If Round(temp)<>0 then Check_Error:=False;End;procedure TDrawing.Draw_full;var p1,p2,pc:Point; t,k,i,r:Integer; str:string; Bitmap:TBitmap; temp:integer; Data:array[0..255]of real;Begin Bitmap:=TBitmap.Create; Bitmap.Width:=image1.Width; bitmap.Height:=image1.Height; AssignFile(f,Destination); Reset(f);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
114
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù p1.x:=0; p1.y:=0; While (not Eof(f)) do Begin Readln(f,str); If Str='G0' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clWhite; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); p1:=p2; End Else If Str='G1' then Begin Readln(f,str); p2.x:=round(StrToFloat(str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clLime; Bitmap.Canvas.MoveTo(p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); Bitmap.Canvas.LineTo(p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); p1:=p2; End Else if (Str='G2') then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str); p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clLime; with Bitmap do
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
115
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Canvas.Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale)); p1:=p2; End Else If Str='G3' then Begin Readln(f,str); pc.x:=Round(StrToFloat(str)); Readln(f,str); pc.y:=Round(StrToFloat(str)); Readln(f,str); r:=Round(StrToFloat(str)); Readln(f,str); p2.x:=round(StrToFloat(Str)); Readln(f,str); p2.y:=round(StrToFloat(str)); Bitmap.canvas.pen.color:=clLime; with Bitmap do Canvas.Arc((pc.x-r) div Image_Scale+C_P.x,C_P.y-((pc.y-r) div Image_Scale) ,(pc.x+r) div Image_Scale+C_P.x,C_P.y-((pc.y+r) div Image_Scale) ,p1.x div Image_Scale+C_P.x,C_P.y-(p1.y div Image_Scale) ,p2.x div Image_Scale+C_P.x,C_P.y-(p2.y div Image_Scale)); p1:=p2; End Else if str='Num Knots' then Begin readln(f,str); numknots:=StrToInt(str); End{numknots} Else if str='Num Points' then Begin readln(f,str); numpoints:=StrToInt(str); End{numpoints} Else if str='Knots' then Begin for i:=0 to numknots-1 do begin readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
116
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Knot[i]:=Round(StrToFloat(str)*10); end; End{knots} Else if str='Control points' then Begin for i:=0 to numpoints-1 do begin readln(f,str); Control_Point[i].x:=Round(StrToFloat(str)*10); readln(f,str); Control_Point[i].y:=Round(StrToFloat(str)*10); end; Bitmap.canvas.pen.color:=clLime; P1.x:=Control_Point[0].x div 10 div Image_Scale; P1.y:=Control_Point[0].y div 10 div Image_Scale; Bitmap.Canvas.LineTo(p1.x+C_P.x,C_P.y-p1.y); for i:=knot[0] to knot[numknots-1] do begin p2.x:=0; p2.y:=0; for k:=0 to numpoints-1 do begin temp:=N(k,4,i); p2.x:=p2.x+Control_Point[k].x*temp div denom; p2.y:=p2.y+Control_Point[k].y*temp div denom; end; p2.x:=p2.x div 10 div Image_Scale; p2.y:=p2.y div 10 div Image_Scale; with bitmap.Canvas do Begin if p2.x>p1.x then begin lineto(penpos.X+1,penpos.y); inc(p1.x); end else if p2.x<p1.x then begin lineto(penpos.X-1,penpos.y); dec(p1.x); end; if p2.y>p1.y then begin lineto(penpos.X,penpos.y-1); inc(p1.y); end
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
117
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù else if p2.y<p1.y then begin lineto(penpos.X,penpos.y+1); dec(p1.y); end; End;{With} end;{for i} p1:=p2; End; End; {while} Closefile(f); Image1.Canvas.CopyMode:=cmSrcAnd; Image1.Canvas.Draw(0,0,bitmap); Bitmap.Free;End;
Procedure TDrawing.Spline;var i,k,temp,x,y,old_x,old_y:integer;Begin old_x:=Control_Point[0].x div 10 div Image_Scale; old_y:=Control_Point[0].y div 10 div Image_Scale; i:=Knot[0]; while i<=knot[numknots-1] do begin if not(Pause_Flag) then BEGIN inc(i); x:=0; y:=0; for k:=0 to numpoints-1 do begin temp:=N(k,4,i); x:=x+Control_Point[k].x*temp div denom; y:=y+Control_Point[k].y*temp div denom; end; x:=x div 10 div Image_Scale; y:=y div 10 div Image_Scale; with image1.Canvas do begin if x>old_x then begin lineto(penpos.X+1,penpos.y); inc(old_x); end
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
118
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù else if x<old_x then begin lineto(penpos.X-1,penpos.y); dec(old_x); end; if y>old_y then begin lineto(penpos.X,penpos.y-1); inc(old_y); end else if y<old_y then begin lineto(penpos.X,penpos.y+1); dec(old_y); end; end;{with} Sleep(Draw_Delay div 5); END;{if pause_flag} Application.ProcessMessages; end;End;
Procedure TDrawing.Run_Draw;Var f:TextFile; Str:string; p1,p2,pc:Point; r:integer; m:byte; i,temp:integer;Begin Drawing.Run.Enabled:=false; AssignFile(f,Send_File); Reset(f); While (not Eof(f)) do Begin If (Transfer_Flag)and(AutoRun_Flag)and(not(Pause_Flag)) then Readln(f,str); If Str='G0' then Begin Edit2.Text:='0'; Readln(f,str); Edit3.Text:=str; Readln(f,str); Edit4.Text:=str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
119
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Edit5.Text:=str; Readln(f,str); Edit6.Text:=str; Readln(f,str); Edit7.Text:=str; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Drawing.Send_Command; image1.canvas.pen.color:=clgreen; DrawLine(p1,p2); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End Else If Str='G1' then Begin Edit2.Text:='1'; readln(f,str); Edit3.Text:=str; readln(f,str); Edit4.Text:=str; readln(f,str); Edit5.Text:=str; readln(f,str); Edit6.Text:=str; readln(f,str); Edit7.Text:=str; p1.x:=round(StrToFloat(Edit3.Text)); p1.y:=round(StrToFloat(Edit4.Text)); p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); Transfer_Flag:=false; Send_Command; image1.canvas.pen.color:=clred; DrawLine(p1,p2); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
120
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù end; End Else if Str='G2' then Begin Edit2.Text:='2'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text)); pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x<=0)and(p2.y>0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End Else If Str='G3' then Begin Edit2.Text:='3'; Readln(f,str); Edit3.Text:=Str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
121
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; p2.x:=round(StrToFloat(Edit6.Text)); p2.y:=round(StrToFloat(Edit7.Text)); r:=Round(StrToFloat(Edit5.Text)); pc.x:=Round(StrToFloat(Edit3.Text)); pc.y:=Round(StrToFloat(Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x<0)and(p2.y>=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4; Transfer_Flag:=false; image1.canvas.pen.color:=clred; Send_Command; Arc(pc.x,pc.y,r,p2.x,p2.y,m); if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End Else if str='G6' then Begin Edit2.Text:='6'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str);
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
122
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G6} Else if str='G7' then Begin Edit2.Text:='7'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; image1.canvas.pen.color:=clred; Spline; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G7} Else if str='G8' then Begin Edit2.Text:='8'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
123
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G8} Else if str='G9' then Begin Edit2.Text:='9'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then begin AutoRun_Flag:=False; Update.Enabled:=True; end; End{G9} Else if str='G10' then Begin Edit2.Text:='10'; Readln(f,str); Edit3.Text:=Str; Readln(f,str); Edit4.Text:=Str; Readln(f,str); Edit5.Text:=Str; Readln(f,str); Edit6.Text:=Str; Readln(f,str); Edit7.Text:=Str; Transfer_Flag:=false; Send_Command; if SingleStep1.Checked then
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
124
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù begin AutoRun_Flag:=False; Update.Enabled:=True; end; End;{G10} Application.ProcessMessages; End; {while} CloseFile(f); ShowMessage('End of file!'); Update.enabled:=True; Send.Enabled:=false; Command1.Enabled:=True;End;end.
unit AutoRun;procedure TRun.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }
{ TRun }
procedure TRun.Execute;const n=30;Var f:TextFile; Str:string; p1,p2,pc:Point; r:integer; m:byte; i,temp,NumKnots,NumPoints:integer;begin { Place thread code here } FreeOnTerminate:=true; Drawing.Run.Enabled:=false; AssignFile(f,Destination); Reset(f); While (not Eof(f)) do Begin If {(Transfer_Flag)and}(AutoRun_Flag) then Readln(f,str); If Str='G0' then Begin
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
125
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Drawing.Edit5.Text:='0'; Drawing.Edit2.Text:='0'; Drawing.Edit3.Text:=Drawing.Edit6.Text; Drawing.Edit4.Text:=Drawing.Edit7.Text; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p1.x:=round(StrToFloat(Drawing.Edit3.Text)); p1.y:=round(StrToFloat(Drawing.Edit4.Text)); p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); Transfer_Flag:=false; Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clgreen; Drawing.DrawLine(p1,p2); {Drawing.Send.Enabled:=false;} if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else If Str='G1' then Begin Drawing.Edit5.Text:='0'; Drawing.Edit2.Text:='1'; Drawing.Edit3.Text:=Drawing.Edit6.Text; Drawing.Edit4.Text:=Drawing.Edit7.Text; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p1.x:=round(StrToFloat(Drawing.Edit3.Text)); p1.y:=round(StrToFloat(Drawing.Edit4.Text)); p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clred; Drawing.DrawLine(p1,p2); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
126
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Drawing.Update.Enabled:=True; end; End Else if Str='G2' then Begin Drawing.Edit2.Text:='2'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); r:=Round(StrToFloat(Drawing.Edit5.Text)); pc.x:=Round(StrToFloat(Drawing.Edit3.Text)); pc.y:=Round(StrToFloat(Drawing.Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>0)and(p2.y>=0) then m:=1 else if (p2.x<=0)and(p2.y>0) then m:=2 else if (p2.x<0)and(p2.y<=0) then m:=3 else if (p2.x>=0)and(p2.y<0) then m:=4; Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.image1.canvas.pen.color:=clred; Drawing.Send_Command; Drawing.Arc_QN(pc.x,pc.y,r,p2.x,p2.y,m); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else If Str='G3' then Begin Drawing.Edit2.Text:='3';
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
127
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str; Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; p2.x:=round(StrToFloat(Drawing.Edit6.Text)); p2.y:=round(StrToFloat(Drawing.Edit7.Text)); r:=Round(StrToFloat(Drawing.Edit5.Text)); pc.x:=Round(StrToFloat(Drawing.Edit3.Text)); pc.y:=Round(StrToFloat(Drawing.Edit4.Text)); p2.x:=p2.x-pc.x; p2.y:=p2.y-pc.y; if (p2.x>=0)and(p2.y>0) then m:=1 else if (p2.x<0)and(p2.y>=0) then m:=2 else if (p2.x<=0)and(p2.y<0) then m:=3 else if (p2.x>0)and(p2.y<=0) then m:=4; Transfer_Flag:=false; {Drawing.Send.Enabled:=false;} Drawing.image1.canvas.pen.color:=clred; Drawing.Send_Command; Drawing.Arc(pc.x,pc.y,r,p2.x,p2.y,m); if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End Else if str='G6' then Begin Drawing.Edit2.Text:='6'; Readln(f,str); Drawing.Edit3.Text:=Str; Readln(f,str); Drawing.Edit4.Text:=Str; Readln(f,str); Drawing.Edit5.Text:=Str;
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
128
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Readln(f,str); Drawing.Edit6.Text:=Str; Readln(f,str); Drawing.Edit7.Text:=Str; Transfer_Flag:=false; Drawing.Send_Command; if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End{G6} Else if str='End Spline' then Begin Drawing.Edit2.Text:='7'; Drawing.Edit3.Text:='0'; Drawing.Edit4.Text:='0'; Drawing.Edit5.Text:='0'; Drawing.Edit6.Text:='0'; Drawing.Edit7.Text:='0'; Transfer_Flag:=false; Drawing.Send_Command; Drawing.image1.canvas.pen.color:=clred; Drawing.Spline; if drawing.SingleStep1.Checked then begin AutoRun_Flag:=False; Drawing.Update.Enabled:=True; end; End; End; {while} CloseFile(f); ShowMessage('End of file!'); Drawing.Update.enabled:=True; Drawing.Send.Enabled:=false; Drawing.Command1.Enabled:=True;end;end.
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
129
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CHÖÔNG TRÌNH CHO VI XÖÛ LYÙ MAIN PROGRAM $Title(---MAIN PROGRAM---)$Debug$PageWidth(98)$NoPaging$Include (macros.inc)
X1H equ 32H ;XCHX1L equ 33H ;XCLY1H equ 34H ;YCHY1L equ 35H ;YCLBKH equ 36HBKL equ 37HX2H equ 38HX2L equ 39HY2H equ 3AHY2L equ 3BHDeltaXH equ 3CH ;D1HDeltaXL equ 3DH ;D1LDeltaYH equ 3EH ;D2HDeltaYL equ 3FH ;D2LDinc1H equ 40HDinc1L equ 41HDinc2H equ 42H
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
130
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Dinc2L equ 43HXH equ 44HXL equ 45HYH equ 46HYL equ 47HCur_XH equ 48HCur_XL equ 49HCur_YH equ 4AHCur_YL equ 4BHCH equ 4CHCL equ 4DHPointerX equ 4EHPointerY equ 4FHKey equ 50H ;Phím hieän ñang ñöôïc nhaánKey_Counter equ 51H ;Soá laàn phím ñöôïc nhaánKey_Pressed equ 52H ;Phím thöïc söï ñöôïc nhaánTimerCountequ 53HTimerCount1 equ 54HDataIn_Counter equ 55HCircle14 equ 56HOut_Led equ 57HDataOut_Counter equ 58HSpeed equ 59HPress_Counter equ 5AHK equ 5BHTH equ 5CHTL equ 5DHExt_Data equ 5EHLCD_Pointer equ 5FHNBaseAddr equ 7BHTMP_3 equ 7CHTMP_2 equ 7DHTMP_1 equ 7EHTMP_0 equ 7FHKeyOut equ 20H
MotorX_Bit bit P1.1MotorY_Bit bit P1.2B1 bit 10HC1 bit 11HD1 bit 12HKeyPressed bit 13HTimer_F1 bit 14H ;Côø baùo ñaõ chaïy ñöôïc 16 laàn TimeBase
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
131
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Timer_F2 bit 15HDraw_Flag bit 16HTransmit_Flag bit 17HMotor_Flag bit 18HLine_Draw bit 19HCircle_Rev_Draw bit 1AHCircle_For_Draw bit 1BHSpline_Draw bit 1CHGR_Flag bit 1DHEQ_Flag bit 1EHLE_Flag bit 1FHData_Out bit 20HX_Del bit 21HY_Del bit 22HLCD_Busy bit 23HRun bit 24HLCD_Display_Flag bit 25HF1 bit KeyOut.0 ;Nuùt thöù 1F2 bit KeyOut.1 ;Nuùt thöù 2F3 bit KeyOut.2 ;Nuùt thöù 3F4 bit KeyOut.3 ;Nuùt thöù 4KeyIn bit P1.7Start bit P2.4Press bit P2.5Led_EN bit P1.3Start_X bit P3.4End_X bit P3.5Start_Y bit P3.2End_Y bit P3.3Pen_Lift bit P3.6RS bit P1.4RW bit P1.5E bit P1.6
MotorStep equ 4Step_Unit equ 1KeyCount equ 5 ;Soá laàn queùt ñeå xaùc ñònh moät phím ñöôïc nhaán thöïc söïTimeBase equ -250 ;Thôøi gian neànTimeCount equ 16 ;Soá laàn laëp TimeBaseV equ 150 ;Van toc dong coKeyNumberequ 4 ;Soá phím nhaánDataInByte equ 12
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
132
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù DataBaseAddr equ 30HPC_Addr equ 1DataOutByte equ 4PressCount equ 100NumKnots equ 80HNumPoints equ 81HKnotBaseAddr equ 82H
ORG 0000HLJMP MainORG 000BHLJMP ISR_Timer0Main: ;Khoi dong Serial Port va Timer ISR :
CALL Serial_Port_Timer_Init ;Gan cac bit :
CALL Bit_Init
;Nap cac gia tri hang so :CALL Variable_InitCALL Pen_UpCALL LCD_Init
;Chuong trinh :Operation:
JNB Timer_F1,Next_OperationCLR Timer_F1JB Press,Pen_Not_PressDJNZ Press_Counter,Pen_Not_PressMOV Press_Counter,#PressCountSETB Press
Pen_Not_Press:CALL Limit_Control
CALL Out_Led_ControlCALL Transfer
JB Start,Auto_Control Manual_Control:
CALL Delete_Direction_LEDCALL KeyDecoderCALL ManualJMP End_Operation
End_Manual_Control: Auto_Control:
SETB Run
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
133
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CALL Turn_On_AUTO_LEDCALL Draw_IdentifyCALL Position_Output
Next_Operation: JNB Timer_F2,End_Operation
CLR Timer_F2JNB Start,Stop_System_Label;CALL Delete_PulseCALL Motor_Control_DrawingJMP End_Operation
Stop_System_Label:CALL Stop_System
End_Auto_Control:End_Operation:
JMP Operation
ISR_Timer0:DJNZ TimerCount,Next_ISR_Timer0SETB Timer_F1MOV TimerCount,#TimeCount
Next_ISR_Timer0:DJNZ TimerCount1,End_ISR_Timer0SETB Timer_F2MOV TimerCount1,Speed
End_ISR_Timer0:RETI
$Include ( Maths.inc )$Include ( Dkdc.inc )$Include ( Draw.inc )$Include ( Key.inc )$Include ( Transfer.inc )$Include ( Manual.inc )$Include ( Auto.inc )$Include ( Routine.inc )
;**** Table ****Motor_Control_Table:
;DB 00H,15H,05H,0DH,09H,0BH,0AH,1AH,12H,16H,14HDB 00H,0FEH,0FDH,0FBH,0F7H
END MATH.INC:;===========================================;Control_Point[k]
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
134
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;Input : R5 ;Output : R7,R6;Destroy : R5,R6,R7;===========================================Control_Point_X_Sub:
PUSH 00HMOV R0,#NumKnotsMOV A,@R0RL AADD A,#KnotBaseAddrMOV B,AMOV A,R5RL ARL AADD A,BMOV R0,AMOV A,@R0MOV R7,AINC R0MOV A,@R0MOV R6,APOP 00H
End_Control_Point_X_Sub:RET
Control_Point_Y_Sub:PUSH 00HMOV R0,#NumKnotsMOV A,@R0RL AADD A,#KnotBaseAddrMOV B,AMOV A,R5RL ARL AADD A,BMOV R0,AINC R0INC R0MOV A,@R0MOV R7,AINC R0MOV A,@R0MOV R6,APOP 00H
End_Control_Point_Y_Sub:
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
135
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
RET;===========================================;N(k,m,t);Input : X1H,X1L,Y1H,Y1L - BKH,BKL;Output : TMP_3,TMP_2,TMP_1,TMP_0 - R7,R6;Destroy : A,B,R7,R6,R5,R4,R3;===========================================N_Sub:
PUSH 0%Get_Value#(5)CJNE A,#1,m_khac_1%Get_Value#(4) ;m baèng 1%Knot (A,TMP_1,TMP_0) ;tính knot[k]%Get_Value#(6) ;laáy giaù tri tMOV B,A%Get_Value#(7)%CMP (B,A,TMP_1,TMP_0) ;so saùnh t vôùi knot[k]JC N_bang_0%Get_Value#(4)INC A%Knot (A,TMP_1,TMP_0) ;tính knot[k+1]%INC16 (TMP_1,TMP_0,TMP_1,TMP_0)%Get_Value#(6) ;laáy giaù trò tMOV B,A%Get_Value#(7)%CMP (B,A,TMP_1,TMP_0) ;so saùnh t vôùi knot[k+1]JNC N_bang_0MOV R0,NBaseAddrMOV @R0,#7FHINC R0MOV @R0,#0FFHJMP End_N_Sub
N_bang_0:MOV R0,NBaseAddrMOV @R0,#0INC R0MOV @R0,#0JMP End_N_Sub
m_khac_1:%Get_Value#(4) ;A=k%Knot (A,TMP_1,TMP_0) ;Knot[k]%Get_Value#(4) ;A=kMOV B,A ;B=k%Get_Value#(5) ;A chöùa mADD A,B
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
136
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
DEC A%Knot (A,TMP_3,TMP_2) ;Knot[k+m-1]%SUB16 (TMP_3,TMP_2,TMP_1,TMP_0,TMP_1,TMP_0)%Set_Value#(8,TMP_1) ;gaùn giaù trò%Set_Value#(9,TMP_0) ;denom%CMPZ (TMP_1,TMP_0)JNB EQ_Flag,Denom_khac_0MOV A,NBaseAddrADD A,#2MOV R0,AMOV @R0,#0INC R0MOV @R0,#0JMP N_Sub_Next
Denom_khac_0:%Get_Value#(4)MOV TMP_3,A ;TMP_3=k%Get_Value#(5)DEC AMOV TMP_2,A ;TMP_2=m-1%Get_Value#(6)MOV TMP_1,A ;TMP_1= byte cao t%Get_Value#(7)MOV TMP_0,A ;TMP_1= byte thaáp tMOV A,NBaseAddr ;Chuyeån ADD A,#10 ;con troû MOV NBaseAddr,A ;ñòa chæ%Set_Value#(4,TMP_3) ;k = k%Set_Value#(5,TMP_2) ;m = m-1%Set_Value#(6,TMP_1) ;t=t%Set_Value#(7,TMP_0) ;t=tCALL N_sub%Get_Value#(6) ;laáyMOV X1H,A ;giaù%Get_Value#(7) ;tròMOV X1L,A ;t%Get_Value#(4) ;tính%Knot (A,Y1H,Y1L);knot[k]%SUB16 (X1H,X1L,Y1H,Y1L,X1H,X1L) ;t-knot[k]%Get_Value#(0) ;laáyMOV Y1H,A ;giaù%Get_Value#(1) ;tròMOV Y1L,A ;N%MUL16 (X1H,X1L,Y1H,Y1L) ;(t-knot[k])*N%Get_Value#(8) ;laáy
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
137
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV Y2H,A ;giaù%Get_Value#(9) ;tròMOV Y2L,A ;denom%DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;(t-
knot[k])*N/denom%Set_Value#(2,TMP_1)%Set_Value#(3,TMP_0)
N_Sub_Next:%Get_Value#(4) ;A=kINC A ;A=k+1%Knot (A,TMP_1,TMP_0) ;tính knot[k+1]%Get_Value#(4) ;A=kMOV B,A ;B=k%Get_Value#(5) ;A=mADD A,B ;A=k+m%Knot (A,TMP_3,TMP_2) ;tính knot[k+m]%SUB16 (TMP_3,TMP_2,TMP_1,TMP_0,TMP_1,TMP_0) ;knot[k+m]
- knot[k+1]%Set_Value#(8,TMP_1) ;gaùn giaù trò%Set_Value#(9,TMP_0) ;denom%CMPZ (TMP_1,TMP_0)JNB EQ_Flag,Denom_khac_0_L1%Get_Value#(8) ;laáyMOV TMP_1,A ;giaù %Get_Value#(9) ;tròMOV TMP_0,A ;sum%Set_Value#(0,TMP_1) ;N=sum%Set_Value#(1,TMP_0) ;N=sumJMP End_N_Sub
Denom_khac_0_L1:%Get_Value#(4)INC AMOV TMP_3,A ;TMP_3=k+1%Get_Value#(5)DEC AMOV TMP_2,A ;TMP_2=m-1%Get_Value#(6)MOV TMP_1,A ;TMP_1= byte cao t%Get_Value#(7)MOV TMP_0,A ;TMP_1= byte thaáp tMOV A,NBaseAddr ;Chuyeån ADD A,#10 ;con troû MOV NBaseAddr,A ;ñòa chæ%Set_Value#(4,TMP_3) ;k = k+1%Set_Value#(5,TMP_2) ;m = m-1
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
138
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
%Set_Value#(6,TMP_1) ;t=t%Set_Value#(7,TMP_0) ;t=tCALL N_sub%Get_Value#(4) ;A=kMOV B,A ;B=k%Get_Value#(5) ;A=mADD A,B ;A=k+m%Knot (A,X1H,X1L) ;tính knot[k+m]%Get_Value#(6) ;laáyMOV Y1H,A ;giaù %Get_Value#(7) ;tròMOV Y1L,A ;t%SUB16 (X1H,X1L,Y1H,Y1L,X1H,X1L) ;knot[k+m] - t%Get_Value#(0) ;laáyMOV Y1H,A ;giaù %Get_Value#(1) ;tròMOV Y1L,A ;N%MUL16 (X1H,X1L,Y1H,Y1L) ;(knot[k+m]-t)*N%Get_Value#(8) ;laáyMOV Y2H,A ;giaù%Get_Value#(9) ;tròMOV Y2L,A ;denom%DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;
(knot[k+m]-t)*N/denom%Get_Value#(2) ;laáyMOV TMP_3,A ;giaù%Get_Value#(3) ;tròMOV TMP_2,A ;sum%ADD16 (TMP_3,TMP_2,TMP_1,TMP_0,TMP_1,TMP_0) ;sum+
(knot[k+m]-t)*N/denom%Set_Value#(0,TMP_1) ;N=sum%Set_Value#(1,TMP_0) ;N=sum
End_N_Sub:%Get_Value#(5)CJNE A,#4,m_khac_4JMP N_Sub_Return
m_khac_4:%Get_Value#(0) ;laáy MOV TMP_1,A ;giaù trò N %Get_Value#(1) ;ñöa leân MOV TMP_0,A ;taàng tröôùcCLR CMOV A,NBaseAddr ;Chuyeån SUBB A,#10 ;con troû MOV NBaseAddr,A ;ñòa chæ
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
139
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
%Set_Value#(0,TMP_1) ;N = N%Set_Value#(1,TMP_0) ;N = N
N_Sub_Return:POP 0RET
;===========================================;Laáy giaù trò oâ nhôù leäch khoûi NBaseAddr moät ñoaïn k;Input : R7;Output : A;===========================================Get_Value_Sub:
PUSH 0MOV A,NBaseAddrADD A,R7MOV R0,AMOV A,@R0POP 0
End_Get_Value_Sub:RET
;===========================================;Gaùn giaù trò cho oâ nhôù thöù k ;Input : R7(k),R6(giaù trò);===========================================Set_Value_Sub:
PUSH 0MOV A,NBaseAddrADD A,R7MOV R0,AMOV A,R6MOV @R0,APOP 0
End_Set_Value_Sub:RET
;===========================================;Div 32 bit;Input : X1H,X1L,Y1H,Y1L - BKH,BKL;Output : TMP_3,TMP_2,TMP_1,TMP_0 - R7,R6;Destroy : A,B,R7,R6,R5,R4,R3;===========================================DIV32_Sub:
PUSH X1HMOV R7,#0MOV R6,#0 ;zero out partial remainder
MOV TMP_0,#0 MOV TMP_1,#0
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
140
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù MOV TMP_2,#0 MOV TMP_3,#0 MOV R4,BKH ;load divisor MOV R3,BKL MOV R5,#32 ;loop count ;This begins the loop Div_loop: CALL Shift_D ;shift the dividend and return MSB in C MOV A,R6 ;shift carry into LSB of partial remainder RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A ;now test to see if R7:R6 >= R4:R3 CLR C MOV A,R7 ;subtract R4 from R7 to see if R4 < R7 SUBB A,R4 ; A = R7 - R4, carry set if R7 < R4 JC Cant_sub ;at this point R7>R4 or R7=R4 JNZ Can_sub ;jump if R7>R4 ;if R7 = R4, test for R6>=R3 CLR C MOV A,R6 SUBB A,R3 ; A = R6 - R3, carry set if R6 < R3 JC Cant_sub Can_sub: ;subtract the divisor from the partial remainder CLR C MOV A,R6 SUBB A,R3 ; A = R6 - R3 MOV R6,A MOV A,R7 SUBB A,R4 ; A = R7 - R4 - Borrow MOV R7,A SETB C ; shift a 1 into the quotient JMP Quot Cant_sub: ;shift a 0 into the quotient CLR C Quot: ;shift the carry bit into the quotient CALL Shift_Q ; Test for competion DJNZ R5,Div_loop
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
141
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
POP X1HMOV A,X1HJNB ACC.7,End_DIV32_SubMOV Y1H,#0FFHMOV Y1L,#0FDH%ADD16 (TMP_1,TMP_0,Y1H,Y1L,TMP_1,TMP_0)
End_DIV32_Sub:RET
;===========================================;Shift_D;===========================================Shift_D: ;shift the dividend one bit to the left and return the MSB in C CLR C MOV A,Y1L RLC A MOV Y1L,A MOV A,Y1H RLC A MOV Y1H,A MOV A,X1L RLC A MOV X1L,A MOV A,X1H RLC A MOV X1H,AEnd_Shift_D: RET;===========================================;Shift_Q;===========================================Shift_Q: ;shift the quotent one bit to the left and shift the C into LSB MOV A,TMP_0 RLC A MOV TMP_0,A MOV A,TMP_1 RLC A MOV TMP_1,A MOV A,TMP_2 RLC A MOV TMP_2,A MOV A,TMP_3 RLC A MOV TMP_3,A
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
142
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù End_Shift_Q:
RET;===========================================;Mul 32 bit;Input : R7,R6,R5,R4 - R3,R2;Output : TMP_3,TMP_2,TMP_1,TMP_0;Destroy : A,B,R7,R6,R5,R4,R3,R2;===========================================MUL32_Sub:
MOV TMP_3,#0 ;clear out upper 16 bitsMOV TMP_2,#0
;Generate the lowest byte of the resultMOV B,R4
MOV A,R2 MUL AB MOV TMP_0,A ;low-order result MOV TMP_1,B ;high_order result ;Now generate the next higher order byte MOV B,R5 MOV A,R2 MUL AB ADD A,TMP_1 ;low-order result MOV TMP_1,A ; save MOV A,B ; get high-order result ADDC A,TMP_2 ; include carry from previous operation MOV TMP_2,A ; save JNC Mul32_loop1 INC TMP_3 ; propagate carry into TMP_3 Mul32_loop1: MOV B,R4 MOV A,R3 MUL AB ADD A,TMP_1 ;low-order result MOV TMP_1,A ; save MOV A,B ; get high-order result ADDC A,TMP_2 ; include carry from previous operation MOV TMP_2,A ; save JNC Mul32_loop2 INC TMP_3 ; propagate carry into TMP_3 Mul32_loop2: ; Now start working on the 3rd byte MOV B,R6 MOV A,R2 MUL AB ADD A,TMP_2 ;low-order result
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
143
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù MOV TMP_2,A ; save MOV A,B ; get high-order result ADDC A,TMP_3 ; include carry from previous operation MOV TMP_3,A ; save ; Now the other half MOV B,R5 MOV A,R3 MUL AB ADD A,TMP_2 ;low-order result MOV TMP_2,A ; save MOV A,B ; get high-order result ADDC A,TMP_3 ; include carry from previous operation MOV TMP_3,A ; save ; Now finish off the highest order byte MOV B,R7 MOV A,R2 MUL AB ADD A,TMP_3 ;low-order result MOV TMP_3,A ; save ; Forget about the high-order result, this is only 32 bit math! MOV B,R6 MOV A,R3 MUL AB ADD A,TMP_3 ;low-order result MOV TMP_3,A ; saveEnd_Mul32_Sub:
RET;===========================================;Mul 16 bit;Input : R7,R6 - R5,R4 ;Output : TMP_3,TMP_2,TMP_1,TMP_0;Destroy : A,B,R7,R6,R5,R4;===========================================MUL16_Sub:
MOV TMP_3,#0MOV TMP_2,#0MOV B,R6MOV A,R4MUL ABMOV TMP_0,AMOV TMP_1,BMOV B,R7MOV A,R4MUL ABADD A,TMP_1
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
144
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV TMP_1,AMOV A,BADDCA,TMP_2MOV TMP_2,AJNC Mul16_loop1INC TMP_3
Mul16_Loop1:MOV B,R6MOV A,R5MUL ABADD A,TMP_1MOV TMP_1,AMOV A,BADDCA,TMP_2MOV TMP_2,AJNC Mul16_loop2INC TMP_3
Mul16_loop2:MOV B,R7MOV A,R5MUL ABADD A,TMP_2 MOV TMP_2,AMOV A,BADDCA,TMP_3MOV TMP_3,A
End_MUL16_Sub:RET
;===========================================;Knot[k];Input : R5 ;Output : R7,R6;Destroy : R5,R6,R7;===========================================Knot_K_Sub:
PUSH 00HMOV A,R5RL AADD A,#KnotBaseAddrMOV R0,AMOV A,@R0MOV R7,AINC R0MOV A,@R0MOV R6,A
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
145
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
POP 00HEnd_Knot_K_Sub:
RET;===========================================;Compare with Zero;Input : R7,R6 ;Output : GR_Flag,EQ_Flag,LE_Flag;Destroy : R7,R6;===========================================CMPZ_Sub:
CLR GR_FlagCLR EQ_FlagCLR LE_FlagMOV A,R7JNB ACC.7,Value_GEZSETB LE_FlagJMP End_CMPZ_Sub
Value_GEZ:JNZ Value_GZMOV A,R6JNZ Value_GZSETB EQ_FlagJMP End_CMPZ_Sub
Value_GZ:SETB GR_Flag
End_CMPZ_Sub:RET
;===========================================;Compare_sub;Input : R5,R4 - R3,R2;Output : C;Destroy : R7,R6,R5,R4,R3,R2,C;===========================================CMP_sub:
CALL SUB16_SubMOV A,R7JNB ACC.7,Clear_CarrySETB CJMP End_CMP_Sub
Clear_Carry:CLR C
End_CMP_Sub:RET
;===========================================;ABS_sub
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
146
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;Input : R7_R6;Ouput : R7_R6;Destroy : R7,R6,C;===========================================ABS_Sub:
MOV A,R7JNB ACC.7,End_ABS_SubMOV A,R6CPL AADD A,#1MOV R6,AMOV A,R7CPL AADDCA,#0MOV R7,A
End_ABS_Sub:RET
;===========================================;SUB16_sub ;Input : R5,R4 - R3,R2;Output : R7,R6,C;Destroy : R7,R6,R5,R4,R3,R2,C;===========================================SUB16_sub:
MOV A,R4CLR CSUBB A,R2MOV R6,AMOV A,R5SUBB A,R3MOV R7,A
End_SUB16_Sub:RET
;===========================================;ADD16_sub;Input : R5,R4 + R3,R2;Output : R7,R6;Destroy: R7,R6,R5,R4,R3,R2,C;===========================================ADD16_sub:
MOV A,R4ADD A,R2MOV R6,AMOV A,R5ADDCA,R3
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
147
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV R7,AEnd_ADD16_Sub:
RET;===========================================;INC16_sub;Input : R7,R6 ;Output : R7,R6;Destroy: R7,R6,C;===========================================INC16_Sub:
MOV A,R6ADD A,#1MOV R6,AMOV A,R7ADDCA,#0MOV R7,A
End_INC16_Sub:RET
;===========================================;DEC16_sub;Input : R7,R6 ;Output : R7,R6;Destroy: R7,R6,C;===========================================DEC16_Sub:
CLR CMOV A,R6SUBB A,#1MOV R6,AMOV A,R7SUBB A,#0MOV R7,A
End_DEC16_Sub:RET
;===========================================;SHR_sub ;Input : R7,R6;Output : R7,R6;Destroy: R7,R6,C;===========================================SHR_sub:
CLR CMOV A,R7JNB ACC.7,Pos_SHRSETB C
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
148
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Pos_SHR:
RRC AMOV R7,AMOV A,R6RRC AMOV R6,A
End_SHR_Sub:RET
;===========================================;SHL_sub;Input : R7,R6;Output : R7,R6;Destroy : R7,R6,C;===========================================SHL_sub:
CLR CMOV A,R6RLC AMOV R6,AMOV A,R7RLC AMOV R7,A
End_SHL_Sub:RET
;===========================================;Sign_sub;Input : R7_R6;Ouput : R7_R6;Destroy : R7,R6,C;===========================================Sign_Sub:
MOV A,R6CPL AADD A,#1MOV R6,AMOV A,R7CPL AADDCA,#0MOV R7,A
End_Sign_Sub:RET
ÑKÑC.INC:;================================================
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
149
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;Go Left;================================================Left_Control:
JNB Start,Not_Dec16_Left%DEC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL)
Not_Dec16_Left:MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00000001BMOV Out_Led,APUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Left:MOV A,PointerXMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorX_BitNOPCLR MotorX_BitPOP P0DJNZ PointerX,Next_LeftMOV PointerX,#MotorStep
Next_Left: DJNZ R7,Loop_LeftSETB X_Del
End_Left_Control:RET
;================================================;Go Right;================================================Right_Control:
JNB Start,Not_Inc16_Right%INC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL)
Not_Inc16_Right:MOV R7,#Step_Unit
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
150
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00001000BMOV Out_Led,APUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Right:MOV A,PointerXMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorX_BitNOPCLR MotorX_BitPOP P0INC PointerXMOV A,PointerXCJNE A,#MotorStep+1,Next_RightMOV PointerX,#1
Next_Right:DJNZ R7,Loop_RightSETB X_Del
End_Right_Control:RET
;================================================;Go Up;================================================Up_Control:
JNB Start,Not_Inc16_Up%INC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL)
Not_Inc16_Up:MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00000010BMOV Out_Led,APUSH P0
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
151
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Up:;JNB Timer_F2,$;CLR Timer_F2MOV A,PointerYMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorY_BitNOPCLR MotorY_BitPOP P0DJNZ PointerY,Next_UpMOV PointerY,#MotorStep
Next_Up:DJNZ R7,Loop_UpSETB Y_Del
End_Up_Control: RET;================================================;Go Down;================================================Down_Control:
JNB Start,Not_Dec16_Down%DEC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL)
Not_Dec16_Down:MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00000100BMOV Out_Led,APUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Down:;JNB Timer_F2,$
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
152
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
;CLR Timer_F2MOV A,PointerYMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorY_BitNOPCLR MotorY_BitPOP P0INC PointerYMOV A,PointerYCJNE A,#MotorStep+1,Next_DownMOV PointerY,#1
Next_Down:DJNZ R7,Loop_DownSETB Y_Del
End_Down_Control: RET;================================================;Go Up_Left;================================================Up_Left_Control:
JNB Start,Not_DI16_Up_Left%DEC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL)%INC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL)
Not_DI16_Up_Left:MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00000011BMOV Out_Led,APUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Up_Left:MOV A,PointerXMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorX_Bit
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
153
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
NOPCLR MotorX_BitPOP P0DJNZ PointerX,Next_Up_Left1MOV PointerX,#MotorStep
Next_Up_Left1: MOV A,PointerYMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorY_BitNOPCLR MotorY_BitPOP P0DJNZ PointerY,Next_Up_Left2MOV PointerY,#MotorStep
Next_Up_Left2:DJNZ R7,Loop_Up_LeftSETB X_DelSETB Y_Del
End_Up_Left_Control:RET
;================================================;Go Up_Right;================================================Up_Right_Control:
JNB Start,Not_DI16_Up_Right%INC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL)%INC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL)
Not_DI16_Up_Right:MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00001010BMOV Out_Led,APUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Up_Right:
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
154
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV A,PointerXMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorX_BitNOPCLR MotorX_BitPOP P0INC PointerXMOV A,PointerXCJNE A,#MotorStep+1,Next_Up_Right1MOV PointerX,#1
Next_Up_Right1:MOV A,PointerYMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorY_BitNOPCLR MotorY_BitPOP P0DJNZ PointerY,Next_Up_Right2MOV PointerY,#MotorStep
Next_Up_Right2:DJNZ R7,Loop_Up_RightSETB X_DelSETB Y_Del
End_Up_Right_Control:RET
;================================================;Go Down_Left;================================================Down_Left_Control:
JNB Start,Not_DI16_Down_Left%DEC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL)%DEC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL)
Not_DI16_Down_Left:MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00000101BMOV Out_Led,A
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
155
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
PUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Down_Left:MOV A,PointerXMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorX_BitNOPCLR MotorX_BitPOP P0DJNZ PointerX,Next_Down_Left1MOV PointerX,#MotorStep
Next_Down_Left1: MOV A,PointerYMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorY_BitNOPCLR MotorY_BitPOP P0INC PointerYMOV A,PointerYCJNE A,#MotorStep+1,Next_Down_Left2MOV PointerY,#1
Next_Down_Left2:DJNZ R7,Loop_Down_LeftSETB X_DelSETB Y_Del
End_Down_Left_Control:RET
;================================================;Go Down_Right;================================================Down_Right_Control:
JNB Start,Not_DI16_Down_Right%INC16(Cur_XH,Cur_XL,Cur_XH,Cur_XL)%DEC16(Cur_YH,Cur_YL,Cur_YH,Cur_YL)
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
156
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù Not_DI16_Down_Right:
MOV R7,#Step_UnitMOV DPTR,#Motor_Control_TableMOV A,Out_LedANL A,#11110000BORL A,#00001100BMOV Out_Led,APUSH P0MOV P0,ASETB Led_ENNOPCLR Led_ENPOP P0
Loop_Down_Right:MOV A,PointerXMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorX_BitNOPCLR MotorX_BitPOP P0INC PointerXMOV A,PointerXCJNE A,#MotorStep+1,Next_Down_Right1MOV PointerX,#1
Next_Down_Right1: MOV A,PointerYMOVC A,@A+DPTRPUSH P0MOV P0,ASETB MotorY_BitNOPCLR MotorY_BitPOP P0INC PointerYMOV A,PointerYCJNE A,#MotorStep+1,Next_Down_Right2MOV PointerY,#1
Next_Down_Right2:DJNZ R7,Loop_Down_RightSETB X_DelSETB Y_Del
End_Down_Right_Control:RET
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
157
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
DRAW.INC:;==============================================;Khoi dong Spline ;Input :;Output : No;==============================================Spline_Init:
PUSH 0MOV R0,#NumKnotsMOV A,@R0DEC A ;A=Numknots-1%Knot (A,DeltaXH,DeltaXL) ;tính knot[numknots-1];CLR C;MOV A,DeltaXH ;delta=knot[numknots-1] div 2;RRC A ; ;MOV DeltaXH,A ;;MOV A,DeltaXL ;;RRC A ;;MOV DeltaXL,A ;;MOV Dinc1H,#0;MOV Dinc1L,#0CLR A%Knot (A,TH,TL) ;t=knot[0];MOV TH,#0;MOV TL,#0POP 0
End_Spline_Init:RET
;==============================================;Spline ;Input :;Output : No;==============================================Spline:
MOV XH,#0MOV XL,#0MOV YH,#0MOV YL,#0MOV K,#0;CLR C
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
158
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
;MOV A,Dinc1L ;t=Dinc1*2;RLC A ;;MOV TL,A ;;MOV A,Dinc1H ;;RLC A ;;MOV TH,A ;
Spline_L1:%N(K,TH,TL,DeltaYH,DeltaYL) ;N(k,m=4,t)%Control_Point_X(K,Y1H,Y1L) ;Y1=Control_Point[k].x%MUL32 (Y1H,Y1L,DeltaYH,DeltaYL) ;Control_Point[k].x*NMOV Y2H,#7FHMOV Y2L,#0FFH%DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;chia cho
32767%ADD16 (XH,XL,TMP_1,TMP_0,XH,XL)%Control_Point_Y(K,Y1H,Y1L) ;Y1=Control_Point[k].y%MUL32 (Y1H,Y1L,DeltaYH,DeltaYL) ;Control_Point[k].y*NMOV Y2H,#7FHMOV Y2L,#0FFH%DIV32 (TMP_3,TMP_2,TMP_1,TMP_0,Y2H,Y2L) ;chia cho
32767%ADD16 (YH,YL,TMP_1,TMP_0,YH,YL)INC KMOV A,K ;A=kPUSH 0MOV R0,#NumPointsMOV B,@R0 ;B=NumPointsPOP 0CJNE A,B,Spline_L2JMP Spline_L3
Spline_L2:JMP Spline_L1
Spline_L3:;So saùnh XH,XL - YH,YL vôùi Cur_XH,Cur_XL - Cur_YH,Cut_YL%SUB16 (XH,XL,Cur_XH,Cur_XL,Dinc2H,Dinc2L)
Spline_Move_X:%CMPZ (Dinc2H,Dinc2L)JB EQ_Flag,Spline_Not_Move_XJB GR_Flag,Spline_Go_RightCALL Left_Control ;LE_Flag=1JMP Spline_Not_Move_X
Spline_Go_Right:CALL Right_ControlJMP Spline_Not_Move_X
Spline_Not_Move_X:
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
159
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
%SUB16 (YH,YL,Cur_YH,Cur_YL,Dinc2H,Dinc2L) Spline_Move_Y:
%CMPZ (Dinc2H,Dinc2L)JB EQ_Flag,Spline_Not_Move_YJB GR_Flag,Spline_Go_UpCALL Down_Control ;LE_Flag=1JMP Spline_Not_Move_Y
Spline_Go_Up:CALL Up_ControlJMP Spline_Not_Move_Y
Spline_Not_Move_Y:%INC16 (TH,TL,TH,TL)%CMP (TH,TL,DeltaXH,DeltaXL)JC End_Spline ;chöa veõ xongCLR Motor_FlagCLR Spline_DrawMOV Ext_Data,#80HMOV DataBaseAddr,#0FHSETB Transmit_FlagCALL Turn_On_AUTO_LED ;Xoùa caùc ñeøn chæ höôùng chuyeån
ñoängCALL Delete_Pulse
End_Spline:RET
;==============================================;Khoi dong Line ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L;Output : No;==============================================Line_Init:
MOV XH,X1HMOV XL,X1LMOV YH,Y1HMOV YL,Y1L%SUB16 (X2H,X2L,X1H,X1L,DeltaXH,DeltaXL)MOV A,DeltaXHCLR B1 ;DeltaX döôngJNB ACC.7,Next_BSETB B1 ;DeltaX aâm
Next_B:%ABS(DeltaXH,DeltaXL)%SUB16 (Y2H,Y2L,Y1H,Y1L,DeltaYH,DeltaYL)MOV A,DeltaYH
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
160
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CLR C1 ;DeltaY döôngJNB ACC.7,Next_CSETB C1 ;DeltaY aâm
Next_C:%ABS(DeltaYH,DeltaYL)%CMP (DeltaXH,DeltaXL,DeltaYH,DeltaYL)MOV D1,CJC Less_DX_DY%SUB16 (DeltaYH,DeltaYL,DeltaXH,DeltaXL,Dinc2H,Dinc2L)MOV Dinc1H,DeltaYHMOV Dinc1L,DeltaYL%SHR (DeltaXH,DeltaXL,DeltaYH,DeltaYL)%SUB16 (Dinc1H,Dinc1L,DeltaYH,DeltaYL,DeltaYH,DeltaYL)INC DeltaXHJMP End_Line_Init
Less_DX_DY:%SUB16 (DeltaXH,DeltaXL,DeltaYH,DeltaYL,Dinc2H,Dinc2L)MOV Dinc1H,DeltaXHMOV Dinc1L,DeltaXLMOV DeltaXH,DeltaYHMOV DeltaXL,DeltaYL%SHR (DeltaYH,DeltaYL,DeltaYH,DeltaYL)%SUB16 (Dinc1H,Dinc1L,DeltaYH,DeltaYL,DeltaYH,DeltaYL)INC DeltaXH
End_Line_Init:RET
;==============================================;Line ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L;Output : No;==============================================Line:
MOV A,DeltaYHJNB ACC.7,Delta_Positive%ADD16 (DeltaYH,DeltaYL,Dinc1H,Dinc1L,DeltaYH,DeltaYL)JNB D1,D1_0JNB C1,C1_0CALL Down_ControlJMP Next_Delta
C1_0:CALL Up_ControlJMP Next_Delta
D1_0:
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
161
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JNB B1,B1_0CALL Left_ControlJMP Next_Delta
B1_0:CALL Right_ControlJMP Next_Delta
Delta_Positive:%ADD16 (DeltaYH,DeltaYL,Dinc2H,Dinc2L,DeltaYH,DeltaYL) JB B1,B1_1JB C1,C1_DownCALL Up_Right_ControlJMP Next_Delta
C1_Down:CALL Down_Right_ControlJMP Next_Delta
B1_1:JNB C1,C1_UpCALL Down_Left_ControlJMP Next_Delta
C1_Up:CALL Up_Left_Control
Next_Delta:DJNZ DeltaXL,End_LineDJNZ DeltaXH,End_LineCLR Motor_FlagCLR Line_DrawMOV DataBaseAddr,#0FHSETB Transmit_FlagCALL Turn_On_AUTO_LED ;Xoùa caùc ñeøn chæ höôùng chuyeån
ñoängCALL Delete_Pulse
End_Line:RET
;==============================================;Khoi dong Circle (phan tinh Circle14);Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L;Output : Circle14;==============================================Calc_Circle14_Rev:
%SUB16 (X2H,X2L,X1H,X1L,X2H,X2L)%SUB16 (Y2H,Y2L,Y1H,Y1L,Y2H,Y2L)%CMPZ (X2H,X2L)JB GR_Flag,X2_GZ_Rev
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
162
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JB EQ_Flag,X2_EZ_RevJB LE_Flag,X2_LZ_Rev
X2_GZ_Rev:%CMPZ (Y2H,Y2L)JB GR_Flag,Circle14_1_RevJB EQ_Flag,Circle14_4_RevJB LE_Flag,Circle14_4_Rev
X2_EZ_Rev:%CMPZ (Y2H,Y2L)JB GR_Flag,Circle14_1_RevJB LE_Flag,Circle14_3_Rev
X2_LZ_Rev:%CMPZ (Y2H,Y2L)JB GR_Flag,Circle14_2_RevJB EQ_Flag,Circle14_2_RevJB LE_Flag,Circle14_3_Rev
Circle14_1_Rev:MOV Circle14,#1JMP End_Calc_Circle14_Rev
Circle14_2_Rev:MOV Circle14,#2JMP End_Calc_Circle14_Rev
Circle14_3_Rev:MOV Circle14,#3JMP End_Calc_Circle14_Rev
Circle14_4_Rev:MOV Circle14,#4
End_Calc_Circle14_Rev:RET
;==============================================;Khoi dong Circle (phan tinh Circle14);Input : X1H,X1L - Y1H,Y1L - X2H,X2L - Y2H,Y2L;Output : Circle14;==============================================Calc_Circle14_For:
%SUB16 (X2H,X2L,X1H,X1L,X2H,X2L)%SUB16 (Y2H,Y2L,Y1H,Y1L,Y2H,Y2L)%CMPZ (X2H,X2L)JB GR_Flag,X2_GZ_ForJB EQ_Flag,X2_EZ_ForJB LE_Flag,X2_LZ_For
X2_GZ_For:%CMPZ (Y2H,Y2L)
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
163
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JB GR_Flag,Circle14_1_ForJB EQ_Flag,Circle14_1_ForJB LE_Flag,Circle14_4_For
X2_EZ_For:%CMPZ (Y2H,Y2L)JB GR_Flag,Circle14_2_ForJB LE_Flag,Circle14_4_For
X2_LZ_For:%CMPZ (Y2H,Y2L)JB GR_Flag,Circle14_2_ForJB EQ_Flag,Circle14_3_ForJB LE_Flag,Circle14_3_For
Circle14_1_For:MOV Circle14,#1JMP End_Calc_Circle14_For
Circle14_2_For:MOV Circle14,#2JMP End_Calc_Circle14_For
Circle14_3_For:MOV Circle14,#3JMP End_Calc_Circle14_For
Circle14_4_For:MOV Circle14,#4
End_Calc_Circle14_For:RET
;==============================================;Khoi dong Circle (phan tinh D1 va D2);Input : X1H,X1L - Y1H,Y1L - BKH,BKL - X2H,X2L - Y2H,Y2L;Output : DeltaXH,DeltaXL - DeltaYH,DeltaYL;==============================================Calc_D1_D2:
MOV DeltaXH,BKHMOV DeltaXL,BKL%SHL(DeltaXH,DeltaXL,DeltaXH,DeltaXL)%Sign (DeltaXH,DeltaXL)%INC16 (DeltaXH,DeltaXL,DeltaXH,DeltaXL)MOV DeltaYH,BKHMOV DeltaYL,BKL%Sign (DeltaYH,DeltaYL)%INC16 (DeltaYH,DeltaYL,DeltaYH,DeltaYL)
End_Calc_D1_D2:RET
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
164
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;==============================================;Khoi dong Circle (Tinh XH,XL,YH,YL);Input : Circle14 - X1H,X1L - Y1H,Y1L - CurXH,CurXL - CurYH,CurYL;Output : XH,XL - YH,YL;==============================================Calc_X_Y:
MOV A,Circle14CJNE A,#1,Circle14_Diff_1%SUB16 (Cur_XH,Cur_XL,X1H,X1L,XH,XL)%SUB16 (Cur_YH,Cur_YL,Y1H,Y1L,YH,YL)JMP End_Calc_X_Y
Circle14_Diff_1:CJNE A,#2,Circle14_Diff_2%SUB16 (Cur_YH,Cur_YL,Y1H,Y1L,XH,XL)%SUB16 (X1H,X1L,Cur_XH,Cur_XL,YH,YL)JMP End_Calc_X_Y
Circle14_Diff_2:CJNE A,#3,Circle14_Diff_3%SUB16 (X1H,X1L,Cur_XH,Cur_XL,XH,XL)%SUB16 (Y1H,Y1L,Cur_YH,Cur_YL,YH,YL)JMP End_Calc_X_Y
Circle14_Diff_3:%SUB16 (Y1H,Y1L,Cur_YH,Cur_YL,XH,XL)%SUB16 (Cur_XH,Cur_XL,X1H,X1L,YH,YL)
End_Calc_X_Y:RET
;==============================================;Khoi dong Circle (Tinh CH,CL);Input : Circle14 - X2H,X2L - Y2H,Y2L;Output : CH,CL;==============================================Calc_C_Rev:
MOV A,Circle14CJNE A,#1,Circle14_Diff_1_RevMOV CH,X2HMOV CL,X2L
JMP End_Calc_C_Rev Circle14_Diff_1_Rev:
CJNE A,#2,Circle14_Diff_2_RevMOV CH,Y2HMOV CL,Y2L
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
165
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JMP End_Calc_C_Rev Circle14_Diff_2_Rev:
CJNE A,#3,Circle14_Diff_3_RevMOV CH,X2HMOV CL,X2L%Sign (CH,CL)JMP End_Calc_C_Rev
Circle14_Diff_3_Rev:MOV CH,Y2HMOV CL,Y2L%Sign (CH,CL)
End_Calc_C_Rev:%INC16 (CH,CL,CH,CL)RET
;==============================================;Khoi dong Circle (Tinh CH,CL);Input : Circle14 - X2H,X2L - Y2H,Y2L;Output : CH,CL;==============================================Calc_C_For:
MOV A,Circle14CJNE A,#1,Circle14_Diff_1_ForMOV CH,Y2HMOV CL,Y2L
JMP End_Calc_C_For Circle14_Diff_1_For:
CJNE A,#2,Circle14_Diff_2_ForMOV CH,X2HMOV CL,X2L%Sign (CH,CL)JMP End_Calc_C_For
Circle14_Diff_2_For:CJNE A,#3,Circle14_Diff_3_ForMOV CH,Y2HMOV CL,Y2L%Sign (CH,CL)JMP End_Calc_C_For
Circle14_Diff_3_For:MOV CH,X2HMOV CL,X2L
End_Calc_C_For:%INC16 (CH,CL,CH,CL)RET
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
166
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;==============================================;Khoi dong Circle (Convert X,Y);Input : XH,XL - YH,YL ;Output : XH,XL - YH,YL ;==============================================Convert_X_Y:
MOV R7,XHMOV R6,XLMOV XH,YHMOV XL,YLMOV YH,R7MOV YL,R6
End_Convert_X_Y:RET
;==============================================;Khoi dong Circle ;Input : No;Output : No;==============================================Circle_Init_Rev:
CALL Calc_Circle14_RevCALL Calc_D1_D2CALL Calc_X_YCALL Calc_C_Rev
End_Circle_Init_Rev:RET
;==============================================;Khoi dong Circle ;Input : No;Output : No;==============================================Circle_Init_For:
CALL Calc_Circle14_ForCALL Calc_D1_D2CALL Calc_X_YCALL Calc_C_ForCALL Convert_X_Y
End_Circle_Init_For:RET
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
167
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;==============================================;Ve mot phan tu hinh tron: ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L ;Output : No;==============================================Circle_Rev:
MOV A,DeltaXHJNB ACC.7,D1_Positive_RevMOV A,DeltaYHJNB ACC.7,D2_Positive_RevJMP Case1_Rev
D2_Positive_Rev:JMP Case2_Rev
D1_Positive_Rev:JMP Case3_Rev
Case1_Rev: %BT1(DeltaXH,DeltaXL,YH,YL)%BT2(DeltaYH,DeltaYL,YH,YL)%INC16 (YH,YL,YH,YL)%Direction1_RevJMP Next_Circle_Rev
Case2_Rev:%BT3(DeltaXH,DeltaXL,XH,XL,YH,YL)%BT3(DeltaYH,DeltaYL,XH,XL,YH,YL) %DEC16 (XH,XL,XH,XL)%INC16 (YH,YL,YH,YL)%Direction2_RevJMP Next_Circle_Rev
Case3_Rev:%BT4(DeltaXH,DeltaXL,XH,XL)%BT5(DeltaYH,DeltaYL,XH,XL)%DEC16 (XH,XL,XH,XL)%Direction3_Rev
Next_Circle_Rev:%CMP (XH,XL,CH,CL)JNC End_Circle_RevCLR Motor_FlagCLR Circle_Rev_DrawMOV DataBaseAddr,#0FHSETB Transmit_FlagCALL Turn_On_AUTO_LEDCALL Delete_Pulse
End_Circle_Rev:
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
168
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
RET;==============================================;Ve mot phan tu hinh tron: ;Input : X1H,X1L - Y1H,Y1L - X2H,X2L ;Output : No;==============================================Circle_For:
MOV A,DeltaXHJNB ACC.7,D1_Positive_ForMOV A,DeltaYHJNB ACC.7,D2_Positive_ForJMP Case1_For
D2_Positive_For:JMP Case2_For
D1_Positive_For:JMP Case3_For
Case1_For: %BT1(DeltaXH,DeltaXL,YH,YL)%BT2(DeltaYH,DeltaYL,YH,YL)%INC16 (YH,YL,YH,YL)%Direction1_ForJMP Next_Circle_For
Case2_For:%BT3(DeltaXH,DeltaXL,XH,XL,YH,YL)%BT3(DeltaYH,DeltaYL,XH,XL,YH,YL) %DEC16 (XH,XL,XH,XL)%INC16 (YH,YL,YH,YL)%Direction2_ForJMP Next_Circle_For
Case3_For:%BT4(DeltaXH,DeltaXL,XH,XL)%BT5(DeltaYH,DeltaYL,XH,XL)%DEC16 (XH,XL,XH,XL)%Direction3_For
Next_Circle_For:%CMP (XH,XL,CH,CL)JNC End_Circle_ForCLR Motor_FlagCLR Circle_For_DrawMOV DataBaseAddr,#0FHSETB Transmit_FlagCALL Turn_On_AUTO_LEDCALL Delete_Pulse
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
169
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù End_Circle_For:
RET;=================================================;Nhaác buùt veõ leân;=================================================Pen_Up:
JNB Pen_Lift,End_Pen_UpCLR PressMOV A,Out_LedANL A,#01111111BMOV Out_Led,A
End_Pen_Up:RET
;=================================================;Haï buùt veõ xuoáng;=================================================Pen_Down:
JB Pen_Lift,End_Pen_DownCLR PressMOV A,Out_LedORL A,#10000000BMOV Out_Led,A
End_Pen_Down:RET
KEY.INC:;================================================;Doan chuong trinh quet phim;Output : KeyOut;================================================KeyDecoder: MOV A,Key
CALL KeyCodeNOPJB KeyIn,Key_EqualDJNZ Key,End_KeyDecoderMOV Key,#KeyNumberJNB KeyPressed,Key_Next1
CLR KeyPressed
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
170
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JMP End_KeyDecoder Key_Next1: ;Khoâng coù phím naøo ñöôïc nhaán
MOV KeyOut,#0MOV Key_Counter,#0CALL Delete_PulseJMP End_KeyDecoder
Key_Equal: ;Coù phím nhaánMOV A,KeyCJNE A,Key_Pressed,Key_Not_EqualINC Key_CounterMOV A,Key_CounterCJNE A,#KeyCount,End_KeyPressedMOV A,Key_PressedCALL OutKeyCodeMOV Key_Counter,#0JMP End_KeyPressed
Key_Not_Equal: ;Chöa ñuû soá laàn laëp queùt phím
MOV Key_Counter,#0MOV Key_Pressed,KeyJMP End_KeyPressed
End_KeyPressed:SETB KeyPressedDJNZ Key,End_KeyDecoderMOV Key,#KeyNumber
End_KeyDecoder:RET
;================================================;Doan chuong trinh xuat ma quet phim;================================================KeyCode: ;Taïo caùc giaù trò ñeå kieåm tra phím naøo ñöôïc nhaán
MOV DPTR,#(Key_Code-1)MOVC A,@A+DPTRORL P2,#00001111BANL A,P2MOV P2,ARETKey_Code:
DB 11111110BDB 11111101BDB 11111011BDB 11110111B
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
171
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù End_KeyCode:;================================================;Doan chuong trinh xuat ra phim duoc nhan;================================================OutKeyCode: ;Set côø F(i) töông öùng vôùi phím ñaõ ñöôïc nhaán
MOV DPTR,#(Flag_Code-1)MOVC A,@A+DPTRMOV KeyOut,ARETFlag_Code:
DB 00000001BDB 00000010BDB 00000100BDB 00001000B
End_OutKeyCode:
MANUAL.INC:;=================================================;Xoùa caùc ñeøn ñieàu khieån höôùng chuyeåàn ñoäng vaø ñeøn AUTO;=================================================Delete_Direction_LED:
MOV A,Out_LedANL A,#11100000BMOV Out_Led,A
End_Delete_Direction_LED:RET
;=================================================;Cheá ñoä ñieàu khieån baèng tay;=================================================Manual:
JNB F1,Not_LeftCALL Left_ControlJMP End_Manual
Not_Left:JNB F2,Not_UpCALL Up_ControlJMP End_Manual
Not_Up:
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
172
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JNB F3,Not_DownCALL Down_Control JMP End_Manual
Not_Down:JNB F4,End_ManualCALL Right_Control
End_Manual:RET
TRANSFER.INC:Transfer: Receive:
JNB RI,End_ReceiveCLR RIMOV A,SBUFMOV C,PANL C,RB8JC Data_OKMOV C,PORL C,RB8JNC Data_OKMOV DataBaseAddr,#0FFHSETB Transmit_FlagMOV R0,#DataBaseAddrMOV DataIn_Counter,#DataInByteMOV A,Out_LedORL A,#00100000BMOV Out_Led,AJMP End_Receive
Data_OK:MOV @R0,AINC R0DJNZ DataIn_Counter,End_ReceiveMOV DataIn_Counter,#DataInByteMOV R0,#DataBaseAddrMOV A,DataBaseAddrCJNE A,#PC_Addr,End_ReceiveSETB Draw_FlagMOV A,Out_LedANL A,#11011111BMOV Out_Led,A
End_Receive: Transmit:
JNB Transmit_Flag,End_TransmitJNB TI,End_Transmit
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
173
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CLR TICLR Transmit_FlagMOV A,DataBaseAddrMOV C,PMOV TB8,CMOV SBUF,A
End_Transmit:End_Transfer:
RET
AUTO.INC:;=================================================;Baät ñeøn AUTO;=================================================Turn_on_AUTO_LED:
MOV A,Out_LedANL A,#11110000BORL A,#00010000BMOV Out_Led,ARET
End_Turn_On_AUTO_LED:;=================================================;Xaùc ñònh loaïi leänh nhaän ñöôïc vaø thöïc hieän caùc khôûi ñoäng töông öùng;=================================================Draw_Identify:
JNB Draw_Flag,End_Draw_LabelCLR Draw_FlagJMP Next_Draw_Identify
End_Draw_Label:JMP End_Draw_Identify
Next_Draw_Identify:MOV A,DataBaseAddr+1CJNE A,#0,Not_MoveCALL Pen_UpCALL Line_InitSETB Motor_FlagSETB Line_DrawJMP End_Draw_Identify
Not_Move:CJNE A,#1,Not_Line
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
174
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CALL Pen_DownCALL Line_InitSETB Motor_FlagSETB Line_DrawJMP End_Draw_Identify
Not_Line:CJNE A,#2,Not_Circle_ForCALL Pen_DownCALL Circle_Init_ForSETB Motor_FlagSETB Circle_For_DrawJMP End_Draw_Identify
Not_Circle_For:CJNE A,#3,Not_Circle_RevCALL Pen_DownCALL Circle_Init_RevSETB Motor_FlagSETB Circle_Rev_DrawJMP End_Draw_Identify
Not_Circle_Rev:CJNE A,#4,Not_Data_OutSETB Data_OutJMP End_Draw_Identify
Not_Data_Out:CJNE A,#5,Not_Speed_ChangeMOV Speed,DataBaseAddr+3MOV DataBaseAddr,#0FHSETB Transmit_FlagJMP End_Draw_Identify
Not_Speed_Change: CJNE A,#6,Not_Data_InCALL Mov_Ext_Data ;Ñöa döõ lieäu vaøo vuøng 128byte caoMOV DataBaseAddr,#0FHSETB Transmit_FlagJMP End_Draw_Identify
Not_Data_In:CJNE A,#7,Not_SplineCALL Pen_DownCALL Spline_InitSETB Motor_FlagSETB Spline_DrawJMP End_Draw_Identify
Not_Spline:CJNE A,#8,Not_LCDSETB Motor_Flag
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
175
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
SETB LCD_Display_FlagJMP End_Draw_Identify
Not_LCD:CJNE A,#9,Not_ClearCALL Clear_LCDMOV DataBaseAddr,#0FHSETB Transmit_FlagJMP End_Draw_Identify
Not_Clear:CJNE A,#10,Not_Next_RowCALL Next_Row_LCDMOV DataBaseAddr,#0FHSETB Transmit_FlagJMP End_Draw_Identify
Not_Next_Row:End_Draw_Identify:
RET;=================================================;Ñieàu khieån ñoäng cô veõ caùc ñöôøng töông öùng vôùi leänh nhaän ñöôïc ;=================================================Motor_Control_Drawing:
JNB Motor_Flag,End_Motor_Control_DrawingJNB Line_Draw,Motor_Control_L1CALL LineJMP End_Motor_Control_Drawing
Motor_Control_L1:JNB Circle_Rev_Draw,Motor_Control_L2CALL Circle_RevJMP End_Motor_Control_Drawing
Motor_Control_L2:JNB Circle_For_Draw,Motor_Control_L3CALL Circle_For
Motor_Control_L3:JNB Spline_Draw,Motor_Control_L4CALL Spline
Motor_Control_L4:JNB LCD_Display_Flag,Motor_Control_L5CALL LCD_Display
Motor_Control_L5:End_Motor_Control_Drawing:
RET;=================================================
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
176
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù ;Xuaát toïa ñoä hieän haønh cuûa buùt veõ;=================================================Position_Output:
JNB Data_Out,End_Position_OutputMOV DataBaseAddr,@R1INC R1SETB Transmit_FlagDJNZ DataOut_Counter,End_Position_OutputMOV DataOut_Counter,#DataOutByteCLR Data_OutMOV R1,#Cur_XH
End_Position_Output:RET
;=================================================;Döøng heä thoáng baèng nuùt Start/Stop;=================================================Stop_System:
JNB Run,End_Stop_SystemPUSH P0MOV A,Out_LedORL A,#01000000BMOV Out_Led,AMOV P0,Out_LedSETB Led_ENNOPCLR Led_ENPOP P0MOV SBUF,#0F0HCLR IE.1
End_Stop_System:
ROUNTINE.INC:;=================================================;Khôûi ñoäng Port noái tieáp, caùc timer vaø ngaét;=================================================Serial_Port_Timer_Init:
MOV SCON,#11010010BMOV IE,#10000010BMOV TMOD,#22HMOV TH1,#-3
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
177
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV TH0,#TimeBaseSETB TR1SETB TR0RET
End_Serial_Port_Timer_Init:;=================================================;Khôûi ñoäng caùc bit;=================================================Bit_Init:
SETB Transmit_FlagCLR Timer_F1CLR Draw_FlagCLR KeyPressedCLR F1CLR F2CLR F3CLR F4CLR Motor_FlagCLR MotorX_BitCLR MotorY_BitCLR Led_ENCLR P1.0CLR Line_DrawCLR Circle_Rev_DrawCLR Circle_For_DrawCLR Spline_DrawCLR LCD_Display_FlagCLR Data_OutCLR X_DelCLR Y_DelSETB PressCLR LCD_BusyCLR Run
End_Bit_Init:RET
;=================================================;Khôûi ñoäng caùc bieán;=================================================Variable_Init:
MOV Speed,#VMOV TimerCount,#TimeCount
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
178
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
MOV TimerCount1,SpeedMOV DataIn_Counter,#DataInByteMOV R0,#DataBaseAddrMOV R1,#Cur_XHMOV PointerX,#MotorStepMOV PointerY,#MotorStepMOV Key,#KeyNumberMOV Key_Pressed,#0MOV Key_Counter,#0MOV DataBaseAddr,#0FHMOV Out_Led,#0MOV Cur_XH,#0MOV Cur_XL,#0MOV Cur_YH,#0MOV Cur_YL,#0MOV DataOut_Counter,#DataOutByteMOV Press_Counter,#PressCountMOV NBaseAddr,#0D8HMOV Ext_Data,#80HMOV LCD_Pointer,#80HRET
End_Variable_Init:;=================================================;Xoùa xung kích ñoäng cô böôùc;=================================================Delete_Pulse:
JNB X_Del,Next_Delete_PulseCLR X_DelPUSH P0MOV A,#0FFHMOV P0,ASETB MotorX_BitNOPCLR MotorX_BitPOP P0
Next_Delete_Pulse: JNB Y_Del,End_Delete_Pulse
CLR Y_DelPUSH P0MOV A,#0FFHMOV P0,ASETB MotorY_BitNOP
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
179
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
CLR MotorY_BitPOP P0
End_Delete_Pulse:RET
;=================================================;Xuaát caùc tín hieäu ñeøn baùo ;=================================================Out_Led_Control:
PUSH P0MOV P0,Out_LedSETB Led_ENNOPCLR Led_ENPOP P0RET
End_Out_Led:;=================================================;Kieåm tra caùc coâng taéc haønh trình, neáu chaïm bieân -> döøng TIMER;=================================================Limit_Control:
JNB Start_X,Stop_Start_XJNB End_X,Stop_End_XJNB Start_Y,Stop_Start_YJNB End_Y,Stop_End_YJMP End_Limit_Control
Stop_Start_X:JNB Timer_F2,$CLR Timer_F2CALL Right_ControlJNB Start_X,Stop_Start_XJMP Stop
Stop_End_X:JNB Timer_F2,$CLR Timer_F2CALL Left_ControlJNB End_X,Stop_End_XJMP Stop
Stop_Start_Y:JNB Timer_F2,$CLR Timer_F2CALL Up_Control
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
180
Luaän vaên toát nghieäp Ñieàu khieån maùy veõ baèng vi xöû lyù
JNB Start_Y,Stop_Start_YJMP Stop
Stop_End_Y:JNB Timer_F2,$CLR Timer_F2CALL Down_ControlJNB End_Y,Stop_End_YJMP Stop
Stop:PUSH P0MOV A,Out_LedORL A,#01000000BMOV Out_Led,AMOV P0,Out_LedSETB Led_ENNOPCLR Led_ENPOP P0MOV SBUF,#0F1HCLR IE.1
End_Limit_Control:RET
;=================================================;Chuyeån 10 byte döõ lieäu töø oâ nhôù 32H..3BH leân vuøng 128byte cao;=================================================Mov_Ext_Data:
PUSH 0PUSH 1MOV R2,#10MOV R1,#DataBaseAddr+2
Mov_Data_Loop:MOV R0,Ext_Data
MOV A,@R1MOV @R0,AINC Ext_DataINC R1DJNZ R2,Mov_Data_LoopPOP 1POP 0
End_Mov_Ext_Data:RET
SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002
181