Tìm hiểu lập trình C cho 8051

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

pdf25 trang | Chia sẻ: thienmai908 | Lượt xem: 1014 | Lượt tải: 0download
Bạn đang xem trước 20 trang nội dung tài liệu Tìm hiểu lập trình C cho 8051, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
L I M Đ UỜ Ở Ầ Trong l p trình vi x lý ngôn ng th ng dùng là ngôn ng l p trìnhậ ử ữ ườ ữ ậ ASM và ngôn ng C . Ngôn ng l pữ ữ ậ trình ASM hay l p trình h p ng là ngôn ng l p trình tr c ti p cho vi đi u khi n ( l p trình tr c ti p )ậ ợ ữ ữ ậ ự ế ề ể ậ ự ế còn ngôn ng C hay còn g i là l p trình h ng đ i t ng nó g n v i ngôn ng con ng i h n . Đi u nàyữ ọ ậ ướ ố ượ ầ ớ ữ ườ ơ ề có nghĩa là v i ASM ng i l p trình ra l nh tr c ti p thông qua ngôn ng câu l nh có tính ràng bu c cònớ ườ ậ ệ ự ế ữ ệ ộ ngôn ng C s d ng các c u trúc đi u ki n và vòng l p theo ý mu n .Nói v ngôn ng C thì ữ ử ụ ấ ề ệ ặ ố ề ữ u đi mư ể c a ngôn ng C là nó d hi u nh ng c u trúc l i dài và ph c t p so v i ngôn ng ASM . Ph n ti u lu nủ ữ ễ ể ư ấ ạ ứ ạ ớ ữ ầ ể ậ c a em g m 2 v n đ và chia làm 2 ph n chính ủ ồ ấ ề ầ 1. Tìm hi u l p trình C cho 8051ể ậ 2. Ch ng trình minh h a trên dãy led đ nươ ọ ơ Ph n I : Tìm hi u l p trình C cho 8051ầ ể ậ . 1. Gi i thi u :ớ ệ C là m t ngôn ng khá m nh và có r t nhi u ng i dung. Nh ng v i vi x lý ta ch c n bi t m t vài v nộ ữ ạ ấ ề ườ ư ớ ử ỉ ầ ế ộ ấ đ c b n sau :ề ơ ả + Các ki u toán t c a C .ể ử ủ + Các ki u d li u (int , float , double , char , unsigned char , …)ể ữ ệ + Các hàm trong C +C u trúc c b n c a m t ch ng trình.ấ ơ ả ủ ộ ươ + C u trúc đi u khi n hay các t p l nh.ấ ề ể ậ ệ 2. Ki n th c c b n v C :ế ứ ơ ả ề a. Các ki u toán t c a Cể ử ủ Toán t gánử (=) Các toán t s h cử ố ọ ( + , - ,* , / , % ) + c ngộ - trừ * nhân / chia % l y ph n d (trong phép chia)ấ ầ ư Các toán t gán ph c h pử ứ ợ : (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=) a -= 5; t ng đ ng v i a = a - 5;ươ ươ ớ a /= b; t ng đ ng v i a = a / b;ươ ươ ớ a*=2 ; t ng đ ng v i a = a*2ươ ươ ớ ……….. Tăng và gi mả ( ++ , -- ) a++; a+=1; a=a+1; a--; a+=1 a=a-1 Ti n t hay h u 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 Các toán t quan hử ệ ( = = , != , , = ) = = B ngằ != Khác > L n h nớ ơ < Nh h nỏ ơ > = L n h n ho c b ngớ ơ ặ ằ < = Nh h n ho c b ngỏ ơ ặ ằ Các toán t logicử (!, &&, || ) ! NOT && AND || OR Các toán t thao tác bit ử (&, |, ^, ~, > ) & AND Logical AND | OR Logical OR ^ XOR Logical exclusive OR ~ NOT Đ o ng c bitả ượ << SHL D ch bit sang tráiị >> SHR D ch bit sang ph iị ả *Th t u tiênứ ự ư 1 () [ ] -> . 2 ++ -- tăng/gi mả ~ Đ o ng c bitả ượ ! NOT & * Toán t con trử ỏ + - D ng ho c âmươ ặ 3 * / % Toán t s h c ử ố ọ 4 + - Toán t s h cử ố ọ 5 > D ch bit ị 6 >= Toán t quan h ử ệ 7 == != Toán t quan h ử ệ 8 & ^ | Toán t thao tác bit ử 9 && || Toán t logic ử 10 ?: Toán t đi u ki n ử ề ệ 11 = += -= *= /= %= >>= <<= &= ^= |= Toán t gán ử 12 , D u ph yấ ẩ b. Các ki u bi n d li u :ể ế ữ ệ 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 báo bi n:ế C u trúc :ấ Ki u bi nể ế Tên bi nế VD : unsigned char x; Ta cũng có th gán luôn giá tr ban đ u cho bi n. Nghĩa là thay vì:ể ị ầ ế unsigned char x; x=0; ta vi t là : unsigned char x=0;ế Ho c ta cũng có th khai báo nhiêu bi n m t lúc:ặ ể ế ộ unsigned char x,y,z; Ngoài ra dung cho vi đi u khi n trình biên dich chuyên d ng còn h tr các bi n sauề ể ụ ỗ ợ ế D ng bi nạ ế S Bitố S Byteố Mi n giá trề ị Bit 1 0 0 ; 1 sbit 1 0 0 ; 1 sfr 8 1 0 đ n 255ế sf16 16 & ; ;nbs p; 2 ; ; ; ;0 đ n 65,535ế Trong đó bit có th dung nh các bi n trong C nh ng các bi n còn l i thì liên quan đ n các thanh ghi ho cể ư ế ư ế ạ ế ặ đ a ch c ng cua 8051( có nghĩa là khi khai bao bi n ki u bit thì không c n đ nh đ a ch trong RAM cácị ỉ ổ ế ể ầ ị ị ỉ bi n khác ph i đ n rõ đ a ch trong RAM vì nó làế ả ị ị ỉ các d ng bi n đ c bi t g i là special function registersạ ế ặ ệ ọ (SFR) VD: bit kiemtra; sfr P1_0=0x90 Các SFR đ c khai báo trong th vi nượ ư ệ at89x51.h và at89x52.h c. Các hàm trong C Có hai loai hàm trong C : +Hàm tr lai giá tr :ả ị Ki u giá tr hàm tr l iể ị ả ạ Tên hàm(Bi n truy n vào hàm)ế ề { // Các câu l nh x lýệ ử } VD; unsigned char cong(unsigned char x, unsigned char y) + Hàm không tr l i giá trả ạ ị void Tên hàm( Bi n truy n vào hàm)ế ề { // các câu l nh x lýệ ử } VD: void cong(unsigned char x,unsigned char y) { //các câu l nhệ } (*) Hàm có th có bi n truy n vào ho c khôngể ế ề ặ + Hàm không có bi n truy n vàoế ề unsigned char Tên hàm(void) { //câu l nhệ } + Hàm có bi n truy n vàoế ề void Tên hàm(unsigned char x) { //các câu l nhệ } (**) S bi n truy n vào là tùy ý mi n sao là đ b nh , các bi n ngăn cách nhau b ng d u “,”.ố ế ề ễ ủ ộ ớ ế ằ ấ VD: void Tên hàm(unsigned char x,unsigned char y,unsigned char z) (***) Ngoài ra trong Keil C còn co m t lo i hàm là hàm ng t:ộ ạ ắ C u trúc:ấ void Tên hàm(void) interrupt ngu n ng t using băng thanh ghiồ ắ { } Hàm ng t không đ c phép tr l i giáắ ượ ả ạ tri hay truy n tham bi n vào hàmề ế Tên hàm : tùy ch nọ Interrupt : t khóa ch hàm ng từ ỉ ắ Ngu n ng t : t 0 đ n 5 theo b ng vecter ng tồ ắ ừ ế ả ắ Ng t do ắ Cờ Đ a ch vectorị ỉ Ngu n ng tồ ắ Reset h th ngệ ố RST 0000H - Ng t ngoài 0 ắ IE0 0003H 0 Timer 0 TF0&am p;am p;nb sp; 000BH 1 Ng t ngoài 1 ắ IE1 001 3H 2 Timer 1 TF1&am p;am p;nb sp; 001BH 3 Port n i ti pố ế RI ho c TIặ 0023H 4 Timer 2 TF2 ho c EXF2ặ 002BH 5 Băng thanh ghi trên RAM chon t 0 đ n 3.ừ ế d. Các câu l nh c b n c a Cệ ơ ả ủ + C u trúc đi u ki n: if , elseấ ề ệ C u trúc if : if (đi u ki n) l nh ( đ a ra đi u ki n và tuyên b th c hi n)ấ ề ệ ệ ư ề ệ ố ư ệ VD : if (x<10) x++; // n u x< 10 thì tăng x thêm 1ế C u trúc if & else : if (đi u ki n) l nh1 else l nh 2 ( th a mãn đi u ki n if thì th c hi nấ ề ệ ệ ệ ỏ ề ệ ự ệ l nh 1 cònệ ng c l i th c hi n l nh 2ượ ạ ự ệ ệ VD : if (x=10) x++; Elese x--; + C u trúc l p :ấ ặ - Vòng l p whileặ . D ng c a nó nh sau:ạ ủ ư while (bi u hi n) l nhể ệ ệ C u trúc hay găp trong ch ng trình vi x lý làấ ươ ử while(1) { //vòng l p mãi mãi ;ặ } T o vòng l p mãi mãi trong l p trình VXL .Ch ng trình chính s đ c vi t trong d uạ ặ ậ ươ ẽ ượ ế ấ ngo c.ặ - Vòng l p do-whileặ D ng th c:ạ ứ do l nh while (đi u ki n);ệ ề ệ VD: do { x++; // cho nay cac ban co the viet nhieu cau lenh , } while(x>10) tăng giá tr c a x cho đ n khi x > 10ị ủ ế Ch c năng c a nó là hoàn toàn gi ng vòng l p while ch tr có m t đi u là đi u ki n đi u khi n vòng l pứ ủ ố ặ ỉ ừ ộ ề ề ệ ề ể ặ đ c tính toán sau khi l nh đ c th c hi n, vì v y l nh s đ c th c hi n ít nh t m t l n ngay c khiượ ệ ượ ự ệ ậ ệ ẽ ượ ự ệ ấ ộ ầ ả đi u ki n không bao gi đ c tho mãn .Nh ví d trên k c x >10 thì nó v n tăng giá tr 1 l n tr cề ệ ờ ượ ả ư ụ ể ả ẫ ị ầ ướ khi thoát - Vòng l p for:ặ C u trúc : for (kh i t o;đi u ki n;tăng giá tr ) l nhấ ở ạ ề ệ ị ệ và ch c năng chính c a nó là l p l i l nh ch ng nào đi u ki n còn mang giá tr đúng, nhứ ủ ặ ạ ệ ừ ề ệ ị ư trong vòng l p while. Nh ng thêm vào đó, for cung c p ch dành cho l nh kh i t o và l nh tăng. Vì v yặ ư ấ ỗ ệ ở ạ ệ ậ vòng l p này đ c thi t k đ c bi t l p l i m t hành đ ng v i m t s l n xác đ nh.ặ ượ ế ế ặ ệ ặ ạ ộ ộ ớ ộ ố ầ ị Cách th c ho t đ ng c a nó nh sau:ứ ạ ộ ủ ư (*) Kh i t o đ c th c hi n. Nói chung nó đ t m t giá khí ban đ u cho bi n đi u khi n. L nh này đ cở ạ ượ ự ệ ặ ộ ầ ế ề ể ệ ượ th c hi n ch m t l n.ự ệ ỉ ộ ầ (**) Đi u ki n đ c ki m tra, n u nó là đúng vòng l p ti p t c còn n u không vòng l p k t thúc và l nhề ệ ượ ể ế ặ ế ụ ế ặ ế ệ đ c b qua.ượ ỏ (***) L nh đ c th c hi n. Nó có th là m t l nh đ n ho c là m t kh i l nh đ c bao trong m t c pệ ượ ự ệ ể ộ ệ ơ ặ ộ ố ệ ượ ộ ặ ngo c nh n.ặ ọ (****) Cu i cùng, th c hi n đ tăng bi n đi u khi n và vòng l p quay tr l i b c ki m tra đi u ki n.ố ự ệ ể ế ề ể ặ ở ạ ướ ề ề ệ Ph n kh i t o và l nh tăng không b t bu c ph i có. Chúng có th đ c b qua nh ng v n ph i có d uầ ở ạ ệ ắ ộ ả ể ượ ỏ ư ẫ ả ấ ch m ph y ngăn cách gi a các ph n. Vì v y, chúng ta có th vi t for (;n<10;) ho c for (;n<10;n++).ấ ẩ ữ ầ ậ ể ế ặ B ng cách s d ng d u ph y, chúng ta có th dùng nhi u l nh trong b t kì tr ng nào trong vòng for,ằ ử ụ ấ ẩ ể ề ệ ấ ườ nh là trong ph n kh i t o. Ví d chúng ta có th kh i t o m t lúc nhi u bi n trong vòng l p:ư ầ ở ạ ụ ể ở ạ ộ ề ế ặ for ( n=0, i=100 ; n!=i ; n++, i-- ) { // các câu l nh;ệ } VD: T o hàm delayms dung vòng lăp forạ void delay (unsigned int ms) // ham tao thoi gian tre ms { unsigned int i ; // ho c ta có th khai báo intặ ể i j; unsigned char j ; for (i=0;i<ms;i++) { for (j=0;j<125;j++) {} // khong lam gi ca } } + 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.ế // 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; } 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:ụ ẽ ỏ ố ầ ế ượ #include int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FIRE!"; return 0; } 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 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ượ ử ụ 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:ạ ứ ủ ư switch (expression) { 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ó.ầ ắ ộ ả e. C u trúc c b n c a c a m t ch ng trình C cho 8051 :ấ ơ ả ủ ủ ộ ươ + Ph n đ u tiên là li t kê các header fileầ ầ ệ Các b n dùng b ng t khóaạ ằ ừ #include “Tên các header” Ho c :ặ #incude Khi b n vi t theo cách th nh t thì trình biên d ch s tìm ki m file .h ho c .c này trong th m c hi n t iạ ế ứ ấ ị ẽ ế ặ ư ụ ệ ạ ch a d án c a b n, n u không có thì s tìm ki m trong th m c Inc trong th m c cài đ t KeilC.ứ ự ủ ạ ế ẽ ế ư ụ ư ụ ặ Vi t theo cách th hai thì trình biên d ch s tìm luôn trong th m c /INC luôn.ế ứ ị ẽ ư ụ Đ có th s d ng đúng các file .h cho các vi đi u khi n m th m c /inc trong th m c này có các thể ể ử ụ ề ể ở ư ụ ư ụ ư m c con nh tên c a hãng s n xu t. Ví d nh c a Atmel thì b n tìm trong th m c /Atmel thì s th yụ ư ủ ả ấ ụ ư ủ ạ ư ụ ẽ ấ đ c file reg51.hượ Ph n th 2 : Đ nh nghĩa các macro (thi t l p vĩ mô). Cách khai báo s d ng t khóa #define. Ví d :đầ ứ ị ế ậ ử ụ ừ ụ ể khai báo m c led 1 đ c n i v i chân 0 c a port 1 ta vi t nh sau ặ ượ ố ớ ủ ế ư #define led1 P1_0 + Các hàm ng t nh ng tắ ư ắ (timer0, timer1, ng t n i ti p, ng t ngoài )nêu ph n khai báo bi n . Copy l iắ ố ế ắ ở ầ ế ạ nh sau :ư C u trúc:ấ void Tên hàm(void) interrupt ngu n ng t using băng thanh ghiồ ắ { } Hàm ng t không đ c phép tr l i giáắ ượ ả ạ tri hay truy n tham bi n vào hàmề ế Tên hàm : tùy ch nọ Interrupt : t khóa ch hàm ng từ ỉ ắ Ngu n ng t : t 0 đ n 5 theo b ng vecter ng tồ ắ ừ ế ả ắ Ng t do ắ Cờ Đ a ch vectorị ỉ Ngu n ng tồ ắ Reset h th ngệ ố RST 0000H - Ng t ngoài 0 ắ IE0 0003H 0 Timer 0 TF0 000BH 1 Ng t ngoài 1 ắ IE1 0013H 2 Timer 1 TF1 001BH 3 Port n i ti pố ế RI ho c TIặ 0023H 4 Timer 2 TF2 ho c EXF2ặ 002BH 5 Băng thanh ghi trên RAM chon t 0 đ n 3.ừ ế void ngat4(void) interrupt 4 using 2 { //các câu l nhệ } Cú pháp các ng t khác cũng t ng t ch thay s 4 b ng s th t c a ng t trong b ng vector ng t.ắ ươ ự ỉ ố ằ ố ứ ự ủ ắ ả ắ + Các hàm con nh Delay, kh i t o,..ư ở ạ Vi c gây tr trong Keil C có nhi u cách khác nhau ệ ễ ề - Dùng vòng l p while for :ặ V i t n s th ch anh 11.0582 MHz thì m i vòng l p khi các b n debug s th y là chúng ta m t th i gianớ ầ ố ạ ỗ ặ ạ ẽ ấ ấ ờ th c kho ng 8.28 us. Do đó đ có th gây tr 1ms thì các b n c n dùng x p x 121 vòng l p ki u này.ự ả ể ể ễ ạ ầ ấ ỉ ặ ể Vi t ch ng trình 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 } } - Dùng Timer 0 ho c Timer 1ặ Ti p t c v i hàm delay() theo cách dùng b đ nh th i thì ta th y nó cũng gi ng nh ngôn ng ASM biênế ụ ớ ộ ị ờ ấ ố ư ữ d ch v i Topview Simulator . ị ớ Dùng b đ nh th i có 3 ch đ : ch đ 0, ch đ 1, ch đ 2. Chúng ta s s d ng ch đ kh i đ ng bộ ị ờ ế ộ ế ộ ế ộ ế ộ ẽ ử ụ ế ộ ở ộ ộ đ nh th i b ng ph n m m t c TMOD.3 và TMOD.7 =0ị ờ ằ ầ ề ứ Vi c xác đ nh ch đ nào ph thu c vào giá tr c a 2 bit TM1 và TM0 c a t ng timer( các b n xem đ nhệ ị ế ộ ụ ộ ị ủ ủ ừ ạ ị nghĩa t ng bít trong thanh ghi TMOD)ừ TM1=0, TM0 =0 ch đ 0 : Ch đ đ nh th i 13 bit , s đ m 0000H – 1FFFHế ộ ế ộ ị ờ ố ế TM1=0, TM0 =1 ch đ 1 : Ch đ đ nh th i 16 bit , s đ m 0000H - FFFFHế ộ ế ộ ị ờ ố ế TM1=1, TM0 =0 ch đ 2 : Ch đ đ nh th i 8 bit t đ ng n p s đ m 00H - FFHế ộ ế ộ ị ờ ự ộ ạ ố ế TM1=1, TM0 =1 ch đ 3 : Ch đ đ nh th i chia s s đ m 00H – FFHế ộ ế ộ ị ờ ẻ ố ế VD : Gây tr 1 ms = 1000us ta dùng ch đ đ nh th i 16 bit s d ngễ ế ộ ị ờ ử ụ timer 0 Tdelay=1000 s d ng calculator c a h đi u hành Windows XP trong Start\Program\Accessories\Calculatorử ụ ủ ệ ề ta đ c ượ TH0=FC TL0=18 V y ch ng trình s nh sau :ậ ươ ẽ ư void delay(unsigned ms) { while (ms--) { TMOD=0x01; //dùng timer 0 ch đ 1 ( 16bit )ế ộ TH0=0xfc; TL0=0x18; //hai câu l nh n p giá tri đ mệ ạ ế TR0=1; // cho phép timer 0 ho t đ ngạ ộ while (TF0); //ch TF0=1(c tràn =1 )ờ ờ TF0=0; //xóa c trànờ TR0=0; // ng ng Timerừ } } + Ch ng trình chính:ươ void main(void) { //c u trúc l nh đi u khi nấ ệ ề ể } đ i t ng c a ch ng trình là vi đi u khi n nên hàm main không có giá tr tr v và không có tham số ượ ủ ươ ề ể ị ả ề ố đ a vào. ư Ph n II : Ch ng trình ch y minh h a trên dãy ledầ ươ ạ ọ H ng d n s d ng Keil C.ướ ẫ ử ụ Cài đ t:ặ B c 1 : Ch y setupướ ạ B c 2: Ti n hành crackướ ế Th m c g m có các file sau đây:ư ụ ồ + Copy file l51.dll trong th m c vào trong ph n đã đ c cài đ t trong folder C:\Keil\C51\BIN ghi đè lênư ụ ầ ượ ặ ph n l51.dll file có s n . Sau đó ch y licgen-v32 và ch n nh hình v copy dãy ký t trong khung LIC0ầ ẵ ạ ọ ư ẽ ự M ch ng trình Keil C ch y HELLO.C ta th y ch ng trình báo l i : ở ươ ạ ấ ươ ỗ Vào trong File ch n m c Lisence Management nh p dãy ký t trong LIC0 vào add LICọ ụ ậ ự Đóng c a s Lisence Management l i ch y l i ch ng trình HELLO.C mà không th y báo l i n a làử ổ ạ ạ ạ ượ ấ ỗ ữ đ c.ượ Biên d ch trên Keil C :ị T o ch ng trình trên notepad đây em ví d ch ng trình ch y m t led sáng t t :ạ ươ ở ụ ươ ạ ộ ắ // Chuong trinh chay led don nhay //************************************************** #include // 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); } } M ch ng trình Keil C . Ch n New Projectở ươ ọ Đánh tên File Name ch n Save:ọ C a s hi n ra b ng sau ch n AT89C51 cung c p th vi n làm vi c c a 8051 nháy ch n OK:ử ổ ệ ả ọ ấ ư ệ ệ ủ ọ i p t c ch n Yesế ụ ọ Sau đó vào File ch n New ta đ cọ ượ Tiêp đó vào File ch n ti p Save đánh tên Fle name là “ 1ledsangtat.c” Save l i :ọ ế ạ Ch n ti p nh hình v :ọ ế ư ẽ Đánh tên Finame : “1ledsangtat.c” Add Hoàn thành: Copy t Notepad vào vùng so n th o. Vào Project ch n nh hình vừ ạ ả ọ ư ẽ Đánh d u nh hình v t o HEX File :ấ ư ẽ ạ Nh n F7 ki m tra l i :ấ ể ỗ T o file Hex đ mô ph ng: Nhân t h p phím Ctrl + F5. Ch ng trình s báo đ a ch l u :ạ ể ỏ ổ ợ ươ ẽ ị ỉ ư Ch y Led và mô phòng Protues.ạ Ch ng trình ch y ledươ ạ Ví d 1 :ụ Ch ng trình đi u khi n m t led sáng t t :ươ ề ể ộ ắ // Chuong trinh chay led don nhay //************************************************** #include // 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 :ụ Ch ng trình đi u khi n 8 led k t n i port 1 sángươ ề ể ế ố t t :ắ // Chuong trinh 8 led ket noi port1 san tat #include // 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 :ụ Ch ng trình k t n i 8led v i port 1 sáng d n t t h t :ươ ế ố ớ ầ ắ ế #include // 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 :ụ Ch ng trình đi u khi n 8led sáng đu i l n l t led 0 sáng các led còn l i t t , led 1 sáng các led cònươ ề ể ổ ầ ượ ạ ắ l i t t,….led 7 sáng các led còn l i t t :ạ ắ ạ ắ //******************************************* #include #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 : ụ Ch y t ng h p : ( 8 led ch y các ki u):ạ ổ ợ ạ ể // Chuong trinh 8 led ket noi port1 chay cac kieu #include // 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); } } Ch y mô ph ng trên Protues ạ ỏ S đ m ch đi u khi n 8 led :ơ ồ ạ ề ể Sau đây em xin trình bày ph ng pháp n p ch ng trình ch y cho IC . Đ u tiên click chu t ph i vào Icươ ạ ươ ạ ầ ộ ả ch n hàng Edit Proties ta th y hi n ra b ng sau:ọ ấ ệ ả Trong m c Program File ch n đ ng d n đ n file hex c n mô ph ng vi d ch ng trình led ch y cácụ ọ ườ ẫ ế ầ ỏ ụ ươ ạ ki u:ể sau đó ch n OK đ ch y mô ph ng nhân F12 ch ng trình s mô ph ng ọ ể ạ ỏ ươ ẽ ỏ Led sáng d n:ồ Led sáng đu i:ổ Led sáng d n t t h tầ ắ ế Bài ti u lu n:ể ậ df73f2072ed640e429f6c9b264c3a9a26c4ed87536eb Các file hex : 2072ed6406d2821b46ea49df0a154af670496da T NG K TỔ Ế Nói tóm l i vi c l p trình trên m i lo i ngôn ng đ u có u nh c đi m riêng đi u quan tr ng là n mạ ệ ậ ỗ ạ ữ ề ư ượ ể ề ọ ắ v ng m c đích c a vi c l p trình . Vi c h c l p trình tr c tiên là làm trên ngôn ng ASM phát tri n trênữ ụ ủ ệ ậ ệ ọ ậ ướ ữ ể ngôn ng này đ hi u rõ sau đó l p trình trên C . Ch ng trình ch y dãy led trên ngôn ng C là ví d đ nữ ể ể ậ ươ ạ ữ ụ ơ gi n và là ki n th c c b n đ u tiên khi b c vào tìm hi u C ng d ng c a l p trình h ng đ i t ngả ế ứ ơ ả ầ ướ ể ứ ụ ủ ậ ướ ố ượ vào l p trình VXL . T ch ng trình mô ph ng có th th y ngôn ng trong l p trình hoàn toàn có th hi uậ ừ ươ ỏ ể ấ ữ ậ ể ể đ c t nghĩa c a các t ng và câu l nh . Đó là lý do mà ngôn ng C ngày càng đ c ng d ng r ng rãiượ ừ ủ ừ ữ ệ ữ ượ ứ ụ ộ không ch trong l p trình VXL mà trong nhi u lĩnh v c khác .ỉ ậ ề ự Read more:

Các file đính kèm theo tài liệu này:

  • pdftim_hieu_lap_trinh_c_cho_ic8051.pdf
Tài liệu liên quan