PDA

View Full Version : Một vài khái niệm cơ bản khi làm quen với Arduino #1



Arduino
07-08-2016, 10:29:24 AM
Arduino - Một vài khái niệm cơ bản khi làm quen với Arduino
Khi làm quen với Arduino chúng ta có thể gặp nhiều khái niệm về dữ liệu, về giao tiếp, về các bài toán cộng trừ nhân chia, các phép so sánh, khai báo v.v...
Trong số vô vàn các khái niệm ấy thì với hệ thống số.. khái niệm mã nhị phân (binary) là khái niệm mà chúng ta luôn gặp. Thân thuộc đến mức chúng ta hầu như không nhận ra là mã nhị phân có tồn tại.

Vậy mình xin giới thiệu Mã nhị phân và một vài khái niệm liên quan đến mã nhị phân

23509

Mã nhị phân hay thường được nhắc đến là binary (trong quá trình tìm hiểu các tài liệu kỹ thuật, rất thường xuất hiện các thuật ngữ tiếng anh, chúng ta cũng nên làm quen) hay hệ cơ số 2 hay hệ nhị phân v.v....

Để đơn giản hóa và dể hiểu, chúng ta chỉ cần biết Mã nhị phân là một dạng dữ liệu chỉ được diễn đạt bằng 2 ký tự hoặc trạng thái khác nhau. Trong kỹ thuật mã nhị phân thường được ký hiệu bỡi 2 ký số là 0 và 1. Trong đó
- 0 biểu đạt cho trạng thái không hoặc nếu là mức tín hiệu thì là mức tín hiệu thấp hay là trạng thái tắt (off).
- 1 biểu đạt cho trạng thái có hoặc biểu đạt cho mức tín hiệu thì là mức tín hiệu cao hay là trạng thái mở (on).

Ví dụ: đơn giản & gần gủi nhất là các trạng thái on/off xung quanh ta như bóng đèn, bật sáng là on hay là 1, tắt tối là off hay là 0

Bit - Với 1 ký số mã nhị phân được gọi là Bit và từ đó ta thấy, 1 bit biểu đạt được 2 giá trị (2 trạng thái) là 0 & 1.

Giá trị - Để biểu đạt được nhiều giá trị hơn thì chúng ta ghép nhiều Bit lại với nhau. Cách quy đổi giá trị nhị phân sang các hệ cơ số khác sẽ được giới thiệu sau.

Để dể xác định giá trị số từ hệ cơ số 2 (nhị phân) chúng ta sẽ nhắc đến hệ thập phân (cơ số mười). Hệ thập phân là hệ cơ số mà chúng ta dùng hàng này. Biểu đạt bằng các ký số từ 0-9. Quá quen thuộc rồi nên mình sẽ không nói nhiều về về hệ thập phân.

Giá trị của số hệ nhị phân được xác định từ vị trí phía phải dần qua tráii. Giá trị thực bằng tổng các (bitn * cơ sốn). Trong đó cơ số là 2 (nhị phân), n là vị trí bit, bắt đầu là 0. Để dể hiểu hơn chúng ta xem qua ví dụ.
Ví dụ: đổi số nhị phân sau 10112 (2 là chỉ số cơ số) sang số thập phân.
= tổng các (bitn * 2n)
= (13*23) + (02*22) + (11*21) + (10*20)
= (1*8) + (0*4) + (1*2) + (1*1)
= 8 + 0 + 2 + 1
= 1110
Giá trị của số nhị phân 1011 đổi sang số thập phân là 1110


Khi làm việc với Arduino thì ngoài mã nhị phân (hệ nhị phân - binary) ta sẽ thường thấy các kiểu khác như
- hệ thập phân (decimal) thông dụng không kém và thường sử dụng trong các phép toán. Dùng các ký số từ 0, 1, 2.... 8, 9.
Tương tự thì giá trị số thập phân bằng tổng các (sốn * cơ sốn). Trong đó cơ số là 10 (thập phân), n là vị trí số, bắt đầu là 0. Để dể hiểu hơn chúng ta xem qua ví dụ tính giá trị của số 10510.
= tổng các (sốn * 2n)
= (12*102) + (01*101) + (50*100)
= (1*100) + (0*10) + (5*1)
= 100 + 0 + 5
= 10510

- hệ bát phân (octal) thường là kiểu dữ liệu và hay được quy đổi ra nhị phân hoặc thập phân để tiện tính toán. Dùng các ký số từ 0, 1, 2.... 6, 7.
Tương tự thì giá trị số bát phân bằng tổng các (sốn * cơ sốn). Trong đó cơ số là 8 (bát phân), n là vị trí số, bắt đầu là 0. Để dể hiểu hơn chúng ta xem qua ví dụ tính giá trị của số 1058.
= tổng các (sốn * 2n)
= (12*82) + (01*81) + (50*80)
= (1*64) + (0*8) + (5*1)
= 64 + 0 + 5
= 6910

- hệ thập lục phân (hexadecimal) thường là kiểu dữ liệu và hay được quy đổi ra nhị phân hoặc thập phân để tiện tính toán. Dùng các ký số từ 0, 1, 2.... 8, 9, A, B, C, D, E, F.
Tương tự thì giá trị số thập lục phân bằng tổng các (sốn * cơ sốn). Trong đó cơ số là 16 (thập lục phân), n là vị trí số, bắt đầu là 0. Để dể hiểu hơn chúng ta xem qua ví dụ tính giá trị của số 10516.
= tổng các (sốn * 2n)
= (12*162) + (01*161) + (50*160)
= (1*256) + (0*16) + (5*1)
= 256 + 0 + 5
= 26110

* mình chia sẻ bài viết theo hiểu biết và tìm hiểu của riêng mình, không hoàn toàn chính xác. Mong các bạn bổ xung để chủ đề được rỏ ràng, dể hiểu & chính xác hơn

Cảm ơn các bạn!

Arduino
07-08-2016, 01:26:35 PM
Chuyển đổi giữa các hệ cơ số.

Để chuyển đổi giữa các hệ cơ số khác nhai khi lập trình ứng dụng với Arduino hoặc các vxl khác, thông thường các ngôn ngữ lập trình đều có những hàm riêng để làm việc này. Giúp cho người lập trình có thể chuyển đổi anh chóng & dễ dàng các kiểu dữ liệu. Nhưng việc tìm hiểu cách thức chuyển đổi qua lại giữa các hệ cơ số cũng không kém phần quan trọng.
Như bài viết trên, mình đã trình bày sơ về việc chuyển từ kiểu số nhị phân qua các kiểu số khác.

Ở bài viết này mình sẽ trình này sơ cách chuyển:

Kiểu số thập phân sang kiểu số nhị phân
Để làm điều này.. ta thực hiện lần lượt các phép chư cho 2 (cơ số nhị phận), ghi nhớ phần dư và kết quả, lại lấy kết quả chia cho 2, ghi nhớ phần dư và kết quả.. tiếp tục cho đến khi kết quả nhỏ hơn (<) 2 hoặc phép chia cho kết quả là 0. Sau đó ghép các số dư theo thứ tự lần lượt từ phải sang trái sẽ ra kết quả.
Như ở ví dụ trên, giờ ta làm ngược lại đổi kiểu số thập phân 1110 sang kiểu số nhị phân xxxx2
Như đã trình bày, ta tiến hành:

11 / 2 = 5 dư 1
5 / 2 = 2 dư 1
2 / 2 = 1 dư 0
1 / 2 = 0 dư 1

Vậy kết quả 1110 sau khi đổi qua hệ nhị phân sẽ là 10112

Kiểu số thập phân sang kiểu số bát phân
Để làm điều này.. ta thực hiện lần lượt các phép chư cho 8 (cơ số bát phân), ghi nhớ phần dư và kết quả, lại lấy kết quả chia cho 8, ghi nhớ phần dư và kết quả.. tiếp tục cho đến khi kết quả nhỏ hơn (<) 8 hoặc phép chia cho kết quả là 0. Sau đó ghép các số dư theo thứ tự lần lượt từ phải sang trái sẽ ra kết quả.
Như ở ví dụ trên, giờ ta làm ngược lại đổi kiểu số thập phân 6910 sang kiểu số bát phân xxxx8
Như đã trình bày, ta tiến hành:

69 / 8 = 8 dư 5
8 / 8 = 1 dư 0
1 / 8 = 0 dư 1

Vậy kết quả 6910 sau khi đổi qua hệ bát phân sẽ là 1058

Kiểu số thập phân sang kiểu số thập lục phân
Để làm điều này.. ta thực hiện lần lượt các phép chư cho 16 (cơ số thập lục phận), ghi nhớ phần dư và kết quả, lại lấy kết quả chia cho 16, ghi nhớ phần dư và kết quả.. tiếp tục cho đến khi kết quả nhỏ hơn (<) 16 hoặc phép chia cho kết quả là 0. Sau đó ghép các số dư theo thứ tự lần lượt từ phải sang trái sẽ ra kết quả.
Như ở ví dụ trên, giờ ta làm ngược lại đổi kiểu số thập phân 26110 sang kiểu số thập lục phân xxxx16
Như đã trình bày, ta tiến hành:

261 / 16 = 16 dư 5
16 / 16 = 1 dư 0
1 / 16 = 0 dư 1

Vậy kết quả 26110 sau khi đổi qua hệ thập lục phân sẽ là 10516



Chúng ta làm quen bảng số sau


Decimal
Binary
..Hex..
.Octal.
----
Decimal
Binary
..Hex..
.Octal.


0
0000
0
0

8
1000
8



1
0001
1
1

9
1001
9
11


2
0010
2
2

10
1010
A
12


3
0011
3
3

11
1011
B
13


4
0100
4
4

12
1100
C
14


5
0101
5
5

13
1101
D
15


6
0110
6
6

14
1110
E
16


7
0111
7
7

15
1111
F
17



Kiểu số nhị phân sang kiểu số thập lục phân
Để làm điều này ta tiến hành chia nhóm số nhị phân thành các nhóm nhỏ, mỗi nhóm gồm 4 ký số, từ phải qua trái. Nếu nhóm cuối không đủ 4 ký số thì ta thêm vào trái các ký số 0 cho đủ. Sau đó quy đổi trực tiếp từng nhóm nhỏ ra thành thập lục phân theo bảng trên, rồi lại ghép các kết quả thập lục phân đã tìm được. Ví dụ đổi kiểu số nhị phận 10010011101102 thành số thập lục phân xxx16. Ta tiến hành
Chia nhóm 10010011101102 thành 1-0010-0111-01102 --> 0001-0010-0111-01102
Quy đổi
0110 => 6
0111 => 7
0010 => 2
0001 => 1
Kết quả là 127616

Kiểu số nhị phân sang kiểu số bát phân
Để làm điều này ta tiến hành chia nhóm số nhị phân thành các nhóm nhỏ, mỗi nhóm gồm 3 ký số, từ phải qua trái. Nếu nhóm cuối không đủ 3 ký số thì ta thêm vào trái các ký số 0 cho đủ. Sau đó quy đổi trực tiếp từng nhóm nhỏ ra thành bát phân theo bảng trên, rồi lại ghép các kết quả thập lục phân đã tìm được. Ví dụ đổi kiểu số nhị phận 10010011101102 thành số bát phân xxx8. Ta tiến hành
Chia nhóm 10010011101102 thành 1-001-001-110-1102 --> 001-001-001-110-1102
Quy đổi
110 => 6
110 => 6
001 => 1
001 => 1
001 => 1
Kết quả là 111668