Xem Nội Dung Bài Viết

Việc thực hành kiến trúc máy tính là một bước không thể thiếu để sinh viên cũng như các kỹ sư trong ngành kỹ thuật máy tính và điện tử nắm vững nguyên lý hoạt động của hệ thống. Bài viết này sẽ đi sâu vào việc khảo sát vi điều khiển họ 8051, một nền tảng kinh điển để hiểu rõ kiến trúc phần cứng, cách lập trình và giao tiếp với các thiết bị ngoại vi, từ đó trang bị kiến thức nền tảng vững chắc cho việc phát triển các ứng dụng kỹ thuật thực tế.

Quy trình cốt lõi khi thực hành kiến trúc máy tính với 8051

Để thực hành kiến trúc máy tính một cách hiệu quả thông qua vi điều khiển 8051, người học cần tuân thủ một quy trình có hệ thống, bao gồm các bước chính sau:

  1. Khảo sát kiến trúc phần cứng: Nắm vững cấu trúc nội bộ của 8051 như các thanh ghi, bộ nhớ, cổng I/O và các khối chức năng khác.
  2. Tìm hiểu tập lệnh hợp ngữ (Assembly): Học cách sử dụng các lệnh Assembly để điều khiển trực tiếp phần cứng, hiểu cơ chế hoạt động ở mức thấp nhất.
  3. Lập trình giao tiếp ngoại vi bằng Assembly: Thực hiện các bài tập điều khiển các thiết bị đơn giản như LED, nút nhấn, bộ định thời thông qua Assembly.
  4. Lập trình giao tiếp ngoại vi bằng ngôn ngữ C: Chuyển đổi sang lập trình C, tận dụng các thư viện và cấu trúc cấp cao hơn để điều khiển các thiết bị phức tạp như màn hình LCD, ADC, UART.
  5. Phân tích các chuẩn truyền thông: Hiểu cách vi điều khiển giao tiếp với các hệ thống khác (ví dụ: máy tính đa dụng) thông qua các chuẩn như UART để mở rộng khả năng điều khiển.
  6. Thực hiện dự án ứng dụng: Áp dụng tổng hợp kiến thức để xây dựng các ứng dụng thực tế, giải quyết các vấn đề kỹ thuật cụ thể.

Nền tảng kiến trúc phần cứng 8051 và ngôn ngữ hợp ngữ

Để bắt đầu thực hành kiến trúc máy tính với vi điều khiển 8051, việc đầu tiên là phải thấu hiểu kiến trúc phần cứng của nó. 8051 là một vi điều khiển 8-bit với kiến trúc Harvard, nghĩa là có các không gian bộ nhớ riêng biệt cho chương trình (ROM) và dữ liệu (RAM). Điều này cho phép vi điều khiển truy cập đồng thời cả lệnh và dữ liệu, tối ưu hóa tốc độ thực thi.

Bên trong 8051, chúng ta tìm thấy một loạt các thanh ghi quan trọng. Các thanh ghi đa năng như A (Accumulator) và B được sử dụng cho các phép toán số học và logic. Ngoài ra, còn có các thanh ghi R0-R7 cho mục đích lưu trữ tạm thời, con trỏ dữ liệu (DPTR) để truy cập bộ nhớ ngoài, và thanh ghi trạng thái chương trình (PSW) để lưu giữ các cờ trạng thái như cờ tràn, cờ mang. Việc quản lý và sử dụng hiệu quả các thanh ghi này là chìa khóa để viết mã hợp ngữ tối ưu.

Kích thước dữ liệu trong 8051 chủ yếu là 8-bit, tuy nhiên, nó có thể xử lý các giá trị 16-bit thông qua các cặp thanh ghi như DPTR. Các phương pháp đánh địa chỉ đa dạng, bao gồm đánh địa chỉ trực tiếp, gián tiếp thanh ghi, đánh địa chỉ tức thời, và đánh địa chỉ tương đối, cung cấp sự linh hoạt cao trong việc truy cập dữ liệu và mã lệnh. Đặc biệt, khả năng mở rộng bộ nhớ ngoài, bao gồm ROM chương trình và RAM dữ liệu, cho phép 8051 xử lý các ứng dụng phức tạp hơn với nhu cầu lưu trữ lớn.

Ngôn ngữ hợp ngữ (Assembly) là ngôn ngữ bậc thấp, ánh xạ trực tiếp với các lệnh máy của 8051. Mỗi dòng lệnh Assembly tương ứng với một hoặc vài byte mã máy, cho phép lập trình viên kiểm soát chính xác từng hoạt động của vi điều khiển. Mặc dù khó học hơn so với ngôn ngữ cấp cao, Assembly mang lại hiệu suất tối đa và khả năng tối ưu hóa tài nguyên phần cứng, điều cực kỳ quan trọng trong các hệ thống nhúng có tài nguyên hạn chế.

Khảo sát tập lệnh được hỗ trợ bởi vi điều khiển 8051

Tập lệnh của 8051 là tập hợp các chỉ thị mà vi điều khiển có thể hiểu và thực thi. Việc nắm vững tập lệnh này là cơ sở để bất kỳ ai muốn thực hành kiến trúc máy tính ở mức độ sâu sắc. Tập lệnh được chia thành nhiều nhóm chức năng chính, bao gồm lệnh di chuyển dữ liệu, lệnh số học, lệnh logic, lệnh điều khiển bit và lệnh rẽ nhánh.

Các lệnh di chuyển dữ liệu như MOV, MOVC, MOVX cho phép chúng ta di chuyển dữ liệu giữa các thanh ghi, giữa thanh ghi và bộ nhớ trong/ngoài, hoặc từ bộ nhớ chương trình. Ví dụ, MOV A, R0 sẽ sao chép nội dung của thanh ghi R0 vào thanh ghi A.

Nhóm lệnh số học bao gồm ADD, SUBB, MUL, DIV dùng để thực hiện các phép cộng, trừ, nhân, chia. Đây là những lệnh cơ bản cho bất kỳ phép tính toán nào. Lệnh logic như ANL, ORL, XRL, CLR, CPL thực hiện các phép toán AND, OR, XOR, xóa và bù bit, rất hữu ích trong việc xử lý và điều khiển dữ liệu ở cấp độ bit.

Lệnh điều khiển bit như SETB, CLR, CPL, JB, JNB cho phép chúng ta thao tác trực tiếp với từng bit đơn lẻ, ví dụ bật/tắt một chân I/O cụ thể. Đây là khả năng mạnh mẽ của 8051 trong việc điều khiển phần cứng. Cuối cùng, các lệnh rẽ nhánh như JMP, CALL, RET, DJNZ kiểm soát luồng thực thi của chương trình, cho phép tạo vòng lặp, gọi chương trình con và ra quyết định.

Bài thực hành 1: Chương trình di chuyển và trao đổi dữ liệu

Trong bài thực hành này, người học sẽ viết các đoạn mã Assembly để di chuyển dữ liệu giữa các thanh ghi khác nhau và giữa thanh ghi với bộ nhớ RAM nội bộ. Mục tiêu là làm quen với lệnh MOV và các chế độ địa chỉ khác nhau. Ví dụ:

MOV A, #55h ; Di chuyển giá trị 55h vào thanh ghi A
MOV R0, A  ; Di chuyển nội dung A vào R0
MOV 30h, R0 ; Di chuyển nội dung R0 vào địa chỉ RAM 30h
XCH A, R1  ; Trao đổi nội dung A và R1

Những thao tác cơ bản này giúp củng cố hiểu biết về cách dữ liệu được lưu trữ và truy cập trong kiến trúc 8051.

Bài thực hành 2: Chương trình tính toán số học

Để thực hành kiến trúc máy tính sâu hơn vào khả năng tính toán, bài tập này tập trung vào các lệnh số học. Người học sẽ viết mã để thực hiện các phép cộng, trừ, nhân và chia cơ bản. Ví dụ:

MOV A, #10h ; A = 10h
ADD A, #05h ; A = A + 05h (A = 15h)
MOV B, #02h ; B = 02h
MUL AB      ; A = A  B (A = 15h  02h = 2Ah)

Bài thực hành này giúp hiểu cách các cờ trạng thái trong thanh ghi PSW bị ảnh hưởng bởi các phép toán số học.

Bài thực hành 3: Chương trình lệnh xử lý luận lý và bộ đếm

Thực Hành Kiến Trúc Máy Tính: Khảo Sát 8051 Và Lập Trình Nhúng
Thực Hành Kiến Trúc Máy Tính: Khảo Sát 8051 Và Lập Trình Nhúng

Bài tập này khám phá các lệnh logic và cách sử dụng bộ đếm. Người học sẽ viết mã để thực hiện các phép toán AND, OR, XOR bit-wise và kiểm soát các cờ trạng thái. Ngoài ra, việc sử dụng lệnh DJNZ (Decrement and Jump if Not Zero) để tạo vòng lặp và bộ đếm sẽ được thực hành. Ví dụ:

MOV A, #0F0h ; A = 11110000b
ANL A, #00Fh ; A = A AND 00001111b (A = 00000000b)
MOV R2, #10  ; Khởi tạo bộ đếm R2 = 10
LOOP:
    ; Làm gì đó trong vòng lặp
    DJNZ R2, LOOP ; Giảm R2, nếu R2 != 0 thì nhảy về LOOP

Điều này quan trọng để thao tác bit và kiểm soát thời gian.

Bài thực hành 4: Chương trình chuyển đổi giá trị hệ thống số

Bài thực hành này giúp người học hiểu về cách chuyển đổi giữa các hệ thống số (ví dụ: nhị phân sang BCD). Mặc dù 8051 không có lệnh chuyển đổi trực tiếp, người học sẽ phát triển các thuật toán sử dụng các lệnh số học và logic để thực hiện các chuyển đổi cần thiết, củng cố kỹ năng lập trình giải thuật trên phần cứng hạn chế.

Lập trình giao tiếp 8051 với ngoại vi sử dụng Assembly

Việc thực hành kiến trúc máy tính không chỉ dừng lại ở xử lý dữ liệu nội bộ mà còn mở rộng ra khả năng giao tiếp với thế giới bên ngoài thông qua các thiết bị ngoại vi. Lập trình giao tiếp bằng Assembly đòi hỏi sự hiểu biết sâu sắc về các chân I/O, các thanh ghi chức năng đặc biệt (SFR – Special Function Registers) và cơ chế ngắt.

Mỗi cổng I/O của 8051 (P0, P1, P2, P3) có thể được cấu hình làm đầu vào hoặc đầu ra. Các thanh ghi SFR như TMOD, TCON, SCON, IE, IP điều khiển các module ngoại vi như Timer/Counter, Serial Port và hệ thống ngắt. Việc thao tác trực tiếp với các thanh ghi này thông qua Assembly cho phép kiểm soát toàn diện và tối ưu hiệu suất.

Bài thực hành 1: Lệnh tính số học để thiết kế bộ cộng/trừ 2 số nhị phân

Xây dựng một bộ cộng/trừ 2 số nhị phân bằng cách sử dụng các lệnh số học như ADD và SUBB. Người học sẽ thiết kế giao diện đầu vào (ví dụ: qua các chân P1) và đầu ra (ví dụ: qua P0) để hiển thị kết quả.

Bài thực hành 2: Bộ định thời tạo xung dao động tần số xác định

Cấu hình các bộ định thời (Timer/Counter) của 8051 để tạo ra các xung dao động với tần số chính xác. Điều này liên quan đến việc tính toán các giá trị nạp cho thanh ghi TLx, THx và cấu hình thanh ghi TMOD, TCON. Việc tạo xung là cơ sở cho nhiều ứng dụng điều khiển động cơ hoặc tạo tín hiệu.

Bài thực hành 3: Ngắt ngoài để giao tiếp với bàn phím ma trận

Sử dụng chức năng ngắt ngoài của 8051 để phát hiện các sự kiện từ bàn phím ma trận. Khi một phím được nhấn, một ngắt sẽ xảy ra, và chương trình con phục vụ ngắt sẽ xác định phím nào được nhấn. Đây là một kỹ thuật hiệu quả để xử lý đầu vào từ người dùng mà không cần liên tục quét trạng thái bàn phím.

Bài thực hành 4: Thiết kế máy tính để cộng/trừ số có 2 chữ số

Kết hợp kiến thức về giao tiếp ngoại vi và tính toán số học để thiết kế một máy tính đơn giản có thể cộng hoặc trừ hai số có hai chữ số. Đầu vào có thể từ bàn phím ma trận và kết quả hiển thị trên LED 7 đoạn. Đây là một dự án nhỏ tích hợp nhiều kỹ năng lập trình và giao tiếp.

Lập trình giao tiếp 8051 với ngoại vi sử dụng C

Trong khi Assembly cung cấp quyền kiểm soát tối đa, lập trình C cho 8051 mang lại năng suất cao hơn, dễ đọc và dễ bảo trì hơn, đặc biệt đối với các dự án lớn. Trình biên dịch C cho 8051 (như Keil C51) cho phép sử dụng các cấu trúc ngôn ngữ cấp cao như biến, vòng lặp, hàm, trong khi vẫn có thể truy cập trực tiếp các thanh ghi phần cứng thông qua các biến SFR được định nghĩa sẵn.

Sử dụng C giúp đơn giản hóa việc triển khai các thuật toán phức tạp và quản lý các giao tiếp ngoại vi. Mặc dù có thể có chút đánh đổi về hiệu suất so với Assembly tối ưu hóa, nhưng với tốc độ xử lý hiện tại của các vi điều khiển và trình biên dịch, C thường là lựa chọn ưu tiên cho hầu hết các ứng dụng nhúng.

Bài thực hành 1: Giao tiếp LED đơn

Điều khiển các LED đơn bằng ngôn ngữ C. Người học sẽ viết mã để bật/tắt LED, tạo hiệu ứng nhấp nháy. Thay vì thao tác bit trực tiếp như trong Assembly, C cho phép chúng ta viết P1_0 = 1; hoặc P1_0 = 0; để điều khiển chân P1.0.

Thực Hành Kiến Trúc Máy Tính: Khảo Sát 8051 Và Lập Trình Nhúng
Thực Hành Kiến Trúc Máy Tính: Khảo Sát 8051 Và Lập Trình Nhúng

Bài thực hành 2: Giao tiếp LED 7 đoạn

Viết chương trình C để hiển thị các chữ số trên LED 7 đoạn. Bài tập này yêu cầu lập trình bảng mã chuyển đổi từ số sang các tín hiệu điều khiển từng đoạn của LED, cũng như kỹ thuật quét LED 7 đoạn nếu sử dụng nhiều chữ số.

Bài thực hành 3: Giao tiếp bàn phím ma trận

Tương tự như trong Assembly, nhưng lần này sử dụng C để giao tiếp với bàn phím ma trận. Chương trình sẽ đọc trạng thái các hàng và cột để xác định phím được nhấn. Việc sử dụng vòng lặp và câu lệnh điều kiện trong C sẽ làm cho mã dễ đọc và cấu trúc hơn.

Bài thực hành 4: Giao tiếp màn hình tinh thể lỏng LCD

Lập trình để hiển thị văn bản và dữ liệu lên màn hình LCD. Người học sẽ tìm hiểu về các lệnh điều khiển LCD (khởi tạo, xóa màn hình, di chuyển con trỏ, ghi ký tự) và cách triển khai chúng bằng C. Đây là một bước quan trọng để hiển thị thông tin phức tạp từ vi điều khiển.

Bài thực hành 5: Giao tiếp bộ chuyển đổi tương tự sang số ADC

Nếu 8051 được tích hợp hoặc kết nối với một chip ADC ngoài, bài tập này sẽ hướng dẫn cách đọc dữ liệu tương tự (ví dụ: từ cảm biến nhiệt độ) và chuyển đổi thành dạng số để vi điều khiển có thể xử lý. Việc cấu hình ADC và đọc giá trị sẽ được thực hiện bằng C.

Bài thực hành 6: Giao tiếp truyền thông nối tiếp UART

Giao tiếp UART (Universal Asynchronous Receiver/Transmitter) cho phép 8051 truyền và nhận dữ liệu nối tiếp với các thiết bị khác, chẳng hạn như máy tính cá nhân hoặc các vi điều khiển khác. Người học sẽ cấu hình cổng nối tiếp, tốc độ baud rate, và viết các hàm gửi/nhận ký tự. Kỹ thuật này là nền tảng cho việc điều khiển và giám sát thiết bị từ xa. Website Trần Du cũng thường xuyên chia sẻ các hướng dẫn chi tiết về các chuẩn truyền thông trong hệ thống nhúng.

Bài thực hành 7: Giao tiếp bộ nhớ RAM/ROM ngoài

Khi các ứng dụng yêu cầu bộ nhớ lớn hơn dung lượng tích hợp, 8051 có thể giao tiếp với RAM hoặc ROM ngoài. Bài tập này sẽ khám phá cách địa chỉ hóa và truy cập các chip bộ nhớ ngoài thông qua các chân địa chỉ và dữ liệu của 8051, mở rộng khả năng lưu trữ dữ liệu và chương trình.

Vai trò của các chuẩn truyền thông trong kiến trúc máy tính

Trong quá trình thực hành kiến trúc máy tính, việc hiểu các chuẩn truyền thông giữa máy tính đa dụng và vi điều khiển là cực kỳ quan trọng. UART là một trong những chuẩn phổ biến nhất cho giao tiếp nối tiếp ở tốc độ thấp, thường được sử dụng để debug hoặc gửi/nhận lệnh điều khiển đơn giản. Việc thiết lập UART trên 8051 bao gồm cấu hình các thanh ghi SCON và TMOD, cũng như chọn tốc độ baud phù hợp.

Ngoài UART, còn có các chuẩn khác như SPI (Serial Peripheral Interface) và I2C (Inter-Integrated Circuit) cho phép giao tiếp tốc độ cao hơn với nhiều thiết bị ngoại vi trên cùng một bus. SPI thường được sử dụng với các thiết bị như thẻ nhớ SD, module WiFi, trong khi I2C phù hợp cho cảm biến và EEPROM. Mỗi chuẩn có ưu và nhược điểm riêng, và việc lựa chọn chuẩn phù hợp phụ thuộc vào yêu cầu của ứng dụng về tốc độ, số lượng thiết bị và độ phức tạp.

Hiểu rõ các phương pháp giao tiếp này không chỉ giúp điều khiển từ xa các hệ thống nhúng mà còn mở rộng đáng kể khả năng thu thập và xử lý dữ liệu từ các cảm biến hay truyền thông với các module phức tạp khác. Điều này chứng tỏ sự đa dạng và linh hoạt trong việc áp dụng kiến thức kiến trúc máy tính vào thực tế.

Lời kết

Thực hành kiến trúc máy tính với vi điều khiển 8051 cung cấp một nền tảng vững chắc cho sinh viên và kỹ sư muốn làm việc trong lĩnh vực hệ thống nhúng. Từ việc khảo sát sâu sắc kiến trúc phần cứng, làm chủ ngôn ngữ hợp ngữ đến việc lập trình giao tiếp ngoại vi bằng cả Assembly và C, mỗi bước đều góp phần xây dựng kiến thức và kỹ năng thực tế. Nắm vững những kiến thức này không chỉ giúp bạn hiểu cách máy tính hoạt động ở cấp độ thấp nhất mà còn mở ra cánh cửa để phát triển các giải pháp công nghệ sáng tạo, hiệu quả.