Ở bài này sẽ hướng dẫn các bạn lập trình điều khiển Output cơ bản thực hành với LED đơn. Các bạn thực hiện vẽ mạch sau trong Proteus.
I.Lập trình điều khiển từng Pin của vi điều khiển.
8051 cho phép chúng ta tác động tới từng chân IO của vi điều khiển. Để sử dụng tính năng này chúng ta có thể sử dụng khai báo sbit để định nghĩa tên cho chân chúng ta muốn sử dụng. Khai báo sbit được thực hiện theo mẫu sau:
sbit LED = P1^0;
Ở đây, chân P1.0 được định nghĩa có tên là LED.
Khi các bạn gán chân đó bằng giá trị 0 thì đầu ra sẽ ở mức 0V còn khi các bạn gán cho chân đó ở mức 1 thì sẽ có mức điện áp ra là 5V.
Ví dụ ở chương trình sau chúng ta sẽ sử dụng định nghĩa sbit để điều khiển chân P1.0 của 8051 thực hiện chức năng nhấp nháy một con LED. Các bạn xem code theo mẫu sau.
#include <REGX52.H> sbit LED = P1^0; void Fn_Delay (unsigned int vrui_Time); int main(){ while(1) { LED = 0; Fn_Delay(50000); LED = 1; Fn_Delay(50000); } return 0; } void Fn_Delay (unsigned int vrui_Time){ while(vrui_Time --); }
II.Lập trình điều khiển theo Port của vi điều khiển.
Ngoài điều khiển theo từng chân chúng ta có thể xuất dữ liệu ouput theo cả Port trên 8051. 8051 là một vi điều khiển 8 bit và một Port với điều kiện các Pin đó chung một Port. Để can thiệp đến một Port các bạn chỉ cần gán dữ liệu các bạn mong muốn cho tên Port đó. Ví dụ như sau:
P2 = 0x55;
Với câu lệnh trên các bạn đã xuất dữ liệu trên Port 2 như sau: 0-1-0-1-0-1-0-1 tương ứng với chiều từ P2.7 tới P2.0.
Giới thiệu về toán tử | và &:
Toán tử | là toán tử OR bit còn toán tử & là toán tử AND bit.
0 | 0 = 0
0 | 1 = 1
1 | 1 = 1
0 & 0 = 0
0 & 1 = 0
1 & 1=1
Đây là 2 toán tử rất hay được sử dụng trong việc khi bạn muốn tác động đến một vài bit trong một Port mà các bạn muốn xuất dữ liệu.
2 toán tử << và >>. Đây là 2 toán tử dùng để dịch bít. Các bạn quan sát các ví dụ sau để hiểu rõ về 2 toán tử này:
0x01<<1 = 0x02; //00000001 -> 00000010
0x10>>1 = 0x08; //00010000 -> 00001000
Sau đây là một ví dụ tạo hiệu ứng LED chạy từ trên xuống và lặp lại.
int main(){ unsigned char i; while(1){ for (i = 0; i < 8; i++){ P1 = 0x01<<i; Fn_Delay(5000); } } return 0; }
Sau đây là một ví dụ tạo hiệu ứng LED chạy từ dưới lên và lặp lại.
int main(){ unsigned char i; while(1){ for (i = 0; i < 8; i++){ P1 = 0x80>>i; Fn_Delay(5000); } } return 0; }
Sử dụng hàm con
Sau đây là 1 hàm con làm 8 led sáng dần, dùng mảng
void nhayDanPhai(){ int i; char sangDan[]={0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC,0xFE, 0xFF}; for(i = 0; i<8; i++){ P1 = sangDan[i]; Fn_Delay(100000); } P1 = 0x00; }
Hàm con sau làm sáng dần 8 led, dùng vòng lặp:
void nhayDanTrai(){ int i; P1 = 0x01; for(i = 0; i<8; i++){ P1= P1|(0x01<<i); Fn_Delay(100000); } P1 = 0x00; }
Hàm con tiếp theo làm 8 Led sáng nhỏ giọt.
void sangNhoGiot(){ int i,j, K = 0x00; for(i = 7; i>=0; i--) { for(j =0; j<=i ; j++ ) { P1 = (0x01 <<j)|K; Fn_Delay(100000); } K = P1; } }
CẢM ƠN CÁC BẠN ĐÃ ĐỌC BÀI VIẾT CỦA MÌNH CÁC BẠN NHỚ LIKE VÀ ĐĂNG KÝ KÊNH YOUTUBE CỦA MÌNH ĐỂ XEM NHIỀU VIDEO HƯỚNG DẪN BỔ ÍCH
em viết thì toàn báo lỗi c202 nhấn vào thì chỉ đến dòng lệnh có P1