Programowanie mikroprocesorów ( mikrokontrolerów )

Systemy liczbowe


1. Wstęp

Podczas programowania mikroprocesorów mikrokontrolerów wykorzystywać będziemy trzy podstawowe systemy liczbowe:

  • Dziesiętny system liczbowy
  • Dwójkowy system liczbowy 
  • Szesnastkowy system liczbowy (HEX)


Poniżej opisane zostaną trzy podstawowe systemy liczbowe stosowane przy programowaniu mikroprocesorów mikrokontrolerów. Wszystkie trzy systemy liczbowe opisane poniżej są systemami pozycyjnymi tzn. zbudowane są na zasadzie sumy liczb (znajdujących się na ściśle określonej pozycji). Każdy element sumy składa się z iloczynu cyfry od 0 do 9 i podstawy systemu liczbowego którą jest cyfra większa od jedności podniesionej do pewnej potęgi ( wagi ).

2. Dziesiętny system liczbowy (decymalny)

System dziesietny jest standardowym systemem liczbowym którym posługujemy się na co dzień. Każdy ma z nim styczność od najmłodszych lat podstawówki. System ten jest jednym z podstawowych systemów liczbowych w większości krajów świata. System dziesiętny posiada dziesięć cyf z których tworzy się liczzbę. Tworzy się ją poprzez iloczyn cyfry od zera do dziesięciu i liczby 10 podniesionej do pewnych potęg (wag) i zsumowanie ich w jedną liczbę. Dla lepszego zobrazowania poniżej przykład z opisem.


Programowanie Mikrokontrolerów Mikroprocesorów - System Dziesiętny

Powyżej widzimy wzór pozwalający zrozumieć sposób tworzenia liczb w systemie dziesiętnym. Liczba w systemie dziesiętnym składa się z cyfr od 0 do 9 znajdujących się na poszczególnych pozycjach od przecinka w prawo i w lewo od niego. Cyfry znajdjące się na lewo od przecinka posiadają kolejno wagi 10, 100, 1000, 10000 itd. Tzn że każda cyfra z liczby biorąc pod uwagę swoje miejsce powinna zostać pomnożona przez swoją wagę i tak otrzymujemy dla powyższej liczby 62058,57 rozpisana liczba będzie wyglądała następująco: 60000+2000+50+8+0,50+0,07 wartość ułamkowa znajdująca się na prawo od przecinka posiadają kolejno wagi 0,1; 0,01; 0,001 itd. Zrozumienie tego zapisu pozwoli nam zrozumieć zasadę tworzenia kolejnych systemów liczbowych i sprawne przechodzenie z jednego systemu na drugi.

3. Dwójkowy system liczbowy (binarny, BIN)

System dwójkowy tworzymy analogicznie do powyższego z tą różnicą że zamiast dziesięciu cyfr mamy do dyspozycji dwie 0 i 1. Liczbę binarną tworzy się poprzez iloczyn cyfry oraz podstawy systemu cyfry dwa podniesionej do odpowiedniej potęgi. System tworzenia liczby binarnej wraz z opisem przedstawia poniższy wzór.


Programowanie Mikrokontrolerów Mikroprocesorów - System Dwójkowy

System tworzenia liczby binarnej jest analogiczny do systemu dziesiętnego. Każda cyfra w liczbie ma swoją wagę o dwa razy większą od poprzedniej. pierwsza pozycja ma wagę 1 następna 2,4,8,16 itd. Aby odczytać wartosć liczby binarnej w systemie dziesiętnym musimy zsumować wagi odpowiednich cyfr w liczbie według wzoru.

4. Szesnastkowy system liczbowy (hexadecymalny, HEX)

W systemie szesnastkowym bardzo popularnym w programowaniu mikroprocesorów mikrokontrolerów występuje 16 wartości "cyf". Od 0 do 9 oraz od A do F. Podstawą systemu jest liczba 16. Liczbę tworzy się w sposób przedstawiony na poniższym przykładzie:


Programowanie Mikrokontrolerów Mikroprocesorów - System Dziesiętny

Aby stworzyć liczbę w systemie szesnastkowym z powyższego przykładu należy wziąć liczby stojące przy kolejnych wagach systemu liczbowego i poskłądać je w liczbę dla powyższego przykładu liczba ta zapisana w systemie szenastkowym będzie wyglądała następująco 4E8B. Taki wygląd liczby wynika z tego iż cyfry z założenia powinny być pojedynczymi znakami a ponieważ w systemie szesnastkowym cyfry mają 16 wartosci cyfry o wartościach od 10 do 15 zamienione zostały na pojedyncze litery tzn: wartość 10 oznaczana jest literą A, 11 literą B, 12 literą C, 13 to D, 14 to E i 15 to F. System ten bardziej zrozumiały stanie się po przejrzeniu przykladów przeliczania poniżej.

Przeliczanie systemów liczbowych:

Omówione zostanie kilka najpotrzebniejszych sposobów przeliczania liczb z jednego systemu na system a mianowicie przeliczanie :

  • z dziesiętnego na binarny (Dec) -> (Bin)
  • z dziesiętnego na szesnastkowy (Dec) -> (Hex)
  • z binarnego na szesnastkowy (Bin) -> (Hex)
  • z binarnego na dziesiętny (Bin) -> (Dec)
  • z szesnastkowego na binarny (Hex) -> (Bin)
  • z szesnastkowego na dziesietny (Hex) -> (Dec)

5. Konwersja z dziesiętnego na binarny (Dec) -> (Bin)

Dokonanie konwersji dziesiętnego systemu liczbowego na binarny jest dosyć proste należy dokonać dzielenia liczby dziesiętnej przez dwa zwracając uwagę czy dzielenie liczby wychodzi z resztą czy bez. Jeśli wynik dzielenia jest z resztą dla danego dzielenia zapisujemy 1 jeśli wynik dzielenia wychodzi bez reszty zapisujemy zero. Przykład przedstawiono poniżej.


83 :2 | 1
41 :2 | 1
20 :2 | 0
10 :2 | 0
5 :2 | 1
2 :2 | 0
1 :2 |

83 (DEC) = 1010011 (BIN)

 W powyższym przykładzie przedstawiony został sposób konwersji liczby dziesiętnej w binarną. Aby tego dokonać dokonujemy dzielenia liczby przez 2 jeśli wynik jest z resztą po prawej stronie wpisujemy 1 a całkowity wynik dzielenia wpisujemy pod naszą liczbą i dokonujemy dzielenia przez 2 ponownie i tak aż do końca tabeli. Aby odczytać liczbę binarną należy przepisać utworzony ciąg zer i jedynek tak że bit na górze stanowi najmłodszy (najmniej znaczący) bit liczby natomiast bit na dole tabeli stanowi najstarszy (najbardziej znaczący) bit liczby binarnej.

6. Konwersja z dziesiętnego na szesnastkowy (Dec) -> (Hex)

Konwersja z systemu dziesiętnego na szesnastkowy jest analogiczna jak w przypadku konwersji z systemu dziesiętnego na system binarny z tą różnicą że wagą systemu jest liczba 16 zamiast liczby 2. Dokonamy konwersji liczby dziesiętnej 12035372 na liczbę szesnastkową. W tym celu dzielimy liczbe 12035372 przez 16 a resztę z dzielenia zapisujemy po prawej stronie. A więc 12035372/16=752210,75 co daje resztę z dzielenia 12035372 - 752210 * 16 = 12 Następnei zapisujemy liczbę 752210 poniżej i ponawiamy proces aż do końca.

12035372 :16 | 12 (C)
752210 :16 | 2
47013 :16 | 5
2938 :16 | 10 (A)
183 :16 | 7
11 :16 | 11 (B)

W systemie szesnastkowym wartość pojedynczej cyfry może przyjmować 16 stanów od 0 do F. Zbiór liczb to liczby od 0 do 9 oraz liczby dla wartości od 10 do 15 reprezentowane są przez litery alfabetu od A do F. Tak więc interpretując otrzymane liczby po prawej stronie tabeli: 11,7,10,5,2,12 interpretujemy w systemie szesnastkowym jako B7A52C


12035372 (DEC) = B7A52C(HEX)

Zachowując tą metodę możemy przejść z systemu dziesiętnego na system liczbowy o dowolnej podstawie.

7. Konwersja z binarnego na szesnastkowy (Bin) -> (Hex)

Najprościej przeliczanie liczby binarnej na liczbę szesnastkową jest przedstawić na przyładzie tak więc przeliczmy liczbę 11010010111010110110000111(bin) na liczbę szesnastkową (HEX). Aby tego dokonać pierwszym krokiem będzie podzielene liczby binarnej na czterocyfrowe grupy:

11 | 0100 | 1011 | 1010 | 1101 | 1000 | 0111

Dla tak podzielonych grup cyfr znajdujemy dla każdej grupy jej szesnastkowy odpowiednik tzn każda z czterocyfrowych grup mieści się w zakresie wartości od 0 do 16 tak więc każdej grupie mozemy przypożądkować szesnastkowa wartość od 0 do F.

11 | 0100 | 1011 | 1010 | 1101 | 1000 | 0111

3  |   4   |   B  |   A   |   8   |  7

Tak powstała liczba 34BA87(hex) jest równa co do wartości liczbie binarnej z przykładu 11010010111010110110000111(bin).

8. Konwersja z binarnego na dziesiętny (Bin) -> (Dec)

Przejście z systemu binarnego na system dzieisetny najprościej możemy przedstawić na przykładzie. Zamieńmy liczbę 1100101 (BIN) na system dziesiętny. Nasza liczba binarna jest liczbą siedmiocyfrową tak więc przygotujmy sobie 7 kolejnych potęg liczby 2 obliczając ich wartości na kartce obok. Aby przejść na system dziesiętny musimy policzyć następująca sumę 1*2^6 + 1*2^5 + 0*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 1*2^0 = 101 (DEC). (^ - oznacza potęgowanie). 

9. Konwersja z szesnastkowego na binarny (Hex) -> (Bin)

Poniżej przedstawiony zostanie sposób przechodzenia na system binarny dowolnej liczby w systemie szesnastkowym. Sposób ten przedstawmy na przykładzie. Zamieńmy liczbę F4BA87 (HEX) na system binarny. W pierwszym kroku odseparujmy od siebie poszczególne cyfry liczby szesnastkowej jak na diagramie poniżej.

F  |   4   |   B  |   A   |   8   |  7

Następnie pod kolejnymy cyframi zapiszmy jej dziesiętną interpretacje jak na diagramie poniżej

F |   4   |   B  |   A   |   8   |  7

15  |   4   |   11  |   10  |   8   |  7

W kolejnym kroku zapiszmy kolejne cyfry w systemie binarnym pamiętając że 0 (DEC) to 0000 (BIN), 1 (DEC) to 0001 (BIN), 2 (DEC) to 0010 (BIN), 3 (DEC) to 0011 (BIN), 4 (DEC) to 0100 (BIN), 5 (DEC) to 0101 (BIN), 6 (DEC) to 0110 (BIN), 7 (DEC) to 0111 (BIN), 8 (DEC) to 1000 (BIN), 9 (DEC) to 1001 (BIN), 10 (DEC) to 1010 (BIN), 11 (DEC) to 1011 (BIN), 12 (DEC) to 1100 (BIN), 13 (DEC) to 1101 (BIN), 14 (DEC) to 1110 (BIN), 15 (DEC) to 1111 (BIN).

1111 | 0100 | 1011 | 1010 | 1101 | 1000 | 0111

łącząc ciąg zer i jedynek otrzymujemy zamienioną liczbę szesnastkową na system binarny 1111010010111010110110000111 (BIN).

10. Konwersja z szesnastkowego na dziesietny (Hex) -> (Dec)

Sposób przechodzenia z systemu szesnastkowego na system dziesiętny przedstawiony zostanie na przykłądzie. Zamieńmy liczbę F4BA87 na system dziesiętny. Wyodrębnijmy cyfry liczby szesnastkowej na poszczególne cyfry jak na diagramie poniżej.

 F  |   4   |   B  |   A   |   8   |  7

Każdej z cyfr przypiszmy interpretacje dziesiętną jak na diagramie poniżej

 F  |   4   |   B  |   A   |   8   |  7

15  |   4   |  11  |  10   |   8   |  7

wyliczmy sumę składników cyfr powyżej pomnożonych przed odpowiednie potęgi liczby 16 jak we wzorze: 15*16^5 + 4*16^4 + 11*16^3 + 10*16^2 + 8*16^1 + 7*16^0 = 16038535(DEC). 





 
Wszelkie prawa zastrzeżone! Kopiowanie, powielanie i wykorzystywanie zdjęć, treści oraz jej fragmentów bez zgody autora zabronione.
© mikroprocesory.info.pl@gmail.com 2013.