Zadaci i rešenja za 8051 mikrokontroler: asemblerski program u A51 za prekide, tajmere, UART, tastaturu i displej
Enviado por Anónimo y clasificado en Otras materias
Escrito el en
serbocroata con un tamaño de 20,38 KB
Zadaci i rešenja za 8051 mikrokontroler u asembleru A51
1. ZADATAK Koristeći logiku spoljašnjih prekida projektovati, na bazi mikrokontrolera 8051, kontroler peći koji održava temperaturu u prostoriji na 20°C ± 2°C. Za ovaj zadatak pretpostaviti sledeći interfejs: Solenoid putem kog se uključuje/isključuje peć je povezan na pin P2.0 tako da za:
- P2.0 = 1 peć je uključena (solenoid aktivan)
- P2.0 = 0 peć je isključena (solenoid neaktivan)
Senzori temperature su povezani na pinove spoljašnjeg prekida /INT0 (P3.2) i /INT1 (P3.3) i obezbeđuju HOT i COLD signale, respektivno, tako da je:
- HOT = 0, ako je T > 22°C
- COLD = 0, ako je T < 18°C
Program bi trebao da uključi peć u slučaju da je temperatura T < 18°C, i isključi je ako je temperatura T > 22°C.
1. REŠENJE
$NOMOD51 / $INCLUDE(REG52.INC) / CSEG AT 0000H / LJMP START / CSEG AT 0003H / EX0_ISR: CLR P1.0 / RETI / CSEG AT 0013H / EX1_ISR: SETB P1.0 / RETI / RSEG PROGRAM / START: CLR P1.0 / MOV IE,#85H / SETB IT0 / SETB IT1 / MAIN_LOOP: SJMP MAIN_LOOP / END
2. ZADATAK
Napisati program na asemblerskom jeziku A51 kojim se BCD cifre prikazuju na 7-segmentnom cifarskom displeju sa zajedničkom katodom. Pretpostavimo da su BCD cifre smeštene u unutrašnjoj memoriji za podatke (IRAM) na lokacijama 70H i 71H. Lokacijama pristupamo koristeći registarsko indirektni način adresiranja korišćenjem registra R0. Inicijalizacija prikaza prve cifre ostvaruje se pritiskom na taster T1 koji je povezan na pin P1.0, a prikaz druge cifre pritiskom na taster T2 koji je povezan na pin P1.1. Nakon pritiska tastera pozvati potprogram za konverziju BCD cifre u sedmosegmentni kod, koji je realizovan korišćenjem look-up tabele i pristupa joj se putem DPTR registra. Dobijeni kod se putem P2 porta šalje na cifarski displej. Nakon završetka procesa prikaza cifara iniciranih pritiskom tastera program nema drugih aktivnosti.
Napomena: Sve dok se ne pritisne taster T1 (zatim taster T2) program je "zaglavljen", tj. primenjuje se metoda prozivke (polling)! Taster je aktivan sa nulom.
2. REŠENJE
$NOMOD51/$INCLUDE (REG51.INC)/CSEG AT 0000H/LJMP START/RSEG PROGRAM/ORG 0030H/START:/MOV P1, #0FFH/MOV P2, #00H/WAIT_T1:/JB P1.0, WAIT_T1/MOV R0, #70H/ACALL DISPLAY/WAIT_T2:/JB P1.1, WAIT_T2/MOV R0, #71H/ACALL DISPLAY/SJMP $/DISPLAY:/MOV A, @R0/MOVC A, @A+DPTR/MOV P2, A/RET/TABLE:/DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH/END
3. ZADATAK
Napisati program na asemblerskom jeziku A51 za jednostavan protiv-provalni alarmni sistem. Projekat je realizovan kao četvorozonski alarmni sistem protiv provale, uz korišćenje odgovarajućih portova 8051 mikrokontrolera.
Port 3 (P3) se koristi kao ulazni port. Na četiri ulazna pina P3.0 do P3.3 povezane su zasebne alarmne zone. Jedna zona se sastoji od niza normalno zatvorenih prekidača. Kada se bilo koji od ovih prekidača otvori, što znači da je narušen prostor pod zaštitom, odgovarajući ulazni pin prelazi na visok nivo i procesor postaje svestan alarmne situacije za odgovarajuću zonu. Preostali pinovi porta P3 se ne koriste i vezani su na masu (GND).
Izlaz sistema se sastoji od sedmosegmentnog cifarskog displeja za prikaz rednog broja zone koja je narušena i alarmnog zvona. Alarmno zvono je povezano na pin P1.7 i oglašava se kada je ovaj pin postavljen na logički visok nivo od strane softvera. Sedmosegmentni displej je povezan na pinove P1.0 do P1.6. Svaki izlazni pin se dovodi do odgovarajućeg segmenta preko neinvertujućeg bafera. Sedmosegmentni displej je sa zajedničkom katodom, što znači da se segment pali logičkom jedinicom. Za generisanje sedmosegmentnog koda koristiti look-up tabelu kojoj pristupamo pomoću registra DPTR. Za slučaj da je više zona istovremeno aktivirano, na displeju će se prikazati slovo C (Combination), čime se iskazuje kombinacija aktiviranih zona.
3. REŠENJE
$NOMOD51/$INCLUDE(REG52.INC)/CSEG AT 0000H/LJMP START/RSEG PROGRAM/LETTER_C EQU 00111001B/START: MOV P3,#0FFH/MOV A,#0/MOV DPTR,#TABLE/MOVC A,@A+DPTR/MOV P1,A/CLR P1.7/TEST: MOV A,P3/CJNE A,#00H,ALARM/LJMP TEST/ALARM: TEST_ZONA_1: CJNE A,#00000001B,TEST_ZONA_2/MOV A,#1/MOV DPTR,#TABLE/MOVC A,@A+DPTR/MOV P1,A/LJMP BELL_ON/TEST_ZONA_2: CJNE A,#00000010B,TEST_ZONA_3/MOV A,#2/MOV DPTR,#TABLE/MOVC A,@A+DPTR/MOV P1,A/LJMP BELL_ON/TEST_ZONA_3: CJNE A,#00000100B,TEST_ZONA_4/MOV A,#3/MOV DPTR,#TABLE/MOVC A,@A+DPTR/MOV P1,A/LJMP BELL_ON/TEST_ZONA_4: CJNE A,#00001000B,COMBINATION/MOV A,#4/MOV DPTR,#TABLE/MOVC A,@A+DPTR/MOV P1,A/LJMP BELL_ON/COMBINATION: MOV P1,#LETTER_C/BELL_ON: SETB P1.7/JMP $/TABLE: DB 00111111B,00000110B,01011011B,01001111B,01100110B/END
4. ZADATAK
Opisati periferiju UART (Universal Asynchronous Receiver-Transmitter) kod mikrokontrolera 8051 i izvršiti poređenje generisanja bitske brzine prenosa od 9600 bps za frekvenciju oscilatora Fosc = 11.0592 MHz i Fosc = 12 MHz, koristeći tajmer T1 u 8-bitnom auto-reload režimu rada. Dati kod inicijalizacije u asembleru A51 kao potprogram.
4. REŠENJE
Slika 38.5 i slika 40.5. Za Fosc = 11.0592 MHz: TH1 = 256 − Fosc / (12 × 32 × Baud) = 256 − 11059200 / (12 × 32 × 9600) = 256 − 3 = FDH. Za Fosc = 12 MHz: TH1 = 256 − 12000000 / (12 × 32 × 9600) = 256 − 3.255 ≈ FCH.
Kod: MOV TMOD, #20H / MOV TH1, #0FDH / (MOV TH1, #0FCH) / MOV SCON, #50H / SETB TR1 / CLR TI / CLR RI / RET
5. ZADATAK
Napisati program na asemblerskom jeziku A51 koji kontinualno, u beskonačnoj petlji, čita status pina P1.7 i šalje ga na pin P1.0. Istovremeno kreira pravougaoni talasni oblik periode 200 µs na pinu P2.5. Pretpostaviti da je frekvencija spoljašnjeg oscilatora 12 MHz, a da se za potrebe realizacije talasnog oblika koristi tajmer T0 u 8-bitnom auto-reload režimu rada. Program realizovati kao jedinstveni programski modul sa uslužno-prekidnom rutinom tajmera T0 u okviru koje se generiše talasni oblik sa faktorom ispune od 50%.
5. REŠENJE
$NOMOD51 / $INCLUDE(REG52.INC) / PROGRAM SEGMENT CODE / CSEG AT 0000H / LJMP MAIN / RSEG PROGRAM / MAIN: / MOV TMOD,#02H / MOV TH0,#-100 / MOV TL0,TH0 / SETB TR0 / MOV IE,#82H / LOOP: / MOV C,P1.7 / MOV P1.0,C / SJMP LOOP / CSEG AT 000BH / T0_ISR: / CPL P2.5 / CLR TF0 / RETI / END
5.1 ZADATAK
Isti zadatak kao pod 5, ali sa faktorom ispune od 25%.
5.1 REŠENJE
ORG 0000H / LJMP START / ORG 0030H / START: / MOV TMOD, #02H / MOV TH0, #0F3H / ; inicijalna vrednost TH0 za LOW fazu / SETB TR0 / SETB EA / SETB ET0 / CLR P2.5 / SJMP $ / T0_ISR: / CPL P2.5 / MOV A, P2.5 / CJNE A, #0, HIGH_PHASE / ; ako je HIGH faza / MOV TH0, #0CCH / SJMP END_ISR / HIGH_PHASE: / MOV TH0, #0F3H / END_ISR: / CLR TF0 / RETI
6. ZADATAK
Napisati program na asemblerskom jeziku A51 za analizu tastature veličine 8×8 tastera (opšti slučaj) uz pamćenje prethodnog i tekuće očitanog stanja u unutrašnjoj memoriji za podatke. To podrazumeva da su neophodna dva bloka podataka od po 8 bajtova (dva bafera): jedan za prethodno očitanu vrednost i jedan za tekuće očitanu vrednost. Bafere realizovati kao apsolutno definisane segmente u indirektno adresibilnom prostoru podataka tako da OldBuf (prethodno očitana vrednost) počne od lokacije 80H, a NewBuf (tekuće očitana vrednost) počne od lokacije 88H (dakle u tzv. gornjih 128 bajtova memorije). U procesu analize tastature primeniti princip "šetajuće nule".
6. REŠENJE
OldBuf SEGMENT DATA AT 080H / DB 00H,00H,00H,00H,00H,00H,00H,00H / NewBuf SEGMENT DATA AT 088H / DB 00H,00H,00H,00H,00H,00H,00H,00H / ORG 0000H / LJMP MAIN / MAIN: MOV DPTR,#080H / MOV R0,#00H / MOV R1,#08H / ACALL ReadKeyboard / SJMP MAIN / ReadKeyboard: MOV R2,#08H / MOV R3,#00H / ReadRow: MOV A,#0FEH / CPL A / MOV P1,A / NOP / MOV R4,#08H / ReadCol: MOV C,P0.0 / MOV BITVAL,C / MOV A,@DPTR / ANL A,#0FEH / ORL A,BITVAL / MOV @DPTR,A / INC DPTR / DJNZ R4,ReadCol / INC R3 / DJNZ R2,ReadRow / RET
6.1 ZADATAK
Napisati program na asemblerskom jeziku A51 za analizu tastature veličine 8×8 tastera (opšti slučaj) uz pamćenje prethodnog i tekuće očitanog stanja u unutrašnjoj memoriji za podatke. Bafere realizovati kao apsolutno definisane segmente u indirektno adresabilnom prostoru podataka tako da OldBuf (prethodno očitana vrednost) počne od lokacije E0H, a NewBuf (tekuće očitana vrednost) počne od lokacije E8H. U procesu analize tastature primeniti princip "šetajuće nule".
6.1 REŠENJE
ORG 0000H / LJMP START / ORG 00E0H / OldBuf: DS 8 / NewBuf: DS 8 / ORG 0030H / START: / MOV R0, #00H / MOV R1, #08H / READ_LOOP: / MOV A, @R0 / MOV @R1, A / ACALL SCAN_KEY / INC R0 / INC R1 / CJNE R0, #08H, READ_LOOP / SJMP READ_LOOP / SCAN_KEY: / ; logika šetajuće nule / RET
7. ZADATAK
Napisati program na asemblerskom jeziku A51 kojim se realizuje konverzija binarnog broja smeštenog u akumulator (prenos parametara se ostvaruje putem akumulatora) u odgovarajući sedmosegmentni cifarski kod displeja korišćenjem look-up tabele. Sedmosegmentni displej je realizovan sa zajedničkom katodom, kako je to prikazano na slici 1.
Napomena: Za potrebe testiranja pretpostaviti da je na početku vrednost parametra koji se prenosi putem akumulatora ACC = 7. U procesu pristupa look-up tabeli koristiti registar DPTR.
7. REŠENJE
ORG 0000H / MOV A,#07 / MOV DPTR,#LOOKUP / MOVC A,@A+DPTR / MOV P1,A / SJMP $ / LOOKUP: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH / END
8. ZADATAK
Napisati program na asemblerskom jeziku A51 kojim se realizuje konverzija binarnog broja smeštenog u akumulator (prenos parametara se ostvaruje putem akumulatora) u odgovarajući sedmosegmentni cifarski kod displeja korišćenjem look-up tabele pomoću DPTR registra. Sedmosegmentni displej je realizovan sa zajedničkom anodom, kako je to prikazano na slici 1.
Napomena: Za potrebe testiranja pretpostaviti da je na početku vrednost parametra koji se prenosi putem akumulatora ACC = 8.
8. REŠENJE
ORG 0000H / MOV A,#8 / MOV DPTR,#LOOKUP / MOVC A,@A+DPTR / CPL A / MOV P1,A / SJMP $ / LOOKUP: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH / END
9. ZADATAK
Napisati program na asemblerskom jeziku A51 koji konvertuje niz od 5 BCD cifara u ASCII kod, koristeći osobinu ASCII prezentacije cifara od 0 do 9. Prenos parametara se vrši preko niza koji je smešten u unutrašnju memoriju; nizu se obraćamo registarski indirektnim načinom adresiranja, sa početnom adresom niza smeštenom u registar R1, dok registar R5 koristimo kao brojački registar.
Napomena: Tabelu učiniti globalno vidljivom, čime omogućavamo njeno pozivanje iz bilo kog drugog programskog modula.
9. REŠENJE
ORG 00H / MOV R1,#30H / MOV R5,#05 / LOOP: MOV A,@R1 / MOV DPTR,#ASCII_TABLE / MOVC A,@A+DPTR / MOV @R1,A / INC R1 / DJNZ R5,LOOP / END / ASCII_TABLE: DB '0','1','2','3','4','5','6','7','8','9'
10. ZADATAK
Projektovati kontroler koji održava određeni nivo osvetljenja u prostoriji, koristeći logiku spoljašnjih prekida i mikrokontroler 8051. Interfejs za kontrolu osvetljenja je definisan na sledeći način:
- a) Uređaj koji kontroliše osvetljenje je povezan na pin P2.0, gde: i. P2.0 = 1 označava da je osvetljenje uključeno; ii. P2.0 = 0 označava da je osvetljenje isključeno;
- b) Senzori osvetljenja su povezani na pinove spoljašnjih prekida /INT0 (P3.2) i /INT1 (P3.3), pružajući signale DARK i BRIGHT, respektivno.
Program treba da aktivira svetlo kada je nivo osvetljenja ispod praga (DARK = 0), i isključi ga kada je nivo osvetljenja iznad praga (BRIGHT = 0). Oba spoljašnja prekida moraju biti konfigurisana kao aktivna na rastućoj ivici signala (edge triggered, rising edge). Prekidu INT1 dodeliti najviši prioritet.
Napomena: Program treba biti napisan u asembleru za mikrokontroler C8051F340.
10. REŠENJE
ORG 0000H / LJMP START / ORG 0030H / START: / MOV P2, #00H / MOV IE, #89H / SETB P3.2 / SETB P3.3 / SJMP $ / INT0_ISR: / MOV P2.0, #01H / RETI / INT1_ISR: / MOV P2.0, #00H / RETI
11. ZADATAK
Korisnik živi u pametnoj kući i ima problem sa nesanicom. Želi da mu se u sobi za odmor automatski spuštaju roletne kad padne mrak, kako bi imao kvalitetniji san, a da se automatski podižu kada osvane dan. Projektovati, na bazi mikrokontrolera 8051, kontroler roletni koji ima zadatak da spusti roletne kada padne mrak i podigne ih kada osvane dan.
Izlaz foto-senzora je povezan na pin P2.0 i šalje bit 1 kada količina svetlosti padne ispod praga detekcije (kada padne mrak). Mehanizam podizanja i spuštanja roletni kontroliše se signalom koji se šalje putem pina P1.7: ukoliko je bit 0, roletne se spuštaju; ukoliko je bit 1, roletne se podižu. Ukoliko su roletne spuštene, ispisuje se karakter "P" (pm), a ukoliko su podignute, karakter "A" (am) na sedmosegmentni cifarski displej koji je povezan na pinove od P1.0 do P1.6. Karakteri se prosleđuju putem look-up tabele kojoj se pristupa putem DPTR registra.
Napomena: U zadatku se primenjuje metoda prozivke (polling). U procesu izrade zadatka koristiti šematski prikaz sedmosegmentnog displeja sa slike 1. U zadatku je potrebno uraditi jedno ispitivanje, a zatim "zaglaviti" program (beskonačna petlja).
11. REŠENJE
ORG 0000H / LJMP START / ORG 0030H / START: / MOV P1.7, #0 / MOV P1, #00H / MOV DPTR, #LOOKUP / JB P2.0, LIGHT_ON / LIGHT_OFF / LIGHT_ON: / MOV P1.7, #01H / MOV A, #'A' / ACALL DISP / SJMP $ / LIGHT_OFF: / MOV P1.7, #00H / MOV A, #'P' / ACALL DISP / SJMP $ / DISP: / MOVC A, @A+DPTR / MOV P1, A / RET / LOOKUP: / DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
12. ZADATAK
Napisati kod na asemblerskom jeziku A51 za realizaciju alarmnog sistema u prostoriji, koristeći mikrokontroler C8051F340. Sistem funkcioniše tako da se alarm aktivira pritiskom na taster T1, koji je povezan na spoljašnji prekid INT0 uz pull-up otpornik. Aktivacija alarma treba da pokrene generisanje zvučnog signala na zvučniku povezanom na pin P1.7, pri čemu ton ima talasni oblik periode 200 µs. Generisanje talasnog oblika realizuje se putem tajmera T0, koristeći prekidnu rutinu, tako da izlazni signal ima 50% ispune. Isključenje alarma obavlja ovlašćeni operater pritiskom na taster "OK", koji je povezan na pin P1.2 i koristi pull-down otpornik. Pritiskom ovog tastera alarm se deaktivira i zvučnik prestaje da emituje ton. Mikrokontroler koristi spoljašnji kristal frekvencije 12 MHz; u okviru zadatka je potrebno i odrediti broj taktova potrebnih za precizno generisanje perioda talasa na izlazu. Spoljašnji prekid INT0 treba da bude aktiviran na opadajuću ivicu signala (edge trigger).
12. REŠENJE
-12 MHz kristal → 1 ciklus = 1 / 12 MHz ≈ 0.083 µs po ciklusu.
-Period 200 µs → broj ciklusa = 200 µs / 0.083 µs ≈ 2400 ciklusa za ceo period.
-Za 50% ispune → T0 mora da prebrojava 1200 ciklusa po polovini perioda.
Kod: ORG 0000H / LJMP START / ORG 0030H / START: / MOV P1, #80H / MOV TCON, #01H / MOV TMOD, #02H / SETB TR0 / SETB IT0 / SJMP $ / INT0_ISR: / MOV R0, #01H / SETB TR0 / RETI / T0_ISR: / CPL P1.7 / MOV TH0, #FBH / MOV TL0, #30H / RETI / CHECK_OK: / JB P1.2, ALARM_OFF / SJMP $ / ALARM_OFF: / CLR R0 / CLR P1.7 / CLR TR0 / SJMP $
13. ZADATAK
Napisati program na asemblerskom jeziku A51 za interakciju između korisnika i sistema ulaza/izlaza u industrijskom postrojenju pomoću tastature. Postrojenje ima razne senzore i prekidače povezane sa mikrokontrolerom. Mikrokontroler koristi tastaturu veličine 8×8 tastera za interakciju sa korisnicima. Za realizaciju sistema za interakciju koristimo dva bloka podataka od po 8 bajtova za pamćenje prethodnih i tekućih očitanih stanja tastature. Baferi će biti implementirani kao apsolutno definisani segmenti u indirektno adresibilnom prostoru podataka. OldBuf, koji sadrži prethodno očitana stanja, počinje od lokacije A0H, dok NewBuf, koji sadrži tekuća očitana stanja, počinje od lokacije A8H. Prilikom analize tastature koristićemo princip "šetajuće nule".
13. REŠENJE
ORG 0000H / LJMP START / ORG 0030H / START: / MOV DPTR, #A0H / MOV R0, #08H / MOV R1, #08H / CLR A / MOV R2, #00H / SCAN_ROW: / MOV R3, #01H / MOV R4, #00H / SCAN_BIT: / MOV A, @R3 / MOVX @DPTR, A / SWAP R3 / RL A / INC DPTR / INC R4 / CJNE R4, #08H, SCAN_BIT / INC R2 / CJNE R2, #08H, SCAN_ROW / SJMP $
14. ZADATAK
Napisati program na asemblerskom jeziku A51 koji kreira pravougaoni talasni oblik na pinu P1.0, frekvencije 1 kHz, realizovan korišćenjem tajmera T0. Frekvencija kristala je 11.0592 Hz. Faktor ispune je 50%.
14. REŠENJE
ORG 0000H / LJMP START / ORG 0030H / START: / MOV TMOD, #02H / MOV TH0, #0FAH / SETB TR0 / SETB EA / SETB ET0 / CLR P1.0 / SJMP $ / T0_ISR: / CPL P1.0 / MOV TH0, #0FAH / CLR TF0 / RETI
14.1 ZADATAK
Napisati program na asemblerskom jeziku A51 koji kreira pravougaoni talasni oblik na pinu P1.0, frekvencije 1 kHz, realizovan korišćenjem tajmera T0. Frekvencija kristala je 11.0592 Hz. Faktor ispune je 25%.
14.1 REŠENJE
ORG 0000H / LJMP START / ORG 0030H / START: / MOV TMOD, #02H / MOV TH0, #0F4H / SETB TR0 / SETB EA / SETB ET0 / CLR P1.0 / SJMP $ / T0_ISR: / CPL P1.0 / MOV TH0, #0F4H / CLR TF0 / RETI