I. Tổng quan đồ án 8086 Thiết kế hệ thống tính tiền tự động
Đồ án này tập trung vào việc ứng dụng kiến thức về hệ vi xử lý 8086 để xây dựng một chương trình chọn và tính tiền hàng hóa tự động. Đây là một bài toán thực tiễn, mô phỏng hoạt động của các máy bán hàng tự động hoặc các quầy thanh toán tự phục vụ. Mặc dù kiến trúc Intel 8086 đã cũ so với các vi xử lý hiện đại, việc thực hiện đề tài này mang lại giá trị học thuật cao, giúp người học nắm vững nguyên lý hoạt động của vi xử lý, kỹ thuật lập trình cấp thấp và phương pháp giao tiếp với thiết bị ngoại vi. Mục tiêu chính của đồ án không chỉ dừng lại ở việc tạo ra một sản phẩm hoạt động, mà còn là quá trình nghiên cứu và áp dụng lý thuyết vào thực tế. Quá trình này bao gồm việc lập trình Assembly 8086, thiết kế mạch nguyên lý, và thực hiện mô phỏng để kiểm chứng. Đề tài sử dụng các công cụ phổ biến trong ngành như phần mềm Emu8086 để lập trình và gỡ lỗi code, cùng với mô phỏng Proteus 8086 để xây dựng và kiểm tra mạch điện tử hoàn chỉnh. Việc lựa chọn vi xử lý 8086 làm trung tâm xử lý đặt ra nhiều thách thức nhưng cũng là cơ hội để hiểu sâu hơn về cách một hệ thống nhúng cơ bản được xây dựng từ phần cứng đến phần mềm. Thông qua việc hoàn thành báo cáo đồ án 8086 này, người thực hiện sẽ củng cố kiến thức về tập lệnh 8086, cách quản lý bộ nhớ, và các kỹ thuật phối ghép I/O quan trọng.
1.1. Mục tiêu cốt lõi của đồ án vi điều khiển 8086
Mục tiêu chính của đề tài là xây dựng thành công một chương trình mô phỏng hệ thống chọn và tính tiền hàng hóa. Chương trình này phải có khả năng hiển thị danh mục sản phẩm, cho phép người dùng lựa chọn, tính tổng số tiền và xuất hóa đơn. Để đạt được điều này, các mục tiêu cụ thể được đặt ra. Thứ nhất, xây dựng chương trình logic bằng ngôn ngữ Assembly trên phần mềm Emu8086 - Microprocessor Emulator. Giai đoạn này tập trung hoàn toàn vào thuật toán và xử lý dữ liệu. Thứ hai, tiến hành mô phỏng Proteus 8086 với các linh kiện phần cứng thực tế. Mục tiêu này yêu cầu thiết kế một sơ đồ khối vi xử lý 8086 hoàn chỉnh, bao gồm vi xử lý trung tâm, các IC giải mã địa chỉ như 74273, IC giao tiếp vào/ra 8255A, màn hình LCD và bàn phím ma trận. Việc này giúp kiểm tra tính khả thi của thiết kế phần cứng hệ VXL và sự tương tác giữa phần mềm và phần cứng.
1.2. Giới thiệu kiến trúc và sơ đồ khối vi xử lý 8086
Vi xử lý 8086 là một CPU 16-bit của Intel, hoạt động với 20 đường địa chỉ và 16 đường dữ liệu, cho phép quản lý 1MB bộ nhớ. Cấu trúc bên trong 8086 được chia thành hai khối chính hoạt động song song: Khối Giao tiếp Bus (BIU - Bus Interface Unit) và Khối Thực thi Lệnh (EU - Execution Unit). BIU chịu trách nhiệm tìm nạp lệnh, đọc/ghi dữ liệu từ bộ nhớ hoặc cổng I/O. EU có nhiệm vụ giải mã và thực thi các lệnh đã được BIU nạp sẵn vào hàng đợi. Theo tài liệu nghiên cứu, sơ đồ khối của bộ vi xử lý 8086 cho thấy sự phân chia rõ ràng này, giúp tăng hiệu suất xử lý thông qua cơ chế đường ống (pipelining). EU chứa các thanh ghi đa năng (AX, BX, CX, DX), các thanh ghi con trỏ và chỉ số, cùng với bộ số học và logic (ALU). Sự hiểu biết về kiến trúc Intel 8086 và chức năng của từng khối là nền tảng để xây dựng và gỡ lỗi cho đồ án vi điều khiển này.
II. Phân tích thách thức khi thiết kế máy bán hàng tự động 8086
Việc sử dụng vi xử lý 8086 cho một ứng dụng hiện đại như máy tính tiền tự động mang đến nhiều thách thức đặc thù. Khác biệt lớn nhất nằm ở tài nguyên hệ thống hạn chế và sự phức tạp trong lập trình cấp thấp. Các vi xử lý ngày nay như Core i3, i5 có sức mạnh tính toán vượt trội, bộ nhớ khổng lồ và hệ điều hành hỗ trợ. Ngược lại, 8086 đòi hỏi lập trình viên phải quản lý trực tiếp từng byte bộ nhớ, tối ưu hóa mã lệnh và tự xây dựng các trình điều khiển cho thiết bị ngoại vi. Thách thức đầu tiên là lập trình Assembly 8086, một ngôn ngữ gần với mã máy, đòi hỏi sự tỉ mỉ và hiểu biết sâu về tập lệnh 8086. Việc xử lý chuỗi ký tự, các phép toán số học phức tạp và quản lý giao diện người dùng đều phải được viết từ đầu. Một thách thức khác là thiết kế phần cứng hệ VXL. Việc giao tiếp với các thiết bị như LCD hay bàn phím không có sẵn thư viện hỗ trợ. Lập trình viên phải hiểu rõ nguyên lý hoạt động của các IC phụ trợ như 8255A để cấu hình các cổng vào/ra, cũng như các IC giải mã địa chỉ để phân vùng không gian I/O. Việc quản lý sản phẩm VXL 8086 cũng phức tạp hơn do không có hệ thống file, mọi dữ liệu về sản phẩm và giá cả phải được lưu trữ dưới dạng các biến hoặc hằng số trong mã chương trình.
2.1. Hạn chế của tập lệnh 8086 trong xử lý giao dịch
Bộ tập lệnh 8086 được thiết kế cho các tác vụ tính toán cơ bản, không được tối ưu cho các nghiệp vụ phức tạp như quản lý giao dịch hay xử lý giao diện đồ họa. Các lệnh số học như ADD, SUB, MUL, DIV chỉ hoạt động trên các số 16-bit. Khi cần tính toán với các số lớn hơn (ví dụ: tổng tiền vượt quá 65535), lập trình viên phải tự xây dựng các thủ tục xử lý số lớn, làm tăng độ phức tạp của code máy tính tiền assembly. Hơn nữa, việc xử lý chuỗi ký tự để hiển thị trên màn hình LCD cũng khá cồng kềnh, đòi hỏi phải sử dụng kết hợp các lệnh lặp (LOOP) và lệnh di chuyển dữ liệu (MOV) một cách khéo léo. So với các ngôn ngữ lập trình hiện đại, việc thiếu các cấu trúc dữ liệu phức tạp và hàm dựng sẵn là một rào cản lớn, buộc mọi logic phải được xây dựng từ những viên gạch cơ bản nhất.
2.2. Khó khăn trong việc giao tiếp LCD và bàn phím ma trận
Giao tiếp với thiết bị ngoại vi là một trong những phần phức tạp nhất của đồ án vi điều khiển. Đối với giao tiếp LCD với 8086, cần phải gửi một chuỗi các lệnh khởi tạo đúng trình tự để màn hình hoạt động. Sau đó, mỗi khi cần ghi dữ liệu hay lệnh, phải tuân thủ nghiêm ngặt quy trình: đặt dữ liệu lên bus, chọn đúng thanh ghi (lệnh hay dữ liệu) qua chân RS, và tạo một xung cho phép trên chân E. Tương tự, giao tiếp bàn phím ma trận yêu cầu thực hiện quét cột và đọc hàng liên tục để phát hiện phím nhấn. Toàn bộ quá trình này phải được điều khiển thông qua IC 8255A, bằng cách ghi các giá trị điều khiển vào các cổng của nó. Việc gỡ lỗi phần cứng và phần mềm trong giai đoạn này rất tốn thời gian, vì một sai sót nhỏ trong việc cấu hình cổng hoặc thời gian chờ cũng có thể khiến toàn bộ hệ thống không hoạt động.
III. Giải pháp phần cứng cho đồ án 8086 Sơ đồ khối và linh kiện
Để hiện thực hóa chương trình tính tiền, một hệ thống phần cứng hoàn chỉnh đã được thiết kế và mô phỏng. Trái tim của hệ thống là vi xử lý 8086, chịu trách nhiệm thực thi toàn bộ logic của chương trình. Xung quanh nó là các vi mạch phụ trợ đóng vai trò quan trọng trong việc kết nối và điều khiển các thiết bị ngoại vi. Sơ đồ khối vi xử lý 8086 của hệ thống được xây dựng dựa trên nguyên tắc module hóa, bao gồm: khối xử lý trung tâm, khối giải mã địa chỉ, khối giao tiếp vào/ra, khối hiển thị và khối nhập liệu. Khối giải mã địa chỉ sử dụng các IC 74273 để tách các đường địa chỉ/dữ liệu đa hợp của 8086, cung cấp các tín hiệu địa chỉ ổn định cho bộ nhớ và các cổng I/O. Đây là bước nền tảng cho việc thiết kế phần cứng hệ VXL. Khối giao tiếp vào/ra sử dụng IC 8255A, một vi mạch giao tiếp ngoại vi lập trình được, đóng vai trò trung gian giữa 8086 và các thiết bị bên ngoài. Khối hiển thị là màn hình LCD 20x4, và khối nhập liệu là một bàn phím ma trận. Sự lựa chọn các linh kiện này không chỉ phổ biến trong các kit thực hành 8086 mà còn giúp giảm độ phức tạp của mạch điện, tập trung vào giải quyết bài toán logic.
3.1. Vai trò của IC 74273 trong việc tách bus địa chỉ dữ liệu
Vi xử lý 8086 sử dụng kỹ thuật đa hợp (multiplexing) để tiết kiệm số chân, trong đó các đường AD0-AD15 vừa mang tín hiệu địa chỉ, vừa mang tín hiệu dữ liệu. Để hệ thống hoạt động ổn định, cần phải tách hai loại tín hiệu này. IC 74273, một chốt D-type 8-bit, được sử dụng cho mục đích này. Theo thiết kế trong tài liệu gốc, ba IC 74273 được sử dụng để chốt lại 20 bit địa chỉ từ bus đa hợp khi tín hiệu ALE (Address Latch Enable) của 8086 ở mức cao. Khi ALE chuyển xuống mức thấp, các đường AD0-AD15 sẽ được giải phóng để truyền dữ liệu. Việc sử dụng IC 74273 đảm bảo rằng các thiết bị ngoại vi và bộ nhớ luôn nhận được một địa chỉ ổn định trong suốt chu kỳ bus, là điều kiện tiên quyết cho một hệ thống nhúng hoạt động chính xác.
3.2. Sử dụng IC 8255A để phối ghép vào ra lập trình được
IC 8255A là cầu nối không thể thiếu giữa 8086 và các thiết bị ngoại vi. Nó cung cấp 24 chân I/O có thể lập trình được, chia thành ba cổng 8-bit: Port A, Port B và Port C. Trong đồ án này, 8255A được cấu hình ở Chế độ 0 (Basic I/O). Cụ thể, Port A được cấu hình làm cổng ra để gửi dữ liệu 8-bit tới màn hình LCD. Port B được dùng làm cổng ra để gửi các tín hiệu điều khiển (RS, R/W, E) đến LCD. Port C được cấu hình làm cổng vào để đọc trạng thái từ bàn phím ma trận. Việc lựa chọn địa chỉ cho các cổng của 8255A và thanh ghi điều khiển (CWR) được thực hiện thông qua mạch giải mã địa chỉ. Tài liệu đề án chỉ rõ việc cấu hình 8255A bằng cách gửi một từ điều khiển đến địa chỉ E7H, ví dụ MOV AL, 10001001B để đặt Port A, B là output và Port C là input.
IV. Phương pháp lập trình Assembly 8086 cho máy tính tiền tự động
Phần mềm là linh hồn của hệ thống, được xây dựng hoàn toàn bằng lập trình Assembly 8086. Chương trình được cấu trúc một cách logic, bao gồm các module chính: khởi tạo hệ thống, hiển thị menu, nhận lựa chọn từ người dùng, xử lý tính toán, và hiển thị hóa đơn. Lưu đồ giải thuật chương trình được thiết kế cẩn thận để đảm bảo luồng hoạt động chính xác và dễ dàng gỡ lỗi. Khi khởi động, chương trình sẽ gửi các lệnh cần thiết để khởi tạo màn hình LCD. Sau đó, một menu chính được hiển thị, cho phép người dùng chọn các danh mục sản phẩm. Dựa trên lựa chọn của người dùng, các menu con tương ứng sẽ xuất hiện. Chương trình sử dụng một vòng lặp chính để liên tục quét bàn phím, chờ đợi người dùng nhập liệu. Khi một sản phẩm được chọn, giá của nó sẽ được cộng dồn vào một thanh ghi tổng. Ngôn ngữ Assembly yêu cầu quản lý thủ công các thanh ghi, ngăn xếp và bộ nhớ. Các hàm ngắt 21h của DOS được sử dụng rộng rãi trong giai đoạn mô phỏng trên Emu8086 để nhập/xuất ký tự, nhưng khi chuyển sang mô phỏng phần cứng trên Proteus, các hàm này được thay thế bằng các thủ tục giao tiếp trực tiếp với IC 8255A.
4.1. Phân tích lưu đồ giải thuật và cấu trúc chương trình
Cấu trúc chương trình được chia thành các thủ tục (PROC) rõ ràng, mỗi thủ tục thực hiện một chức năng cụ thể như LCD_INIT (khởi tạo LCD), KEY_SCAN (quét bàn phím), DISPLAY_MENU (hiển thị menu), CALCULATE_TOTAL (tính tổng tiền). Lưu đồ giải thuật chương trình bắt đầu bằng khối khởi tạo, sau đó đi vào vòng lặp chính. Trong vòng lặp, chương trình hiển thị menu, gọi thủ tục quét phím. Nếu có phím được nhấn, chương trình sẽ so sánh mã phím để xác định hành động tiếp theo: chuyển đến menu con, chọn một món hàng, hoặc tiến hành thanh toán. Các biến được sử dụng để lưu số lượng từng mặt hàng và tổng số tiền. Cách tiếp cận module hóa này giúp code máy tính tiền assembly trở nên dễ đọc, dễ bảo trì và mở rộng hơn.
4.2. Khai thác tập lệnh 8086 và các hàm ngắt quan trọng
Chương trình tận dụng hiệu quả tập lệnh 8086. Lệnh MOV được dùng để di chuyển dữ liệu giữa các thanh ghi và bộ nhớ. Các lệnh số học ADD và INC được dùng để cộng giá tiền và tăng số lượng sản phẩm. Các lệnh so sánh CMP kết hợp với các lệnh nhảy có điều kiện như JE (nhảy nếu bằng), JNE (nhảy nếu không bằng), JA (nhảy nếu lớn hơn) tạo thành xương sống của logic lựa chọn và điều khiển luồng chương trình. Trong phiên bản mô phỏng trên Emu8086, các hàm ngắt 21h đóng vai trò then chốt: MOV AH, 9 để hiển thị chuỗi, MOV AH, 1 để đọc một ký tự từ bàn phím. Những hàm này giúp đơn giản hóa việc lập trình trong môi trường giả lập, cho phép tập trung vào logic nghiệp vụ trước khi chuyển sang giai đoạn tích hợp phần cứng phức tạp hơn.
V. Bí quyết mô phỏng đồ án 8086 trên Emu8086 và Proteus hiệu quả
Quá trình kiểm chứng hoạt động của hệ thống được thực hiện qua hai giai đoạn mô phỏng chính. Giai đoạn đầu tiên là mô phỏng vi xử lý 8086 trên phần mềm Emu8086. Giai đoạn này cho phép kiểm tra logic của chương trình một cách độc lập, không bị ảnh hưởng bởi các vấn đề phần cứng. Lập trình viên có thể dễ dàng theo dõi giá trị của các thanh ghi, các ô nhớ và thực thi chương trình từng bước để phát hiện lỗi thuật toán. Emu8086 cung cấp một môi trường giả lập DOS, giúp việc sử dụng các hàm ngắt để hiển thị thông tin ra màn hình console và nhận dữ liệu từ bàn phím trở nên đơn giản. Đây là bước đệm quan trọng để đảm bảo code máy tính tiền assembly hoạt động đúng như mong đợi về mặt logic. Sau khi chương trình đã chạy ổn định trên Emu8086, giai đoạn hai bắt đầu với mô phỏng Proteus 8086. Đây là bước kiểm tra toàn diện, tích hợp cả phần cứng và phần mềm. Trong Proteus, toàn bộ mạch điện tử được vẽ lại, bao gồm 8086, các IC giải mã, 8255A, LCD và bàn phím. Mã chương trình (thường là file .hex) được nạp vào vi xử lý 8086 để chạy mô phỏng. Giai đoạn này giúp phát hiện các lỗi liên quan đến giao tiếp phần cứng, chẳng hạn như sai địa chỉ cổng, cấu hình sai IC 8255A, hoặc lỗi timing trong giao tiếp LCD.
5.1. Chạy thử nghiệm và gỡ lỗi chương trình trên Emu8086
Trong tài liệu gốc, phần "Hoàn thiện ý tưởng" bắt đầu bằng việc xây dựng chương trình trên Emu8086. Kết quả cho thấy chương trình có thể hiển thị menu, cho phép người dùng lựa chọn nhiều loại hàng hóa, tính tổng tiền và in ra hóa đơn chi tiết. Các ảnh chụp màn hình kết quả chạy thử nghiệm là minh chứng rõ ràng cho việc logic chương trình đã hoạt động chính xác. Ví dụ, người dùng có thể chọn nhiều món trong cùng một danh mục hoặc các danh mục khác nhau, và hệ thống vẫn tính đúng tổng tiền. Việc gỡ lỗi trong Emu8086 cho phép kiểm tra các biến đếm số lượng sản phẩm (cf1, tm1,...) và các biến tổng tiền (a, b,...) sau mỗi lựa chọn, đảm bảo các phép toán cộng dồn được thực hiện đúng.
5.2. Kết quả mô phỏng hệ thống thanh toán trên Proteus
Phần mô phỏng trên Proteus là bài kiểm tra cuối cùng về tính khả thi của thiết kế phần cứng hệ VXL. Sơ đồ mạch nguyên lý trong Proteus cho thấy sự kết nối chi tiết giữa các linh kiện. Sau khi nạp chương trình đã được điều chỉnh để giao tiếp với 8255A, hệ thống mô phỏng hoạt động như một thiết bị thực. Màn hình LCD hiển thị menu chào mừng và các lựa chọn. Người dùng có thể nhấn các nút trên bàn phím ma trận để điều hướng và chọn sản phẩm. Kết quả mô phỏng thành công trên Proteus khẳng định rằng thiết kế mạch và logic điều khiển ngoại vi là chính xác. Nó chứng minh rằng đồ án vi điều khiển này không chỉ là một chương trình lý thuyết mà hoàn toàn có thể được hiện thực hóa trên một kit thực hành 8086 với các linh kiện thực tế.
VI. Kết luận đồ án vi điều khiển 8086 và tiềm năng ứng dụng
Đề tài "Thiết kế chương trình chọn và tính tiền hàng hóa tự động sử dụng hệ vi xử lý 8086" đã hoàn thành xuất sắc các mục tiêu đề ra. Hệ thống đã được xây dựng và kiểm chứng thành công qua hai giai đoạn mô phỏng trên Emu8086 và Proteus. Kết quả cho thấy, mặc dù có những hạn chế về tài nguyên và hiệu năng, vi xử lý 8086 vẫn đủ khả năng để xử lý các bài toán điều khiển và giao tiếp cơ bản, làm nền tảng cho nhiều hệ thống nhúng đơn giản. Việc hoàn thành báo cáo đồ án 8086 này không chỉ là một bài tập kỹ thuật mà còn là một quá trình học tập và nghiên cứu sâu sắc. Nó giúp củng cố kiến thức nền tảng về kiến trúc Intel 8086, kỹ năng lập trình Assembly 8086, và kinh nghiệm thực tiễn trong việc thiết kế, tích hợp và gỡ lỗi một hệ thống vi xử lý hoàn chỉnh. Những kiến thức này là vô giá và có thể áp dụng cho việc phát triển các hệ thống sử dụng các vi điều khiển hiện đại hơn trong tương lai. Đồ án đã chứng minh được khả năng ứng dụng lý thuyết vào giải quyết một vấn đề thực tế, từ việc phân tích yêu cầu, thiết kế giải pháp, đến triển khai và kiểm thử.
6.1. Đánh giá kết quả đạt được và những hạn chế của đề tài
Kết quả lớn nhất là đã xây dựng được một chương trình tính tiền tự động hoàn chỉnh, hoạt động ổn định trong môi trường mô phỏng. Hệ thống đáp ứng được các yêu cầu cơ bản: hiển thị menu, nhận lựa chọn, tính tổng và xuất hóa đơn. Tuy nhiên, đề tài vẫn còn một số hạn chế. Giao diện người dùng còn đơn giản và dựa trên văn bản. Hệ thống chưa có các tính năng nâng cao như quản lý tồn kho, thanh toán không dùng tiền mặt, hay kết nối mạng. Cơ sở dữ liệu sản phẩm và giá cả được lưu trữ cứng trong code, gây khó khăn khi cần cập nhật. Tốc độ xử lý của 8086 cũng là một giới hạn nếu hệ thống cần mở rộng với nhiều sản phẩm và tính năng phức tạp hơn.
6.2. Hướng phát triển trong tương lai cho hệ thống thanh toán
Từ nền tảng của đồ án này, có nhiều hướng phát triển tiềm năng. Thứ nhất, có thể nâng cấp phần cứng bằng cách sử dụng các vi điều khiển hiện đại hơn như AVR, PIC hoặc ARM, cho phép xử lý nhanh hơn và tích hợp nhiều tính năng hơn. Thứ hai, có thể cải tiến giao diện người dùng bằng màn hình cảm ứng thay vì LCD và bàn phím cơ. Thứ ba, tích hợp thêm các module phần cứng khác như máy in nhiệt để in hóa đơn giấy, đầu đọc mã vạch để chọn sản phẩm nhanh hơn, hoặc module thanh toán điện tử. Về phần mềm, có thể phát triển một hệ thống quản lý sản phẩm VXL 8086 linh hoạt hơn bằng cách lưu dữ liệu sản phẩm trong bộ nhớ ngoài như EEPROM, cho phép dễ dàng cập nhật mà không cần biên dịch lại toàn bộ chương trình.