Bàn phím thu thập số liệu RS-485

Tài liệu Bàn phím thu thập số liệu RS-485: ... Ebook Bàn phím thu thập số liệu RS-485

doc161 trang | Chia sẻ: huyen82 | Lượt xem: 1621 | Lượt tải: 0download
Tóm tắt tài liệu Bàn phím thu thập số liệu RS-485, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
I.1 Sô löôïc veà PC vaø öùng duïng PC trong Ñieàu Khieån Töï Ñoäng: Vaøo nhöõng naêm 40 cuûa theá kyû XX, moät söï kieän quan troïng trong lónh vöïc ñieän toaùn ñaõ xaûy ra ñoù laø söï ra ñôøi cuûa chieác maùy tính chöõ soá chaïy baèng ñieän ñaàu tieân ra ñôøi vaø ñöôïc bieát ñeán döôùi caùi teân goïi “Aniac”. “Aniac” toång coäng phaûi duøng ñeán 18000 chi tieát ñieän ñieän töû, ngoaøi ra coøn coù 1500 chi tieát ñieän vaø caùc loaïi linh kieän khaùc, toång theå tích khoaûng 90 m3 , naêng 30 taán, chieám dieän tích 170 m2 . Neáu ñem so saùnh vôùi maùy tính ngaøy nay thì noù laø moät coã maùy khoång loà. Cuõng chính vì theá maø vaøo thôøi ñieåm ñoù ngöôøi ta chöa theå thaáy heát ñöôïc taàm quan troïng cuûa söï vieäc naøy. Nhöng ñeán thaùng 12 naêm 1981, khi IBM coâng boá veà chieác maùy tính caù nhaân ñaàu tieân cuûa hoï. Maùy ñöôïc thieát keá nhö laø moät maùy tính ñeå baøn vöøa phaûi, duøng boä vi xöû lyù Intel 8088. Model chuaån döôïc baùn vôùi giaù $3000. Maùy goàm 64K RAM (boä nhôù truy caäp ngaãu nhieân) treân baûn maïch chính, coù theå môû roäng leân tôùi 256 K treân baûn maïch heä thoáng, vaø 40K ROM (boä nhôù chæ ñoïc). Phaàn lôùn ROM naøy ñöôïc thieát keá ñeå löu moät chöông trình hoã trôï heä thoáng ñöôïc goïi laøheä thoáng nhaäp/xuaát cô baûn, hay BIOS. Maùy PC ñaàu tieân coù moät oå ñóa maät ñoä keùp moät maët. Caùc oå ñóa ñöôïc ñòng daïng coù khaû naêng löu tröõ 180K döõ lieäu. Phaàn meàm heä ñieàu haønh ban ñaàu ñöôïc cung caáp bôûi haõng Microsoft Corporation. Vaø töø ñoù ñeán nay, trong moät khoaûng thôøi gian ngaén, maùy tính – PC – ñaõ trôû thaønh moät thieát bò quan troïng haøng ñaàu trong taát caû caùc lónh vöïc kinh teá, saûn xuaát, sinh hoaït vaø ñaëc bieät laø trong caùc ngaøng coâng nghieäp hieän ñaïi. Trong lónh vöïc ñieàu khieån töï ñoäng cuûa chuùng ta thì maùy tính laïi ñaëc bieät quan troïng hôn nöõa. Noù hoaëc tröïc tieáp hoaëc giaùn tieáp laø nhöõng “oâng chuû”, hay nhöõng “giaùm saùt vieân” trong moät daây truyeàn töï ñoäng hoaëc moät quy trình saûn xuaát. Nhöng ñeå laøm ñöôïc nhöõng ñieàu ñoù PC caàn phaûi ñöôïc laäp trình tröôùc hay noùi caùch khaùc laø nhöõng ngöôøi bieát söû duïng noù. Moät trong nhöõng yeáu toá quan troïng haøng ñaåu trong vieäc ñöa PC vaøo caùc daây truyeàn töï ñoäng laø ta phaûi “giao tieáp” ñöôïc vôùi noù. Coù nghóa laø ta phaûi laäp trình ñeå cho PC coù theå trao ñoåi döõ lieäu vôùi caùc thieát bò ngoaïi vi khaùc. Ñeå töø ñoù ta môùi coù theà duøng PC ñeå ñieàu khieån caùc thieát bò ngoaïi vi ñoù. Caùc thieát bò ngoaïi vi ôû ñaây coù theå laø moät hay moät maïng NuDam, vi xöû lyù(uP), PLC hay cuõng coù theå laø moät maïng caùc PC khaùc… Coù nhieàu phöông thöùc ñeå giao tieáp maùy tính voùi caùc thieái bò gheùp noái beân ngoaøi, moãi caùch ñeàu coù nhöõng öu, nhöôïc ñieåm khaùc nhau. Tuøy theo muïc ñích, ñieàu kieän söû duïng maø ngöôøi ta coù theå söû duïng nhöõng phöông caùch khaùc nhau sao cho coù hieäu quûa nhaát. Sau ñaây laø ba phöông thöùc ñöôïc söû duïng phoå bieán . Keát noái maùy tính baèng caùch söû duïng caùc card giao tieáp ñuôïc caém tröïc tieáp leân caùc slot ôû treân mainboard cuøa maùy tính. Coù nhieàu loaïi Bus khaùc nhau vaø moãi loaïi Bus coù nhöõng öu ñieåm khaùc nhau, nhöõng loaïi bus ñang ñöôïc söû duïng phoå bieán : ISA, PCIø, AGP, PC, MCA, EISA… . Phöông phaùp naøy coù öu ñieåm noåi baät laø coù theå trao ñoåi döõ lieäu vôùi dung löôïng lôùn, toác ñoä cao. Nhöng coù nhöôïc ñieåm laø can thieäp nhieàu vaøo phaån cöùng cuûa PC deã “nguy hieåm” linh kieän töông ñoá ñaét tieàn. Moät nhöôïc ñieåm nöõa laø khi heä thoáng ñang vaän haønh ta khoù coù theå can thieäp ñöôïc vaøo phaàn cöùng. Keát noái maùy tính thoâng qua coång song song hay coång maùy in. Loaïi naøy cuõng coù öu ñieåm laø quùa trình giao tieáp trao ñoåi döõ lieäu vôùi toác ñoä cao neáu so saùnh vôùi phöông phaùp truyeàn noái tieáp. Nhöng phöông phaùp naøy coù moät nhöôïc ñieåm lôùn laø khaû naêng troáng nhieãu raát thaáp, khoâng theå truyeàn ñi xa ñöôøc. Keát noái maùy tính thoâng qua coång noái tieáp hay coång COM. Loaïi naøy coù nhöôïc dieåm laø trao ñoåi döõ lieäu vôùi toác ñoä khoâng cao laém. Nhöng laïi coù öu ñieåm noåi baät laø phöông thöùc giao tieáp ñôn giaûn deã söû duïng. Linh kieän laép ñaët raát phaûi chaêng vaø raát deã mua. Khoâng can thieäp nhieàu vaøo phaàn cöùng cuûa maùy tính coù theå thaùo laép deã daøng khi heä thoáng ñang hoaït ñoäng. Khaû naêng choán gnhieãu so vôùi phuông thöùc truyeàn song song laø cao hôn nhieàu. Phöông thöùc naøy cuõng coù theå truyeàn ñi töông ñoái xa. Trong ba phöông thöùc treân, phöông thöùc giao tieáp maùy tính qua coång noái tieáp hieän ñang ñaùp öùng ñöôïc yeâu caàu cuûa lónh vöïc ñieàu khieån töï ñoäng. Ñoù laø söï ñoøi hoûi phaûi chính xaùc, ñöôïc ñaët haøng ñaàu, ñôn giaûn trong lónh vöïc vaän haønh. I.2 Chuaån RS-485 vaø ñeà taøi ñöôïc giao: Trong vieäc giao tieáp noái tieáp hay coøn goïi laø truyeàn thoâng noái tieáp cuõng coù nhieàu phöông caùch khaùc nhau. Ñöôïc söû duïng roäng raõi nhaát hieän nay laø caùc chuaån giao tieáp cuûa EIA(Electronics Industries Association) ñöôïc goïi taét döôùi caùc teân RS-232,RS-422,RS-423,RS-485…Trong ñoù chuaån RS-485 coù nhieàu öu ñieåm : Chuaån RS-485 ñöôïc phaùt trieån daønh cho heä thoáng multi-droped, noù coù theå giao tieáp ôû moät toác ñoä cao ôû moät khoaûng caùch daøi. Chuaån RS-485 coù theå hoaït ñoäng ôû moät toác ñoä leân ñeán 10Mbps treân moät chieàu daøi cable laø 1.200m (4000feet). RS-485 coù theå hoã trôï ñeán 32 boä ñieàu khieån vaø boä nhaän treân cuøng moät ñöôøng truyeàn. Ñieàu naøy cho pheùp duøng caùc öùng duïng maïng treân cuøng heä thoáng ngang nhau (multi-drop)... Chính nhôø nhöõng öu ñieåm ñoù, RS-485 ñaõ ñöôïc söû duïng roäng raõi trong nhieàu daây truyeàn töï ñoäng khaùc nhau. RS-485 cuõng laø ñeà taøi chính ñöôïc nghieân cöùu trong luaän vaên cuûa em. Nhö ñaõ ñeà caäp treân, RS-485 khoâng coøn xa laï vôùi taát caû nhöõng ngöôøi thuoäc lónh vöïc “Ñieàu Khieån Töï Ñoäng”. Nhöng vôùi nhöõng öu ñieåm vöôït troäi cuûa noù thì ñaây cuõng laø ñeà taøi khoâng bao giôø cuõ. Coù theå noùi ñaây cuõng laø moät trong nhöõng haønh trang caàn thieát cho moãi kyõ sö nghaønh Töï Ñoäng khi ra tröôøng . Chính vì theá em ñaõ troïn RS-485 laøm chuû ñeà chính cho luaän vaên cuûa mình. Vieäc öùng duïng giao tieâp giöõa maùy tính vôùi kit vi xöû lyù duøng chuaån RS-485 ñeå laøm moät coâng vieäc minh hoïa cuõng muoân hình muoân veû. Coù raát nhieàu ñeà taøi cuûa caùc anh chò ñi tröôùc ñaõ laøm, neáu laøm laïi khoâng traùnh khoûi söï truøng laëp, nghieân cöùu ñeà taøi môùi vôùi thôø gian cho pheùp khoâng daøi cuûa laø vieäc maïo hieåm . Vieäc öùng duïng laøm moät baøn phím ña naêng cuûa em veà maët lyù thuyeát khoâng coù gì môùi. Nhöng vôùi 40 phím minh hoïa, trong ñoù coù nhieàu phím tröùc naêng ñaëc bieät ñeå giao tieáp ñoäc laäp vôùi maùy tính thì vaán ñeà veà thöïc haønh laø raát quan troïng. Ñeå hoaøn thaønh toát ñöôïc coâng vieäc thì caàn phaûi söû duïng thaønh thaïo laäp trình döôùi vi xöû lyù vaø moät ngoân ngöõ laäp trình treân maùy tính ñeå töø ñoù keát hôïp thaät toát giuõa maùy tính vôùi kit vi xöû lyù thoâng qua RS-485. II Coâng Vieäc Ñöôïc Giao: Do ñieàu kieän saûn xuaát cuûa xöông thöû bình gas aåm öôùt, oàn ñoä rung ñoäng lôùn… khoâng theå ñeå maùy tính quaûn lyù döõ lieäu taïi xöôûng ñöôïc leân coâng ty Saøi Goøn Petro caàn moät heä thoáng quaûn lyù soá lieäu sôn, thöû bình ga. Heä thoáng bao goàm : _Baøn phím:Bao goàm ba baøn phím duøng ñeå truy xuaát soá lieäu bình ga(soá seâri, taûi troïng, haõng saûn xuaát…) ñaët taïi phaân xöôûng laøm vieäc ñöôïc keát noái vôùi maùy tính. _Maùy tính ñaët taïi vaên phoøng quaûn lyù soá lieäu caùch phaân xöôûng quaûn lyù khoaûng 100 m. Maùy tính coù nhieäm vuï thoáng keâ vaø taïo 01 bieåu maãu daïng nhö “lyù lòch bình ga”. Thoáng keâ vaø ñöa ra baûng bieåu baát kyø moät thoâng soá quaûn lyù naøo khi ñöôïc yeâu caàu. Kieåm tra vaø caûnh baùo khi coù nhöõng thoâng soá baát thöôøng khi ñöôïc laäp trình saün… III Chi tieát kyõ thuaät cuûa thieát bò : Baøn phím coù soá löôïng toái ña khoaûng 45 phím, boä chæ thò hieån thò led coù 2 led matraän duøng ñeå hieån thò thoâng soá nhaäp, 8 led dôn duøng ñeå hieån thò soá lieäu cuûa thoâng soá nhaäp Caùc soá lieäu treân baûng kieåm tra vaø thöû bình ga goàm coù caùc thoâng soá: Nhoùm thoâng soá cuûa bình ga: Ngaøy thaùng thöû, sôû höõu chuû, dung tiùch thöû laàn thöù, soá seâri, naêm saûn xuaát, noi saûn xuaát, khoái löôïng bì, chieàu daøy. Nhoùm kieåm tra tình traïng cuûa bình ñaït,khoâng ñaït: coå, khoái löôïng, caét ñuïc ñaøo loõm, phình ra , aên moøn, chieàu daøy , roø ræ, chaùy. Nhoùm tình traïng kieåm ñònh vaø loaïi bình : Ñeán haïn kieåm ñònh, chöa ñeán haïn kieåm ñònh chæ yeâu caàu sôn , loaïi 12kg loaïi 50 kg. IV Moâ taû hoaït ñoäng cuûa heä thoáng Nhaäp nhoùm Thoâng Soá cuûa Bình Gas : Nhaán phím ngaøy thaùng thöû: Nhaán phím Date, treân 2 soá ñaàu seõ hieän chöõ:DA Nhaäp ngaøy thaùng vaøo seõ hieän lieân tuïc 6 soá theo thöù töï ngaøy thaùng naêm: 14 08 01. Khi ñang phaäp sai soá, duøng CE ñeå xoùa soá nhaäp. Phím CHECK duøng ñeå xem toaøn boä lyù lòch bình hieän höõu töøng doøng moät, nhaán CHECK sau ñoù nhaán theâm phím thoâng soá naøo thì giaù trò töông öùng cuûa thoâng soá ñoù seõ ñöôïc hieän leân. Nhaán CHECK laàn nöõa seõ thoaùt khoûi tình traïng kieåm ñònh. Nhaán phím ENTER caùc giaù trò seõ ñöôïc truyeàn veà maùy tính. Nhaán phím RESET seõ trôû laïi traïng thaùi saün saøng nhaäp giaù trò môùi. Nhaäp nhoùm Tình Traïng Kieåm Ñònh : Nhaán phím roø ræ LE [leak] treân chæ thò hieän LE Nhaán OK laø ñaït (hieän soá 1) Nhaán NOTOK laø khoâng ñaït (hieän soá 0) Caùc thoâng soá khaùc nhaäp töông töï. Tính chaát cuûa chæ thò: Khi nhaäp soá lieäu seõ ñaåy daàn töø phaûi sang traùi, khi phaäp sai nhaán phím CE ñeå nhaäp laïi. Ñeøn baùo hieäu saün saøng nhaäp. Ñeøn baùo loãi ñöôøng truyeàn… V Giaûi quyeát coâng vieäc: Tuy thöïc teá coâng vieäc ñoøi hoûi phaûi coù ba baøn phím nhöng ba baøn phím naøy veà maët kyõ thuaät hoaøn toaøn gioáng nhau leân em chæ laøm moät baøn phím mang tính chaát moâ phoûng , moät lyù do nöõa laø laøm 3 baøn phím raát toán keùm. Sô ñoà heä thoáng Sô ñoà thi coâng CHÖÔNG I: Giôùi thieäu moät soá phöông phaùp truyeàn thoâng A GIÔÙI THIEÄU TOÅNG QUAÙT VEÀ MAÏNG MAÙY TÍNH. I. Toång quaùt: Maïng maùy tính laø moät taäp hôïp caùc maùy tính ñöôïc noái vôùi nhau bôûi caùc ñöôøng truyeàn vaät lyù theo moät kieán truùc naøo ñoù. Vaø ngaøy nay maïng maùy tính ñaõ trôû thaønh moät lónh vöïc nghieân cöùu phaùt trieån vaø ngaøy caøng ñöôïc öùng duïng roäng raõi trong cuoäc soáng. Ñuôøng truyeàn vaät lyù vaø kieán truùc maïng: 1. Ñöôøng truyeàn vaät lyù: Ñöôøng truyeàn vaät lyù duøng ñeå truyeàn tín hieäu ñieän töû giöõa caùc maùy tính . Caùc tính hieäu ñieän töû ñoù bieåu thò caùc giaù trò döõ lieäu döôùi daïng caùc xung nhò phaân. Taát caû caùc tín hieäu ñöôïc truyeàn giöõa caùc maùy tính ñeàu thuoäc 1 daïng soùng ñieän töø naøo ñoù, traûi töø caùc taàn soá radio tôùi caùc soùng cöïc ngaén(vi ba) vaø tia hoàng ngoaïi. Tuyø theo taàn soá cuûa soùng ñieän töø coù theå duøng caùc ñöôøng truyeàn vaät lyù khaùc nhau ñeå truyeàn tín hieäu. Caùc taàn soá radio coù theå truyeàn baèng caùp ñieän ( daây ñoâi xoaén hoaëc ñoàng truïc ) hoaëc baèng phöông tieän quaûng baù (radio broadcasting). Soùng cöïc ngaén (vi ba) thöôøng ñöôïc duøng ñeå truyeàn giöõa caùc traïm maët ñaát vaø caùc veä tinh. Tia hoàng ngoaïi laø lyù töôûng ñoái vôùi nhieàu loaïi truyeàn thoâng maïng. Noù coù theå duøng ñeå truyeàn giöõa hai ñieåm hay töø moät ñieåm ñeán nhieàu maùy thu. Khi xem xeùt löïa choïn ñöôøng truyeàn chuùng ta caàn chuù yù ñeán caùc ñaëc tröng cô baûn nhö : giaûi thoâng , ñoä suy hao, vaø ñoä nhieãm töø. 2..Kieán truùc maïng: Kieán truùc maïng maùy tính theå hieän qua caùch noái caùc maùy tính vôùi nhau ra sao vaø taäp hôïp caùc quy taéc maø taát caû caùc thöïc theå tham gia truyeàn thoâng treân maïng phaûi tuaân theo ñeå cho maïng hoaït ñoäng toát. Caùch keát noái caùc maùy tính goïi laø hình traïng(topology), quy taéc quy öôùc truyeàn thoâng thì goïi laø giao thöùc (protocol). Topology maïng : coù hai kieåu noái maïng chuû yeáu laø point-to-point vaø quaûng baù theo kieåu point-to-point, caùc ñöôûng truyeàn noái thaønh caëp nuùt vôùi nhau vaø moãi nuùt ñeàu coù traùch nhieäm löu tröõ taïm thôøi sau ñoù chuyeån döõ lieäu ñi cho ñeán ñích. Theo kieåu quaûng baù, taát caû caùc nuùt phaân chia chung moät ñöôøng truyeàn vaät lyù. Döõ lieäu ñöôïc gôûi ñi töø moät nuùt naøo ñoù coù theå ñöôïc tieáp nhaän bôûi taát caû caùc nuùt coøn laïi. Nôi nhaän kieåm tra xem ñòa chæ ñích gôûi ñeán coù phaûi laø cuûa mình hay khoâng ñeå coù theå tieáp tuïc thöïc hieän vieäc giao tieáp hay khoâng giao tieáp. Giao thöùc maïng : Vieäc truyeàn tín hieäu treân maïng cuõng caàn phaûi tuaân theo nhöõng quy taéc, quy öôùc veà nhieàu maët, töø khuoân daïng (cuù phaùp, ngöõ nghóa) cuûa döõ lieäu tôùi caùc thuû tuïc gôûi, nhaän döõ lieäu kieåm soaùt coù hieäu quaû vaø chaát löôïng truyeàn tin cuõng nhö xöû lyù caùc loãi söï coá. Taäp hôïp taát caû caùc quy taéc ñoù goïi laø giao thöùc (protocol) cuûa maïng. Phaân loaïi maïng maùy tính: Coù nhieàu caùch phaân loaïi maïng khaùc nhau tuyø thuoäc vaøo caùc yeáu toá chính laøm chæ tieâu phaân loaïi maïng. Neáu laáy khoaûng caùch laøm chæ tieâu phaân loaïi maïng thì ta coù caùc loaïi sau: Maïng cuïc boä: Laø maïng ñöôïc caøi ñaët trong phaïm vi töông ñoái nhoû vôùi khoaûng caùch lôùn nhaát giöõa caùc maùy tính cuõng chæ vaøi chuïc km trôû laïi. Moät maïng cuïc boä bao goàm caû phaàn cöùng vaø phaàn meàm. Phaàn meàm cuûa noù bao goàm chöông trình ñieàu khieån vaø heä ñieàu haønh maïng. Coøn phaàn cöùng bao goàm : Maùy chuû (File server-FS ). Caùc traïm laøm vieäc . Caùc thieát bò ngoaïi vi. Card maïng. Maïng ñoâ thò: ( Metropolian Area Networds-MAN ) laø maïng ñöôïc söû duïng (caøi ñaët ) trong phaïm vi moät ñoâ thò hay moät trung taâm kinh teá –chính trò xaõ hoäi coù baùn kính trong phaïm vi khoaûng 100km trôû laïi. Maïng dieän roäng: (Wide Area Networds-WAN ) Coù phaïm vi vöôït bieân giôùi cuûa moät quoác gia. Maïng toaøn caàu: (Global Area Networds-GAN ) phaïm vi cuûa maïng traûi khaép beà maët cuûa traùi ñaát. B Giao tieáp maùy tính vôùi ngoaïi vi: Nhö ta ñaõ bieát, ñeå gheùp noái vôùi maùy tính ta coù ba khaû naêng ñeå troïn: Gheùp noái qua coång maùy in hay coøn goïi laø coång song song Gheùp noái qua raõnh caém môû roäng treân baûn maïch chính. Gheùp noái qua coång noái tieáp. Moãi phöông phaùp ñeàu coù nhöõng öu nhöôïc ñieåm rieâng leân ñeán baây giôø taát caû caùc phöông phaùp ñeàu toàn taïi. Tuøy theo kinh nghieäm , coâng vieäc khaùc nhau maø ta coù söï löa troïn khaùc nhau. ÔÛ phaàn naøy em chæ giôùi thieäu qua veà hai phöông phaùp ñaàu vaø ñi saâu hôn vaøo phöông phaùp thöù ba. I Coång song song: Caáu truùc cuûa coång song song: Coång song song coù 2 loaïi : OÅ caém 36 chaân Oå caém 26 chaân Ngaøy nay haàu heát caùc maùy tính PC ñeàu trang bò coång song song 25 chaân neân ta chæ caàn quan taâm ñeán coång 25 chaân. ÔÛ daïng truyeàn song song, caùc bit döõ lieäu ñöôïc truyeàn ñoàng thôøi treân caùc ñöôøng khaùc nhau. Öu ñieåm lôùn nhaát cuûa vieäc truyeàn song song laø toác ñoä truyeàn cao, caùc ñöôøng daãn ñeàu töông thích TTL . Nhöôïc ñieåm laø deã bò nhieãu. Sô ñoà chaân: 13 25 12 24 11 23 10 22 9 21 8 20 7 19 6 18 5 17 4 16 3 15 2 14 1 Baûng moâ taû söï boá trí caùc chaân ôû coång noái vôùi maùy in: CHAÂN KYÙHIEÄU CHIEÀU MOÂ TAÛ 1 STROBE Loái ra BYTE ñöôïc in 2 ¸ 9 D0 ¸ D7 Loái ra Ñöôøng döõ lieäu D0 ¸ D7 10 ACK Loái vaøo Acknowledge (Xaùc nhaän) 11 BUSY Loái vaøo Logic 1: Maùy in baän 12 PE Loái vaøo Heát giaáy 13 SLCT Loái vaøo Select ( löïa choïn) 14 AF Loái ra Auto feed ( töï naïp) 15 ERROR Loái vaøo Error ( loãi) 16 INIT Loái ra Logic 0: Ñaët laïi maùy in 17 SLCTIN Loái ra Select in 18 ¸ 25 GND Noái ñaát Hinh 1: Baûng moâ taû söï boá trí caùc chaân ôû coång noái vôùi maùy in Coång noái vôùi maùy in hay thöôøng goïi laø giao dieän Centronics. Coång naøy khoâng chæ noái vôùi maùy in maø coøn gheùp noái vôùi caùc thieát bò ngoaïi vi khi söû duïng maùy tính vaøo muïc ñích ño löôøng vaø ñieàu khieån. Coång coù 25 chaân. Ngoaøi 8 bit döõ lieäu coøn coù nhöõng ñöôøng daãn tín hieäu khaùc, toång coäng coù theå trao ñoåi moät caùch rieâng bieät vôùi 17 ñöôøng daãn, goàm 12 ñöôøng daãn ra vaø 5 ñöôøng daãn vaøo. 8 ñöôøng daãn döõ lieäu D0 ¸ D7 khoâng phaûi laø ñöôøng daãn hai chieàu trong taát caû caùc loaïi maùy tính neân treân baûng moâ taû chæ xem nhö laø loái ra. Caùc loái ra kaùc nöõa laø STROBE, AUTOFED ( AF), INIT vaø SELECT IN (SLCTIN). Khi trao ñoåi thoâng tin vôùi maùy in, caùc ñöôøng daãn naøy coù nhöõng chöùc naêng xaùc ñònh. Thí duï, INIT = 0 thöïc hieän moät quaù trình khôûi ñoäng laïi (Reset) ôû maùy in, coøn STROBE coù nhieäm vuï ghi caùc bit döõ lieäu ñaõ ñöôïc göûi töø maùy in baèng moät xung Low vaøo trong boä nhôù cuûa maùy in. Coång cuûa maùy in cuõng coù nhöõng ñöôøng daãn loái vaøo, nhôø vaäy maø söï baét (cheùo) tay giöõa maùy tính vaø maùy in ñöôïc thöïc hieän. Chaúng haïn, khi maø maùy in khoâng coøn ñuû choã trong boä nhôù thì maùy in seõ göûi ñeán maùy tính moät bit traïng thaùi (BUSY = 1); ñieàu ñoù coù nhgóa laø maùy in taïi thôøi ñieåm naøy ñang baän, khoâng neân göûi theâm caùc byte döõ lieäu khaùc ñeán nöõa.Khi heát giaáy ôû maùy in thì maùy tính seõ thoâng baùo laø PAPER EMPTY (PE). Ñöôøng daãn loái vaøo tieáp theo laø ACKNOWLEDGE (ACK), SELECT (SLCT) vaø ERROR. Toång coäng maùy tính PC coù 5 loái vaøo höôùng tôùi maùy in. Söï trao ñoåi vôùi caùc ñöôøng daãn tín hieäu: Caùc tín hieäu ñöôïc trao ñoåi qua coång song song thoâng qua 3 thanh ghi: thanh ghi döõ lieäu thanh ghi traïng thaùi thanh ghi ñieàu khieån. Thanh ghi döõ lieäu Ñöôïc ñònh vò ôû ñòa chæ cô sôû cuûa coång. D7 D6 D5 D3 D4 D1 D2 D0 Datenregister(Basicaddress) Pin 2 Pin 3 Pin 4 Pin 5 Pin 6 Pin 7 Pin 8 Pin 9 Thanh ghi traïng thaùi Ñònh vò ôû ñòa chæ cô sôû cuûa +1. Ñaây laø thanh ghi chæ ñoïc, ñöôïc CPU duøng ñeå thu traïng thaùi hieän taïi cuûa doøng tín hieäu ñi töø maùy in hay thieát bò tôùi maùy tính. 3 bit thaáp ñaàu tieân ñöôïc ñaët baèng 0. Caùc bit khaùc coøn laïi ñöôïc ñaët nhö hình veõ: D7 D6 D5 D3 D4 0 0 0 Statsregister(Basicaddress +1) Pin 15 (ERROR) Pin 13 (SLCT) Pin 12 (PE) Pin 10 (ACK) Pin 11 (BUSY) Thanh ghi ñieàu khieån Ñònh vò ôû ñòa chæ cô sôû +2. Controlregister (Basicaddress =2) D7 D6 D5 D3 D4 D1 D2 D0 Pin 1 (STROBE) Pin 14 (AUTOFEED) Pin 16 (INIT) Pin 17 (SLCTIN) IRQ-ENABLE ÔÛ caùc maùy tính PC ñöôïc cheá taïo gaàn ñaây, ñòa chæ cô baûn cuûa coång maùy in ñöôïc saép xeáp nhö sau: LPT1 (Coång maùy in thöù nhaát) Þ Ñòa chæ cô baûn = 378H. LPT2 (Coång maùy in thöù hai) Þ Ñòa chæ cô baûn = 278H. Caùc ñòa chæ cô baûn cuûa coång maùy incuûa maùy tính PC ñöôïc ñaët ôû nhöõng ñòa chæ boä nhôù xaùc ñònh vaø coù theå ñöôïc ñoïc ra baèng moät chöông trình vieát baèng phaàn meàm. Ñòa chæ cô baûn cuûa LPT1 ñuùng nhö giaù trò 16 bit ñöôïc caát trong boä nhôù coù ñòa chæ 408H vaø 409H, coøn 40AH vaø 40BH chöùa ñuïng ñòa chæ cô baûn cuûa LPT2. Raõnh caém môû roäng: Raõnh caém môû roäng ôû ñaây laø noùi ñeán caùc Bus ñaõ ñöôïc ñeå saün treân baûn maïch chính. Töø tröôùc ñeán nay ñaõ coù ñeán taùm kieåu Bus môû roäng ñöôïc söû duïng cho maùy tính caù nhaân (gaàn ñaây coù theâm bus AGV). Vieäc phaân loaïi caùc Bus môû roäng thöôøng döïa treân soâ caùc bit döõ lieäu ,aø chuùng xöû lyù ñoàng thôøi. Ñoù laø caùc bus Bus PC(coøn goïi laø ISA 8 bit) Bus EISA(32 bit) Bus VESA Local(32bit) Bus SCSI(16/32bit) Bus ISA(16bit) Bus MCA(32 bit) Bus PCI(32/64 bit) Bus PC/MCA(16 bit) Tuy nhieân, cho tôùi nay, phaàn lôùn caùc card gheùp noái duøng trong kyõ thuaät ño löôøng vaø ñieàu khieån ñeàu ñöôïc cheá taïo theo tieâu chuaån ISA. Raõnh caém theo tieâu chuaån ISA: Thoâng thöôøng raõnh caém coù 62 ñöôøng tín hieäu duøng cho thoâng tin vôùi moät card caém vaøo. veà cô baûn caùc ñöôøng tín hieäu naøy chia thaønh 3 nhoùm ñöôøng tín hieäu, ñöôøng ñòa chæ vaø ñöôøng ñieàu khieån. Raõnh caém 62 chaân: Chöùc naêng Caùc chaân treân card Chöùc naêng Phía maïch in Phía linh kieän GND B01 A01 /IOCHCK RESET DRV B02 A02 SD7 +5V B03 A03 SD6 IRQ2 B04 A04 SD5 -5V B05 A05 SD4 DRQ2 B06 A06 SD3 -12V B07 A07 SD2 DÖÏ TRÖÕ B08 A08 SD1 +12V B09 A09 SD0 GND B10 A10 /OICHRDY /SMEMW B11 A11 AEN /SMEMR B12 A12 A19 /IOW B13 A13 A18 /IOR B14 A14 A17 /DACK3 B15 A15 A16 DRQ3 B16 A16 A15 /DACK1 B17 A17 A14 DRQ1 B18 A18 A13 /DACK0 B19 A19 A12 CLK B20 A20 A11 IRQ7 B21 A21 A10 IRQ6 B22 A22 A9 IRQ5 B23 A23 A8 IRQ4 B24 A24 A7 IRQ3 B25 A25 A6 /DACK2 B26 A26 A5 TC B27 A27 A4 BALE B28 A28 A3 +5V B29 A29 A2 OSC B30 A30 A1 GND B31 A31 A0 Veà sau, maùy tính PC/AT ra ñôøi, chuùng coù theâm moät raõnh thöù hai naèm thaúng haøng vôùi raõnh 8 bit keå treân vaø coù 36 chaân. Treân raõnh coù chöùa tín hieäu 16 bit neân raõnh naøy ñöôïc goïi chung laø raõnh 16 bit. Ngoaøi ra, sau naøy ngöôøi ta coøn cheá taïo theâm caùc raõnh caém töø 32 bit trôû leân. Raõnh naøy duøng ñeå gheùp theâm vaøo nhöõng card coù chaát löôïng cao. Raõnh caém 16 bit bao goàm raõnh caém 8 bit vaø coù theâm moät raõnh caém thöù hai. Sau ñaây laø söï saép xeáp chaân cuûa raõnh caém thöù hai: Raõnh caém 8 bit môû roäng: Chöùc naêng Chaân Phía maïch in Chaân Phía linh kieän Chöùc naêng /MEMCS16 D01 C01 SBHE /IOCS16 D02 C02 LA23 IRQ10 D03 C03 LA22 IRQ11 D04 C04 LA21 IRQ12 D05 C05 LA20 IRQ13 D06 C06 LA19 IRQ14 D07 C07 LA18 /DACK0 D08 C08 LA17 DRQ0 D09 C09 /MEMR /DACK5 D10 C10 /MEMW DRQ5 D11 C11 SD8 /DACK6 D12 C12 SD9 DRQ6 D13 C13 SD10 /DACK7 D14 C14 SD11 DRQ7 D15 C15 SD12 +5V D16 C16 SD13 /MASTER D17 C17 SD14 GND D18 C18 SD15 Chöùc naêng vaø yù nghóa cuûa caùc ñöôøng tín hieäu treân raõnh: A0 ¸ A19 : caùc ñöôøng tín hieäu ñòa chæ, xuaát ñòa chæ vaø ñònh ñòa chæ bus heä thoáng gaùn vaøo thieát bò oâ nhôù vaø I/O, cho pheùp truy caäp 1Mbyte boä nhôù khi BALE ôû möùc cao vaø ñöôïc caøi oû caïnh xuoáng cuûa BALE. Baèng caùch söû duïng caùc leänh xuaát nhaäp, boä xöû lyù coù theå ñònh ñòa chæ 64K ñòa chæ coång I/O. Do caùc ñöôøng töø A10 ¸ A16 khoâng duøng, PC chæ duøng caùc ñöôøng töø A0 ¸ A9 ñeå ñònh vò ñòa chæ coång neân ñòa chæ hôïp leä ñoái vôùi bus heä thoáng cuûa PC laø 300H ¸ 3F1H. LA17 ¸ LA23 : ñöôøng ñòa chæ coù giaù trò khi BALE ôû möùc cao, keát hôïp vôùi caùc ñöôøng dòa chæ A0 ¸ A19 truy caäp 16 Mbyte boä nhôù. RESET DRV : khôûi ñoäng maùy khi baät nguoàn hay nhaán RESET. SD0 ¸ SD15 : caùc ñöôøng döõ lieäu 16 bit, truyeàn 2 chieàu. BALE : Bus Address Latch Enable cho pheùp caøi ñòa chæ. AEN : do DMA phaùt ra duøng ngaên caûn caùc Slave khi DMA dieãn ra. CLK : xung ñoàng hoà (6/8MHz vaø 14.3MHz). ALE : choát ñòa chæ hôïp leä. /IOW : cho pheùp xuaát döõ lieäu ra I/O. /IOR : cho pheùp ñoïc döõ lieäu veà töø I/O. /IOCHCK : kieåm tra loãi xuaát nhaäp (parity). /OCHRDY : baùo keânh I/O saün saøng. /MEMW, /MEMR : ghi vaø ñoïc boä nhôù nhoùm tín hieäu phaân xöû bus. /SMEMW, /SMEMR : ghi vaø ñoïc boä nhôù, taùc ñoäng ôû vuøng nhôù < 1Mb. SBHE : Bus High Enable _ baùo truyeàn döõ lieäu 8 bit cao. DRQ0 ¸ DRQ3 : Direct Memory Access Request _ yeâu caàu DMA DRQ5 ¸ DRQ7 truyeàn döõ lieäu tröïc tieáp vôùi boä nhôù. /DACK : DMA Acknoledge _ khi DRQ yeâu caàu, maùy tính traû lôøi qua /DACK. MASTER : chaân ñieàu khieån ñeå ngoaïi vi chieám tuyeán cuûa CPU. /MEMCS16 : baùo ñang ôû chu kyø truy caäp boä nhôù 16 bit data. /IOCS16 : baùo ñang ôû chu kyø truy caäp ngoaïi vi 16 bit data. TC : ñeám keát thuùc do DMA phaùt ra _ Terminal Count. OSC : boä dao ñoäng duøng cho öùng duïng ñònh thì toång quaùt. IRQ : taïo yeâu caàu ngaét cho CPU. Öu tieân IRQ 9¸ IRQ12, IRQ 14¸ IRQ15, IRQ 3¸ IRQ7. /REFRESH : baùo ñang ôû chu kyø laøm töôi boä nhôù ñoäng. OWS : Zero Wait State _ baùo khoâng caàn theâm chu kyø chôø. Caùc chu kyø bus: Chu kyø ñoïc coång I/O Trong kyø ñoïc coång I/O, caùc ñöôøng /MEMR, /MEMW, /IOW khoâng tích cöïc. Chu kyø ñoïc baèng 4 laàn chu kyø xung CLOCK. Giaûn ñoà thôøi gian: CLOCK ALE A0¸A9 Valid memmory address MEMR MEMW IOR IOW D0¸D7 Valid Data Chu kyø ghi coång I/O: Chu kyø ghi coång I/O baèng 5 laàn chu kyø bit. Giaûn ñoà thôøi gian: CLOCK A0¸A9 Valid port address Valid data to a port IOW D0¸D7 ALE Coång noái tieáp: Gheùp noái tieáp qua coång RS-232 laø moät trong nhöõng kyõ thuaätñöôïc söû duïng roäng raõi nhaát ñeå gheùp noái caùc thieát bò ngoaïi vi vôùi maùy tính. Qua coång noái tieáp coù theå gheùp noái chuoät, moñem, maùy in, boâ bieán ñoåi A/D, caùc thieát bò ño löôøng… Soá löôïng vaø chuûng loaïi caùc thieát bò ngoaïi vi gheùp noá qua coång noái tieáp ñöùng haøng ñaàu trong soá caùc khaû naêng gheùp noái vôùi maùy tính. Em seõ giôùi thieäu cuï theå veà coång noái tieáp ôû chöông sau. CHÖÔNG II: Truyeàn Thoâng Qua Coång Noái Tieáp Vaøi neùt veà nguoàn goác : Sau moät thôøi gian löu haønh khoâng chính thöùc, ñeán naêm 1962, Hieäp hoäi caùc Nhaø Coâng nghieäp Ñieän Töû (EIA: The Electronics Industries Association) ñaõ ban haønh tieâu chuaån RS-232 aùp duïng cho coång noái tieáp. Caùc chöõ RS vieát taét töø Recommended Standard(Tieâu chuaån ñaõ giôùi thieäu) Coù 2 phieân baûn RS-232 ñöôïc löu haønh trong thôøi gian töông ñoái daøi laø RS-232B va RS-232C. Cho ñeán nay chæ coøn RS-232C coøn toàn taïi maø chuùng ta quen goïi laø RS-232. Ngaøy nay, haàu heát caùc maùy tính ñeàu trang bò moät hoaëc hai coång noái tieáp RS-232, vaø taát caû ñeàu coù khaû naêng söû duïng RS-232, ít nhaát laø nhö moät khaû naêng tuøy choïn töø nhaø saûn xuaát maùy tính hoaëc töø phía ngöôøi söû duïng maùy tính. Töø chuaån RS-232 ban ñaàu ñoù cho ñeán nay EIA ñaê phaùt haønh theâm nhieàu chuaån truyeàn thoâng khaùc mang hoï RS nhö RS-422, RS-423, RS-485, caùc giao dieän naøy ñeàu coù nhöõng öu nhöôïc khaùc nhau maø tuøy theo ñieàu kieän saûn xuaát maø coù nhöõng aùp duïng khaùc nhau. Do ñoù taát caû caùc chuaån naøy vaãn toàn taïi song song. II Ñaëc tính giöõa caùc chuaån RS-232C, RS-422, RS-423, RS-485 : 1. Baûng thoâng soá: Thoâng soá RS-232 RS-422 RS-423 RS-485 Cable Length(max) 15m (50ft) 1.2km (4000ft) 1.2km (4000ft) 1.2km (4000ft) Baud Rate (toác ñoä baud) 20Kbps/15m 10Mbps/12m 1Mbps/120m 100Kbps/1.2m 100Kbps/9m 10Kbps/90m 1Kbps/1.2m 10Mbps/12m 1Mbps/120m 100Kbps/1.2km Mode Unbalanced Balance Differential Unbalanced Differential Balance Differential Driver No. 1 1 1 32 Receiver No. 1 10 10 32 Logic 0 +5"+15 +2"+5 +3.6"+6 +1.5"+5 Logic 1 -5"-15 -2"-5 -3.6"-6 -1.5"-5 Communiy 2V 1.8V 3.4V 1.3V Cable/Signal (Caùp /tín hieäu) 1 2 2 2 Methode (Phöông thöùc) Simplex Half-Duplex Full- Duplex Simplex Half-Duplex Full- Duplex Simplex Half-Duplex Full- Duplex Simplex Half-Duplex Full- Duplex Short circuit Current 500mA 150mA 150mA 150mA Chuaån RS-232C : Laø chuaån cuûa EIA ( Electronics Industries Association ) nhaèm ñònh nghóa giao ñieän vaät lyù giöõa DTE ( Data terminal Equipment : thieát bò ñaàu cuoái döõ lieäu ) vaø DCE ( Data Communications Equipment : thieát bò cuoái keânh döõ lieäu ) (ví duï giöõa 1 maùy tính vaø moät modem). Chuaån naøy söû duïng ñaàu noái 25 chaân, tuy nhieân chæ coù 1 soá ít chaân laø caàn thieát cho vieäc lieân keát. Veà phöông dieän ñieän, chuaån naøy quy ñònh möùc logic 1 vaø möùc logic 0 töông öùng vôùi caùc möùc ñieän aùp nhoû hôn –3V vaø lôùn hôn +3V. Toác ñoä ñöôøng truyeàn khoâng vöôït quaù 20Kb/saûn phaåm vôùi khoaûng caùch döôùi 15m. Chuaån RS-232 coù theå chaáp nhaän phöông thöùc truyeàn song coâng (full-duplex). Moät trong nhöõng yeâu caàu quan troïng cuûa RS-232 laø thôøi gian chuyeån töø möùc logic naøy sang möùc logic khaùc khoâng vöôït quaù 4% thôøi gian toàn taïi cuûa 1 bit. Giaû söû vôùi toác ñoä truyeàn 19200 baud thì thôøi gian chuyeån möùc logíc phaûi nhoû hôn 0.04/19200=2.1µs,ñieàu naøy laøm giôùi haïn chieàu daøi ñöôøng truyeàn .Vôùi toác ñoä 19200 baud ta coù truyeàn toái ña 50ft (Gaàn baèng 15.24m). 1 1 0 1 0 0 1 1 Start bit Stop bit D0 D1 D2 D3 D4 D5 D6 D7 +12V -12V Moät trong nhöõng vaán ñeà caàn löu yù khi söû duïng RS-232 laø maïch thu phaùt khoâng caân baèng ( ñôn cöïc, töùc laø ñieän aùp vaøo so vôùi ñaát ). Chuaån RS-489 vaø RS-423A : Vaøo naêm 1978-1979, EIA ñöa ra 2 chuaån giao tieáp môùi ñeå khaéc phuïc caùc nhöôït ñieåm treân cuûa RS-232 laø RS-444 ( caân baèng ) vaø RS-423 (khoâng caân baèng). Söï choïn löïa giöõa truyeàn caân baèng vaø khoâng caân baèng ñöôïc quyeát ñònh bôûi toác ñoä truyeàn tín hieäu. Khi toác ñoä truyeàn vöôït quaù 20Kbps thì haàu heát caùc maïch söû duïng truyeàn caân baèng, ngöôïc laïi ta söû duïng truyeàn khoâng caân baèng. Vôùi chuaån RS-449, toác ñoä truyeàn coù theå treân 20Kbps. Vôùi chuaån RS-423, toác ñoä truyeàn coù theå leân tôùi 100Kbps vaø khoaûng caùch truyeàn leân ñeán 1km. Tieâu chuaån naøy söû duïng caùc IC kích phaùt, thu MC3488 vaø MC3486. Chuaån RS-422A : Moät caûi tieán nöõa cuûa chuaån RS-232 laø chuaån RA-422A. Vôùi chuaån naøy ñoä lôïi ñöôïc gia taêng vaø söû duïng vieäc truyeàn tín hieäu sai bieät ( Differential data ) treân nhöõng ñöôøng truyeàn caân baèng. Moät döõ lieäu sai bieät yeâu caàu hai daây, moät cho döõ lieäu khoâng ñaûo (noninverted ), moät cho döõ lieäu ñaûo( inverted ). Döõ lieäu ñöôïc truyeàn treân ñöôøng daây caân baèng, thöôøng laø caëp daây xoaén vôùi moät ñieän trôû ôû ñaàu cuoái. Moät IC laùi ( Driver ) bieán ñoåi caùc möùc logic thoâng thöôøng thaønh moät caëp tín hieäu sai bieät ñeå truyeàn. Moät boä phaän bieán ñoåi tín hieäu sai bieät ngöôïc laïi thaønh caùc möùc logíc. Döõ lieäu nhaän laø phaàn khaùc nhau giöõa tín hieäu khoâng ñaûo ( A ) vaø tín hieäu ñaûo ( ). Chuù yù raèng khoâng caàn noái ñaát giöõa thieát bò thu vaø thieát bò phaùt. Caùc IC laùi RS-422A haàu heát hoaït ñoäng vôùi ñieän aùp nguoàn +5V nhö caùc chip logic. Vôùi chuaån naøy toác ñoä truyeàn, khoaûng caùch truyeàn ñöôïc caûi thieän raát nhieàu. Chuaån RS-485 : Giao tieáp EIA RS_485 döïa treân chuaån RS-422A , noù laø moät caûi tieán cuûa chuaån naøy. Ñaëc tính ñieän cuûa noù gioáng nhö RS_422A . RS-485 laø chuaån truyeàn vi sai, söû duïng hai daây caân baèng, coù theå ñaït toác ñoä 10Mbps vaø chieàu daøi truyeàn thoâng co._.ù theå leân tôùi 4000 feet (khoaûng 1.2km). Ñieän aùp vi sai ngoõ ra khoaûng +1.5 ñeán +5V neáu laø logic “0” va töø –3V ñeán –1.5V cho möùc logic “1”. Moät söï khaùc bieät quan troïng cuûa RS-485 laø noù cung caáp ñeán 32 drivers. Vaø 32 reicever treân cuøng 1 ñöôøng truyeàn. Ñieàu naøy cho pheùp taïo ra moät maïng cuïc boä. Ñeå coù khaû naêng nhö vaäy thì ngoõ ra cuûa driver RS-485 laø ngoõ ra traïng thaùi. Noù coù theå ôû möùc toång trôû cao ñeå bus khoâng bò chaäp khi coù moät driver truyeàn. Card giao tieáp RS_485 vôùi PC ñöôïc cheá taïo saún vaø söû duïng keát noái DB9 nhö chuaån RS-422A. Treân car coù 1 tín hieäu ñieàu khieån ñeå treo ngoõ ra cuûa driver leân möùc toång trôû cao khi noù nhöôøng ñöôøng truyeàn cho 1 driver khaùc. Thoâng thöôøng ngöôøi ta duøng tín hieäu DTR ñeå laøm vieäc naøy khi ñöôøng tín DTR khoâng ñöôïc duøng ñeå giao tieáp beân ngoaøi. Ñoàng thôøi moät giao thöùc meàm ñöïôc söû duïng ñeå xaùc ñònh ñòa chæ moät driver ñöôïc pheùp truyeàn taïi moät thôøi ñieåm, caùc driver ôû traïng thaùi toång trôû cao. Chuaån RS-485 thöôøng ñöôïc duøng trong maïng coù quan heä Master-Slave. Chæ coù duy nhaát moät traïm laø Master ( boä ñieàu khieån maïng ), coøn nhöõng traïm khaùc laø caùc Slave. Master ñöôïc tryuyeàn baát cöù luùc naøo, noù seõ chæ ñònh moät Slave baát kyø giao tieáp vôùi noù taïi moät thôøi ñieåm. Slave chæ coù theå truyeàn khi nhaän moät leänh thích hôïp töø Master. Moãi Slaver coù moät ñòa chæ treân ñöôøng truyeàn vaø seõ khoâng ñöôïc pheùp truyeàn neáu khoâng ñöôïc Master yeâu caàu. III. Caùc phöông phaùp truyeàn thoâng : 1. Ñôn coâng :( Simplex Communication ) truyeàn thoâng moät chieàu, döõ lieäu chæ coù theå truyeàn theo moät chieàu töø maùy tính tôùi thieát bò ngoaïi vi maø khoâng coù chieàu ngöôïc laïi. â Khoái döõ lieäu Maùy tính Ngoaïi vi 2. Baùn song coâng: ( Full-duplex Communication ) thoâng tin ñöôïc truyeàn theo hai böôùc. Böôùc 1 thoâng tin ñöôïc truyeàn töø maùy tính ñeán ngoaïi vi. Böôùc hai nhaän döõ lieäu töø ngoaïi vi ñeán maùy tính. Cho pheùp truyeàn hai chieàu. Böôùc 1-phaùt â CRC Khoái döõ lieäu ACK/NAK á Maùy tính Böôùc 2-thu Ngoaïi vi 3. Song coâng : (Full-duplex Communication ) phaùt thu ñoàng thôøi. Ñeå thöïc hieän vieäc thoâng tin caàn coù caùc nghi thöùc ñieàu khieån : ACK ( Acknowledge ) tín hieäu baùo xaùc nhaän, maùy thu xaùc nhaän döõ lieäu ñöôïc truyeàn. NAK ( Not Acknowledge ) maùy thu gôûi tín hieäu khoâng xaùc nhaän neáu döõ lieäu sai. CRC ( Cyclic Redundence Check ) kieåm tra dö thöøa chu kyø. Söû duïng caùc thoâng tin thöøa ñeå phaùt hieän vaø söûa loãi. Ví duï duøng ba phaàn töû cuøng thöïc hieän moät chöùc naêng, neáu ñaàu ra cuûa moät phaàn töû khaùc ñaàu ra cuûa hai phaàn töø coøn laïi thì phaùt hieän sai vaø phaûi loaïi boû. RCR Khoái Ack CRC Khoái döõ lieäu Khoái döõ lieäu RCR Khoái Ack CRC Phaùt vaø thu â á Maùy tính Ngoaïi vi Truyeàn thoâng tuaàn töï : Haàu heát caùc maùy tính löu tröõ vaø thao taùc vaø löu tröõ döõ lieäu theo kieåu song song. Nghóa laø khi gôûi 1 byte töø boä phaän naøy tôùi boä phaän khaùc cuûa maùy tính, khoâng phaûi truyeàn tuaàn töï töøng bít maø truyeàn ñoàng thôøi nhieàu bít treân cuøng caùc maïch daây song song. Soá caùc bit gôûi ñi cuøng moät luùc thay ñoåi tuyø theo moãi loaïi maùy tính khaùc nhau nhöng thöôøng laø 8 hoaëc boäi cuûa 8. Vì theá maùy tính laøm vieäc thöôøng nhieàu byte cuøng luùc, ít nhaát laø moät byte. Nhöng truyeàn thoâng töø maùy tính ñeán moät maùy tính khaùc hay thieát bò ngoaïi vi thì ñöôïc laøm tuaàn töï, döõ lieäu ñöôïc gôûi töøng bit. Boä giao tieáp tuaàn töï nhaän nhöõng byte treân nhöõng maïch daây song song vaø gôûi caùc bít ñi moät caùch rieâng bieät. Döõ lieäu treân ñöôøng truyeàn chæ ôû traïng thaùi ñieän theá döông( MARK ) hoaëc ñieän theá aâm ( SPACE ). Baát kyø döõ lieäu ñöôïc truyeàn naøo, tröôùc tieân phaûi chuyeån thaønh 1 daõy thöù töï caùc MARK vaø SPACE, MARK töông öùng vôùi logic 1, SPACE töông öùng vôùi logic 0. Coù hai hình thöùc truyeàn thoâng tuaàn töï Truyeàn thoâng baát ñoàng boä : ( Asynchronous Communication ) Kyù töï ñöôïc truyeàn theo caùc Frame, moãi frame goàm caùc start bit, caùc bít döõ lieäu cuûa kyù töï ñöôïc truyeàn, parity bit ( ñeå kieåm tra loãi ñöôøng truyeàn), stop bit. Xöû lyù truyeàn vaø nhaän döõ lieäu theo phöông thöùc naøy söû duïng caùc vi maïch thu phaùt khoâng ñoàng boä vaïn naêng UART ( Universal Asynchronous Receiver Transmitter ). Nhöôït ñieåm cuûa phöông phaùp naøy laø toác ñoä truyeàn khaù chaäm vì phaûi truyeàn theâm caùc bit start , bit stop, parity. Muoán loaïi boû caùc bit naøy ñeå naâng cao soá bit döõ lieäu ñöôïc truyeàn, ngöôøi ta söû duïng phöông thöùc truyeàn döõ lieäu ñoàng boä (Synchronous ). Chieàu cuûa doøng döõ lieäu Luoân ôû möùc thaáp Luoân ôû möùc cao Start D0 D1 D2 D3 D4 D5 D6 D7 Parity Stop Stop Traïng thaùi noåi Hình veõ treân minh hoïa giao thöùc truyeàn döõ lieäu khoâng ñoàng boä ( Asynchronouns Transmission Protocol). Neáu keânh truyeàn khoâng coù kyù töï naøo ñöôïc truyeàn , noù seõ ôû möùc cao. Khi coù kyù töï ñöôïc truyeàn, keânh truyeàn seõ ñöôïc haï xuoáng möùc thaáp ( Start bit ) ñeå baùo cho phía thu laø coù 1 kyù töï ñöôïc truyeàn tôùi, tieáp ñoù laø caùc bít cuûa kyù töï ( coù theå laø 5,6 ,7 hay 8 bit – trong ví duï treân laø 8 bit ) Ñeå kieåm tra loãi ñöôøng truyeàn ngöôøi ta söû duïng bít chaún leû ( parity bit ), töùc laø kieåm tra chaún leû soá bit 1. Neáu kieåm tra chaún, nghóa laø toång soá bit 1 trong kyù töï ( töø D0 " D7 ) vaø bít chaún leû phaûi chaún. Ngöôïc laïi neáu kieåm tra soá bit 1 trong kyù töï laø leû thì bit chaún leû phaûi leû. Bit stop ñöôïc söû duïng ñeå baùo cho phía thu bieát raèng vieäc truyeàn kyù töï ñaõ keát thuùc. Soá bit stop thöôøng ñöôïc duøng laø 1, 1.5, 2 bit. Nhö vaäy trong phöông phaùp truyeàn baát ñoàng boä, caùc bit döõ lieäu seõ ñöôïc ñoùng khung cuøng vôùi caùc bit start, stop, vaø bit parity taïo thaønh 1 Frame. Truyeàn thoâng ñoàng boä : ( Synchronous communications ) Phöông thöùc truyeàn naøy khoâng duøng caùc bít start, stop ñeå ñoùng khung moãi kyù töï maø cheøn caùc kyù töï ñaëc bieät nhö SYN ( Synchronization ), EOT ( End of Transmission ) hoaëc 1 côø giöõa caùc döõ lieäu cuûa ngöôøi söû duïng ñeå baùo hieäu cho ngöôøi nhaän döõ lieäu bieát raèng döõ lieäu ñaõ hoaëc ñang ñeán. Truyeàn thoâng ñoàng boä thöôøng ñöôïc tieán haønh vôùi toác ñoä 4800bps, 9600bps hoaëc thaäm chí coøn cao hôn. Trong phöông phaùp naøy, moät khi ñaõ ñoàng boä, caùc Modem vaãn tieáp tuïc gôûi kyù töï ñeå duy trì ñoàng boä, ngay caû luùc khoâng phaùt döõ lieäu. Moät kyù töï ‘IDLE’ ñöôïc gôûi ñi khi khoâng coù döõ lieäu phaùt. Phöông phaùp truyeàn ñoàng boä khaùc phöông phaùp truyeàn baát ñoàng boä ôû khoaûng thôøi gian truyeàn giöõa hai kyù töï luoân gioáng nhau. Truyeàn ñoàng boä ñoøi hoûi caùc xung clock trong maùy thu vaø phaùt phaûi duy trì ñoàng boä nhöõng khoaûng thôøi gian daøi. Trong phöông phaùp truyeàn ñoàng boä caùc kyù töï truyeàn seõ ñöôïc keøm theo moät kyù töï ñoàng boä SYN (maõ ASCII laø 22 ). Xöû lyù truyeàn vaø nhaän laø caùc vi maïch USART ( Universal Synchronous Asynchronous Receiver Transmitter ), vi maïch naøy cho pheùp hoaït ñoäng trong caû hai cheá ñoä truyeàn. SOH Header SXT Text EXT BCC Thoâng tin ñieàu khieån döõ lieäu SOH (Start of header ) : Phaàn baét ñaàu cuûa 1 ñôn vò thoâng tin chuaån. SXT ( Start of text ) : Chæ söï keát thuùc cuûa header vaø baét ñaàu phaàn döõ lieäu. EXT (End of text ): kyù töï keát thuùc phaàn döõ lieäu hay vaên baûn. BCC ( Block check character ) : kyù töï kieåm tra khoái. TEXT : thaân döõ lieäu hay vaên baûn. HEADER : phaàn ñaàu. CHÖÔNG III: Vi maïch UART ( Universal Asynchronous Receiver ) 8250A, 16450. I. Ñòa chæ Port vaø IRQ’s: 1. Baûng ñòa chæ PORT tieâu chuaån : trình baøy ôû döôùi : Teân Ñòa chæ IRQ COM 1 3F8H 4 COM 2 2F8H 3 COM 3 3E8H 4 COM4 2E8H 3 ÔÛ treân laø baûng ñòa chæ chuaån. Neáu coù vaán ñeà veà thu phaùt khi söû ñòa chæ caùc coång Com treân chuùng ta coù theå xem töø vuøng heä thoáng BIOS . 2. Baûng ñòa chæ coång Com trong vuøng döõ lieäu BIOS : trình baøy ôû döôùi. Ñòa chæ Chöùc naêng 0000:0400 Ñòa chæ neàn cuûa Com 1 0000:0402 Ñòa chæ neàn cua Com 2 0000:0404 Ñòa chæ neàn cua Com 3 0000:0406 Ñòa chæ neàn cua Com 4 Baûng treân trình baøy cuûa coång Com maø chuùng ta coù theå tìm thaáy trong vuøng döõ lieäu BIOS cuûa PC. Moãi ñòa chæ goàm hai Byte. II. Toång quan : Vi maïch 8250A ( hoaëc 16450 ) cuûa Intel laø moät UART ñöôïc duøng raát roäng raõi trong caùc PC. UART 8250A coù caùc chöùc naêng chính nhö sau: Bieán ñoåi döõ lieäu song song töø CPU thaønh daïng noái tieáp ñeå truyeàn ñi, ñoàng thôøi thu doøng döõ lieäu noái tieáp vaø ñoåi chuùng thaønh caùc kyù töï song song. Sau ñoù gôûi ñeán vi xöû lyù (µp). Theâm caùc bit Start, stop, parity vaøo töøng kyù töï tröôùc khi phaùt ñi vaø taùch caùc bit naøy ra khoûi kyù töï nhaän ñöôïc. Baûo ñaõm caùc bit kyø töï truyeàn ñi vôùi toác ñoä ñöôïc laäp trình tröôùc, kieåm tra ñeå phaùt hieän loãi töông öùng : loãi kyù töï, loãi parity. Set tín hieäu baét tay phaàn cöùng thích hôïp vaø cho bieát traïng thaùi cuûa tín hieäu. 1. Caùc thanh ghi cuûa UART : Caùc thanh ghi ñieàu khieån chính (Control Register : CR ) nhaän ñöôïc leänh töø CPU. Thanh ghi ñieàu khieån ñöôøng truyeàn ( Line Control Register : LCR ): duøng ñeå ñaët caùc thoâng soá truyeàn . Thanh ghi ñieàu khieån Modem ( Mode Control Register : MCR ) : ñieàu khieån tín hieäu baét tay gôûi töø UART. Thanh ghi cho pheùp ngaét ( Interrupt Enable Register : IER ) : Thanh ghi traïng thaùi ( Status Register : SR ) : thoâng baùo cho CPU bieát hoaït ñoäng cuûa UART. Thanh ghi traïng thaùi ñöôøng truyeàn ( Line Status Register : LSR ) : chöùa thoâng tin veà truy xuaát döõ lieäu. Thanh ghi traïng thaùi Modem ( Modem Status Register : MSR ) : chöùa thoâng tin veà traïng thaùi cuûa nhöõng ñöôøng baét tay. Thanh ghi ñònh danh ngaét ( Interrupt Identification Register : IIR ) : chöùa thoâng tin veà traïng thaùi hieän taïi cuûa ngaét gôûi ñeán. Thanh ghi ñeäm ( Buffer Register : BR ) : phuïc vuï cho vieäc trao ñoåi döõ lieäu. Thanh ghi giöõ phaùt ( Transmitter Holding Register : THR ) : giöõ döõ lieäu keá tieáp tröôùc khi phaùt ñi. Thanh ghi ñeäm thu ( Receiver Buffer Register : RBR ) : giöõ kí töï thu ñöôïc sau cuøng. ÔÛ baûng döôùi ñòa chæ neàn coù theå laø ( 2F8H, 3F8H, 2E8H, 3E8H ) tuyø theo caùch choïn cuûa ngöôøi laäp trình. Ñòa chæ neàn DLAB A2 A1 A0 Choïn ra +0 0 0 0 0 Thanh ghi ñeäm thu (RBR ), thanh ghi giöõ phaùt (THR) +1 0 0 0 1 Thanh ghi cho pheùp taïo yeâu caàu ngaét (IER). +0 1 0 0 0 Thanh ghi cho soá chia phaàn thaáp (LSB). +1 1 0 0 1 Thanh ghi cho soá chia phaàn cao (MSB). +2 X 0 1 0 Thanh ghi nhaän daïng nguoàn goác yeâu caàu ngaét(IIR). +3 X 0 1 1 Thanh ghi ñieàu khieån ñöôøng daây (LCR ). +4 X 1 0 0 Thanh ghi ñieàu khieån Modem (MCR ). +5 X 1 0 1 Thanh ghi traïng thaùi ñöôøng daây(LSR ). +6 X 1 1 0 Thanh ghi traïng thaùi Modem ( MSR ). +7 0 1 1 1 Thanh ghi nhaùp (daønh cho CPU, ít khi söû duïng ). Trong baûng treân baïn phaûi chuù yù coät DLAB . Khi DLAB ñaët leân ‘0’ hoaëc’1’ thì moät vaøi thanh ghi seõ thay ñoåi. Coù theå thaáy nhö theá naøy, UART cho pheùp 12 thanh ghi, trong khi ñoù chæ coù 8 port ñòa chæ. DLAB duøng truy caäp bit choát chia, khi DLAB ñaët leân’1’ trong thanh ghi ñieàu khieån ñöôøng truyeàn (bit thöù 7 cuøa thanh ghi naøy), thì hai thanh ghi trôû neân coù giaù trò ( Divisor Latch Low Byte : ‘Reg+0’, Divisor Latch High Byte : ‘Reg +1’ ), sau ñoù chuùng ta duøng hai thanh ghi naøy duøng cho vieäc ñaët toác ñoä truyeàn thoâng. Ví duï nhö sau : Toác ñoä ( Baud ) Divisor Byte choát chia cao(DLHB) Byte choát chia thaáp(DLLB) 50 2304 09H 00H 300 384 01H 80H 600 192 00H C0H 2400 48 00H 30H 4800 24 00H 18H 9600 12 00H 0CH 19200 6 00H 06H 38400 3 00H 03H 57600 2 00H 02H 115200 1 00H 01H 3. Vi maïch 8250A ñöôïc theå hieän treân hình veõ ôû döôùi: Vi maïch 8250A coù 3 tín hieäu choïn chip ñeå taïo ñieàu kieän thuaän lôïi cho ngöôøi söû duïng trong vieäc giaûi maõ ñòa chæ cô baûn. Caùc chaân ñòa chæ cô baûn A1, A2, A0, giuùp ta choïn caùc thanh ghi beân trong cuûa UART ( xem baûng ôû döôùi) Master Ñeäm bus döõ lieäu Logic ñieàu khieån ghi ñoïc A2 CS2 A0 A1 A0 CS1 Ñeäm phaùt Ñieàu khieån Thu Phaùt Vaø modem Ñeäm thu Xtal RxClk RLSD RI INTRPT D0…D7 Baûng choïn thanh ghi trong vi maïch 8250A. X-tal laø caùc chaân ñeå caém thaïch anh duøng cho maïch dao ñoäng beân trong cuûa 8250A. Trong tröôøng hôïp söû duïng tín hieäu ñoàng hoà chuaån töø beân ngoaøi thì ta ñöa xung ñoàng hoà vaøo chaân X-tal vaø boû löûng chaân X-tal. Chaân RLSD ( receiver line signal detect ) chính laø chaân tìm thaáy soùng mang ( hoaëc cho tieâu chuaån RS-232C hoaëc Syndet cuûa 8251A ), töùc laø thieát laäp ñöôïc ñöôøng truyeàn. Tín hieäu ( Ring indicator ), cuõng laø tín hieäu chuaån cuûa RS-232C, ñeå modem thoâng baùo laø coù xung reùo chuoâng. Tín hieäu INTRPT laø tín hieäu yeâu caàu ngaét CPU. Caùc ñaàu ra phuï vaø daønh cho ngöôøi söû duïng trong trong tröôøng hôïp khoâng töông thích vôùi chuaån RS-232C. Chaân MS (Master reset) laø choã noái vaøo cuûa tín hieäu reset cuûa heä thoáng coù taùc duïng xoùa taát caû caùc thanh ghi trong vi maïch 8250A, tröø thanh ghi ñeäm thu, thanh ghi ñeäm phaùt vaø caùc thanh ghi MSB vaø LSB cuûa soá chia. Toác ñoä truyeàn ñöôïc tính nhôø vaøo vieäc choïn xung ñoàng hoà vaøo X-tal vaø vieäc choïn soá chia cuûa taàn soá naøy( ñeå taïi thanh ghi MSB vaø LSB ). Ví duï, neáu ta duøng taàn soá 1.8432 Mhz taïi X-tal, ta muoán toác ñoä phaùt laø 9600 baud ta tìm soá chia ñeå ghi vaøo LSB vaø MSB nhö sau : Soá chia = taàn soá vaøo /( toác ñoä phaùt x 16) = 1.8432x10 /(9600x16) =12. Thanh ghi ñieàu khieån ñöôøng truyeàn : (Line control register : LCR ) Thanh ghi naøy coù teân laø thanh ghi ñònh daïng döõ lieäu vì noù quyeát ñònh khuoân daïng döõ lieäu cuûa truyeàn thoâng treân ñöôøng daây. Daïng thöùc cuûa thanh ghi LCR ñöôïc bieåu dieãn nhö hình ôû döôùi : D7 D6 D5 D4 D3 D2 D1 D0 Bit ñieàu khieån giaùn ñoaïn. 1: buoäc Soun=0. 0:khoâng hoaït ñoäng. Bit truy caäp soá 1: truy nhaäp soá chia. 0: Truy nhaäp IER,THR ,RBR 1 : ñaûo parity. 0: khoâng hoaït ñoäng Kieåm tra chaún leû. 1: parity chaún. 0: parity leû. Soá bit stop. 0: 1bit. 1:1.5 bit 2 bit Choïn ñoä daøi töø. 00: 5bit 01: 6bit. 10: 7 bit. 11: 8bit Cho pheùp taïo, kieåm tra parity. 1: cho pheùp. 0: caám. DLAB SBCB SP EPS PEN STB WSL1 WSL0 Trong thanh ghi ñieàu khieån ñöôøng truyeàn LCR caàn chuù yù ñeán vaán ñeà sau : vieäc quy ñònh soá bit stop khoâng chæ phuï thuoäc vaøo bit D2 maø coøn phuï thuoäc vaøo maõ choïn ñoä daøi kyù töï. Cuï theå laø : neáu D2=1 maø maõ naøy laø 00( D1D0 )thì seõ taïo /kieåm tra 1.5 bit stop, neáu maõ naøy laø 6, 7, 8 bit thì seõ taïo / kieåm tra 2 bit stop. Thanh ghi ñeäm phaùt : (Transmitter holding register : THR) Kyù töï caàn phaùt ñi phaûi ñöôïc ghi töø CPU vaøo thanh ghi naøy tröôùc khi phaùt ñi trong khi bit DLAB=0. Sau ñoù , khi truyeàn ñi 8255A laáy döõ lieäu töø thanh ghi naøy, ñoùng khung noù nhö ñaõ ñònh, sau ñoù laàn löôït ñöa töøng bít ra coång. Thanh ghi ñeäm thu (Receiver buffer register : RBR ) : Khi 8250A nhaän ñöôïc 1 kyù töï qua chaân , noù thaùo boû khung kyù töï vaø giöõ kyù töï taïi thanh ghi ñeäm thu ñeå CPU ñoïc, CPU chæ ñoïc kyù töï naøy khi bit DLAB=0. Thanh ghi cho pheùp taïo yeâu caàu ngaét( Interrupt enable register : IER ): thanh ghi naøy duøng ñeå cho pheùp hay caám ngaét. Trong khi maïch 8250A hoaït ñoäng, coù theå taùc ñoäng ñeán CPU thoâng qua chaân INTRPT cuûa UART. Moãi bit trong caùc bit D3, D2, D1, D0 ôû möùc cao seõ cho pheùp caùc traïng thaùi öùng vôùi bit ñoù ñöa ra yeâu caàu ngaét ñoái vôùi CPU. Bieåu dieãn thanh ghi IER ôû hình döôùi : 0 0 0 0 Modem Rline Txemty RXRDY 1:Cho pheùp thay ñoåi traïng thaùi cuûa modem gaây ngaét 1: cho pheùp ngaét khi ñeäm giöõ phaùt roãng. 1: cho pheùp gaây ngaét khi ñeäm thu ñaày. D7 D6 D5 D4 D3 D2 D1 D0 1: Cho pheùp caùc tín hieäu traïng thaùi ñöôøng daây thu ngaét. Thanh ghi nhaän daïng nguoàn yeâu caàu ngaét: (Interrupt Identification Register : IIR ): Thanh ghi nhaän daïng ngaét chæ duøng ñeå ñoïc, chöùa maõ öu tieân cao nhaát cuûa yeâu caàu ngaét ( taïi chaân INTRPT cuûa 8250A ) ñang chôø ñöôïc phuïc vuï. Do ñoù khi caàn xöû lyù caùc yeâu caàu ngaét theo kieåu thaêm doø, CPU chæ caàn ñoïc bit 0 cuûa thanh ghi naøy ñeå bieát laø coù yeâu caàu ngaét, vaø caàn xeùt caùc bit ( Bit 1, bit 2 ) ñeå xaùc ñònh nguoàn goác cuûa yeâu caàu ngaét. Thöù töï öu tieân ngaét töø thaáp ñeán cao theo thöù töï töø treân xuoáng döôùi theo baûng ôû döôùi : Bit Ghi chuù Bit 6:7 Bit 6 Bit 7 Cho traïng thaùi boä ñeäm vaøo tröôùc ra tröôùc. 0 0 Khoâng vaøo tröôùc ra tröôùc. 0 1 Cho pheùp vaøo tröôùc ra tröôùc nhöng khoâng duøng. 1 1 Cho pheùp vaøo tröôùc ra tröôùc . Bit 5 Cho pheùp vaøo tröôùc ra tröôùc 64 byte ( chæ 16750). Bit 4 Bit 3 0 1 Bit 1: 2 Bit 2 Bit 1 0 0 Ngaét traïng thaùi modem. 0 1 Ngaét khi ñeäm giöõ phaùt roãng. 1 0 Ñeäm thu ñaày. 1 1 Ngaét traïng thaùi ñöôøng truyeàn thu. Bit 0 0 Coù yeâu caàu ngaét . 1 Khoâng coù. Thanh ghi ñieàu khieån Modem: ( Modem control register : MCR ) : Thanh ghi ñieàu khieån modem laø thanh ghi ñoïc ghi. Thanh ghi coøn ñöôïc goïi laø thanh ghi ñieàu khieån caùc tín hieäu ra cuûa modem bôûi vì noù cho pheùp ta ñieàu khieån caùc tín hieäu taïi caùc chaân vaø cuûa maïch UART. Daïng thöùc cuûa noù ñöôïc bieåu ñieãn nhö sau: Bit Ghi chuù Bit 7 Reserved Bit 6 Reserved Bit 5 Cho pheùp ñieàu khieån töï ñoäng traøn (chæ 16750). Bit 4 Noái voøng cuïc boä 1: noái voøng 0: bình thöôøng Bit 3 OUT 2 Bit 2 OUT 1 Bit 1 RST( force reques to send) 1: ñöa =0. 0: ñöa =1. Bit 0 DTR (Force Data Terminal Ready). 1: ñöa DTR=1. 0: ñöa =0. Vôùi bit 0 ta coù theå ñieàu khieån tín hieäu taïi chaân cuûa 8250A ñaït möùc tích cöïc thaáp ñeå baùo cho UART saún saøng laøm vieäc. Vôùi bit 1 ôû möùc thaáp thì 8255A seõ baùo cho UART saún saøng phaùt kyù töï. Baèng bit 2, bit 1 cuûa thanh ghi MCR chuùng ta coù theå ñieàu khieån chaân vaø tích cöïc hay khoâng tích cöïc. Bit 4 cuûa thanh ghi MCR cho pheùp maïch 8250A laøm vieäc ôû cheá ñoä noái voøng cuïc boä ñeå kieåm tra chöùc naêng cuûa UART. Caùc chaân ñieàu khieån vaøo cuûa modem (, ,, ) khoâng ñöôïc noái ra ngoaøi maø ñöôïc noái beân trong maïch vôùi caùc chaân ñieàu khieån ra cuûa modem( , , , ). Thanh ghi traïng thaùi ñöôøng daây ( Line Status Register : LSR ) : Thanh ghi naøy laø thanh ghi chæ ñoïc, cho bieát traïng thaùi cuûa vieäc truyeàn tín hieäu treân ñöôøng daây nhö theá naøo. Daïng thöùc cuûa thanh ghi naøy bieåu dieãn nhö ôû baûng döôùi : Bit Ghi chuù Bit 7 Loãi trong quaù trình thu FIFO ( Error in Receiver FIFO ). Bit 6 Thanh ghi dòch phaùt roãng ( Empty Data Holding Register ). Bit 5 Thanh ghi giöõ phaùt roãng ( Empty Transmitter Holding Register ). Bit 4 Break Interrupt Bit 3 Loãi khung( Framing error). Bit 2 Loãi parity( parity error). Bit 1 Loãi do ñeø thu (Overrun error) Bit 0 Döõ lieäu saún saøng ( data Ready ). Khi bit 6 set leân (möùc 1 ) thì caû hai thanh ghi truyeàn phaùt ( Transmitter holding register ) vaø thanh ghi dòch (shift register ) ñeàu roãng . Trong khi ñoù khi bit 5 set leân thì chæ coù thanh ghi giöõ phaùt laø troáng ( transmitter holding register ). Vaäy ñaâu laø söï khaùc nhau giöõa chuùng. Khi bit 6 set leân thì thanh giöõ phaùt roãng, ñöôøng truyeàn khoâng tích cöïc. Coøn khi bit 5 set leân thì thanh ghi truyeàn phaùt roãng nhöng bieán ñoåi noái tieáp duøng thanh ghi dòch coù theå ñang laøm vieäc. Bit 4= 1, xaûy ra khi tín hieäu ôû ñaàu vaøo cuûa phaàn thu giöõ möùc logic 0 laâu hôn thôøi gian daønh cho 1 kyù töï, bit naøy bò xoaù khi CPU ñoïc thanh ghi LSR. Bit 3 : Bit 2=1, khi coù loãi parity, bit naøy ñöôïc xoaù khi CPU ñoïc thanh ghi LSR. Bit 1=1, khi thu khoâng ñuû nhanh ( loãi thu ñeø), bit naøy ñöôïc xoaù khi CPU ñoïc thanh ghi LSR. Bit 0 =1, khi ñaõ nhaän ñöôïc 1 kyù töï vaø ñeå noù trong thanh ghi ñeäm (RBR), bit naøy ñöôïc xoaù khi CPU ñoïc thanh ghi RBR. Thanh ghi traïng thaùi modem ( Modem Status Register : MSR) : Thanh ghi naøy coøn ñöôïc goïi laø thanh ghi traïng thaí vaøo töø trang thía RS-232C vì noù cho bieát traïng thaùi hieän thôøi cuûa caùc tín hieäu ñieàu khieån modem töø ñöôøng daây. CHÖÔNG V: Giao Tieáp Maùy Tính Vôùi Vi Xöû Lyù. I. Truyeàn nhaän qua coång noái tieáp : Vieäc truyeàn nhaän qua coång noái tieáp ñöôïc thöïc hieän bôûi UART. Nguyeân taéc cho chip UART hoaït ñoäng nhö sau: Ñeå truyeàn ñi moät kyù töï, ñaàu tieân kyù töï ñoù seõ ñöôïc ñöa vaøo thanh ghi ñôïi truyeàn ( Transmit Holding Register ), sau ñoù ñöôïc ñöa qua thanh ghi dòch cuûa boä phaùt ( transmit Shift Register ). Sau khi kyù töï tröôùc ñaõ truyeàn xong, töøng bit cuûa kyù töï ñöôcï truyeàn seõ dòch vaøo keânh döõ lieäu. Khi nhaän moät kyù töï, ñaàu tieân caùc bit cuûa noù laàn löôït ñöôïc naïp vaøo thanh ghi dòch cuûa boä thu ( Transmit Shift Register), sau ñoù chuùng ñöôïc ñöa vaøo thanh ghi döõ lieäu cuûa boä thu ( Receive Data Register ) sau khi ñaõ loaïi boû caùc bit start, stop, parity. Ñeå thöïc hieän vieäc truyeàn döõ lieäu qua coång noái tieáp ta phaûi thöïc hieän caùc böôùc sau: Choïn coång truyeàn Com 1, hay Com 2. Ñòa chæ cuûa Com 1 thöôøng laø 3F8H, coøn Com 2 laø 2E8H. Ñoái vôùi moät soá loaïi maùy tính thì ñòa chæ cuûa coång Com coù theå vaøo BIOS ñeå set leân, neân khi vieát chöông trình truyeàn caàn vaøo BIOS ñeå xem ñòa chæ coång Com cuï theå. Neáu ta choïn COM 1 laø 3F8 H, Com 2 laø 2F8 H thì ñòa chæ caùc thanh ghi khaùc laø: Thanh ghi Ñòa chæ Com 1 Ñòa chæ Com 2 Data register 3F8H 2F8H Interrupt enable register 3F9H 2F9H Interrupt identification register 3FAH 2FAH Line control register 3FBH 2FBH Modem control register 3FCH 2FCH Line status register 3FDH 2FDH Modem control register 3FEH 2FEH Ñaët toác ñoä baud Ñaët caáu hình truyeàn : data bit, stop bit, parity (em choïn 8 bit data, 1 bit stop, khoâng coù parity). Cho pheùp ngaét neáu söû duïng. Ñeå thöïc hieän vieäc truyeàn döõ lieäu tröôùc heát chuùng ta phaûi khôûi ñoäng coång COM, sau ñoù thöïc hieän vieäc truyeàn phaùt vôùi chöông trình truyeàn vaø phaùt trình baøy ôû döôùi ñaây döôïc vieát theo kieåu API: Chöông trình khôûi ñoäng coång COM: Choïn Com 2 vôùi ñia chæ 2F8H ñeå thöïc hieän vieäc truyeàn döõ lieäu. Caàn chuù yù ñeán Bit DLAB. (………………………………………………………………………….) const pathsl ='c:\my documents\delphi\'; com2=$2F8; Reg2F8=com2+0; Reg2F9=com2+1; Reg2FA=com2+2; Reg2FB=com2+3; Reg2FC=com2+4; Reg2FD=com2+5; (………………………………………………………………………….) procedure Tform2.Initcom; begin xuat(Reg2FB,$80);{DLAP=1} xuat(Reg2F8,$30);{baudrate=2400} xuat(Reg2F9,$00);{khong su dung ngat} xuat(Reg2FB,$03);{8 bit data, 1 bit stop, no parity} end; (………………………………………………………………………….) Nhaäp döõ lieäu vôùi haøm nhaäp vieát baèng pascal. (………………………………………………………………………….) function Tform2.nhap(addr:word):byte; var TEMP : byte; begin asm PUSH Ax PUSH DX MOV DX,addr IN AL,DX MOV TEMP,AL POP AX POP Dx end; (………………………………………………………………………….) Xuaát döõ lieäu vôùi haøm xuat: (………………………………………………………………………….) procedure Tform2.xuat(addr:word;data:byte); begin asm PUSH AX PUSH DX MOV DX,addr MOV AL,DATA OUT DX,AL POP AX POP DX end; end; (………………………………………………………………………….) Trong vieäc truyeàn döõ lieäu neáu söû duïng caùc tín hieäu RTS, CTS … thì chuùng ta caàn phaûi vieát chöông trình cho chuùng . Trong vieäc truyeàn tín hieäu cho ñeà taøi cuûa em coù söû duïng tín hieäu RTS, ñöôïc vieát nhö sau: (………………………………………………………………………….) procedure Tform2.setRTS; var a: byte; begin a:=nhap(Reg2FC); a:=a or $02; xuat(Reg2FC,a); end; procedure Tform2.RESETRTS; var a : byte; begin a:=nhap(Reg2FC); a:=a and $FD; xuat(Reg2FC,a); end; (………………………………………………………………………….) Coù hai phöông phaùp ñeå ñieåu khieån vieäc thu phaùt döõ lieäu qua UART: phöông phaùp hoûi voøng vaø phöông phaùp taïo ra moät trình ñieàu khieån taïo ngaét. Phöông phaùp hoûi voøng chôø döõ lieäu nhaän xong hoaëc phaùt xong, toác ñoä chaäm khoaûng 34.8 Kbps. Phaùt kyù töï: Vôùi phöông phaùp hoûi voøng, khi gôûi ñi 1 kyù töï ta phaûi kieåm tra xem thanh ghi ñôïi truyeàn coù roãng hay khoâng baèng caùch xem Bit 6 cuûa thanh ghi LSR ( Line Status Register ) coù baèng moät hay khoâng. Chöông trình vieát cuï theå baèng Delphi 5.0 nhö sau: (…………………………………………………………) repeat test3:=nhap(Reg2FD); application.ProcessMessages; until (test3 and $40)=$40; xuat(Reg2F8,t); (…………………………………………………………) Ñeå thu moät kyù töï : Ñeå bieát coù kyù töï vaøo hay chöa kieåm bit 0 cuûa thanh ghi LSR ( Line Status Register ). Neáu baèng ‘1’ thì coù moät kyù töï nhaän vaøo. Vôùi chöông trình cuï theå vieát nhö sau: (………………………………………………………………………….) repeat begin test6:=nhap(Reg2FD); test6:=test6 and $01; end; until (test6=$01); (………………………………………………………………………….) Tuy nhieân ta coù theå söû duïng nhuõng caùch khaùc ñeå thöïc hieän vieäc truyeàn döõ lieäu vôùi phöông phaùp ñôn giaûn hôn veà giaûi thuaät. Sau ñaây laø moät phöông phaùp coù theå söû duïng maø em tham khaûo ñöôïc trong giaùo trình Laäp trình gheùp noái maùy tính trong Windows cuûa taùc giaû Ngoâ Dieân Taäp Ñeå thöïc hieän vieäc môû coång Com ta chæ vieäc goõ moät leänh ñôn giaûn laø OpenCom(pchar(‘coøm:9600,N,8,1’)); Ñeå truyeàn döõ lieäu ñi: SendByte(); Ñeå nhaän döõ lieäu veà: Temp:=ReadByte; Xuaát tröïc tieáp ra caùc ñöôøng daãn DTR(); RTS(); … Deå thöïc hieän ñöôïc nhuõng leänh treân trong Delphi chuùng ta phaûi coù moät teäp tin taøi nguyeân hoã trôï coù teân laø port.dll do taùc giaû cung caáp. Sau ñoù ta phaûi soaïn moät unit (ñöôïc chæ daãn raát roõ trong giaùo trình) ñeå giuùp Delphi nhaän ra ñöôïc taøi nguyeân naøy. Hôi raéc roái moät tyù nhöng maø buø laïi ta seõ gaëp raát nhieàu thuaän lôïi trong laäp trình. Trong luaän vaên naøy, em söû duïng moät phöông phaùp khaùc ñoù laø duøng MSComm. Phöông phaùp naøy laäp trình raát ñôn giaûn vaø hoã trôï raát maïnh vaø ñöôïc nhieàu ngöôøi söû duïng. Trong Visual Basic MSComm ñaõ ñöôïc nhaø laäp trình cung caáp saün. Coøn trong Delphi muoán söû duïng thì ta phaûi” duøng keù” taøi nguyeân naøy cuûa VB baèng caùch copy teâp tin “mscom.ocs” vaøo trong system cuûa Window sau ñoù vaøo Component cuûa Delphi ñeå khai baùo. Veà phöông phaùp khai baùo vaø söû duïng seõ ñöôc trình baøy cuï theå ôû trong phaàn phuï luïc cuûa em. II. Caùc phöông phaùp keát noái : 1. Keát noái maùy tính vôùi moät Kit vi xöû lyù: Khi maùy tính giao tieáp vôùi moät kít vi xöû lyù thì ta chæ duøng RS-232 laø ñuû , vì noù cho pheùp chuyeån ñoåi töø +12V ñeán +5V phuø hôïp vôùi nguoàn cung caáp cho kit vi xöû lyù. Nhöng ñieåm haïn cheá cuûa phöông phaùp naøy laø khoaûng caùch truyeàn ngaén , toái ña chæ 15 m. Bieåu dieãn giao tieáp ôû hình döôùi : Kit vi xöû lyù RS-232 2. Keát noái maùy tính vôùi N (toái ña N=32) kít vi xöû lyù : Ñeå keát noái maùy tính vôùi nhieàu vi xöû lyù chuùng ta phaûi thöïc hieän caùc böôùc chuyeån ñoåi sau : Chuyeån ñoåi töø chuaån RS-232 sang RS-485 ñeå coù theå truyeàn tín hieäu treân khoaûng caùch lôùn khoaûng 1.2km. Chuyeån ñoåi töø RS-485 sang RS-485 sang TTL ñeå phuø hôïp vôùi aùp vaøo cuûa vi xöû lyù. Möùc ñieän aùp: RS-232 truyeàn theo kieåu khoâng caân baèng ( aùp leäch so vôùi ñaát ). RS-485 truyeàn theo kieåu caân baèng ( ñieän aùp sai leäch giöõa hai daây). RS-232 : -3V Ø -12V : möùc logic 1. +3VØ +12V :möùc logic 0. RS-485 : VA –Vb = -1.5V Ø-5V : möùc logic 1. VA –VB= +1.5VØ+5V : möùc logic 0. Hình veõ minh hoïa : Kít vi xöû lyø Kít vi xöû lyù RS232/RS485 RS-485 RS-485 CHÖÔNG VI : Chuaån RS-485 Giôùi thieäu: Khi heä thoáng caàn truyeàn moät khoái thoâng tin nhoû ôû khoaûng caùch xa, thoâng thöôøng ngöôøi ta choïn RS-485 Maïng söû duïng chuaån RS-485 raát ña daïng: ta coù theå giao tieáp giöõa PC vôùi nhau, hoaëc giöõa PC vôùi Vi Xöû Lyù , hoaëc baát kyø thieát bò naøo truyeàn thoâng noái tieáp baát ñoàng boä. Khi so saùnh vôùi Ethernet vaø nhöõng giao dieän truyeàn thoâng theo nhöõng chuaån khaùc thì giao dieän RS-485 ñôn giaûn vaø giaù thaønh thaáp hôn nhieàu. Theo nhaän ñònh cuûa em ( ñoái vôùi truyeàn khoái döõ lieäu nhoû ) thì chuaån RS-485 raát linh ñoäng. Ta coù theå choïn soá löôïng boä ñieàu khieån ( Master ), boä nhaän ( Slave ), chieàu daøi caùp, toác ñoä truyeàn, soá node caàn giao tieáp, vaø raát tieát kieäm naêng löôïng Moät soá ñaët ñieåm cuûa RS-485: Giaù thaønh thaáp: Caùc boä ñieàu khieån ( Driver ) vaø boä nhaän ( Receiver ) khoâng ñaét vaø chæ yeâu caàu cung caáp nguoàn ñôn +5V ñeå taïo ra möùc ñieän aùp vi sai toái thieåu 1.5V ôû ngoû ra vi sai. Khaû naêng veà maïng: RS-485 laø moät giao dieän ña ñieåm ( multi-drop ), noù coù theå coù nhieàu Driver vaø Receiver, soá Receiver coù theå leân ñeán 256 neáu ngoõ vaøo cuûa caùc Receiver coù trôû khaùng vaøo cao Khaû naêng keát noái: RS-485 coù theå truyeàn xa 1200m, toác ñoä leân ñeán 10Mbps. Nhöng 2 thoâng soá naøy khoâng xaûy ra cuøng luùc. Khi toác ñoä truyeàn taêng thì toác ñoä baud giaûm xuoáng. Ví duï: khi toác ñoä laø 90Kbps thì khoaûng caùch laø 1200m, 1Mbps thì khoaûng caùch laø 120m, coøn vôùi toác ñoä 10Mbps thì khoaûng caùch chæ coøn 15m. Giaûi thích moät soá ñaëc tính RS-485 : Caùc ñöôøng truyeàn caân baèng vaø khoâng caân baèng: Sôû dæ RS-485 coù theå truyeàn treân moät khoaûng caùch lôùn laø do chuùng söû duïng ñöôøng truyeàn caân baèng. Moãi moät tín hieäu seõ truyeàn treân moät caëp daây, vôùi möùc ñieän aùp treân moät daây laø aâm hoaëc ñieän aùp buø treân daây kia. Receiver seõ ñaùp öùng phaàn hieäu giöõa caùc möùc ñieän aùp, ñöôïc minh hoaï ôû hình döôùi: Hình: Ñöôøng truyeàn caân baèng Hình: Ñöôøng truyeàn khoâng ._.BF9 941 DJNZ R3,BACK3 089D D0E0 942 POP ACC 089F 22 943 RET 08A0 74FE 944 Q_PHIM: MOV A,#0FEH 08A2 7C08 945 MOV R4,#8 08A4 F590 946 TEST: MOV P1,A 08A6 FF 947 MOV R7,A 08A7 E5A0 948 MOV A,P2 08A9 543F 949 ANL A,#3FH 08AB B43F07 950 CJNE A,#3FH,KEYHIT 08AE EF 951 MOV A,R7 08AF 23 952 RL A 08B0 DCF2 953 DJNZ R4,TEST 08B2 C3 954 CLR C 08B3 801A 955 SJMP EXIT 08B5 C0E0 956 KEYHIT: PUSH ACC 08B7 7408 957 MOV A,#8 08B9 C3 958 CLR C 08BA 9C 959 SUBB A,R4;8 08BB FC 960 MOV R4,A 08BC D0E0 961 POP ACC 08BE 7D06 962 MOV R5,#6 08C0 13 963 AGAIN: RRC A 08C1 500A 964 JNC DONE 08C3 0C 965 INC R4 08C4 0C 966 INC R4 08C5 0C 967 INC R4 08C6 0C 968 INC R4 08C7 0C 969 INC R4 08C8 0C 970 INC R4 08C9 0C 971 INC R4 08CA 0C 972 INC R4 08CB DDF3 973 DJNZ R5,AGAIN 08CD D3 974 DONE: SETB C 08CE EC 975 MOV A,R4 08CF 22 976 EXIT: RET 977 ;------------------------------------------------- 978 LED7SEG_TABLE: 08D0 C0 979 DB 0C0H,0F9H,0A4H,0B0H,99H 08D1 F9 08D2 A4 08D3 B0 08D4 99 08D5 92 980 DB 92H,82H,0F8H,80H,90H,0BFH 08D6 82 MCS-51 MACRO ASSEMBLER VD 01/11/:2 PAGE 19 LOC OBJ LINE SOURCE 08D7 F8 08D8 80 08D9 90 08DA BF 981 END MCS-51 MACRO ASSEMBLER VD 01/11/:2 PAGE 20 SYMBOL TABLE LISTING ------ ----- ------- N A M E T Y P E V A L U E A T T R I B U T E S ACC . . . . . D ADDR 00E0H A AGAIN . . . . C ADDR 08C0H A AMON. . . . . C ADDR 03E2H A BACK. . . . . C ADDR 0888H A BACK2 . . . . C ADDR 0891H A BACK3 . . . . C ADDR 0896H A BCDTO7SEG . . C ADDR 0178H A C_LED . . . . C ADDR 017DH A C_MT1 . . . . C ADDR 0187H A C_MT2 . . . . C ADDR 018CH A CA. . . . . . C ADDR 06E1H A CDDL. . . . . C ADDR 03A9H A CE. . . . . . C ADDR 06F2H A CHECK . . . . C ADDR 079BH A CHECKAMON . . C ADDR 03EEH A CHECKCD . . . C ADDR 0364H A CHECKCDDL . . C ADDR 03B5H A CHECKCO . . . C ADDR 037FH A CHECKDAY. . . C ADDR 0235H A CHECKDT . . . C ADDR 02DDH A CHECKED . . . C ADDR 07DFH A CHECKKD . . . C ADDR 0427H A CHECKKLB. . . C ADDR 0349H A CHECKKLV. . . C ADDR 039AH A CHECKNOI. . . C ADDR 032EH A CHECKOK . . . C ADDR 0831H A CHECKPRA. . . C ADDR 03D0H A CHECKRO . . . C ADDR 040CH A CHECKSERI . . C ADDR 026BH A CHECKSHC. . . C ADDR 02C2H A CHECKSON. . . C ADDR 0445H A CHECKSX . . . C ADDR 0313H A CHECKTLT. . . C ADDR 02F8H A CHIEUDAY. . . C ADDR 0358H A CO. . . . . . C ADDR 0373H A COPY. . . . . C ADDR 0727H A DATA0 . . . . C ADDR 07FBH A DATA1 . . . . C ADDR 0847H A DAY . . . . . C ADDR 0226H A DELAY2MS. . . C ADDR 0873H A DICHCE. . . . C ADDR 06FEH A DONE. . . . . C ADDR 08CDH A DUNGTICH. . . C ADDR 02D1H A ENTER . . . . C ADDR 075CH A ER. . . . . . C ADDR 06C2H A EXIT. . . . . C ADDR 08CFH A EXITDATA0 . . C ADDR 081DH A EXITETER. . . C ADDR 077AH A EXITGM. . . . C ADDR 046CH A EXITNS. . . . C ADDR 0491H A EXITT_CH. . . C ADDR 0830H A MCS-51 MACRO ASSEMBLER VD 01/11/:2 PAGE 21 N A M E T Y P E V A L U E A T T R I B U T E S F0. . . . . . B ADDR 00D0H.5 A GACH. . . . . C ADDR 021AH A INCHAR. . . . C ADDR 0863H A INHEX . . . . C ADDR 0883H A KEYHIT. . . . C ADDR 08B5H A KHOILV. . . . C ADDR 038EH A KIEMDINH. . . C ADDR 041BH A KL_BINH . . . C ADDR 033DH A LED1. . . . . C ADDR 0036H A LED2. . . . . C ADDR 004DH A LED3. . . . . C ADDR 0064H A LED4. . . . . C ADDR 007BH A LED5. . . . . C ADDR 0092H A LED6. . . . . C ADDR 00A9H A LED7. . . . . C ADDR 00C0H A LED7SEG_TABLE C ADDR 08D0H A LED8. . . . . C ADDR 00D7H A LOOPCA. . . . C ADDR 06EAH A LOOPDATA. . . C ADDR 0802H A LOOPRE. . . . C ADDR 071CH A LOOPSAVE. . . C ADDR 0791H A LOOPTRAIN . . C ADDR 07C5H A MAIN. . . . . C ADDR 0015H A MT_LED. . . . C ADDR 00EEH A MT1 . . . . . C ADDR 00EEH A MT2 . . . . . C ADDR 012FH A MTL_AM. . . . C ADDR 0608H A MTL_CD. . . . C ADDR 058CH A MTL_CDDL. . . C ADDR 05CAH A MTL_CO. . . . C ADDR 05ABH A MTL_DA. . . . C ADDR 0494H A MTL_DT. . . . C ADDR 04F1H A MTL_KB. . . . C ADDR 056DH A MTL_KD. . . . C ADDR 0684H A MTL_KL. . . . C ADDR 06A3H A MTL_NA. . . . C ADDR 052FH A MTL_NX. . . . C ADDR 054EH A MTL_OK. . . . C ADDR 0665H A MTL_PR. . . . C ADDR 05E9H A MTL_RO. . . . C ADDR 0627H A MTL_SERI. . . C ADDR 04B3H A MTL_SH. . . . C ADDR 04D2H A MTL_SO. . . . C ADDR 0646H A MTL_TL. . . . C ADDR 0510H A N_PHIM. . . . C ADDR 0883H A NAM_SX. . . . C ADDR 0307H A NEW . . . . . C ADDR 0856H A NHAPSO. . . . C ADDR 046FH A NOI_SX. . . . C ADDR 0322H A NOTOK . . . . C ADDR 045DH A NOTOK1. . . . C ADDR 07D8H A OK. . . . . . C ADDR 0454H A OK1 . . . . . C ADDR 07D1H A OUT_MT. . . . C ADDR 0182H A OUTCHAR . . . C ADDR 086BH A MCS-51 MACRO ASSEMBLER VD 01/11/:2 PAGE 22 N A M E T Y P E V A L U E A T T R I B U T E S OUTLED. . . . C ADDR 0173H A P1. . . . . . D ADDR 0090H A P2. . . . . . D ADDR 00A0H A P3. . . . . . D ADDR 00B0H A PASTE . . . . C ADDR 0740H A PCA . . . . . C ADDR 0241H A PCE . . . . . C ADDR 0295H A PCK . . . . . C ADDR 0253H A PCP . . . . . C ADDR 0283H A PENT. . . . . C ADDR 029EH A PET . . . . . C ADDR 024AH A PHIRA . . . . C ADDR 03C4H A PPS . . . . . C ADDR 028CH A PRS . . . . . C ADDR 0277H A PSR . . . . . C ADDR 025CH A Q_PHIM. . . . C ADDR 08A0H A RESET0. . . . C ADDR 0721H A RESETALL. . . C ADDR 0717H A RI. . . . . . B ADDR 0098H.0 A RO. . . . . . C ADDR 0400H A S_LED . . . . C ADDR 0022H A SAVE. . . . . C ADDR 0789H A SBUF. . . . . D ADDR 0099H A SCON. . . . . D ADDR 0098H A SHC . . . . . C ADDR 02B6H A SO0 . . . . . C ADDR 0196H A SO1 . . . . . C ADDR 01A2H A SO2 . . . . . C ADDR 01AEH A SO3 . . . . . C ADDR 01BAH A SO4 . . . . . C ADDR 01C6H A SO5 . . . . . C ADDR 01D2H A SO6 . . . . . C ADDR 01DEH A SO7 . . . . . C ADDR 01EAH A SO8 . . . . . C ADDR 01F6H A SO9 . . . . . C ADDR 0202H A SON . . . . . C ADDR 0439H A SP. . . . . . D ADDR 0081H A SPACE . . . . C ADDR 020EH A TEST. . . . . C ADDR 08A4H A TEST0 . . . . C ADDR 07A6H A TEST1 . . . . C ADDR 07B1H A TESTCHECK . . C ADDR 0825H A TF0 . . . . . B ADDR 0088H.5 A TH0 . . . . . D ADDR 008CH A TH1 . . . . . D ADDR 008DH A THE_END . . . C ADDR 077BH A THULANTHU . . C ADDR 02ECH A TI. . . . . . B ADDR 0098H.1 A TIEP1 . . . . C ADDR 0816H A TL0 . . . . . D ADDR 008AH A TMOD. . . . . D ADDR 0089H A TR0 . . . . . B ADDR 0088H.4 A TR1 . . . . . B ADDR 0088H.6 A TRAIN . . . . C ADDR 07BAH A TTGM0 . . . . C ADDR 0191H A MCS-51 MACRO ASSEMBLER VD 01/11/:2 PAGE 23 N A M E T Y P E V A L U E A T T R I B U T E S TTGM1 . . . . C ADDR 019FH A TTGM10. . . . C ADDR 020BH A TTGM11. . . . C ADDR 0217H A TTGM12. . . . C ADDR 0223H A TTGM13. . . . C ADDR 023EH A TTGM14. . . . C ADDR 0247H A TTGM15. . . . C ADDR 0250H A TTGM16. . . . C ADDR 0259H A TTGM17. . . . C ADDR 0274H A TTGM18. . . . C ADDR 0280H A TTGM19. . . . C ADDR 0289H A TTGM2 . . . . C ADDR 01ABH A TTGM20. . . . C ADDR 0292H A TTGM21. . . . C ADDR 029BH A TTGM22. . . . C ADDR 02A7H A TTGM23. . . . C ADDR 02B0H A TTGM24. . . . C ADDR 02CBH A TTGM25. . . . C ADDR 02E6H A TTGM26. . . . C ADDR 0301H A TTGM27. . . . C ADDR 031CH A TTGM28. . . . C ADDR 0337H A TTGM29. . . . C ADDR 0352H A TTGM3 . . . . C ADDR 01B7H A TTGM30. . . . C ADDR 036DH A TTGM31. . . . C ADDR 0388H A TTGM32. . . . C ADDR 03A3H A TTGM33. . . . C ADDR 03BEH A TTGM34. . . . C ADDR 03DCH A TTGM35. . . . C ADDR 03FAH A TTGM36. . . . C ADDR 0415H A TTGM37. . . . C ADDR 0433H A TTGM38. . . . C ADDR 0451H A TTGM39. . . . C ADDR 045AH A TTGM4 . . . . C ADDR 01C3H A TTGM40. . . . C ADDR 0463H A TTGM41. . . . C ADDR 046CH A TTGM5 . . . . C ADDR 01CFH A TTGM6 . . . . C ADDR 01DBH A TTGM7 . . . . C ADDR 01E7H A TTGM8 . . . . C ADDR 01F3H A TTGM9 . . . . C ADDR 01FFH A WAIT0 . . . . C ADDR 07A6H A WAIT1 . . . . C ADDR 07B1H A X_LED . . . . C ADDR 0020H A XUAT1 . . . . C ADDR 003EH A XUAT2 . . . . C ADDR 0055H A XUAT3 . . . . C ADDR 006CH A XUAT4 . . . . C ADDR 0083H A XUAT5 . . . . C ADDR 009AH A XUAT6 . . . . C ADDR 00B1H A XUAT7 . . . . C ADDR 00C8H A XUAT8 . . . . C ADDR 00DFH A REGISTER BANK(S) USED: 0 MCS-51 MACRO ASSEMBLER VD 01/11/:2 PAGE 24 N A M E T Y P E V A L U E A T T R I B U T E S ASSEMBLY COMPLETE, NO ERRORS FOUND B Chöông Trình Treân Maùy Tính: unit thu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, OleCtrls, MSCommLib_TLB, Grids, jpeg, ComCtrls, Menus; type TForm1 = class(TForm) MSComm1: TMSComm; Timer1: TTimer; Timer2: TTimer; Grid: TStringGrid; Label2: TLabel; Label1: TLabel; Image1: TImage; Image2: TImage; MainMenu1: TMainMenu; File1: TMenuItem; Open1: TMenuItem; load: TMenuItem; New1: TMenuItem; Aurosave1: TMenuItem; ExitCtrlQ1: TMenuItem; Help1: TMenuItem; Run1: TMenuItem; Run2: TMenuItem; Exit1: TMenuItem; Label3: TLabel; Label4: TLabel; Label5: TLabel; Comport1: TMenuItem; Com11: TMenuItem; Com21: TMenuItem; SubMenu1: TMenuItem; Banphim1: TMenuItem; Thunhietdo1: TMenuItem; Dongthoi1: TMenuItem; Image3: TImage; procedure FormCreate(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure lamviecClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure Open1Click(Sender: TObject); procedure loadClick(Sender: TObject); procedure Com11Click(Sender: TObject); procedure Com21Click(Sender: TObject); procedure Banphim1Click(Sender: TObject); procedure New1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; rownum,new:integer; F:TextFile; implementation uses Unit2; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin MSComm1.PortOpen:=true; rownum:=0; end; procedure TForm1.Timer2Timer(Sender: TObject); begin caption:=TimeToStr(Now()); end; procedure TForm1.Timer1Timer(Sender: TObject); var temp,ketqua,kq:string; i,n,j,t,line,k:integer ; colNum:integer; son,seri,sohchu,dungtich,noisx,beday,klvo,anmon:string[8]; kiemdinh,rori,ngaynhap,tlthu,namsx,klbinh,co,cddl,phira:string[8]; hoso:TextFile; s1,s2:string[20]; function pad(data:string;len:integer):string; var i:integer; begin result:=copy(data,1,200); i:=length(result); while i<20 do begin result:=result+#32; inc(i); end; end; function truyen(data:string):string; var u,m:integer; begin m:=length(data); for u:=1 to m do begin if data[u]='-' then MSComm1.Output:='A' else if data[u]=' ' then else MSComm1.Output:=Chr(StrToInt(data[u])); end; end; begin // Phat tin hieu hoi ketqua:=''; MSComm1.Output:='a'; temp:=MSComm1.input; //******************************************************************* //su li tin hieu nhan duoc if temp'' then begin n:=Length(temp); for i:=2 to n do begin if Ord(temp[i])=10 then ketqua:=ketqua+'-' else if Ord(temp[i])=255 then ketqua:=ketqua+'' else ketqua:=ketqua+IntToStr(Ord(temp[i])); end; // phan loai du lieu nhan duoc begin // *********************************************************** if Ord(temp[1])=99 then new:=1 ELSE if Ord(temp[1])=100 then begin for j:=0 to Grid.RowCount do if Grid.Cells[1,j]'' then begin rownum:=j; inc(rowNum); end; if ord(temp[9])=255 then k:=1; if ord(temp[9])255 then begin kq:=''; n:=length(temp); for i:=2 to n-1 do if Ord(temp[i])=255 then kq:=kq+'' else kq:=kq+IntToStr(Ord(temp[i])); line:=0; k:=0; while line < rowNum do begin s1:=''; for i:=1 to length(Grid.Cells[1,line]) do if Grid.Cells[1,line][i]=' ' then s1:=s1+'' else s1:=s1+Grid.Cells[1,line][i]; if kq=s1 then begin rowNum:=line ; k:=1; end else inc(line) end; inc(rownum); end; if k = 0 then else begin // truyen du lieu kiem tra xuong kit vxl if ord(temp[10])=7 then begin ngaynhap:=Grid.Cells[2,rownum-1]; truyen(ngaynhap); end else if Ord(temp[10])=6 then begin seri:=Grid.Cells[1,rownum-1]; truyen(seri); end else if Ord(temp[10])=14 then begin sohchu:=Grid.cells[3,rownum-1]; truyen(sohchu); end else if Ord(temp[10])=15 then begin dungtich:=Grid.Cells[4,rownum-1]; truyen(dungtich); end else if Ord(temp[10])=22 then begin tlthu:=Grid.Cells[5,rownum-1]; truyen(tlthu); end else if Ord(temp[10])=23 then begin namsx:=Grid.Cells[6,rownum-1]; truyen(namsx); end else if Ord(temp[10])=30 then begin noisx:=Grid.Cells[7,rownum-1]; truyen(noisx); end else if Ord(temp[10])=31 then begin klbinh:=Grid.Cells[8,rownum-1]; truyen(klbinh); end else if Ord(temp[10])=39 then begin beday:=Grid.Cells[9,rownum-1]; truyen(beday); end else if Ord(temp[10])=38 then begin co:=Grid.Cells[10,rownum-1]; truyen(co); end else if Ord(temp[10])=47 then begin klvo:=Grid.Cells[11,rownum-1]; truyen(klvo); end else if Ord(temp[10])=32 then begin cddl:=Grid.Cells[12,rownum-1]; truyen(cddl); end else if Ord(temp[10])=33 then begin phira:=Grid.Cells[13,rownum-1]; truyen(phira); end else if Ord(temp[10])=34 then begin anmon:=Grid.Cells[14,rownum-1]; truyen(anmon); end else if Ord(temp[10])=35 then begin rori:=Grid.Cells[15,rownum-1]; truyen(rori); end else if Ord(temp[10])=36 then begin kiemdinh:=Grid.Cells[16,rownum-1]; truyen(kiemdinh); end else if Ord(temp[10])=37 then begin son:=Grid.Cells[17,rownum-1]; truyen(son); end else end; end else //*************************************************** //*************************************************** //Save du lieu xuong teptin tren dia if Ord(temp[1])=3 then Begin AssignFile(hoso,'C:\My Documents\hoso.txt'); Rewrite(hoso); try for i:=0 to Grid.RowCount do begin s1:=''; for j:=1 to length(Grid.Cells[1,i]) do if Grid.Cells[1,i][j]=' ' then s1:=s1+'' else s1:=s1+Grid.Cells[1,i][j]; if s1'' then begin seri:=Grid.cells[1,i]; ngaynhap:=Grid.Cells[2,i]; sohchu:=Grid.Cells[3,i]; dungtich:=Grid.Cells[4,i]; tlthu:=Grid.Cells[5,i]; namsx:=Grid.Cells[6,i]; noisx:=Grid.Cells[7,i]; klbinh:=Grid.Cells[8,i]; beday:=Grid.Cells[9,i]; co:=Grid.Cells[10,i]; klvo:=Grid.Cells[11,i]; cddl:=Grid.Cells[12,i]; phira:=Grid.Cells[13,i]; anmon:=Grid.Cells[14,i]; rori:=Grid.Cells[15,i]; kiemdinh:=Grid.Cells[16,i]; son:=Grid.Cells[17,i]; t:=8 ; Writeln(hoso,pad(seri,t),pad(ngaynhap,t),pad(sohchu,t), pad(dungtich,t),pad(tlthu,t),pad(namsx,t), pad(noisx,t),pad(klbinh,t),pad(beday,t),pad(co,t), pad(klvo,t),pad(cddl,t),pad(phira,t),pad(anmon,t), pad(rori,t),pad(kiemdinh,t),pad(son,t)); end else end; finally CloseFile(hoso); end; for j:=0 to Grid.RowCount do if Grid.Cells[1,j]'' then begin rownum:=j; inc(rowNum); end; Grid.RowCount:=rowNum; end else //******************************************************************* // phan cot du lieu if ord(temp[1])=1 then begin ngaynhap:=ketqua; Grid.Cells[2,rownum]:=ngaynhap; end else if ord(temp[1])=2 then begin for j:=0 to Grid.RowCount do if Grid.Cells[1,j]'' then begin rownum:=j; inc(rowNum); end; seri:=ketqua; line:=0; k:=0; while line < rowNum do begin s1:=''; for i:=1 to length(Grid.Cells[1,line]) do if Grid.Cells[1,line][i]=' ' then s1:=s1+'' else s1:=s1+Grid.Cells[1,line][i]; if seri=s1 then begin k:=1; rowNum:=line; end else inc(line) end; if k=0 then Grid.Cells[1,rownum]:=seri else if (k=1)and (new=1)then begin new:=0; Grid.Cells[1,rownum]:=seri ; end else MSComm1.Output:=Chr(StrToInt('9')); end else if Ord(temp[1])=4 then begin sohchu:=ketqua; Grid.Cells[3,rownum]:=sohchu; end else if Ord(temp[1])=5 then begin dungtich:=ketqua; Grid.Cells[4,rownum]:=dungtich; end else if Ord(temp[1])=6 then begin tlthu:=ketqua; Grid.Cells[5,rownum]:=tlthu; end else if Ord(temp[1])=7 then begin namsx:=ketqua; Grid.Cells[6,rownum]:=namsx; end else if Ord(temp[1])=8 then begin noisx:=ketqua; Grid.Cells[7,rownum]:=noisx; end else if Ord(temp[1])=9 then begin klbinh:=ketqua; Grid.Cells[8,rownum]:=klbinh; end else if Ord(temp[1])=10 then begin beday:=ketqua; Grid.Cells[9,rownum]:=beday; end else if Ord(temp[1])=11 then begin co:=ketqua; Grid.Cells[10,rownum]:=co; end else if Ord(temp[1])=13 then begin cddl:=ketqua; Grid.Cells[12,rownum]:=cddl; end else if Ord(temp[1])=12 then begin klvo:=ketqua; Grid.Cells[11,rownum]:=klvo; end else if Ord(temp[1])=14 then begin phira:=ketqua; Grid.Cells[13,rownum]:=phira; end else if Ord(temp[1])=15 then begin anmon:=ketqua; Grid.Cells[14,rownum]:=anmon; end else if Ord(temp[1])=16 then begin rori:=ketqua; Grid.Cells[15,rownum]:=rori; end else if Ord(temp[1])=17 then begin kiemdinh:=ketqua; Grid.Cells[16,rownum]:=kiemdinh; end else if Ord(temp[1])=18 then begin son:=ketqua; Grid.Cells[17,rownum]:=son; end else end; end; end; procedure TForm1.lamviecClick(Sender: TObject); begin Timer1.Enabled:=true; Grid.Visible:=false; end; procedure TForm1.Button1Click(Sender: TObject); begin Grid.Visible:=true; end; procedure TForm1.Button2Click(Sender: TObject); begin Form2.ShowModal; end; procedure TForm1.Exit1Click(Sender: TObject); begin Close(); end; procedure TForm1.Open1Click(Sender: TObject); begin Form2.show; end; procedure TForm1.loadClick(Sender: TObject); var hoso:textFile; cot:array[1..20]of String[20]; i:integer; begin AssignFile(hoso,'C:\My Documents\hoso.txt'); reset(hoso); try begin While not eof(hoso) do begin readln(hoso,cot[1],cot[2],cot[3],cot[4],cot[5],cot[6], cot[7],cot[8],cot[9],cot[10],cot[11],cot[12], cot[13],cot[14],cot[15],cot[16],cot[17]) ; Grid.RowCount:=rowNum; for i:=1 to 17 do Grid.Cells[i,rownum]:=cot[i]; inc(rowNum); end; readln(hoso,cot[1],cot[2],cot[3],cot[4],cot[5],cot[6], cot[7],cot[8],cot[9],cot[10],cot[11],cot[12], cot[13],cot[14],cot[15],cot[16],cot[17]) ; Grid.RowCount:=rowNum; for i:=1 to 17 do Grid.Cells[i,rownum]:=cot[i]; inc(rownum); end; finally CloseFile(hoso); end; load.Enabled:=false; new1.Enabled:=false; Timer1.Enabled:=true; end; procedure TForm1.Com11Click(Sender: TObject); var Settings:string; begin begin if MSComm1.PortOpen=true then MSComm1.PortOpen:=false; MSComm1.CommPort:=1; Settings:='9600,N,8,1'; MSComm1.Settings:=Settings; MSComm1.InputLen:=0; MSComm1.InBufferSize:=256; MSComm1.InputMode:=comInputModetext; MSComm1.Handshaking:=comnone; MSComm1.OutBufferSize:=256; MSComm1.RThreshold:=0; MSComm1.SThreshold:=0; MSComm1.PortOpen:=true; end; SubMenu1.Enabled:=true; end; procedure TForm1.Com21Click(Sender: TObject); var Settings:string; begin begin if MSComm1.PortOpen=true then MSComm1.PortOpen:=false; MSComm1.CommPort:=2; Settings:='9600,N,8,1'; MSComm1.Settings:=Settings; MSComm1.InputLen:=0; MSComm1.InBufferSize:=256; MSComm1.InputMode:=comInputModetext; MSComm1.Handshaking:=comnone; MSComm1.OutBufferSize:=256; MSComm1.RThreshold:=0; MSComm1.SThreshold:=0; MSComm1.PortOpen:=true; end; SubMenu1.Enabled:=true; end; procedure TForm1.Banphim1Click(Sender: TObject); begin load.Enabled:=true; new1.Enabled:=true; end; procedure TForm1.New1Click(Sender: TObject); begin Timer1.Enabled:=true; Load.Enabled:=false; end; end . unit Unit2; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, Menus; type TForm2 = class(TForm) Grid1: TStringGrid; MainMenu1: TMainMenu; File1: TMenuItem; New1: TMenuItem; Save1: TMenuItem; Load1: TMenuItem; N1: TMenuItem; Son1: TMenuItem; Kiemdinh1: TMenuItem; N2: TMenuItem; Exit1: TMenuItem; Help1: TMenuItem; exit2: TMenuItem; procedure Son1Click(Sender: TObject); procedure New1Click(Sender: TObject); procedure Kiemdinh1Click(Sender: TObject); procedure exit2Click(Sender: TObject); procedure N2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation uses thu, Unit3, Unit4, Unit5; {$R *.DFM} procedure TForm2.Son1Click(Sender: TObject); begin Form3.show; end; procedure TForm2.New1Click(Sender: TObject); var hoso:textFile; cot:array[1..20]of String[20]; rowNums,i,j,t:integer; s:string; begin AssignFile(hoso,'C:\My Documents\hoso.txt'); reset(hoso); rowNums:=0; Grid1.Cells[1,0]:='So Seri'; Grid1.Cells[2,0]:='ngay nhap'; Grid1.Cells[3,0]:='so huu chu'; Grid1.Cells[4,0]:='Dung tich'; Grid1.Cells[5,0]:='Thu lan thu'; Grid1.Cells[6,0]:='Nam san xuat'; Grid1.Cells[7,0]:='Noi san xuat'; Grid1.Cells[8,0]:='Khoi luong binh'; Grid1.Cells[9,0]:='Be day'; Grid1.Cells[10,0]:='co'; Grid1.Cells[11,0]:='Khoi luong vo'; Grid1.Cells[12,0]:='Cat duc dao lom'; Grid1.Cells[13,0]:='Phi ra'; Grid1.Cells[14,0]:='an mon'; Grid1.Cells[15,0]:='Ro ri'; Grid1.Cells[16,0]:='Kiem dinh'; Grid1.Cells[17,0]:='Son'; try begin While not eof(hoso) do begin readln(hoso,cot[1],cot[2],cot[3],cot[4],cot[5],cot[6], cot[7],cot[8],cot[9],cot[10],cot[11],cot[12], cot[13],cot[14],cot[15],cot[16],cot[17]) ; inc(rowNums); Grid1.RowCount:=rowNums; Grid1.Cells[0,rowNums]:=IntToStr(rownums); for i:=1 to 2 do Grid1.Cells[i,rownums]:=cot[i]; Grid1.Cells[3,rownums]:='SGPETRO'; Grid1.Cells[4,rownums]:=cot[4]+'.l'; for i:=5 to 7 do Grid1.Cells[i,rownums]:=cot[i]; Grid1.Cells[8,rownums]:=cot[8]+'.kg'; Grid1.Cells[9,rownums]:=cot[9]+'.cm'; Grid1.Cells[10,rownums]:=cot[10]+'.cm'; Grid1.Cells[11,rownums]:=cot[11]+'.kg'; for i:=12 to 15 do if cot[i][1]='0' then Grid1.Cells[i,rownums]:='khong dat' else if cot[i][1]='1' then Grid1.Cells[i,rowNums]:='dat'; if cot[16][1]='1' then Grid1.Cells[16,rowNums]:='khong&kd'; if cot[16][1]='0' then Grid1.Cells[16,rowNums]:='phai&kd'; if cot[17][1]='1' then Grid1.Cells[17,rowNums]:='khong&son'; if cot[17][1]='0' then Grid1.Cells[17,rowNums]:='phai& son'; for j:=1 to 17 do begin s:=''; for t:=1 to length(Grid1.Cells[j,rownums]) do if Grid1.Cells[j,rownums][t]=' ' then s:=s+'' else if Grid1.Cells[j,rownums][t]='&' then s:=s+' ' else s:=s+ Grid1.Cells[j,rownums][t]; Grid1.Cells[j,rownums]:=' '+s; end; end; inc(rowNums); Grid1.RowCount:=rowNums; end; Grid1.FixedRows:=1; finally CloseFile(hoso); end; end; procedure TForm2.Kiemdinh1Click(Sender: TObject); begin Form4.show; end; procedure TForm2.exit2Click(Sender: TObject); begin close(); end; procedure TForm2.N2Click(Sender: TObject); begin form5.showmodal; end; end. unit Unit3; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, Menus; type TForm3 = class(TForm) Grid1: TStringGrid; MainMenu1: TMainMenu; File1: TMenuItem; New1: TMenuItem; Save1: TMenuItem; Exit1: TMenuItem; Help1: TMenuItem; procedure New1Click(Sender: TObject); procedure Exit1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.DFM} procedure TForm3.New1Click(Sender: TObject); var hoso:textFile; cot:array[1..20]of String[20]; rowNums,i,binh:integer; temp:string; begin AssignFile(hoso,'C:\My Documents\hoso.txt'); reset(hoso); rowNums:=0; binh:=0; Grid1.RowCount:=rowNums; Grid1.Cells[0,0]:='stt'; Grid1.Cells[1,0]:='so se ri'; try begin While not eof(hoso) do begin readln(hoso,cot[1],cot[2],cot[3],cot[4],cot[5],cot[6], cot[7],cot[8],cot[9],cot[10],cot[11],cot[12], cot[13],cot[14],cot[15],cot[16],cot[17]) ; temp:=''; for i:=1 to Length(cot[17]) do if cot[17][i]=' ' then temp:=temp+'' else temp:=temp+ cot[17][i]; if temp='0' then begin inc(rowNums); Grid1.RowCount:=rowNums; Grid1.cells[1,rownums]:=cot[1]; Grid1.Cells[0,rowNums]:=IntToStr(rownums); end else inc(binh); end; inc(rowNums); Grid1.RowCount:=rowNums; end; Grid1.FixedRows:=1; finally CloseFile(hoso); end; end; procedure TForm3.Exit1Click(Sender: TObject); begin close(); end; end. unit Unit4; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, Grids; type TForm4 = class(TForm) MainMenu1: TMainMenu; File1: TMenuItem; New1: TMenuItem; Save1: TMenuItem; Load1: TMenuItem; N1: TMenuItem; exit1: TMenuItem; Help1: TMenuItem; Grid1: TStringGrid; procedure New1Click(Sender: TObject); procedure exit1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form4: TForm4; implementation {$R *.DFM} procedure TForm4.New1Click(Sender: TObject); var hoso:textFile; cot:array[1..20]of String[20]; rowNums,i,binh:integer; temp:string; begin AssignFile(hoso,'C:\My Documents\hoso.txt'); reset(hoso); rowNums:=0; binh:=0; Grid1.RowCount:=rowNums; Grid1.Cells[0,0]:='stt'; Grid1.Cells[1,0]:='so se ri'; try begin While not eof(hoso) do begin readln(hoso,cot[1],cot[2],cot[3],cot[4],cot[5],cot[6], cot[7],cot[8],cot[9],cot[10],cot[11],cot[12], cot[13],cot[14],cot[15],cot[16],cot[17]) ; temp:=''; for i:=1 to Length(cot[16]) do if cot[16][i]=' ' then temp:=temp+'' else temp:=temp+ cot[16][i]; if temp='0' then begin inc(rowNums); Grid1.RowCount:=rowNums; Grid1.cells[1,rownums]:=cot[1]; Grid1.Cells[0,rowNums]:=IntToStr(rownums); end else inc(binh); end; // temp:=temp+ cot[16][i]; inc(rowNums); Grid1.RowCount:=rowNums; //Grid1.cells[1,rownums]:=cot[1]; //Grid1.Cells[0,rowNums]:=IntToStr(rownums); end; Grid1.FixedRows:=1; finally CloseFile(hoso); end; end; procedure TForm4.exit1Click(Sender: TObject); begin close(); end; end. unit Unit5; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm5 = class(TForm) Edit1: TEdit; Edit2: TEdit; OK: TButton; Cancel: TButton; Label1: TLabel; Label2: TLabel; procedure OKClick(Sender: TObject); procedure CancelClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form5: TForm5; implementation uses Unit2, Unit6; {$R *.DFM} procedure TForm5.OKClick(Sender: TObject); var i,t,k:integer; temp,temp1,temp2,s:string; Procedure binhgas(j:integer); var lylich:textFile; t:integer; s:array[1..20]of string; begin AssignFile(lylich,'c:\My Documents\lylich.txt'); Rewrite(lylich); try for t:=1 to form2.grid1.colcount do s[t]:=form2.Grid1.Cells[t,j]; Writeln(lylich,' Ly lich binh gas'); writeln(lylich,''); writeln(lylich,' Soá seâ ri',' :',s[1]); writeln(lylich,' Ngaøy nhaäp',' :',s[2]); writeln(lylich,' Sôû höõu chuû',' :',s[3]); writeln(lylich,' Dung tích bình',' :',s[4]); writeln(lylich,' Thöû laàn thöù',' :',s[5]); writeln(lylich,' Naêm saûn xuaát',' :',s[6]); writeln(lylich,' Nôi saûn xuaát',' :',s[7]); writeln(lylich,' Khoái löôïng bình',' :',s[8]); writeln(lylich,' Chieàu daøy',' :',s[9]); writeln(lylich,' Coå',' :',s[10]); writeln(lylich,' Khoái löôïng voû',' :',s[11]); writeln(lylich,' Caét ñuïc ñaøo loõm',' :',s[12]); writeln(lylich,' Phì ra',' :',s[13]); writeln(lylich,' AÊn moøn',' :',s[14]); writeln(lylich,' Roø ræ,',' :',s[15]); writeln(lylich,' Kieåm ñònh',' :',s[16]); writeln(lylich,' Sôn',' :',s[17]); finally CloseFile(lylich); Form6.Show; end; end; begin k:=0; temp1:=edit2.text; temp2:=edit1.text; temp:=''; for i:=1 to length(temp1) do if temp1[i]=' ' then temp:=temp+'' else temp:=temp+temp1[i]; temp1:=temp; temp:=''; for i:=1 to length(temp2) do if temp2[i]=' ' then temp:=temp+'' else temp:=temp+temp2[i]; temp2:=temp; if temp1'*' then begin for i:=1 to form2.Grid1.Rowcount do begin s:=''; for t:=1 to length(form2.Grid1.Cells[2,i]) do if form2.Grid1.Cells[2,i][t]=' ' then s:=s+'' else s:=s+ form2.Grid1.Cells[2,i][t]; if temp1=s then begin s:=''; for t:=1 to length(form2.Grid1.Cells[1,i]) do if form2.Grid1.Cells[1,i][t]=' ' then s:=s+'' else s:=s+ form2.Grid1.Cells[1,i][t]; if temp2=s then begin k:=1; binhgas(i); end; end; end; if k=0 then ShowMessage('Khong co binh nay hay thu lai... '); end; if temp1='*' then begin for i:=1 to form2.Grid1.Rowcount do begin s:=''; for t:=1 to length(form2.Grid1.Cells[1,i]) do if form2.Grid1.Cells[1,i][t]=' ' then s:=s+'' else s:=s+ form2.Grid1.Cells[1,i][t]; if temp2=s then begin binhgas(i); k:=1; end; end; if k=0 then ShowMessage('Khong co binh nay... '); end; end; procedure TForm5.CancelClick(Sender: TObject); begin close(); end; end. unit Unit6; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, Menus; type TForm6 = class(TForm) Memo1: TMemo; Edit1: TEdit; MainMenu1: TMainMenu; File1: TMenuItem; Help1: TMenuItem; procedure Memo1Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form6: TForm6; implementation {$R *.DFM} procedure TForm6.Memo1Change(Sender: TObject); begin //Memo1.Lines.LoadFromFile(edit1.text); end; procedure TForm6.FormCreate(Sender: TObject); begin //Memo1.Lines.LoadFromFile(edit1.text); end; procedure TForm6.FormActivate(Sender: TObject); begin Memo1.Lines.LoadFromFile(edit1.text); end; end. ._.

Các file đính kèm theo tài liệu này:

  • docRS-845.doc
Tài liệu liên quan