Mục tiêu bài học
Trang bị cho học viên các kiến thức
Cấu trúc một chương trình C
Các loại hàm, biến trong ngôn ngữ C
Các cấu trúc điều khiển, vòng lặp của ngôn ngữ C
46 trang |
Chia sẻ: phuongt97 | Lượt xem: 573 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Bài giảng Ngôn ngữ lập trình C - Đỗ Bình Nguyên, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Biên soạn: Đỗ Bình NguyênNgôn ngữ lập trình CMục tiêu bài họcTrang bị cho học viên các kiến thứcCấu trúc một chương trình CCác loại hàm, biến trong ngôn ngữ CCác cấu trúc điều khiển, vòng lặp của ngôn ngữ CCấu trúc chương trình CCấu trúc chương trình CVí dụ:#include // thư viện dùng cho P8951RD2void delay (unsigned int n) //chương trình delay{ unsigned int i,j; for(i = 0; i unsigned char x;int y, Y;void func1 (void);void func2 (void){ //các câu lệnh}char func3 (void){ long tmp = 1; //các câu lệnh}void main (void){}void func1 (void){}Khai báo tập tin thư việnKhai báo biến toàn cụcKhai báo chương trình conKhai báo chương trình chínhMỗi chương trình bắt buộc phải có một hàm mainKhai báo biến cục bộKhai báo prototype cho chương trình conKhai báo chương trình conCấu trúc chương trình C t.t.Các câu lệnh trong hàm chính có thể gọi các hàm con đã khai báo hoặc không.Hàm chính và hàm con chỉ có thể gọi các hàm được khai báo phía trên nó.Các câu lệnh trong C kết thúc bằng dấu ;Khi có lời gọi hàm con nào thì chương trình sẽ nhảy đến thực hiện hàm con đó. Sau khi thực hiện xong sẽ nhảy về thực hiện tiếp các hàm hoặc câu lệnh trong chương trình chính.Đặt các lời giải thích bằng dấu // hoặc /* */Biến trong CCác kiểu biếnKiểu biếnĐộ dài (bit)Miền giá trịbit10, 1signed char8-128 +127unsigned char80 255enum8/16-128 +127 hoặc -32,768 32,767signed short int16-32,768 32,767unsigned short int160 65,535signed int16-32,768 32,767unsigned int160 65,535signed long int32-2,147,483,648 +2,147,483,647unsigned long int320 4,294,967,295float32±1.175494E-38 ±3.402823E+38double32±1.175494E-38 ±3.402823E+38sbit10, 1sfr80 255sfr16160 65,535Vùng chứa biếnTênMô tảcodeBộ nhớ chương trình (64KB)Truy cập bằng lệnh MOVC @A +DPTRdataVùng RAM nội truy cập trực tiếpidataVùng RAM nội truy cập gián tiếpxdataVùng RAM ngoài (64KB)Truy cập bằng lệnh MOVX @DPTRKhai báo biếnKiểu biến Vùng chứa Tên biếnVí dụ: unsigned char tmp; // biến kiểu char không dấu, chứa trong vùng RAM nội truy cập trực tiếpCó thể gán giá trị ban đầu cho biến ngay khi khai báo.Ví dụ:unsigned int xdata day_of_week = 7; // biến kiểu int có dấu, chứa trong RAM ngoàibit flagRun = 1; // biến kiểu bitCó thể khai báo cùng lúc nhiều biến có cùng kiểu.Ví dụ:signed char hour, min, sec;Biến phải được khai báo trước khi sử dụng.Khai báo biến t.t.Để biểu diễn một dãy số hay một bảng dữ liệu, ta có dữ liệu kiểu mảng.Mảng là một tập hợp nhiều phần tử có cùng kiểu giá trị, cùng một tên. Mỗi phần tử được truy cập bằng chỉ số của phần tử đó. Chỉ số mảng bắt đầu tính từ 0.Khai báo mảng như sau:Loại mảng Vùng chứa Tên mảng [Kích thước][Kích thước]Ví dụ:int arrSin[10]; // mảng kiểu int, một chiều, có 10 phần tử, chứa trong RAM nội.char xdata arrLed [8][16]; //mảng kiểu char không dấu, 2 chiều, kích thước 8 x 16, chứa trong RAM ngoài.arrSin[5] = 3; // gán giá trị 3 cho phần tử thứ 6 của mảng arrSinchar strName[] = “Lac Hong University”; // khai báo chuỗiCác toán tửToán tử gán (=)Toán tử gán dùng để gán một giá trị nào đó cho một biến. Vế trái bắt buộc phải là một biến còn vế phải có thể là bất kì hằng, biến hay kết quả của một biểu thức.Ví dụ:a = 5; //gán giá trị nguyên 5 cho biến a. a = b = c = 5; //gán giá trị 5 cho cả ba biến a, b, c a = b; //gán giá trị của biến b cho biến a, sự thay đổi của b sau đó sẽ không ảnh hưởng đến giá trị của a. Toán tử số họcNăm toán tử số học được hỗ trợ bởi ngôn ngữ là: cộng (+), trừ (-), nhân (*), chia (/), chia lấy phần dư (%)Thứ tự thực hiện các toán tử này giống như trong toán học.Ví dụ:a = 11 % 3; // biến a sẽ mang giá trị 2 sau khi thực hiệnToán tử quan hệ= = Bằng!= Khác> Lớn hơn= Lớn hơn hoặc bằng= 6) sẽ trả giá trị trueCho a=2, b=3 và c=6(a * b >= c) //sẽ trả giá trị true(b + 4 6) ) trả về false ( true && false ).( (5 == 5) || (3 > 6)) trả về true ( true || false ). Toán tử thao tác bitCác toán tử thao tác bit thay đổi các bit biểu diễn một biến, có nghĩa là thay đổi biểu diễn nhị phân của chúng& :AND| :OR^ :Exclusive OR~ :Đảo bit> :Dịch bit sang phảiVD:(0x0F & 0xAA)=0x0A //0000.1111 & 1010.1010 = 0000.1010~ 0xAA = 0x55 // ~ 1010.1010 = 0101.0101Toán tử điều kiện ( ? )Toán tử điều kiện tính toán một biểu thức và trả về một giá trị khác tuỳ thuộc vào biểu thức đó là đúng hay sai. Điều kiện ? Kết quả 1 : Kết quả 2Nếu Điều kiện là true thì giá trị trả về sẽ là Kết quả 1, nếu không giá trị trả về là Kết quả 2.Ví dụ:7 = = 5 ? 4 : 3 //trả về 3 vì 7 5.7 = = 5 + 2 ? 4 : 3 //trả về 4 vì 7 = 5 + 2.5 > 3 ? a : b //trả về a, vì 5 > 3.a > b ? a : b //trả về giá trị lớn hơn, a hoặc b. Toán tử gán phức hợpCác toán tử gán phức hợp (+=, -=, *=, /=, %=, >>=, ;}Nếu biểu thức điều kiện cho kết quả khác không thì thực hiện khối lệnh.Ví dụ: if (sensor == 1) // nếu cảm biến tác động{ turn_relay_on(); // bật relay stop_motor(); // dừng động cơ}Cấu trúc if .. elseif (biểu thức điều kiện){ ;}else{ ;}Nếu biểu thức điều kiện cho kết quả khác không thì thực hiện khối lệnh 1, ngược lại thì cho thực hiện khối lệnh 2.Cấu trúc switch caseswitch (biểu thức){ case n1: các câu lệnh; break; case n2: các câu lệnh; break; case ni: ; break; [default: các câu lệnh]}Cấu trúc switch case t.t.i là các hằng số nguyên hoặc ký tự.Phụ thuộc vào giá trị của biểu thức viết sau switch, nếu:Giá trị này bằng ni thì thực hiện câu lệnh sau case niKhi giá trị biểu thức không thỏa tất cả các ni thì thực hiện câu lệnh sau default nếu có, hoặc thoát khỏi câu lệnh switch.Khi chương trình đã thực hiện xong câu lệnh của case ni nào đó thì nó sẽ thực hiện luôn các lệnh thuộc case bên dưới nó mà không xét lại điều kiện. Vì vậy, để chương trình thoát khỏi lệnh switch sau khi thực hiện xong một trường hợp, ta dùng lệnh break.Cấu trúc switch case t.t.Ví dụ:switch (button) //nút nào được nhấn ??{ case 1: LCD_string(“Turning left") ; turn_left(); break ; case 2: LCD_string(“Turning right") ; turn_right(); break ; default: LCD_string(“Go straight”); go_straight();}Các cấu trúc lặpCấu trúc forfor (; ; ){ ;}Bất kỳ biểu thức nào trong 3 biểu thức trên cũng có thể vắng mặt (có thể vắng mặt cả 3) nhưng phải giữ dấu ;bt1: thường là phép gán để tạo giá trị ban đầu cho biến điều khiểnbt2: là điều kiện để tiếp tục vòng lặpbt3: là một phép gán để thay đổi giá trị của biến điều khiểnCấu trúc for t.t.Hoạt động của cấu trúc điều khiển for:Bước 1: Thực hiện bt1Bước 2: Xác định giá trị bt2Bước 3: Nếu bt2 sai: kết thúc vòng lặp forNếu bt2 đúng: thực hiện . Sau đó sẽ thực hiện bước 4.Bước 4: Xác định giá trị bt3, sau đó quay lại bước 2 để bắt đầu vòng lặp mớiCấu trúc for t.t.Ví dụ:for (i = 0; i ;}Hoạt động của cấu trúc while:Bước 1: Kiểm tra giá trị bieu_thucBước 2:Nếu bieu_thuc cho giá trị đúng: thực hiện và quay về bước 1.Nếu bieu_thuc sai: thoát khỏi vòng lặpCấu trúc while t.t.Ví dụ:i = 0;while (i ;} while (bieu_thuc)Hoạt động của cấu trúc while:Bước 1: thực hiện Bước 2: Kiểm tra giá trị bieu_thucNếu bieu_thuc cho giá trị đúng: quay về bước 1.Nếu bieu_thuc sai: thoát khỏi vòng lặpCấu trúc do while t.t.Ví dụ:i = 0;do{ P1_0 = 0; //tắt led delay(100); P1_0 = 1; //bật led delay(100); i ++;} while (i thoát khỏi vòng lặp}Lệnh continueLàm cho chương trình thực hiện tiếp vòng lặp mới, bỏ qua các câu lệnh khác nằm sau lệnh continue nàyChỉ được dùng trong các vòng lặpVí dụ:unsigned char strSource= “01203405678”;unsigned char i;for (i = 0; i thoát khỏi vòng lặp }}Lệnh return t.t.Ví dụ 2:/*Hàm tìm giá trị lớn nhất trong hai số*/char max (char a, char b){ if (a > b) return a; return b;}Hàm ngắtHàm ngắt là hàm do Keil C định nghĩa thêm để dùng riêng cho vi điều khiển. Đó là hàm sẽ được thực hiện khi có ngắt xảy ra.Khai báo hàm ngắt như sauvoid Tên hàm (void) interrupt interrupt_number using bank thanh ghiHàm ngắt không được trả về giá trị và không được nhận tham số vào.Hàm ngắt t.t.Interrupt_number là các giá trị tương ứng với nguồn ngắt được cho trong bảng sauBank thanh ghi: là bank thanh ghi trong RAM mà hàm ngắt sẽ thực hiện trên đó. Nhận các giá trị từ 0 3Interrupt numberNguồn ngắt0Ngắt ngoài 01Timer/Counter02Ngắt ngoài 13Timer/Counter 14Ngắt nối tiếp5Timer/Count 2 (Đối với họ 8052)Hàm ngắt t.t.Ví dụ:unsigned int intCnt;unsigned char second;void timer0 (void) interrupt 1 using 2 { if (++intCnt == 4000) //đếm đến 4000 { second ++; // đếm giây intCnt = 0; // reset intCnt }}
Các file đính kèm theo tài liệu này:
- bai_giang_ngon_ngu_lap_trinh_c_do_binh_nguyen.ppt