Ngôn ngữ C – Lập trình vi điều khiển

Khi muốn lập trình cho vi điều khiển, việc đầu tiên bạn cần làm là học một ngôn ngữ lập trình. Hiện nay, có nhiều ngôn ngữ khác nhau có thể sử dụng để lập trình vi điều khiển, tuy nhiên ngôn ngữ C được rất nhiều người dùng vì tính thân thiện và ứng dụng rộng rãi. Trong bài viết này, tôi sẽ giúp bạn làm quen với ngôn ngữ C và cung cấp các kiến thức cơ bản để bạn có thể sử dụng ngôn ngữ này để lập trình cho vi điều khiển.

Các kiểu dữ liệu trong ngôn ngữ C

Trong ngôn ngữ C, chúng ta thường khai báo biến để lưu trữ và xử lý dữ liệu. Loại dữ liệu tương ứng với vi điều khiển bao gồm bit, byte, word và long word, tương ứng với dữ liệu 1bit, 8bit, 16bit và 32bit.

  • Kiểu dữ liệu Số bit Số byte Khoảng giá trị
  • Char 8 1 -128 đến +127
  • Unsigned char 8 1 0 đến 255
  • Enum 16 2 -32,768 đến +32,767
  • Short 16 2 -32,768 đến +32,767
  • Unsigned short 16 2 0 đến 65,535
  • Int 16 2 -32,768 đến +32,767
  • Unsigned int 16 2 0 đến 65,535
  • Long 32 4 -2,147,483,648 đến +2,147,483,648
  • Unsigned long 32 4 0 đến 4,294,967,295

Các toán tử trong ngôn ngữ C

Toán tử gán (=)

Toán tử gán được sử dụng để gán giá trị cho biến.

Ví dụ:

b = 5;
a = 2 + b;
a = 2 + (b = 5);
a = b = c = 5;

Các toán tử số học

Các toán tử số học được sử dụng để thực hiện các phép tính số học như cộng, trừ, nhân, chia, chia lấy phần dư.

Các toán tử gán phức hợp

Các toán tử gán phức hợp kết hợp toán tử gán với các toán tử số học.

Toán tử tăng và giảm (++, –)

Toán tử tăng (++) và giảm (–) được sử dụng để tăng hoặc giảm giá trị của biến.

Ví dụ:

a++; // tương đương với a += 1; tương đương với a = a + 1;

Lưu ý: (++a) khác với (a++)

Các toán tử so sánh

Các toán tử so sánh được sử dụng để so sánh các giá trị và trả về kết quả là true hoặc false.

Các toán tử logic

Các toán tử logic được sử dụng để kết hợp các biểu thức logic và trả về kết quả là true hoặc false.

Ví dụ:

!(5 == 5) // trả về false vì biểu thức bên phải (5 == 5) có giá trị true.
!(6 <= 4) // trả về true vì (6 <= 4) có giá trị false.
!true // trả về false.
!false // trả về true.
((5 == 5) && (3 > 6)) // trả về false (true && false).

Các toán tử thao tác bit

Các toán tử thao tác bit được sử dụng để thực hiện các phép toán bit như AND (&), OR (|), XOR (^), NOT (~),…

Thứ tự ưu tiên của các toán tử

Thứ tự ưu tiên của các toán tử trong ngôn ngữ C:

  1. Toán tử scope trái (::), dấu ngoặc nhọn trái ({), dấu ngoặc nhọn phải (}), dấu ngoặc vuông trái ([), dấu ngoặc vuông phải (]), ->, sizeof.
  2. Toán tử tăng và giảm (++ –)
  3. Toán tử đảo bit (~), toán tử NOT (!), toán tử con trỏ (& *), toán tử chuyển đổi kiểu (type), toán tử dương hoặc âm (+ -).
  4. Toán tử nhân chia (*/), toán tử cộng trừ (+ -).
  5. Toán tử dịch bit (<< >>).
  6. Toán tử quan hệ (< <= > >=), toán tử bằng khác (== !=).
  7. Toán tử thao tác bit (& ^ |).
  8. Toán tử logic (&& ||).
  9. Toán tử điều kiện (? :).
  10. Toán tử gán (= += -= *= >>= <<= &= ^= |=).
  11. Dấu phảy (,).

Cấu trúc cơ bản của một chương trình C

Cấu trúc chương trình

Một chương trình C có thể được chia thành các phần như sau:

#include 

int main() {
    // Nội dung của chương trình
    return 0;
}

Cấu trúc điều kiện: if và else

Trong ngôn ngữ C, chúng ta sử dụng cấu trúc điều kiện if và else để thực hiện các câu lệnh dựa trên điều kiện.

Cú pháp 1:

if (điều_kiện) {
    // Các câu lệnh
}

Giải thích: Nếu điều kiện đúng, các câu lệnh bên trong cấu trúc if sẽ được thực hiện; nếu điều kiện sai, các câu lệnh đó sẽ bị bỏ qua.

Ví dụ:

if (x == 100) {
    x++;
}

Giải thích: Nếu x = 100, thì tăng giá trị của x lên 1.

Cú pháp 2:

if (điều_kiện) {
    // Đoạn chương trình 1
} else {
    // Đoạn chương trình 2
}

Giải thích: Nếu điều kiện đúng, sẽ thực hiện “Đoạn chương trình 1”; nếu điều kiện sai, sẽ thực hiện “Đoạn chương trình 2”.

Ví dụ:

if (x == 100) {
    x++;
} else {
    x--;
}

Giải thích: Nếu x = 100, thì tăng giá trị của x lên 1; nếu không, giảm giá trị của x đi 1.

Cấu trúc vòng lặp

Vòng lặp while

Cú pháp:

while (điều_kiện) {
    // Các câu lệnh
}

Giải thích: Trước khi thực hiện các câu lệnh, điều kiện sẽ được kiểm tra. Nếu điều kiện đúng, các câu lệnh sẽ được thực hiện và quay lại kiểm tra điều kiện. Nếu điều kiện sai, vòng lặp sẽ kết thúc.

Ví dụ:

while (1) {
    // Đoạn chương trình chính
}

Giải thích: Tạo một vòng lặp vô hạn, thường được sử dụng trong lập trình vi điều khiển.

Vòng lặp do-while

Cú pháp:

do {
    // Các câu lệnh
} while (điều_kiện);

Giải thích: Đầu tiên, các câu lệnh sẽ được thực hiện và sau đó kiểm tra điều kiện. Nếu điều kiện đúng, vòng lặp sẽ được lặp lại. Nếu điều kiện sai, vòng lặp sẽ kết thúc.

Ví dụ:

do {
    x++;
} while (x > 10);

Giải thích: Tăng giá trị của x cho đến khi x > 10.

Vòng lặp for

Cú pháp:

for (x = n; điều_kiện; phép_toán) {
    // Các câu lệnh xử lí
}

Giải thích: x là biến, n là giá trị khởi đầu. Trước khi bắt đầu vòng lặp, giá trị khởi đầu sẽ được gán cho biến x. Sau đó, điều kiện sẽ được kiểm tra. Nếu điều kiện đúng, các câu lệnh xử lí sẽ được thực hiện và sau đó phép toán sẽ được thực hiện để tác động lên điều kiện. Sau đó, lại kiểm tra điều kiện. Nếu điều kiện không còn đúng, vòng lặp sẽ kết thúc.

Ví dụ:

for (int n = 0; n < 100; n++) {
    x = x + 10;
}

Giải thích: Vòng lặp thực hiện với biến n = 0 cho đến khi n bằng 100.

Cấu trúc rẽ nhánh – Switch

Ngôn ngữ C cung cấp cấu trúc rẽ nhánh switch để thực hiện các câu lệnh dựa trên giá trị của biến.

Cú pháp:

switch (biến) {
    case giá_trị_1:
        // Các câu lệnh
        break;
    case giá_trị_2:
        // Các câu lệnh
        break;
    ...
    case giá_trị_n:
        // Các câu lệnh
        break;
    default:
        // Các câu lệnh
}

Giải thích: Tuỳ thuộc vào giá trị của biến, các câu lệnh tương ứng trong từng case sẽ được thực hiện. Sau đó, sẽ thoát khỏi cấu trúc switch bằng câu lệnh “break”. Nếu không có bất kỳ case nào phù hợp, các câu lệnh trong default sẽ được thực hiện.

Các lệnh rẽ nhánh và lệnh nhảy

Lệnh break

Lệnh break được sử dụng để thoát khỏi vòng lặp hoặc cấu trúc điều kiện ngay cả khi điều kiện vẫn chưa được thoả mãn. Lệnh này thường được sử dụng để kết thúc một vòng lặp không xác định hoặc buộc nó phải kết thúc giữa chừng thay vì kết thúc một cách bình thường.

Lệnh continue

Lệnh continue được sử dụng để bỏ qua phần còn lại của vòng lặp và chuyển đến lần lặp tiếp theo.

Lệnh goto

Lệnh goto cho phép nhảy tới bất kỳ điểm nào trong chương trình mà không cần kiểm tra điều kiện. Tuy nhiên, việc sử dụng lệnh goto không nên được khuyến khích trong lập trình C++. Một ví dụ sử dụng lệnh goto có thể là đếm ngược.

Hàm exit

Hàm exit được sử dụng để kết thúc chương trình và trả về một mã xác định. Mã trả về 0 cho biết chương trình kết thúc bình thường, trong khi các mã khác không bằng 0 cho biết có lỗi xảy ra.

Trong các ví dụ trên, chúng tôi chỉ sử dụng lệnh break để thoát khỏi vòng lặp. Các lệnh khác thường ít được sử dụng.

Với những kiến thức cơ bản này, bạn đã có thể bắt đầu học và sử dụng ngôn ngữ C để lập trình cho vi điều khiển của bạn.

FEATURED TOPIC

hihi