You are on page 1of 16

Lp trnh C cho VXL -

C bn


Vagamgiotdang

2007
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 = 5;
a = 2 + b;
a = 2 + (b = 5);
a = 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
Tont Mt Associativity
1 : : scope Tri
Lp trnh C cho VXL - C bn VAGAM - giotdang

2 ( ) [ ] - > . si zeof Tri


3
++ - - tng/gim
Phi
~ ongcbit
! NOT
& * Tontcontr
( type) Chuynikiu
+ - Dnghocm
4 * / % Tontshc Tri
5 + - Tontshc Tri
6 << >> Dchbit Tri
7 < <= > >= Tontquanh Tri
8 == ! = Tontquanh Tri
9 & ^ | Tontthaotcbit Tri
10 && | | Tontlogic Tri
11 ?: Tontiukin Phi
12
= += - = *= / = %=
>>= <<= &= ^= | =
Tontgn Phi
13 , Duphy Tri


3. Cc kiu d liu

Cc kiu bin.chun


Type
Bits Bytes Range
char 8 1 128to+127
unsignedchar 8 1 0to255
enum 16 2 32,768to+32,767
short 16 2 32,768to+32,767
unsignedshort 16 2 0to65,535
Lp trnh C cho VXL - C bn VAGAM - giotdang

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


Kiu d liutrongKeilC


Type
Bits Bytes Range
bit 1 0 0to1
sbit 1 0 0to1
sfr 8 1 0to255
sf16 16 2 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) // chuong trinh con dang ham
{
.
Return(a);
}

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) x++;
else x- -;


Cc cu trc lp

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

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
Vector
address
Interrupt
number
External0 0003h 0
Lp trnh C cho VXL - C bn VAGAM - giotdang

Timer0 000Bh 1
External1 0013h 2
Timer1 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. 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 P1_6
#define dc1b P1_7
Lp trnh C cho VXL - C bn 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)
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= 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;
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