Реферат по предмету "Программирование, Базы данных"


Программирование микроконтроллера на ассемблере. Симуляция игральной кости

Projekt
Würfel
8051Win- Simulation





von Ilya Gufan, 4G5


Heilbronn, Juni 2006


Inhaltsverzeichnis

·       Lastenheft                                                                                       3
·       Einführung                                                                                      4
·       Aufgaben                                                                                         5
o  Aufgabe1. 8051Win-Simulation mit LED-Reihe                            6
o  Aufgabe2. Programmierung der BB-Mikrocontrollerplatine         12
o  Aufgabe3. 8051Win-Simulation des Würfelmodells            17
o  Aufgabe4. 8051Win-Simulation der 7-Segment-Anzeige     23
o  Aufgabe5. Programmierung der 7-Segment-Anzeige            27
o  Aufgabe6. Langsam auslaufender oder nachlaufender Zähler        29
·       Beschreibungder benutzten Befehle                                                        32
·       Quellenangabe                                                                                33
Anlage: CD

Lastenheft

1.8051Win-Simulation mit LED-Reihe
a) Dualanzeige des Zählers/DJNZ-Befehl und CJNE-Befehl
b) Start-Stopp Schalter /Bitverarbeitung und bedingte Sprünge
c) Ausgabe auf die LPT-Schnittstelle /Parallele Schnittstelle
d) Ausgabe als Leuchtbalken / Decoder /Unterschied von Wert und Adresse
e) Vollständige Dokumentation mitProgrammablaufplänen, Code,
Erklärungen, Snapshots
2. Programmierungder BB-Mikrocontrollerpiatine
a) EEPROM / Flash-EPROM /Harvard-Struktur / Adressbereiche
b) Zählerausgabe auf die LED-Reihe
c) Zeitprogramm / Unterprogramme /Zeitberechnung / Stackpointer
d) Befehlsabarbeitung
e) Vollständige Dokumentation mitProgrammablaufplänen, Code,
Erklärungen, Snapshots
3.8051Win-Simulation
a) Würfelmodell mit integriertemDecoder
b) Würfelmodell ohne Decoder/indirekte Adressierung @R0, @R1 im 8bit-
Adressraum Code in Adr. 31h… 36habspeichern
c) Vollständige Dokumentation mitProgrammablaufplänen, Code,
Erklärungen, Snapshots
4.8051Win-Simulation
a) Siebensegmentmodell / IndirekteAdressierung @DPTR im 16 bit-
Adressraum / Define Byte (DB)
b) Übersicht allerAdressierungsarten.
c) Vollständige Dokumentation mitProgrammablaufplänen, Code,
Erklärungen, Snapshots
5. Programmierungder BB-Mikrocontrollerplatine
a) Ausgabe auf 7-Segment-Anzeige/arbeiten mit CJNE-Befehl / DPTR / DB
b) Vollständige Dokumentation mitProgrammablaufplänen, Code, Erklärungen, Snapshots
6. Zusatzaufgabe(freiwillig)
a) Langsam auslaufenden/ nachlaufenden Zähler entwickeln
b)Vollständige Dokumentation mit Programmablaufplänen, Code,
Erklärungen,Snapshots
7.Vollständige Projektdokumentation incl. Deckblatt, Inhaltsverzeichnis, Lastenheft,Quellangaben und a51- wie hex-Code auf Diskette / CD



Bild 1. Würfelset für das Spiel »Dungeons & Dragons« Einführung


Dieses Projekt wurde im Rahmen des CT-Unterrichts gemacht. DerProjektleiter ist Herr A. Hein. Das Ziel des Projektes war, dieAssembler-Programmierung des µC zu meistern. Das zu programmierende Objekt warder Würfel. Die Ausführung der Programme sollte mit 8051win simuliertwerden. Während des Unterrichts hatte der Schüler auch dieMöglichkeit, mit dem BB-µC-Platine das Programm direkt auf dem µC ausführen zu lassen.


Bild 2. Würfel üblicher Form


Bild 3. Ein falscher Würfel Ein Spielwürfel ist ein als Zufallsgenerator verwendeter Gegenstand, der auf mehrere,voneinander unterscheidbare Arten stabil auf der Ebene zu liegen kommen kann.Die meisten Würfel sind heute aus Holz oder Kunststoff und haben einenDurchmesser von etwa eineinhalb Zentimetern. Spielwürfel werden vor allemin den nach ihnen benannten Würfelspielen und in Glücksspielen,gelegentlich auch in Brettspielen und in Rollenspielen (wie z. B. »Dungeons& Dragons«) verwendet.
Die übliche Form ist die eines geometrischen Würfels,worauf auch der Begriff Spielwürfel zurückgeht. Um seineRolleigenschaft zu verbessern, sind die Ecken heute häufig abgerundet. DieFlächen sind meistens mit ein bis sechs Punkten versehen, die auch alsAugen bezeichnet werden, wobei die Augensumme sich gegenüberliegendenerSeiten in der Regel sieben ergibt. Die Orientierung der gegenüberliegendenPaare (1,6), (2,5), (3,4) ist im westlichen Kulturkreis so festgelegt, dass dieZiffern 1, 2 und 3 im Gegenuhrzeigersinn gesehen werden, während sie imFernen Osten im Uhrzeigersinn ausgerichtet sind.
In dem Projekt wird ein Würfel üblicher Formprogrammiert.

Aufgaben
·     Dualanzeigedes Zählers
·     LED-Reihe

·     Würfelmodell

·     Siebensegmentmodell

Aufgabe 1. 8051Win-Simulation mit LED-Reihe
 
LED-Dualanzeige desZählers.

Bild 4. LED-Dualanzeige in 8051Win-Simulation
Erklärung:
Man baut einen einfachen Zähler von 1 bis 6 bzw. von 6 bis 1 auf.Der Schalter wird durch P1 mit derAdresse 90h, die Ausgabe auf P2 mit der Adresse 0A0hfestgelegt. Danach wird der Wert 6 bzw. 1 ins Register 1 geladen (Programmpunkt„laden“). Dann wird der Schalter überprüft, ob er auf 1 gesetzt ist.Wenn ja, überprüft man wieder.  Wird er auf Null gesetzt, so lässt mandas Programm weiter laufen (Programmpunkt „stopp“).
Danach gibt man den Registerinhalt von R1 auf P2.
Lösung mit DJNZ.
Mit DJNZ wird derRegisterinhalt um eins verkleinert,deshalb zählt man von 6 bis 1.Sobald das Ergebnis Null ist, wird der Code weiter abgearbeitet. Mit dem BefehlSJMP springt es zum Programmpunkt„laden“. Ist das Ergebnis keine Null, wird es zum Programmpunkt „stopp“gesprungen.
Lösung mit CJNE.
Mit INC wird derRegisterinhalt um eins erhöht. Manzählt von 1 bis 6. Ist derInhalt von R1 dem Wert 07h nicht gleich, wird es zum Programmpunkt „stopp“gesprungen. Im Falle der Gleichheit wird zu dem Programmpunkt „laden“gesprungen.
Man braucht keine Codierungstabelle, da man keinen Decoder hat.


Bild 6. Programmablaufplan für die Lösung mit INC Programmablaufpläne


Bild 5. Programmablaufplan für die Lösung mit DJNZ
 

Assemblercode


א) von 6 bis 1 (mit DJNZ)
Code at 0000h

P1 equ 90h               ;Start-Stopp-Schalter
P2 equ 0A0h              ; Ausgabe erfolgt an der Adresse 0A0h

laden: mov R1, #06h      ; Wert 6 wird in R1 geladen
stopp:  JB P1.0,stopp   ; Bei geschaltetem Schalter (d.h.
                         ; bei gesetztem Bit) wird es zu Stopp
                         ; gesprungen
count: mov P2, R1        ; Hier erfolgt die Ausgabe an die
                         ; Adresse 0A0h (durchP2)
          djnzR1, stopp; Register wird um 1 verkleinert und
                         ; verzweigt,wenn Ergebnis ungleich
                         ; Null
          sjmpladen
end                      ; Ende des Programms
ב) von1 bis 6 (mit INC und CJNE)

Code at 0000h

P1 equ 90h               ; Register Start-Stopp-Schalter
P2 equ 0A0h              ;Ausgabe erfolgt an die Adresse
                         ; 0A0h
   
laden: mov R1, #01h      ;Wert 1 wird ins Register R1 geladen
stopp: JB P1.0, stopp    ; Bei geschaltetem Schalter (d. h.
                         ; bei gesetztemBit) wird es zu Stopp
                         ; gesprungen
count: mov P2, R1        ; Hier erfolgt die Ausgabe an die
                         ; Adresse 0A0h d.h. an P2
    inc R1              ; Registerinhalt wird umeins erhöht
    cjneR1, #07h, stopp; Ist Registerinhalt ungleich #07h,
                         ; erfolgt die Verzweigtzu Stopp
    sjmpladen           ;Es wird zu Laden gesprungen
end                      ; Ende des Programms

Ausgabe auf dieLPT-Schnittstelle
Ausgabe equ und mov

Bild 7. Auswahl der Schnittstelle LPT1 P2 equ 0A0h
mov P2, #data
Zuerst wird die Adresse 0A0hdem P2zugewiesen, danach werdendie Daten (#data) ausgegeben.Mit dem Befehl mov könneneiner bestimmten Adresse verschiedene Sachen zugeordnet werden z.B. Wert, Datenoder eine andere Adresse.
Auf diese Weise lässt sich auch die Ausgabe auf die LPTSchnittstelle und Parallele Schnittstelle realisieren.
In dem Programm 8051Win können wir dem Port eine Schnittstellezuweisen, bei dem Programm ist es LPT1.


Bild 8. Screenshot von 8051Win Ausgabe alsLeuchtbalken.
Aufgabe:Nun sollen die Zahlen nicht als ein binärer Wert von 0001 bis 0101 einfachausgegeben werden. Es soll ein Decoder Programmiert werden, welcher die Aufgabehat: Die Anzahl der LED, die leuchten, ist gleich der Zahl.
Erklärung:
Codierungstabelle fürdiese Aufgabe steht unten.
Die Binärzahlentspricht der daneben stehenden Hexzahl. Eine Lösungsvariante bestehtdarin, dass man diese Hexzahlen einfach der Reihe nach ausgibt, dabei muss aberjedes Mal geprüft werden, ob der Schalter auf „1“ gelegt wurde. Wenn ja, mussder Ablauf angehalten werden.
Codierungstabelle:
Ausgabewert
Hexzahl
Binärzahl
Eins
01h
0000 0001b
Zwei
03h
0000 0011b
Drei
07h
0000 0111b
Vier
0Fh
0000 1111b
Fünf
1Fh
0001 1111b
Sechs
3Fh
0011 1111b
Assemblercode(1d)


Code at 0000h

P1 equ 90h            ;Schalter
P2 equ 0A0h           ;LED's

count:                ;Programmpunkt für dieSchleife

mov P2, #01h          ;Wertausgabe, 1x LED leuchtet

stopp1:JB P1.0, stopp1 ;Bei gesetztem BitSTOP
mov P2, #03h          ;Wertausgabe, 2x LED's leuchten

stopp2:JB P1.0, stopp2   ;Bei gesetztem Bit STOP
mov P2, #07h         ;Wertausgabe, 3x LED's leuchten

stopp3:JB P1.0, stopp3   ;Bei gesetztem Bit STOP
mov P2, #0Fh         ;Wertausgabe, 4x LED's leuchten

stopp4:JB P1.0, stopp4   ;Bei gesetztem Bit STOP
mov P2, #1Fh          ;Wertausgabe, 5x LED's leuchten

stopp5:JB P1.0, stopp5   ;Bei gesetztem Bit STOP
mov P2, #3Fh          ;Wertausgabe, 6x LED's leuchten

stopp6:JB P1.0, stopp6   ;Bei gesetztem Bit STOP
sjmp count           ;Es wird zu count gesprungen

end





Programmablaufplan zu 1d


Bild 9. Programmablaufplan zu 1d

Aufgabe 2. Programmierung derBB-µC-Platine


Speicherarten und Harvard-Struktur
(אSpeicherarten
Ein µC-System benötigt immereinen Programm- und Datenspeicher. Der Inhalt des Programmspeichers wird vom Mikroprozessornur gelesen, während der Datenspeicher sowohl gelesen als auch beschriebenwird. Für den Programmspeicher werden deswegen ROMs (read only memory,lese-nur-Speicher) eingesetzt. Der Programmspeicher muss ein nichtflüchtigerSpeicher sein d.h. ein Speicher der seinen Inhalt auch dann nicht verliert,wenn die Versorgungsspannung abgeschaltet wird.
EEPROM (ElectricallyErasableProgrammable Read Only Memory)
Ist elektrischprogrammierbar und auch elektrisch löschbar. Das Programmieren und Löschenkann nicht beliebig schnell erfolgen, deswegen müssen dabei bestimmteMindestzeiten eingehalten werden.
Flash-Speicher
Hat im Vergleich zuEEPROM wesentlich kürzere Programmier- und Löschzeiten. Die Speicherzellenkönnen nicht mehr, wie im EEPROM einzeln sondern nur Blockweisegelöscht werden.
Diese Speicherart wirdim Mikrocontroller als eine Art des ROM Speichers (nur Lese-Speicher) benutzt.In ihm wird der Programmcode abgelegt. Bei der Abschaltung des Stromes gehendie Daten nicht verloren.
RAM-Speicher(RandomAccess Memory, Schreib-Lese-Speicher)
Für denDatenspeicher benötigt man einen Speicher, den man sehr schnell lesen undbeschreiben kann. Für diese Aufgabe verwendet man Halbleiterspeicher, dieauf der Basis von Flip-Flops aufgebaut sind.
RAM-Speicher verliertseine Daten bei Stormabschaltung, d. h. sie ist flüchtig. 
(בHarvard-Struktur

Bild 10. Harvard-Struktur Alle Microcontroller der Familie 8051verfügen über getrennteAdressierbereiche für den Programmspeicher und den Datenspeicher, welche am gleichen Adressbus liegen.
Der Zugriff auf den exteren Programmspeicher wird über das Signal  (Programm Store Enable) gesteuert. Für den Zugriff auf den Datenspeicherstehen die Signale  (read) und  (write) zur Verfügung. Die Struktur eines solchen Speichersystemswird Harvard-Struktur genannt.
Die Harvard Struktur wird während des normalen Betriebs desMikrocontrollers verwendet.

Zeitprogramm,Zeitberechnung

Bild 11. Das Auge merkt keine Pausen. Erklärung.
Das menschliche Auge ist in der Lage, die Ereignisse wahrzunehmen, dielänger, als ca.
Schleife:
zeit:DJNZ R1, zeit
Einmaligesdurchführen dieser Schleife (bei R1 = #01h) dauert bei unserem µC 2 µs.
Man programmiere eineSchleife, die ca. 0,2 s läuft. 1 s entspricht 100 000 Schleifen:

Folglich brauchen wirsie 100 000 durchlaufen zu lassen, um 0,2 s Zeitpause zu bekommen.
Unterprogramm
Unterprogramm
uptime:
mov R3, #10            ; lädt 10 in R3 ein
loop3: mov R2,#100    ; Unterschleife; lädt 100 inR2 ein
loop2: mov R1,#100    ; Unterschleife; lädt 100 inR2 ein
loop1: djnz R1,loop1  ; bedingter Sprung zurück
       djnz R2, loop2  ; bedingter Sprung zurück
       djnz R3, loop3  ; bedingter Sprung zurück
RET                         ; Das Programm wird an der Stelle
                            ;fortgesetzt, an der das Unter-
                            ; programmaufgerufen wurde, also
                            ; nach der lcall uptime
Das Unterprogramm wird aufgerufen, durchgeführt und mit RET kehrt man an den Punkt zurück,von welchem es aufgerufen wurde.
Stackpointer und Stackspeicher.
Die Adresse, an die es zurückspringen muss, wird im Stack-Speicher gespeichert. Der Stackpointer zeigt auf den Platz imStack-Speicher, in dem die Adresse gespeichert ist.
Ein Stackdient somit zur Zwischenspeicherung der Rücksprungsadressen beiUnterprogrammen.

Zählerausgabeauf die LED-Reihe.
Erklärung
Die Lösung istwie bei № 1d, jedoch mit einer Erweiterung:
Zwischen den Ausgabenvon Zahlen wird jedes Mal ein Unterprogramm „up1sek“ aufgerufen. DasUnterprogramm verbraucht die Zeit von etwa 1Sekunde. Danach wird das Programmweiter an dem Punkt fortgesetzt von dem das Unterprogramm aufgerufen wurde.
Unterprogramm:
In die Register R1,R2, R3 wird jeweils eine Dezimalzahl unmittelbar geladen. In einer Schleife werdendiese Zahlen bis Null runtergezählt. Danach wird es wieder mit RET an den Punktdes Aufrufs zurückgesprungen.

Assemblercode
Code at 0000h

P1 equ 90h             ; Schalter
P2 equ 0A0h            ; LEDs

count:                 ; Anfang der Hauptschleife

mov P2,#01h           ; 1 LED ist an.
lcall uptime           ; Aufruf des Unterprogramms fürPause
stopp1: JB P1.0, stopp1; Beim gesetzten bitstoppen.
mov P2, #03h           ; 2 LEDs ist an.
lcall uptime           ; Aufruf des Unterprogramms fürPause
stopp2: JB P1.0, stopp2; Beim gesetzten bitstoppen.
mov P2, 07h            ; 3 LEDs ist an.
lcall uptime          ; Aufruf des Unterprogrammsfür Pause
stopp3: JB P1.0, stopp3; Beim gesetzten bitstoppen.
mov P2, 0Fh            ; 4 LEDs ist an.
;
lcall uptime           ; Aufruf des Unterprogramms fürPause
stopp4: JB P1.0, stopp4; Beim gesetzten bitstoppen.
mov P2, 1Fh            ; 5 LEDs ist an.
; lcalluptime           ; Aufruf desUnterprogramms für Pause
stopp5: JB P1.0, stopp5; Beim gesetzten bitstoppen.
mov P2, 3Fh            ; 6 LEDs ist an.
lcall uptime           ; Aufruf des Unterprogramms fürPause
stopp6: JB P1.0, stopp6; Beim gesetzten bitstoppen.
;
ORG 0F0h

uptime:
mov R3, #10            ; lädt 10 in R3 ein
loop3: mov R2,#100    ; Unterschleife; lädt 100 inR2 ein
loop2: mov R1,#100    ; Unterschleife; lädt 100 inR2 ein
loop1: djnz R1,loop1  ; bedingter Sprung zurück
       djnz R2, loop2  ; bedingter Sprung zurück
       djnz R3, loop3  ; bedingter Sprung zurück
RET                         ; Das Programm wird an der Stelle
                            ;fortgesetzt, an der das Unter-
                            ; programm aufgerufen wurde,also
                            ; nach der lcall uptime
END

Programmablaufpläne (siehe auch 1d)

Bild 12. Programmablaufplan der Aufgabe 2
Bild 13. Unterprogrammablaufplan für die Zeitpause „uptime“

Aufgabe 3. 8051Win-Simulationvon Würfelmodell
Hexzahlenberechnung fürdie Ausgabe auf dem Würfel-2 in 8051WinW-Anzeige
4
2
1
8
4
2
1
Dual
Hexergebnis Belegung
- D6
D5
D4
D3
D2
D1
D0
    linke hex – rechte hex
- Augenzahl 1
0
0
0
0
1
0
0
0
8
08h Augenzahl 2
0
0
1
0
0
0
1
0
2 – 2
22h Augenzahl 3
0
0
1
0
1
0
1
0
    2 – 8+2
2Ah Augenzahl 4
0
1
0
1
0
1
0
1
 4+1 – 4+1
55h Augenzahl 5
0
1
0
1
1
1
0
1
     4+1 – 8+4+1
5Dh Augenzahl 6
0
1
1
1
0
1
1
1
4+2+1 – 4+2+1
77H
 
a)Würfelmodell mit integriertem Decoder

Bild 15. Screenshot von 8051Win

Erklärung
Da der Würfeleinen integrierten Decoder besitzt, kann der Zähler aus der Aufgabe 1benutzt werden. Dieser Zähler gibt die Zahlen an P2 aus. Der Decoderwandelt die Zahlen in entsprechend andere Zahlen, damit die Würfelaugenrichtig leuchten.
Assemblercode
Code at 0000h

P1equ 90h               ; Start/Stopp Schalter
P2equ 0A0h              ; Ausgabe erfolgt an der Adresse 0A0h
   
laden:mov R1, #01h      ; Wert #01h wird ins Register R1 geladen
stopp:  JB P1.0,stopp   ; Bei geschaltetem Schalter (gesetztem
                         ; Bit) wird es zuStopp gesprungen.
mov P2, R1        ; Hier erfolgt die Ausgabe an Adresse 0A0h,
                         ; d. h. an P2.
    inc R1               ;Registerinhalt wird um eins erhöht.
    cjneR1, #07h, stopp; Wenn Registerinhalt ungleich #07h ist,
                         ; dann verzweigt das Programm zu Stopp
    sjmpladen           ; Es wird zu Laden gesprungen
End

Programmablaufplan


Bild 16. Programmablaufplan vom Würfelmodell mit integriertem Decoder



Bild 17. Screenshot von 8051Win b) Würfelmodell ohne Decodermit indirekter Adressierung
Erklärung

Bild 18. Zwei Würfelaugen leuchten.
Bei dieser Aufgabe besitzt der Würfel keinen integrierten Decoder,die Würfelaugen müssen trotzdem richtig leuchten. Das heißt,dass bei einer Zwei auch die richtigen zwei Würfelaugen leuchten müssen(s. Bild 18). Die folgende Codierungstabelle enthält die Hexzahlen, diefür jeden Ausgabewert (1 bis 6) die richtigen Würfelaugen zum Leuchtenbringen.
Ausgabewert
Hexzahl
Eins
08h
Zwei
41h
Drei
49h
Vier
55h
Fünf
5D4
Sechs
77h
Diese Hexzahlenwerden gemäß der Aufgabestellung im Adressbereich 31h…36h abgespeichert. Der Zählergeht dann diesen Adressbereich immer wieder durch. Durch die indirekte Adressierung werden dieseHexzahlen nacheinander ausgegeben.

Assemblercode
Code at 0000h

P1equ 90h   ; Schalter
P2equ 0A0h  ; Ausgabe
;Decoder:
;es werden bestimmte Werte in dem
;Adressbereich 31h bis 36h
;abgespeichert
;------------------------
mov 31h, #08h
mov 32h, #41h
mov 33h, #49h
mov 34h, #55h
mov 35h, #5Dh
mov 36h, #77h
;------------------------
laden:mov R1, #31h   ; im R1 wird der Wert
                      ; 31h abgespeichert
       movA, @R1     ; in A steht jetzt der
                      ; Wert 08h (indirekte
                      ; Andressierung)
       movP2, A      ; Akkuinhalt wird
                      ; ausgegeben

stopp:JB P1.0, stopp;Stopp/Start-Schalter

count:
inc R1                ; erhohe R1
mov A, @R1            ; in A wird der Wert der
                      ; Adresse, welche in R1
                      ; steht, abgespeichert.
mov P2, A             ; Ausgabe des Akkuinhalts
cjne A, #77h, stopp   ; Verzweigen zum Stopp bei
                      ; Ungleichheit.

sjmp laden            ; Sprung zum Laden

END


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Исследование и анализ проблематики квалифицированного и особо квалифицированного состава изнасилования
Реферат Штоколов Борис Тимофеевич
Реферат 1 Оказание доврачебной медицинской помощи при неотложных состояниях взрослому населению
Реферат Иван Флягин в повести Лескова Очарованный странник
Реферат Тема «маленького человека» в произведениях Федора Михайловича Достоевского
Реферат Методичка по Excel 2000
Реферат Cols=2 gutter=12> Башкирская государственная филармония им. Х. Ахметова
Реферат Право на объект интеллектуальной собственности
Реферат Вопросы правоведения
Реферат Oral Notes
Реферат Законы спроса и предложения и их роль в установлении равновесной рыночной цены
Реферат Использование в маркетинговых исследованиях интернет - возможностей
Реферат JRR Tolkien Middle Earth Essay Research Paper
Реферат Can Computers Understand Essay Research Paper Can
Реферат Publication Of The AfricanAmerican Mosaic A Library