CHƯƠNG 1: LÝ THUYẾT LIÊN QUAN Mã chương: MH36-01 Giới thiệu: 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.
Mục tiêu: - Ôn tập những kiến thức cơ bản về vi điều khiển mà sinh viên đã được học tại trường - Giới thiệu thêm về các loại vi điều khiển phổ biến tại doanh nghiệp và đồng thời cung cấp cho sinh viên về đặc tính kỹ thuật của chúng. - Hệ thống được những kiến về vi điều khiển đã được học để áp dụng vào thực tiễn - Có khả năng định hướng, chọn lựa phương pháp tiếp cận thích nghi với các nội dung học tập. Nội dung chính: 1. Trình biên dịch CCS-C Trình biên dịch PIC-C dùng để biên dịch tập tin mã nguồn C cho họ vi điều khiển PIC với nhiều chủng loại khác nhau, để lập trình C chúng ta có thể sử dụng phần mềm biên dịch PIC-C, cách cài đặt, lập trình, biên dịch và sử dụng ta có thể tham khảo ở tài liệu thực hành vi điều khiển.
Khi lập trình cho vi điều khiển PIC dùng PIC-C thì các thành phần cơ bản cũng giống như các loại vi điều khiển khác, sự khác biệt chủ yếu ở phần cứng của từng vi điều khiển. Các lệnh liên quan đến phần cứng được trình bày theo phần cứng đó, khi khảo sát port thì có các lệnh PIC-C liên quan đến port, khi khảo sát timer/counter thì có các lệnh PIC-C liên quan đến timer/counter. Khi dùng phần mềm PIC-C lập trình cho vi điều khiển PICPIC18F4550 thì phải khai báo thư viện <PICPIC18F4550. Trong file này đã định nghĩa tên các thành phần của vi điều khiển, nếu các tên trong file này không có thì ta có thể định nghĩa thêm, trong phần mềm PIC-C có rất nhiều thư viện hổ trợ cho các ứng dụng giúp ta viết chương trình gọn hơn.
Các thành phần cơ bản của ngôn ngữ C Trong chương trình thường khai báo biến để lưu dữ liệu và xử lý dữ liệu, tùy thuộc vào loại dữ liệu mà ta phải chọn loại dữ liệu cho phù hợp. Các biến của vi xử lý bao gồm bit, byte, word và long word tương ứng với dữ liệu 1 bit, 8bit, 16bit và 32bit. Các kiểu dữ liệu cơ bản tùy thuộc vào phần mềm sử dụng, vi điều khiển PIC có rất nhiều phần mềm biên dịch như PIC-C, MIKRO-C, MPLAB, trong phần này trình bày phần mềm PIC-C.1: Các kiểu dữ liệu của phần mềm PIC-C TT Kiểu dữ liêu Số bit Giới hạn 1 Inti 1 0-1 2 signed char 8 -128-127 6 3 unsigned char 8 0-255 4 signed int hay signed int8 8 -128-127 5 unsigned int hay unsigned int8 8 0-255 6 signed int16 16 -32768-32767 7 unsigned int16 16 0-65535 8 signed long long 32 -2147483648 to 2147483647 9 unsigned long long 32 0 to 4294967295 32 10 float ±1.402823E+38 Ví dụ: Khai báo các biến Intl TT; //khai báo biến trạng thái thuộc kiểu dữ liệu bit. Unsigned char dem; //khai báo biến đếm (dem) thuộc kiểu kí tự không dấu 8bit.
Chú ý: phần mềm lập trình PIC-C không phân biệt chữ hoa hay chữ thường nhưng các phần mềm khác thì có phân biệt. Các toán tử 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ử.2: Các toán tử phổ biến trong ngôn ngữ C TT Toán tử Chức năng Ví dụ 1 + Toán tử cộng x+=y tương đương với 2 += Toán tử cộng và gán. x=x+y x&=y tương đương với 3 &= Toán tử and và gán. x=x&y 4 @ Toán tử địa chỉ 5 & Toán tử and 6 A= Toán tử ex-or và gán.
xA=y tương đương với x=xAy 7 A Toán tử ex-or 8 |= 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 nhau Ví dụ or nhiều bit trong 1byte 9 I thành 1. với nhau 10 -- Giảm 11 /= Toán tử chia và gán.
x/=y tương đương với x=x/y 7 12 / Toán tử chia 13 == Toán tử bằng dùng để so sánh 14 > Toán tử lớn hơn 15 >= Toán tử lớn hơn hay bằng 16 ++ Tăng Toán tử truy xuất gián tiếp, đi trước 17 * con trỏ 18 != Toán tử không bằng x << = y tương đương với 19 <<= Toán tử dịch trái và gán x=x<<y 20 < Toán tử nhỏ hơn 21 << Toán tử dịch trái 22 <= Toán tử nhỏ hơn hay bằng 23 && Toán tử and 24 ! Toán tử phủ định (not) 25 II Toán tử or x % = y tương đương với x=x 26 %= Toán tử chia lấy số dư và gán %y 27 % Toán tử module x * = y tương đương với 28 *= Toán tử nhân và gán x=x*y 29 * Toán tử nhân 30 ~ Toán tử bù 1 x >> = y tương đương với 31 >>= Toán tử dịch phải và gán x=x>>y 32 >> Toán tử dịch phải 8 33 -> Toán tử con trỏ cấu trúc x - = y tương đương với x=x- 34 -= Toán tử trừ và gán y 35 - Toán tử trừ Xác định kích thước theo byte của 36 Sizeof toán tử a. Toán tử gán (=) Dùng để gán một giá trị nào đó cho một biến Ví dụ: A = 5; Gán biến A bằng 5 Ví dụ: A = 2+ (B = 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 = 5 và A = 7. Toán tử số học (+, -, *, /, %) 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ư. Ví dụ: A = 24; B = A % 5; Gán A bằng 24, B gán số dư của A chia cho 5, kết quả B bằng 4 Tổng quát cho toán tử gán phức hợp: biến += giá_trị tương đương với biến = biến + giá_trị.
Ví dụ: A+=5; tương đương với A = A +5; A /= 5; tương đương A = A / 5; B *= X + 1; tương đương B = B * (X+1); c. Toán tử tăng và giảm (++, --) Tổng quát cho toán tử gán phức hợp: biến += giá_trị tương đương với biến = biến + giá_trị. Ví dụ: A++;tương đương với A = A +1 hay A+=1; Ví dụ: B = 3; gán B bằng 3 A=++B; kết quả A bằng 4,B bằng 4 Ví dụ: B = 3; gán B bằng 3 A=B++; kết quả A bằng B và bằng 3, B tăng lên 1 bằng 4 Sự khác nhau là “++” đặt trước thì tính trước rồi mới gán, đặt sau thì gán trước rồi mới tính. Toán tử quan hệ (==, !=, >, < >=, <=) Các toán tử quan hệ dùng để so sánh các biểu thức, kết quả so sánh là đúng hoặc sai.
Các toán tử trên tương ứng là bằng, khác, lớn hơn, nhỏ hơn, lớn hơn hay bằng, nhỏ hơn hay Ví dụ: if (X<100) X+=1; Lệnh trên kiểm tra nếu X còn nhỏ hơn 100 thì tăng X lên 1. Toán tử logic (!, &&,l\) Các toán tử trên tương đương là NOT, AND và OR. Ví dụ: !true sẽ cho kết quả là false ((5==5) && (6>4)) and 2 điều kiện lại với nhau và kết quả là true. Toán tử xử lý bit (&, |,A, ~, <<, >>) Các toán tử xử lý bit với bit, các toán tử trên tương đương là AND, OR, XOR, 9 NOT, SHL (dịch trái), SHR (dịch phải).
Ví dụ: A=0x77; //gán A = 0111 0111B B=0XC9; //gán B = 1100 1001B X = A & B; // X bằng A and với B, kết quả X = 0100 0001B = 0X41 Y = A | B; // Y bằng A or với B, kết quả Y = 1111 llllB = 0XFF Z = A A B; // Z bằng A xor với B, kết quả Z = 1011 1110B = 0XBE W = ~A; // W bằng not A, kết quả W = 1000 1000B = 0X88 Ví dụ: A=0x01; //gán A = 0000 0001B A= (A <<1); //dịch A sang trái 1 bit, kết quả A = 0000 0010B. A= (A <<1); //dịch A sang trái 1 bit, kết quả A = 0000 0100B. Khi dịch trái thì bit bên trái mất, bit 0 thêm vào bên phải. Ví dụ: A=0x81; //gán A = 1000 0001B A= (A >>1); //dịch A sang phải 1 bit, kết quả A = 0100 0000B.
Khi dịch phải thì bit bên phải mất, bit 0 thêm vào bên trái. Ví dụ: A= 0x00 ; //gán A = 0000 0000B A= (A <<1) +0x01 ; //dịch A sang trái 1 bit rồi cộng với 1, kết quả A = 0000 0001B. A= (A <<1) + 0x01 ; //dịch A sang trái 1 bit rồi cộng với 1, kết quả A = 0000 0011B. Khi dịch trái và cộng với 1 thì có chức năng đẩy số 1 thêm vào bên phải, với dữ liệu 8bit thì sau 8 lần sẽ lấp đầy 8bit 1.
Toán tử lấy kích thước chuỗi theo bye () Ví dụ: A = sizeof (charac); kết quả là A sẽ chứa số byte của chuỗi charac 2. Các lệnh C cơ bản Chức năng: kiểm tra điều kiện nếu thỏa thì làm. Cú pháp: if (điều_kiện) Thành phần quan trọng thứ 3 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. Lệnh if và else: { Lệnh 1; Lệnh 2; } else { Lệnh 3; Lệnh 4; } Ví dụ 4-18: if (x==50) x=1; else x=x+1; b.
Lệnh lặp while: 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 1 điều kiện nào đó. Lệnh lặp do while: 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. Cú pháp: do { Lệnh 1; Lệnh 2; } while (điều_kiện) Ví dụ 4-20: Do { x=x+10;} while (x < 100) Thực hiện lệnh x bằng x cộng với 10, làm cho đến khi x nhỏ hơn 100. Lệnh lặp for: 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ị) { Lệnh 1; Lệnh 2; } Ví dụ: For (int n = 0; n <100; n++) {x=x+10;} 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. Lệnh rẽ nhánh break: 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.