Thứ Tư, 29 tháng 6, 2016

Bài 5.1: Giao tiếp với LEDs đơn nâng cao

Lần này mình sẽ hướng dẫn các bạn tương tác với LEDs đơn nhưng với quy mô là cả một PORT, đây là một bài nâng cao hơn so với bài 5 vừa rồi.

Trước hết, ta quay lại tìm hiểu cấu trúc của một PORT của 8051 gồm những gì ?

Các PORT xuất/nhập của 8051 bao gồm port 0 tại địa chỉ 80H, port 1 ở địa chỉ 90H, port 2 ở địa chỉ A0H và port 3 ở địa chỉ B0H. Các port 0, 2, 3 không được dùng để xuất/nhập nếu ta sử dụng thêm bộ nhớ ngoài hoặc có một số đặc tính đặc biệt của 8051 được sử dụng( như ngắt, port nối tiếp...). P1.2 đến P1.7, ngược lại luôn luôn là các đường xuất/nhập đa mục đích hợp lệ.

Tất cả các port đều được định địa chỉ từng bit nhằm cung cấp khả năng giao tiếp mạnh. Tức mỗi port là một byte, gồm 8 bits, ở đây tương đương với 8 chân xuất/nhập của từng port. Để làm việc với cả port, ta chỉ cần nhớ tên của port và giá trị mong muốn của port( dạng hexa hoặc nhị phân đều được).
Ví dụ ở đây là cho chân P1.0 lên mức cao và các chân còn lại của port 1 ở mức thấp, ta có thể khai báo trong C như sau:

P1=00000001 // ở dạng nhị phân
Hoặc P1=0x01 // ở dạng hexa

Như vậy chúng ta đã có thể tương tác trực tiếp được với từng bit của một port cũng như cả port của 8051.

Ví dụ về tương tác với port 2 của 8051:

Sơ đồ nguyên lý như sau:

Ví dụ đầu tiên mình sẽ cho cả cổng P2 cùng tắt cùng sáng, code như sau:

#include <REGX52.H>

void delay( unsigned int );

void main()
{
while(1)
{
P2 = 00000000; // gia tri hexa là 0x00
delay(100); trễ 0.1s
P2 = ~P2;
delay(100);
}
}

//ham delay( mS )
void delay( unsigned int time )
{
    unsigned int i;
 unsigned int j;

for( i=0; i<time; i++ )
for( j=0; j<1275; j++ );
}

Ở ví dụ này, P2 được thiết lập ở giá trị 0x00, tức tất cả các bits được để ở mức 0 hết, với các mắc anot chung thì LED sẽ sáng khi các bit ở mức 0. Hàm P2=~P2 là hảm lật trạng thái của cả port P2, vì vậy ta thu được cả port 2 nhấp nháy.

Ở ví dụ tiếp theo, mình sẽ làm cho từng led của port sáng lên và khi sáng tất cả các đèn thì cả port sẽ cùng sáng và tắt:

#include <REGX52.H>

void delay( unsigned int );

void main()
{
while(1)
{
P2 = 11111110;
delay(100);
P2= 11111101;
delay(100);
P2 = 11111011;
delay(100);
P2 = 11110111;
delay(100);
P2 = 11101111;
delay(100);
P2 = 11011111;
delay(100);
P2 = 10111111;
delay(100);
P2 = 01111111;
delay(100);
P2 = 11111111;
delay(100);
                P2 = ~P2;
                delay(100);
}
}

//ham delay( mS )
void delay( unsigned int time )
{
    unsigned int i;
 unsigned int j;

for( i=0; i<time; i++ )
for( j=0; j<1275; j++ );
}

Các port khác chúng ta có thể làm tương tự, các bạn có thể tùy biến các bit để tạo thành hiệu ứng mà các bạn mong muốn.
Chúc các bạn thành công!

Không có nhận xét nào:

Đăng nhận xét