VI ĐIỀU KHIEN 8 BIT - LỆNH HỢP NGỮ
VI DIEU KHIEN 8 BIT - NGON NGU LAP
Các kiểu đữ liệu của biến vc sen ierrirre 100 „ 101 106 T10 2 Các toán tử 3 Các lệnh C cơ bản II TRÌNH BIÊN DỊCH C5I Phần mở rộng của trình biên dịch C5
Trong lập trình, việc khai báo biến để lưu trữ và xử lý dữ liệu là rất quan trọng, và loại dữ liệu cần được chọn phù hợp với yêu cầu Các biên của vi xử lý bao gồm bit (1 bit), byte (8 bit), word (16 bit) và long word (32 bit) Các kiểu dữ liệu cơ bản này đóng vai trò quan trọng trong việc quản lý và xử lý thông tin.
Bang 5-1: Cac kiéu dit liéu
TTỊ Kiểudữliệu | Số bit Giới hạn
GIÁO TRÌNH VI XỮ LÝ CHƯƠNG 5
12 | Sữ16 16 | 0+65535 bit TT; unsigned char dem; sfr16 T2= 0xCC;
Ví dụ 5-1: Khai báo các biển
//khai báo biến trạng thái thuộc kiểu đữ liệu bit //khai báo biến đếm (DEM) thuộc kiểu kí tự không dâu 8 bit
Jfkhai báo T2 là hai thanh ghỉ T2L và T2H nằm ở hai ô nhớ có địa chỉ liên tiêp là 0xŒC và 0xCD
Các toán tử là thành phần quan trọng trong lập trình, để lập trình thì chúng ta cân phải hiểu rõ ràng chức năng của các loại toán tử
Bảng 5-2: Các toán tử trong ngôn ngữ C báo gom:
'TT| Toán tử Chức năng Ví dụ
2 += |Toán tử cộng và gán x+=y tương đương với x=x+y
3 &=_ |Toán tử and và gán x&=y tương đương với x=x&y
5 ^= _ |Toán tửex-or và gắn x^=y tương đương với x=x^y
7† |Toán tửor và gấn x|=y tương đương với x=xÌy § | |Toán tử or nhiều đại lượng với | Ví dụ or nhiều bit trong 1 byte nhau thành 1 với nhau
10| /= — |Todan tt chia va gan x/=y tương đương với x=x/y il / Toán tử chia
12| == |Toán tử bằng dùng để so sánh
CHƯƠNG 5 GIÁO TRÌNH VI XỬ LÝ
14| >=_ |Toán tử lớn hơn hay bang
15 ++_ |Tăng l6| * |Toán tử truy xuất gián tiếp, đi trước con trỗ
18| = y tương đương với
32| ->_ |Toán tử con trỏ cấu trúc
33 -= Toán tử trừ và gán x- =y tương đương với x=x-y
35| sizeof |Xác định kích thước theo byte của toán tử
GIÁO TRÌNH VI XỬ LÝ CHƯƠNG 5
Dùng để gán một giá trị nào đó cho một biến
Ví dụ 5-2: A = 5; Gan biến A bằng 5
Có chức năng gán biến B bằng 5 rồi cộng với 2 và gán cho biến A, kết quả B =§ và A =7
— Có 5 toán tử để thực hiện các phép toán cộng, trừ, nhân, chia và chia lây phân dư
Gan A bing 24, B gán số dư của A chia cho 5, kết quả B bằng 4
Ví dụ này có chức năng tách từng con số đơn vị, chục, trăm gắn cho ba biên X, Y, Z
Ví dụ này có chức năng tách từng con số đơn vị, chục, trăm, ngàn gần cho 4 biên X, Y, Z, V
> Toán tử gắn phúc hợp (+=, +=, *=, “=, #=, >>=, Toán từ logic các điều kiện (1, &&,||)
Các toán tử trên tương đương là NOT, AND và OR
Ví dụ 5-12: trục sẽ cho kết quả là false
((5==5) && (6>4)) _ and hai điều kiện lại với nhau và kết quả là true
> Toán tử xử lý bit (&, |,^, >, >)
Các toán tử xử lý bít với bịt, các toán tử trên tương đương là AND,
OR, XOR, NOT, SHL (dịch trái), SHR (dịch phải)
GIÁO TRÌNH VI XỬ LÝ - CHUONG 5
X=A &B;//X bằng A and với B, kết qua X = 0100 0001B = 0X41 Y=A|B; // Y bằng A or voi B, két qua Y = L111 1111B = OXFF Z=A^B; //7 bang A xor với B, kết quả Z = 1011 1110B = OXBE W=~A; //W bằng not A, kết quả W = 1000 1000B = 0X88 `
A=(A 8; //dịch A sang phải 8 bit rồi gán Y, kết quả Y=0X12 có nghĩa là gán byte cao
> Toán tử lấy kích thước chuỗi theo bye ()
A =sizeof (charac); — kết quả là A sẽ chứa số byte của chuỗi charac
Thành phan quan trọng thứ ba trong lập trình C là các lệnh của ngôn ngữ C, phần tiếp theo sẽ khảo sát các lệnh cơ bản
Chức năng: kiểm tra điều kiện nếu thỏa thì làm
GIÁO TRÌNH VI XỬ LÝ CHƯƠNG 5
Chức năng: lặp lại một thao tác với một số lần nhất định hoặc khi còn thỏa một điêu kiện nào đó
Cú pháp: while (diéu_kién)
Chức năng: làm các lệnh trong dấu ngoặc và thoát nếu điều kiện theo sau lệnh while không đúng
Thực hiện lệnh x bằng x cộng với 10, làm cho đến khi x bằng hay lớn hơn 100
Chức năng: làm các lệnh trong dấu ngoặc một số lần nhất định
Cú pháp: for (giá trị bắt đầu; điều kiện kết thúc; tăng giá trị)
CHUONG 5 GIÁO TRÌNH VI XỪ LÝ
Vòng lặp thực hiện với biến n bằng 0 cho đến khi n bằng 100 thì ngừng
_ Chức năng: Lệnh này dùng để thoát khỏi vòng lặp dù cho điều kiện để kêt thúc chưa thỏa mãn
Chức năng: Lệnh này dùng để kết thúc phần còn lại của vòng lặp để làm lân lặp tiếp theo
Chức năng: Lệnh này dùng để nhảy đến nhãn trong chương trình
Chức năng: thực hiện một công việc tùy thuộc vào hàm
GIÁO TRÌNH VI XỬ LÝ CHƯƠNG 5
Trình biên địch C51 dùng đẻ biên dịch tập tin mã nguồn C cho họ vi điều 8051, để lập trình C chúng ta có thể sử dụng phần mềm biên địch Keil-
C (trong Keil-C sử dụng C51 để biên dịch) là công cụ quan trọng cho việc lập trình vi điều khiển Bạn có thể tham khảo tài liệu thực hành để biết cách cài đặt, lập trình và biên dịch Với những kiến thức cơ bản đã trình bày, bạn có thể lập trình cho vi điều khiển, tuy nhiên, do sự khác biệt giữa các loại vi điều khiển, cần tìm hiểu thêm về các tính năng đặc trưng của từng loại.
1 Phần mở rộng của trình biên dịch C51
Trình biên dịch C51 cung cấp các phần mở rộng cho ngôn ngữ C chuẩn ANSI, hỗ trợ trực tiếp cho các thành phần của kiến trúc vi điều khiển 8051.
CHƯƠNG 5 GIÁO TRÌNH VI XỬ LÝ © _ Các vùng nhớ của vi điều khiển 8051 e - Các kiểu mô hình bộ nhớ e _ Các chỉ dẫn loại bộ nhớ © _ Các chỉ dẫn loại biến dữ liệu bộ nhớ e _ Các biến thuộc dữ liệu bit và đữ liệu cho phép truy xuất bit ứe Cỏc thanh ghi đặc biệt ¢ Contrỏ e_ Các thuộc tính hàm
> Từ khóa: Để tránh lỗi phát sinh trong lập trình nên phần mềm C51 cung cấp các từ khóa như sau:
_at_ idata str alien interrupt | sfrl6 bdata large small bit pdata _task_ code _priority_ | using compact | reentrant | xdata data sbit
> Bộ nhớ chương trình ROM: -
Bộ nhớ này chỉ được sử dụng để lưu trữ chương trình, không có chức năng lưu dữ liệu, ngoại trừ các hằng số Các hằng số có thể được lưu thông qua các khai báo như sau: `unsigned char code constant_t = 0x03;` và `unsigned char code array_1[3] = {'L', '2', '3'};`.
> Bộ nhớ chương trình SMALL:
Bộ nhớ khoảng 2kbyte được sử dụng để biên dịch các lệnh CALL và JMP thành lệnh ACALL và AJIMP, giúp giảm kích thước byte mã lệnh và tăng tốc độ thực thi.
GIAO TRINH VI XU LY CHUONG 5
> Bộ nhớ chương trinh COMPACT:
Bộ nhớ này có kích thước khoảng 64kbyte, dùng để khi biên dịch thì lệnh CALL sẽ được dịch thành lệnh LCALL, còn lệnh JMP thì vẫn là AJMP
> Bộ nhớ chương trình LARGE:
Bộ nhớ có dung lượng khoảng 64kbyte, được sử dụng để biên dịch các lệnh CALL và TMP thành lệnh LCALL và LIMP, nhằm cho phép thực hiện các cuộc gọi và nhảy xa hơn.
> Bộ nhớ dữ liệu RAM SMALL:
Bộ nhớ trong vi điều khiển cho phép truy xuất nhanh nhất, với tất cả các biến được lưu trữ trong bộ nhớ dữ liệu Tuy nhiên, bộ nhớ này có dung lượng hạn chế, chỉ 256 byte, bao gồm cả bank thanh ghi và vùng nhớ ngăn xếp.
Trong 256 byte, 128 byte đầu tiên cho phép truy xuất trực tiếp, được gọi là DATA, trong khi 128 byte còn lại chỉ cho phép truy xuất gián tiếp, được gọi là IDATA.
> Bộ nhớ dữ liệu RAM COMPACT:
Bộ nhớ PDATA là bộ nhớ dữ liệu ngoại với dung lượng 256 byte, sử dụng port 0 để giao tiếp Để truy xuất dữ liệu, hai thanh ghi R0 và R1 được sử dụng để lưu địa chỉ.
> Bộ nhớ dữ liệu RAM LARGE:
Bộ nhớ này là bộ nhớ dữ liệu ngoại, với dung lượng 2.5 byte, sử dụng port0 và port2 để giao tiếp Bộ nhớ này còn được gọi là
XDATA Khi truy xuất thì dùng thanh ghỉ DPTR đê lưu địa chỉ 16 bít ˆ
2 Khai báo biến và hằng số
Ví dụ 5-25: Khai báo các hằng trong bộ nhớ chương trình unsigned char code dem= 0x03; unsigned char code ma_ascii[10] = {*0","1’, ‘2’, 314,15 6, ?Ẻ, 8°, !90);
Ví dụ 5-26: Khai báo bién trong bộ nhớ đữ liệu RAM bên ngoài
#pragma SMALL unsigned char xdata speed ;
CHUONG 5 GIÁO TRÌNH VI XỬ LÝ signed char xdata big_array[200];
Vi du 5-27: Khai báo biến và khởi gán giá trị cho biến unsigned int speed = 3; :
3 Cac BIT chire năng đặc biệt
Trong vi diéu khién có vùng nhớ cho phép truy xuất từng bit và cho phép truy xuất trực tiếp và vùng nhớ này có tên là BDATA
Ví dụ 5-28 trình bày cách khai báo các biến byte và bù trong lập trình Biến `test` được khai báo là ký tự byte thuộc vùng dữ liệu cho phép truy xuất bit Biến `sign` được định nghĩa là bit thứ 7 của biến `test` Ngoài ra, `sfr Pl` được gán với địa chỉ ô nhớ 0x90.
Ví dụ 5-29: định nghĩa các biến
#define HANG P0; // định nghĩa biến HANG là port0 của vi điều khiển AT89xx sbitHANG_0 HANG^0; / định nghĩa bịt HẠNG 0 là bit thir 0 của vi điều khiển AT89xx
Con trỏ dữ liệu trong ngôn ngữ C chính là kiểu truy xuất gián tiếp dùng thanh ghi, địa chỉ của ô nhớ cần truy xuất lưu trong thanh ghi
In Example 5-30, a pointer is declared using the syntax `unsigned char *pointer0;`, which initializes the pointer The pointer is then assigned the starting address of a memory region with the statement `pointer0 = mem_address;`, effectively linking the pointer to the specified memory location.
*pointer0 = 0xFF; /Nưu giá trị 0xFF vào ô nhớ có địa chỉ lưu trong con trỏ Đắi với vùng nhớ ngoại thì xem ví dụ sau
Ví dụ 5-31: khai báo con trỏ, gán địa chỉ con trỏ và lưu dữ liệu: unsigned char *asb_pointer ; //khai báo con trỏ
GIÁO TRÌNH VI XU LY CHƯƠNG 5 asb_pointer = (char*) 9x8000; /fgán địa chỉ bắt đầu của vùng nhớ là 0x8000 cho con trỏ
* asb_pointer = OxFF; /ưu giá trị 0xFF vào ô nhớ có địa chỉ lưu trong con trỏ
* asb_pointer++; //tang dia chỉ con trỏ đến ô nhớ kế
Ví dụ 5-32: khai báo mảng: unsigned char ma7doan{]
{0XC0,0XF9,0xA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90} ; char chuoi_hien_thi = { “HELLO !”};
7 Khai báo chương trình con phục vụ ngắt
Ví dụ 5-33: khai báo chương trình con phục vụ ngắt
Khai báo tên chương trình con phục vụ ngắt cho ngắt thứ nhất, tương ứng với ngắt của timer0, và sử dụng bank thanh ghi thứ hai cho chương trình con này.
8 Cấu trúc của chương trình C
Tất cả các chương trình viết bằng ngôn ngữ C bao gồm các chỉ dẫn, khai báo biến, định nghĩa biến, biểu thức, lệnh và hàm Dưới đây là một chương trình C đơn giản.
#include unsigned char MA7D[10] {0XC0,0XF9,0xA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90); int GIAY,CHUC,DONVI; void DELA Y_TIMERO()
CHƯƠNG 5 GIÁO TRÌNH VI XỬ LÝ
TRO =1; | for (BDN = 0; BDN