You are on page 1of 29

Tm hiu lp trnh C cho 8051.

1. Gii thiu :
C l mt ngn ng kh mnh v c rt nhiu ngi dung. Nhng vi vi x l ta ch cn bit mt vi vn c bn sau : + Cc kiu ton t ca C . + Cc kiu d liu (int , float , double , char , unsigned char , ) + Cc hm trong C +Cu trc c bn ca mt chng trnh. + Cu trc iu khin hay cc tp lnh.

2. Kin thc c bn v C :
a. Cc kiu ton t ca C
Ton t gn (=) Cc ton t s hc ( + , - ,* , / , % ) + cng - tr * nhn / chia % ly phn d (trong php chia) Cc ton t gn phc hp : (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) a -= 5; tng ng vi a = a - 5; a /= b; tng ng vi a = a / b; a*=2 ; tng ng vi a = a*2 .. Tng v gim ( ++ , -- ) a++; <=> a+=1; <=> a=a+1; a--; <=> a+=1 <=> a=a-1 Tin t hay hu t ( ++a ; a++ ) B=3; B=3;A=++B; // A l 4, B l 4 Hay : B=3; A=B++; // A l 3, B l 4 Cc ton t quan h ( = = , != ,< , > , <= , >= ) = = Bng != Khc > Ln hn < Nh hn > = Ln hn hoc bng < = Nh hn hoc bng Cc ton t logic (!, &&, || ) ! NOT && AND || OR 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 1 () [ ] -> . 2 ++ -- tng/gim ~ o ngc bit ! NOT & * Ton t con tr + - Dng hoc m 3 * / % Ton t s hc 4 + - Ton t s hc 5 << >> Dch bit 6 < <= > >= Ton t quan h 7 == != Ton t quan h 8 & ^ | Ton t thao tc bit 9 && || Ton t logic 10 ?: Ton t iu kin 11 = += -= *= /= %= >>= <<= &= ^= |= Ton t gn 12 , Du phy

b. Cc kiu bin d liu :


Char : 1byte ( -128 ; 127 ) Unsigned char : 1byte ( 0; 255) Enum : 2byte ( -32,768 ; 32,768 ) Short : 2byte ( -32,768 ; 32,768 ) Unsigned short : 2byte ( 0 ; 65,535 ) Int : 2byte ( -32,768 ; +32,767 ) Unsigned int : 2byte (0 ; 65,535 ) Long : 4byte (- 2,147,483,648 ; +2,147,483,647 ) Unsigned long : 4byte (0 ; 4,294,697,295 ) . Khai bo bin: Cu trc : Kiu bin Tn bin VD : unsigned char x; Ta cng c th gn lun gi tr ban u cho bin. Ngha l thay v: unsigned char x; x=0;

ta vit l : unsigned char x=0; Hoc ta cng c th khai bo nhiu bin mt lc: unsigned char x,y,z; Ngoi ra dung cho vi iu khin trnh bin dich chuyn dng cn h tr cc bin sau Dng bin S Bit S Byte Min gi tr Bit 1 0 0;1 sbit 1 0 0;1 sfr 8 1 0 n 255 sf16 16 2 0 n 65,535 Trong bit c th dung nh cc bin trong C nhng cc bin cn li th lin quan n cc thanh ghi hoc a ch cng cua 8051( c ngha l khi khai bao bin kiu bit th khng cn nh a ch trong RAM cc bin khc phi n r a ch trong RAM v n l cc dng bin c bit gi l special function registers (SFR) VD: bit kiemtra; sfr P1_0=0x90 Cc SFR c khai bo trong th vin at89x51.h v at89x52.h

c. Cc hm trong C
C hai loai hm trong C : +Hm tr lai gi tr: Kiu gi tr hm tr li Tn hm(Bin truyn vo hm) { // Cc cu lnh x l } VD; unsigned char cong(unsigned char x, unsigned char y) + Hm khng tr li gi tr void Tn hm( Bin truyn vo hm) { // cc cu lnh x l } VD: void cong(unsigned char x,unsigned char y) { //cc cu lnh } (*) Hm c th c bin truyn vo hoc khng + Hm khng c bin truyn vo unsigned char Tn hm(void) { //cu lnh } + Hm c bin truyn vo

void Tn hm(unsigned char x) { //cc cu lnh } (**) S bin truyn vo l ty min sao l b nh , cc bin ngn cch nhau bng du ,. VD: void Tn hm(unsigned char x,unsigned char y,unsigned char z) (***) Ngoi ra trong Keil C cn co mt loi hm l hm ngt: Cu trc: void Tn hm(void) interrupt ngun ngt using bng thanh ghi { } Hm ngt khng c php tr li gi tri hay truyn tham bin vo hm Tn hm : ty chn Interrupt : t kha ch hm ngt Ngun ngt : t 0 n 5 theo bng vecter ngt Ngt do C a ch vector Ngun ngt Reset h thng RST 0000H Ngt ngoi 0 IE0 0003H 0 Timer 0 TF0 000BH 1 Ngt ngoi 1 IE1 0013H 2 Timer 1 TF1 001BH 3 Port ni tip RI hoc TI 0023H 4 Timer 2 TF2 hoc EXF2 002BH 5 Bng thanh ghi trn RAM chon t 0 n 3.

d. Cc cu lnh c bn ca C
+ Cu trc iu kin: if , else Cu trc if : if (iu kin) lnh ( a ra iu kin v tuyn b thc hin) VD : if (x<10) x++; // nu x< 10 th tng x thm 1 Cu trc if & else : if (iu kin) lnh1 else lnh 2 ( tha mn iu kin if th thc hin lnh 1 cn ngc li thc hin lnh 2 VD : if (x=10) x++; Elese x--; + Cu trc lp : - Vng lp while . Dng ca n nh sau: while (biu hin) lnh Cu trc hay gp trong chng trnh vi x l l while(1) { //vng lp mi mi ; } To vng lp mi mi trong lp trnh VXL .Chng trnh chnh s c vit trong du ngoc. - Vng lp do-while

Dng thc: do lnh while (iu kin); VD: do


{

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 lnh c thc hin, v vy lnh s c thc hin t nht mt ln ngay c khi iu kin khng bao gi c tho mn .Nh v d trn k c x >10 th n vn tng gi tr 1 ln trc khi thot - Vng lp for: Cu trc : for (khi to;iu kin;tng gi tr) lnh v chc nng chnh ca n l lp li lnh chng no iu kin 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: (*) Khi to c thc hin. Ni chung n t mt gi kh ban u cho bin iu khin. Lnh ny c thc hin ch mt ln. (**) iu kin c kim tra, nu n l ng vng lp tip tc cn nu khng vng lp kt thc v lnh c b qua. (***) Lnh c thc hin. N c th l mt lnh n hoc l mt khi lnh c bao trong mt cp ngoc nhn. (****) Cui cng, thc hin tng bin iu khin v vng lp quay tr li bc kim tra iu kin. 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-- ) { // cc cu lnh; } VD: To hm delayms dung vng lp for void delay (unsigned int ms) // ham tao thoi gian tre ms { unsigned int i ; // hoc ta c th khai bo int i j; unsigned char j ; for (i=0;i<ms;i++) { for (j=0;j<125;j++)

{} // khong lam gi ca } } + 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. // break loop example #include int main () { int n; for (n=10; n>0; n--) { cout << n << ", "; if (n==3) { cout << "dung dem; break; //dem den 3 thi dung; }} return 0; } 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: #include int main ()

{ for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FIRE!"; return 0; } 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 ch yu ch dng lnh break thot khi vng lp . Cc lnh khc thng rt t dc s dng 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: switch (expression) { 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.

e. Cu trc c bn ca ca mt chng trnh C cho 8051 :


+ Phn u tin l lit k cc header file m cc bn dng bng t kha #include Tn cc header Hoc : #incude <Tn cc header> Khi bn vit theo cch th nht th trnh bin dch s tm kim file .h hoc .c ny trong th mc hin ti cha d n ca bn, nu khng c th s tm kim trong th mc Inc trong th mc ci t KeilC. Vit theo cch th hai th trnh bin dch s tm lun trong th mc /INC lun. c th s dng ng cc file .h cho cc vi iu khin m th mc /inc trong th mc ny c cc th mc con nh tn ca hng sn xut. V d nh ca Atmel th bn tm trong th mc /Atmel th s thy c file reg51.h Phn th 2 : nh ngha cc macro (thit lp v m). Cch khai bo s dng t kha #define. V d: khai bo mc led 1 c ni vi chn 0 ca port 1 ta vit nh sau #define led1 P1_0 + Cc hm ngt nh ngt timer0, timer1, ngt ni tip, ngt ngoi (nu phn khai bo bin . Copy li nh sau : Cu trc: void Tn hm(void) interrupt ngun ngt using bng thanh ghi { } Hm ngt khng c php tr li gi tri hay truyn tham bin vo hm Tn hm : ty chn Interrupt : t kha ch hm ngt Ngun ngt : t 0 n 5 theo bng vecter ngt Ngt do C a ch vector Ngun ngt Reset h thng RST 0000H Ngt ngoi 0 IE0 0003H 0 Timer 0 TF0 000BH 1 Ngt ngoi 1 IE1 0013H 2

Timer 1 Port ni tip Timer 2

TF1 RI hoc TI TF2 hoc EXF2

001BH 0023H 002BH

3 4 5

Bng thanh ghi trn RAM chon t 0 n 3. void ngat4(void) interrupt 4 using 2 { //cc cu lnh } C php cc ngt khc cng tng t ch thay s 4 bng s th t ca ngt trong bng vector ngt. + Cc hm con nh Delay, khi to,.. Vic gy tr trong Keil C c nhiu cch khc nhau - Dng vng lp while for : Vi tn s thch anh 11.0582 MHz th mi vng lp khi cc bn debug s thy l chng ta mt thi gian thc khong 8.28 us. Do c th gy tr 1ms th cc bn cn dng xp x 121 vng lp kiu ny. Vit chng trnh nh sau: //***************************** void delay (unsigned int ms) // ham tao thoi gian tre ms { unsigned int i ; unsigned char j ; //khai bao bien 1 byte for (i=0;i<ms;i++) { for (j=0;j<125;j++) {} // khong lam gi ca } } - Dng Timer 0 hoc Timer 1 Tip tc vi hm delay() theo cch dng b nh thi th ta thy n cng ging nh ngn ng ASM bin dch vi Topview Simulator . Dng b nh thi c 3 ch : ch 0, ch 1, ch 2. Chng ta s s dng ch khi ng b nh thi bng phn mm tc TMOD.3 v TMOD.7 =0 Vic xc nh ch no ph thuc vo gi tr ca 2 bit TM1 v TM0 ca tng timer( cc bn xem nh ngha tng bt trong thanh ghi TMOD) TM1=0, TM0 =0 ch 0 : Ch nh thi 13 bit , s m 0000H 1FFFH TM1=0, TM0 =1 ch 1 : Ch nh thi 16 bit , s m 0000H - FFFFH TM1=1, TM0 =0 ch 2 : Ch nh thi 8 bit t ng np s m 00H - FFH TM1=1, TM0 =1 ch 3 : Ch nh thi chia s s m 00H FFH VD : Gy tr 1 ms = 1000us ta dng ch nh thi 16 bit s dng timer 0 Tdelay=1000 s dng calculator ca h iu hnh Windows XP trong Start\Program\Accessories\Calculator ta c TH0=FC TL0=18 Vy chng trnh s nh sau :

void delay(unsigned ms) { while (ms--) { TMOD=0x01; //dng timer 0 ch 1 ( 16bit ) TH0=0xfc; TL0=0x18; //hai cu lnh np gi tri m TR0=1; // cho php timer 0 hot ng while (TF0); //ch TF0=1(c trn =1 ) TF0=0; //xa c trn TR0=0; // ngng Timer } } + Chng trnh chnh: void main(void) { //cu trc lnh iu khin } i tng ca chng trnh l vi iu khin nn hm main khng c gi tr tr v v khng c tham s a vo.

3. Tng kt:
Trn y l kin thc c bn v vn dng ngn ng C cho lp trnh vi iu khin . Cc cu lnh trong C c tnh cht tng ng so vi ngn ng ASM nm c ni dung cu lnh ca ASM ta c th lm c trn ngn ng C v ngc li . Sau y em lm mt vi v d n gin iu khin led bin dch trn Keil C

Bc 1 : Hng dn s dng Keil C.


V d bin dch chng trnh n gin chy mt led sng tt : To chng trnh trn notepad

M chng trnh Keil C . Chn New Project

nh tn File Name chn Save:

Ca s hin ra bng sau chn AT89C51 cung cp th vin lm vic ca 8051 nhy chn OK:

Chon Yes

Sau vo File chn New ta c

Tip vo File chn tip Save nh tn Fle name l 1ledsangtat.c Save li :

Chn tip nh hnh v:

nh tn Finame : 1ledsangtat.c Add

Hon thnh:

Copy t Notepad vo vng son tho. Vo Project chn nh hnh v

nh du nh hnh v to HEX File :

Nhn F7 kim tra li :

To file Hex m phng: Nhn t hp phm Ctrl + F5. Chng trnh s bo a ch lu :

Vy l to c file trong vng lu d chn

Bc 2 : Chy Led v m phng Protues.


Cc bc bin dch tng t phn trn ta tin hnh m phng Protues

V d 1 :
Chng trnh iu khin mt led sng tt : // Chuong trinh chay led don nhay //************************************************** #include <regx51.h> // Khai bao thu vien 8051 #define led P1_0 // Led ket noi chan P1.0 void delay (unsigned int ms) // ham tao thoi gian tre ms { unsigned int i ; unsigned char j ; //khai bao bien 1 byte for (i=0;i<ms;i++) { for (j=0;j<125;j++) // 1 vong lap for mat 8 us //Nhu vay ta co: ms*(125*8)=1000*1000 ~= 1s // ********************************************* {} // khong lam gi ca } }

main () //Chuong trinh chinh { while (1) // vong lap vo han { led=0; // Led tat delay (1000); led=1; // Led sang delay (1000); } }

V d 2 :
Chng trnh iu khin 8 led kt ni port 1 sng tt : // Chuong trinh 8 led ket noi port1 san tat #include <regx51.h> // khai bao chuong trinh thu vien 8051 #define led P1 // Led ket noi port 1 void delay (unsigned int ms) // Ham tao thoi gian tre ms { unsigned int i ; unsigned char j ; //Khai bao bien 1 byte for (i=0;i<ms;i++) { for (j=0;j<125;j++) // 1vong lap for mat 8us //Nhu vay ta co: ms*(125*8)=1000*1000 ~= 1ms // ********************************************* {} // Khong lam gi ca } } main () { while (1) // Tao vong lap vo han { P1=0x00;//0x00=00000000 delay(1000);// ham tre 1000ms=1s P1=0xff;//0xff=11111111 delay(1000); } }

V d 3 :
Chng trnh kt ni port 1 sng dn tt ht : #include <regx51.h> // Khai bao thu vien 8051 #define led P1 // Led ket noi port 1 void delay (unsigned int ms) // ham tao tre ms { unsigned int i ;

unsigned char j ; //khai bien 1 byte for (i=0;i<ms;i++) { for (j=0;j<125;j++) // 1 vong lap for mat 8 us // Nhu vay ta co: ms*(125*8)=1000*1000 ~= 1ms // ********************************************* {} // khong lam gi ca } } main () { while (1) // vong lap vo han; { P1=0x00;// hien thi 0 led; delay(1000);// tre 1000ms=1s; P1=0x01;//hien thi 1 led; delay(1000); P1=0x03;//hien thi 2 led; delay(1000); P1=0x07;//hien thi 3 led; delay(1000); P1=0x0f;//hien thi 4 led; delay(1000); P1=0x1f;//Hien thi 5 led; delay(1000); P1=0x3f;//hien thi 6 led; delay(1000); P1=0x7f;//hien thi 7 led; delay(1000); P1=0xff;//hien thi 8 led delay(1000); } }

V d 4 :
Chng trnh iu khin 8led sng ui ln lt led 0 sng cc led cn li tt , led 1 sng cc led cn li tt,.led 7 sng cc led cn li tt : //******************************************* #include <regx51.h> #define led P1 void delay (unsigned int ms) // ham tao tre ms { unsigned int i ; unsigned char j ; //khai bien 1 byte for (i=0;i<ms;i++)

{ for (j=0;j<125;j++) // 1 vong lap for mat 8 us // Nhu vay ta co: ms*(125*8)=1000*1000 ~= 1ms // ********************************************* {} // khong lam gi ca } } main () { while (1) { P1=0X01;delay(1000); P1=0X02;delay(1000); P1=0X04;delay(1000); P1=0X08;delay(1000); P1=0X10;delay(1000); P1=0X20;delay(1000); P1=0X40;delay(1000); P1=0X80;delay(1000); } } V d 5 : Chy tng hp : ( 8 led chy cc kiu): // Chuong trinh 8 led ket noi port1 chay cac kieu #include <regx51.h> // khai bao chuong trinh thu vien 8051 #define led P1 // Led ket noi port 1 void delay (unsigned int ms) // Ham tao thoi gian tre ms { unsigned int i ; unsigned char j ; //Khai bao bien 1 byte for (i=0;i<ms;i++) { for (j=0;j<125;j++) // 1vong lap for mat 8us //Nhu vay ta co: ms*(125*8)=1000*1000 ~= 1ms // ********************************************* {} // Khong lam gi ca } } void sangdon(void) { P1=0x00;//0x00=00000000 delay(1000);// ham tre 1000ms=1s P1=0xff;//0xff=11111111

delay(1000); } void sangdan(void) { P1=0x00;// hien thi 0 led; delay(1000);// tre 1000ms=1s; P1=0x01;//hien thi 1 led; delay(1000); P1=0x03;//hien thi 2 led; delay(1000); P1=0x07;//hien thi 3 led; delay(1000); P1=0x0f;//hien thi 4 led; delay(1000); P1=0x1f;//Hien thi 5 led; delay(1000); P1=0x3f;//hien thi 6 led; delay(1000); P1=0x7f;//hien thi 7 led; delay(1000); P1=0xff;//hien thi 8 led delay(1000); } void sangduoi(void) { P1=0X01;delay(1000); P1=0X02;delay(1000); P1=0X04;delay(1000); P1=0X08;delay(1000); P1=0X10;delay(1000); P1=0X20;delay(1000); P1=0X40;delay(1000); P1=0X80;delay(1000); } main () { while (1) { sangdon();delay(1000);

sangdan();delay(1000); sangduoi();delay(1000); } }

You might also like