// 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
25 trang |
Chia sẻ: thienmai908 | Lượt xem: 1137 | Lượt tải: 0
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:
- tim_hieu_lap_trinh_c_cho_ic8051.pdf