Giao diện LED là điều đầu tiên, người ta sẽ cố gắng làm trong khi bắt đầu với bất kỳ bộ vi điều khiển nào. Vì vậy, ở đây trong hướng dẫn này, chúng ta sẽ giao tiếp một đèn LED với vi điều khiển 8051 và sẽ viết một Chương trình C để nhấp nháy đèn LED. Chúng tôi đã sử dụng một vi điều khiển rất phổ biến AT89S52, thuộc họ 8051, của ATMEL.
Trước khi đi vào chi tiết, chúng ta nên tìm hiểu sơ lược về vi điều khiển AT89S52. Nó là vi điều khiển 40 chân, và có 4 cổng (P0, P1, P2, P3), mỗi cổng có 8 chân. Chúng ta có thể coi mỗi cổng như một thanh ghi 8 bit, theo quan điểm phần mềm. Mỗi chân có một dòng Đầu vào / đầu ra, có nghĩa là mỗi chân có thể được sử dụng cho đầu vào cũng như đầu ra, tức là để đọc dữ liệu từ một thiết bị nào đó như cảm biến hoặc cung cấp đầu ra của nó cho một số thiết bị đầu ra. Một số chân có chức năng Kép, đã được đề cập trong khung trong Sơ đồ chân bên dưới. Chức năng kép như ngắt, bộ đếm, bộ định thời, v.v.
AT89S52 có hai loại bộ nhớ, thứ nhất là RAM có 256 byte bộ nhớ và thứ hai là EEPROM (Electronically Erasable and Programmable Read Only Memory) có 8k byte bộ nhớ. RAM được sử dụng để lưu trữ dữ liệu trong quá trình thực thi một chương trình và EEPROM được sử dụng để lưu trữ chương trình đó. EEPROM là bộ nhớ flash mà chúng ta sử dụng để ghi chương trình vào.
Sơ đồ mạch và giải thích
Chúng tôi đang sử dụng chân một trong cổng 1 để kết nối đèn LED. Trong lập trình C nhúng, chúng ta có thể truy cập mã PIN 1 của cổng 1 bằng cách sử dụng P1_0. Chúng tôi đã kết nối bộ dao động tinh thể tần số 11,0592MHz với mã PIN 19 và 18 tức là XTAL1 và XTAL2. Bộ dao động tinh thể được sử dụng để tạo xung đồng hồ và xung đồng hồ được sử dụng để cung cấp giá trị trung bình cho tính toán thời gian, bắt buộc phải đồng bộ hóa tất cả các sự kiện. Những loại tinh thể được sử dụng trong hầu hết các thiết bị kỹ thuật số hiện đại như trong máy tính, đồng hồ, vv. Pha lê thường được sử dụng nhất là thạch anh. Đó là một mạch dao động cộng hưởng và các tụ điện được sử dụng để tạo dao động cho tinh thể, vì vậy chúng tôi đã kết nối ở đây các tụ điện 22pf. Bạn có thể đọc về "mạch cộng hưởng" để biết thêm.
Các sơ đồ mạch cho LED interfacing với 8.051 vi điều khiển 89S52 được hiển thị trong hình ở trên. Chân 31 (EA) được kết nối với Vcc, là chân thấp hoạt động. Điều này sẽ được kết nối với Vcc khi chúng tôi không sử dụng bất kỳ bộ nhớ ngoài nào. Chân 30 (ALE) và chân 29 (PSEN) được sử dụng để kết nối vi điều khiển với bộ nhớ ngoài và Chân 31 cho vi điều khiển sử dụng bộ nhớ ngoài, khi được kết nối với Ground. Chúng tôi không sử dụng bất kỳ bộ nhớ ngoài nào nên chúng tôi đã kết nối Pin31 với Vcc.
Chân 9 (RST) là mã PIN đặt lại, dùng để đặt lại vi điều khiển và chương trình bắt đầu lại từ đầu. Nó đặt lại bộ vi điều khiển khi được kết nối với HIGH. Chúng tôi đã sử dụng mạch thiết lập lại tiêu chuẩn, điện trở 10k ohm và Tụ điện 1uF để kết nối chân RST.
Bây giờ phần thú vị ở đây là chúng ta kết nối ngược lại LED, nghĩa là chân âm với PIN vi điều khiển, vì vi điều khiển không cung cấp đủ năng lượng để phát sáng một LED, vì vậy ở đây LED chạy trên logic âm như khi, chân P1_0 là 1 khi đó đèn LED sẽ được điều chỉnh TẮT và khi đầu ra chân là 0 thì đèn LED sẽ được BẬT. Khi đầu ra PIN bằng 0, nó hoạt động giống như mặt đất và đèn LED phát sáng.
Giải thích mã
Header REGX52.h đã được đưa vào để bao gồm các định nghĩa thanh ghi cơ bản. Có rất nhiều loại biến và hằng số trong C nhúng như int, char, unsigned int, float, v.v., bạn có thể học chúng một cách dễ dàng. Ở đây chúng tôi đang sử dụng int unsigned có phạm vi từ 0 đến 65535. Chúng tôi đang sử dụng “vòng lặp for” để tạo độ trễ, để đèn LED sẽ BẬT trong một thời gian (P1_0 = 0, logic LED âm) và TẮT (P1_0 = 1, logic LED âm) cho thời gian bị trễ. Nói chung khi “vòng lặp for” chạy 1275 lần nó sẽ cho độ trễ là 1ms, vì vậy chúng ta đã tạo hàm 'delay' để tạo DELAY và gọi nó từ chương trình chính (main ()). Chúng ta có thể vượt qua thời gian DELAY (tính bằng mili giây) trong khi gọi hàm “delay” từ hàm main. Trong chương trình, “While (1)” có nghĩa là chương trình đó sẽ thực thi vô hạn.
Tôi đang giải thích ngắn gọn, cách 1275 lần chạy của vòng lặp “for” cho độ trễ 1ms:
Trong 8051, 1 chu kỳ máy yêu cầu 12 xung tinh thể để thực thi và chúng tôi đã sử dụng tinh thể 11.0592Mhz.
Vậy thời gian cần thiết cho 1 chu kỳ máy: 12 / 11.0592 = 1.085us
Vì vậy, 1275 * 1.085 = 1.3ms, 1275 lần vòng lặp “for” gây ra độ trễ gần 1ms.
Rất khó tính toán độ trễ thời gian chính xác do chương trình “C” tạo ra, khi đo từ máy hiện sóng (CRO), vì (j = 0; j <1275; j ++) cho độ trễ gần 1ms.
Như vậy chúng ta có thể hiểu đơn giản là giao tiếp LED với vi điều khiển 8051, tức là chỉ với một đoạn mã đơn giản, chúng ta có thể tương tác và điều khiển phần cứng thông qua phần mềm (lập trình) bằng vi điều khiển. Ngoài ra chúng ta có thể thao tác trên từng cổng và chân của vi điều khiển thông qua lập trình.