8051 Çalışma Soruları
1. İndeks adresleme modu örneği: P1 portundan okunan bir değerin karesini P2 portuna gönderen programın assembly kodunu yazınız. (Açıklama: P1 portundan okunan değer 0-9 arasında olsun. Bu sayıların kareleri “look up table” içerisine yüklensin ve oradan hazır olarak kullanılsın. Sayıların karesini hesaplamak için herhangi bir kod yazılmayacak.)
2. Zamanlayıcı mod-1 örneği: Zamanlayıcı-0 kullanarak P1.5 (P1 portunun 5. pini)pininde “duty cycle” oranı %50 olan, 1 KHz kare dalga üreten programın assembly kodunu yazınız. (Açıklama: duty cycle, bir kare dalga işaretinin bir periyot boyunca lojik 1 olduğu sürenin toplam periyoda oranıdır.)
3. Sayıcı örneği: T1 pinindeki (P3 portunun 5. pini – P3.5) darbeleri sayan ve toplam darbe sayısını P2 portunda gösteren alt programın assembly kodunu yazınız.
4. Aritmetik işlem örnekleri: Verilen işlemleri hex tabanda hesaplayınız.
0x55+0xBB, 0x8000+0x2345, 0x2400-0x1ABC, 0x4000-0x0AED
5. Akümülatör örneği: Belirtilen işlemleri yerine getiren assembly kodunu yazınız.
ACC’ye 0x55 ve B’ye 0x32 değerlerini kopyalayın ve daha sonra bu değerleri toplayın.
0x25 ve 0x44 değerlerini toplayın ve sonucu R3’e kopyalayın.
6. Bayrak örnekleri: Aşağıdaki işlemler gerçekleştikten sonraki bayrak durumlarını yazınız. (Açıklama: Bu işlemlerden önce bayrak durumlarının ‘0’ olduğunu varsayın.)
mov A, #3AH
ADD A, #3FH
mov A, 9CH
ADD A, 64H
7. Yığın örneği: Belirtilen kod parçasının herbir satırı için; yığın(stack), yığın işaretçisi(sp=stack pointer) ve etkilenen register içeriklerini yazınız. Yığın işaretçisinin 7H adresinde (SP=0x07) olduğunu varsayın.
mov R2, #55H
mov R5, #0CCH
mov R1, #0ADH
push 2
push 5
push 1
pop 2
pop 1
pop 5
8. Döngü örneği: Akümülatörün içeriğini temizleyen ve daha sonra 10 defa 0x05 değerini akümülatöre ekleyen programın assembly kodunu yazınız. (Açıklama: DJNZ komutunu kullanın.)
9. R1, R2 ve R3 saklayıcılarının içeriklerini toplayan programın assembly kodunu yazın. Sonuç en fazla 10 bit uzunluğunda olabilir. Sonucun düşük değerlikli 8 biti R4 saklayıcısında, kalan kısmı ise R5 saklayıcısında depolansın. (Açıklama: Program dallanmaları carry bitinin kontrol edildiği komutlarla yapılsın.)
10. P1.0 pini üzreinde %50 duty cycle(on=off=600us) kare dalga üreten programın assembly kodunu yazınız. Gecikme fonksiyonunu alt program olarak yazın(2 ardışıl DJNZ döngüsü).
Kristal frekansı: 11.0592MHz
600us için çevrim sayısı: 599 (yaklaşık olarak)
Bir DJNZ döngüsü için max gecikme: 255*2+1=511
11. “Hello World!” string değerini kod belleğinin 8200h adresine ORG ve DB komutlarıyla kaydeden ve bu string değerini 50H adresinden başlayarak yazan programın assembly kodunu yazınız. (Açıklama: MOVC komutunu kullanın, programın ilk satırı 8030H adresinden başlatılmalıdır.)
12. Akümülatörde içerisindeki 0’ları sayan programın assembly kodunu yazınız. (Açıklama: Koşullu atlama ve döndürme komutlarını kullanın. Programın ilk satırı 8030H adresinden başlasın.)
13. R0, R1, R2 ve R3 kaydedicilerinin içine belli hexadecimal değerler yükleyen ve bunların toplamını hesaplayan programın assembly kodunu yazınız. (Açıklama: Program 30H adresinden başlasın, sonuç 7FFFH adresine kaydedilsin.)
14. P1.3 pinine bağlı bir LED bulunmaktadır. Bu LED’i kesme hizmeti programı yardımıyla belli bir süre yakan ve söndüren programın assembly kodunu yazınız. (Açıklama: Belli bir süre yanması için R3 saklayıcısına 255 değerini yükleyin ve DJNZ ile döngü kurun.)
15. Zamanlayıcı-0 ile P1.2 pini üzerinde kesme hizmet programı kullanarak kare dalga üreten programın assembly kodunu yazınız. (Açıklama: Zamanlayıcı-0, MOD-1 kullanın ve T0 içine 0AA55H değerini yükleyin.)
16. ‘A’ harfini karakter olarak 9600 baud hızında sürekli olarak seri porta gönderen programın assembly kodunu yazınız. (Açıklama: Zamanlayıcı-1 kullanın ve -3 değerini yükleyin.)
17. 9600 baud sürekli olarak seri porttan değer alan ve bu değerleri P1 portunda gösteren programın assembly kodunu yazınız. (Açıklama: Zamanlayıcı-1 kullanın ve -3 değerini yükleyin.)
18. P1 portuna bağlı harici kesme ucunda bir tetikleme olduğunda, P1 portundaki değeri R0 saklayıcısına kopyalayan progamın assembly kodunu yazınız. (Açıklama: Harici kesme olarak INT0’ı kullanın.)
19. P1 portuna bağlı harici kesme ucunda bir tetikleme olduğunda, baud hızı 9600 olacak şekilde P1 portundaki değeri seri porta gönderen progamın assembly kodunu yazınız. (Açıklama: Harici kesme olarak INT0’ı kullanın. Baud hızını 9600 olarak ayarlamak için zamanlayıcı-1 mod-2’yi kullanın ve -3 yükleyin.)
1. İndeks adresleme modu örneği: P1 portundan okunan bir değerin karesini P2 portuna gönderen programın assembly kodunu yazınız. (Açıklama: P1 portundan okunan değer 0-9 arasında olsun. Bu sayıların kareleri “look up table” içerisine yüklensin ve oradan hazır olarak kullanılsın. Sayıların karesini hesaplamak için herhangi bir kod yazılmayacak.)
2. Zamanlayıcı mod-1 örneği: Zamanlayıcı-0 kullanarak P1.5 (P1 portunun 5. pini)pininde “duty cycle” oranı %50 olan, 1 KHz kare dalga üreten programın assembly kodunu yazınız. (Açıklama: duty cycle, bir kare dalga işaretinin bir periyot boyunca lojik 1 olduğu sürenin toplam periyoda oranıdır.)
3. Sayıcı örneği: T1 pinindeki (P3 portunun 5. pini – P3.5) darbeleri sayan ve toplam darbe sayısını P2 portunda gösteren alt programın assembly kodunu yazınız.
4. Aritmetik işlem örnekleri: Verilen işlemleri hex tabanda hesaplayınız.
0x55+0xBB, 0x8000+0x2345, 0x2400-0x1ABC, 0x4000-0x0AED
5. Akümülatör örneği: Belirtilen işlemleri yerine getiren assembly kodunu yazınız.
ACC’ye 0x55 ve B’ye 0x32 değerlerini kopyalayın ve daha sonra bu değerleri toplayın.
0x25 ve 0x44 değerlerini toplayın ve sonucu R3’e kopyalayın.
6. Bayrak örnekleri: Aşağıdaki işlemler gerçekleştikten sonraki bayrak durumlarını yazınız. (Açıklama: Bu işlemlerden önce bayrak durumlarının ‘0’ olduğunu varsayın.)
mov A, #3AH
ADD A, #3FH
mov A, 9CH
ADD A, 64H
7. Yığın örneği: Belirtilen kod parçasının herbir satırı için; yığın(stack), yığın işaretçisi(sp=stack pointer) ve etkilenen register içeriklerini yazınız. Yığın işaretçisinin 7H adresinde (SP=0x07) olduğunu varsayın.
mov R2, #55H
mov R5, #0CCH
mov R1, #0ADH
push 2
push 5
push 1
pop 2
pop 1
pop 5
8. Döngü örneği: Akümülatörün içeriğini temizleyen ve daha sonra 10 defa 0x05 değerini akümülatöre ekleyen programın assembly kodunu yazınız. (Açıklama: DJNZ komutunu kullanın.)
9. R1, R2 ve R3 saklayıcılarının içeriklerini toplayan programın assembly kodunu yazın. Sonuç en fazla 10 bit uzunluğunda olabilir. Sonucun düşük değerlikli 8 biti R4 saklayıcısında, kalan kısmı ise R5 saklayıcısında depolansın. (Açıklama: Program dallanmaları carry bitinin kontrol edildiği komutlarla yapılsın.)
10. P1.0 pini üzreinde %50 duty cycle(on=off=600us) kare dalga üreten programın assembly kodunu yazınız. Gecikme fonksiyonunu alt program olarak yazın(2 ardışıl DJNZ döngüsü).
Kristal frekansı: 11.0592MHz
600us için çevrim sayısı: 599 (yaklaşık olarak)
Bir DJNZ döngüsü için max gecikme: 255*2+1=511
11. “Hello World!” string değerini kod belleğinin 8200h adresine ORG ve DB komutlarıyla kaydeden ve bu string değerini 50H adresinden başlayarak yazan programın assembly kodunu yazınız. (Açıklama: MOVC komutunu kullanın, programın ilk satırı 8030H adresinden başlatılmalıdır.)
12. Akümülatörde içerisindeki 0’ları sayan programın assembly kodunu yazınız. (Açıklama: Koşullu atlama ve döndürme komutlarını kullanın. Programın ilk satırı 8030H adresinden başlasın.)
13. R0, R1, R2 ve R3 kaydedicilerinin içine belli hexadecimal değerler yükleyen ve bunların toplamını hesaplayan programın assembly kodunu yazınız. (Açıklama: Program 30H adresinden başlasın, sonuç 7FFFH adresine kaydedilsin.)
14. P1.3 pinine bağlı bir LED bulunmaktadır. Bu LED’i kesme hizmeti programı yardımıyla belli bir süre yakan ve söndüren programın assembly kodunu yazınız. (Açıklama: Belli bir süre yanması için R3 saklayıcısına 255 değerini yükleyin ve DJNZ ile döngü kurun.)
15. Zamanlayıcı-0 ile P1.2 pini üzerinde kesme hizmet programı kullanarak kare dalga üreten programın assembly kodunu yazınız. (Açıklama: Zamanlayıcı-0, MOD-1 kullanın ve T0 içine 0AA55H değerini yükleyin.)
16. ‘A’ harfini karakter olarak 9600 baud hızında sürekli olarak seri porta gönderen programın assembly kodunu yazınız. (Açıklama: Zamanlayıcı-1 kullanın ve -3 değerini yükleyin.)
17. 9600 baud sürekli olarak seri porttan değer alan ve bu değerleri P1 portunda gösteren programın assembly kodunu yazınız. (Açıklama: Zamanlayıcı-1 kullanın ve -3 değerini yükleyin.)
18. P1 portuna bağlı harici kesme ucunda bir tetikleme olduğunda, P1 portundaki değeri R0 saklayıcısına kopyalayan progamın assembly kodunu yazınız. (Açıklama: Harici kesme olarak INT0’ı kullanın.)
19. P1 portuna bağlı harici kesme ucunda bir tetikleme olduğunda, baud hızı 9600 olacak şekilde P1 portundaki değeri seri porta gönderen progamın assembly kodunu yazınız. (Açıklama: Harici kesme olarak INT0’ı kullanın. Baud hızını 9600 olarak ayarlamak için zamanlayıcı-1 mod-2’yi kullanın ve -3 yükleyin.)