Tư vấn: 0979.466.469 / 0938.128.290

MENU

Xử lí ngõ vào/ngõ ra số trong bộ vi điều khiển AVR

Xử lí ngõ vào/ngõ ra số trong bộ vi điều khiển AVR thông qua các ví dụ cơ bản.

 

Xử lí ngõ vào/ngõ ra số trong bộ vi điều khiển AVR

Đầu ra kỹ thuật số (I / O): là tính năng cơ bản được hỗ trợ bởi bộ vi điều khiển AVR. Để tạo điều kiện cho đầu ra/đầu vào số có ba thanh ghi được liên kết với mỗi cổng của bộ vi điều khiển.

Thanh ghi hướng dữ liệu - Thanh ghi này xác định chân nào sẽ đóng vai trò là cổng đầu ra và chân nào là đầu vào.

Thanh ghi đầu ra dữ liệu - Thanh ghi này giữ đầu ra dữ liệu tới cổng.

Thanh ghi nhập dữ liệu - Đọc dữ liệu từ cổng

Bây giờ chúng ta hãy xem xét một ví dụ. Đối với PortA , ba thanh ghi lần lượt là- DDRA, PORTA & PINA. Tương tự như vậy đối với Port B , nó sẽ là- DDRB, PORTB & PINB.

Trước khi đi thảo luận thêm, có một điều quan trọng chúng ta nên đề cập đến. Một cổng có thể phục vụ cho nhiều mục đích. Trách nhiệm của lập trình viên là loại bỏ các lỗi có thể xảy ra. Nếu chương trình và hệ thống không được thiết kế cẩn thận, Chương trình có thể không chạy được.

Sơ đồ mạch sử dụng Atmega32 và Atmega8

Sơ đồ mạch Atmega32

Sơ đồ mạch Atmega8

Phát sáng đèn LED

Chương trình 1: Chương trình cơ bản Hiển thị chức năng đầu ra kỹ thuật số.

#include

#define F_CPU 1000000

#include

int main()

{ DDRB=0x0f;

PORTB=0x00;

while(1)

{ _delay_ms(1500);

PORTB =~PORTB;

}

return 0;

}

Giải thích chương trình:

Chương trình này bao gồm hai câu lệnh đơn giản và một vòng lặp trễ. Kí hiệu ‘~’ là viết tắt của thuật toán đảo. Ở đây, tần số hoạt động của CPU phải được xác định để thực hiện đúng vòng lặp trễ và nó phải được khai báo trước dòng ' delay.h ' trong mã C. Ở đây sử dụng #define F_CPU 1000000 .

Cách khác để xác định tần số hoạt động của CPU là thiết lập sẵn trong Avr Studio, đi tới ‘Project Menu> Configuration Options> General’. Tại đây bạn có thể chọn kiểu máy và tần số hoạt động của nó.

Như đã thảo luận trước đây, thanh ghi hướng dữ liệu phải được thiết lập trước khi thực hiện bất kỳ thao tác nhập / xuất nào.

Kết quả ngõ ra:

Đèn LED được kết nối với Port B nhấp nháy trong khoảng thời gian 3 giây.

Chương trình 2: Nút nhấn kết hợp với LED

#include

 

int main()

{ DDRB=0x0f;

DDRD=0x00;

while(1)

PORTB =~PIND;

return 0;

}

Giải thích chương trình

Để đọc ngõ ra từ một port, chúng ta sử dụng ' PINX '. Trong đó 'X'  là tên của port. Lúc này đặt đầu ra bằng biến 'PORTX', và  đọc đầu vào bằng biến 'PINX'. Đối với một Port cụ thể, hai biến này có địa chỉ khác nhau. Nếu bạn viết ' PORTX = PORTY ' việc này có nghĩa cả hai đều là biến đầu vào.

Kết quả ngõ ra:

Khi nhấn nút nhấn, đèn LED tương ứng với nút đó sẽ sáng lên.

Chương trình điều khiển động cơ bước

#include

#define F_CPU 1000000

#include

int main()

{ char ch[]= {0x01,0x02,0x04,0x08};

int i=0;

DDRB=0x0f;

while(1)

{ PORTB =ch[i];

i++; // is equivalent to

i= i%4; // PORTB=ch[(i++)%4];

_delay_ms(1000);

}

return 0;

}

Giải thích chương trình

Động cơ bước có vị trí chính xác và khả năng kiểm soát tốc độ. Đối với động cơ bước DC, cuộn dây trường được cung cấp trực tiếp từ nguồn điện. Dòng điện qua phần ứng được điều khiển bởi bộ vi điều khiển với sự trợ giúp của transistor.  Để làm cho phần ứng xoay đúng, duy trì các trình tự trong quá trình cung cấp năng lượng cho cuộn dây. Giả sử một động cơ có cuộn A, B, C & D.

Trong chương trình này, một mảng các ký tự được khai báo trước và chúng được đưa vào Port B một cách tuần tự và lặp đi lặp lại để điều khiển động cơ bước. Một vòng lặp trì hoãn cũng được sử dụng giúp kiểm soát tốc độ.

 

Kết quả:

Các đèn LED trên bảng sẽ được bật liên tục và sẽ lặp lại theo trình tự. Mỗi đèn LED sẽ được bật trong 1 giây. Sau đó, đèn LED bên cạnh sẽ bật lên, và cứ thế lặp lại. Đèn LED đầu tiên bật sau đèn LED cuối cùng.

Chương trình Nút nhấn chống dội

#include

#define F_CPU 1000000

#include

int main()

{ char ifCondition;

char chkValidity;

DDRB=0x0f;

DDRD=0x00;

while(1)

{ if Condition = 0x0f&(~PIND); //kiểm tra nút nhấn có được nhấn hay không

If (if Condition)

{ _delay_ms(100); //  đợi kết thúc kiểm tra

 

chkValidity =0x0f&(~PIND); // Đọc lại dưc việc chân đầu vào

if(ifCondition==chkValidity)// Kiểm tra điều kiện

// Nếu điều kiện đúng

{ PORTB=chkValidity;// Gán PortB cho biến mới

// Ngõ ra sau khi chống dội

}

}

}

return 0;

}

Giải thích

Chống dội có nghĩa là lấy đầu vào từ một phím/nút loại bỏ các tín hiệu sai được tạo ra bởi nhiễu điện và tín hiệu điện thoáng qua. Một trong những phương pháp phổ biến nhất của kỹ thuật chống dội là kiểm tra lại phím sau khoảng thời gian vài giây.

Trong chương trình trên, sau khi lấy một đầu vào, nó sẽ được kiểm tra nếu nhấn bất kỳ phím nào! Nếu nhấn, sau 100mS, các phím được đọc lại. Nếu cả hai đều có giá trị bằng nhau, đèn LED tương ứng với phím được nhấn sẽ được bật.

Kết quả

Ban đầu, tất cả các đèn LED sẽ tắt. Nếu bất kỳ phím nào được nhấn, phím tương ứng sẽ phát sáng. Nếu nhấn phím mới đèn LED tương ứng với phím / nút đó sẽ phát sáng và đèn LED trước đó sẽ tắt. Nhiều phím cũng có thể được nhấn và trong trường hợp này nhiều đèn LED sẽ phát sáng.

 

 

 

 

 

 

 

Sản phẩm nổi bật
Sale 0%
105000 /CáiCòn hàng
/ Cái

code: 3702-022

Chi tiết sp
Sale 0%
80000 /CáiLiên hệ
/ Cái

code: 3902-014

Chi tiết sp
Sale 0%
75000 /CáiCòn hàng
/ Cái

code: 6107-002

Chi tiết sp
Sale 0%
980000 /CáiCòn hàng
/ Cái

code: 3001-012

Chi tiết sp
Hỗ trợ liên kết
0979466469
0899909838
0938128290
0899909838
Khiếu nại: 0964238397
0979466469

Hotline: 0979 466 469

Bạn cần linh kiện mẫu ? 7-11 ngày