Điều khiển Máy vẽ bằng 89C51

225
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Í MINH KHOA Ñ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 SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002 1

Transcript of Điều khiển Máy vẽ bằng 89C51

Page 1: Đ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

Page 2: Đ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ù

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

Page 3: Đ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ù

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

Page 4: Đ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ù 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

Page 5: Đ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ù 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

Page 6: Đ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ù

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

Page 7: Đ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ù

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öû

Page 8: Đ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ù

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

Page 9: Đ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ù 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

Page 10: Đ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ù

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

Page 11: Đ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ù

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

Page 12: Đ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ù 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

Page 13: Đ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ù

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)

Page 14: Đ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ù

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

Page 15: Đ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ù 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

Page 16: Đ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ù 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

Page 17: Đ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ù 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

Page 18: Đ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ù

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

Page 19: Đ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ù

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

Page 20: Đ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ù 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

Page 21: Đ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ù 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

Page 22: Đ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ù

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

Page 23: Đ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ù

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

Page 24: Đ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ù

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

Page 25: Đ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ù

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

Page 26: Đ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ù

= 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

Page 27: Đ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ù

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

Page 28: Đ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ù

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

Page 29: Đ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ù

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

Page 30: Đ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ù 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

Page 31: Đ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ù

Ñ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

Page 32: Đ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ù

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

Page 33: Đ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ù

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

Page 34: Đ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ù

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

Page 35: Đ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ù 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

Page 36: Đ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ù

* 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

Page 37: Đ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ù

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

Page 38: Đ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ù

Ñò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

Page 39: Đ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ù

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

Page 40: Đ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ù

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

Page 41: Đ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ù

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

Page 42: Đ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ù

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

Page 43: Đ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ù

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

Page 44: Đ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ù

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

Page 45: Đ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ù 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

Page 46: Đ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ù 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

Page 47: Đ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ù 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

Page 48: Đ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ù 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)

Page 49: Đ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ù

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

Page 50: Đ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ù

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

Page 51: Đ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ù ñ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

Page 52: Đ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ù

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

Page 53: Đ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ù 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

Page 54: Đ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ù 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

Page 55: Đ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ù 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

Page 56: Đ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ù

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

Page 57: Đ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ù

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

Page 58: Đ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ù

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

Page 59: Đ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ù

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

Page 60: Đ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ù

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

Page 61: Đ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ù

PHAÀN XPHUÏ LUÏC

SVTH:Traàn Hoaøi Nam Nieân khoùa 1997-2002

61

Page 62: Đ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ù

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

Page 63: Đ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ù

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

Page 64: Đ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ù

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

Page 65: Đ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ù 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

Page 66: Đ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ù 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

Page 67: Đ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ù 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

Page 68: Đ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ù

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

Page 69: Đ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ù 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

Page 70: Đ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ù 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

Page 71: Đ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ù 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

Page 72: Đ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ù 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

Page 73: Đ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ù 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

Page 74: Đ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ù 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

Page 75: Đ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ù 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

Page 76: Đ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ù 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

Page 77: Đ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ù 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

Page 78: Đ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ù 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

Page 79: Đ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ù 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

Page 80: Đ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ù 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

Page 81: Đ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ù

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

Page 82: Đ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ù 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

Page 83: Đ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ù 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

Page 84: Đ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ù 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

Page 85: Đ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ù 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

Page 86: Đ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ù 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

Page 87: Đ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ù 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

Page 88: Đ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ù 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

Page 89: Đ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ù 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

Page 90: Đ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ù 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

Page 91: Đ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ù 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

Page 92: Đ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ù 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

Page 93: Đ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ù 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

Page 94: Đ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ù 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

Page 95: Đ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ù 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

Page 96: Đ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ù 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

Page 97: Đ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ù 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

Page 98: Đ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ù 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

Page 99: Đ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ù 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

Page 100: Đ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ù 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

Page 101: Đ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ù 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

Page 102: Đ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ù 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

Page 103: Đ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ù 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

Page 104: Đ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ù 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

Page 105: Đ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ù 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

Page 106: Đ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ù 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

Page 107: Đ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ù 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

Page 108: Đ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ù 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

Page 109: Đ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ù 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

Page 110: Đ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ù 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

Page 111: Đ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ù 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

Page 112: Đ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ù 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

Page 113: Đ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ù 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

Page 114: Đ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ù 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

Page 115: Đ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ù 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

Page 116: Đ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ù 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

Page 117: Đ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ù 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

Page 118: Đ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ù 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

Page 119: Đ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ù 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

Page 120: Đ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ù 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

Page 121: Đ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ù 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

Page 122: Đ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ù 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

Page 123: Đ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ù 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

Page 124: Đ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ù 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

Page 125: Đ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ù 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

Page 126: Đ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ù 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

Page 127: Đ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ù 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

Page 128: Đ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ù 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

Page 129: Đ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ù 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

Page 130: Đ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ù

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

Page 131: Đ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ù 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

Page 132: Đ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ù 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

Page 133: Đ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ù 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

Page 134: Đ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ù

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

Page 135: Đ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ù ;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

Page 136: Đ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ù

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

Page 137: Đ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ù

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

Page 138: Đ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ù

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

Page 139: Đ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ù

%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

Page 140: Đ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ù

%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

Page 141: Đ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ù 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

Page 142: Đ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ù

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

Page 143: Đ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ù 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

Page 144: Đ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ù 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

Page 145: Đ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ù

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

Page 146: Đ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ù

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

Page 147: Đ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ù ;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

Page 148: Đ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ù

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

Page 149: Đ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ù 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

Page 150: Đ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ù ;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

Page 151: Đ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ù

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

Page 152: Đ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ù

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

Page 153: Đ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ù

;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

Page 154: Đ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ù

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

Page 155: Đ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ù

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

Page 156: Đ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ù

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

Page 157: Đ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ù 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

Page 158: Đ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ù

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

Page 159: Đ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ù

;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

Page 160: Đ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ù

%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

Page 161: Đ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ù

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

Page 162: Đ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ù

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

Page 163: Đ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ù

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

Page 164: Đ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ù

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

Page 165: Đ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ù ;==============================================;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

Page 166: Đ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ù

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

Page 167: Đ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ù ;==============================================;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

Page 168: Đ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ù ;==============================================;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

Page 169: Đ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ù

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

Page 170: Đ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ù 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

Page 171: Đ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ù

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

Page 172: Đ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ù 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

Page 173: Đ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ù

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

Page 174: Đ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ù

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

Page 175: Đ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ù

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

Page 176: Đ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ù

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

Page 177: Đ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ù ;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

Page 178: Đ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ù

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

Page 179: Đ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ù

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

Page 180: Đ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ù

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

Page 181: Đ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ù

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