VYSOKÁ ŠKOLA POLYTECHNICKÁ JIHLAVA Katedra elektrotechniky a informatiky
S i mu la ce a vi zu al iz ace je dn o du ch ýc h p er if ér ií ří ze ný ch mikr o ř a d iče m ř ad y x52 bakalářská práce
Autor: Michal Štrejbar Vedoucí práce: Ing. Michal Bílek Jihlava 2011
Zde bude vloženo oficiální zadání podepsané od vedoucího práce a vedoucího oboru.
Anotace Tato bakalářská práce se zabývá vytvořením aplikace, která bude simulovat mikrořadič řady x52. Pomocí aplikace bude možné k jednotlivým portům mikrořadiče připojit virtuální periférie a podle zvoleného programu pro mikrořadič lze tyto periférie řídit. V práci jsou popsány vlastnosti mikrořadiče řady x52, připojitelné periférie či použité vývojové prostředí Borland C++ Builder.
Abstract This thesis deals with creating an application that will simulate a microcontroller series x52. With it will be possible for individual microcontroller ports to connect the virtual peripherals and according to the selected program for microcontroller may control these peripherals. This work describes the characteristics of the microcontroller series x52, connectable peripherals, or used development environment Borland C++ Builder.
Poděkování Rád bych poděkoval vedoucímu své bakalářské práce, Ing. Michalu Bílkovi za veškerý čas, který mi věnoval při tvorbě této práce. Dále bych rád poděkoval mojí rodině a přítelkyni za jejich podporu po celou dobu mého studia.
Prohlášení Prohlašuji, že předložená bakalářská práce je původní a zpracoval/a jsem ji samostatně. Prohlašuji, že citace použitých pramenů je úplná, že jsem v práci neporušil/a autorská práva (ve smyslu zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů, v platném znění, dále též „AZ“). Souhlasím s umístěním bakalářské práce v knihovně VŠPJ a s jejím užitím k výuce nebo k vlastní vnitřní potřebě VŠPJ . Byl/a jsem seznámen/a s tím, že na mou bakalářskou práci se plně vztahuje AZ, zejména § 60 (školní dílo). Beru na vědomí, že VŠPJ má právo na uzavření licenční smlouvy o užití mé bakalářské práce a prohlašuji, že s o u h l a s í m s případným užitím mé bakalářské práce (prodej, zapůjčení apod.). Jsem si vědom/a toho, že užít své bakalářské práce či poskytnout licenci k jejímu využití mohu jen se souhlasem VŠPJ, která má právo ode mne požadovat přiměřený příspěvek na úhradu nákladů, vynaložených vysokou školou na vytvoření díla (až do jejich skutečné výše), z výdělku dosaženého v souvislosti s užitím díla či poskytnutím licence. V Jihlavě dne 23. 5. 2011 ...................................................... Podpis
Obsah 1.
Úvod .......................................................................................................................... 8
2.
Popis řešeného problému .......................................................................................... 9
3.
2.1
Cíle bakalářské práce ......................................................................................... 9
2.2
Požadavky na výslednou aplikaci ...................................................................... 9
2.3
Soubory formátu Intel HEX ............................................................................... 9
2.4
Mikrořadiče řady x52 ....................................................................................... 11
2.4.1
Základní charakteristika ............................................................................ 11
2.4.2
Odlišnosti oproti řadě 8051....................................................................... 13
2.4.3
Základní vlastnosti .................................................................................... 13
2.4.4
Organizace paměti .................................................................................... 14
2.4.5
Základní registry ....................................................................................... 15
Analýza a návrh implementace ............................................................................... 17 3.1
3.1.1
Co je C++ Builder ..................................................................................... 17
3.1.2
Rozvržení pracovní plochy ....................................................................... 17
3.2
4.
Vývojové prostředí C++ Builder ...................................................................... 17
Popis periférií ................................................................................................... 19
3.2.1
Diody ........................................................................................................ 19
3.2.2
Přepínače................................................................................................... 19
3.2.3
Sedmi-segmentový displej ........................................................................ 19
3.2.4
Maticová klávesnice ................................................................................. 20
3.2.5
Dynamický displej .................................................................................... 21
Popis implementace ................................................................................................ 22 4.1
Grafický vzhled aplikace.................................................................................. 22
4.2
Součásti projektu .............................................................................................. 23
4.3
Nahrání souboru HEX ...................................................................................... 24
4.4
Připojení periférie............................................................................................. 25
4.5
Provádění instrukcí........................................................................................... 27
6
5.
4.6
Výpis obsahu datové paměti ............................................................................ 29
4.7
Periférie reagující na uživatele ......................................................................... 31
4.8
Volba banky registrů R0 až R7 ........................................................................ 33
Testování aplikace .................................................................................................. 35 5.1
5.1.1
Zadání ....................................................................................................... 35
5.1.2
Zdrojový kód ............................................................................................. 35
5.1.3
Soubor HEX .............................................................................................. 36
5.2
Testovací příklad 2 ........................................................................................... 36
5.2.1
Zadání ....................................................................................................... 36
5.2.2
Zdrojový kód ............................................................................................. 37
5.2.3
Soubor HEX .............................................................................................. 38
5.3
6.
Testovací příklad 1 ........................................................................................... 35
Testovací příklad 3 ........................................................................................... 38
5.3.1
Zadání ....................................................................................................... 38
5.3.2
Zdrojový kód ............................................................................................. 39
5.3.3
Soubor HEX .............................................................................................. 41
Závěr ....................................................................................................................... 43 6.1
Splnění cílů bakalářské práce ........................................................................... 43
6.2
Možnosti dalšího rozšíření aplikace ................................................................. 43
Seznam použité literatury ............................................................................................... 44 Seznam obrázků .............................................................................................................. 46 Seznam použitých symbolů a zkratek ............................................................................. 47 Seznam příloh ................................................................................................................. 48
7
1. Úvod Tématem této bakalářské práce je simulace a vizualizace jednoduchých periférií řízených mikrořadičem řady x52. Jedná se o vytvoření aplikace, pomocí které bude moci uživatel otestovat funkčnost programu napsaného pro mikrořadič. V aplikaci bude možné vybírat virtuální periférie (LED, přepínače, sedmi-segmentový displej, maticová klávesnice a podobně) a připojovat je k jednotlivým portům mikrořadiče. Na základě zvoleného programu pro mikrořadič bude možné tyto periférie řídit. Toto téma bakalářské práce jsem si vybral, protože mě zaujalo programování mikrořadičů, se kterým jsem se seznámil v rámci předmětu Mikroprocesorová technika, vyučovaném na Vysoké škole polytechnické Jihlava. Dalším důvodem volby této práce byla také skutečnost, že se jedná o vytvoření aplikace, která bude sloužit dalším studentům a pomůže jim při tvorbě programů pro mikrořadiče a usnadní jim práci při jejich testování. Kromě běžných uživatelů, kteří si budou chtít programování mikrořadiče pouze vyzkoušet, by měla aplikace sloužit především studentům Střední průmyslové školy Jihlava, kteří se zde také v jednom z vyučovaných předmětů s programováním mikrořadičů setkávají. Aby mohla aplikace sloužit hlavně tomuto účelu, je nutné umožnit připojení takových periférií, se kterými studenti na této škole pracují. Největší výhoda této aplikace spočívá v možnosti zjistit, zda program napsaný pro mikrořadič funguje opravdu správně, aniž by musel mít uživatel mikrořadič a periférie fyzicky u sebe. Doufám, že práce splní svůj účel a aplikace bude sloužit řadě dalších studentů při výuce programování mikrořadičů.
8
2. Popis řešeného problému 2.1 Cíle bakalářské práce Cílem této bakalářské práce je vytvoření aplikace, ve které bude možné realizovat simulace s vizualizací mikrořadiče řady x52 s možností připojení různých základních periférií (LED, přepínače, sedmi-segmentový displej, maticová klávesnice a podobně). Vlastní aplikace bude umožňovat k jednotlivým portům mikrořadiče připojovat virtuální periférie a na základě programu pro mikrořadič tyto periférie řídit. Dalším cílem této práce je připravení jednoduchých programů určených pro mikrořadič k příslušným perifériím, aby bylo možné ověřit funkčnost aplikace.
2.2 Požadavky na výslednou aplikaci Aplikace musí uživateli umožnit výběr programu napsaného pro mikrořadič. Program musí být uložen v souboru formátu Intel HEX. Jednou z dalších funkcí aplikace musí být možnost zvolit druh periférie a číslo portu, ke kterému ji chceme připojit. Existuje celá řada periférií, které lze k portům mikrořadiče připojit a není tedy možné začlenit je do aplikace všechny. Aby mohla být aplikace používána studenty Střední průmyslové školy Jihlava, musí být v nabídce připojitelných periférií především ty periférie, se kterými studenti v daném předmětu pracují. Dalším požadavkem na aplikaci je možnost sledovat a měnit hodnoty vnitřní datové paměti a základních registrů mikrořadiče.
2.3 Soubory formátu Intel HEX Tento typ souborů je používán pro definici obsahu paměti (např. RAM, ROM, FLASH). Je to textový soubor kódovaný pomocí standardu ASCII, což umožňuje soubory snadno přenášet z jednoho počítače na druhý, zobrazovat na monitoru nebo tisknout. Soubor se
9
skládá z jednotlivých záznamů, kde jeden řádek souboru představuje jeden záznam. Záznam začíná znakem ‚:‘, každá další dvojice hexadecimálních číslic představuje jeden bajt. Záznam se skládá z několika položek: Značka záznamu, je to ASCII znak ‚:‘ a začíná jím každý řádek (záznam). Délka záznamu, udává počet bajtů dat obsažených v záznamu. Maximální hodnota položky je „FF“. V jednom záznamu tak může být uloženo maximálně 255 bajtů dat. Adresa, představuje 16bitovou počáteční adresu paměti, na které je uložen první bajt dat záznamu. Typ záznamu, který definuje jeden ze šesti typů záznamu, viz níže. Tato položka může nabývat hodnot „00“ až „05“. Data, význam této položky závisí na typu záznamu. Počet bajtů dat je určen položkou „délka záznamu“. Kontrolní součet, obsahuje dvojici hexadecimálních číslic představujících dvojkový doplněk čísla, které získáme takto: sečteme hodnoty všech dvojic hexadecimálních číslic od položky „délka záznamu“ až po poslední bajt položky „data“, číslo bude zbytek po dělení 256. Typy záznamu: 00 – datový záznam 01 – konec souboru 02 – rozšířená segmentová adresa 03 – počáteční segmentová adresa 04 – rozšířená lineární adresa
10
05 – počáteční lineární adresa Na následujícím obrázku je vidět jak soubor HEX může vypadat. Jsou zde vyobrazeny také jednotlivé položky, ze kterých se záznamy skládají.
Obrázek 1: Ukázka souboru Intel HEX
2.4 Mikrořadiče řady x52 2.4.1 Základní charakteristika Pojmem mikrořadič rozumíme mikroprocesor, který je navíc doplněn o další obvody, což nám usnadňuje jeho použití v malých aplikacích. Mikrořadiče řady x52 jsou 8bitové jednočipové mikrořadiče, které vychází z původního mikrořadiče Intel 8051. Oproti němu mají však mikrořadiče řady x52 další možnosti a vylepšení.
11
Jedním z mikrořadičů řady x52 je např. mikrořadič od firmy Atmel, který má označení AT89C52. Na obrázku 2 je zobrazeno blokové schéma tohoto mikrořadiče.
Obrázek 2: Blokové schéma mikrořadiče AT89C52
12
2.4.2 Odlišnosti oproti řadě 8051 Většina funkcí mikrořadičů řady x52 je stejných, jako u řady x51. Obsahuje však navíc tato rozšíření: vnitřní datová paměť je rozšířena na 256 bajtů (z původních 128 bajtů) přidán třetí 16bitový čítač/časovač označen jako čítač/časovač 2 nové registry sloužící k ovládání čítače/časovače 2, jsou to registry T2MOD, T2CON, TH2, TL2, RCAP2H, RCAP2L nové rozložení bitů v registrech IE a IP
2.4.3 Základní vlastnosti Zde je přehled základních vlastností mikrořadičů řady x52: 8 KB programovatelné paměti Flash hodinový kmitočet 0 Hz až 24 MHz tříúrovňový zámek programové paměti 256 B vnitřní paměti RAM 32 vstupně/výstupních linek tři 16bitové čítače/časovače 8 zdrojů přerušení plně duplexní sériový port dva režimy snížené spotřeby
13
2.4.4 Organizace paměti Mikrořadiče řady x52 jsou postaveny na tzv. harvardské architektuře, u které je paměť dat a paměť programu oddělena. Paměť programu Paměť programu se skládá z vnitřní a vnější části. Zda má být program zaveden z vnitřní nebo z vnější paměti určuje signál EA . Pokud je EA = 1, použije se vnitřní paměť programu. Pokud je EA = 0, použije se vnější paměť programu. Vnitřní paměť programu (Flash) má velikost 8 KB (adresy od 0000h do 1FFFh). Vnější paměť programu má velikost 64 KB (adresy od 0000h do FFFFh). Paměť dat Datová paměť se skládá z vnitřní a vnější části. Vnější datová paměť může mít velikost až 64 KB (adresy 0000h až FFFFh). Vnitřní datová paměť má velikost 256 B (adresy 00h až FFh). Je rozdělena na tři oblasti: dolních 128 B (adresy 00h až 7Fh), horních 128 B (adresy 80h až FFh) a oblast SFR (registry speciálních funkcí). Horních 128 B paměti má stejné adresy jako oblast SFR, přístup k nim je proto zajištěn rozdílným způsobem adresování. Pokud tedy instrukce přistupuje na adresu větší jak 7Fh, rozhodne způsob adresování použitý v instrukci o tom, zda se přistoupí k oblasti horních 128 B nebo oblasti SFR. Instrukce s přímým adresováním přistupuje k oblasti SFR, instrukce s nepřímým adresováním přistupuje k horním 128 B paměti.
14
2.4.5 Základní registry Na obrázku 3 je zobrazena oblast SFR a hodnoty registrů po resetu mikrořadiče.
Obrázek 3: Základní registry
Akumulátor označení A nebo ACC, někdy označován také jako střadač je to nejzákladnější registr používaný v aritmetických a logických operacích Registr B tento registr se používá při aritmetických operacích násobení a dělení
15
Ukazatel zásobníku SP registr SP ukazuje na vrchol zásobníku před vložením dat na vrchol zásobníku se obsah registru zvýší, po odebrání dat ze zásobníku se obsah registru sníží Registr DPTR 16bitový registr, který se skládá ze dvou bajtů (DPH pro vyšší bajt, DPL pro nižší bajt) Stavové slovo programu PSW slouží k uchování informací stavu mikroprocesoru, každý bit registru má jiný význam 7. bit (C) – příznak přenosu ze sedmého bitu 6. bit (AC) – příznak přenosu ze třetího bitu 5. bit (F0) – uživatelský příznak 4. bit (RS1) – společně s RS0 určuje aktivní banku registrů R0 až R7 3. bit (RS0) – společně s RS1 určuje aktivní banku registrů R0 až R7 2. bit (OV) – příznak přetečení při aritmetických operacích 1. bit – tento bit není přístupný 0. bit (P) – příznak parity, pokud je v akumulátoru sudý počet jedniček, tak bude tento bit nastaven na 1, jinak je 0 Registry P0 až P3 slouží k přístupu k portům P0 až P3
16
3. Analýza a návrh implementace 3.1 Vývojové prostředí C++ Builder 3.1.1 Co je C++ Builder Jedná se o vývojové prostředí od firmy Borland, které je založeno na programovacím jazyce C++. C++ Builder je vývojový nástroj, který umožňuje jednoduše navrhovat a efektivně vytvářet aplikace pod operačním systémem Windows. C++ Builder je kompletně postaven na tzv. objektově orientované architektuře.1 Pomocí tohoto vývojového prostředí můžeme velice snadno a rychle navrhovat především vizuální vzhled aplikace, ovšem i samotné psaní kódu je velice intuitivní.
3.1.2 Rozvržení pracovní plochy Na obrázku 4 je zobrazeno rozvržení vývojového prostředí C++ Builder. Jak je vidět, pracovní plocha je rozdělena do několika oken. Uprostřed je zobrazen formulář, je to hlavní okno aplikace. Ve spodní části tohoto okna je několik záložek. Pokud jsme na záložce Design, máme zobrazen formulář a můžeme do něj umisťovat jednotlivé komponenty (tlačítka, textová pole, dialogy, nápisy, atd.). Dalšími záložkami jsou zdrojové soubory, do kterých píšeme zdrojový kód aplikace. V levé části je zobrazeno okno Object Inspector, které nám usnadní práci s komponentami. Můžeme zde přepínat mezi záložkami Properties a Events. V záložce Properties můžeme nastavovat vlastnosti komponent, jako je velikost, barva, okraje,
1
KADLEC, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. s. 7.
17
zarovnání, viditelnost a další. V záložce Events jsou všechny události, na které může komponenta reagovat. Můžeme například definovat, co se stane, pokud na komponentu klikneme myší nebo změníme její velikost, atd. Při výběru některé události se ve zdrojovém souboru automaticky vytvoří deklarace metody reagující na událost a na nás je, abychom pouze doplnili takový kód, aby komponenta na událost reagovala podle našeho přání. Dalším důležitým oknem je Tool Palette, které se nachází v pravé části pracovní plochy. Můžeme z něj snadno pomocí myši vkládat komponenty do formuláře. Po přetažení a upuštění komponenty nad formulářem se opět automaticky vygeneruje příslušný zdrojový kód a nemusíme se tedy starat o vytvoření komponenty.
Obrázek 4: Pracovní plocha v C++ Builder
18
3.2 Popis periférií V této kapitole jsou popsány jednotlivé moduly virtuálních periférií, které lze k portům mikrořadiče připojit.
3.2.1 Diody Jedná se o 8 diod připojených k bitům 0 až 7 příslušného portu. Nejméně významnému bitu odpovídá dioda nejvíce vpravo, nejvíce významnému bitu odpovídá dioda nejvíce vlevo. Pokud je na příslušný bit přivedena log. 0, dioda svítí. Při log. 1 dioda nesvítí.
Obrázek 5: Modul diody
3.2.2 Přepínače Modul obsahuje 8 spínačů, jejichž výstupy jsou přivedeny k bitům 0 až 7. Rozepnutý spínač (poloha Off) znamená log. 1, po sepnutí spínače (poloha On) se na příslušném bitu objeví log. 0. Spínač nejvíce vpravo obsluhuje bit 0, spínač nejvíce vlevo pak bit 7.
Obrázek 6: Modul přepínače
3.2.3 Sedmi-segmentový displej Tento modul představuje displej složený ze sedmi segmentů. Bitům 0 až 5 odpovídají segmenty po obvodu. Bitu 0 odpovídá horní vodorovný segment, další segmenty pak
19
následují směrem doprava. Bitu 6 odpovídá prostřední vodorovný segment, desetinná tečka je řízena bitem 7. Segment je rozsvícen, pokud je na příslušném bitu log. 0. Pokud na bitu nastavíme log. 1, segment je zhasnut.
Obrázek 7: Modul sedmi-segmentový displej
3.2.4 Maticová klávesnice Tlačítka klávesnice jsou uspořádány do čtyř řádků a čtyř sloupců. Bity 0 až 3 jsou připojeny na jednotlivé sloupce klávesnice zleva doprava. Bity 4 až 7 jsou připojeny k řádkům klávesnice odshora dolů. Všechny bity jsou nastaveny do log. 1. Abychom zjistili, které tlačítko bylo stisknuto, přivádíme postupně hodnotu log. 0 na bity 4 až 7 (řádky klávesnice). Stiskem některého z tlačítek se tato hodnota přenese na výstup představovaný bity 0 až 3 (sloupce klávesnice). Stisknuté tlačítko je pak udáno pozicí log. 0 na vstupech a výstupech.
Obrázek 8: Modul maticová klávesnice
20
3.2.5 Dynamický displej Modul obsahuje čtyři sedmi-segmentové displeje. Hodnota na bitech 0 až 3 určuje znak zobrazovaný na displeji. Pokud je na těchto bitech např. binární hodnota 0110, rozsvítí se na displeji segmenty, které odpovídají číslici 6. Bity 4 až 7 určují, na kterém displeji se znak zobrazí. Pro výběr displeje se použije kód 1 ze 4. Tzn., pokud se na jednom z těchto bitů objeví log. 0 a na ostatních je log. 1, použije se příslušný displej. Pro aktivaci displeje nejvíce vpravo musíme log. 0 přivést na bit 4, pro aktivaci displeje nejvíce vlevo přivedeme log. 0 na bit 7.
Obrázek 9: Modul dynamický displej
21
4. Popis implementace 4.1 Grafický vzhled aplikace Grafický vzhled aplikace je rozčleněn do několika částí. Největší část aplikace zabírá oblast představující jednotlivé porty mikrořadiče. Na těchto místech se zobrazují zvolené periférie a znázorňují tak jejich připojení k příslušnému portu. Při spuštění překladu vybraného souboru a za běhu simulace je dobré vidět, jak se mění obsahy jednotlivých registrů mikrořadiče. Proto je do aplikace přidána tabulka reprezentující datovou paměť mikrořadiče a také přehledné zobrazení jednotlivých registrů včetně registru PSW zobrazeného po jednotlivých bitech. Pokud se myší najede nad popisek registru, zobrazí se nápověda s adresou, která udává uložení daného registru v datové paměti. Pokud program není spuštěn, můžeme registry editovat. Ze čtyř bank registrů R0 až R7 můžeme zobrazovanou banku vybírat buď přímo volbou čísla banky, nebo můžeme zatrhnout políčko aktivní banka a tím se bude zobrazovat aktivní banka podle registru PSW. V hlavním menu aplikace můžeme vybírat soubor formátu HEX, ve kterém je program pro řízení periférií mikrořadiče. Dialogové okno pro otevření souboru otevřeme ze záložky Soubor|Otevřít. Ze záložky Periférie můžeme vybírat typ periférie a port, ke kterému ji chceme připojit. V aplikaci dále najdeme pole, ve kterém se zobrazuje cesta k vybranému souboru. Pod ním jsou dvě tlačítka. První z nich slouží pro spouštění a pozastavování simulace. Druhým tlačítkem můžeme provést reset mikrořadiče, při kterém se do registrů nahrají výchozí hodnoty. Poslední kolonka pod dvojicí tlačítek představuje programový čítač, ve kterém se zobrazuje adresa aktuálně prováděné instrukce. Jak samotná aplikace vypadá ukazuje Obrázek 10:
22
Obrázek 10: Vzhled aplikace
4.2 Součásti projektu Po vytvoření základní představy, jak bude výsledná aplikace vypadat, začala fáze programování. Projekt se skládá z několika částí:
Obrázek 11: Součásti projektu
23
Soubor Hlavni.cpp obsahuje zdrojové kódy hlavního formuláře, který obsluhuje viditelné komponenty aplikace, jako jsou tlačítka, hlavní menu nebo editační pole. Jako další součást projektu bylo vytvořeno samostatné vlákno, které zajišťuje dekódování instrukcí a jejich obsluhu, soubor má název Provadej_instrukce.cpp. Soubory O_aplikaci.cpp a Napoveda.cpp byly vytvořeny pro obsluhu modálních dialogů hlavního formuláře. Tyto dialogy lze z aplikace vyvolat pomocí hlavního menu ze záložky Nápověda. Poslední součástí projektu je soubor zdroje.rc, jedná se o skript, který popisuje zdroje (bitmapové obrázky), použité v aplikaci pro vyobrazení virtuálních periférií.
4.3
Nahrání souboru HEX
Program, který má mikrořadič provádět, se do aplikace nahrává ze zvoleného souboru s příponou .hex. Tento soubor bylo třeba dekódovat a hodnoty nahrát do programové paměti mikrořadiče, která je v programu reprezentována polem typu unsigned char. Výběr souboru a uložení hodnot do programové paměti zajišťuje funkce void __fastcall TForm1::OtevritClick(TObject *Sender), která nejprve otestuje, zda má otevíraný soubor správnou příponu: if(OpenDialog->Options.Contains(ofExtensionDifferent)) { char str[256]; sprintf(str, "Soubor %s není typu .hex!",OpenDialog>FileName.c_str()); MessageBox(Handle,str,"Soubor musí mít příponu .hex",MB_OK| MB_ICONHAND); }
Poté se celý soubor nahraje do proměnné soubor_hex, která je typu TStringList a každý záznam se rozčlení do jednotlivých položek záznamu, podle kterých se bajty dat uloží do programové paměti:
24
//nacteni souboru a ulozeni do programove pameti soubor_hex->LoadFromFile(OpenDialog->FileName); int velikost,adresa,typ; for(i=0;i<soubor_hex->Count;i++) { velikost=strtol(soubor_hex->Strings[i].SubString(2,2).c_str(),NULL, 16); adresa=strtol(soubor_hex->Strings[i].SubString(4,4).c_str(),NULL,16); typ=strtol(soubor_hex->Strings[i].SubString(8,2).c_str(),NULL,16); if(typ==0) for(j=0,k=10;j
Strings[i]. SubString(k,2).c_str(),NULL,16);
Tato funkce je vyvolána při otevření dialogového okna pro výběr souboru z hlavního menu aplikace.
4.4 Připojení periférie Virtuální periférie, které chceme připojit lze vybírat z hlavního menu aplikace z položky Periférie a volbou příslušného portu. Vybereme-li typ periférie, je vyvolána funkce, která zajistí vykreslení periférie na zvoleném portu. Jedná se o funkci void __fastcall TForm1::Prazdny_P0Click(TObject *Sender), v první části funkce se nejprve zjistí číslo portu, ke kterému se periférie připojuje a do proměnných se uloží obsah příslušného registru a typ zvolené periférie: switch(mi->GroupIndex) { case 10: { port=Image_P0; j=Datova_pamet_SFR[128]; periferie_P0=mi->Tag; break; } case 20: { port=Image_P1; j=Datova_pamet_SFR[144];
25
periferie_P1=mi->Tag; break; } case 30: { port=Image_P2; j=Datova_pamet_SFR[160]; periferie_P2=mi->Tag; break; } case 40: { port=Image_P3; j=Datova_pamet_SFR[176]; periferie_P3=mi->Tag; break; } }
Jednotlivé porty jsou v programu reprezentovány jako komponenty typu TImage. Každá periférie se skládá z několika obrázků připojených k aplikaci jako zdroje. Podle typu periférie se nahraje zdroj do bitmapy a ta se poté vykreslí na příslušný port a pozici. V ukázce je vidět jakým způsobem proběhne vykreslení periférie Diody: for(i=7;i>=0;i--) { if(j%2==1) b->LoadFromResourceID((unsigned)HInstance,101); else b->LoadFromResourceID((unsigned)HInstance,102); port->Canvas->Draw(i*32,80,b); j=j/2; }
26
4.5 Provádění instrukcí Provádění instrukcí má na starosti samostatné vlákno. Vlákno je vytvořeno v konstruktoru formuláře, ale po vytvoření je vlákno zastaveno. Rozběh vlákna je zajištěn až po stisknutí tlačítka Start. Každá instrukce je určena kódovým označením (2 hexadecimální číslice), dále můžeme instrukce rozdělit do třech skupin podle velikosti instrukce. Velikost instrukce může být jeden, dva nebo tři bajty. Dekódování instrukcí a provedení příslušné operace zajišťuje funkce vlákna void __fastcall TProvadej_instrukce::Proved_instrukci(). Po zjištění kódového označení instrukce, které je umístěno v programové paměti na adrese aktuálně prováděné instrukce, se pomocí větvení programu vykoná zjištěná instrukce a zajistí se zvýšení programového čítače o počet bajtů, jako je velikost instrukce: switch(Programova_pamet[adresa]) { //MOV A,#data case 0x74: { Datova_pamet_SFR[0xe0]=Programova_pamet[slabika2]; Nastav_priznak_P(); posun=2; break; } //XCH A,@R0 case 0xc6: { pom_reg=Datova_pamet[Datova_pamet[banka*8]]; Datova_pamet[Datova_pamet[banka*8]]=Datova_pamet_SFR[0xe0]; Datova_pamet_SFR[0xe0]=pom_reg; Nastav_priznak_P(); posun=1; break; } //DEC A case 0x14: {
27
Datova_pamet_SFR[0xe0]=Datova_pamet_SFR[0xe0]-1; Nastav_priznak_P(); posun=1; break; } //DIV AB case 0x84: { Nastav_hodnotu_bitu(0xd7,0); if((Datova_pamet_SFR[0xf0]==0)) Nastav_hodnotu_bitu(0xd2,1); else { unsigned int podil=Datova_pamet_SFR[0xe0]/ Datova_pamet_SFR[0xf0]; Nastav_hodnotu_bitu(0xd2,0); Datova_pamet_SFR[0xf0]=Datova_pamet_SFR[0xe0]% Datova_pamet_SFR[0xf0]; Datova_pamet_SFR[0xe0]=podil; Nastav_priznak_P(); } posun=1; break; } //SJMP kod adr case 0x80: { adresa+=2; if((Programova_pamet[slabika2]>>7)==1) adresa+=Programova_pamet[slabika2]-256; else adresa+=Programova_pamet[slabika2]; posun=0; break; }
28
Aby byla zajištěna synchronizace vlákna na provádění instrukcí a hlavního vlákna aplikace, je tato funkce volána jako parametr funkce Synchronize(): void __fastcall TProvadej_instrukce::Execute() { while(!Terminated) { Synchronize(&Proved_instrukci); slabika2=adresa+1; slabika3=adresa+2; } }
4.6 Výpis obsahu datové paměti Vlákno, které provádí jednotlivé instrukce, zapisuje výsledky instrukcí do pole typu unsigned char, které v programu představuje datovou paměť mikrořadiče. Vypisování hodnot paměti do příslušných editačních polí má na starosti hlavní vlákno aplikace a je realizováno pomocí časovače, který každou 1 ms vyvolá funkci void __fastcall TForm1::Timer_refreshTimer(TObject *Sender). Hodnoty datové paměti jsou v editačních polích zobrazeny v hexadecimální soustavě, proto funkce postupně převádí hodnotu datové paměti, která je typu unsigned char na řetězec dvou hexadecimálních číslic, které poté vypíše do editačního pole:
sprintf(s,"%02X",Datova_pamet_SFR[0xe0]); LabeledEdit_ACC->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet_SFR[0xf0]); LabeledEdit_B->Text="0x"+AnsiString(s);
29
Toto se provede pro všechny zobrazované registry. Navíc je potřeba zajistit překreslení připojených periférií, takže pokud se jedná o registry P0 až P3 a jsou připojeny periférie,
které
je
nutné
překreslit,
zavoláme
funkci
void
__fastcall
TForm1::Prazdny_P0Click(TObject *Sender): sprintf(s,"%02X",Datova_pamet_SFR[0x80]); LabeledEdit_P0->Text="0x"+AnsiString(s); if(periferie_P0==0 || periferie_P0==2 || periferie_P0==4) Prazdny_P0Click(Port_0->Items[periferie_P0]); sprintf(s,"%02X",Datova_pamet_SFR[0x90]); LabeledEdit_P1->Text="0x"+AnsiString(s); if(periferie_P1==0 || periferie_P1==2 || periferie_P1==4) Prazdny_P0Click(Port_1->Items[periferie_P1]);
Nakonec se ještě aktualizují hodnoty registrů R0 až R7 s přihlédnutím k aktuálně zvolené bance registrů: sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+0]); LabeledEdit_R0->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+1]); LabeledEdit_R1->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+2]); LabeledEdit_R2->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+3]); LabeledEdit_R3->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+4]); LabeledEdit_R4->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+5]); LabeledEdit_R5->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+6]); LabeledEdit_R6->Text="0x"+AnsiString(s); sprintf(s,"%02X",Datova_pamet[aktualni_banka*8+7]); LabeledEdit_R7->Text="0x"+AnsiString(s);
30
4.7 Periférie reagující na uživatele V aplikaci je možné připojovat k portům mikrořadiče dvě periférie, které musí reagovat na uživatele. Je to Maticová klávesnice a modul Přepínače. Proto byla vytvořena funkce void __fastcall TForm1::Image_P0MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) na obsluhu těchto periférií. Tato funkce reaguje na stisknutí tlačítka myši. V ukázce je vidět obsluha Maticové klávesnice. Po stisknutí tlačítka myši se nejprve otestuje, zda bylo stisknuto levé tlačítko a podle souřadnic se zjistí, zda byl kurzor v době stisku nad periférií. Poté se ze souřadnic vypočítá poziční kód stisknutého tlačítka udaný řádkem a sloupcem klávesnice, ve kterém bylo tlačítko stisknuto: if(Button==mbLeft) { //podle souradnice kliknuti zjistim ktere tlacitko bylo stisknuto if(Y>=5 && Y<=184 && X>=40 && X<=219) { stisknuto=true; sour_x=X; sour_y=Y; //zjistim sloupec ve kterem je tlacitko k=(X-40)/45; //zjistim radek ve kterem je tlacitko j=(Y-5)/45; //pozicni kod tlacitka pozicni_kod=4*j+k;
Protože po stisknutí tlačítka dojde ke změně podbarvení tlačítka, vykreslením původní klávesnice se zajistí, že podbarvení z předchozího stisknutého tlačítka zmizí a bude podbarveno pouze jedno tlačítko: //vykresleni puvodni klavesnice for(i=0;i<=3;i++) for(k=0;k<=3;k++) { b->LoadFromResourceID((unsigned)HInstance,111+k+4*i); port->Canvas->Draw(40+45*k,5+45*i,b);
31
} //vykresleni stisknuteho tlacitka b->LoadFromResourceID((unsigned)HInstance,127+pozicni_kod); port->Canvas->Draw(40+45*(pozicni_kod%4),5+45*(pozicni_kod/4),b);
Nakonec se ještě na portu, ke kterému je maticová klávesnice připojena, objeví na spodních čtyřech bitech hodnota log. 0, podle toho, ve kterém sloupci bylo tlačítko stisknuto: unsigned char hodnoty[]={0xef,0xdf,0xbf,0x7f}; switch(port->Tag) { case 0: { if(Datova_pamet_SFR[128]==hodnoty[pozicni_kod/4]) { Datova_pamet_SFR[128]=Datova_pamet_SFR[128]-pow(2,pozicni_kod%4); stisknuto=false; } break; } case 1: { if(Datova_pamet_SFR[144]==hodnoty[pozicni_kod/4]) { Datova_pamet_SFR[144]=Datova_pamet_SFR[144]-pow(2,pozicni_kod%4); stisknuto=false; } break; } case 2: { if(Datova_pamet_SFR[160]==hodnoty[pozicni_kod/4]) { Datova_pamet_SFR[160]=Datova_pamet_SFR[160]-pow(2,pozicni_kod%4); stisknuto=false; } break; }
32
case 3: { if(Datova_pamet_SFR[176]==hodnoty[pozicni_kod/4]) { Datova_pamet_SFR[176]=Datova_pamet_SFR[176]-pow(2,pozicni_kod%4); stisknuto=false; } break; } }
4.8 Volba banky registrů R0 až R7 Metoda void __fastcall TForm1::RadioGroup_bankaClick(TObject *Sender) se volá, pokud uživatel změnil zobrazovanou banku registrů zaškrtnutím políčka pro použití aktivní banky podle registru PSW nebo číslo banky změnil v komponentě TRadioGroup. Pokud je zaškrtnuté políčko pro výběr banky podle registru PSW, znepřístupní se změna banky volbou čísla banky a zjistí se hodnoty bitů RS1 a RS0, podle kterých se do proměnné aktualni_banka uloží číslo aktivní banky: if(CheckBox_banka->Checked) { RadioGroup_banka->Enabled=false; if(LabeledEdit_PSW_4->Text=="0") { if(LabeledEdit_PSW_3->Text=="0") aktualni_banka=0; else aktualni_banka=1; } else { if(LabeledEdit_PSW_3->Text=="0") aktualni_banka=2; else aktualni_banka=3; }
Pokud se políčko odškrtne, zpřístupní se volba banky pomocí čísla banky a právě vybrané číslo se uloží do proměnné aktualni_banka:
33
else { RadioGroup_banka->Enabled=true; aktualni_banka=RadioGroup_banka->ItemIndex; }
Nakonec se do editačních polí registrů R0 až R7 nahrají hodnoty z datové paměti a do nápovědy popisných polí se uloží adresy těchto registrů s přihlédnutím k zobrazované bance registrů: //naplneni pole hintu podle zvolene banky for(i=0;i<8;i++) sprintf(hint[i],"0x%02X",aktualni_banka*8+i); LabeledEdit_R0->EditLabel->Hint=hint[0]; LabeledEdit_R1->EditLabel->Hint=hint[1]; LabeledEdit_R2->EditLabel->Hint=hint[2]; LabeledEdit_R3->EditLabel->Hint=hint[3]; LabeledEdit_R4->EditLabel->Hint=hint[4]; LabeledEdit_R5->EditLabel->Hint=hint[5]; LabeledEdit_R6->EditLabel->Hint=hint[6]; LabeledEdit_R7->EditLabel->Hint=hint[7];
34
5. Testování aplikace Kvůli ověření funkčnosti aplikace bylo potřeba vytvořit testovací soubory pro jednotlivé periférie. Testovací programy byly vytvořeny ve vývojovém prostředí Keil µVision 3, se kterým jsem se seznámil v předmětu Mikroprocesorová technika 1. V tomto prostředí lze při překladu programu vytvořit soubor HEX, který je potřeba pro tuto aplikaci.
5.1 Testovací příklad 1 5.1.1 Zadání První příklad má za úkol otestování přípravku Diody. Program bude realizovat tzv. běžící světlo, kdy se postupně na určitou dobu rozsvěcují jednotlivé diody. Nejprve se rozsvítí dioda na bitu P2.0, poté na bitu P2.1, atd. Přípravek Diody připojíme na port P2.
5.1.2 Zdrojový kód Program provádí nekonečnou smyčku, ve které postupně vkládá na port P2 hodnoty z pole konstant, které představují rozsvícení vždy jedné diody. Poté se čeká určitý časový interval a vkládá se další hodnota. Po rozsvícení poslední diody se opět pokračuje od začátku. #include void cekej() { unsigned i; for(i=0;i<5000;i++); }
35
void main() { code unsigned char led[]={254,253,251,247,239,223,191,127}; unsigned char i=0; while(1) { P2=led[i]; cekej(); i++; if (i==8) i=0; } }
5.1.3 Soubor HEX Takto vypadá vygenerovaný soubor diody.hex, který se vkládá do aplikace. :08082F00FEFDFBF7EFDFBF7FC8 :0E081400E4FFFE0FBF00010EBE13F8BF88F513 :0108220022B3 :10080000E4FDED90082F93F5A01208140DBD08F239 :04081000E4FD80EE95 :03000000020823D0 :0C082300787FE4F6D8FD7581070208001C :00000001FF
5.2 Testovací příklad 2 5.2.1 Zadání Druhý příklad testuje přípravky Dynamický displej a Přepínače. Program zobrazuje na displeji hodnotu v intervalu 0 až 255 podle stavu přepínačů. Přípravek Dynamický displej připojíme na port P2 a Přepínače na port P3.
36
5.2.2 Zdrojový kód Program provádí nekonečnou smyčku, ve které postupně čte stav přepínačů na portu P3 a hodnota se posílá do funkce display(unsigned char x), kde se hodnota rozloží na jednotlivé číslice, které se zobrazují na příslušné pozici dynamického displeje. #include code unsigned int pozice[]={112,176,208,224}; void cekej() { unsigned int i; for(i=0;i<100;i++); } void display(unsigned char x) { unsigned int i,delitel=1000; if (x>=0 && x<=9999) { for(i=0;i<=3;i++) { P2=pozice[i]+(x/delitel); cekej(); x = x % delitel; delitel = delitel / 10; } } } void main() { unsigned char prepinace; while(1) { prepinace=~P3; display(prepinace); } }
37
5.2.3 Soubor HEX Takto vypadá vygenerovaný soubor display_prepinace.hex, který se vkládá do aplikace. :0808E400007000B000D000E03C :0E08C000E4FFFE0FBF00010EEF64644E70F502 :0108CE002207 :020800008F085F :10080200750903750AE8E508C39400405BD3EF94C9 :100812000F748094A75051E4FBFAAF087E00AC0934 :10082200AD0A12086BAD07EB25E0FFEA33FE74E474 :100832002FF58274083EF5837401932DF5A01208FA :10084200C0AF087E00AC09AD0A12086B8D08AE0974 :10085200AF0A7C007D0A12086B8E098F0A0BBB005F :08086200010AEB64044A70B2C4 :01086A00226B :0908DB00E5B0F4FF12080080F7FB :030000000208CF24 :0C08CF00787FE4F6D8FD75810A0208DB92 :10086B00BC000BBE0029EF8DF084FFADF022E4CC71 :10087B00F875F008EF2FFFEE33FEEC33FCEE9DEC3A :10088B00984005FCEE9DFE0FD5F0E9E4CEFD22ED80 :10089B00F8F5F0EE8420D21CFEADF075F008EF2FCA :1008AB00FFED33FD4007985006D5F0F222C398FDBB :0508BB000FD5F0EA2258 :00000001FF
5.3 Testovací příklad 3 5.3.1 Zadání Třetí příklad testuje přípravky 7segmentový displej a Maticová klávesnice. Program zobrazuje na displeji hodnotu stisknutou na klávesnici. Přípravek 7segmentový displej připojíme na port P2 a Maticovou klávesnici na port P3.
38
5.3.2 Zdrojový kód Program provádí nekonečnou smyčku, ve které načítá hodnotu vrácenou funkcí char ctiklav(), tato hodnota značí poziční kód stisknutého tlačítka. Pokud bylo stisknuto tlačítko zavolá se funkce zobraz(char hodnota), která podle pozičního kódu vybere z pole konstant hodnotu odpovídající znaku stisknutého tlačítka klávesnice a tuto hodnotu pošle na port P2. #include code
unsigned
char
cisla[]={0x1f,0x01,0x19,0x11,0x99,0x49,0x41,0xc1,
0x9f,0x25,0x0d,0x63,0x03,0x71,0x61,0x85}; //cekaci funkce void cekej(unsigned int cas) { unsigned int i; for(i=0;i
39
for(radek=0;radek<4;radek++) { P3=r[radek]; do { s1=P3; cekej(100); s2=P3; } while(s1!=s2); //vymaskuju pouze spodni ctyri bity s1 s1=0x0f & s1; //zjisteni ve kterem sloupci je stisknute tlacitko for(sloupec=0;sloupec<4;sloupec++) { if(s1==s[sloupec]) //vraci pozicni kod tlacitka return 4*radek + sloupec; } } return -1; } void main() { char hodnota; while(1) { hodnota = ctiklav(); if(hodnota != -1) zobraz(hodnota); } }
40
5.3.3 Soubor HEX Takto vypadá vygenerovaný soubor klávesnice_7segmentovka.hex, který se vkládá do aplikace. :100954001F011911994941C19F250D6303716185D7 :08096400EFDFBF7F0E0D0B0752 :10098000E4FDFCC3ED9FEC9E50070DBD00010C8003 :01099000F274 :010991002243 :10096C00EF3395E0FE74542FF58274093EF583E461 :04097C0093F5A0222D :1008F60078087C007D007BFF7A0979647E007F049E :100906001208D0780C7C007D007BFF7A0979687E1E :10091600007F041208D0E4FB74082BF8E6F5B0AAB1 :10092600B07F647E00120980AFB0EAB507F15302CA :100936000FE4FF740C2FF8E6B50208EB25E025E07E :0D0946002FFF220FBF04EC0BBB04CD7FFF81 :010953002281 :0E0992001208F6AD07EDF460F712096C80F262 :030000000209A052 :0C09A000787FE4F6D8FD75810F02099203 :10080000E709F608DFFA8046E709F208DFFA803EDA :1008100088828C83E709F0A3DFFA8032E309F608C7 :10082000DFFA8078E309F208DFFA807088828C832F :10083000E309F0A3DFFA806489828A83E0A3F608E3 :10084000DFFA805889828A83E0A3F208DFFA804CBD :1008500080D280FA80C680D4806980F28033801094 :1008600080A680EA809A80A880DA80E280CA8033FD :1008700089828A83ECFAE493A3C8C582C8CCC58375 :10088000CCF0A3C8C582C8CCC583CCDFE9DEE78045 :100890000D89828A83E493A3F608DFF9ECFAA9F0C4 :1008A000EDFB2289828A83ECFAE0A3C8C582C8CC1A :1008B000C583CCF0A3C8C582C8CCC583CCDFEADE33 :1008C000E880DB89828A83E493A3F208DFF980CC95 :1008D00088F0EF60010E4E60C388F0ED2402B4048E :1008E0000050B9F582EB2402B4040050AF23234535
41
:0608F00082239008507302 :00000001FF
42
6. Závěr 6.1 Splnění cílů bakalářské práce Cílem této bakalářské práce bylo vytvoření aplikace, ve které bude možné realizovat simulace s vizualizací mikrořadiče řady x52 s možností připojení různých základních periférií (např. LED, přepínače, sedmi-segmentový displej, maticová klávesnice a podobně). Vlastní aplikace měla umožňovat k jednotlivým portům připojovat virtuální periférie a na základě programu pro mikrořadič tyto periférie řídit. Cíl práce byl do jisté míry splněn, bohužel se nepodařilo naprogramovat některé vlastnosti mikrořadiče, jako jsou čítače/časovače nebo sériový kanál. V aplikaci lze tedy testovat základní programy pro mikrořadič, které tyto vlastnosti mikrořadiče nevyužívají. Dále se podařilo vytvořit programy pro mikrořadič k příslušným perifériím pro vlastní prezentaci funkčnosti aplikace.
6.2 Možnosti dalšího rozšíření aplikace Jedním
z možných
rozšíření
aplikace
je
naprogramování
zbylých
vlastností
mikrořadiče, jako je čítač/časovač nebo sériový kanál, aby bylo možné plně využívat aplikaci i k testování pokročilejších programů, které tyto vlastnosti využívají. Nyní lze v aplikaci připojovat pouze naprogramované periférie. Pokud bychom chtěli otestovat funkčnost programu určeného pro jiný druh periférie, musel by se upravit zdrojový kód aplikace. Proto by jedno z možných rozšíření aplikace mohlo být naprogramování modulu pro jednoduché přidávání periférií. Tento modul by uživateli umožňoval vytvoření vlastní periférie a její přidání do aplikace. Poté by již použití aplikace nebylo omezeno předpřipravenými perifériemi.
43
Seznam použité literatury Monografie: [1]
BÍLEK, Michal. Elektronické počítačové systémy: cvičení. Autorský výtisk.
[2]
BÍLEK, Michal. Programování mikroprocesoru 8051. 2001.
[3]
KADLEC, Václav. Učíme se programovat v Borland C++ Builder a jazyce C++. 1. vydání. Praha: Computer Press, 2002. 385 s. ISBN 80-7226-550-4.
[4]
MATOUŠEK, David. C++ Builder: vývojové prostředí 1. díl. 3. rozšířené vydání. Praha: BEN - technická literatura, 2002. 688 s. ISBN 80-7300-064-4.
[5]
MATOUŠEK, David. Mikroprocesorová technika: přednášky 1. díl. 1. opravené vydání. Skripta VŠPJ, 2008.
[6]
PINKER, Jiří. Mikroprocesory a mikropočítače. 1. vydání. Praha: BEN technická literatura, 2004. 160 s. ISBN 80-7300-110-1.
Internetové zdroje: [7]
8-bit Microcontroller with 8K Bytes Flash AT89C52 [online]. Atmel Corporation, 1999 [cit. 2010-05-19]. Dostupné z WWW: .
[8]
General: Intel HEX File Format [online]. 21. 6. 2004 [cit. 2010-05-19]. KEIL Tools by ARM. Dostupné z WWW: .
44
[9]
Hexadecimal Object File Format Specification [online]. Intel Corporation, 1998 [cit. 2010-05-19]. Dostupné z WWW: .
[10] Intel 8052 In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida) : Wikipedia Foundation, 14. 3. 2009, 22. 6. 2009 [cit. 2010-05-19]. Dostupné z WWW: . [11] Intel HEX In Wikipedia : the free encyclopedia [online]. St. Petersburg (Florida) : Wikipedia Foundation, 9. 4. 2009, 5. 5. 2010 [cit. 2010-05-19]. Dostupné z WWW: . [12] Rozdíly mezi procesorem 8051 a 8052 [online]. 2002 - 2010 [cit. 2010-05-19]. DH Servis. Dostupné z WWW: .
45
Seznam obrázků Obrázek 1: Ukázka souboru Intel HEX .......................................................................... 11 Obrázek 2: Blokové schéma mikrořadiče AT89C52 ...................................................... 12 Obrázek 3: Základní registry .......................................................................................... 15 Obrázek 4: Pracovní plocha v C++ Builder .................................................................... 18 Obrázek 5: Modul diody ................................................................................................. 19 Obrázek 6: Modul přepínače........................................................................................... 19 Obrázek 7: Modul sedmi-segmentový displej ................................................................ 20 Obrázek 8: Modul maticová klávesnice .......................................................................... 20 Obrázek 9: Modul dynamický displej ............................................................................. 21 Obrázek 10: Vzhled aplikace .......................................................................................... 23 Obrázek 11: Součásti projektu ........................................................................................ 23
46
Seznam použitých symbolů a zkratek Hz
Hertz
MHz
Megahertz
B
Bajt
KB
Kilobajt
RAM
Random Access Memory
SFR
Special Function Registers
log. 0
logická nula
log. 1
logická jedna
ms
milisekunda
47
Seznam příloh Součástí bakalářské práce je doprovodné CD, které obsahuje zdrojové kódy aplikace, soubory formátu HEX určené pro ověření funkčnosti aplikace. Dále obsahuje spouštěcí soubor aplikace a textovou část bakalářské práce ve formátu PDF. Zdrojové kódy aplikace jsou umístěny ve složce „Zdrojové kódy“. Testovací soubory jsou ve složce „Testovací soubory“. Samotná aplikace je ve složce „Aplikace“ a textová část bakalářské práce ve formátu PDF je ve složce „Bakalářská práce“.
48