Bài viết này sẽ cho chúng ta biết cách kết nối nút nhấn với vi điều khiển 8051. Nút nhấn được sử dụng rộng rãi trong các dự án hệ thống nhúng và kiến thức về việc kết nối chúng với 8051 là rất cần thiết.
Giao tiếp giữa led và nút nhấn với 8051
Bài viết này sẽ cho chúng ta biết cách kết nối nút nhấn với vi điều khiển 8051. Nút nhấn được sử dụng rộng rãi trong các dự án hệ thống nhúng và kiến thức về việc kết nối chúng với 8051 là rất cần thiết. Một nút nhấn thông thường có hai đầu hoạt động thường mở và thông mạch khi nhấn nút nhấn. Dưới đây là hình ảnh của một nút nhấn thông thường.
Sơ đồ mạch
Mạch được thiết kế sao cho khi nhấn nút S1, đèn LED D1 sẽ SÁNG và sáng cho đến khi nút ấn S2 được ấn xuống thì đèn LED sẽ TẮT, và lặp lại 1 chu kỳ mới. Điện trở R3, tụ điện C3 và nút ấn S3 tạo thành mạch thiết lập lại (Reset) cho vi điều khiển. Tụ C1, C2 và thạch anh X1 là mạch tạo xung đồng hồ (Clock). R1 và R2 là các điện trở kéo lên cho các nút nhấn. R4 là điện trở giới hạn dòng cho LED.
Chương trình / Code
MOV P0,#83H // Khởi tạo nút nhấn và đèn LED ở trạng thái TẮT
READSW: MOV A,P0 // Di chuyển giá trị cổng sang bộ tích lũy
RRC A // Kiểm tra giá trị của Cổng 0 để biết nút nhấn 1 có NHẤN hay không
JC NXT // Nếu nút nhấn 1 KHÔNG NHẤN thì nhảy sang NXT để kiểm tra xem nút nhấn 2 có NHẤN hay không
CLR P0.7 // Bật đèn LED vì nút nhấn 1 đang NHẤN
SJMP READSW // Đọc lại trạng thái chuyển đổi
NXT: RRC A // Kiểm tra giá trị của Cổng 0 để biết nút nhấn 2 có NHẤN hay không
JC READSW // Nhảy tới READSW để kiểm tra lại trạng thái của nút nhấn 1 (với điều kiện nút nhấn 2 là KHÔNG NHẤN)
SETB P0.7 // Tắt đèn LED vì Nút nhấn 2 đang NHẤN
SJMP READSW // Nhảy tới READSW để đọc lại trạng thái của nút nhấn 1
END
Giải thích chương trình
- MOV P0,#83H - là tắt LED (số Hex 83 đổi ra số nhị phân là 10000011) và khởi tạo các nút nhấn 1 và 2. Nút nhấn 1 được kết nối với chân P0.0 và nút nhấn 2 được kết nối với chân P0.1. Và đèn LED được kết nối với chân P0.7.
Lưu ý: - P0.0 = 1 có nghĩa là nút nhấn 1 là TẮT và P0.1 = 1 có nghĩa là nút nhấn 2 là TẮT. P0.0 = 0 có nghĩa là nút nhấn 1 đang BẬT và P0.1 = 0 có nghĩa là nút nhấn 2 đang BẬT. LED SÁNG khi P0.7 = 0 và TẮT khi P0.7 = 1
Chương trình có hai nhãn - READSW và NXT. Nó nói về tất cả các giá trị chuyển đổi - đó là P0.0 và P0.1. Chúng tôi đang sử dụng RRC để đọc các giá trị chuyển đổi. Các giá trị của cổng 0 được chuyển sang bộ tích lũy. Vì cổng 0 và 1 được sử dụng để chuyển đổi giao diện 1 và 2, chúng ta có thể nhận được các giá trị của cả hai bit cổng trong 0 và 1 của bộ tích lũy LSB bằng cách sử dụng lệnh MOV A,P0. RRC viết tắt của Rotate Right through Carry. Bạn có thể tìm hiểu thêm về hướng dẫn này trên tài liệu của chúng tôi “ hướng dẫn lập trình 8051 - chương 1 ”. RRC có chức năng di chuyển giá trị của cổng 0.0 sang bit nhớ. Bây giờ chúng ta có thể kiểm tra bit nhớ bằng cách sử dụng lệnh JC - có nghĩa là “Nhảy nếu bit nhớ được đặt mức 1 (SET)”. Nếu bit nhớ là SET - thì có nghĩa là cổng 0.0 = 1 và điều này có nghĩa là nút nhấn 1 bị TẮT. Nếu nút nhấn 1 là TẮT thì chúng ta phải kiểm tra trạng thái của nút nhấn 2 và đó là lý do tại sao chúng ta nhảy sang nhãn NXT.
Trong thời gian trung bình nếu nhấn nút nhấn 1 - thì giá trị của cổng 0.0 sẽ bằng 0. Điều này sẽ được chuyển sang bộ tích lũy và do đó RRC sẽ dẫn đến bit nhớ = 0. Nếu bit nhớ = 0 thì kết quả thực hiện lệnh JC là âm và nó sẽ không nhảy. Lệnh tiếp theo sẽ được thực thi - đó là CLR P0.7. Điều này xóa cổng 0.7 về 0 và do đó LED sẽ BẬT. Sau khi bật, đèn LED sẽ được giữ cho đến khi nhấn nút nhấn 2.
Trạng thái của nút nhấn 2 được kiểm tra trong nhãn NXT. Khi NXT được thực thi, chúng tôi đang sử dụng RRC lần thứ hai liên tiếp. Điều này có nghĩa, bit nhớ hiện giữ giá trị của P0.1 - là trạng thái của nút nhấn 2. Nếu carry bit = 1 thì nút nhấn 2 là TẮT. Điều này có nghĩa là đèn LED không nên TẮT. Nếu mang bit = 0 thì đèn LED phải TẮT (Lệnh SETB P0.7 chuyển LED TẮT)
Chuyển đổi 2 đèn LED bằng một nút bấm bằng cách sử dụng ngắt
Mạch này trình bày cách chuyển đổi hai đèn LED bằng một nút ấn duy nhất bằng cách sử dụng các ngắt ngoài. Ngắt là tín hiệu không đồng bộ (có thể là phần cứng hoặc phần mềm) cho biết bộ xử lý thực hiện thay đổi trong thực thi hiện tại. Khi bộ xử lý nhận được tín hiệu ngắt hợp lệ, nó sẽ lưu trạng thái hiện tại và sau đó sẽ thực thi một chuỗi các bước được xác định trước được gọi là thường trình dịch vụ ngắt (ISR). Sau khi thực hiện ISR, bộ xử lý quay trở lại thời điểm bị ngắt và tiếp tục từ đó.
Sơ đồ mạch
Trong mạch ở trên, D1 và D2 (đèn LED được bật) được kết nối tương ứng với P1.0 và P1.1. R2 và R4 là trở giới hạn dòng điện qua các đèn LED. Nút ấn S2 được kết nối với chân INT0 trong đó R1 là điện trở kéo lên và C4 là tụ điện. C3, R3 và S3 tạo thành mạch thiết lập lại (Reset). Tụ điện C1, C2 và thạch anh X1 tạo thành mạch tạo xung đồng hồ. Khi nhấn nút S2 thì LED D1 sẽ TẮT và LED D2 sẽ BẬT. Khi nhấn tiếp thì LED D1 sẽ SÁNG và LED D2 sẽ TẮT, cứ thế sẽ luôn có 1 LED tắt và 1 LED sáng.
Chương trình
ORG 000H // địa chỉ bắt đầu
SJMP LABEL // nhảy tới nhãn (LABEL)
ORG 003H // địa chỉ bắt đầu cho ISR (INT0)
ACALL ISR // gọi ISR
RETI // trở lại sau khi ngắt
LABEL: MOV A, # 10000000B // đặt giai đoạn ban đầu của đèn LED (D1 TẮT & D2 SÁNG)
MAIN: // hàm chính đặt tham số ngắt
SETB IP.0 // đặt mức ưu tiên cao nhất cho ngắt INT0
SETB TCON.0 // ngắt được tạo bởi tín hiệu cạnh rơi tại INT0 (pin12)
SETB IE.0 // cho phép ngắt ngoài
SETB IE.7 // cho phép điều khiển ngắt toàn cầu
SJMP MAIN // nhảy trở lại chương trình con MAIN
ISR: // interrupt service routine
CPL A // bổ sung giá trị hiện tại trong bộ tích lũy A
MOV P1, A // di chuyển giá trị bộ tích lũy hiện tại sang cổng 1
RET // nhảy tới RETI
END
Hotline: 0979 466 469