Lập trình C trong vi điều khiển (Phần 1)

28
1840

Giới thiệu ngôn ngữ C

Trong kỹ thuật lập trình vi điều khiển nói chung, ngôn ngữ lập trình được sử dụng thường chia làm 2 loại: Ngôn ngữ bậc thấp và Ngôn ngữ bậc cao. Ngôn ngữ bậc cao là các ngôn ngữ gần vơi ngôn ngữ con người hơn, do đó việc lập trình bằng các ngôn ngữ này trở nên dễ dàng và đơn giản hơn. Có thể kể đến một số ngôn ngữ lập trình bậc cao như C, Basic, Pascal… trong dó C là ngôn ngữ thông dụng hơn cả trong kỹ thuật vi điều khiển. Về bản chất, sử dụng các ngôn ngữ này thay cho ngôn ngữ bậc thấp là giảm tải cho lập trình viên trong việc nghiên cứu các tập lệnh và xây dựng các cấu trúc giải thuật.

Chương trình viết bằng ngôn ngữ bậc cao cũng sẽ được một phần mềm trên máy tính gọi là trình biên dịch (Compiler) chuyển sang dạng hợp ngữ trước khi chuyển sang mã máy.Khi sử dụng ngôn ngữ C người lập trình không cần hiểu sâu sắc về cấu trúc của bộ vi điều khiển. Có nghĩa là với một người chưa quen với một vi điểu khiển cho trước sẽ xây dựng được chương trình một cách nhanh chóng hơn, do không phải mất thời gian tìm hiểu kiến trúc của vi điều khiển đó. Và việc sử dụng lại các chương trình đã xây dựng trước đó cũng dễ dàng hơn, có thể sử dụng toàn bộ hoặc sửa chữa một phần.

C đã được tạo ra với một mục tiêu là làm cho nó thuận tiện để viết các chương trình lớn với số lỗi ít hơn trong mẫu hình lập trình thủ tục mà lại không đặt gánh nặng lên vai người viết ra trình dịch C, là những người bề bộn với các đặc tả phức tạp của ngôn ngữ. Cuối cùng C có thêm những chức năng sau:

  • Một ngôn ngữ cốt lõi đơn giản, với các chức năng quan trọng chẳng hạn như là những hàm hay việc xử lý tập tin sẽ được cung cấp bởi các bộ thư viện các thủ tục.
  • Tập trung trên mẫu hình lập trình thủ tục, với các phương tiện lập trình theo kiểu cấu trúc.
  • Một hệ thống kiểu đơn giản nhằm loại bỏ nhiều phép toán không có ý nghĩa thực dụng.
  • Dùng ngôn ngữ tiền xử lý, tức là các câu lệnh tiền xử lý C, cho các nhiệm vụ như là định nghĩa các macro và hàm chứa nhiều tập tin mã nguồn (bằng cách dùng câu lệnh tiền xử lý dạng #include chẳng hạn).
  • Mức thấp của ngôn ngữ cho phép dùng tới bộ nhớ máy tính qua việc sử dụng kiểu dữ liệu pointer.
  • Số lượng từ khóa rất nhỏ gọn.
  • Các tham số được đưa vào các hàm bằng giá trị, không bằng địa chỉ.
  • Hàm các con trỏ cho phép hình thành một nền tảng ban đầu cho tính đóng và tính đa hình.
  • Hỗ trợ các bản ghi hay các kiểu dữ liệu kết hợp do người dùng từ khóa định nghĩa struct cho phép các dữ liệu liên hệ nhau có thể được tập hợp lại và được điều chỉnh như là toàn bộ.

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

  1. Các #include ( dùng để khai báo sử dụng các hàm chuẩn)
  2. Các #define  ( dùng để định nghĩa các hằng )
  3. Khai báo các đối tượng dữ liệu ngoài ( biến, mảng, cấu trúc vv..).
  4. Khai báo nguyên mẫu các hàm.
  5. Hàm main().
  6. Định nghĩa các hàm ( hàm main có thể đặt sau hoặc xen vào giữa các hàm khác).
* Ví dụ:
// Khai báo chỉ thị tiền xử lý:
#include<regx51.h>
            #include<string.h>
            #define Led1 P1_0
//*********************************
// Khai báo biến toàn cục:
            Unsigned char code Led_arr[3];
            Unsigned char data dem;
            Unsigned int xdata X;
//*********************************
// Khai báo nguyên mẫu hàm
            Void delay(unsigned int n);
            bit kiemtra(unsigned int a);
//*********************************
// Xây dựng các hàm và chương trình chính:
             void delay(unsigned int n)
            {
                        Khai báo biến cục bộ;
Mã chương trình trễ;
            }
Void main()  // Chương trình chính
            {
                        Khai báo biến cụ bộ;
Mã chương trình chính;
            }
            Bit kiemtra(unsigned int a)
            {
                        Khai báo biến cục bô;
Mã chương trình kiểm tra biến a;
            }

Thao tác vào/ra

Cần phải khai báo thư viện #include<stdio.h>

In ra màn hình

printf (“chuỗi định dạng”  [, đối mục 1, đối mục 2,…]);

VD: printf( “Hello “); —> in dòng Hello ra màn hình.

VD: printf(“”%d”, x); —> in giá trị x ra màn hình.

Chức năng: Đưa kết quả các <đối mục> ra màn hình

– <“chuỗi định dạng”>: dùng để định dạng cho dữ liệu xuất ra màn hình của các <đối mục>
– <Đối mục 1>, <Đối mục >…: là các mục dữ kiện cần in ra màn hình. Các <đối mục này> có thể là biến, hằng hoặc biểu thức phải được định trị trước khi in ra (có thể không có).

– Chuỗi định dạng: được đặt trong cặp nháy kép (” “), gồm 2 loại:
+ Đối với chuỗi kí tự ghi như thế nào in ra giống như thế ấy.
+ Đối với những kí tự chuyển đổi dạng thức cho phép kết xuất giá trị của các đối mục ra màn hình tạm gọi là mã định dạng.

Sau đây là các dấu mô tả định dạng:

  • %c : Ký tự đơn
  • %s : Chuỗi
  • %d : Số nguyên hệ thập phân
  • %f : Số chấm động (ký hiệu thập phân)
  • %e : Số chấm động (ký hiệu có số mũ)
  • %g : Dùng %e hoặc %f, tuỳ theo loại nào ngắn hơn, không in các số 0 vô nghĩa
  • %x : Hệ 16 không dấu
  • %u : Số thập phân không dấu
  • %o : Số nguyên bát phân không dấu
  • l : Tiền tố dùng kèm với %d, %u, %x, %o để chỉ số nguyên dài (ví dụ %ld)

Các ký tự điều khiển và ký tự đặc biệt

  • \n : Nhảy xuống dòng kế tiếp canh về cột đầu tiên.
  • \t : Canh cột tab ngang.
  • \r : Nhảy về đầu hàng, không xuống hàng.
  • \a : Tiếng kêu bip.
  • \\ : In ra dấu \
  • \” : In ra dấu “
  • \’ : In ra dấu ‘
  • %%: In ra dấu %

Nhập vào

scanf(“%d “,&x); dọc dữ liệu từ bàn phím và lưu vào biến x có kiểu số nguyên

gets(s); dùng để nhập chuỗi

Kiểu dữ liệu

Loại dữ liệuKiểu dữ liệu Số ô nhớMiền giá trị
Booleanbool1 byte0 (FALSE)hoặc1(TRUE).
Ký tựchar1 byte -127 tới 127 hoặc 0 tới 255
unsignedchar1 byte 0 tới 255
signedchar1 byte -127 tới 127
Sốnguyênint4 byte -2147483648 tới 2147483647
unsigned int4 byte 0 tới 4294967295
signed int4 byte -2147483648 tới 2147483647
short int2 byte-32768 tới 32767
long int4 byte -2,147,483,647 tới 2,147,483,647
Số thựcfloat4 byte +/- 3.4e +/- 38 (~7 chữ số)
double8 byte +/- 1.7e +/- 308 (~15 chữ số)
longdouble8 byte+/- 1.7e +/- 308 (~15 chữ số)

Ép kiểu trong C:

(Ten-kieu) Bieu_thuc;
Ví dụ: int a,b;
( float) a+b; //a+b lấy giá trị thực

Hằng, biến

  1. Khai báo hằng: 

#define   <tên hằng>   <giá trị>

VD: #define MAX 10;

 const <kiểu giá trị> <tên biến>=<giá trị>

VD: const int MAX=10;

2. Khai báo biến

<Kiểu dữ liệu> <Danh sách tên biến>;

VD: int x=0;

Các phép toán trong C

1. Toán tử số học trong C

Giả sử biến A giữ giá trị 10, biến B giữ 20 thì:

Toán tửMiêu tảVí dụ
+Cộng hai toán hạngA + B kết quả là 30
Trừ toán hạng thứ hai từ toán hạng đầuA – B kết quả là -10
*Nhân hai toán hạngA * B kết quả là 200
/Phép chiaB / A kết quả là 2
%Phép lấy số dưB % A kết quả là 0
++Toán tử tăng (++), tăng giá trị toán hạng thêm một đơn vịA++ kết quả là 11
Toán tử giảm (–), giảm giá trị toán hạng đi một đơn vịA– kết quả là 9

2. Toán tử quan hệ trong C

VD: A=10, B=20.

Toán tửMiêu tảVí dụ
==Kiểm tra nếu 2 toán hạng bằng nhau hay không. Nếu bằng thì điều kiện là true.(A == B) là false
!=Kiểm tra 2 toán hạng có giá trị khác nhau hay không. Nếu không bằng thì điều kiện là true.(A != B) là true
>Kiểm tra nếu toán hạng bên trái có giá trị lớn hơn toán hạng bên phải hay không. Nếu lớn hơn thì điều kiện là true.(A > B) là false
<Kiểm tra nếu toán hạng bên trái nhỏ hơn toán hạng bên phải hay không. Nếu nhỏ hơn thì là true.(A < B) là true
>=Kiểm tra nếu toán hạng bên trái có giá trị lớn hơn hoặc bằng giá trị của toán hạng bên phải hay không. Nếu đúng là true.(A >= B) là false
<=Kiểm tra nếu toán hạng bên trái có giá trị nhỏ hơn hoặc bằng toán hạng bên phải hay không. Nếu đúng là true.(A <= B) là true

3. Toán tử so sánh bit trong C

Toán tử so sánh bit làm việc trên đơn vị bit, tính toán biểu thức so sánh từng bit. Bảng dưới đây về &, |, và ^ như sau:

pqp & qp | qp ^ q
00000
01011
11110
10011

Các toán tử so sánh bit được hỗ trợ bởi ngôn ngữ C được liệt kê trong bảng dưới đây. Giá sử ta có biến A có giá tri 60 và biến B có giá trị 13, ta có:

Toán tửMiêu tảVí dụ
&Toán tử AND (và) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong cả hai toán hạng.(A & B) sẽ cho kết quả là 12, tức là 0000 1100
|Toán tử OR (hoặc) nhị phân sao chép một bit tới kết quả nếu nó tồn tại trong một hoặc hai toán hạng.(A | B) sẽ cho kết quả là 61, tức là 0011 1101
^Toán tử XOR nhị phân sao chép bit mà nó chỉ tồn tại trong một toán hạng mà không phải cả hai.(A ^ B) sẽ cho kết quả là 49, tức là 0011 0001
~Toán tử đảo bit (đảo bit 1 thành bit 0 và ngược lại).(~A ) sẽ cho kết quả là -61, tức là 1100 0011.
<<Toán tử dịch trái. Giá trị toán hạng trái được dịch chuyển sang trái bởi số các bit được xác định bởi toán hạng bên phải.A << 2 sẽ cho kết quả 240, tức là 1111 0000 (dịch sang trái hai bit)
>>Toán tử dịch phải. Giá trị toán hạng trái được dịch chuyển sang phải bởi số các bit được xác định bởi toán hạng bên phải.A >> 2 sẽ cho kết quả là 15, tức là 0000 1111 (dịch sang phải hai bit)

4. Toán tử gán trong C

Toán tửMiêu tảVí dụ
=Toán tử gán đơn giản. Gán giá trị toán hạng bên phải cho toán hạng trái.C = A + B sẽ gán giá trị của A + B vào trong C
+=Thêm giá trị toán hạng phải tới toán hạng trái và gán giá trị đó cho toán hạng trái.C += A tương đương với C = C + A
-=Trừ đi giá trị toán hạng phải từ toán hạng trái và gán giá trị này cho toán hạng trái.C -= A tương đương với C = C – A
*=Nhân giá trị toán hạng phải với toán hạng trái và gán giá trị này cho toán hạng trái.C *= A tương đương với C = C * A
/=Chia toán hạng trái cho toán hạng phải và gán giá trị này cho toán hạng trái.C /= A tương đương với C = C / A
%=Lấy phần dư của phép chia toán hạng trái cho toán hạng phải và gán cho toán hạng trái.C %= A tương đương với C = C % A
<<=Dịch trái toán hạng trái sang số vị trí là giá trị toán hạng phải.C <<= 2 tương đương với C = C << 2
>>=Dịch phải toán hạng trái sang số vị trí là giá trị toán hạng phải.C >>= 2 tương đương với C = C >> 2
&=Phép AND bitC &= 2 tương đương với C = C & 2
^=Phép OR loại trừ bitC ^= 2 tương đương với C = C ^ 2
|=Phép OR bit.C |= 2 tương đương với C = C | 2

5. Các toán tử hỗn hợp trong C

Toán tửMiêu tả
sizeofToán tử sizeof trong C trả về kích cỡ của một biến. Ví dụ: sizeof(a), với a là integer, sẽ trả về 4
Điều kiện ? X : YToán tử điều kiện trong C. Nếu Condition là true ? thì nó trả về giá trị X : nếu không thì trả về Y
,Toán tử Comma trong C làm cho một dãy hoạt động được thực hiện. Giá trị của toàn biểu thức comma là giá trị của biểu thức cuối cùng trong danh sách được phân biệt bởi dấu phảy
. (dot) và -> (arrow)Toán tử thành viên trong C được sử dụng để tham chiếu các phần tử đơn của các lớp, các cấu trúc, và union
CastToán tử ép kiểu (Casting) trong C biến đổi một kiểu dữ liệu thành kiểu khác. Ví dụ: int(2.2000) sẽ trả về 2
&Toán tử con trỏ & trong C trả về địa chỉ của một biến. Ví dụ: &a; sẽ trả về địa chỉ thực sự của biến này
*Toán tử con trỏ * trong C là trỏ tới một biến. Ví dụ: *var sẽ trỏ tới một biến var

6. Toán tử logic trong C

Giả sử biến A có giá trị 1 và biến B có giá trị 0:

Ví dụ toán tử logic

Toán tửMiêu tảVí dụ
&&Được gọi là toán tử logic AND (và). Nếu cả hai toán tử đều có giá trị khác 0 thì điều kiện trở lên true.(A && B) là false.
||Được gọi là toán tử logic OR (hoặc). Nếu một trong hai toán tử khác 0, thì điều kiện là true.(A || B) là true.
!Được gọi là toán tử NOT (phủ định). Sử dụng để đảo ngược lại trạng thái logic của toán hạng đó. Nếu điều kiện toán hạng là true thì phủ định nó sẽ là false.!(A && B) là true.

7. Thứ tự ưu tiên toán tử trong C

Bảng dưới đây liệt kê thứ tự ưu tiên của các toán tử. Các toán tử với quyền ưu tiên cao nhất xuất hiện trên cùng của bảng, và các toán tử có quyền ưu tiên thấp nhất thì ở bên dưới cùng của bảng. Trong một biểu thức, các toán tử có quyền ưu tiên cao nhất được tính toán đầu tiên.

Loại Toán tử Thứ tự ưu tiên 
Postfix() [] -> . ++ – –Trái sang phải
Unary+ – ! ~ ++ – – (type)* & sizeofPhải sang trái
Tính nhân* / %Trái sang phải
Tính cộng+ –Trái sang phải
Dịch chuyểnTrái sang phải
Quan hệ=Trái sang phải
Cân bằng== !=Trái sang phải
Phép AND bit&Trái sang phải
Phép XOR bit^Trái sang phải
Phép OR bit|Trái sang phải
Phép AND logic&&Trái sang phải
Phép OR logic||Trái sang phải
Điều kiện?:Phải sang trái
Gán= += -= *= /= %=>>= <<= &= ^= |=Phải sang trái
Dấu phảy,Trái sang phải

Tham khảo: https://tienich123.wordpress.com/

28 COMMENTS

  1. It is truly a great and helpful piece of information. I am satisfied that you simply shared this helpful information with us. Please stay us informed like this. Thanks for sharing. Cicily Dag Keg

  2. The road seemed to stretch on endlessly before us, but Alexis assured me that our journey was near an end. We’d turn before long into thick woods and travel through narrow, winding roads until we reached her family’s cabin. I had no choice but to trust her as GPS had given out nearly 20 minutes ago.

    “There’s good wifi and okay reception at the cabin,” she’d told me, “but you can’t get there unless you know the way.”

    So here I was, driving alone in the middle of god knows where with a girl who was my student just a couple of weeks ago. Her and her four best friends had been together from first grade all the way through high school and now they had graduated with very different futures ahead of them. They had decided to kick off “the best summer ever” with a week long stay at Alexis’s family cabin. Alexis and I were heading up before everyone else, the four other girls and four guys.

    https://sites.google.com/view/ncaPEZrFnQCs9aFN https://sites.google.com/view/AwFBPS577wdpXIcv https://sites.google.com/view/y6qX60vfDLpNQUYY https://sites.google.com/view/tQ4s43z7LdZFpNm6 https://sites.google.com/view/C4ADP512iTeDXwSH

LEAVE A REPLY

Please enter your comment!
Please enter your name here