Bài giảng Lập trình C cho vi xử lý - Phần cơ bản

C là một ngôn ngữkhá mạnh và rất nhiều ngưòi dùng .Nếu nói sốlệnh cơbản của C thì không nhiều

. Nhưng đối với lập trình cho vxl , chúng ta chi cần biết sốlượng lệnh không nhiều .

Đầu tiên bạn phải làm quen với

Các kiểu toán tử ởC

Các kiểu dữliệu

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

Các cấu trúc điều khiển (chính các tập lệnh )

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

Các cấu trúc lặp

Vòng lặp while

Vòng lặp do while

Vòng lặp for

Lệnh break.

Cấu trúc lựa chọn: switch. case

pdf16 trang | Chuyên mục: C/C++ | Chia sẻ: dkS00TYs | Lượt xem: 2075 | Lượt tải: 2download
Tóm tắt nội dung Bài giảng Lập trình C cho vi xử lý - Phần cơ bản, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
i=100 ; n!=i ; n++, i-- ) 
{ 
// cái gì ở đây cũng được... 
} 
Vi dụ điển hình nhất trong lập trình VXL 
void delayms(int n) 
{ 
int i,j; // khai bao bien chi trong chuong trinh con 
for (i=0;i<n;i++) 
for (j=0;j<1500;j++) { } // tham so j tuy thach anh toc do vxl ma cac 
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
 //ban thay doi cho phu hop 
} 
Các lệnh rẽ nhánh và lệnh nhảy 
Lệnh break. 
Sử dụng break chúng ta có thể thoát khỏi vòng lặp ngay cả khi điều kiện để nó kết thúc chưa được 
thoả mãn. Lệnh này có thể được dùng để kết thúc một vòng lặp không xác định hay 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. Ví dụ, chúng ta sẽ dừng việc đếm 
ngược trước khi nó kết thúc: 
Lệnh continue. 
Lệnh continue làm cho chương trình bỏ qua phần còn lại của vòng lặp và nhảy sang lần lặp tiếp 
theo. Ví dụ chúng ta sẽ bỏ qua số 5 trong phần đếm ngược: 
Lệnh goto. 
Lệnh này cho phép nhảy vô điều kiện tới bất kì điểm nào trong chương trình. Nói chung bạn nên 
tránh dùng nó trong chương trình C++. Tuy nhiên chúng ta vẫn có một ví dụ dùng lệnh goto để đếm 
ngược: 
Hàm exit. 
Mục đích của exit là kết thúc chương trình và trả về một mã xác định. Dạng thức của nó như sau 
void exit (int exit code); 
exit code được dùng bởi một số hệ điều hành hoặc có thể được dùng bởi các chương trình gọi. 
Theo quy ước, mã trả về 0 có nghĩa là chương trình kết thúc bình thường còn các giá trị khác 0 có 
nghĩa là có lỗi. 
các lệnh trên mình chủ yếu chỉ dùng lệnh break để thoát khỏi vòng lặp . Các lệnh khác thường rất ít 
dược sử dụng 
Đây là 1 đoạn code nhỏ mình trích ra từ chương trình của mình 
 while(1) 
{ 
lcd_gotoxy(5,0);lcd_putsf(" Run Thuan "); 
thuan(); 
if(!enter) { lcd_clear(); 
lcd_putsf("DA DUNG "); 
stop();break;} 
} 
Cấu trúc lựa chọn: switch. 
Cú pháp của lệnh switch hơi đặc biệt một chút. Mục đích của nó là kiểm tra một vài giá trị hằng 
cho một biểu thức, tương tự với những gì chúng ta làm ở đầu bài này khi liên kết một vài lệnh if 
và else if với nhau. Dạng thức của nó như sau: 
Code: 
switch (expression) { 
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
 case constant1: 
 block of instructions 1 
 break; 
 case constant2: 
 block of instructions 2 
 break; 
 . 
 . 
 . 
 default: 
 default block of instructions 
 } 
Nó hoạt động theo cách sau: switch tính biểu thức và kiểm tra xem nó có bằng constant1 hay 
không, nếu đúng thì nó thực hiện block of instructions 1 cho đến khi tìm thấy từ khoá break, sau 
đó nhảy đến phần cuối của cấu trúc lựa chọn switch. 
Còn nếu không, switch sẽ kiểm tra xem biểu thức có bằng constant2 hay không. Nếu đúng nó 
sẽ thực hiện block of instructions 2 cho đến khi tìm thấy từ khoá break. 
Cuối cùng, nếu giá trị biểu thức không bằng bất kì hằng nào được chỉ định ở trên (bạn có thể 
chỉ định bao nhiêu câu lệnh case tuỳ thích), chương trình sẽ thực hiện các lệnh trong phần 
default: nếu nó tồn tại vì phần này không bắt buộc phải có. 
nếu nút enter được bấm thì chương trình sẽ thoát ra khỏi vòng lặp while . 
III. C cho 8051 
1. Keil Variable Extensions  
data địa chỉ trực tiếp MOV A, 07Fh 
idata địa chỉ gián tiếp MOV R0, #080h 
 MOV A, R0 
xdata bộ nhớ ngoài MOVX @DPTR 
code bộ nhớ chương trình MOVC @A+DPTR 
VD 
unsigned int data bien = 0; // them data vao khai bao kieu bien 
Chú ý rằng , bạn có thể không cần khai báo cụ thể , chỉ cần 
unsigned int checksum = 0; 
2. Địa chỉ ngắt 
Interrupt Vector 
address 
Interrupt 
number 
External 0 0003h 0
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
Timer 0 000Bh 1
External 1 0013h 2
Timer 1 001Bh 3
Serial 0023h 4
org 00h 
ljmp main 
org 0003h 
ljmp ngat0 
org 30h 
main: // chuong trinh chinh 
... 
Here: sjmp Here // vong lap vo tan 
ngat0: 
... 
reti 
code C 
Code: 
void main // chuong trinh chinh 
{ 
... 
while(1) //vong lap vo tan sau khi thuc hien xong cong viec 
} 
void ngat0(void) interrupt 0 // chuong trinh ngat 
{ 
... 
} 
3. Một ví dụ hoàn thiện về lập trình C cho 8051 
#include 
#include 
#define strai3 P0_7 
#define strai2 P0_6 
#define strai1 P0_5 
#define strai0 P0_4 
#define sphai0 P0_3 
#define sphai1 P0_2 
#define sphai2 P0_1 
#define sphai3 P0_0 
////////////////////////// 
#define mtraif P1_0 
#define mtraib P1_1 
#define mphaif P1_2 
#define mphaib P1_3 
#define dc1f P1_6 
#define dc1b P1_7 
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
#define dc2f P1_4 
#define dc2b P1_5 
////////////////////////// 
#define f_an0 P2_0 
#define f_an1 P2_1 
#define f_an2 P2_2 
#define f_an3 P2_3 
////////////////////////// 
#define dc3f P2_4 
#define dc3b P2_5 
////////////////////////// 
#define start P3_6 
#define ctht1_batdau P3_1 
#define ctht2_ketthuc P3_2 
#define ctht3 P3_3 
#define ctht4 P3_4 
#define ctht5 P3_5 
#define ctht6 P3_6 
////////////////////////// 
#define tien 1 
#define lui 0 
////////////////////////// 
#define v_cham_trai 50 
#define v_cham_phai 50 
#define delta_v_cham_trai 20 
#define delta_v_cham_phai 20 
#define v_nhanh_trai 100 
#define v_nhanh_phai 100 
#define v_quay_trai 40 
#define v_quay_phai 60 
//////////////////////// 
//vach trang sensor=1 vach xanh sensor=0 
int t=0,i=0,j=0,k=0; 
int vtrai=100,vphai=100; 
int PWMC=0; 
int dem=0; 
int dirtrai=tien,dirphai=tien; 
int phuongan=0; 
/////////////////////////// 
void dithang(int v_left,int v_right); 
void dithangcham(int v_left,int v_right); 
void stop(void); 
void quayphai(void); 
void quaytrai(void); 
void ragach(void); 
void pwm(void) interrupt 1 ; 
void khoitao(void); 
void hanhtrinh(void); 
void ham(int time,int trai,int phai); 
void ham2(void); 
//======================================== 
void main(void) 
{ 
 khoitao(); 
 khoidongthang(); 
 hanhtrinh(); 
 ragach(); 
 stop(); 
} 
//========================================== 
void khoitao(void) 
{ 
 TMOD=0x02; 
 TH0=0xE1; TR0=1; IE=0x82; 
 P1=0x00;P2=0x00;P3=0x00; 
 while(!start) stop(); 
} 
//========================================== 
void khoidongthang(void) 
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
{ 
 for(i=0;i<300;i++) 
 { 
 dirtrai=tien;dirphai=tien; 
 vtrai=40; vphai=40; 
 } 
} 
//========================================== 
void khoidongquay(void) 
{ 
 dirtrai=tien;dirphai=tien; 
 vtrai=90; vphai=80; 
 for(i=1;i<=50;i++); 
 vtrai=52; vphai=40; 
 for(i=1;i<=580;i++); 
 ham(90,20,20); 
 do 
 { 
 dirtrai=tien;dirphai=lui; 
 vtrai=33;vphai=10; 
 } 
 while(!strai3); 
 for(i=1;i<=40;i++) 
 { 
 dirtrai=tien;dirphai=lui; 
 vtrai=33; vphai=9; 
 } 
 do 
 { 
 dirtrai=lui;dirphai=tien; 
 vtrai=15;vphai=32; 
 } 
 while(!strai0); 
 ham(100,20,20); 
 dirtrai=tien;dirphai=tien; 
} 
//========================================== 
void quayphai(void) 
{ 
 int ktra=0; 
 dirtrai=tien;dirphai=lui; 
 do 
 { 
 vtrai= v_quay_trai;vphai= v_quay_phai; 
 if (sphai3) ktra++; 
 } 
 while(ktra<20); 
 stop(); 
 for(i=1;i<1000;i++){}; 
 dirtrai=tien; dirphai=tien; 
} 
//////////////////////////////////// 
void quaytrai(void) 
{ 
 int ktra=0; 
 dirtrai=lui;dirphai=tien; 
 do 
 { 
 vtrai= 60; vphai= 40; 
 if (strai3)ktra++; 
 } 
 while(ktra<20); 
 stop(); 
 for(i=1;i<1000;i++){}; 
 dirtrai=tien; dirphai=tien; 
} 
//+++++++++++++++++++++++++++++++++++++ 
//vach trang sensor=1 vach xanh sensor=0 
void stop(void) 
{ 
 vtrai=0; vphai=0; 
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
} 
//======================================================================================= 
void dithang(int v_left,int v_right) 
{ 
 if(!(strai0||strai1||strai2||strai3||sphai0||sphai1||sphai2||sphai3)) // di thang 
 { 
 dirphai=tien;dirtrai=tien; 
 vtrai=v_left;vphai=v_right; 
 } 
 else 
 if((strai0&&strai1&&sphai0&&sphai1)) 
 { j=0; 
 for(i=1;i<=15;i++) 
 if((strai0&&strai1&&sphai0&&sphai1)) j++; 
 if(j>=10) { dem=dem+1;t=1 ;} 
 else t=0; 
 while(t)//cho qua vach trang 
 { 
 { //di thang 
 dirphai=tien;dirtrai=tien; 
 vtrai=40;vphai=40; 
 } 
 k=0; 
 for(i=1;i<=20;i++) 
 if(!(strai3||strai2||sphai3||sphai2)) k++; 
 if(k>15) t=0; 
 } 
 } 
 else if ((sphai2||sphai3)) //re phai lon 
 { 
 dirtrai=tien;dirphai=tien; 
 vtrai=60;vphai=0;} 
 else if ((strai0||strai1)) 
 //retrainho 
 { 
 dirtrai=lui;dirphai=tien; 
 vtrai=1;vphai=60; 
 } 
 else if ((sphai0||sphai1)) 
 //rephainho 
 { 
 dirtrai=tien;dirphai=lui; 
 vtrai=60;vphai=1; 
 } 
 else if ((strai2||strai3)) 
 //re trai lon 
 { 
 dirtrai=tien;dirphai=tien; 
 vtrai=0;vphai=60;} 
} 
//////////////////////////// 
void ragach(void) 
{ 
while(!ctht2_ketthuc) 
 { 
 dirtrai=tien;dirphai=tien; 
 vtrai=25;vphai=25; 
 dc1f=1;dc1b=0; 
 } 
 dc1f=0;dc1b=0; 
 //--------------------------------------- 
 for(t=1;t<=5;t++) 
 { 
 for(i=1;i<=10000;i++){ 
 dirtrai=tien;dirphai=tien; 
 vtrai=25;vphai=25;} 
Lập trình C cho VXL - Cơ bản VAGAM - giotdang 
 for(i=1;i<=10000;i++){ 
 dirtrai=lui;dirphai=lui; 
 vtrai=0;vphai=0;} 
 } 
 //------------------------- 
 dirtrai=lui;dirphai=lui; 
 vtrai=25;vphai=25; 
 for(i=1;i<=2000;i++); 
} 
////////////////////////// 
void pwm(void) interrupt 1 
{ 
 PWMC++; 
 if(PWMC==100) PWMC=0; 
 if(PWMC<vtrai) 
 { 
 mtraif=dirtrai; 
 mtraib=!dirtrai; 
 } 
 else 
 { 
 mtraif=0; 
 mtraib=0; 
 } 
 if(PWMC<vphai) 
 { 
 mphaif=dirphai; 
 mphaib=!dirphai; 
 } 
 else 
 { 
 mphaif=0; 
 mphaib=0; 
 } 
} 
void ham(int time,int trai,int phai) 
{ 
 int g; 
 for(g=0;g<=time;g++) 
 { 
 vphai=phai;vtrai=trai; 
 dirtrai=tien;dirphai=tien; 
 dirtrai=lui;dirphai=lui; 
 } 
 dirtrai=tien;dirphai=tien; 
 vphai=0;vtrai=0; 
} 
Chúc các bạn học lập trình C cho vi xử lý thật nhanh nhé . Đọc phần lý thuyết cơ bản 
sau đó đọc bài ví dụ cuối cùng . 
Nếu bạn còn gì chưa hiểu , hãy post lên để nhóm vagam giúp các bạn . 
 Thân 
 Lê Ngọc Tuấn – giotdang1985@yahoo.com 

File đính kèm:

  • pdfBài giảng Lập trình C cho vi xử lý - Phần cơ bản.pdf