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 |
Chia sẻ: lvcdongnoi | Lượt xem: 2404 | 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