mo dau 8051 B1

Màu nền
Font chữ
Font size
Chiều cao dòng

vi dụ đầu tiên:Nối A của led với P1.0 ,K nối với GND, và cho nó nhấp nháy nhanh hay chậm, tùy bạn.

___________________

Code:

#include<regx51.h>//khai báo cho chương trình mình dùng thư viện của 8051

#define led P1_0//Led được nối với P1_0,chú ý viết hoa chữ "P"nhé

void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms

{

unsigned int i;

unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte

for(i=0;i<ms;i++)

for(j=0;j<120;j++)

{}//không làm gì cả

}

main()//Chương trình chính

{

While(1)//tạo vòng lặp vô hạn

{

led=0;//tắt led

delay(1000);//tạo độ trễ 1000ms=1s

led=1;//bật led

delay(1000);

}

}Thế là xong ct đầu tiên, bạn chỉ việc copy,paste, và dịch nó thành file hex ,nạp vào chip,cắm vào mạch và thấy thành quả của mình.

Bây giờ bạn lại muốn 8 con led cùng nhấp nháy thì làm sao?cực kỳ đơn giản.

Nối các led như vd trên vào P1(từ P1.0->P1.7)

và chương trình sẽ là:

________________

Code:

#include<regx51.h>

void delay(unsigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms

{

unsigned int i;

unsigned char j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte

for(i=0;i<ms;i++)

for(j=0;j<120;j++)

{}//không làm gì cả

}

main()//Chương trình chính

{

While(1)//tạo vòng lặp vô hạn

{

P1=0x00;//"0x00"là giá trị viết trong hệ hex, cái này=00000000

delay(1000);//tạo độ trễ 1000ms=1s

P1=0xff;//"0xff"là giá trị viết trong hệ hex, cái này=11111111

delay(1000);

}

}

}

Ví dụ 3:Bây gờ bạn cũng nối 8 led như trên vd2 vào P1.(Ta ký hiệu led nối vào P1.0 là led0,vào P1.1 là led1,...)

Bài toán đặt ra là:Đầu tiên led0 sáng(các led còn lại tắt), tiếp theo led1 sáng(tất nhiên các led còn lại tắt),...cho đến led7 và lặp lại như ban đầu.

Các bạn lưu ý 1 điều này:bạn có thể nối trực tiếp A của led vào P1,K xuống GND ko cần treo trở.Nếu thích bạn treo cho nó con trở 1k,hay bao nhiêu đấy tùy các bạn(nhưng dừng lớn lắm).Tuy nhiên dù ko treo trở hay có trở thì bạn cũng thấy led sáng yếu.Nếu ban làm ngược lại,A led->P1,K led->5v thì bạn sẽ led sáng hơn nhiều, điều này được giải thích là do dòng hút bởi 8051 lớn hơn dòng do nó đẩy ra.

Và chương trình của nó như sau:

_____________________________________

Code:

#include<regx51.h>

//8 dòng "define" dưới đây bạn có thể bỏ qua,nhưng tui làm như thế

//bạn sẽ dễ theo dõi hơn(Nếu thế trong ct bạn ko dc dùng các từ như led0,..

//vì nó chưa đựoc định nghĩa

#define led0 P1_0

#define led1 P1_1

#define led2 P1_2

#define led3 P1_3

#define led4 P1_4

#define led5 P1_5

#define led6 P1_6

#define led7 P1_7

#define sang 1

#define tat 0

void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms

{

usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte

for(i=0;i<ms;i++)

for(j=0;j<120;j++)

{}//không làm gì cả

}

main()//chương trình chính

{

while(1)//tạo vòng lặp vô hạn

{

//đầu tiên là ledo sáng,các led khác đều tắt

led0=sang;led1=led2=led3=led4=led5=led6=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led1 sáng,các led khác đều tắt

led1=sang;led0=led2=led3=led4=led5=led6=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led2 sáng,các led khác đều tắt

led2=sang;led1=led0=led3=led4=led5=led6=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led3 sáng,các led khác đều tắt

led3=sang;led0=led2=led1=led4=led5=led6=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led4 sáng,các led khác đều tắt

led4=sang;led0=led2=led3=led1=led5=led6=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led5 sáng,các led khác đều tắt

led5=sang;led0=led2=led3=led4=led1=led6=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led6 sáng,các led khác đều tắt

led6=sang;led0=led2=led3=led4=led5=led1=led7=tat;

delay(1000);/thời gian trễ là 1s

//tiếp theo là led7 sáng,các led khác đều tắt

led7=sang;led0=led2=led3=led4=led5=led6=led1=tat;

delay(1000);/thời gian trễ là 1s

}

}

Chương trình trên có thể viết ngắn gọn lại như sau:

__________________

Code:

#include<regx51.h>

void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms

{

usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte

for(i=0;i<ms;i++)

for(j=0;j<120;j++)

{}//không làm gì cả

main()

{

while(1)

{

P1=0x01;delay(1000);//led0 sang

P1=0x02;delay(1000);//led1 sang

P1=0x04;delay(1000);//led2 sang

P1=0x08;delay(1000);//led3 sang

P1=0x10;delay(1000);//led4 sang

P1=0x20;delay(1000);//led5 sang

P1=0x40;delay(1000);//led6 sang

P1=0x80;delay(1000);//led7 sang

}

}_____________________________________

Tuy nhiên ct trên lại còn được viết gọn hơn nữa bằng lệnh dịch bit trong C.Các bạn xem lại lệnh này và tự làm nhé, coi đây là 1 bài tập về nhà cũng được.

Xin các bạn lưu ý các ct trên tui đều viết cho trường hợp A led->P1,K led->GND.

CHO THAM GIA VỚI NHE CÔ BẠN

Khi báo phần mở đầu để bộ dịch biết là chúng ta đang sử dụng loại VDK nào

Phần 1: HEADER

#include<regx51.h>

Phan 2: Khai bao các hàm

Đây là delay- ước lượng 1 vòng for 1 lần lặp<=> mất 8us

Như vậy ta có: ms*(125*8)=1000*1000 ~= 1s

Code:

void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms

{

usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte

for(i=0;i<ms;i++)

{

for(j=0;j<120;j++);

} }

Phan 3: PHAN CHINH CUA CHUONG TRINH- LUON LUON MO DAU BANG TU KHÓA main()

main()

{

unsigned char m,tem;

tem=0x01;

while(1)

{ P1=tem;delay(1000);

tem<<=1;if(tem==0x00)then tem=0x01; //dich sang trai 1 bit

}

} // DAY LA DAU KET THUC CHUONG TRINH : THE END---------------- Chuong tinh duoc viet lai la-------------------

Code:

#include<regx51.h>

void delay(usnigned int ms)//hàm này tạo độ trễ thời gian, dơn vị là ms

{

usigned char i,j;//khai báo kiểu "char"mỗi biến chỉ chiếm 1 byte

for(i=0;i<ms;i++)

{

for(j=0;j<120;j++);

}

}

main()

{

unsigned char m,tem;

tem=0x01;

while(1)

{ P1=tem;delay(1000);

tem<<=1;if(tem==0x00)then tem=0x01; //dich sang trai 1 bit

}

//8 led sang duoi nhau

//tai 1 thoi diem chi duy nhat 1 led sang

#include <REGX51.H>

#define led0 P1_0

#define led1 P1_1

#define led2 P1_2

#define led3 P1_3

#define led4 P1_4

#define led5 P1_5

#define led6 P1_6

#define led7 P1_7

#define sang 1

#define tat 0

//---------------

void delay( unsigned int ms )

{

unsigned int i,j;

for (i=0;i<ms;i++)

for (j=0;j<120;j++)

{}

}

//--------------

void display_led(unsigned char number)

{

switch (number)

{

case 1:

led0=sang;

led1=led2=led3=led4=led5=led6=led7=tat;

break;

case 2:

led1=sang;

led0=led2=led3=led4=led5=led6=led7=tat;

break;

case 3:

led2=sang;

led1=led0=led3=led4=led5=led6=led7=tat;

break;

case 4:

led3=sang;

led1=led2=led0=led4=led5=led6=led7=tat;

break;

case 5:

led4=sang;

led1=led2=led3=led0=led5=led6=led7=tat;

break;

case 6:

led5=sang;

led1=led2=led3=led4=led0=led6=led7=tat;

break;

case 7:

led6=sang;

led1=led2=led3=led4=led5=led0=led7=tat;

break;

case 8:

led7=sang;

led1=led2=led3=led4=led5=led6=led0=tat;

break;

}

}

main ()

{

unsigned char m;

while(1)

{

for (m=0;m<8;m++)

{display_led(m);delay(1000);}

}

}

bây giờ chúng ta mở rộng vd3 1 chút nhé:sau khi sáng từ led0->led7 thì lại quay ngược lại, từ led7->led0.Để làm việc này chúng ta chỉ cần thêm vào 1 vòng lặp for nho nhỏ.Và chương trình đầy dủ sẽ là:

________________________

Code:

//8 led sang duoi nhau

//tai 1 thoi diem chi duy nhat 1 led sang

#include <REGX51.H>

#define led0 P1_0

#define led1 P1_1

#define led2 P1_2

#define led3 P1_3

#define led4 P1_4

#define led5 P1_5

#define led6 P1_6

#define led7 P1_7

#define sang 1

#define tat 0

//---------------

void delay( unsigned int ms )

{

unsigned int i,j;

for (i=0;i<ms;i++)

for (j=0;j<120;j++)

{}

}

//--------------

void display_led(unsigned char number)

{

switch (number)

{

case 1:

led0=sang;

led1=led2=led3=led4=led5=led6=led7=tat;

break;

case 2:

led1=sang;

led0=led2=led3=led4=led5=led6=led7=tat;

break;

case 3:

led2=sang;

led1=led0=led3=led4=led5=led6=led7=tat;

break;

case 4:

led3=sang;

led1=led2=led0=led4=led5=led6=led7=tat;

break;

case 5:

led4=sang;

led1=led2=led3=led0=led5=led6=led7=tat;

break;

case 6:

led5=sang;

led1=led2=led3=led4=led0=led6=led7=tat;

break;

case 7:

led6=sang;

led1=led2=led3=led4=led5=led0=led7=tat;

break;

case 8:

led7=sang;

led1=led2=led3=led4=led5=led6=led0=tat;

break;

}

}

main ()

{

unsigned char m;

while(1)

{

for (m=0;m<8;m++)

{display_led(m);delay(1000);}

for (m=6;m>=0;m--)//Ở vòng lặp này m=6, chứ ko phải 7

{display_led(m);delay(1000);}

}

}

Bạn đang đọc truyện trên: Truyen2U.Pro

#8051#dau