You are on page 1of 16

2007

Lp trnh C cho VXL C bn

Vagamgiotdang

ntuan BIA 8/15/2007

Lp trnh C cho VXL - C bn

VAGAM - giotdang

Lp trnh C cho VXL - C bn


I.Gii thiu
C l mt ngn ng kh mnh v rt nhiu ngi dng .Nu ni s lnh c bn ca C th khng nhiu . Nhng i vi lp trnh cho vxl , chng ta chi cn bit s lng lnh khng nhiu . u tin bn phi lm quen vi Cc kiu ton t C Cc kiu d liu Cu trc c bn ca mt chng trnh Cc cu trc iu khin (chnh cc tp lnh ) Cu trc iu kin : if v else Cc cu trc lp Vng lp while Vng lp do while Vng lp for Lnh break. Cu trc la chn: switch. case

Bit s dng cc hm v chng trnh con .

II.C bn C
1. Cc ch th trc x l ca Keil C
// chu thich

/********** chu thich****************** **************************************** *************************************** */ y l dng ch thch. Tt c cc dng bt u bng hai du s (//) c coi l cht thch m chng khng c bt k mt nh hng no n hot ng ca chng trnh. Chng c th c cc lp trnh vin dng gii thch hay bnh phm bn trong m ngun ca chng trnh. Trong trng hp ny, dng ch thch l mt gii thch ngn gn nhng g m chng trnh chng ta lm. Cn trong du (/* */) bn c th ch thch bao nhiu dng tu thch ,

Lp trnh C cho VXL - C bn

VAGAM - giotdang

#include <AT89X52.H> hoc #include "AT89X52.H" trnh bin dch s gi file th vin ca 89 ra (c bn l 51 cng nh 52) #define bien_thay_the bien Vd #define Congtac P0_6 port0.6 c t tn l congtac , khi ta gi tn ny trnh bin dch Keil s t chuyn ti bit qun l P0_6 Note :cch vit P0_6 ph thuc vo tng trnh bin dch , c chng trnh th li vit l P0.6 , cn keil C vit nh cch u #define m_left_tien P1_5 #define m_left_lui P1_4 #define m_left_forward m_left_tien=0;m_left_lui=1; cc bn ch y l mt cch s dng marco trong C khi mnh gi m_left_forward th chn P1_5 = 0 v P1_4=1 Cc vit ny gn nh cho chng ta mt chng trnh con , tuy nhin khng nn qu lm dng n Mt u im ni bt ca C l cc bn c th to ra cc b th vin . V d sau l to th vin thuvien.h (ui .h bn c th to bng cch save as .. *.h Keil C ). #ifndef _thuvien_H #define _thuvien_H ....//m chng trnh #endif

2. Cc ton t :
->Ton t gn (=). Ex:

Lp trnh C cho VXL - C bn

VAGAM - giotdang

b a a a = = = = 5; 2 + b; 2 + (b = 5); b = c = 5;

->Cc ton t s hc ( +, -, *, /, % ) + cng - tr * nhn / chia % ly phn d (trong php chia) ->Cc ton t gn phc hp (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) value += increase; tng ng vi value = value + increase; a -= 5; tng ng vi a = a - 5; a /= b; tng ng vi a = a / b; price *= units + 1; tng ng vi price = price * (units + 1); Tng v gim ++ --

a++; <=> a+=1; <=> a=a+1;


tnh cht tin t hoc hu t (++a) # (a++) Ex B=3; B=3;A=++B; // A is 4, B is 4 B=3; A=B++; // A is 3, B is 4 -> Cc ton t quan h ( ==, !=, >, <, >=, <= )

== Bng != Khc > Ln hn < Nh hn > = Ln hn hoc bng < = Nh hn hoc bng
EX

Lp trnh C cho VXL - C bn

VAGAM - giotdang

(7 == 5) s tr gi tr false (6 >= 6) s tr gi tr true


tt nhin thay v s dng cc s, chng ta c th s dng bt c biu thc no. Cho a=2, b=3 v c=6

(a*b >= c) s tr gi tr true. (b+4 < a*c) s tr gi tr false


Ch rng = (mt du bng) lf hon ton khc vi == (hai du bng). (==) nhm so snh cn (=)gn gi tr ca biu thc bn phi cho bin bn tri . -> Cc ton t logic ( !, &&, || ). ! NOT && AND || OR EX:

!(5 == 5) tr v false v biu thc bn phi (5 == 5) c gi tr true. !(6 <= 4) tr v true v (6 <= 4)c gi tr false. !true tr v false. !false tr v true. ( (5 == 5) && (3 > 6) ) tr v false ( true && false ). ( (5 == 5)
-> Cc ton t thao tc bit ( &, |, ^, ~, <<, >> ). & AND Logical AND | OR Logical OR ^ XOR Logical exclusive OR ~ NOT o ngc bit << SHL Dch bit sang tri >> SHR Dch bit sang phi ->Th t u tin ca cc ton t

Th t 1

Tont
::

Mt scope

Associativity Tri

Lp trnh C cho VXL - C bn

VAGAM - giotdang

2
() [ ] -> . sizeof ++ -- ~

Tri

tng/gim ongcbit NOT Tontcontr Chuynikiu Dnghocm Tontshc Tontshc Dchbit Tontquanh Tontquanh Tri Tri Tri Tri Tri Phi

! & * (type) + -

4 5 6 7 8 9 10 11 12 13

* / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= %= >>= <<= &= ^= |= ,

Tontthaotcbit Tri Tontlogic Tontiukin Tontgn Duphy Tri Phi Phi Tri

3. Cc kiu d liu
Cc kiu bin.chun Type char unsignedchar enum short unsignedshort

Bits
8 8 16 16 16

Bytes Range
1 1 2 2 2 128to+127 0to255 32,768to+32,767 32,768to+32,767 0to65,535

Lp trnh C cho VXL - C bn

VAGAM - giotdang

int unsignedint long unsignedlong 16 16 32 32 2 2 4 4 32,768to+32,767 0to65,535 2,147,483,648to +2,147,483,647 0to4,294,697,295

Kiu d liutrongKeilC

Type bit sbit sfr sf16

Bits
1 1 8 16

Bytes Range
0 0 1 2 0to1 0to1 0to255 0to65,535

4. Cu trc c bn ca 1 chng trnh C


//Cc ch th tin nh #include <lcd.h> //Gi th vin c sn cch vit khc "*.h" #define led1 PORTA.0 //dng nh ngha cc bin char bien1,bien2; //cac bien can dung int a,b; void chuongtrinhcon(unsigned int b) // chuong trinh con { } int ham(void) { . Return(a); } // chuong trinh con dang ham

Lp trnh C cho VXL - C bn

VAGAM - giotdang

void main(void) //chng trnh chnh { int a; // khai bao bien dang so nguyen chuongtrinhcon(); a = ham(); } Chng trnh con l ni cc bn vit cc chng trnh nh , rt tin cho cc on lnh gp li nhiu ln . Chng trnh con c th c th gi trong chng trnh chnh bt k u . Hm l chng trnh con tr v cho mnh mt gi tr. Cch s dng hm v chng trnh con cc bn nn tham kho thm quyn k thut lp trnh C hiu r hn .

5. Cc lnh c bn ca C
Cu trc iu kin: if v else ->if (condition) statement if (x == 100) x++; nu x=100 th tng x thm 1 ->if (condition) statement1 else statement2

if (x == 100) else x- -;
Cc cu trc lp

x++;

Vng lp while . Dng ca n nh sau: while (expression) statement while(1) {}; To vng lp mi mi , rt hay ng trong lp trnh VXL .Chng trnh chnh s c vit trong du ngoc. Vng lp do-while Dng thc: do statement while (condition); do {

Lp trnh C cho VXL - C bn

VAGAM - giotdang

x++; // cho nay cac ban co the viet nhieu cau lenh , } while(x>10) tng gi tr ca x cho n khi x > 10 Chc nng ca n l hon ton ging vng lp while ch tr c mt iu l iu kin iu khin vng lp c tnh ton sau khi statement c thc hin, v vy statement s c thc hin t nht mt ln ngay c khi condition khng bao gi c tho mn .Nh vd trn k c x >10 th n vn tng gi tr 1 ln trc khi thot

nu x=100 th tng x thm 1 cn khng th gim x. Vng lp for . Dng thc: for (initialization; condition; increase) statement; v chc nng chnh ca n l lp li statement chng no condition cn mang gi tr ng, nh trong vng lp while. Nhng thm vo , for cung cp ch dnh cho lnh khi to v lnh tng. V vy vng lp ny c thit k c bit lp li mt hnh ng vi mt s ln xc nh. Cch thc hot ng ca n nh sau: 1, initialization c thc hin. Ni chung n t mt gi kh ban u cho bin iu khin. Lnh ny c thc hin ch mt ln. 2, condition c kim tra, nu n l ng vng lp tip tc cn nu khng vng lp kt thc v statement c b qua. 3, statement c thc hin. N c th l mt lnh n hoc l mt khi lnh c bao trong mt cp ngoc nhn. 4, Cui cng, increase c thc hin tng bin iu khin v vng lp quay tr li bc 2. Phn khi to v lnh tng khng bt buc phi c. Chng c th c b qua nhng vn phi c du chm phy ngn cch gia cc phn. V vy, chng ta c th vit for (;n<10;) hoc for (;n<10;n++). Bng cch s dng du phy, chng ta c th dng nhiu lnh trong bt k trng no trong vng for, nh l trong phn khi to. V d chng ta c th khi to mt lc nhiu bin trong vng lp: for ( n=0, i=100 ; n!=i ; n++, i-- ) { // ci g y cng c... } Vi d in hnh nht trong lp trnh VXL
void delayms(int n) { int i,j; for (i=0;i<n;i++) for (j=0;j<1500;j++) { } // khai bao bien chi trong chuong trinh con // tham so j tuy thach anh toc do vxl ma cac

Lp trnh C cho VXL - C bn

VAGAM - giotdang

//ban thay doi cho phu hop } Cc lnh r nhnh v lnh nhy Lnh break. S dng break chng ta c th thot khi vng lp ngay c khi iu kin n kt thc cha c tho mn. Lnh ny c th c dng kt thc mt vng lp khng xc nh hay buc n phi kt thc gia chng thay v kt thc mt cch bnh thng. V d, chng ta s dng vic m ngc trc khi n kt thc: Lnh continue. Lnh continue lm cho chng trnh b qua phn cn li ca vng lp v nhy sang ln lp tip theo. V d chng ta s b qua s 5 trong phn m ngc: Lnh goto. Lnh ny cho php nhy v iu kin ti bt k im no trong chng trnh. Ni chung bn nn trnh dng n trong chng trnh C++. Tuy nhin chng ta vn c mt v d dng lnh goto m ngc: Hm exit. Mc ch ca exit l kt thc chng trnh v tr v mt m xc nh. Dng thc ca n nh sau void exit (int exit code); exit code c dng bi mt s h iu hnh hoc c th c dng bi cc chng trnh gi. Theo quy c, m tr v 0 c ngha l chng trnh kt thc bnh thng cn cc gi tr khc 0 c ngha l c li. cc lnh trn mnh ch yu ch dng lnh break thot khi vng lp . Cc lnh khc thng rt t dc s dng y l 1 on code nh mnh trch ra t chng trnh ca mnh while(1) { lcd_gotoxy(5,0);lcd_putsf(" Run Thuan thuan(); if(!enter) { lcd_clear(); lcd_putsf("DA DUNG "); stop();break;} }

");

Cu trc la chn: switch. C php ca lnh switch hi c bit mt cht. Mc ch ca n l kim tra mt vi gi tr hng cho mt biu thc, tng t vi nhng g chng ta lm u bi ny khi lin kt mt vi lnh if v else if vi nhau. Dng thc ca n nh sau: Code:
switch (expression) {

Lp trnh C cho VXL - C bn

VAGAM - giotdang

case constant1: block of instructions 1 break; case constant2: block of instructions 2 break; . . . default: default block of instructions }

N hot ng theo cch sau: switch tnh biu thc v kim tra xem n c bng constant1 hay khng, nu ng th n thc hin block of instructions 1 cho n khi tm thy t kho break, sau nhy n phn cui ca cu trc la chn switch. Cn nu khng, switch s kim tra xem biu thc c bng constant2 hay khng. Nu ng n s thc hin block of instructions 2 cho n khi tm thy t kho break. Cui cng, nu gi tr biu thc khng bng bt k hng no c ch nh trn (bn c th ch nh bao nhiu cu lnh case tu thch), chng trnh s thc hin cc lnh trong phn default: nu n tn ti v phn ny khng bt buc phi c.
nu nt enter c bm th chng trnh s thot ra khi vng lp while .

III. C cho 8051

1.KeilVariableExtensions
data a ch trc tip MOV A, 07Fh idata a ch gin tip MOV R0, #080h MOV A, R0 xdata b nh ngoi MOVX @DPTR code b nh chng trnh MOVC @A+DPTR

VD unsigned int data bien = 0; // them data vao khai bao kieu bien Ch rng , bn c th khng cn khai bo c th , ch cn unsigned int checksum = 0;

2. a ch ngt
Interrupt External0 Vector address 0003h Interrupt number 0

Lp trnh C cho VXL - C bn

VAGAM - giotdang

Timer0 External1 Timer1 Serial 000Bh 0013h 001Bh 0023h 1 2 3 4

org ljmp main org 0003h ljmp ngat0 org 30h

00h

main: ... Here: sjmp Here ngat0: ... reti

// chuong trinh chinh // vong lap vo tan

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. Mt v d hon thin v lp trnh C cho 8051


#include<AT89X52.h> #include<stdio.h> #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 #define dc1b

P1_6 P1_7

Lp trnh C cho VXL - C bn

VAGAM - giotdang

#define dc2f #define dc2b ////////////////////////// #define f_an0 #define f_an1 #define f_an2 #define f_an3 P2_3 ////////////////////////// #define dc3f #define dc3b ////////////////////////// #define start #define ctht1_batdau #define ctht2_ketthuc #define ctht3 #define ctht4 #define ctht5 #define ctht6 ////////////////////////// #define tien #define lui ////////////////////////// #define v_cham_trai #define v_cham_phai #define delta_v_cham_trai #define delta_v_cham_phai #define v_nhanh_trai #define v_nhanh_phai #define #define v_quay_trai v_quay_phai P1_4 P1_5 P2_0 P2_1 P2_2 P2_4 P2_5 P3_6 P3_1 P3_2 P3_3 P3_4 P3_5 P3_6 1 0 50 50 20 20 100 100 40 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)

Lp trnh C cho VXL - C bn

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= 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;

40;

Lp trnh C cho VXL - C bn

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;}

Lp trnh C cho VXL - C bn

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; }

Chc cc bn hc lp trnh C cho vi x l tht nhanh nh . c phn l thuyt c bn sau c bi v d cui cng . Nu bn cn g cha hiu , hy post ln nhm vagam gip cc bn . Thn L Ngc Tun giotdang1985@yahoo.com

You might also like