LỜI GIỚI THIỆU
:
 
 
Khi xã hội càng phát triển thì con người ngày càng tự hoàn thiện mình hơn; đồng thời cũng có những nhu cầu cao hơn về mọi mặt; trong đó có việc Quản Lý Nhân Sự. Nắm bắt được nhu cầu đó, các nhà khoa học đã nghiên cứu và chế tạo ra Máy Chấm Công, ngày càng tốt hơn và hiệu quả hơn.
 
Vì những tiện lợi nêu trên mà tôi đã nhận đề tài Luận Văn Tốt Nghiệp của mình là : “Thiết Kế và Thi Công Máy Chấm Công”. Một đề tài mới và đầy triển vọng.
 
Sau nhiều tháng tìm tòi học hỏi, tôi đã thành công.
 
Nội dung Luận Văn gồm có các phần chính như sau :
 
 · Phần I : Giới Thiệu về Máy Chấm Công .
 · Phần II : Giới Thiệu Riêng Về Vi Điều Khiển AT89C51 .
 · Phần III : Giới Thiệu Sơ Lược Về Nguyên Lý Hồng Ngoại .
· Phần IV : Giới Thiệu Sơ Lược Về Các Nghi Thức Truyền Dữ Liệu .
Xoáy Trọng Tâm Vào Chuẩn RS 485 và RS 232 .
· Phần V : Giới Thiệu Khái Quát Về Tất Cả Các Linh Kiện Được Dùng Trong Luận Văn .
· Phần VI : Giải Thích Sơ Lược Nguyên Lý Làm Việc .
· Phần VII : Giải Thuật Và Lưu Đồ Chương Trình .
· Phần VIII : Thi Công Lắp Ráp – Sơ Đồ Mạch In .
 
 Để có được thành công như hôm nay, tôi xin chân thành cảm ơn sự giúp đỡ hết sức nhiệt tình của thầy hướng dẫn : LÊ QUANG THUẦN và các thầy cô trong Bộ Môn cũng như trong khoa. Bên cạnh đó, tôi cũng xin cảm ơn những ý kiến đóng góp của các bạn đã giúp đỡ tôi hoàn thành Đề Tài này.
 
Tuy nhiên, vì thời gian có hạn nên không thể tránh khỏi những thiếu sót. Rất mong nhận được sự đóng góp thêm nữa của quý thầy cô và các bạn.
 
Xin Chân Thành Cảm Ơn Rất Nhiều !
 
 
 
 
 
MỤC LỤC TRA CỨU
 
 
LỜI GIỚI THIỆU .Trang 01
 
MỤC LỤC TRA CỨU .Trang 02
 
PHẦN I .Trang 03 ¸ 12
 
PHẦN II Trang 13 ¸ 55
 
PHẦN III Trang 56 ¸ 66
 
PHẦN IV .Trang 67 ¸ 89
 
PHẦN V Trang 90 ¸ 94
 
PHẦN VI Trang 95 ¸ 101
 
PHẦN VII .Trang 102 ¸ 147
 
PHẦN VIII Trang 148 ¸ 150
 
KẾT LUẬN . Trang 151
                
              
                                            
                                
            
 
            
                 145 trang
145 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 2708 | Lượt tải: 0 
              
            Bạn đang xem trước 20 trang tài liệu Luận văn Thiết kế và thi công máy chấm công, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
 cho caàu Diode treân nhöng seõ khoâng goïn vaø khoâng thaåm myõ. 
Vì OP-AMP caàn moät ñieän aùp cung caáp laø ± 15V neân 2 Diode Zener oån aùp ñöôïc duøng trong maïch khoâng ngoaøi muïc ñích treân.
* Bieán trôû tinh chænh maøu xanh noái vaøo OP-AMP coù taùc duïng taïo aùp Reference cho hoaït ñoäng so saùnh cuûa OP-AMP.
* Coøn laïi caùc ñaàu noái, Contact vaø ñeá caém khoâng coù gì ñaëc nieät.
PHAÀN VI :
GIAÛI THÍCH SÔ LÖÔÏC THIEÁT KEÁ 
SÔ ÑOÀ NGUYEÂN LYÙ
	I. SÔ ÑOÀ NGUYEÂN LYÙ PHAÀN CÖÙNG :
1. Caáu Truùc Maõ Vaïch Söû Duïng Trong Luaän Vaên :
 E 8 7 6 5 4 3 2 1 B
 8 bits maõ
 Maõ keát thuùc Maõ baét ñaàu
 Hình 6.1 Sô ñoà caáu truùc Maõ Vaïch
Caáu truùc cuûa maõ vaïch söû duïng trong luaän vaên goàm coù 3 vaïch maõ baét ñaàu , 3 vaïch maõ keát thuùc vaø 8 vaïch maõ chính naèm giöõa. Vôùi 8bits , ta seõ coù toång coäng 28 = 128 theû rieâng bieät khaùc nhau. Ñoä daøy cuûa moãi vaïch maõ laø 2 mm. Maõ baét ñaàu laø toå hôïp 3 vaïch : Traéng – Ñen – Ñen; maõ keát thuùc laø toå hôïp 3 vaïch : Traéng – Ñen – Traéng
AÙnh saùng Hoàng Ngoaïi khi gaëp vaïch traéng seõ phaûn xaï coøn gaëp vaïch ñen seõ khoâng phaûn xaï, töông öùng ta seõ coù möùc 1 hay möùc 0. Chi tieát xin ñöôïc trình baøy ôû phaàn sau . 
Trong traïng thaùi nghó ( khoâng coù theû ñöa vaøo ) , thì seõ khoâng coù aùnh saùng Hoàng Ngoaïi phaûn xaï. Khi phaùt hieän vaïch traéng thì coù nghóa laø coù theû ñöa vaøo, Vi Ñieàu Khieån seõ ñoïc maõ nhö chöông trình ñaõ döôïc naïp. Chi tieát xin ñöôïc trình baøy ôû phaàn sau.
	2. Caáu Truùc Boä Phaùt AÙnh Saùng Hoàng Ngoaïi vaø Thu Nhaän Tín Hieäu Hoàng Ngoaïi Phaûn Xaï :
Photo-Diode 
PD
IRR
LED
Baùn Laêng Kính / Phaân tia
Thaáu Kính Loài
Thaáu Kính Loài
Hình 6.2 Caáu truùc boä thu phaùt Hoàng Ngoaïi
Diode phaùt vaø Diode thu ñöôïc boû trong moät oáng Gen ñen coù ñöôøng kính trong 6 mm. OÁng naøy coù taùc duïng laøm cho aùnh saùng Hoàng Ngoaïi khoâng bò maát ra ngoaøi; ñoàng thôøi traùnh nhieãu do aùnh saùng Hoàng Ngoaïi cuûa moâi tröôøng. ÔÛ moãi ñaàu oáng gaén moät thaáu kính hoäi tuï daïng loài coù taùc duïng hoäi tuï aùnh saùng Hoàng Ngoaïi taïi moät ñieåm. Ñieàu naøy laøm giaûm kích thöôùc (ñoä daøy ) cuûa vaïch maõ. Vì vaäy, tuøy thuoäc vaøo thaáu kính toát hay xaáu maø ñoä daøy vaïch maõ seõ coù theå nhoû ñeán möùc naøo. ÔÛ ñaây do giôùi haïn thôøi gian vaø linh kieän söû duïng neân toâi chæ coù theå giaûm toái ña ñoä daøy vaïch maõ laø 1mm. Tuy nhieân, khi keùo theû vôùi toác ñoä cao thì vaïch maõ phaûi daøy 2 mm môùi ñaùp öùng ñöôïc söï thay ñoåi : Ñen Traéng.
Nhöõng tia saùng phaûn xaï khi gaëp vaïch Traéng treân theû laïi phaûn xaï toaøn phaàn khi gaëp baùn laêng kính. Taïi ñaây, tia phaûn xaï ñeán töø theû seõ bò phaûn xaï vaøo ngay Diode Thu (Diode caûm quang). Diode naøy seõ nhaän aùnh saùng phaûn xaï ñoù vaø bieán ñoåi noù thaønh daïng doøng ngöôïc. Ta hoaøn toaøn coù theå xöû lyù tín hieäu daïng doøng ñieän naøy nhôø coù maïch gia coâng tín hieäu ñöôïc trình baøy chi tieát ôû phaàn sau .
Thaáu kính tröôùc Diode Thu coù taùc duïng laøm taêng ñoä tuï cho aùnh saùng Hoàng Ngoaïi phaûn xaï veà. Vieäc laøm taêng ñoä tuï aùnh saùng cuõng ñoàng nghóa vôùi vieäc laøm taêng cöôøng ñoä saùng taïi tieâu ñieåm cuûa thaáu kính. Vì vaäy laøm taêng doøng ngöôïc qua Diode Thu khi coù aùnh saùng Hoàng Ngoaïi chieáu tôùi. Keát quaû laø laøm taêng ñoä nhaïy cho boä Thu Phaùt Hoàng Ngoaïi treân .
3. Maïch Thu Nhaän vaø Gia Coâng Tín Hieäu :
Hình 6.3 Sô ñoà nguyeân lyù Maïch thu nhaän vaø gia coâng tín hieäu
Tín hieäu quang ñöôïc thu bôûi LED THU. Khi cöôøng ñoä saùng thay ñoåi seõ laøm doøng ngöôïc chaïy qua Diode ñoåi theo, daãn ñeán aùp treân ñieän trôû 1M cuõng seõ thay ñoåi. Bieán trôû R2 coù taùc duïng taïo aùp chuaån ñeå khi aùp vaøo treân cöïc 2 cuûa OP-AMP thay ñoåi noù seõ laät aùp vaø taïo möùc aùp ra thay ñoåi quanh 2 möùc ± 12V . 
AÙnh saùng Hoàng Ngoaïi seõ phaûn xaï khi beà maët ñöôïc chieáu coù maøu saùng vaø ngöôïc laïi seõ khoâng phaûn xaï khi beà maët vaät ñöôïc chieáu coù maøu ñen tuyeàn. Vì theá, ta quy ñònh vaïch maøu saùng laø möùc Logic 1, vaïch maøu ñen laø möùc Logic 0. 
Khi khoâng nhaän ñöôïc aùnh saùng Hoàng Ngoaïi phaûn xaï thì aùp ra taïi chaân 1 cuûa OP-AMP seõ laø + 12V . Vôùi möùc aùp naøy seõ laøm Transistor C1815 daãn hoaøn toaøn (baõo hoøa saâu) vaø vì theá möùc aùp ñöa tôùi Vi Ñieàu Khieån laø 0V, öùng vôùi möùc Logic 0 theo chuaån TTL : 0V ¸ 0,8V. Ngöôïc laïi khi coù aùnh saùng Hoàng Ngoaïi phaûn xaï laøm doøng ngöôïc qua Diode Thu taêng, daãn ñeán vieäc taêng aùp treân ngaõ vaøo chaân 2 cuûa OP-AMP, laøm cho aùp ra chuyeån möùc – 12V . Khi ñoù Transistor khoâng ñöôïc kích. Vaø vì vaäy, möùc aùp tôùi Vi Ñieàu Khieån laø möùc 5V, öùng vôùi möùc Logic 1 theo chuaån TTL : 4V¸5V
	Caùc Diode Zener 15V vaø caùc tuï 100 mF coù taùc duïng loïc nguoàn, loïc nhieãu aùp cung caáp cho söï hoaït ñoäng cuûa OP-AMP.
	4. Maïch Thu Nhaän – Xöû Lyù Tín Hieäu vaø Giao Tieáp Maùy Tính :
Hình 6.4 Sô ñoà nguyeân lyù maïch xöû lyù tín hieäu vaø giao tieáp Maùy Tính
Vi Ñieàu Khieån ñöôïc laäp trình ñeå kieåm tra lieân tuïc chaân 8 P1.7. Khi ngöôøi ta ñaët theû vaøo thì chaân naøy seõ leân 1 vaø baét ñaàu chu trình kieåm tra ñaàu cuoái theû vaø ñoïc maõ cuûa theû veà caát trong thanh ghi A, chuaån bò phaùt veà Maùy Tính ñeå xöû lyù vaø chaám coâng. Ngoaøi nhieäm vuï chính treân, Vi Ñieàu Khieån coøn laøm nhieäm vuï thu nhaän tín hieäu kieåm tra ñöôøng truyeàn do Maùy Tính phaùt ra vaø traû lôøi moãi khi nhaän ñöôïc. Vieäc naøy ñöôïc thöïc hieän thoâng qua chöông trình Ngaét noái tieáp ñöôïc laäp trình saún treân Vi Ñieàu Khieån, chi tieát xin ñöôïc trình baøy ôû phaàn sau. Caùc Port 0 vaø Port 2 coù nhöõng ñeá caém Data 8 bits ñöôïc gaén theâm ñeå tieän vieäc môû roäng veà sau nhö keát noái vôùi thieát bò hieån thò : LED 7 ñoaïn, LCD, v.v... hay loa baùo khi ñaët ngöôïc theû vaøo khe. 
Chip AT89C51 söû duïng Thaïch Anh 11.0592 MHz raát thích hôïp cho vieäc truyeàn thoâng noái tieáp baát ñoàng boä vôùi Maùy Tính. Hoaït ñoäng Reset ñöôïc thöïc hieän töï ñoäng moãi khi baät nguoàn vaø coù theå thöïc hieän baèng tay khi aán nuùt RSBUTTON ñöôïc thaáy treân sô ñoà .	
	5. Boä Nguoàn Ñoái Xöùng vaø Nguoàn Ñôn :
Hình 6.5 Sô ñoà nguyeân lyù boä naén vaø loïc nguoàn cung caáp cho caùc maïch treân
Ñieän aùp 12VAC ñoâi vôùi chaân Mass chính giöõa, ñöôïc loïc nhieãu bôûi 2 tuï 104 vaø ñöôïc naén 2 nöûa baùn kyø bôûi caàu Diode. Sau ñoù , ta loïc phaúng baèng tuï loïc coù ñieän dung lôùn : ñoä gôïn soùng cuûa aùp sau khi loïc tyû leä nghòch vôùi ñieän dung tuï loïc. Tuy nhieân, ta khoâng theå duøng tuï loïc quaù lôùn vì nhö theá thì kích thöôùc tuï cuõng taêng theo laøm cho kích thöôùc Board taêng : khoâng kinh teá vaø thaåm myõ. Vôùi tuï loïc khoaûng vaøi ngaøn mF laø vöøa ñuû ñoái vôùi Board naøy. 
Vì maïch caàn thieát söû duïng nhieàu möùc aùp khaùc nhau : ±15V vaø + 5V ñôn neân ta phaûi duøng IC oån aùp 78X05 ñeå laáy aùp ra + 5V cung caáp cho caùc vi maïch soá. 
Caùc tuï 104 phía sau IC 78X05 coù nhieäm vuï loïc phaúng vaø choáng nhieãu.
D7 laø LED pilot theå traïng thaùi hoaït ñoäng cuûa Board : LED saùng khi Board hoaït ñoäng .
Treân laø toaøn boä phaàn cöùng cuûa Luaän Vaên Toát Nghieäp naøy vaø nhöõng lyù giaûi cô baûn cô cheá hoaït ñoäng vaø nhieäm vuï cuûa töøng linh kieän ñöôïc duøng. Sô ñoà nguyeân lyù phaàn cöùng toång hôïp seõ ñöôïc ñính keøm theo Luaän Vaên ôû trang sau.
	II. SÔ LÖÔÏC HOAÏT ÑOÄNG CUÛA MAÏCH :
Bình thöôøng khi khoâng coù theå vaøo khe, khe toái ñen neân khoâng coù söï cheânh aùp xaûy ra. Vì vaäy OP-AMP coù ngoõ ra laø +12V kích transistor qua ñieän trôû 2,2KW laøm con naøy vaãn baûo hoaø taïo neân möùc aùp ( 0V ) treân chaân P1.7 ( chaân soá 8) cuûa chip Vi Ñieàu Khieån AT89C51:
Hình 6.7 Sô ñoà nguyeân lyù maïch chuyeån aùp ± 12V chuaån TTL
Khi theû vaøo khe vaø ñöôïc keùo ñeán vaïch traéng ( vaïch traéng ñaàu tieân ñöôïc söû duïng ñeå nhaän bieát söï coù maët cuûa theû) thì aùp vaùo OP-AMP thay ñoåi so vôùi aùp chuaån ñaët treân chaân 3 neân ngoõ ra OP-AMP laät aùp töø +12V xuoáng –12V laøm cho transistor ngöng daãn; do ñoù, möùc aùp Logic vaøo chaân P1.7 laø +5V ( möùc Logic 1) . Ngay luùc ñoù, khi P1.7 thay ñoåi traïng thaùi töø 0 leân 1, chip AT89C51 baét ñaàu chu trình nhaän vaø ñoïc maõ vaïch töø söï thay ñoåi möùc aùp öùng vôùi loaïi vaïch traéng vaø ñen. Ngay laäp töùc, chip khôûi ñoäng Timer 0 cuûa mình vaø ñôïi ñeán khi möùc Logic treân chaân P1.7 trôû veà 0 laàn nöõa thì seõ ngöng Timer 0 vaø löu laïi thôøi gian vöøa qua. Ñoù laø thôøi gian quy ñònh moät vaïch ñöôïc keùo qua LED hoàng ngoaïi. Nhö vaäy, thôøi gian naøy seõ thay ñoåi tuyø theo toác ñoä keùo cuûa vaïch qua khe. Vôùi caáu truùc maõ vaïch nhö treân, khi phaùt thôøi gian delay moät vaïch thì seõ ñoïc möùc Logic ôû chaân P1.7 vaøo caùc bit cuûa thanh ghi A. Ngoaøi nhieäm vuï chính nhö treân, chip AT89C51 coøn ñöôïc laäp trình ñeå nhaän bieát loãi khi ta keùo theû khoâng ñuùng chieàu quy ñònh nhôø vaøo maõ vaïch keá tieáp traéng hay ñen : ñen laø ñuùng vaø traéng laø sai ( ngöôïc chieàu ). Töøng vaïch traéng vaø ñen treân theû ñöôïc chuyeån thaønh möùc Logic töông öùng 1 hoaëc 0 treân chaân P1.7 ñöôïc ñoïc vaøo ñaày ñu û( 8bit ) thì Chip seõ truyeàn byte maõ ñoù veà Maùy Tính thoâng qua coång COM vôùi chuaån giao tieáp RS-232. 
Treân Maùy Tính coù saún danh saùch vaø maõ cuûa nhaân vieân caàn quaûn lyù. Caùc nhaân vieân naøy ñöôïc caáp theû töông öùng vôùi ID ñöôïc quaûn lyù cuûa mình. Ngay khi nhaän byte maõ töø chip Vi Ñieàu Khieån AT89C51, Maùy Tính seõ laáy giôø heä thoáng cuûa mình ñeå tính thôøi ñieåm Ra/Vaøo cuûa nhaân vieân töông öùng coù ID truøng khôùp vôùi byte maõ nhaän ñöôïc. Neáu nhaän phaûi byte maõ khoâng ñöôïc quaûn lyù thì chöông trình seõ thoâng baùo loãi. Thôøi ñieåm Vaøo/Ra cuûa moãi nhaân vieân seõ ñöôïc löu laïi vaøo Maùy Tính vaø coù theå xem baát cöù luùc naøo baèng caùch Click vaøo teân cuûa nhaân vieân ñoù.
 Hoaït ñoäng cuûa chöông trình treân Maùy Tính :
+ Click vaøo bieåu töôïng (Icon) cuûa chöông trình treân Maùy Tính, nghóa laø ta ñaõ kích hoaït chöông trình, thì ngay laäp töùc Form giôùi thieäu veà ñeà taøi seõ hieän ra. Form naøy chöùa teân Ñeà Taøi Luaän Vaên Toát Nghieäp, ngaøy vaø giôø heä thoáng cuûa Maùy Tính, thoâng tin veà Giaùo Vieân höôùng daãn vaø Sinh Vieân thöïc hieän, vaø coøn coù bieåu töôïng Baùch Khoa. Click vaøo Button giöõa Form ñeå khôûi ñoäng chöông trình chính. Ñoù laø chöông trình Quaûn Lyù, Theo Doõi vaø Chaám Coâng nhaân vieân.
+ Form chính laø phaàn phaàn coát loõi cuûa chöông trình, laø nôi thu nhaän byte maõ töø Vi Ñieàu Khieån truyeàn veà vaø thöïc hieän vieäc chaám coâng, quaûn lyù nhaân vieân. Ta coù theå taïo keát noái, kieåm tra ñöôøng truyeàn vaø thoâng baùo loãi khi ñöôøng truyeàn coù söï coá : khoâng keát noái ñöôïc , maát lieân laïc giöõa chöøng trong khi ñang hoaït ñoäng. Neáu muoán taïo theâm nhieàu nhaân vieân trong danh saùch quaûn lyù naèm beân traùi Form, ta söû duïng nuùt leänh “Taïo Môùi”. Töông töï, ta coù theå xoùa hoaëc söûa chöõa thoâng tin cuûa nhöõng nhaân vieân ñang ñöôïc quaûn lyù. Neáu danh saùch quaù daøi hôn nhöõng gì coù theå hieån thò treân Form, ta coù theå söû duïng nuùt leänh ”Tìm Kieám” ñeå tìm vaø xem thoâng tin chi tieát veà nhaân vieân ñoù thoâng qua vieäc nhaäp ID cuûa nhaân vieân caàn tìm khi chöông trình yeâu caàu.
PHAÀN VII :
GIAÛI THUAÄT - LÖU ÑOÀ VAØ CHÖÔNG TRÌNH
	I. SÔ LÖÔÏC GIAÛI THUAÄT :
	Vi Ñieàu Khieån AT 89C51 thu thaäp maõ vaïch töø theû vaø chuyeån thaønh ID göûi veà Maùy Tính PC. Maùy Tính nhaän döõ lieäu qua coång COM theo chuaån giao tieáp RS 232. 
Chöông trình nhaän vaø xöû lyù ID treân Maùy Tính ñöôïc vieát baèng phaàn meàm laäp trình Visual Basic 6.0 cuûa haõng Microsoft. Cöù moãi giaây, chöông trình seõ hoûi moät laàn xem Boä Ñeäm Nhaän coù kyù töï haây chöa. Neáu coù thì nhaän veà, tìm vaø so saùnh ID trong danh saùch cho tröôùc; ñoàng thôøi laáy giôø heä thoáng ñeå tính thôøi ñieåm nhaän ñöôïc kyù töï ñoù. Ñoù cuõng laø thôøi ñieåm vaøo hay ra cuûa moät nhaân vieân coù theû. Neáu kyù töï nhaän veà khoâng truøng khôùp vôùi taát caû caùc ID trong danh saùch quaûn lyù thì chöông trình seõ thoâng baùo vaø seõ khoâng caäp nhaät thoâng tin môùi. 
Beân caïnh coâng vieäc chính vöøa neâu treân, chöông trình coøn cung caáp cho ta nhöõng thoâng tin vaø chöùc naêng khaùc. Ta coù theå theâm vaøo hay söûa chöûa moät vaøi chi tieát trong baûng Lyù Lòch cuûa töøng nhaân vieân; thaäm chí coøn coù theå xoùa boû chuùng hay xoùa boû luoân nhaân vieân ñoù trong danh saùch quaûn lyù. Ta coù theå xem Baûng Toång Keát cho taát caû caùc nhaân vieân trong danh saùch hoaëc Baûng Baùo Caùo cuûa töøng caù nhaân. Hai Baûng naøy theå hieän ñaày ñuû thôøi ñieåm vaøo ra cuûa hoï vaø tính toaùn thôøi gian laøm vieäc, coù ñi treã hay veà sôùm khoâng? Coøn ñi sôùm vaø veà treã hôn giôø laøm vieäc quy ñònh thì khoâng tính!
 Chöông trình coøn coù khaû naêng kieåm tra loãi ñöôøng truyeàn cho duø luùc baét ñaàu khôûi ñoäng chöông trình hay khi chöông trình ñang chaïy. Baát cöù khi naøo ñöôøng truyeàn gaëp söï coá hay xaûy ra loãi nhö : maát tín hieäu, ñöùt ñöôøng truyeàn, phaàn cöùng bò maát nguoàn cung caáp, v.v...; chöông trình ñeàu hieän caâu thoâng baùo loãi cho töøng tröôøng hôïp cuï theå .
	Vaø coøn nhieàu nöõa nhöõng tieän ích thaåm myõ vaø phoå bieán trong moïi chöông trình nhö khi keát noái Indicator ôû Frame Keát Noái seõ chaïy cho ñeán khi keát noái ñöôïc hoaëc nhaän ñöôïc caâu thoâng baùo : “Khoâng keát noái ñöôïc “ vaø coù theå in baûng Toång Keát ra laøm taøi lieäu tham khaûo, v.v...... .
II. LÖU ÑOÀ :
	1. Treân Maùy Tính :
Baét ñaàu
Load Form Demo
Coù Click hay chöa?
Load Form chính
Moät giaây kieåm tra InBufferCount 1 laàn
N
Coù nhaän ñöôïc Maõ hay khoâng ?
 Y
N
Maõ coù naøy trong danh saùch quaûn lyù ? Baùo Loãi
 Y
Xoùa Baûng In
Xoùa Baûng Out
Laáy thôøi ñieåm heä thoáng
Maõ naøy nhaän ñöôïc laàn leû hay chaún ?
Löu thôøi ñieåm vaøo Baûng In 	Löu thôøi ñieåm vaøo Baûng Out
Caäp nhaät Baûng ID_date
Caäp nhaät Baûng S_timework
Hieån thò leân Form chính
	2. Chöông Trình Chính Treân Vi Ñieàu Khieån :
Baét ñaàu
N
P1.7 = 1?
 Y
Khôûi ñoäng Timer 0
N
P1.7 = 0 ?
 Y
Löu laïi giaù trò TH0, TL0 vaø R5 neáu coù
Goïi Delay 1 vaïch 
N
 P1.7 = 0 ? Baùo Loãi
 Y
Goïi Delay 1 vaïch
Ñoïc bit 1
Goïi Delay 1 vaïch
Ñoïc bit 2
Goïi Delay 1 vaïch
Ñoïc bit 3
Goïi Delay 1 vaïch
Ñoïc bit 4
Goïi Delay 1 vaïch
Ñoïc bit 5
Goïi Delay 1 vaïch
Ñoïc bit 6
Goïi Delay 1 vaïch
Ñoïc bit 7
Goïi Delay 1 vaïch
Ñoïc bit 8
	3. Chöông Trình Ngaét Serial Port Treân Vi Ñieàu Khieån :
Coù thoâng baùo ngaét
TI = 1 ?
Xoùa RI
Caát A
Nhaäp lieäu vaøo A
So saùnh xem coù phaûi kyù töï kieåm tra 
11111110 B
Taêng 1
Göûi traû veà Maùy Tính
Laáy A
Xoùa TI
Thoaùt Ngaét
	Vôùi löu ñoà treân, ta thaáy chöông trình ngaét Port noái tieáp chæ söû duïng cho vieäc thu kyù töï töø Maùy Tính vaø kieåm tra ñöôøng truyeàn . Khi coù thoâng baùo ngaét xyû ra, chöông trình nhaûy ñeán Vector ngaét töông öùng vaø sau ñoù nhaûy ñeán chöông trình phuïc vuï ngaét . Kieåm tra xem ngaét do phaùt hay do thu ( TI = 1 hay RI = 1 ) ? Neáu ngaét do phaùt thì xoùa TI , khoâng laøm gì caû vaø thoaùt khoûi chöông trình . Neáu ngaét do thu thì kieåm tra xem kyù töï thu ñöôïc coù phaûi laø kyù töï kieåm tra ñöôøng truyeàn hay khoâng ? Neáu khoâng phaûi thì thoaùt vaø baùo loãi . Neáu ñuùng thì taêng leân 1 , caám ngaét , truyeàn kyù töï traû laïi Maùy Tính vaø thoaùt khoûi chöông trình . 
	Sau ñaây laø maõ chöông trình cuûa caùc chöông trình coù löu ñoà treân .
	III. MAÕ CHÖÔNG TRÌNH :
1. Maõ Chöông Trình Treân Maùy Tính :
* Form Demo ( Form môû ñaàu – giôùi thieäu chöông trình ) :
Dim doc, ngang, tren, trai As Single
Dim gio, phut, giay As Byte
Dim ngay As Date
Dim buttondown%
Dim textup%
Const Delta = 20
Public Sub movetextup()
If Not textup Then
 lblani(1).Left = lblani(1).Left - Delta
 lblani(1).Top = lblani(1).Top - Delta
 textup = True
End If
End Sub
Public Sub movetextdown()
If textup Then
 lblani(1).Left = lblani(1).Left + Delta
 lblani(1).Top = lblani(1).Top + Delta
 textup = False
End If
End Sub
Private Sub Form_Load()
 lbltitle(0).Visible = False
 lbltitle(1).Visible = False
 lbltitle(2).Visible = False
 lblani(0).Visible = False
 lblani(1).Visible = False
 lblgio.Visible = False
 lblphut.Visible = False
 lblgiay.Visible = False
 lbl1.Visible = False
 lbl2.Visible = False
 lblngay.Visible = False
 Top = 3475
 Left = 6460
 Height = 50
 Width = 80
 tren = 3475
 trai = 6460
 doc = 50
 ngang = 80
 Timer1.Interval = 1
End Sub
Private Sub image2_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
 movetextdown
End Sub
Private Sub lblani_MouseDown(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
 movetextdown
End Sub
Private Sub lblani_MouseMove(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
 movetextup
End Sub
Private Sub lblani_MouseUp(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
movetextup
 Timer3.Enabled = True
 Image1.Visible = False
 'Unload Me
End Sub
Private Sub Timer1_Timer()
If doc = 5000 And ngang = 9000 Then
 ngay = Date
 lblngay.Caption = ngay
 gio = Hour(Time)
 phut = Minute(Time)
 giay = Second(Time)
 lblgio.Caption = gio
 lblphut.Caption = phut
 lblgiay.Caption = giay
 lbltitle(0).Visible = True
 lbltitle(1).Visible = True
 lbltitle(2).Visible = True
 lblani(0).Visible = True
 lblani(1).Visible = True
 lblgio.Visible = True
 lblphut.Visible = True
 lblgiay.Visible = True
 lblngay.Visible = True
 lbl1.Visible = True
 lbl2.Visible = True
 lblphut.Caption = Right("00" & Trim(CStr(phut)), 2)
 Timer1.Enabled = False
Else
 doc = doc + 495
 ngang = ngang + 892
 tren = tren - 247.5
 trai = trai - 446
 Top = tren
 Left = trai
 Width = ngang
 Height = doc
End If
End Sub
Private Sub Timer2_Timer()
 giay = giay + 1
 If giay >= 60 Then
 giay = 0
 phut = phut + 1
 If phut >= 60 Then
 phut = 0
 gio = gio + 1
 If gio >= 24 Then
 gio = 0
 End If
 lblgio.Caption = Right("00" & Trim(CStr(gio)), 2)
 End If
 lblphut.Caption = Right("00" & Trim(CStr(phut)), 2)
 End If
 lblgiay.Caption = Right("00" & Trim(CStr(giay)), 2)
End Sub
Private Sub Timer3_Timer()
If doc = 50 And ngang = 80 Then
 Timer3.Enabled = False
 Unload Me
 Form1.Show
Else
 doc = doc - 495
 ngang = ngang - 892
 tren = tren + 247.5
 trai = trai + 446
 Top = tren
 Left = trai
 Width = ngang
 Height = doc
End If
End Sub
* Form 1 ( Form chính ) :
Option Explicit
Const csdl = "csdl.mdb"
Dim instring As String
Dim ii, traloi, k As Integer
Dim i, q, delinout As Integer
Dim npath, nho As String
Dim s_late, s_early As Date
'Bien nho de truy xuat bang worktime
Dim id_r, name_r As String
Private Sub cancelcmd_Click()
Select Case q
 Case 1
 Newcmd.Enabled = True
 Case 2
 editcmd.Enabled = True
 Case 3
 delCmd.Enabled = True
End Select
 q = 0
 OKCmd.Visible = False
 cancelcmd.Visible = False
 IDTxt.Locked = True
 NameTxt.Locked = True
 CVTxt.Locked = True
 note.Visible = False
End Sub
' i so record
Private Sub ClosCmd_Click()
 End
End Sub
Private Sub CVTxt_KeyPress(KeyAscii As Integer)
 If KeyAscii = 13 Then
 OKCmd.SetFocus
 End If
End Sub
Private Sub delCmd_Click()
 q = 3
 note.Caption = "Baïn coù ñoàng yù xoùa?"
 note.Visible = True
 delCmd.Enabled = False
 OKCmd.Visible = True
 cancelcmd.Visible = True
 cancelcmd.SetFocus
End Sub
Private Sub editcmd_Click()
 IDTxt.Locked = False
 NameTxt.Locked = False
 CVTxt.Locked = False
 nho = IDTxt.Text
 editcmd.Enabled = False
 OKCmd.Visible = True
 cancelcmd.Visible = True
 IDTxt.SetFocus
 note.Visible = True
 note.Caption = " Baïn coù ñoàng yù söûa chöõa ?"
 IDTxt.SetFocus
 q = 2 'sua chua
End Sub
Private Sub Form_Load()
Dim db As Database
Dim bang As Recordset
Dim hang, m As Integer
npath = App.Path & "\"
k = 0
Set db = OpenDatabase(npath & csdl)
Set bang = db.OpenRecordset("lylich")
'txtin.Text = Asc(vbbackspace)
With LylichFlx
 .Rows = 1
 .Cols = 5
 .FormatString = "|^ ID |^ Hoï vaø Teân |^ Chöùc Vuï |^;"
 End With
'Lay record dau tien cua bang lylich
If Not (bang.BOF And bang.EOF) Then
 bang.MoveFirst
 NameTxt.Text = bang.Fields("name")
 IDTxt.Text = bang.Fields("Id")
 CVTxt.Text = bang.Fields("chucvu")
 frten.Caption = NameTxt.Text
 IDTxt.Locked = True
 NameTxt.Locked = True
 CVTxt.Locked = True
 dienkhung_ll
 End If
OKCmd.Visible = False
cancelcmd.Visible = False
note.Visible = False
q = 0
bang.Close
db.Close
'make_index
bangIDdate
BangInOut 'asc("")
KhungInOut (IDTxt.Text)
tongket (IDTxt.Text)
End Sub
Private Sub IDTxt_KeyPress(KeyAscii As Integer)
 If (KeyAscii = 13) Then
 NameTxt.SetFocus
 End If
 If Len(IDTxt.Text) >= 4 Then
 KeyAscii = 0
 NameTxt.SetFocus
 End If
 If (KeyAscii 13) And (KeyAscii 8) And (KeyAscii 127) 
	And (KeyAscii 27) Then
 If (KeyAscii 57) Then
 KeyAscii = 0
 End If
 End If
End Sub
Private Sub INOutFlx_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
 If Button = 2 Then
 delinout = INOutFlx.MouseRow
 PopupMenu mnuinout
 End If
End Sub
Private Sub LylichFlx_Click()
Dim db As Database
Dim ta_s_timework As Recordset
 With LylichFlx
 If .MouseRow > 0 Then
 NameTxt.Text = .TextMatrix(.MouseRow, 2)
 CVTxt.Text = .TextMatrix(.MouseRow, 3)
 IDTxt.Text = .TextMatrix(.MouseRow, 1)
 id_r = IDTxt.Text
 name_r = NameTxt.Text
 lbten.Caption = name_r
 bangIDdate
 BangInOut
 KhungInOut (id_r)
 tongket (id_r)
 frten.Caption = name_r
 Set db = OpenDatabase(npath & csdl)
 Set ta_s_timework = db.OpenRecordset("s_timework")
 With ta_s_timework
 .Index = "ID1index"
 .Seek "=", id_r
 If Not .NoMatch Then
 tongket (id_r)
 End If
 End With
 ta_s_timework.Close
 db.Close
 Else
 .Col = .MouseCol
 .Sort = 1
 End If
 End With
End Sub
Private Sub mnuxoa_Click()
Dim db As Database
Dim queIn, queOut, datework, m As String
Dim timeIn, timeOut As String
Dim k As Integer
 If INOutFlx.MouseRow >= 1 Then
 Set db = OpenDatabase(npath & csdl)
 datework = Trim(INOutFlx.TextMatrix(delinout, 1))
 timeIn = (datework & " " & Trim(INOutFlx.TextMatrix(delinout, 2)))
 timeOut = datework & " " & Trim(INOutFlx.TextMatrix(delinout, 3))
 queIn = " delete * from timework where id='" & IDTxt.Text & "' and " & " IDtime ='" & IDTxt.Text & CStr(CDate(timeIn)) & "'"
 db.Execute (queIn)
 queOut = " delete * from timework where id='" & IDTxt.Text & "' and " & " IDtime ='" & IDTxt.Text & CStr(CDate(timeOut)) & "'"
 db.Execute (queOut)
 BangInOut
 KhungInOut (id_r)
 tongket (id_r)
 db.Close
 End If
End Sub
Private Sub NameTxt_KeyPress(KeyAscii As Integer)
 If KeyAscii = 13 Then
 CVTxt.SetFocus
 End If
End Sub
Private Sub Newcmd_Click()
 NameTxt.Text = ""
 CVTxt.Text = ""
 IDTxt.Text = ""
 IDTxt.Locked = False
 NameTxt.Locked = False
 CVTxt.Locked = False
 cancelcmd.Visible = True
 OKCmd.Visible = True
 Newcmd.Enabled = False
 q = 1
 note.Visible = True
 note.Caption = "Baïn coù doàng yù vôùi hay khoâng ? "
 IDTxt.SetFocus
End Sub
Private Sub nhapIDCmd_Click()
 Nhap_ID
End Sub
Private Sub OKCmd_Click()
Dim db As Database
Dim bang As Recordset
Dim querry As String
Dim k, m As Integer
'tao moi
 If q = 1 Then
 If (IsNumeric(IDTxt.Text)) And (NameTxt.Text "") And (CVTxt.Text "") Then
 Set db = OpenDatabase(npath & csdl)
 Set bang = db.OpenRecordset("lylich")
 bang.Index = "IDindex"
 IDTxt.Text = chuanID(IDTxt.Text)
 bang.Seek "=", IDTxt.Text
 If bang.NoMatch Then
 'Dien vao csdl
 With bang
 .AddNew
 .Fields("ID") = (IDTxt.Text)
 .Fields("name") = NameTxt.Text
 .Fields("chucvu") = CVTxt.Text
 .Update
 .MoveLast
 i = .RecordCount
 End With
 'Dien vao bang lylich
 With LylichFlx
 .AddItem "" & vbTab & IDTxt.Text & vbTab & NameTxt.Text & vbTab & CVTxt.Text
 End With
 cancelcmd.Visible = False
 OKCmd.Visible = False
 Newcmd.Visible = True
 Newcmd.Enabled = True
 IDTxt.Locked = True
 NameTxt.Locked = True
 CVTxt.Locked = True
 note.Visible = False
 bang.Close
 db.Close
 Else
 m = MsgBox("nhap lai ma so ID")
 IDTxt.SetFocus
 IDTxt.Locked = False
 NameTxt.Locked = False
 CVTxt.Locked = False
 End If
 End If
 End If
 'Sua chua
 If q = 2 Then
 Set db = OpenDatabase(npath & csdl)
 Set bang = db.OpenRecordset("lylich")
 bang.Index = "IDindex"
 bang.Seek "=", nho
x: If bang.NoMatch Then
 k = MsgBox("Khoâng tìm thaáy ñeå söûa!" + Chr(13) + "Baïn coù muoán theâm vaøo hay khoâng ?", vbOKCancel)
 Else
 With bang
 Dim thay As Boolean
 Dim j As Integer
 thay = False
 j = 1
 IDTxt.Text = chuanID(IDTxt.Text)
 Do While (j < LylichFlx.Rows) And (Not thay)
 If (LylichFlx.TextMatrix(j, 1) = IDTxt.Text) And (nho IDTxt.Text) Then
 thay = True
 Else
 j = j + 1
 End If
 Loop
 If thay Then
 k = MsgBox("ID naøy ñaõ ñuoc söû duïng" & Chr(13) & "Nhaäp ID khaùc ")
 IDTxt.Text = nho
 IDTxt.SetFocus
 Else
 .Edit
 .Fields("ID") = chuanID(IDTxt.Text)
 .Fields("name") = NameTxt.Text
 .Fields("chucvu") = CVTxt.Text
 .Update
 End If
 End With
 dienkhung_ll
 End If
 cancelcmd.Visible = False
 OKCmd.Visible = False
 editcmd.Enabled = True
 IDTxt.Locked = True
 NameTxt.Locked = True
 CVTxt.Locked = True
 note.Visible = False
 bang.Close
 db.Close
End If
'xoa
If q = 3 Then
 Set db = OpenDatabase(npath & csdl)
 querry = " delete * from lylich where id='" & IDTxt.Text & "'"
 db.Execute (querry)
 querry = " delete * from timework where id='" & IDTxt.Text & "'"
 db.Execute (querry)
 querry = " delete * from ID_date where id='" & IDTxt.Text & "'"
 db.Execute (querry)
 querry = " delete * from s_timework where id='" & IDTxt.Text & "'"
 db.Execute (querry)
 querry = " delete * from inout where id='" & IDTxt.Text & "'"
 db.Execute (querry)
 dienkhung_ll
 If LylichFlx.Rows > 2 Then
 KhungInOut (LylichFlx.TextMatrix(1, 1))
 tongket (LylichFlx.TextMatrix(1, 1))
 Else
 With INOutFlx
 .Rows = 1
 .Cols = 5
 .FormatString = "|^ Ngaøy |^ Thôøi ñieåm vaøo|^Thôøi ñieåm ra|^;"
 End With
 End If
 Set db = OpenDatabase(npath & csdl)
 Set bang = db.OpenRecordset("lylich")
 If Not (bang.BOF And bang.EOF) Then
 bang.MoveFirst
 NameTxt.Text = bang.Fields("name")
 IDTxt.Text = bang.Fields("ID")
 CVTxt.Text = bang.Fields("chucvu")
 Else
 NameTxt.Text = ""
 IDTxt.Text = ""
 CVTxt.Text = ""
 With LylichFlx
 .Rows = 1
 .Cols = 5
 .FormatString = "|^ ID |^ Hoï vaø Teân |^ Chöùc Vuï |^;"
 End With
 With INOutFlx
 .Rows = 1
 .Cols = 5
 .FormatString = "|^ Ngaøy |^Thôøi ñieåm vaøo|^Thôøi ñieåm ra|^;"
 End With
 frten.Caption = ""
 lbten.Caption = "-----"
 lblate.Caption = "0"
 lbearly.Caption = "0"
 End If
 delCmd.Enabled = True
 cancelcmd.Visible = False
 OKCmd.Visible = False
 note.Visible = False
 IDTxt.Locked = True
 NameTxt.Locked = True
 CVTxt.Locked = True
 note.Visible = False
End If
 ' IDTxt.Locked = True
 ' NameTxt.Locked = True
 ' CVTxt.Locked = True
 'note.Visible = False
End Sub
Public Sub make_index()
 Dim db As Database
 Dim td As TableDef
 Dim ind As Index
On Error GoTo thoat
 Set db = OpenDatabase(npath & csdl)
 Set td = db.TableDefs("lylich")
 Set ind = td.CreateIndex("nameindex")
 ind.Fields.Append td.CreateField("name")
 td.Indexes.Append ind
 db.Close
thoat:
 MsgBox ("Khoâng taïo ñöôïc chæ muïc")
End Sub
Public Sub dienkhung_ll()
Dim db As Database
Dim bang As Recordset
Dim hang, m As Integer
Set db = OpenDatabase(npath & csdl)
Set bang = db.OpenRecordset("lylich")
If Not (bang.BOF And bang.EOF) Then
'lay so record trong bang lylich
 bang.MoveLast
 i = bang.RecordCount
'Dinh kich thuoc bang lylich
 With LylichFlx
 .Rows = i + 1
 .Cols = 5
 .FormatString = "|^ ID |^ Hoï vaø Teân |^ Chöùc Vuï |^;"
 End With
'Dien ca truong vao bang lylich
 bang.MoveFirst
 hang = 0
 Do Until bang.EOF
 hang = hang + 1
 With LylichFlx
 .TextMatrix(hang, 1) = bang.Fields("ID")
 .TextMatrix(hang, 2) = bang.Fields("name")
 .TextMatrix(hang, 3) = bang.Fields("chucvu")
 End With
 bang.MoveNext
 Loop
End If
bang.Close
db.Close
End Sub
Public Sub Nhap_ID()
Dim db As Database
Dim ta_lyl, bang As Recordset
Dim numbe As String
Set db = OpenDatabase(npath & csdl)
Set bang = db.OpenRecordset("timework")
'numbe = InputBox("Nhap vao so ID", "Nhap ID")
numbe = ID_S
Set ta_lyl = db.OpenRecordset("lylich")
ta_lyl.Index = "IDindex"
ta_lyl.Seek "=", chuanID(numbe)
If Not ta_lyl.NoMatch Then
 With bang
 .AddNew
 .Fields("ID") = chuanID(numbe)
 id_r = .Fields("ID")
 .Fields("time") = Now
 .Fields("date") = CStr(Month(Now)) & "/" & CStr(Day(Now)) & "/" & CStr(Year(Now))
 .Fields("hour") = CDate(Now)
 .Fields("IDtime") = .Fields("ID") & CStr(.Fields("time"))
 .Update
 End With
 frten.Caption = ta_lyl.Fields("name")
 bangIDdate
 BangInOut
 KhungInOut (chuanID(numbe))
 tongket (chuanID(numbe))
Else
 MsgBox ("Nhaân Vieân naøy khoâng coù trong Danh Saùch Quaûn Lyù !")
End If
bang.Close
ta_lyl.Close
db.Close
End Sub
Public Sub bangIDdate()
Dim db As Database
Dim ta_lyl, ta_IDdate, ta_timework As Recordset
Dim id_n, key_n, querry1, querry2 As String
Set db = OpenDatabase(npath & csdl)
Set ta_lyl = db.OpenRecordset("lylich")
If Not (ta_lyl.BOF And ta_lyl.EOF) Then
 ta_lyl.MoveFirst
 Do Until ta_lyl.EOF
 id_n = ta_lyl.Fields("ID")
 querry1 = "select * from timework where id='" & id_n & "'"
 Set ta_timework = db.OpenRecordset(querry1)
 Set ta_IDdate = db.OpenRecordset("ID_date")
 If Not (ta_timework.BOF And ta_timework.EOF) Then
 ta_timework.MoveFirst
 Do Until ta_timework.EOF
 key_n = ta_timework.Fields("ID") & ta_timework.Fields("date")
 ta_IDdate.Index = "keyIndex"
 ta_IDdate.Seek "=", key_n
 If ta_IDdate.NoMatch Then
 ta_IDdate.AddNew
 ta_IDdate.Fields("ID") = id_n
 ta_IDdate.Fields("date") = ta_timework.Fields("date")
 ta_IDdate.Fields("key") = id_n & ta_IDdate.Fields("date")
 ta_IDdate.Update
 End If
 ta_timework.MoveNext
 Loop
 End If
 ta_lyl.MoveNext
 ta_timework.Close
 ta_IDdate.Close
 Loop
End If
ta_lyl.Close
db.Close
End Sub
Public Sub BangInOut()
 Dim ta_lyl, ta_IDdate, ta_inout, ta_timework As Recordset
 Dim ta_sum_t As Recordset
 Dim db As Database
 Dim tim As Date
 Dim querry1, querry2 As String
 Dim id_n, date_n, key_n, time_in As String
 Dim solan, i, k As Integer
 Dim t_late, t_early As Integer
 Set db = OpenDatabase(npath & csdl)
 Set ta_lyl = db.OpenRecordset("lylich")
 db.Execute ("delete * from s_timework")
 db.Execute ("delete * from inout")
 If Not (ta_lyl.BOF And ta_lyl.EOF) Then
 ta_lyl.MoveFirst
 Do Until ta_lyl.EOF
 id_n = ta_lyl.Fields("ID")
 querry1 = "select * from id_date where id='" & id_n & "' order by date"
 Set ta_IDdate = db.OpenRecordset(querry1)
 If Not (ta_IDdate.BOF And ta_IDdate.EOF) Then
 ta_IDdate.MoveFirst
 t_late = 0
 t_early = 0
 Do Until ta_IDdate.EOF
 date_n = ta_IDdate.Fields("date")
 querry2 = "select * from timework where id='" & id_n & "' and date='" & date_n & "' order by time"
 Set ta_timework = db.OpenRecordset(querry2)
 Set ta_inout = db.OpenRecordset("InOut")
 If Not (ta_timework.BOF And ta_timework.EOF) Then
 ta_timework.MoveLast
 solan = ta_timework.RecordCount
 i = 1
 ta_timework.MoveFirst
 Do While (i <= solan) And (Not (ta_timework.EOF))
 tim = ta_timework.Fields("time")
 time_in = CStr(Hour(tim)) & ":" & CStr(Minute(tim)) & ":" & CStr(Second(tim))
 key_n = id_n & date_n & "#" & CStr(i)
 ta_inout.Index = "keyindex"
 ta_inout.Seek "=", key_n
 If ta_inout.NoMatch Then
 If ((i Mod 2) 0) Then
 ta_inout.AddNew
 ta_inout.Fields("ID") = id_n
 ta_inout.Fields("date") = date_n
 ta_inout.Fields("key") = key_n
 ta_inout.Fields("in") = time_in
 t_late = t_late + d_late(tim)
 If i = solan Then
 ta_inout.Fields("out") = "0"
 End If
 ta_inout.Update
 Else
 ta_inout.Index = "keyindex"
 ta_inout.Seek "=", id_n & date_n & "#" & CStr(i - 1)
 If Not ta_inout.NoMatch Then
 ta_inout.Edit
 ta_inout.Fields("out") = time_in
 t_early = t_early + d_early(tim)
 ta_inout.Update
 End If
 End If
 End If
 i = i + 1
 ta_timework.MoveNext
 Loop
 End If
 ta_timework.Close
 ta_inout.Close
 ta_IDdate.MoveNext
 Loop
 Set ta_sum_t = db.OpenRecordset("s_timework")
 With ta_sum_t
 .AddNew
 .Fields("ID") = id_n
 .Fields("s_late") = CStr(t_late)
 .Fields("s_early") = CStr(t_early)
 .Update
 End With
 ta_sum_t.Close
 End If
 ta_lyl.MoveNext
 Loop
 End If
 Set ta_inout = db.OpenRecordset("inout")
 With ta_inout
 If Not (.BOF And .BOF) Then
 .MoveFirst
 Do Until .EOF
 If .Fields("out") = "" Then
 .Edit
 .Fields("out") = "#"
 .Update
 End If
 .MoveNext
 Loop
 End If
 End With
 ta_inout.Close
 ta_lyl.Close
 db.Close
End Sub
Public Sub KhungInOut(ID_m As String)
Dim db As Database
Dim ta_inout As Recordset
Dim hang, m As Integer
Dim querry As String
Set db = OpenDatabase(npath & csdl)
querry = "select * from inout where id='" & ID_m & "'"
Set ta_inout = db.OpenRecordset(querry)
If Not (ta_inout.BOF And ta_inout.EOF) Then
'lay so record trong bang inout
 ta_inout.MoveLast
 i = ta_inout.RecordCount
 With INOutFlx
 .Rows = i + 1
 .Cols = 5
 .FormatString = "|^ Ngaøy |^ Thôøi ñieåm vaøo|^Thôøi ñieåm ra|^;"
 End With
'Dien cac truong vao khung inout
 s_late = 0
 s_early = 0
 ta_inout.MoveFirst
 hang = 0
 Do Until ta_inout.EOF
 hang = hang + 1
 With INOutFlx
 .TextMatrix(hang, 1) = ta_inout.Fields("date")
 .TextMatrix(hang, 2) = ta_inout.Fields("in")
 On Error Resume Next
 .TextMatrix(hang, 3) = ta_inout.Fields("out")
 End With
nhay1: ta_inout.MoveNext
 Loop
Else
 With INOutFlx
 .Rows = 1
 .Cols = 4
 .FormatString = "|^ Ngaøy |^Thôøi ñieåm vaøo|^Thôøi ñieåm ra|^;"
 End With
End If
ta_inout.Close
db.Close
End Sub
Private Sub SearchCmd_Click()
Dim inp, s As String
Dim k, k1, i, j As Integer
Dim thay As Boolean
Form3.Show (1)
inp = id_search
On Error Resume Next
If isnum(inp) Then
 inp = chuanID(inp)
 With LylichFlx
 k = .Rows
 thay = False
 i = 1
 Do Until i > k Or thay
 j = 1
 Do Until j > 2 Or thay
 s = .TextMatrix(i, j)
 If s = inp Then
 thay = True
 IDTxt.Text = .TextMatrix(i, 1)
 id_r = IDTxt.Text
 NameTxt.Text = .TextMatrix(i, 2)
 CVTxt.Text = .TextMatrix(i, 3)
 KhungInOut (IDTxt.Text)
 name_r = NameTxt.Text
 frten.Caption = name_r
 lbten.Caption = name_r
 Dim db As Database
 Dim ta_s_timework As Recordset
 Set db = OpenDatabase(npath & csdl)
 Set ta_s_timework = db.OpenRecordset("s_timework")
 With ta_s_timework
 .Index = "ID1index"
 .Seek "=", IDTxt.Text
 If Not .NoMatch Then
 tongket (IDTxt.Text)
 End If
 End With
 ta_s_timework.Close
 db.Close
 Else
 j = j + 1
 End If
 Loop
 i = i + 1
 Loop
 If Not thay Then
 k = MsgBox("Khoâng Quaûn Lyù", vbOKOnly, "Thoâng baùo!!!")
 End If
 End With
End If
End Sub
Private Sub sum_Click()
 Form2.Show
End Sub
Private Sub cmdconnect_Click()
 If (txttocdo "" And txttocdo "Baudrate") And (txtcong "" And txtcong "Port") Then
 Timer1.Enabled = True
 Timer3.Enabled = True
 Dim mystring As String
 Dim send, receive As Integer
 comport = CInt(txtcong.Text)
 baudrate = CInt(txttocdo.Text)
 mystring = "11111110"
 send = Str2dec(mystring)
 receive = Trans(Chr(send), True)
 If receive - send = 1 Then
 traloi = MsgBox("Keát Noái Thaønh Coâng", vbOKOnly + vbInformation, "Keát Noái")
 Timer1.Enabled = False
 cmdconnect.Enabled = False
 Timer2.Enabled = True
 Timer4.Enabled = True
 lblstatus.Caption = " Connecting .......................... "
 lblOK.ForeColor = &HFF0000
 lblOK.Caption = " OK "
 Timer3.Enabled = False
 Else
 traloi = MsgBox("Loãi Ñöôøng Truyeàn ! Vui Loøng Thöû Laïi Laàn Nöõa !", vbOKOnly + vbCritical, "KEÁT NOÁI")
 Timer1.Enabled = False
 cmdconnect.SetFocus
 lblstatus.Caption = "Connecting .........................."
 lblOK.ForeColor = &HFF
 lblOK.Caption = "Failed"
 Timer3.Enabled = False
 End If
 Else
 If txttocdo = "Baudrate" Then
 txttocdo.SetFocus
 Else
 txtcong.SetFocus
 End If
 End If
End Sub
Private Sub cmdexit_Click()
 If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
 End
End Sub
Private Sub Timer1_Timer()
 lblstatus.Caption = " Connecting .......................... "
 lblOK.ForeColor = &HFF
 lblOK.Caption = " Failed "
 Timer3.Enabled = False
 traloi = MsgBox("Loãi Ñöôøng Truyeàn ! Vui Loøng Thöû Laïi Laàn Nöõa !", vbOKOnly + vbCritical, "KEÁT NOÁI")
 Timer1.Enabled = False
End Sub
Private Sub Timer2_Timer()
 If MSComm1.InBufferCount > 0 Then
 MSComm1.InputLen = 1
 txtin.Text = Asc(MSComm1.Input)
 ID_S = txtin.Text
 Nhap_ID
 MSComm1.InBufferCount = 0
 End If
End Sub
Private Sub Timer3_Timer()
 Select Case k
 Case 0
 lblstatus.Caption = " Connecting . "
 Case 1
 lblstatus.Caption = " Connecting .. "
 Case 2
 lblstatus.Caption = " Connecting ... "
 Case 3
 lblstatus.Caption = " Connecting .... "
 Case 4
 lblstatus.Caption = " Connecting ..... "
 Case 5
 lblstatus.Caption = " Connecting ...... "
 Case 6
 lblstatus.Caption = " Connecting ....... "
 Case 7
 lblstatus.Caption = " Connecting ........ "
 Case 8
 lblstatus.Caption = " Connecting ......... "
 Case 9
 lblstatus.Caption = " Connecting .......... "
 Case 10
 lblstatus.Caption = " Connecting ........... "
 Case 11
 lblstatus.Caption = " Connecting ............ "
 Case 12
 lblstatus.Caption = " Connecting ............. "
 Case 13
 lblstatus.Caption = " Connecting .............. "
 Case 14
 lblstatus.Caption = " Connecting ............... "
 Case 15
 lblstatus.Caption = " Connecting ................ "
 Case 16
 lblstatus.Caption = " Connecting ................. "
 Case 17
 lblstatus.Caption = " Connecting .................. "
 Case 18
 lblstatus.Caption = " Connecting ................... "
 Case 19
 lblstatus.Caption = " Connecting .................... "
 Case 20
 lblstatus.Caption = " Connecting ..................... "
 Case 21
 lblstatus.Caption = " Connecting ...................... "
 Case 22
 lblstatus.Caption = " Connecting ....................... "
 Case 23
 lblstatus.Caption = " Connecting ........................ "
 Case 24
 lblstatus.Caption = " Connecting ......................... "
 Case 25
 lblstatus.Caption = " Connecting .......................... "
 k = k + 1
 End Select
 If k < 25 Then k = k + 1
 If k > 25 Then k = 0
End Sub
Private Sub Timer4_Timer()
 Dim mystring As String
 Dim send, receive As Integer
 Timer5.Enabled = True
 comport = CInt(txtcong.Text)
 baudrate = CInt(txttocdo.Text)
 mystring = "11111110"
 send = Str2dec(mystring)
 receive = Trans(Chr(send), True)
 If receive - send = 1 Then
 Timer5.Enabled = False
 End If
End Sub
Private Sub Timer5_Timer()
 cmdconnect.Enabled = True
 traloi = MsgBox("Maát Ñöôøng Truyeàn. Kieåm Tra Laïi Daây Noái Hoaëc Thieát Bò !", vbOKOnly + vbCritical, "KEÁT NOÁI")
 lblstatus.Caption = " Connecting .......................... "
 lblOK.ForeColor = &H0
 lblOK.Caption = " Lost!!! "
 Timer5.Enabled = False
End Sub
Public Sub tongket(ByVal s As String)
Dim db As Database
Dim que As String
Dim ta_stimework, ta_lyl As Recordset
Set db = OpenDatabase(npath & csdl)
que = "select * from s_timework where id='" & s & "'"
Dim h, m As Integer
Set ta_stimework = db.OpenRecordset(que)
With ta_stimework
If Not (.BOF And .EOF) Then
 .MoveFirst
 If .Fields("s_late") < 0 Then
 lblate.Caption = "Khoâng ñi treã"
 Else
 h = .Fields("s_late") \ 60
 m = .Fields("s_late") Mod 60
 lblate.Caption = CStr(h) & " giôø " & CStr(m) & " phuùt "
 End If
 If .Fields("s_early") < 0 Then
 lblate.Caption = "Khoâng veà sôùm"
 Else
 h = .Fields("s_early") \ 60
 m = .Fields("s_early") Mod 60
 lbearly.Caption = CStr(h) & " giôø " & CStr(m) & " phuùt "
 End If
 Else
 lblate.Caption = "0"
 lbearly.Caption = "0"
 End If
 End With
ta_stimework.Close
que = "select * from lylich where id='" & s & "'"
Set ta_lyl = db.OpenRecordset(que)
If Not (ta_lyl.BOF And ta_lyl.EOF) Then
 ta_lyl.MoveFirst
 frten.Caption = ta_lyl.Fields("name")
 lbten.Caption = ta_lyl.Fields("name")
 IDTxt.Text = s
 NameTxt.Text = ta_lyl.Fields("name")
 CVTxt.Text = ta_lyl.Fields("chucvu")
End If
ta_lyl.Close
db.Close
End Sub
* Form 2 ( Form Toång Keát ) :
Option Explicit
Dim id_r, name_r, date_r, in_r, out_r As String
Dim npath, s_late, s_early As String
Dim nump, numd As Integer
Const csdl = "csdl.mdb"
Private Sub cmdOK_Click()
 Unload Me
End Sub
Private Sub cmdprint_Click()
 Printer.Print "HELLO"
 Printer.EndDoc
End Sub
Private Sub Form_Load()
Dim db As Database
Dim ta_IDdate, ta_lyl, ta_s_timework As Recordset
Dim ta_inout As Recordset
Dim quer0, quer1, quer2 As String
Dim i As Integer
npath = App.Path & "\"
Set db = OpenDatabase(npath & csdl)
Set ta_lyl = db.OpenRecordset("lylich")
'Set ta_s_timework = db.OpenRecordset("s_timework")
With tongflx
 .Cols = 8
 .Rows = 1
 .FormatString = "|^ ID |^Hoï vaø Teân|^Thôøi Gian( ngaøy )|^Thôøi ñieåm vaøo|^Thôøi ñieåm ra|^Toång thôøi gian ñi treã|^Toång thôøi gian veà sôùm"
End With
If Not (ta_lyl.BOF And ta_lyl.EOF) Then
 ta_lyl.MoveFirst
 Do Until ta_lyl.EOF
 id_r = ta_lyl.Fields("ID")
 name_r = ta_lyl.Fields("name")
 '1
 quer0 = "select * from s_timework where id='" & id_r & "'"
 Set ta_s_timework = db.OpenRecordset(quer0)
 If Not (ta_s_timework.BOF And ta_s_timework.EOF) Then
 ta_s_timework.MoveFirst
 s_late = ta_s_timework.Fields("s_late")
 s_early = ta_s_timework.Fields("s_early")
 Else
 s_late = "0"
 s_early = "0"
 End If
 ta_s_timework.Close
 '1
 quer1 = "select * from ID_date where id='" & id_r & "'"
 Set ta_IDdate = db.OpenRecordset(quer1)
 If Not (ta_IDdate.BOF And ta_IDdate.EOF) Then
 ta_IDdate.MoveFirst
 Do Until ta_IDdate.EOF
 date_r = ta_IDdate.Fields("date")
 quer2 = "select * from inout where id='" & id_r & "' and date='" & date_r & "'"
 Set ta_inout = db.OpenRecordset(quer2)
 If Not (ta_inout.EOF And ta_inout.BOF) Then
 ta_inout.MoveFirst
 Do Until ta_inout.EOF
 in_r = ta_inout.Fields("in")
 out_r = ta_inout.Fields("out")
 ' dien khung
 With tongflx
 .AddItem "" & vbTab & id_r & vbTab & name_r & vbTab & date_r & vbTab & in_r & vbTab & out_r & vbTab & s_late & vbTab & s_early & vbTab & ""
 End With
 ta_inout.MoveNext
 Loop
 ta_inout.Close
 Else
 in_r = "0"
 out_r = "0"
 'dien vao khng
 With tongflx
 .AddItem "" & vbTab & id_r & vbTab & name_r & vbTab & date_r & vbTab & in_r & vbTab & out_r & vbTab & s_late & vbTab & s_early & vbTab & ""
 End With
 End If
 ta_IDdate.MoveNext
 Loop
 'ta_lyl.MoveNext
 End If
 ta_lyl.MoveNext
 Loop
End If
ta_lyl.Close
ta_IDdate.Close
db.Close
With tongflx
 .MergeCells = 3
 For i = 1 To 3
 .MergeCol(i) = True
 Next i
 .MergeCol(6) = True
 .MergeCol(7) = True
End With
End Sub
* Form 3 ( Form Tìm Kieám ) :
Option Explicit
Private Sub cancelcmd_Click()
 id_search = ""
 Unload Me
End Sub
Private Sub OKCmd_Click()
 If (Len(txtiD.Text) > 0) Then
 id_search = (txtiD.Text)
 End If
 Unload Me
End Sub
Private Sub txtiD_KeyPress(KeyAscii As Integer)
 If KeyAscii = 13 Then
 OKCmd.SetFocus
 End If
 If KeyAscii = 27 Then
 id_search = ""
 Unload Me
 End If
End Sub
* Module 1 :
Option Explicit
Const npath = "d:\documents\nhat\"
Const csdl = "csdl.mdb"
Public comport As Byte
Public baudrate As Integer
Public ID_S, id_search As String
Public Function d_late(ByVal t As Date) As Integer
Dim tam, lat, k As Integer
 tam = 60 * CInt(Hour(t)) + CInt(Minute(t))
 If (tam 420) Then '13h
 lat = tam - 420 '7h
 End If
 If (tam > 780) And (tam < 1020) Then
 lat = tam - 780
 End If
 d_late = (lat)
 'k = MsgBox(CStr(lat))
End Function
Public Function d_early(ByVal t As Date) As Integer
Dim tam, earl As Integer
tam = 60 * CInt(Hour(t)) + CInt(Minute(t))
If (tam 420) Then
 earl = 660 - tam
End If
If (tam > 780) And (tam < 1020) Then
 earl = 1020 - tam
End If
d_early = (earl)
End Function
Public Function chuanID(ByVal ID As String) As String
Dim i, l As Integer
Dim tam As String
l = Len(ID)
tam = ""
If (l = 1) Then
 For i = 1 To 4 - l
 tam = tam + "0"
 Next i
 chuanID = tam & ID
Else
 chuanID = ID
End If
End Function
Public Function isnum(ByVal s As String) As Boolean
Dim l, i As Integer
Dim phai As Boolean
Dim c As String
l = Len(s)
i = 1
phai = False
If s "" Then
 Do Until i > l Or phai
 c = Mid(s, i, 1)
 If (c >= "0") And (c <= "9") Then
 phai = True
 Else
 i = i + 1
 End If
 Loop
End If
isnum = phai
End Function
Public Function Str2dec(str As String) As Integer
 Dim j As Byte
 Dim ans As Integer
 ans = 0
 For j = 1 To 8
 ans = ans + CInt(Mid(str, j, 1)) * (2 ^ (8 - j))
 Next j
 Str2dec = ans
End Function
Public Function Dec2bin(dec As Integer) As String
 Dim ans As String
 Dim t(0 To 7) As String
 Dim j As Byte
 For j = 0 To 7
 t(j) = dec Mod 2
 ans = ans & t(j)
 dec = dec \ 2
 Next j
 ans = StrReverse(ans)
 Dec2bin = ans
End Function
Public Function Trans(str As String, receive As Boolean) As Long
 Dim ans As Long
 Dim temp As String
 If Form1.MSComm1.PortOpen = True Then Form1.MSComm1.PortOpen = False
 Form1.MSComm1.InBufferCount = 0
 Form1.MSComm1.OutBufferCount = 0
 Form1.MSComm1.InputLen = 1
 Form1.MSComm1.CommPort = comport
 Form1.MSComm1.Settings = CStr(baudrate) & ",N,8,1"
 Form1.MSComm1.PortOpen = True
 Form1.MSComm1.Output = str
 If receive = False Then
 Form1.MSComm1.PortOpen = False
 Trans = 0
 Exit Function
 Else
 Do
 DoEvents
 Loop Until Form1.MSComm1.InBufferCount > 0
 temp = Form1.MSComm1.Input
 Form1.MSComm1.InBufferCount = 0
 ans = Asc(temp)
 'frmmain.txtin.Text = CStr(ans)
 Trans = ans
 End If
End Function
Public Sub comset()
 Dim t As Byte
 Dim temp As Integer
 On Error GoTo errhandle
 t = comport
 temp = baudrate
 comport = InputBox("The Current Comport is " & CStr(t) & ". Do You Want to Change ?", "Comport Setting", "1")
 baudrate = InputBox("The Current Baudrate is" & CStr(temp) & "bps" & ". Do You Want to Change ?", "baudrate Setting", "9600")
 Exit Sub
errhandle:
 comport = t
 baudrate = temp
 frmdemo.Hide
 Form1.Show
End Sub
2. Maõ Chöông Trình Treân Vi Ñieàu Khieån AT89C51 : 
	ORG	0000H
	LJMP	MAIN
	ORG	000BH
	LJMP	NGATT0
	ORG	0023H
	LJMP	THU
	ORG 	0030H
	MAIN :
	TEST	EQU	11111110B
	MOV	SP,#59H
	MOV	TMOD,#21H
	MOV	IE,#00H
	SETB	EA
	SETB	ES
	SETB	PS
	MOV	SCON,#52H
	MOV	TH1,#-3D
	SETB	TR1
	AGAIN :	
	MOV	P1,#0FFH
	MOV	TH0,#00H
	MOV	TL0,TH0
	L1 :	MOV	C,P1.7
	JNC	L1
	SETB	ET0
	SETB	TR0
	SETB	P1.7
	L2 :	MOV	C,P1.7
	JC	L2
	CLR	TR0
	CLR	ET0
	MOV	A,TH0
	CPL	A
	MOV	R7,A
	MOV	A,TL0
	CPL	A
	MOV	R6,A
	CLR	P1.0
	CLR	A
	SETB	P1.7
	MOV	R2,#10D
	LCALL	DELAY1V
	JB	P1.7,ERR
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.0,C
	SETB	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.1,C
	SETB	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.2,C
	SETB 	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.3,C
	SETB	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.4,C
	SETB	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.5,C
	SETB 	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.6,C
	SETB	P1.7
	LCALL	DELAY1V
	MOV	C,P1.7
	MOV	ACC.7,C
	SJMP 	EXIT
ERR :	
	CPL	P1.0
	ACALL	DELAY
	DJNZ	R2,ERR
	LJMP	AGAIN
EXIT :	
	CLR	ES
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	SETB	ES
	CPL	A
	MOV	P0,A
	ACALL	DELAY
	ACALL	DELAY
	SETB	P1.0
	LJMP	AGAIN	
NGATT0:	
	INC	R5
	RETI
DELAY:	MOV	R0,#20D
DELAYS:	MOV	TH0,#HIGH(-50000)
	MOV	TL0,#LOW(-50000)
	SETB	TR0
	JNB	TF0,$
	CLR	TF0
	CLR	TR0
	DJNZ	R0,DELAYS
	RET
DELAY1V:	
	PUSH	ACC
	MOV	TH0,R7
	MOV	TL0,R6
	SETB	TR0
	MOV	A,R5
	JNB	TF0,$
	CLR	TF0
	CLR	TR0
	CJNE	A,#00H,LONDELAY1V
	SJMP	THOAT
LONDELAY1V:	
	MOV	TH0,#00H
	MOV	TL0,TH0
	SETB	TR0
	JNB	TF0,$
	CLR	TF0
	CLR	TR0
	DJNZ	R5,LONDELAY1V
THOAT:	
	POP	ACC
	RET
THU :
	JB	TI,OUT
	PUSH	ACC
	MOV	A,SBUF
	CLR	RI
	CJNE	A,#TEST,SKIP
	INC	A
	CLR	ES
	MOV	SBUF,A
	JNB	TI,$
	CLR	TI
	SETB	ES
SKIP :	POP	ACC
OUT :
	CLR	TI
	RETI
	END
PHAÀN VIII :
THI COÂNG LAÉP RAÙP – SÔ ÑOÀ MAÏCH IN
	I. CAÙC FORM CUÛA CHÖÔNG TRÌNH :
	1. Form Demo – Giôùi Thieäu Chöông Trình :
Hình 8.1 Form Demo
	2. Form Chính :
Hình 8.2 Form Chính vaø caùc nuùt leänh chöùc naêng
	3. Form Toång Keát :
Hình 8.3 Form Toång Keát – Load khi nuùt leänh “ Toång Keát ” ñöôïc CLICK
	4. Form Tìm Kieám :
Hình 8.4 Form Tìm Kieám – Load khi nuùt leänh “ Tìm Kieám ” ñöôïc CLICK
	II. SÔ ÑOÀ MAÏCH IN ÑÖÔÏC VEÕ BAÈNG LAYOUT ( OrCAD ) :
Hình 8.5 Sô Ñoà Maïch In ñöôïc veõ töø maïch nguyeân lyù treân – Nhìn töø treân xuoáng .
KEÁT LUAÄN
 G 
	Ñaây laø moät ñeà taøi môùi cuõng nhö khoaûng thôøi gian ít oûi maø toâi coù ñöôïc trong ñeå hoaøn thaønh Luaän Vaên Toát Nghieäp; cho neân khoâng theå khoâng maéc phaûi nhöõng thieáu soùt. Vì vaäy saûn phaåm chöa hoaøn thieän laém nhö nhöõng thieát bò cuøng loaïi treân thò tröôøng hieän nay. Tuy nhieân, thôøi gian seõ buø ñaép nhöõng thieáu soùt ñoù. Toâi tin chaéc trong töông lai neáu coù cô hoäi gaëp laïi vaán ñeà töông töï trong cuoäc soáng vaø coù nhieàu thôøi gian hôn thì saûn phaåm cuûa toâi seõ ñöôïc caûi tieán caû veà chaát löôïng, ñoä tin caäy, ñoä beàn laãn tính thaåm myõ. Toâi mong raèng quyù thaày coâ haõy thoâng caûm, nhieät tình goùp yù vaø boû qua nhöõng thieáu soùt maø trong quaù trình laøm Luaän Vaên toâi ñaõ maéc phaûi ! 
	Hoàng Ngoaïi vaø maõ vaïch laø hai ñeà taøi öùng duïng raát roäng raõi trong thöïc teá, neáu naém baét ñöôïc nguyeân lyù laøm vieäc cuûa noù; ñoàng thôøi hieåu thaáu ñaùo veà noù seõ coù raát nhieàu höôùng phaùt trieån trong töông lai . 
Cuoái cuøng, moät laàn nöõa, toâi xin chaân thaønh caûm ôn söï giuùp ñôõ vaø höôùng daãn heát söùc nhieät tình cuûa thaày höôùng daãn phuï traùch toâi trong suoát thôøi gian laøm Luaän Vaên vöøa qua, Thaày LEÂ QUANG THUAÀN .
Xin chaân thaønh caûm ôn !
Sinh Vieân Thöïc Hieän
ÑOÃ TRÍ NHÖÏT
49701036