Hệ thống nhúng - Hướng dẫn nhanh

Hệ thống

Hệ thống là một sự sắp xếp trong đó tất cả các đơn vị lắp ráp của nó hoạt động cùng nhau theo một bộ quy tắc. Nó cũng có thể được định nghĩa là cách thức làm việc, tổ chức hoặc thực hiện một hoặc nhiều công việc theo một kế hoạch cố định. Ví dụ, một chiếc đồng hồ là một hệ thống hiển thị thời gian. Các thành phần của nó tuân theo một bộ quy tắc để hiển thị thời gian. Nếu một trong các bộ phận của nó bị lỗi, đồng hồ sẽ ngừng hoạt động. Vì vậy, chúng ta có thể nói, trong một hệ thống, tất cả các thành phần con của nó phụ thuộc vào nhau.

Hệ thống nhúng

Như tên gọi của nó, Embedded có nghĩa là một thứ được gắn vào một thứ khác. Hệ thống nhúng có thể được coi là một hệ thống phần cứng máy tính có phần mềm được nhúng trong đó. Hệ thống nhúng có thể là một hệ thống độc lập hoặc nó có thể là một phần của hệ thống lớn. Hệ thống nhúng là một hệ thống dựa trên vi điều khiển hoặc vi xử lý được thiết kế để thực hiện một nhiệm vụ cụ thể. Ví dụ, báo cháy là một hệ thống nhúng; nó sẽ cảm thấy chỉ có khói.

Một hệ thống nhúng có ba thành phần:

  • Nó có phần cứng.

  • Nó có phần mềm ứng dụng.

  • Nó có Hệ điều hành thời gian thực (RTOS) giám sát phần mềm ứng dụng và cung cấp cơ chế cho phép bộ xử lý chạy quy trình theo lịch trình bằng cách tuân theo kế hoạch để kiểm soát độ trễ. RTOS xác định cách thức hoạt động của hệ thống. Nó thiết lập các quy tắc trong quá trình thực hiện chương trình ứng dụng. Một hệ thống nhúng quy mô nhỏ có thể không có RTOS.

Vì vậy, chúng ta có thể định nghĩa một hệ thống nhúng là một hệ thống điều khiển dựa trên Vi điều khiển, điều khiển bằng phần mềm, đáng tin cậy, thời gian thực.

Đặc điểm của một hệ thống nhúng

  • Single-functioned- Một hệ thống nhúng thường thực hiện một hoạt động chuyên biệt và lặp đi lặp lại như vậy. Ví dụ: Một máy nhắn tin luôn hoạt động như một máy nhắn tin.

  • Tightly constrained- Tất cả các hệ thống máy tính đều có những ràng buộc về số liệu thiết kế, nhưng những ràng buộc trên hệ thống nhúng có thể đặc biệt chặt chẽ. Chỉ số thiết kế là thước đo các tính năng của triển khai như chi phí, kích thước, sức mạnh và hiệu suất của nó. Nó phải có kích thước vừa với một con chip, phải hoạt động đủ nhanh để xử lý dữ liệu trong thời gian thực và tiêu thụ điện năng tối thiểu để kéo dài tuổi thọ pin.

  • Reactive and Real time- Nhiều hệ thống nhúng phải liên tục phản ứng với những thay đổi trong môi trường của hệ thống và phải tính toán các kết quả nhất định trong thời gian thực mà không có bất kỳ độ trễ nào. Hãy xem xét một ví dụ về bộ điều khiển hành trình ô tô; nó liên tục theo dõi và phản ứng với các cảm biến tốc độ và phanh. Nó phải tính toán gia tốc hoặc giảm gia tốc lặp đi lặp lại trong một thời gian giới hạn; việc tính toán chậm trễ có thể dẫn đến việc không điều khiển được xe.

  • Microprocessors based - Nó phải dựa trên vi xử lý hoặc vi điều khiển.

  • Memory- Nó phải có một bộ nhớ, vì phần mềm của nó thường được nhúng trong ROM. Nó không cần bất kỳ bộ nhớ phụ nào trong máy tính.

  • Connected - Nó phải có thiết bị ngoại vi kết nối để kết nối các thiết bị đầu vào và đầu ra.

  • HW-SW systems- Phần mềm được sử dụng cho nhiều tính năng và linh hoạt hơn. Phần cứng được sử dụng cho hiệu suất và bảo mật.

Ưu điểm

  • Dễ dàng tùy chỉnh
  • Sự tiêu thụ ít điện năng
  • Giá thấp
  • Nâng cao hiệu suất

Nhược điểm

  • Nỗ lực phát triển cao
  • Thời gian lớn hơn để tiếp thị

Cấu trúc cơ bản của một hệ thống nhúng

Hình minh họa sau đây cho thấy cấu trúc cơ bản của một hệ thống nhúng:

  • Sensor- Nó đo đại lượng vật lý và chuyển nó thành tín hiệu điện mà người quan sát có thể đọc được hoặc bằng bất kỳ thiết bị điện tử nào như bộ chuyển đổi A2D. Một cảm biến lưu trữ số lượng đo được vào bộ nhớ.

  • A-D Converter - Bộ chuyển đổi tín hiệu tương tự sang số chuyển đổi tín hiệu tương tự do cảm biến gửi thành tín hiệu kỹ thuật số.

  • Processor & ASICs - Bộ xử lý xử lý dữ liệu để đo kết quả đầu ra và lưu vào bộ nhớ.

  • D-A Converter - Bộ chuyển đổi kỹ thuật số sang tương tự chuyển đổi dữ liệu kỹ thuật số được bộ xử lý cung cấp thành dữ liệu tương tự

  • Actuator - Một bộ truyền động so sánh đầu ra do Bộ chuyển đổi DA đưa ra với đầu ra thực tế (dự kiến) được lưu trữ trong đó và lưu trữ đầu ra đã được phê duyệt.

Bộ xử lý là trái tim của một hệ thống nhúng. Nó là đơn vị cơ bản nhận đầu vào và tạo ra đầu ra sau khi xử lý dữ liệu. Đối với một nhà thiết kế hệ thống nhúng, cần phải có kiến ​​thức về cả vi xử lý và vi điều khiển.

Bộ xử lý trong một hệ thống

Một bộ xử lý có hai đơn vị thiết yếu -

  • Bộ điều khiển luồng chương trình (CU)
  • Đơn vị thực thi (EU)

CU bao gồm một đơn vị tìm nạp để tìm nạp các lệnh từ bộ nhớ. EU có các mạch thực hiện các hướng dẫn liên quan đến hoạt động truyền dữ liệu và chuyển đổi dữ liệu từ dạng này sang dạng khác.

EU bao gồm Đơn vị số học và lôgic (ALU) và cả các mạch thực hiện các lệnh cho một tác vụ điều khiển chương trình như ngắt hoặc nhảy đến một bộ lệnh khác.

Một bộ xử lý chạy các chu kỳ tìm nạp và thực hiện các lệnh theo cùng một trình tự khi chúng được tìm nạp từ bộ nhớ.

Các loại bộ xử lý

Bộ xử lý có thể thuộc các loại sau:

  • Bộ xử lý mục đích chung (GPP)

    • Microprocessor
    • Microcontroller
    • Bộ xử lý nhúng
    • Bộ xử lý tín hiệu kỹ thuật số
    • Bộ xử lý phương tiện
  • Bộ xử lý hệ thống ứng dụng cụ thể (ASSP)

  • Bộ xử lý hướng dẫn ứng dụng cụ thể (ASIP)

  • (Các) lõi GPP hoặc (các) lõi ASIP trên Mạch tích hợp dành riêng cho ứng dụng (ASIC) hoặc mạch Tích hợp quy mô rất lớn (VLSI).

Bộ vi xử lý

Bộ vi xử lý là một chip VLSI duy nhất có một CPU. Ngoài ra, nó cũng có thể có các đơn vị khác như huấn luyện viên, đơn vị số học xử lý dấu phẩy động và đơn vị pipelining giúp xử lý các lệnh nhanh hơn.

Chu kỳ tìm nạp và thực thi của bộ vi xử lý thế hệ trước được hướng dẫn bởi tần số xung nhịp có thứ tự ~ 1 MHz. Bộ vi xử lý hiện hoạt động ở xung nhịp 2GHz

Vi điều khiển

Bộ vi điều khiển là một đơn vị VLSI đơn chip (còn được gọi là microcomputer), mặc dù có khả năng tính toán hạn chế, sở hữu khả năng nhập / xuất nâng cao và một số đơn vị chức năng trên chip.

CPU RAM ROM
Cổng I / O Hẹn giờ Cổng COM nối tiếp

Bộ vi điều khiển đặc biệt được sử dụng trong các hệ thống nhúng cho các ứng dụng điều khiển thời gian thực với bộ nhớ chương trình trên chip và các thiết bị.

Bộ vi xử lý so với Bộ vi điều khiển

Bây giờ chúng ta hãy xem xét những điểm khác biệt đáng chú ý nhất giữa bộ vi xử lý và bộ vi điều khiển.

Bộ vi xử lý Vi điều khiển
Bản chất vi xử lý là đa nhiệm. Có thể thực hiện nhiều nhiệm vụ cùng một lúc. Ví dụ, trên máy tính, chúng ta có thể chơi nhạc trong khi soạn thảo văn bản trong trình soạn thảo văn bản. Định hướng nhiệm vụ đơn lẻ. Ví dụ, máy giặt được thiết kế chỉ để giặt quần áo.
RAM, ROM, Cổng I / O và Bộ hẹn giờ có thể được thêm bên ngoài và có thể khác nhau về số lượng. Không thể thêm RAM, ROM, Cổng I / O và Bộ hẹn giờ bên ngoài. Các thành phần này phải được nhúng với nhau trên một con chip và được cố định theo số lượng.
Nhà thiết kế có thể quyết định số lượng bộ nhớ hoặc cổng I / O cần thiết. Số cố định cho bộ nhớ hoặc I / O làm cho một bộ vi điều khiển lý tưởng cho một nhiệm vụ cụ thể nhưng hạn chế.
Hỗ trợ bên ngoài của bộ nhớ ngoài và các cổng I / O làm cho một hệ thống dựa trên bộ vi xử lý nặng hơn và đắt hơn. Các bộ vi điều khiển có trọng lượng nhẹ và rẻ hơn một bộ vi xử lý.
Các thiết bị bên ngoài đòi hỏi nhiều không gian hơn và mức tiêu thụ điện năng của chúng cao hơn. Hệ thống dựa trên vi điều khiển tiêu thụ ít điện năng hơn và tốn ít không gian hơn.

Các bộ vi điều khiển 8051 hoạt động với bus dữ liệu 8 bit. Vì vậy, chúng có thể hỗ trợ bộ nhớ dữ liệu bên ngoài lên đến 64K và bộ nhớ chương trình bên ngoài tốt nhất là 64k. Nói chung, vi điều khiển 8051 có thể xử lý 128k bộ nhớ ngoài.

Khi dữ liệu và mã nằm trong các khối bộ nhớ khác nhau, thì kiến ​​trúc được gọi là Harvard architecture. Trong trường hợp dữ liệu và mã nằm trong cùng một khối bộ nhớ, thì kiến ​​trúc được gọi làVon Neumann architecture.

Kiến trúc Von Neumann

Kiến trúc Von Neumann lần đầu tiên được đề xuất bởi một nhà khoa học máy tính John von Neumann. Trong kiến ​​trúc này, tồn tại một đường dẫn dữ liệu hoặc bus cho cả lệnh và dữ liệu. Kết quả là CPU thực hiện một hoạt động tại một thời điểm. Nó lấy một lệnh từ bộ nhớ hoặc thực hiện thao tác đọc / ghi trên dữ liệu. Vì vậy, một lệnh tìm nạp và một thao tác dữ liệu không thể xảy ra đồng thời, chia sẻ một bus chung.

Kiến trúc Von-Neumann hỗ trợ phần cứng đơn giản. Nó cho phép sử dụng một bộ nhớ tuần tự, duy nhất. Tốc độ xử lý ngày nay vượt xa thời gian truy cập bộ nhớ rất nhiều, và chúng tôi sử dụng một lượng bộ nhớ (cache) cục bộ rất nhanh nhưng nhỏ cho bộ xử lý.

Kiến trúc Harvard

Kiến trúc Harvard cung cấp bộ lưu trữ và bus tín hiệu riêng biệt cho các hướng dẫn và dữ liệu. Kiến trúc này có bộ lưu trữ dữ liệu hoàn toàn nằm trong CPU và không có quyền truy cập vào bộ lưu trữ lệnh dưới dạng dữ liệu. Máy tính có các vùng bộ nhớ riêng biệt cho các lệnh chương trình và dữ liệu bằng cách sử dụng các bus dữ liệu bên trong, cho phép truy cập đồng thời cả lệnh và dữ liệu.

Các chương trình cần thiết để được tải bởi một toán tử; bộ xử lý không thể tự khởi động. Trong kiến ​​trúc Harvard, không cần phải làm cho hai ký ức chia sẻ tài sản.

Kiến trúc Von-Neumann và Kiến trúc Harvard

Những điểm sau đây phân biệt Kiến trúc Von Neumann với Kiến trúc Harvard.

Kiến trúc Von-Neumann Kiến trúc Harvard
Bộ nhớ duy nhất được chia sẻ bởi cả mã và dữ liệu. Bộ nhớ riêng biệt cho mã và dữ liệu.
Bộ xử lý cần tìm nạp mã trong một chu kỳ đồng hồ riêng biệt và dữ liệu trong một chu kỳ đồng hồ khác. Vì vậy, nó yêu cầu hai chu kỳ đồng hồ. Một chu kỳ đồng hồ là đủ, vì các bus riêng biệt được sử dụng để truy cập mã và dữ liệu.
Tốc độ cao hơn, do đó ít tốn thời gian hơn. Tốc độ chậm hơn, do đó tốn nhiều thời gian hơn.
Đơn giản trong thiết kế. Phức tạp trong thiết kế.

CISC và RISC

CISC là một máy tính tập hợp lệnh phức tạp. Nó là một máy tính có thể giải quyết một số lượng lớn các lệnh.

Vào đầu những năm 1980, các nhà thiết kế máy tính đã khuyến nghị rằng máy tính nên sử dụng ít lệnh hơn với cấu trúc đơn giản để chúng có thể được thực thi nhanh hơn nhiều trong CPU mà không cần phải sử dụng bộ nhớ. Những máy tính như vậy được phân loại là Máy tính Bộ Hướng dẫn Giảm hoặc RISC.

CISC so với RISC

Những điểm sau đây phân biệt CISC với RISC:

CISC RISC
Bộ hướng dẫn lớn hơn. Dễ dàng lập trình Bộ Hướng dẫn nhỏ hơn. Khó lập trình.
Thiết kế trình biên dịch đơn giản hơn, xem xét tập lệnh lớn hơn. Thiết kế phức tạp của trình biên dịch.
Nhiều chế độ địa chỉ gây ra các định dạng lệnh phức tạp. Ít chế độ địa chỉ, sửa định dạng lệnh.
Độ dài lệnh có thể thay đổi. Chiều dài hướng dẫn khác nhau.
Chu kỳ xung nhịp trên giây cao hơn. Chu kỳ đồng hồ thấp trên giây.
Nhấn mạnh vào phần cứng. Nhấn mạnh vào phần mềm.
Đơn vị điều khiển thực hiện tập lệnh lớn bằng đơn vị chương trình vi mô. Mỗi lệnh sẽ được thực thi bởi phần cứng.
Thực thi chậm hơn, vì các lệnh phải được đọc từ bộ nhớ và được giải mã bởi bộ giải mã. Thực thi nhanh hơn, vì mỗi lệnh sẽ được thực thi bằng phần cứng.
Pipelining là không thể. Có thể tạo ra các hướng dẫn, xem xét chu kỳ đồng hồ đơn.

Trình biên dịch và lắp ráp

Trình biên dịch

Trình biên dịch là một chương trình máy tính (hoặc một tập hợp các chương trình) biến mã nguồn được viết bằng một ngôn ngữ lập trình (ngôn ngữ nguồn) thành một ngôn ngữ máy tính khác (thường là định dạng nhị phân). Lý do phổ biến nhất để chuyển đổi là tạo một chương trình thực thi. Tên "trình biên dịch" chủ yếu được sử dụng cho các chương trình dịch mã nguồn từ ngôn ngữ lập trình cấp cao sang ngôn ngữ cấp thấp (ví dụ: hợp ngữ hoặc mã máy).

Trình biên dịch chéo

Nếu chương trình đã biên dịch có thể chạy trên máy tính có CPU hoặc hệ điều hành khác với máy tính mà trình biên dịch đã biên dịch chương trình, thì trình biên dịch đó được gọi là trình biên dịch chéo.

Trình biên dịch

Một chương trình có thể dịch một chương trình từ ngôn ngữ cấp thấp sang ngôn ngữ cấp cao được gọi là trình dịch ngược.

Chuyển đổi ngôn ngữ

Một chương trình dịch các chương trình được viết bằng các ngôn ngữ cấp cao khác nhau thường được gọi là trình dịch ngôn ngữ, trình dịch nguồn sang nguồn hoặc trình chuyển đổi ngôn ngữ.

Một trình biên dịch có thể thực hiện các hoạt động sau:

  • Preprocessing
  • Parsing
  • Phân tích ngữ nghĩa (Bản dịch theo hướng cú pháp)
  • Tạo mã
  • Tối ưu hóa mã

Thợ lắp ráp

Trình hợp ngữ là một chương trình lấy các lệnh cơ bản của máy tính (được gọi là hợp ngữ) và chuyển đổi chúng thành một mẫu bit mà bộ xử lý của máy tính có thể sử dụng để thực hiện các hoạt động cơ bản của nó. Một trình hợp dịch tạo ra mã đối tượng bằng cách dịch các thuật ngữ hướng dẫn lắp ráp thành các mã quang, phân giải các tên tượng trưng cho các vị trí bộ nhớ. Hợp ngữ sử dụng một ký hiệu để đại diện cho mỗi hoạt động của máy cấp thấp (opcode).

Công cụ gỡ lỗi trong hệ thống nhúng

Gỡ lỗi là một quy trình có phương pháp để tìm và giảm số lượng lỗi trong một chương trình máy tính hoặc một phần cứng điện tử để nó hoạt động như mong đợi. Gỡ lỗi rất khó khi các hệ thống con được kết hợp chặt chẽ với nhau, bởi vì một thay đổi nhỏ trong một hệ thống con có thể tạo ra lỗi trong hệ thống con khác. Các công cụ gỡ lỗi được sử dụng trong hệ thống nhúng khác nhau rất nhiều về thời gian phát triển và tính năng gỡ lỗi của chúng. Chúng ta sẽ thảo luận ở đây về các công cụ gỡ lỗi sau:

  • Simulators
  • Bộ khởi động vi điều khiển
  • Emulator

Trình mô phỏng

Mã được kiểm tra cho MCU / hệ thống bằng cách mô phỏng nó trên máy tính chủ được sử dụng để phát triển mã. Trình mô phỏng cố gắng mô hình hóa hoạt động của bộ vi điều khiển hoàn chỉnh trong phần mềm.

Chức năng của Trình mô phỏng

Trình mô phỏng thực hiện các chức năng sau:

  • Xác định bộ xử lý hoặc họ thiết bị xử lý cũng như các phiên bản khác nhau của nó cho hệ thống đích.

  • Theo dõi thông tin chi tiết của một phần mã nguồn bằng các nhãn và các đối số tượng trưng khi quá trình thực thi diễn ra cho mỗi bước đơn lẻ.

  • Cung cấp trạng thái của RAM và các cổng mô phỏng của hệ thống đích cho mỗi bước thực thi đơn lẻ.

  • Theo dõi phản ứng của hệ thống và xác định thông lượng.

  • Cung cấp dấu vết đầu ra của nội dung của bộ đếm chương trình so với các thanh ghi của bộ xử lý.

  • Cung cấp ý nghĩa chi tiết của lệnh hiện tại.

  • Theo dõi thông tin chi tiết của các lệnh mô phỏng khi chúng được nhập từ bàn phím hoặc được chọn từ menu.

  • Hỗ trợ các điều kiện (lên đến 8 hoặc 16 hoặc 32 điều kiện) và các điểm ngắt vô điều kiện.

  • Cung cấp các điểm ngắt và dấu vết cùng là công cụ kiểm tra và gỡ lỗi quan trọng.

  • Tạo điều kiện thuận lợi cho việc đồng bộ hóa các thiết bị ngoại vi bên trong và sự chậm trễ.

Bộ khởi động vi điều khiển

Một bộ khởi động vi điều khiển bao gồm:

  • Bảng phần cứng (Bảng đánh giá)
  • Lập trình viên trong hệ thống
  • Một số công cụ phần mềm như trình biên dịch, trình hợp dịch, trình liên kết, v.v.
  • Đôi khi, một phiên bản đánh giá giới hạn về kích thước mã và IDE của trình biên dịch.

Một lợi thế lớn của các bộ công cụ này so với trình mô phỏng là chúng hoạt động trong thời gian thực và do đó cho phép xác minh chức năng đầu vào / đầu ra dễ dàng. Tuy nhiên, bộ dụng cụ khởi động là hoàn toàn đủ và là lựa chọn rẻ nhất để phát triển các dự án vi điều khiển đơn giản.

Trình giả lập

Trình mô phỏng là một bộ phần cứng hoặc một chương trình phần mềm hoặc có thể là cả hai mô phỏng các chức năng của một hệ thống máy tính (khách) trong một hệ thống máy tính khác (máy chủ), khác với hệ thống đầu tiên, sao cho hành vi mô phỏng gần giống với hành vi của hệ thống thực (khách).

Mô phỏng đề cập đến khả năng của một chương trình máy tính trong một thiết bị điện tử để mô phỏng (bắt chước) một chương trình hoặc thiết bị khác. Mô phỏng tập trung vào việc tạo lại một môi trường máy tính ban đầu. Trình giả lập có khả năng duy trì kết nối chặt chẽ hơn với tính xác thực của đối tượng kỹ thuật số. Trình giả lập giúp người dùng làm việc trên bất kỳ loại ứng dụng hoặc hệ điều hành nào trên nền tảng theo cách tương tự như phần mềm chạy như trong môi trường gốc của nó.

Thiết bị ngoại vi trong hệ thống nhúng

Hệ thống nhúng giao tiếp với thế giới bên ngoài thông qua thiết bị ngoại vi của chúng, chẳng hạn như sau & phút;

  • Giao diện truyền thông nối tiếp (SCI) như RS-232, RS-422, RS-485, v.v.
  • Giao diện truyền thông nối tiếp đồng bộ như I2C, SPI, SSC và ESSI
  • Bus nối tiếp đa năng (USB)
  • Đa phương tiện (Thẻ SD, Đèn flash nhỏ gọn, v.v.)
  • Các mạng như Ethernet, LonWorks, v.v.
  • Các bus trường như CAN-Bus, LIN-Bus, PROFIBUS, v.v.
  • imers như PLL (s), Capture / Compare và Time Processing Unit.
  • IO rời rạc hay còn gọi là Đầu vào / Đầu ra Mục đích Chung (GPIO)
  • Tương tự sang kỹ thuật số / Kỹ thuật số sang tương tự (ADC / DAC)
  • Gỡ lỗi như các cổng JTAG, ISP, ICSP, BDM Port, BITP và DP9

Tiêu chí chọn bộ vi điều khiển

Trong khi chọn một bộ vi điều khiển, hãy đảm bảo rằng nó đáp ứng được nhiệm vụ trong tầm tay và tiết kiệm chi phí. Chúng ta phải xem liệu vi điều khiển 8 bit, 16 bit hay 32 bit có thể xử lý tốt nhất các nhu cầu tính toán của một tác vụ hay không. Ngoài ra, cần lưu ý những điểm sau khi chọn vi điều khiển:

  • Speed - Tốc độ cao nhất mà vi điều khiển có thể hỗ trợ là bao nhiêu?

  • Packaging- Đó là DIP 40 chân (Gói kép nội tuyến) hay QFP (Gói bốn phẳng)? Điều này quan trọng về mặt bằng, lắp ráp và tạo mẫu cho sản phẩm cuối cùng.

  • Power Consumption - Đây là tiêu chí quan trọng đối với các sản phẩm chạy bằng pin.

  • Amount of RAM and ROM trên chip.

  • Count of I/O pins and Timers trên chip.

  • Cost per Unit - Điều này quan trọng về giá thành cuối cùng của sản phẩm mà bộ vi điều khiển sẽ được sử dụng.

Hơn nữa, hãy đảm bảo rằng bạn có các công cụ như trình biên dịch, trình gỡ lỗi và trình lắp ráp, có sẵn cùng với bộ vi điều khiển. Điều quan trọng nhất của tất cả, bạn nên mua một bộ vi điều khiển từ một nguồn đáng tin cậy.

Lược sử 8051

Bộ vi xử lý đầu tiên 4004 được phát minh bởi tập đoàn Intel. 80858086bộ vi xử lý cũng được phát minh bởi Intel. Năm 1981, Intel giới thiệu một bộ vi điều khiển 8-bit được gọi là8051. Nó được gọi làsystem on a chipbởi vì nó có 128 byte RAM, 4K byte ROM trên chip, hai bộ hẹn giờ, một cổng nối tiếp và 4 cổng (rộng 8 bit), tất cả đều nằm trên một con chip. Khi nó trở nên phổ biến rộng rãi, Intel đã cho phép các nhà sản xuất khác tạo ra và tiếp thị các phiên bản khác nhau của 8051 với mã của nó tương thích với 8051. Điều đó có nghĩa là nếu bạn viết chương trình của mình cho một phiên bản của 8051, nó cũng sẽ chạy trên các phiên bản khác, bất kể nhà chế tạo. Điều này đã dẫn đến một số phiên bản có tốc độ và số lượng RAM trên chip khác nhau.

8051 hương vị / thành viên

  • 8052 microcontroller- 8052 có tất cả các tính năng tiêu chuẩn của vi điều khiển 8051 cũng như có thêm 128 byte RAM và một bộ đếm thời gian bổ sung. Nó cũng có 8K byte ROM chương trình trên chip thay vì 4K byte.

  • 8031 microcontroller- Nó là một thành viên khác của họ 8051. Chip này thường được gọi là 8051 không có ROM, vì nó có 0K byte ROM trên chip. Bạn phải thêm ROM bên ngoài vào nó để sử dụng nó, ROM này chứa chương trình cần tìm nạp và thực thi. Chương trình này có thể lớn tới 64K byte. Nhưng trong quá trình thêm ROM ngoài cho 8031, nó bị mất 2 cổng trong số 4 cổng. Để giải quyết vấn đề này, chúng ta có thể thêm I / O bên ngoài vào 8031

So sánh giữa các thành viên gia đình 8051

Bảng sau đây so sánh các tính năng có sẵn trong 8051, 8052 và 8031.

Đặc tính 8051 8052 8031
ROM (byte) 4K 8 nghìn 0 nghìn
RAM (byte) 128 256 128
Bộ hẹn giờ 2 3 2
Chân I / O 32 32 32
Cổng nối tiếp 1 1 1
Nguồn gián đoạn 6 số 8 6

Các tính năng của Vi điều khiển 8051

Một bộ vi điều khiển 8051 đi kèm với các tính năng sau:

  • 4KB byte bộ nhớ chương trình trên chip (ROM)
  • 128 byte bộ nhớ dữ liệu trên chip (RAM)
  • Bốn ngân hàng đăng ký
  • 128 cờ phần mềm do người dùng xác định
  • Xe buýt dữ liệu hai chiều 8 bit
  • Xe buýt địa chỉ một chiều 16 bit
  • 32 thanh ghi mục đích chung, mỗi thanh ghi 8 bit
  • Bộ hẹn giờ 16 bit (thường là 2, nhưng có thể có nhiều hơn hoặc ít hơn)
  • Ba ngắt bên trong và hai bên ngoài
  • Bốn cổng 8 bit, (mô hình ngắn có hai cổng 8 bit)
  • Bộ đếm chương trình 16 bit và con trỏ dữ liệu
  • 8051 cũng có thể có một số tính năng đặc biệt như UART, ADC, Op-amp, v.v.

Sơ đồ khối của Vi điều khiển 8051

Hình minh họa sau đây cho thấy sơ đồ khối của vi điều khiển 8051:

Trong 8051, các hoạt động I / O được thực hiện bằng bốn cổng và 40 chân. Sơ đồ chân sau cho thấy chi tiết của 40 chân. Cổng hoạt động I / O dự trữ 32 chân trong đó mỗi cổng có 8 chân. 8 chân khác được chỉ định là V cc , GND, XTAL1, XTAL2, RST, EA (thanh), ALE / PROG (thanh) và PSEN (thanh).

Nó là một PDIP 40 Pin (Gói nội tuyến kép bằng nhựa)

Note- Trong gói DIP, bạn có thể nhận ra chân đầu tiên và chân cuối cùng bằng vết cắt ở giữa IC. Ghim đầu tiên ở bên trái của dấu cắt này và ghim cuối cùng (tức là ghim thứ 40 trong trường hợp này) ở bên phải của dấu cắt.

Cổng I / O và chức năng của chúng

Bốn cổng P0, P1, P2 và P3, mỗi cổng sử dụng 8 chân, tạo thành cổng 8 bit. Sau khi ĐẶT LẠI, tất cả các cổng được cấu hình làm đầu vào, sẵn sàng được sử dụng làm cổng đầu vào. Khi số 0 đầu tiên được ghi vào một cổng, nó sẽ trở thành đầu ra. Để cấu hình lại nó làm đầu vào, 1 phải được gửi đến một cổng.

Cổng 0 (Chân số 32 - Chân số 39)

Nó có 8 chân (32 đến 39). Nó có thể được sử dụng cho đầu vào hoặc đầu ra. Không giống như các cổng P1, P2 và P3, chúng tôi thường kết nối P0 với điện trở kéo lên 10K-ohm để sử dụng nó làm cổng đầu vào hoặc cổng đầu ra là một cống mở.

Nó cũng được chỉ định là AD0-AD7, cho phép nó được sử dụng làm địa chỉ và dữ liệu. Trong trường hợp của 8031 ​​(tức là Chip không có ROM), khi chúng ta cần truy cập ROM bên ngoài, thì P0 sẽ được sử dụng cho cả Address và Data Bus. ALE (Chân số 31) cho biết P0 có địa chỉ hoặc dữ liệu hay không. Khi ALE = 0, nó cung cấp dữ liệu D0-D7, nhưng khi ALE = 1, nó có địa chỉ A0-A7. Trong trường hợp không có kết nối bộ nhớ ngoài, P0 phải được kết nối bên ngoài với điện trở kéo lên 10K-ohm.

MOV A,#0FFH  ;(comments: A=FFH(Hexadecimal  i.e. A=1111 1111)  

MOV P0,A     ;(Port0 have 1's on every pin so that it works as Input)

Cổng 1 (Chân 1 đến 8)

Nó là một cổng 8 bit (chân 1 đến 8) và có thể được sử dụng làm đầu vào hoặc đầu ra. Nó không yêu cầu điện trở kéo lên vì chúng đã được kết nối bên trong. Sau khi đặt lại, Cổng 1 được định cấu hình làm cổng đầu vào. Mã sau có thể được sử dụng để gửi các giá trị xen kẽ của 55H và AAH đến Cổng 1.

;Toggle all bits of continuously 
MOV     A,#55 
BACK:    

MOV     P2,A 
ACALL   DELAY 
CPL     A      ;complement(invert) reg. A 
SJMP    BACK

Nếu Cổng 1 được cấu hình để sử dụng làm cổng đầu ra, thì để sử dụng lại làm cổng đầu vào, hãy lập trình nó bằng cách ghi 1 vào tất cả các bit của nó như trong đoạn mã sau.

;Toggle all bits of continuously 

MOV     A ,#0FFH    ;A = FF hex 
MOV     P1,A        ;Make P1 an input port                     
MOV     A,P1        ;get data from P1 
MOV     R7,A        ;save it in Reg R7 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R6,A        ;save it in R6 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R5,A        ;save it in R5

Cổng 2 (Chân 21 đến 28)

Cổng 2 chiếm tổng cộng 8 chân (chân 21 đến 28) và có thể được sử dụng cho cả hoạt động đầu vào và đầu ra. Cũng giống như P1 (Cổng 1), P2 cũng không yêu cầu điện trở Pull-up bên ngoài vì chúng đã được kết nối bên trong. Nó phải được sử dụng cùng với P0 để cung cấp địa chỉ 16 bit cho bộ nhớ ngoài. Vì vậy, nó cũng được ký hiệu là (A0 – A7), như thể hiện trong sơ đồ chân. Khi 8051 được kết nối với bộ nhớ ngoài, nó sẽ cung cấp đường dẫn cho địa chỉ 16 bit 8 bit phía trên, và nó không thể được sử dụng làm I / O. Sau khi đặt lại, Cổng 2 được cấu hình làm cổng đầu vào. Mã sau có thể được sử dụng để gửi các giá trị xen kẽ của 55H và AAH đến cổng 2.

;Toggle all bits of continuously 
MOV     A,#55 
BACK: 
MOV     P2,A 
ACALL   DELAY 
CPL     A         ; complement(invert) reg. A 
SJMP    BACK

Nếu Cổng 2 được cấu hình để sử dụng làm cổng đầu ra, thì để sử dụng lại làm cổng đầu vào, hãy lập trình nó bằng cách ghi 1 vào tất cả các bit của nó như trong đoạn mã sau.

;Get a byte from P2 and send it to P1 
MOV    A,#0FFH    ;A = FF hex 
MOV    P2,A       ;make P2 an input port 
BACK: 
MOV    A,P2       ;get data from P2 
MOV    P1,A       ;send it to Port 1
SJMP   BACK       ;keep doing that

Cổng 3 (Chân 10 đến 17)

Nó cũng có 8 bit và có thể được sử dụng làm Đầu vào / Đầu ra. Cổng này cung cấp một số tín hiệu cực kỳ quan trọng. P3.0 và P3.1 lần lượt là RxD (Máy thu) và TxD (Máy phát) và được sử dụng chung cho Giao tiếp nối tiếp. Các chân P3.2 và P3.3 được sử dụng cho các ngắt bên ngoài. P3.4 và P3.5 lần lượt được sử dụng cho bộ định thời T0 và T1. P3.6 và P3.7 là các chân Ghi (WR) và Đọc (RD). Đây là các chân thấp đang hoạt động, có nghĩa là chúng sẽ hoạt động khi 0 được cấp cho chúng và chúng được sử dụng để cung cấp các hoạt động Đọc và Ghi cho ROM bên ngoài trong các hệ thống dựa trên 8031.

P3 Bit Chức năng Ghim
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < Bổ sung INT0 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < Bổ sung RD 17

Vai trò kép của Cổng 0 và Cổng 2

  • Dual role of Port 0- Cổng 0 cũng được chỉ định là AD0 – AD7, vì nó có thể được sử dụng cho cả dữ liệu và xử lý địa chỉ. Trong khi kết nối 8051 với bộ nhớ ngoài, Cổng 0 có thể cung cấp cả địa chỉ và dữ liệu. Sau đó, bộ vi điều khiển 8051 sẽ ghép đầu vào dưới dạng địa chỉ hoặc dữ liệu để lưu các chân.

  • Dual role of Port 2- Bên cạnh hoạt động như I / O, Cổng P2 cũng được sử dụng để cung cấp bus địa chỉ 16 bit cho bộ nhớ ngoài cùng với Cổng 0. Cổng P2 cũng được chỉ định là (A8– A15), trong khi Cổng 0 cung cấp 8 bit thấp hơn qua A0 – A7. Nói cách khác, chúng ta có thể nói rằng khi 8051 được kết nối với bộ nhớ ngoài (ROM) có thể lên đến tối đa 64KB và điều này có thể xảy ra bởi bus địa chỉ 16 bit vì chúng ta biết 216 = 64KB. Port2 được sử dụng cho 8 bit phía trên của địa chỉ 16 bit và nó không thể được sử dụng cho I / O và đây là cách mà bất kỳ mã Chương trình nào của ROM bên ngoài được giải quyết.

Kết nối phần cứng của các chân

  • Vcc - Chân 40 cung cấp nguồn cung cấp cho Chip và nó là +5 V.

  • Gnd - Chân 20 cung cấp mặt đất cho Tham chiếu.

  • XTAL1, XTAL2 (Pin no 18 & Pin no 19)- 8051 có bộ dao động trên chip nhưng yêu cầu xung nhịp bên ngoài để chạy nó. Một tinh thể thạch anh được kết nối giữa chân XTAL1 & XTAL2 của chip. Tinh thể này cũng cần hai tụ điện 30pF để tạo ra tín hiệu có tần số mong muốn. Một mặt của mỗi tụ điện được nối với đất. IC 8051 có nhiều tốc độ khác nhau và tất cả phụ thuộc vào tinh thể Thạch anh này, ví dụ, vi điều khiển 20 MHz yêu cầu một tinh thể có tần số không quá 20 MHz.

  • RST (Pin No. 9)- Là chân Input và chân High hoạt động. Khi áp dụng một xung cao trên chân này, tức là 1, bộ vi điều khiển sẽ đặt lại và chấm dứt mọi hoạt động. Quá trình này được gọi làPower-On Reset. Kích hoạt thiết lập lại khi bật nguồn sẽ làm mất tất cả các giá trị trong thanh ghi. Nó sẽ đặt bộ đếm chương trình thành tất cả các số 0. Để đảm bảo đầu vào hợp lệ của Reset, xung cao phải cao trong tối thiểu hai chu kỳ máy trước khi được phép xuống thấp, điều này phụ thuộc vào giá trị tụ điện và tốc độ nó sạc. (Machine Cycle là lượng tần số tối thiểu mà một lệnh đơn yêu cầu khi thực thi).

  • EA or External Access (Pin No. 31)- Nó là một chân đầu vào. Chân này là chân thấp hoạt động; khi áp dụng một xung thấp, nó sẽ được kích hoạt. Trong trường hợp vi điều khiển (8051/52) có ROM trên chip, chân EA (thanh) được kết nối với V cc . Nhưng trong vi điều khiển 8031 ​​không có ROM trên chip, mã được lưu trữ trong ROM bên ngoài và sau đó được tìm nạp bởi vi điều khiển. Trong trường hợp này, chúng ta phải kết nối EA (chân số 31) với Gnd để chỉ ra rằng mã chương trình được lưu trữ bên ngoài.

  • PSEN or Program store Enable (Pin No 29)- Đây cũng là một chân thấp hoạt động, tức là nó được kích hoạt sau khi áp dụng một xung thấp. Nó là một chân đầu ra và được sử dụng cùng với chân EA trong Hệ thống dựa trên 8031 ​​(tức là ROMLESS) để cho phép lưu trữ mã chương trình trong ROM bên ngoài.

  • ALE or (Address Latch Enable)- Đây là một Chân đầu ra và đang hoạt động ở mức cao. Nó đặc biệt được sử dụng cho 8031 ​​IC để kết nối nó với bộ nhớ ngoài. Nó có thể được sử dụng trong khi quyết định xem các chân P0 sẽ được sử dụng làm Bus địa chỉ hay Bus dữ liệu. Khi ALE = 1, các chân P0 hoạt động như Bus dữ liệu và khi ALE = 0, thì các chân P0 hoạt động như Bus địa chỉ.

Cổng I / O và khả năng định địa chỉ bit

Nó là một tính năng được sử dụng rộng rãi nhất của 8051 trong khi viết mã cho 8051. Đôi khi chúng ta chỉ cần truy cập 1 hoặc 2 bit của cổng thay vì toàn bộ 8 bit. 8051 cung cấp khả năng truy cập các bit riêng lẻ của các cổng.

Trong khi truy cập một cổng theo cách một bit, chúng tôi sử dụng cú pháp "SETB X. Y" trong đó X là số cổng (0 đến 3) và Y là một số bit (0 đến 7) cho các bit dữ liệu D0-D7 trong đó D0 là LSB và D7 là MSB. Ví dụ, "SETB P1.5" đặt bit cao 5 của cổng 1.

Đoạn mã sau đây cho thấy cách chúng ta có thể chuyển đổi bit P1.2 liên tục.

AGAIN: 
SETB    P1.2
ACALL   DELAY    
CLR     P1.2      
ACALL   DELAY 
SJMP    AGAIN

Hướng dẫn một bit

Hướng dẫn Chức năng
Bit SETB Đặt bit (bit = 1)
Bit CLR xóa bit (bit = 0)
Bit CPL bổ sung cho bit (bit = NOT bit)
JB bit, mục tiêu nhảy đến mục tiêu nếu bit = 1 (nhảy nếu bit)
JNB bit, mục tiêu nhảy đến mục tiêu nếu bit = 0 (nhảy nếu không có bit)
JBC bit, mục tiêu nhảy đến mục tiêu nếu bit = 1, xóa bit (nhảy nếu bit, sau đó xóa)

Bộ đếm chương trình

Bộ đếm chương trình là một thanh ghi 16 hoặc 32 bit chứa địa chỉ của lệnh tiếp theo sẽ được thực thi. PC tự động tăng đến vị trí bộ nhớ tuần tự tiếp theo mỗi khi một lệnh được tìm nạp. Các hoạt động rẽ nhánh, bước nhảy và ngắt tải Bộ đếm chương trình có địa chỉ khác với vị trí tuần tự tiếp theo.

Kích hoạt thiết lập lại khi bật nguồn sẽ làm mất tất cả các giá trị trong thanh ghi. Nó có nghĩa là giá trị của PC (bộ đếm chương trình) là 0 khi đặt lại, buộc CPU phải tìm nạp opcode đầu tiên từ vị trí bộ nhớ ROM 0000. Có nghĩa là chúng ta phải đặt byte đầu tiên của mã upcode vào vị trí ROM 0000 vì đó là nơi CPU mong đợi tìm thấy lệnh đầu tiên

Đặt lại vectơ

Ý nghĩa của vectơ đặt lại là nó trỏ bộ xử lý đến địa chỉ bộ nhớ chứa lệnh đầu tiên của phần sụn. Nếu không có Véc tơ đặt lại, bộ xử lý sẽ không biết bắt đầu thực thi ở đâu. Sau khi đặt lại, bộ xử lý tải Bộ đếm chương trình (PC) với giá trị vectơ đặt lại từ vị trí bộ nhớ được xác định trước. Trên kiến ​​trúc CPU08, đây là vị trí$FFFE:$FFFF.

Khi vector đặt lại là không cần thiết, các nhà phát triển thường coi nó là điều hiển nhiên và không lập trình vào hình ảnh cuối cùng. Do đó, bộ xử lý không khởi động trên sản phẩm cuối cùng. Đó là một lỗi phổ biến diễn ra trong giai đoạn gỡ lỗi.

Con trỏ ngăn xếp

Ngăn xếp được thực hiện trong RAM và một thanh ghi CPU được sử dụng để truy cập nó được gọi là thanh ghi SP (Stack Pointer). Thanh ghi SP là một thanh ghi 8 bit và có thể đánh địa chỉ bộ nhớ có phạm vi từ 00h đến FFh. Ban đầu, thanh ghi SP chứa giá trị 07 để trỏ đến vị trí 08 là vị trí đầu tiên được 8051 sử dụng cho ngăn xếp.

Khi nội dung của thanh ghi CPU được lưu trữ trong ngăn xếp, nó được gọi là hoạt động PUSH. Khi nội dung của ngăn xếp được lưu trữ trong thanh ghi CPU, nó được gọi là hoạt động POP. Nói cách khác, một thanh ghi được đẩy vào ngăn xếp để lưu nó và bật ra khỏi ngăn xếp để lấy nó.

Vòng lặp vô hạn

Một vòng lặp vô hạn hoặc một vòng lặp vô tận có thể được xác định là một chuỗi các lệnh trong chương trình máy tính thực thi liên tục trong một vòng lặp, vì những lý do sau:

  • vòng lặp không có điều kiện kết thúc.
  • vòng lặp với một điều kiện kết thúc mà không bao giờ có thể được đáp ứng.
  • vòng lặp với điều kiện kết thúc khiến vòng lặp bắt đầu lại.

Các vòng lặp vô hạn như vậy thường khiến các hệ điều hành cũ trở nên không phản hồi, vì vòng lặp vô hạn tiêu tốn tất cả thời gian có sẵn của bộ xử lý. Các hoạt động I / O chờ đợi đầu vào của người dùng còn được gọi là "vòng lặp vô hạn". Một nguyên nhân có thể khiến máy tính "đóng băng" là một vòng lặp vô hạn; các nguyên nhân khác bao gồmdeadlockaccess violations.

Hệ thống nhúng, không giống như PC, không bao giờ "thoát" khỏi một ứng dụng. Họ nhàn rỗi thông qua Vòng lặp vô hạn chờ đợi một sự kiện diễn ra dưới dạng ngắt hoặcpre-scheduled task. Để tiết kiệm năng lượng, một số bộ xử lý nhập đặc biệtsleep hoặc là wait modes thay vì chạy không tải qua Vòng lặp vô hạn, nhưng chúng sẽ thoát ra khỏi chế độ này khi có bộ hẹn giờ hoặc Ngắt bên ngoài.

Ngắt

Ngắt hầu hết là các cơ chế phần cứng hướng dẫn chương trình rằng một sự kiện đã xảy ra. Chúng có thể xảy ra bất cứ lúc nào và do đó không đồng bộ với dòng chương trình. Chúng yêu cầu bộ xử lý xử lý đặc biệt và cuối cùng được xử lý bởi một Quy trình Dịch vụ Ngắt tương ứng (ISR). Các ngắt cần được xử lý nhanh chóng. Nếu bạn mất quá nhiều thời gian để sửa chữa một ngắt, thì bạn có thể bỏ lỡ một ngắt khác.

Ít endian vs lớn endian

Mặc dù các số luôn được hiển thị theo cùng một cách, nhưng chúng không được lưu trữ theo cùng một cách trong bộ nhớ. Máy Big-Endian lưu trữ byte dữ liệu quan trọng nhất trong địa chỉ bộ nhớ thấp nhất. Một cửa hàng máy Big-Endian 0x12345678 như -

ADD+0: 0x12 
ADD+1: 0x34 
ADD+2: 0x56 
ADD+3: 0x78

Mặt khác, máy Little-Endian lưu trữ byte dữ liệu ít quan trọng nhất trong địa chỉ bộ nhớ thấp nhất. Cửa hàng máy A Little-Endian 0x12345678 dưới dạng -

ADD+0: 0x78 
ADD+1: 0x56 
ADD+2: 0x34 
ADD+3: 0x12

Hợp ngữ được phát triển để cung cấp mnemonicshoặc các ký hiệu cho hướng dẫn mã cấp máy. Các chương trình hợp ngữ bao gồm các kỹ năng ghi nhớ, do đó chúng phải được dịch sang mã máy. Một chương trình chịu trách nhiệm cho việc chuyển đổi này được gọi làassembler. Hợp ngữ thường được gọi là ngôn ngữ cấp thấp vì nó hoạt động trực tiếp với cấu trúc bên trong của CPU. Để lập trình bằng hợp ngữ, một lập trình viên phải biết tất cả các thanh ghi của CPU.

Các ngôn ngữ lập trình khác nhau như C, C ++, Java và nhiều ngôn ngữ khác được gọi là ngôn ngữ cấp cao vì chúng không xử lý các chi tiết bên trong của CPU. Ngược lại, một trình hợp dịch được sử dụng để dịch một chương trình hợp ngữ thành mã máy (đôi khi còn được gọi làobject code hoặc là opcode). Tương tự, một trình biên dịch dịch một ngôn ngữ cấp cao thành mã máy. Ví dụ, để viết một chương trình bằng ngôn ngữ C, người ta phải sử dụng trình biên dịch C để dịch chương trình sang ngôn ngữ máy.

Cấu trúc của hợp ngữ

Một chương trình hợp ngữ là một loạt các câu lệnh, là các lệnh hợp ngữ như ADD và MOV, hoặc các câu lệnh được gọi là directives.

An instruction cho CPU biết phải làm gì, trong khi directive (còn được gọi là pseudo-instructions) cung cấp hướng dẫn cho trình hợp dịch. Ví dụ, các lệnh ADD và MOV là các lệnh mà CPU chạy, trong khi ORG và END là các lệnh của trình hợp dịch. Trình hợp dịch đặt opcode vào vị trí bộ nhớ 0 khi chỉ thị ORG được sử dụng, trong khi END chỉ ra phần cuối của mã nguồn. Một chỉ dẫn ngôn ngữ chương trình bao gồm bốn trường sau:

[ label: ]   mnemonics  [ operands ]   [;comment ]

Dấu ngoặc vuông ([]) cho biết rằng trường là tùy chọn.

  • Các label fieldcho phép chương trình tham chiếu đến một dòng mã theo tên. Các trường nhãn không được vượt quá một số ký tự nhất định.

  • Các mnemonicsoperands fieldscùng nhau thực hiện các công việc thực của chương trình và hoàn thành các nhiệm vụ. Các câu lệnh như ADD A, C & MOV C, # 68 trong đó ADD và MOV là thuật ngữ ghi nhớ, tạo ra mã quang; "A, C" và "C, # 68" là các toán hạng. Hai trường này có thể chứa các chỉ thị. Các lệnh không tạo ra mã máy và chỉ được sử dụng bởi trình lắp ráp, trong khi các lệnh được dịch thành mã máy để CPU thực thi.

1.0000         ORG  0H            ;start (origin) at location 0 
2 0000 7D25    MOV  R5,#25H       ;load 25H into R5 
3.0002 7F34    MOV  R7,#34H       ;load 34H into  R7 
4.0004 7400    MOV  A,#0          ;load 0 into A 
5.0006 2D      ADD  A,R5          ;add contents of R5 to A 
6.0007 2F      ADD  A,R7          ;add contents of R7 to A
7.0008 2412    ADD  A,#12H        ;add to A value 12 H 
8.000A 80FE    HERE: SJMP HERE    ;stay in this loop 
9.000C END                        ;end of asm source file
  • Các comment field bắt đầu bằng dấu chấm phẩy là chỉ báo nhận xét.

  • Lưu ý Nhãn "TẠI ĐÂY" trong chương trình. Bất kỳ nhãn nào đề cập đến một chỉ dẫn phải được theo sau bởi dấu hai chấm.

Lắp ráp và chạy chương trình 8051

Ở đây chúng ta sẽ thảo luận về dạng cơ bản của một hợp ngữ. Các bước để tạo, lắp ráp và chạy một chương trình hợp ngữ như sau:

  • Đầu tiên, chúng ta sử dụng một trình soạn thảo để gõ một chương trình tương tự như chương trình trên. Các trình soạn thảo như chương trình MS-DOS EDIT đi kèm với tất cả các hệ điều hành của Microsoft có thể được sử dụng để tạo hoặc chỉnh sửa chương trình. Trình chỉnh sửa phải có khả năng tạo tệp ASCII. Phần mở rộng "asm" cho tệp nguồn được trình hợp dịch sử dụng trong bước tiếp theo.

  • Tệp nguồn "asm" chứa mã chương trình được tạo ở Bước 1. Nó được cung cấp cho trình hợp dịch 8051. Sau đó, trình hợp dịch chuyển đổi các hướng dẫn của hợp ngữ thành các lệnh mã máy và tạo ra một.obj file (tệp đối tượng) và một .lst file(tệp danh sách). Nó cũng được gọi làsource file, đó là lý do tại sao một số trình lắp ráp yêu cầu tệp này phải có phần mở rộng "src". Tệp "lst" là tùy chọn. Nó rất hữu ích cho chương trình vì nó liệt kê tất cả các mã quang và địa chỉ cũng như các lỗi mà người lắp ráp đã phát hiện.

  • Người lắp ráp yêu cầu bước thứ ba được gọi là linking. Chương trình liên kết nhận một hoặc nhiều tệp đối tượng và tạo ra tệp đối tượng tuyệt đối có phần mở rộng là "abs".

  • Tiếp theo, tệp "abs" được đưa vào một chương trình có tên "OH" (bộ chuyển đổi đối tượng sang hệ hex), chương trình này sẽ tạo ra một tệp có phần mở rộng là "hex" sẵn sàng để ghi vào ROM.

Loại dữ liệu

Bộ vi điều khiển 8051 chứa một kiểu dữ liệu duy nhất là 8-bit và mỗi thanh ghi cũng có kích thước 8-bit. Lập trình viên phải chia nhỏ dữ liệu lớn hơn 8-bit (00 đến FFH, hoặc 255 ở dạng thập phân) để CPU có thể xử lý.

DB (Xác định Byte)

Chỉ thị DB là chỉ thị dữ liệu được sử dụng rộng rãi nhất trong trình hợp dịch. Nó được sử dụng để xác định dữ liệu 8-bit. Nó cũng có thể được sử dụng để xác định dữ liệu định dạng thập phân, nhị phân, hex hoặc ASCII. Đối với số thập phân, "D" sau số thập phân là tùy chọn, nhưng nó là bắt buộc đối với "B" (nhị phân) và "Hl" (thập lục phân).

Để chỉ ra ASCII, chỉ cần đặt các ký tự trong dấu ngoặc kép ('như thế này'). Trình hợp dịch tự động tạo mã ASCII cho các số / ký tự. Chỉ thị DB là chỉ thị duy nhất có thể được sử dụng để xác định chuỗi ASCII lớn hơn hai ký tự; do đó, nó nên được sử dụng cho tất cả các định nghĩa dữ liệu ASCII. Một số ví dụ về DB được đưa ra dưới đây:

ORG  500H 
DATA1:  DB   28                     ;DECIMAL (1C in hex) 
DATA2:  DB   00110101B              ;BINARY  (35 in hex) 
DATA3:  DB   39H                    ;HEX 
        ORG  510H 
DATA4:  DB   "2591"                 ;ASCII  NUMBERS 
        ORG  520H                         
DATA6:  DA   "MY NAME IS Michael"   ;ASCII CHARACTERS

Có thể sử dụng dấu ngoặc kép đơn hoặc dấu ngoặc kép xung quanh chuỗi ASCII. DB cũng được sử dụng để cấp phát bộ nhớ trong các phần có kích thước byte.

Chỉ thị Assembler

Một số chỉ thị của 8051 như sau:

  • ORG (origin)- Chỉ thị gốc được sử dụng để chỉ ra phần đầu của địa chỉ. Nó lấy các số ở định dạng hexa hoặc thập phân. Nếu H được cung cấp sau số, số được coi là hexa, ngược lại là số thập phân. Trình hợp dịch chuyển đổi số thập phân thành hexa.

  • EQU (equate)- Nó được sử dụng để xác định một hằng số mà không chiếm vị trí bộ nhớ. EQU liên kết một giá trị không đổi với một nhãn dữ liệu để nhãn xuất hiện trong chương trình, giá trị không đổi của nó sẽ được thay thế cho nhãn. Trong khi thực hiện lệnh "MOV R3, #COUNT", thanh ghi R3 sẽ được tải với giá trị 25 (chú ý dấu #). Ưu điểm của việc sử dụng EQU là lập trình viên có thể thay đổi nó một lần và trình hợp dịch sẽ thay đổi tất cả các lần xuất hiện của nó; người lập trình không phải tìm kiếm toàn bộ chương trình.

  • END directive- Nó cho biết phần cuối của tệp nguồn (asm). Lệnh END là dòng cuối cùng của chương trình; bất cứ thứ gì sau lệnh END đều bị trình hợp ngữ bỏ qua.

Nhãn bằng ngôn ngữ hợp ngữ

Tất cả các nhãn trong hợp ngữ phải tuân theo các quy tắc được đưa ra dưới đây:

  • Mỗi tên nhãn phải là duy nhất. Tên được sử dụng cho các nhãn trong lập trình hợp ngữ bao gồm các chữ cái trong bảng chữ cái cả viết hoa và viết thường, số từ 0 đến 9 và các ký tự đặc biệt như dấu hỏi (?), Dấu chấm (.), Với tỷ lệ @, dấu gạch dưới (_), và đô la ($).

  • Ký tự đầu tiên phải là ký tự trong bảng chữ cái; nó không thể là một con số.

  • Các từ dành riêng không thể được sử dụng làm nhãn trong chương trình. Ví dụ, các từ ADD và MOV là các từ dành riêng, vì chúng là các phép ghi nhớ hướng dẫn.

Các thanh ghi được sử dụng trong CPU để lưu trữ thông tin tạm thời có thể là dữ liệu được xử lý hoặc địa chỉ trỏ đến dữ liệu sẽ được tìm nạp. Trong 8051, có một kiểu dữ liệu là 8 bit, từ MSB (bit quan trọng nhất) D7 đến LSB (bit quan trọng nhất) D0. Với kiểu dữ liệu 8 bit, bất kỳ kiểu dữ liệu nào lớn hơn 8 bit phải được chia thành các phần 8 bit trước khi nó được xử lý.

Các thanh ghi được sử dụng rộng rãi nhất của 8051 là A (bộ tích lũy), B, R0-R7, DPTR (con trỏ dữ liệu) và PC (bộ đếm chương trình). Tất cả các thanh ghi này là 8-bit, ngoại trừ DPTR và PC.

Thanh ghi lưu trữ trong 8051

Chúng ta sẽ thảo luận về các loại thanh ghi lưu trữ sau đây:

  • Accumulator
  • R đăng ký
  • B đăng ký
  • Con trỏ dữ liệu (DPTR)
  • Bộ đếm chương trình (PC)
  • Con trỏ ngăn xếp (SP)

Tích lũy

Bộ tích lũy, thanh ghi A, được sử dụng cho tất cả các phép toán số học và logic. Nếu bộ tích lũy không có mặt, thì mọi kết quả của mỗi phép tính (cộng, nhân, dịch, v.v.) sẽ được lưu vào bộ nhớ chính. Truy cập vào bộ nhớ chính chậm hơn so với truy cập vào một thanh ghi như bộ tích lũy vì công nghệ được sử dụng cho bộ nhớ chính lớn chậm hơn (nhưng rẻ hơn) so với công nghệ được sử dụng cho một thanh ghi.

Thanh ghi "R"

Các thanh ghi "R" là một tập hợp tám thanh ghi, cụ thể là, R0, R1 đến R7. Các thanh ghi này có chức năng như các thanh ghi phụ trợ hoặc lưu trữ tạm thời trong nhiều hoạt động. Hãy xem xét một ví dụ về tổng của 10 và 20. Lưu trữ một biến 10 trong bộ tích lũy và một biến khác 20 trong thanh ghi R4. Để xử lý thao tác thêm, hãy thực hiện lệnh sau:

ADD A,R4

Sau khi thực hiện lệnh này, bộ tích lũy sẽ chứa giá trị 30. Vì vậy, các thanh ghi "R" là phụ trợ rất quan trọng hoặc helper registers. Chỉ riêng Accumulator sẽ không hữu ích lắm nếu nó không có các thanh ghi "R" này. Thanh ghi "R" được dùng để lưu trữ tạm thời các giá trị.

Hãy để chúng tôi lấy một ví dụ khác. Chúng tôi sẽ cộng các giá trị trong R1 và R2 với nhau và sau đó trừ các giá trị của R3 và R4 khỏi kết quả.

MOV A,R3   ;Move the value of R3 into the accumulator 
ADD A,R4   ;Add the value of R4 
MOV R5,A   ;Store the resulting value temporarily in R5 
MOV A,R1   ;Move the value of R1 into the accumulator 
ADD A,R2   ;Add the value of R2 
SUBB A,R5  ;Subtract the value of R5 (which now contains R3 + R4)

Như bạn thấy, chúng tôi đã sử dụng R5 để tạm thời giữ tổng của R3 và R4. Tất nhiên, đây không phải là cách hiệu quả nhất để tính toán (R1 + R2) - (R3 + R4), nhưng nó minh họa việc sử dụng các thanh ghi "R" như một cách để lưu trữ các giá trị tạm thời.

Đăng ký "B"

Thanh ghi "B" rất giống với Accumulator theo nghĩa nó có thể giữ giá trị 8 bit (1 byte). Thanh ghi "B" chỉ được sử dụng bởi hai lệnh 8051:MUL ABDIV AB. Để nhân hoặc chia A với một số khác một cách nhanh chóng và dễ dàng, bạn có thể lưu số kia trong "B" và sử dụng hai hướng dẫn này. Ngoài việc sử dụng các lệnh MUL và DIV, thanh ghi "B" thường được sử dụng như một thanh ghi lưu trữ tạm thời khác, giống như thanh ghi R thứ chín.

Con trỏ dữ liệu

Con trỏ dữ liệu (DPTR) là thanh ghi 16 bit (2 byte) duy nhất mà người dùng có thể truy cập được của 8051. Các thanh ghi Accumulator, R0 – R7 và thanh ghi B là các thanh ghi giá trị 1 byte. DPTR được dùng để trỏ tới dữ liệu. Nó được 8051 sử dụng để truy cập bộ nhớ ngoài bằng địa chỉ được chỉ ra bởi DPTR. DPTR là thanh ghi 16 bit duy nhất có sẵn và thường được sử dụng để lưu trữ các giá trị 2 byte.

Quầy chương trình

Bộ đếm chương trình (PC) là một địa chỉ 2 byte cho 8051 biết nơi có thể tìm thấy lệnh tiếp theo để thực thi trong bộ nhớ. PC bắt đầu lúc 0000h khi 8051 khởi tạo và được tăng lên mỗi lần sau khi một lệnh được thực thi. PC không phải lúc nào cũng tăng 1. Một số hướng dẫn có thể yêu cầu 2 hoặc 3 byte; trong những trường hợp như vậy, PC sẽ được tăng thêm 2 hoặc 3.

Branch, jumpinterruptcác hoạt động tải Bộ đếm chương trình với một địa chỉ khác với vị trí tuần tự tiếp theo. Kích hoạt thiết lập lại khi bật nguồn sẽ làm mất tất cả các giá trị trong thanh ghi. Nó có nghĩa là giá trị của PC là 0 khi đặt lại, buộc CPU phải tìm nạp opcode đầu tiên từ vị trí ROM 0000. Điều đó có nghĩa là chúng ta phải đặt byte đầu tiên của mã upcode vào vị trí ROM 0000 vì đó là nơi CPU mong đợi để tìm thấy hướng dẫn đầu tiên.

Con trỏ ngăn xếp (SP)

Con trỏ ngăn xếp, giống như tất cả các thanh ghi ngoại trừ DPTR và PC, có thể giữ giá trị 8 bit (1 byte). Con trỏ ngăn xếp cho biết vị trí từ đó giá trị tiếp theo sẽ được xóa khỏi ngăn xếp. Khi một giá trị được đẩy vào ngăn xếp, giá trị của SP được tăng lên và sau đó giá trị được lưu trữ tại vị trí bộ nhớ kết quả. Khi một giá trị được bật ra khỏi ngăn xếp, giá trị được trả về từ vị trí bộ nhớ được chỉ ra bởi SP, và sau đó giá trị của SP sẽ giảm đi.

Thứ tự hoạt động này là quan trọng. SP sẽ được khởi tạo đến 07h khi 8051 được khởi tạo. Nếu một giá trị được đẩy vào ngăn xếp cùng một lúc, giá trị sẽ được lưu trữ trong địa chỉ RAM nội bộ 08h vì 8051 trước tiên sẽ tăng giá trị của SP (từ 07h đến 08h) và sau đó sẽ lưu giá trị được đẩy tại bộ nhớ đó. địa chỉ (08h). SP được 8051 sửa đổi trực tiếp bằng sáu lệnh: PUSH, POP, ACALL, LCALL, RET và RETI.

Không gian ROM trong 8051

Một số thành viên gia đình của 8051 chỉ có 4K byte ROM trên chip (ví dụ: 8751, AT8951); một số có ROM 8K như AT89C52, và có một số thành viên gia đình có 32K byte và 64K byte ROM trên chip như Dallas Semiconductor. Điểm cần nhớ là không thành viên nào của họ 8051 có thể truy cập nhiều hơn 64K byte opcode vì bộ đếm chương trình trong 8051 là một thanh ghi 16 bit (địa chỉ 0000 đến FFFF).

Vị trí đầu tiên của ROM chương trình bên trong 8051 có địa chỉ là 0000H, trong khi vị trí cuối cùng có thể khác nhau tùy thuộc vào kích thước của ROM trên chip. Trong số các thành viên họ 8051, AT8951 có $ k byte ROM trên chip có địa chỉ bộ nhớ từ 0000 (vị trí đầu tiên) đến 0FFFH (vị trí cuối cùng).

8051 Flag Bits và Thanh ghi PSW

Thanh ghi từ trạng thái chương trình (PSW) là thanh ghi 8-bit, còn được gọi là flag register. Nó có chiều rộng 8 bit nhưng chỉ có 6 bit của nó được sử dụng. Hai bit không sử dụng làuser-defined flags. Bốn trong số các lá cờ được gọi làconditional flags, có nghĩa là chúng chỉ ra một điều kiện dẫn đến sau khi một lệnh được thực thi. Bốn cái này làCY (Mang), AC (mang phụ), P (chẵn lẻ), và OV(tràn ra). Các bit RS0 và RS1 được sử dụng để thay đổi các thanh ghi ngân hàng. Hình dưới đây cho thấy thanh ghi trạng thái từ chương trình.

Thanh ghi PSW chứa các bit trạng thái phản ánh trạng thái hiện tại của CPU.

C Y CA F0 RS1 RS0 OV - P

C Y PSW.7 Mang cờ
AC PSW.6 Cờ mang phụ trợ
F0 PSW.5 Cờ 0 có sẵn cho người dùng cho mục đích chung.
RS1 PSW.4 Đăng ký bộ chọn ngân hàng bit 1
RS0 PSW.3 Đăng ký bộ chọn ngân hàng bit 0
OV PSW.2 Cờ tràn
- PSW.1 CỜ người dùng định nghĩa
P PSW.0 CỜ chẵn lẻ. Đặt / xóa bởi phần cứng trong chu kỳ lệnh để chỉ ra số chẵn / lẻ của 1 bit trong bộ tích lũy.

Chúng ta có thể chọn bit Ngân hàng thanh ghi tương ứng bằng cách sử dụng bit RS0 và RS1.

RS1 RS2 Đăng ký ngân hàng Địa chỉ
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10 giờ-17 giờ
1 1 3 18H-1FH
  • CY, the carry flag- Cờ thực hiện này được đặt (1) bất cứ khi nào có thực hiện từ bit D7. Nó bị ảnh hưởng sau một phép toán cộng hoặc trừ 8 bit. Nó cũng có thể được đặt lại trực tiếp về 1 hoặc 0 bằng một lệnh như "SETB C" và "CLR C" trong đó "SETB" là viết tắt của set bit mang và "CLR" là viết tắt của clear carry.

  • AC, auxiliary carry flag- Nếu có một chuyển động từ D3 và D4 trong một hoạt động ADD hoặc SUB, bit AC được đặt; nếu không, nó được xóa. Nó được sử dụng cho lệnh thực hiện số học thập phân được mã hóa nhị phân.

  • P, the parity flag- Cờ chẵn lẻ chỉ đại diện cho số 1 trong thanh ghi bộ tích lũy. Nếu thanh ghi A chứa số lẻ của 1 thì P = 1; và đối với số chẵn của 1, P = 0.

  • OV, the overflow flag- Cờ này được đặt bất cứ khi nào kết quả của phép toán số có dấu quá lớn khiến bit bậc cao tràn vào bit dấu. Nó chỉ được sử dụng để phát hiện lỗi trong các phép toán số học có dấu.

Thí dụ

Hiển thị trạng thái của cờ CY, AC và P sau khi thêm 9CH và 64H trong hướng dẫn sau.

MOV A, # 9CH

THÊM A, # 64H

Solution:  9C   10011100 
          +64   01100100 
          100   00000000 
			 
CY = 1 since there is a carry beyond D7 bit  
AC = 0 since there is a carry from D3 to D4 
P  = 0 because the accumulator has even number of 1's

Bộ vi điều khiển 8051 có tổng cộng 128 byte RAM. Chúng ta sẽ thảo luận về việc phân bổ 128 byte RAM này và kiểm tra việc sử dụng chúng dưới dạng ngăn xếp và thanh ghi.

Phân bổ không gian bộ nhớ RAM trong 8051

128 byte RAM bên trong 8051 được gán địa chỉ 00 đến 7FH. Chúng có thể được truy cập trực tiếp dưới dạng vị trí bộ nhớ và được chia thành ba nhóm khác nhau như sau:

  • 32 byte từ các vị trí 00H đến 1FH được dành riêng cho các ngân hàng đăng ký và ngăn xếp.

  • 16 byte từ vị trí 20H đến 2FH được dành riêng cho bộ nhớ đọc / ghi địa chỉ bit.

  • 80 byte từ 30H đến 7FH vị trí được sử dụng để lưu trữ đọc và ghi; nó được gọi làscratch pad. 80 vị trí này RAM được sử dụng rộng rãi cho mục đích lưu trữ dữ liệu và các thông số bởi các lập trình viên 8051.

Đăng ký ngân hàng trong 8051

Tổng cộng 32 byte RAM được dành cho các ngân hàng thanh ghi và ngăn xếp. 32 byte này được chia thành bốn ngân hàng thanh ghi trong đó mỗi ngân hàng có 8 thanh ghi, R0 – R7. Vị trí RAM từ 0 đến 7 được dành cho ngân hàng 0 của R0 – R7 trong đó R0 là vị trí RAM 0, R1 là vị trí RAM 1, R2 là vị trí 2, v.v., cho đến vị trí bộ nhớ 7, thuộc R7 của ngân hàng 0.

Ngân hàng thứ hai của thanh ghi R0 – R7 bắt đầu tại vị trí RAM 08 và đi đến các vị trí OFH. Ngân hàng thứ ba của R0 – R7 bắt đầu tại vị trí bộ nhớ 10H và đi đến vị trí 17H. Cuối cùng, các vị trí RAM 18H đến 1FH được dành cho ngân hàng thứ tư của R0 – R7.

Ngân hàng Đăng ký Mặc định

Nếu các vị trí RAM 00–1F được dành riêng cho bốn ngân hàng thanh ghi, thì ngân hàng thanh ghi nào của R0 – R7 mà chúng ta có thể truy cập khi 8051 được cấp nguồn? Câu trả lời là đăng ký ngân hàng 0; nghĩa là, các vị trí RAM từ 0 đến 7 được truy cập với các tên R0 đến R7 khi lập trình 8051. Bởi vì việc tham chiếu các vị trí RAM này theo các tên như R0 đến R7, thay vì theo vị trí bộ nhớ của chúng sẽ dễ dàng hơn nhiều.

Cách chuyển đổi ngân hàng đăng ký

Ngân hàng đăng ký 0 là mặc định khi 8051 được cấp nguồn. Chúng tôi có thể chuyển sang các ngân hàng khác bằng cách sử dụng đăng ký PSW. Các bit D4 và D3 của PSW được sử dụng để chọn ngân hàng thanh ghi mong muốn, vì chúng có thể được truy cập bằng các lệnh định địa chỉ bit SETB và CLR. Ví dụ, "SETB PSW.3" sẽ đặt PSW.3 = 1 và chọn thanh ghi ngân hàng 1.

RS1 RS2 Ngân hàng đã chọn
0 0 Ngân hàng0
0 1 Ngân hàng1
1 0 Bank2
1 1 Ngân hàng3

Ngăn xếp và các hoạt động của nó

Ngăn xếp trong 8051

Ngăn xếp là một phần của RAM được CPU sử dụng để lưu trữ thông tin như dữ liệu hoặc địa chỉ bộ nhớ trên cơ sở tạm thời. CPU cần vùng lưu trữ này vì số lượng thanh ghi có hạn.

Cách các ngăn xếp được truy cập

Vì ngăn xếp là một phần của RAM nên có các thanh ghi bên trong CPU để trỏ tới nó. Thanh ghi được sử dụng để truy cập ngăn xếp được gọi là thanh ghi con trỏ ngăn xếp. Con trỏ ngăn xếp trong 8051 rộng 8 bit và nó có thể nhận giá trị từ 00 đến FFH. Khi 8051 được khởi tạo, thanh ghi SP chứa giá trị 07H. Điều này có nghĩa là vị trí RAM 08 là vị trí đầu tiên được sử dụng cho ngăn xếp. Hoạt động lưu trữ của một thanh ghi CPU trong ngăn xếp được gọi làPUSHvà lấy lại nội dung từ ngăn xếp vào thanh ghi CPU được gọi là POP.

Đẩy vào ngăn xếp

Trong 8051, con trỏ ngăn xếp (SP) trỏ đến vị trí được sử dụng cuối cùng của ngăn xếp. Khi dữ liệu được đẩy lên ngăn xếp, con trỏ ngăn xếp (SP) được tăng lên 1. Khi PUSH được thực thi, nội dung của thanh ghi được lưu trên ngăn xếp và SP được tăng lên 1. Để đẩy các thanh ghi vào ngăn xếp, chúng ta phải sử dụng địa chỉ RAM của chúng. Ví dụ, lệnh "PUSH 1" đẩy thanh ghi R1 vào ngăn xếp.

Xuất hiện từ ngăn xếp

Đưa nội dung của ngăn xếp trở lại vào một thanh ghi nhất định là ngược lại với quá trình đẩy. Với mọi thao tác pop, byte trên cùng của ngăn xếp được sao chép vào thanh ghi được chỉ định bởi lệnh và con trỏ ngăn xếp được giảm một lần.

Luồng chương trình tiến hành một cách tuần tự, từ lệnh này đến lệnh tiếp theo, trừ khi lệnh chuyển điều khiển được thực hiện. Các loại lệnh chuyển điều khiển khác nhau trong hợp ngữ bao gồm lệnh nhảy có điều kiện hoặc không điều kiện và lệnh gọi.

Hướng dẫn Vòng và Nhảy

Vòng lặp trong 8051

Lặp lại một chuỗi lệnh một số lần nhất định được gọi là loop. Một chỉ dẫnDJNZ reg, labelđược sử dụng để thực hiện một hoạt động Vòng lặp. Trong hướng dẫn này, một thanh ghi được giảm đi 1; nếu nó không phải là 0, thì 8051 sẽ nhảy đến địa chỉ đích mà nhãn tham chiếu.

Thanh ghi được nạp với bộ đếm số lần lặp lại trước khi bắt đầu vòng lặp. Trong hướng dẫn này, cả lệnh giảm thanh ghi và quyết định nhảy đều được kết hợp thành một lệnh duy nhất. Các thanh ghi có thể là bất kỳ trong số R0 – R7. Bộ đếm cũng có thể là một vị trí RAM.

Thí dụ

Multiply 25 by 10 using the technique of repeated addition.

Solution- Phép nhân có thể đạt được bằng cách cộng lặp lại số nhân và nhiều lần với số nhân. Ví dụ,

25 * 10 = 250 (FAH)

25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 + 25 = 250

MOV A,#0             ;A = 0,clean ACC 
   MOV R2,#10           ; the multiplier is replaced in R2 
   Add A,#25            ;add the multiplicand to the ACC 
	
AGAIN:DJNZ R2, 
AGAIN:repeat  until R2 = 0 (10 times) 

   MOV R5 , A           ;save A in R5 ;R5 (FAH)

Drawback in 8051 - Hành động lặp với lệnh DJNZ Reg labelchỉ được giới hạn ở 256 lần lặp. Nếu một bước nhảy có điều kiện không được thực hiện, thì lệnh sau bước nhảy sẽ được thực hiện.

Looping bên trong một Loop

Khi chúng ta sử dụng một vòng lặp bên trong một vòng lặp khác, nó được gọi là nested loop. Hai thanh ghi được sử dụng để giữ số lượng khi số lượng tối đa được giới hạn ở 256. Vì vậy, chúng tôi sử dụng phương pháp này để lặp lại hành động nhiều lần hơn 256.

Example

Viết chương trình cho -

  • Nạp bộ tích có giá trị 55H.
  • Bổ sung ACC 700 lần.

Solution- Vì 700 lớn hơn 255 (dung lượng tối đa của bất kỳ thanh ghi nào), hai thanh ghi được sử dụng để giữ số đếm. Đoạn mã sau đây cho thấy cách sử dụng hai thanh ghi, R2 và R3, để đếm.

MOV A,#55H            ;A = 55H 
	
NEXT: MOV R3,#10         ;R3 the outer loop counter 
AGAIN:MOV R2,#70         ;R2 the inner loop counter 

   CPL A                 ;complement

Các bước nhảy có điều kiện khác

Bảng sau liệt kê các bước nhảy có điều kiện được sử dụng trong 8051:

Chỉ dẫn Hoạt động
JZ Nhảy nếu A = 0
JNZ Nhảy nếu A ≠ 0
DJNZ Giảm và Nhảy nếu đăng ký ≠ 0
CJNE A, dữ liệu Nhảy nếu dữ liệu A ≠
CJNE reg, #data Nhảy nếu dữ liệu byte ≠
JC Nhảy nếu CY = 1
JNC Nhảy nếu CY ≠ 1
JB Nhảy nếu bit = 1
JNB Nhảy nếu bit = 0
JBC Nhảy nếu bit = 1 và xóa bit
  • JZ (jump if A = 0)- Trong hướng dẫn này, nội dung của bộ tích lũy được kiểm tra. Nếu nó bằng 0, thì 8051 sẽ nhảy đến địa chỉ đích. Lệnh JZ chỉ có thể được sử dụng cho bộ tích lũy, nó không áp dụng cho bất kỳ thanh ghi nào khác.

  • JNZ (jump if A is not equal to 0)- Trong hướng dẫn này, nội dung của bộ tích lũy được kiểm tra là khác không. Nếu nó không phải là 0, thì 8051 sẽ nhảy đến địa chỉ đích.

  • JNC (Jump if no carry, jumps if CY = 0)- Bit cờ Carry trong thanh ghi cờ (hoặc PSW) được sử dụng để đưa ra quyết định có nhảy hay không "nhãn JNC". CPU nhìn vào cờ mang để xem nó có được nâng lên hay không (CY = 1). Nếu nó không được nâng lên, thì CPU bắt đầu tìm nạp và thực thi các lệnh từ địa chỉ của nhãn. Nếu CY = 1, nó sẽ không nhảy mà sẽ thực hiện lệnh tiếp theo bên dưới JNC.

  • JC (Jump if carry, jumps if CY = 1) - Nếu CY = 1, nó sẽ nhảy đến địa chỉ đích.

  • JB (jump if bit is high)

  • JNB (jump if bit is low)

Note - Cần lưu ý rằng tất cả các bước nhảy có điều kiện đều là bước nhảy ngắn, tức là địa chỉ của đích phải nằm trong phạm vi –128 đến +127 byte nội dung của bộ đếm chương trình.

Hướng dẫn Nhảy vô điều kiện

Có hai bước nhảy không điều kiện trong 8051 -

  • LJMP (long jump)- LJMP là lệnh 3 byte trong đó byte đầu tiên đại diện cho opcode, byte thứ hai và thứ ba đại diện cho địa chỉ 16 bit của vị trí đích. Địa chỉ đích 2 byte cho phép nhảy đến bất kỳ vị trí bộ nhớ nào từ 0000 đến FFFFH.

  • SJMP (short jump)- Nó là một lệnh 2 byte trong đó byte đầu tiên là opcode và byte thứ hai là địa chỉ tương đối của vị trí đích. Địa chỉ tương đối nằm trong khoảng từ 00H đến FFH được chia thành các bước nhảy tiến và lùi; nghĩa là, trong phạm vi –128 đến +127 byte bộ nhớ liên quan đến địa chỉ của PC hiện tại (bộ đếm chương trình). Trong trường hợp chuyển tiếp, địa chỉ đích có thể nằm trong khoảng cách 127 byte từ PC hiện tại. Trong trường hợp nhảy lùi, địa chỉ đích có thể nằm trong phạm vi –128 byte tính từ PC hiện tại.

Tính toán địa chỉ bước ngắn

Tất cả các bước nhảy có điều kiện (JNC, JZ và DJNZ) là bước nhảy ngắn vì chúng là các lệnh 2 byte. Trong các hướng dẫn này, byte đầu tiên đại diện cho opcode và byte thứ hai đại diện cho địa chỉ tương đối. Địa chỉ đích luôn liên quan đến giá trị của bộ đếm chương trình. Để tính toán địa chỉ đích, byte thứ hai được thêm vào PC của lệnh ngay bên dưới bước nhảy. Hãy xem chương trình dưới đây -

Line   PC    Op-code   Mnemonic   Operand 
1      0000               ORG       0000 
2      0000  7800         MOV       R0,#003  
3      0002  7455         MOV       A,#55H0 
4      0004  6003         JZ        NEXT 
5      0006  08           INC       R0 
6      0007  04   AGAIN:  INC       A 
7      0008  04           INC       A 
8      0009  2477 NEXT:   ADD       A, #77h 
9      000B  5005         JNC       OVER 
10     000D  E4           CLR       A
11     000E  F8           MOV       R0, A 
12     000F  F9           MOV       R1, A 
13     0010  FA          MOV       R2, A 
14     0011  FB           MOV       R3, A 
15     0012  2B   OVER:   ADD       A, R3 
16     0013  50F2         JNC       AGAIN 
17     0015  80FE HERE:   SJMP      HERE 
18     0017             END

Tính toán địa chỉ mục tiêu nhảy lùi

Trong trường hợp nhảy về phía trước, giá trị dịch chuyển là một số dương từ 0 đến 127 (00 đến 7F trong hệ thập lục phân). Tuy nhiên, đối với bước nhảy lùi, độ dịch chuyển là giá trị âm từ 0 đến –128.

Hướng dẫn GỌI

CALL được sử dụng để gọi một chương trình con hoặc phương thức. Các chương trình con được sử dụng để thực hiện các hoạt động hoặc công việc cần được thực hiện thường xuyên. Điều này làm cho một chương trình có cấu trúc hơn và tiết kiệm không gian bộ nhớ. Có hai hướng dẫn - LCALL và ACALL.

LCALL (Cuộc gọi dài)

LCALL là một lệnh 3 byte trong đó byte đầu tiên đại diện cho opcode và byte thứ hai và thứ ba được sử dụng để cung cấp địa chỉ của chương trình con đích. LCALL có thể được sử dụng để gọi các chương trình con có sẵn trong không gian địa chỉ 64K byte của 8051.

Để thực hiện trở lại thành công điểm sau khi thực hiện chương trình con được gọi, CPU lưu địa chỉ của lệnh ngay bên dưới LCALL trên ngăn xếp. Do đó, khi một chương trình con được gọi, điều khiển được chuyển đến chương trình con đó, và bộ xử lý sẽ lưu PC (bộ đếm chương trình) trên ngăn xếp và bắt đầu lấy các lệnh từ vị trí mới. Lệnh RET (return) chuyển điều khiển trở lại người gọi sau khi thực hiện xong chương trình con. Mọi chương trình con đều sử dụng RET làm lệnh cuối cùng.

ACALL (Cuộc gọi tuyệt đối)

ACALL là một lệnh 2 byte, ngược lại với LCALL là 3 byte. Địa chỉ đích của chương trình con phải nằm trong khoảng 2K byte vì chỉ có 11 bit trong số 2 byte được sử dụng cho địa chỉ. Sự khác biệt giữa ACALL và LCALL là địa chỉ đích cho LCALL có thể ở bất kỳ đâu trong không gian địa chỉ 64K-byte của 8051, trong khi địa chỉ đích của CALL nằm trong phạm vi 2K-byte.

An addressing modeđề cập đến cách bạn đang giải quyết một vị trí bộ nhớ nhất định. Có năm cách khác nhau hoặc năm chế độ địa chỉ để thực hiện lệnh này như sau:

  • Chế độ giải quyết ngay lập tức
  • Chế độ địa chỉ trực tiếp
  • Đăng ký chế độ địa chỉ trực tiếp
  • Đăng ký chế độ địa chỉ gián tiếp
  • Chế độ đánh chỉ mục

Chế độ giải quyết ngay lập tức

Hãy bắt đầu với một ví dụ.

MOV A, #6AH

Nói chung, chúng ta có thể viết,

MOV A, #data

Nó được gọi là immediate bởi vì dữ liệu 8-bit được chuyển ngay lập tức đến bộ tích lũy (toán hạng đích).

Hình minh họa sau đây mô tả hướng dẫn trên và cách thực hiện của nó. Opcode 74H được lưu tại địa chỉ 0202. Dữ liệu 6AH được lưu tại địa chỉ 0203 trong bộ nhớ chương trình. Sau khi đọc opcode 74H, dữ liệu tại địa chỉ bộ nhớ chương trình tiếp theo được chuyển đến bộ tích lũy A (E0H là địa chỉ của bộ tích lũy). Vì lệnh có kích thước 2 byte và được thực hiện trong một chu kỳ, bộ đếm chương trình sẽ được tăng thêm 2 và sẽ trỏ đến 0204 của bộ nhớ chương trình.

Note- Ký hiệu '#' trước 6AH cho biết toán hạng là dữ liệu (8 bit). Trong trường hợp không có '#', số thập lục phân sẽ được lấy làm địa chỉ.

Chế độ địa chỉ trực tiếp

Đây là một cách khác để giải quyết một toán hạng. Ở đây, địa chỉ của dữ liệu (dữ liệu nguồn) được đưa ra dưới dạng một toán hạng. Hãy lấy một ví dụ.

MOV A, 04H

Ngân hàng đăng ký # 0 (thanh ghi thứ 4) có địa chỉ 04H. Khi lệnh MOV được thực hiện, dữ liệu được lưu trữ trong thanh ghi 04H được chuyển đến bộ tích lũy. Khi thanh ghi 04H giữ dữ liệu 1FH, 1FH được chuyển đến bộ tích lũy.

Note- Chúng tôi đã không sử dụng '#' trong chế độ địa chỉ trực tiếp, không giống như chế độ ngay lập tức. Nếu chúng tôi đã sử dụng '#', giá trị dữ liệu 04H sẽ được chuyển đến bộ tích lũy thay vì 1FH.

Bây giờ, hãy xem hình minh họa sau đây. Nó cho thấy cách thực hiện lệnh.

Như trong hình minh họa ở trên, đây là một lệnh 2 byte, cần 1 chu kỳ để hoàn thành. PC sẽ được tăng thêm 2 và sẽ trỏ đến 0204. Mã lựa chọn cho lệnh MOV A, địa chỉ là E5H. Khi lệnh tại 0202 được thực thi (E5H), bộ tích lũy được kích hoạt và sẵn sàng nhận dữ liệu. Sau đó, PC chuyển đến địa chỉ tiếp theo là 0203 và tra cứu địa chỉ của vị trí 04H nơi chứa dữ liệu nguồn (sẽ được chuyển sang bộ tích lũy). Vào lúc 04H, bộ điều khiển tìm thấy dữ liệu 1F và chuyển nó đến bộ tích lũy và do đó quá trình thực thi hoàn tất.

Đăng ký chế độ địa chỉ trực tiếp

Trong chế độ địa chỉ này, chúng tôi sử dụng trực tiếp tên thanh ghi (như toán hạng nguồn). Hãy để chúng tôi cố gắng hiểu với sự trợ giúp của một ví dụ.

MOV A, R4

Tại một thời điểm, các thanh ghi có thể nhận các giá trị từ R0 đến R7. Có 32 thanh ghi như vậy. Để sử dụng 32 thanh ghi chỉ với 8 biến địa chỉ các thanh ghi, các ngân hàng thanh ghi được sử dụng. Có 4 ngân hàng thanh ghi được đặt tên từ 0 đến 3. Mỗi ngân hàng bao gồm 8 thanh ghi có tên từ R0 đến R7.

Tại một thời điểm, một ngân hàng đăng ký có thể được chọn. Việc lựa chọn một ngân hàng đăng ký được thực hiện thông quaSpecial Function Register (SFR) được đặt tên Processor Status Word(PSW). PSW là một SFR 8 bit trong đó mỗi bit có thể được lập trình theo yêu cầu. Các bit được chỉ định từ PSW.0 đến PSW.7. PSW.3 và PSW.4 được sử dụng để chọn các ngân hàng đăng ký.

Bây giờ, hãy xem hình minh họa sau để hiểu rõ hơn về cách thức hoạt động của nó.

Opcode EC được sử dụng cho MOV A, R4. Opcode được lưu trữ tại địa chỉ 0202 và khi nó được thực thi, điều khiển sẽ chuyển trực tiếp đến R4 của ngân hàng đăng ký được tôn trọng (được chọn trong PSW). Nếu ngân hàng đăng ký # 0 được chọn, thì dữ liệu từ R4 của ngân hàng đăng ký # 0 sẽ được chuyển đến bộ tích lũy. Ở đây 2F được lưu trữ lúc 04H. 04H đại diện cho địa chỉ R4 của ngân hàng đăng ký # 0.

Chuyển động dữ liệu (2F) được tô đậm. 2F được chuyển đến bộ tích lũy từ vị trí bộ nhớ dữ liệu 0C H và được hiển thị dưới dạng đường chấm. 0CH là vị trí địa chỉ của Thanh ghi 4 (R4) của ngân hàng thanh ghi # 1. Hướng dẫn trên là 1 byte và yêu cầu 1 chu kỳ để thực hiện hoàn chỉnh. Điều đó có nghĩa là, bạn có thể tiết kiệm bộ nhớ chương trình bằng cách sử dụng chế độ định địa chỉ trực tiếp đăng ký.

Đăng ký chế độ địa chỉ gián tiếp

Trong chế độ định địa chỉ này, địa chỉ của dữ liệu được lưu trữ trong thanh ghi dưới dạng toán hạng.

MOV A, @R0

Ở đây giá trị bên trong R0 được coi là địa chỉ, địa chỉ này chứa dữ liệu được chuyển đến bộ tích lũy. Example: Nếu R0 có giá trị 20H và dữ liệu 2FH được lưu trữ tại địa chỉ 20H, thì giá trị 2FH sẽ được chuyển đến bộ tích lũy sau khi thực hiện lệnh này. Xem hình minh họa sau đây.

Vì vậy, mã lựa chọn cho MOV A, @R0là E6H. Giả sử rằng ngân hàng thanh ghi # 0 được chọn, R0 của ngân hàng thanh ghi # 0 giữ dữ liệu 20H. Điều khiển chương trình di chuyển đến 20H nơi nó định vị dữ liệu 2FH và nó chuyển 2FH đến bộ tích lũy. Đây là lệnh 1 byte và bộ đếm chương trình tăng lên 1 và di chuyển đến 0203 của bộ nhớ chương trình.

Note- Chỉ R0 và R1 được phép tạo lệnh định địa chỉ gián tiếp thanh ghi. Nói cách khác, người lập trình có thể tạo một lệnh bằng cách sử dụng @ R0 hoặc @ R1. Tất cả các ngân hàng đăng ký đều được phép.

Chế độ lập chỉ mục

Chúng tôi sẽ lấy hai ví dụ để hiểu khái niệm về chế độ địa chỉ được lập chỉ mục. Hãy xem các hướng dẫn sau:

MOVC A, @A+DPTR

MOVC A, @A+PC

trong đó DPTR là con trỏ dữ liệu và PC là bộ đếm chương trình (cả hai đều là thanh ghi 16 bit). Hãy xem xét ví dụ đầu tiên.

MOVC A, @A+DPTR

Toán hạng nguồn là @ A + DPTR. Nó chứa dữ liệu nguồn từ vị trí này. Ở đây chúng tôi đang thêm nội dung của DPTR với nội dung hiện tại của bộ tích lũy. Việc bổ sung này sẽ cung cấp một địa chỉ mới là địa chỉ của dữ liệu nguồn. Dữ liệu được trỏ bởi địa chỉ này sau đó sẽ được chuyển đến bộ tích lũy.

Mã opcode là 93H. DPTR có giá trị 01FE, trong đó 01 nằm trong DPH (8 bit cao hơn) và FE nằm trong DPL (8 bit thấp hơn). Bộ tích lũy có giá trị 02H. Sau đó, phép cộng 16 bit được thực hiện và 01FE H + 02H cho kết quả là 0200 H. Dữ liệu tại vị trí 0200H sẽ được chuyển đến bộ tích lũy. Giá trị trước đó bên trong bộ tích lũy (02H) sẽ được thay thế bằng dữ liệu mới từ 0200H. Dữ liệu mới trong bộ tích lũy được đánh dấu trong hình minh họa.

Đây là lệnh 1 byte với 2 chu kỳ cần thiết để thực hiện và thời gian thực hiện lệnh này cao so với các lệnh trước đó (tất cả đều là 1 chu kỳ).

Ví dụ khác MOVC A, @A+PChoạt động theo cách tương tự như ví dụ trên. Thay vì thêm DPTR với bộ tích lũy, ở đây dữ liệu bên trong bộ đếm chương trình (PC) được thêm vào bộ tích lũy để lấy địa chỉ đích.

Thanh ghi Chức năng Đặc biệt (hoặc Thanh ghi Mục đích Đặc biệt, hoặc đơn giản là Thanh ghi Đặc biệt) là một thanh ghi bên trong một bộ vi xử lý để điều khiển hoặc giám sát các chức năng khác nhau của một bộ vi xử lý. Vì các thanh ghi đặc biệt được liên kết chặt chẽ với một số chức năng hoặc trạng thái đặc biệt của bộ xử lý, chúng có thể không được ghi trực tiếp bằng các lệnh bình thường (như thêm, di chuyển, v.v.). Thay vào đó, một số thanh ghi đặc biệt trong một số kiến ​​trúc bộ xử lý yêu cầu các hướng dẫn đặc biệt để sửa đổi chúng.

Trong 8051, thanh ghi A, B, DPTR và PSW là một phần của nhóm thanh ghi thường được gọi là SFR (thanh ghi chức năng đặc biệt). SFR có thể được truy cập theo tên hoặc địa chỉ của nó.

Bảng sau đây hiển thị danh sách các SFR và địa chỉ của chúng.

Địa chỉ Byte Địa chỉ bit
FF
F0 F7 F6 F5 F4 F3 F2 F1 F0 B
E0 E7 E6 E5 E 4 E3 E2 E1 E0 ACC
D0 D7 D6 D5 D4 D3 D2 - D0 PSW
B8 - - - BC BB ba B9 B8 IP
B0 B7 B6 B5 B 4 B3 B2 B1 B0 P3
A2 AF - - AC AB AA A9 A8 I E
A0 A7 A6 A5 A4 A3 A2 A1 A0 P2
99 Không thể địa chỉ bit SBUF
98 9F 9E 9D 9C 9B 9A 99 98 SCON
90 97 96 95 94 93 92 91 90 P1
8D Không thể địa chỉ bit TH1
8C Không thể địa chỉ bit TH0
8B Không thể địa chỉ bit TL1
8A Không thể địa chỉ bit TL0
89 Không thể địa chỉ bit TMOD
88 8F 8E 8D 8C 8B 8A 89 88 TCON
87 Không thể địa chỉ bit PCON
83 Không thể địa chỉ bit DPH
82 Không thể địa chỉ bit DPL
81 Không thể địa chỉ bit SP
80 87 87 85 84 83 82 81 80 P0

Hãy xem xét hai điểm sau đây về địa chỉ SFR.

  • Một thanh ghi chức năng đặc biệt có thể có địa chỉ từ 80H đến FFH. Các địa chỉ này trên 80H, vì các địa chỉ từ 00 đến 7FH là địa chỉ của bộ nhớ RAM bên trong 8051.

  • Không phải tất cả không gian địa chỉ từ 80 đến FF đều được SFR sử dụng. Các vị trí không sử dụng, 80H đến FFH, được dành riêng và không được sử dụng bởi lập trình viên 8051.

C Y PSW.7 Mang cờ
AC PSW.6 Cờ mang phụ trợ
F0 PSW.5 Cờ 0 có sẵn cho người dùng cho mục đích chung.
RS1 PSW.4 Đăng ký bộ chọn ngân hàng bit 1
RS0 PSW.3 Đăng ký bộ chọn ngân hàng bit 0
OV PSW.2 Cờ tràn
- PSW.1 CỜ người dùng định nghĩa
P PSW.0 CỜ chẵn lẻ. Đặt / xóa bởi phần cứng trong chu kỳ lệnh để chỉ ra số chẵn / lẻ của 1 bit trong bộ tích lũy.

Trong ví dụ sau, tên của các thanh ghi SFR được thay thế bằng địa chỉ của chúng.

C Y AC F0 RS1 RS0 OV - P

Chúng ta có thể chọn bit Ngân hàng thanh ghi tương ứng bằng cách sử dụng bit RS0 và RS1.

RS1 RS2 Đăng ký ngân hàng Địa chỉ
0 0 0 00H-07H
0 1 1 08H-0FH
1 0 2 10 giờ-17 giờ
1 1 3 18H-1FH

Chương trình Trạng thái Word (PSW) chứa các bit trạng thái để phản ánh trạng thái hiện tại của CPU. Các biến thể của 8051 cung cấp một thanh ghi chức năng đặc biệt, PSW, với thông tin trạng thái này. 8251 cung cấp hai cờ trạng thái bổ sung, Z và N, có sẵn trong một thanh ghi chức năng đặc biệt thứ hai được gọi là PSW1.

A timerlà loại đồng hồ chuyên dụng dùng để đo các khoảng thời gian. Bộ đếm thời gian đếm từ 0 trở lên để đo thời gian đã trôi qua thường được gọi làstopwatch. Nó là một thiết bị đếm ngược từ một khoảng thời gian cụ thể và được sử dụng để tạo ra độ trễ thời gian, ví dụ: đồng hồ cát là bộ đếm thời gian.

A counterlà một thiết bị lưu trữ (và đôi khi hiển thị) số lần một sự kiện hoặc quá trình cụ thể đã xảy ra liên quan đến tín hiệu đồng hồ. Nó được sử dụng để đếm các sự kiện xảy ra bên ngoài vi điều khiển. Trong điện tử, bộ đếm có thể được thực hiện khá dễ dàng bằng cách sử dụng các mạch kiểu thanh ghi như flip-flop.

Sự khác biệt giữa bộ hẹn giờ và bộ đếm

Các điểm phân biệt bộ đếm thời gian với bộ đếm như sau:

Hẹn giờ Quầy tính tiền
Thanh ghi tăng dần cho mỗi chu kỳ máy. Thanh ghi được tăng lên khi xem xét quá trình chuyển đổi từ 1 đến 0 tương ứng với chân đầu vào bên ngoài (T0, T1).
Tốc độ đếm cực đại bằng 1/12 tần số dao động. Tốc độ đếm tối đa là 1/24 của tần số dao động.
Bộ đếm thời gian sử dụng tần số của đồng hồ bên trong và tạo ra độ trễ. Một bộ đếm sử dụng một tín hiệu bên ngoài để đếm xung.

Bộ định thời của 8051 và các thanh ghi liên kết của chúng

8051 có hai bộ định thời, Bộ định thời 0 và Bộ định thời 1. Chúng có thể được sử dụng như bộ định thời hoặc bộ đếm sự kiện. Cả Timer 0 và Timer 1 đều có độ rộng 16 bit. Vì 8051 tuân theo kiến ​​trúc 8 bit, mỗi 16 bit được truy cập dưới dạng hai thanh ghi riêng biệt byte thấp và byte cao.

Hẹn giờ 0 Đăng ký

Thanh ghi 16 bit của Timer 0 được truy cập dưới dạng byte thấp và byte cao. Thanh ghi byte thấp được gọi là TL0 (byte thấp của Timer 0) và thanh ghi byte cao được gọi là TH0 (byte cao của Timer 0). Các thanh ghi này có thể được truy cập giống như bất kỳ thanh ghi nào khác. Ví dụ, hướng dẫnMOV TL0, #4H chuyển giá trị vào byte thấp của Timer # 0.

Hẹn giờ 1 Đăng ký

Thanh ghi 16 bit của Timer 1 được truy cập dưới dạng byte thấp và byte cao. Thanh ghi byte thấp được gọi là TL1 (Timer 1 byte thấp) và thanh ghi byte cao được gọi là TH1 (Timer 1 byte cao). Các thanh ghi này có thể được truy cập giống như bất kỳ thanh ghi nào khác. Ví dụ, hướng dẫnMOV TL1, #4H di chuyển giá trị vào byte thấp của Timer 1.

Đăng ký TMOD (Chế độ hẹn giờ)

Cả Bộ hẹn giờ 0 và Bộ định thời 1 đều sử dụng cùng một thanh ghi để đặt các chế độ hoạt động của bộ hẹn giờ khác nhau. Nó là một thanh ghi 8 bit, trong đó 4 bit dưới được dành cho Timer 0 và 4 bit trên dành cho Timer. Trong mỗi trường hợp, 2 bit dưới được sử dụng để đặt trước chế độ hẹn giờ và 2 bit trên được sử dụng để chỉ định vị trí.

Gate - Khi được đặt, bộ định thời chỉ chạy trong khi INT (0,1) ở mức cao.

C/T - Bit chọn Counter / Timer.

M1 - Chế độ bit 1.

M0 - Chế độ bit 0.

CÁNH CỔNG

Mỗi bộ đếm thời gian đều có phương tiện bắt đầu và dừng. Một số bộ hẹn giờ thực hiện điều này bằng phần mềm, một số bằng phần cứng và một số có cả phần mềm và phần cứng điều khiển. Bộ định thời 8051 có cả phần mềm và phần cứng điều khiển. Việc bắt đầu và dừng bộ đếm thời gian được điều khiển bằng phần mềm sử dụng hướng dẫnSETB TR1CLR TR1 cho bộ hẹn giờ 1 và SETB TR0CLR TR0 cho bộ định thời 0.

Lệnh SETB được sử dụng để khởi động nó và nó bị dừng lại bởi lệnh CLR. Các hướng dẫn này bắt đầu và dừng bộ định thời miễn là GATE = 0 trong thanh ghi TMOD. Bộ hẹn giờ có thể được khởi động và dừng bởi một nguồn bên ngoài bằng cách đặt GATE = 1 trong thanh ghi TMOD.

C / T (ĐỒNG HỒ / HẸN GIỜ)

Bit này trong thanh ghi TMOD được sử dụng để quyết định xem bộ định thời có được sử dụng làm delay generator hoặc một event manager. Nếu C / T = 0, nó được sử dụng như một bộ định thời để tạo trễ bộ định thời. Nguồn đồng hồ để tạo ra thời gian trễ là tần số tinh thể của 8051. Nếu C / T = 0, tần số tinh thể gắn với 8051 cũng quyết định tốc độ mà bộ định thời 8051 tích tắc theo một khoảng thời gian đều đặn.

Tần số bộ định thời luôn bằng 1/12 tần số của tinh thể gắn với 8051. Mặc dù các hệ thống dựa trên 8051 khác nhau có tần số XTAL từ 10 MHz đến 40 MHz, chúng tôi thường làm việc với tần số XTAL là 11,0592 MHz. Đó là do tốc độ truyền cho giao tiếp nối tiếp của 8051.XTAL = 11,0592 cho phép hệ thống 8051 giao tiếp với PC không có lỗi.

M1 / M2

M1 M2 Chế độ
0 0 Chế độ hẹn giờ 13 bit.
0 1 Chế độ hẹn giờ 16 bit.
1 0 Chế độ tải lại tự động 8-bit.
1 1 Chế độ tràn.

Các chế độ hẹn giờ khác nhau

Chế độ 0 (Chế độ hẹn giờ 13 bit)

Cả Bộ định thời 1 và Bộ định thời 0 ở Chế độ 0 đều hoạt động dưới dạng bộ đếm 8 bit (với bộ đếm trước chia cho 32). Thanh ghi bộ định thời được cấu hình là một thanh ghi 13 bit bao gồm tất cả 8 bit của TH1 và 5 bit thấp hơn của TL1. 3 bit trên của TL1 là không xác định và nên được bỏ qua. Đặt cờ chạy (TR1) không xóa sổ đăng ký. Cờ ngắt bộ định thời TF1 được thiết lập khi số đếm chuyển từ tất cả các 1 đến tất cả các 0. Chế độ 0 hoạt động giống như đối với Bộ định thời 0 cũng như đối với Bộ định thời 1.

Chế độ 1 (Chế độ hẹn giờ 16 bit)

Chế độ hẹn giờ "1" là bộ định thời 16 bit và là chế độ thường được sử dụng. Nó hoạt động theo cách tương tự như chế độ 13 bit ngoại trừ tất cả 16 bit đều được sử dụng. TLx được tăng dần bắt đầu từ 0 đến tối đa 255. Khi đạt đến giá trị 255, TLx đặt lại thành 0 và sau đó THx được tăng lên 1. Vì là bộ định thời 16 bit đầy đủ, bộ định thời có thể chứa tối đa 65536 giá trị riêng biệt và nó sẽ tràn về 0 sau 65.536 chu kỳ máy.

Chế độ 2 (Tự động tải lại 8 bit)

Cả hai thanh ghi bộ định thời được cấu hình như bộ đếm 8 bit (TL1 và TL0) với khả năng tải lại tự động. Tràn từ TL1 (TL0) thiết lập TF1 (TF0) và cũng tải lại TL1 (TL0) với nội dung của Th1 (TH0), được đặt trước bằng phần mềm. Tải lại không thay đổi TH1 (TH0).

Lợi ích của chế độ tự động tải lại là bạn có thể đặt bộ đếm thời gian luôn chứa giá trị từ 200 đến 255. Nếu bạn sử dụng chế độ 0 hoặc 1, bạn sẽ phải kiểm tra mã để xem tràn và trong trường hợp đó, đặt lại bộ hẹn giờ thành 200. Trong trường hợp này, các hướng dẫn quý giá sẽ kiểm tra giá trị và / hoặc tải lại. Trong chế độ 2, bộ vi điều khiển sẽ đảm nhiệm việc này. Khi bạn đã cấu hình bộ hẹn giờ ở chế độ 2, bạn không phải lo lắng về việc kiểm tra xem bộ hẹn giờ có bị tràn hay không, cũng như không phải lo lắng về việc đặt lại giá trị vì phần cứng vi điều khiển sẽ làm tất cả cho bạn. Chế độ tự động tải lại được sử dụng để thiết lập tốc độ truyền chung.

Chế độ 3 (Chế độ hẹn giờ tách)

Chế độ hẹn giờ "3" được gọi là split-timer mode. Khi Timer 0 được đặt ở chế độ 3, nó sẽ trở thành hai bộ định thời 8 bit riêng biệt. Timer 0 là TL0 và Timer 1 là TH0. Cả bộ định thời đều đếm từ 0 đến 255 và trong trường hợp bị tràn, hãy đặt lại về 0. Tất cả các bit của Bộ định thời 1 bây giờ sẽ được gắn với TH0.

Khi Bộ định thời 0 ở chế độ tách, Bộ định thời 1 thực (tức là TH1 và TL1) có thể được đặt ở chế độ 0, 1 hoặc 2, nhưng nó không thể được khởi động / dừng vì các bit làm điều đó hiện được liên kết với TH0. Bộ đếm thời gian thực 1 sẽ được tăng lên với mỗi chu kỳ máy.

Khởi tạo bộ hẹn giờ

Quyết định chế độ hẹn giờ. Hãy xem xét một bộ định thời 16 bit chạy liên tục và không phụ thuộc vào bất kỳ chân bên ngoài nào.

Khởi tạo TMOD SFR. Sử dụng 4 bit thấp nhất của TMOD và xem xét Timer 0. Giữ hai bit, GATE 0 và C / T 0, là 0, vì chúng ta muốn bộ định thời độc lập với các chân bên ngoài. Vì chế độ 16 bit là chế độ hẹn giờ 1, xóa T0M1 và đặt T0M0. Thực tế, bit duy nhất để bật là bit 0 của TMOD. Bây giờ thực hiện hướng dẫn sau:

MOV TMOD,#01h

Bây giờ, Bộ hẹn giờ 0 đang ở chế độ hẹn giờ 16 bit, nhưng bộ định thời không chạy. Để khởi động bộ hẹn giờ ở chế độ đang chạy, hãy đặt bit TR0 bằng cách thực hiện lệnh sau:

SETB TR0

Bây giờ, Timer 0 sẽ ngay lập tức bắt đầu đếm, được tăng lên một lần mỗi chu kỳ máy.

Đọc hẹn giờ

Bộ định thời 16 bit có thể được đọc theo hai cách. Đọc giá trị thực của bộ đếm thời gian dưới dạng số 16 bit hoặc bạn phát hiện khi bộ hẹn giờ bị tràn.

Phát hiện tràn bộ hẹn giờ

Khi bộ định thời tràn từ giá trị cao nhất của nó đến 0, bộ vi điều khiển sẽ tự động đặt bit TFx trong thanh ghi TCON. Vì vậy, thay vì kiểm tra giá trị chính xác của bộ định thời, bit TFx có thể được kiểm tra. Nếu TF0 được đặt, thì Timer 0 đã bị tràn; nếu TF1 được đặt, thì Timer 1 đã bị tràn.

Ngắt là một tín hiệu đến bộ xử lý do phần cứng hoặc phần mềm phát ra cho biết một sự kiện cần được chú ý ngay lập tức. Bất cứ khi nào một ngắt xảy ra, bộ điều khiển sẽ hoàn thành việc thực thi lệnh hiện tại và bắt đầu thực hiện một lệnhInterrupt Service Routine (ISR) hoặc Interrupt Handler. ISR cho bộ xử lý hoặc bộ điều khiển biết phải làm gì khi xảy ra ngắt. Các ngắt có thể là ngắt phần cứng hoặc ngắt phần mềm.

Ngắt phần cứng

Ngắt phần cứng là một tín hiệu cảnh báo điện tử được gửi đến bộ xử lý từ một thiết bị bên ngoài, như bộ điều khiển đĩa hoặc thiết bị ngoại vi bên ngoài. Ví dụ: khi chúng ta nhấn một phím trên bàn phím hoặc di chuyển chuột, chúng sẽ kích hoạt các ngắt phần cứng khiến bộ xử lý đọc vị trí tổ hợp phím hoặc chuột.

Phần mềm gián đoạn

Ngắt phần mềm là do một điều kiện ngoại lệ hoặc một lệnh đặc biệt trong tập lệnh gây ra ngắt khi nó được thực thi bởi bộ xử lý. Ví dụ: nếu đơn vị logic số học của bộ xử lý chạy lệnh chia một số cho không, để gây ra ngoại lệ chia cho 0, do đó khiến máy tính bỏ phép tính hoặc hiển thị thông báo lỗi. Các lệnh ngắt phần mềm hoạt động tương tự như các lệnh gọi chương trình con.

Polling là gì?

Trạng thái giám sát liên tục được gọi là polling. Bộ vi điều khiển tiếp tục kiểm tra trạng thái của các thiết bị khác; và trong khi làm như vậy, nó không có hoạt động nào khác và tiêu tốn toàn bộ thời gian xử lý để theo dõi. Vấn đề này có thể được giải quyết bằng cách sử dụng ngắt.

Trong phương pháp ngắt, bộ điều khiển chỉ phản hồi khi xảy ra ngắt. Do đó, bộ điều khiển không bắt buộc phải thường xuyên theo dõi trạng thái (cờ, tín hiệu, v.v.) của các thiết bị được kết nối và sẵn có.

Ngắt v / s Polling

Đây là một phép loại suy phân biệt ngắt quãng với bỏ phiếu -

Làm gián đoạn Thăm dò ý kiến
Một sự gián đoạn giống như một shopkeeper. Nếu một người cần một dịch vụ hoặc sản phẩm, anh ta đến gặp anh ta và đáp ứng nhu cầu của anh ta. Trong trường hợp ngắt, khi nhận được cờ hoặc tín hiệu, chúng sẽ thông báo cho bộ điều khiển rằng chúng cần được bảo dưỡng. Phương pháp bỏ phiếu giống như một salesperson. Người bán hàng đi từ cửa này đến cửa khác trong khi yêu cầu mua một sản phẩm hoặc dịch vụ. Tương tự, bộ điều khiển tiếp tục theo dõi từng cờ hoặc tín hiệu cho tất cả các thiết bị và cung cấp dịch vụ cho bất kỳ thành phần nào cần dịch vụ của nó.

Quy trình dịch vụ ngắt

Đối với mỗi lần ngắt, phải có một quy trình dịch vụ ngắt (ISR), hoặc interrupt handler. Khi xảy ra ngắt, bộ vi điều khiển chạy quy trình dịch vụ ngắt. Đối với mỗi ngắt, có một vị trí cố định trong bộ nhớ chứa địa chỉ của quy trình phục vụ ngắt, ISR. Bảng các vị trí bộ nhớ được thiết lập để giữ địa chỉ của các ISR được gọi là Bảng Vectơ ngắt.

Bảng vectơ ngắt

Có sáu ngắt bao gồm RESET trong 8051.

Ngắt Vị trí ROM (Hex) Ghim
Ngắt Vị trí ROM (HEX)
COM nối tiếp (RI và TI) 0023
Bộ hẹn giờ 1 ngắt (TF1) 001B
Ngắt HW bên ngoài 1 (INT1) 0013 P3.3 (13)
Ngắt HW bên ngoài 0 (INT0) 0003 P3.2 (12)
Hẹn giờ 0 (TF0) 000B
Cài lại 0000 9
  • Khi chân đặt lại được kích hoạt, 8051 sẽ nhảy đến vị trí địa chỉ 0000. Đây là thiết lập lại nguồn.

  • Hai ngắt được dành cho bộ định thời: một cho bộ định thời 0 và một cho bộ định thời 1. Vị trí bộ nhớ lần lượt là 000BH và 001BH trong bảng vectơ ngắt.

  • Hai ngắt được dành riêng cho các ngắt bên ngoài phần cứng. Ghim số. 12 và số Pin. 13 trong Cổng 3 tương ứng dành cho các ngắt phần cứng bên ngoài INT0 và INT1. Vị trí bộ nhớ lần lượt là 0003H và 0013H trong bảng vector ngắt.

  • Truyền thông nối tiếp có một ngắt duy nhất thuộc về cả nhận và truyền. Vị trí bộ nhớ 0023H thuộc ngắt này.

Các bước thực hiện ngắt

Khi một ngắt được kích hoạt, bộ vi điều khiển sẽ thực hiện các bước sau:

  • Bộ vi điều khiển đóng lệnh đang thực thi và lưu địa chỉ của lệnh tiếp theo (PC) trên ngăn xếp.

  • Nó cũng lưu trạng thái hiện tại của tất cả các ngắt bên trong (tức là không nằm trên ngăn xếp).

  • Nó nhảy đến vị trí bộ nhớ của bảng vectơ ngắt chứa địa chỉ của quy trình dịch vụ ngắt.

  • Bộ vi điều khiển lấy địa chỉ của ISR từ bảng vectơ ngắt và chuyển đến nó. Nó bắt đầu thực hiện chương trình con phục vụ ngắt, đó là RETI (trả về từ ngắt).

  • Sau khi thực hiện lệnh RETI, bộ vi điều khiển quay trở lại vị trí mà nó bị ngắt. Đầu tiên, nó lấy địa chỉ bộ đếm chương trình (PC) từ ngăn xếp bằng cách đưa các byte trên cùng của ngăn xếp vào PC. Sau đó, nó bắt đầu thực thi từ địa chỉ đó.

Kích hoạt cạnh so với Kích hoạt cấp

Mô-đun ngắt có hai loại - kích hoạt mức hoặc kích hoạt cạnh.

Cấp độ được kích hoạt Cạnh được kích hoạt
Mô-đun ngắt được kích hoạt theo mức luôn tạo ra một ngắt bất cứ khi nào mức của nguồn ngắt được xác nhận. Mô-đun ngắt được kích hoạt cạnh tạo ra ngắt chỉ khi nó phát hiện ra cạnh xác nhận của nguồn ngắt. Cạnh được phát hiện khi mức nguồn ngắt thực sự thay đổi. Nó cũng có thể được phát hiện bằng cách lấy mẫu định kỳ và phát hiện mức khẳng định khi mẫu trước đó đã được khử khẳng định.
Nếu nguồn ngắt vẫn được xác nhận khi trình xử lý ngắt phần sụn xử lý ngắt, mô-đun ngắt sẽ tạo lại ngắt, khiến trình xử lý ngắt được gọi lại. Các mô-đun ngắt được kích hoạt bởi cạnh có thể được hoạt động ngay lập tức, bất kể nguồn ngắt hoạt động như thế nào.
Các ngắt được kích hoạt theo mức rất cồng kềnh đối với phần sụn. Các ngắt được kích hoạt bởi cạnh giữ cho độ phức tạp mã của phần sụn ở mức thấp, giảm số lượng điều kiện cho phần sụn và cung cấp tính linh hoạt hơn khi xử lý các ngắt.

Bật và tắt ngắt

Sau khi Đặt lại, tất cả các ngắt sẽ bị vô hiệu hóa ngay cả khi chúng được kích hoạt. Các ngắt phải được bật bằng phần mềm để bộ vi điều khiển phản hồi lại các ngắt đó.

Thanh ghi IE (cho phép ngắt) chịu trách nhiệm cho phép và vô hiệu hóa ngắt. IE là một thanh ghi có thể nén được bitaddress.

Đăng ký cho phép ngắt

EA - ET2 ES ET1 EX1 ET0 EX0
  • EA - Bật / tắt toàn cầu.

  • - - Không xác định.

  • ET2 - Kích hoạt ngắt Timer 2.

  • ES - Kích hoạt ngắt cổng nối tiếp.

  • ET1 - Kích hoạt ngắt Timer 1.

  • EX1 - Kích hoạt ngắt bên ngoài 1.

  • ET0 - Kích hoạt ngắt Timer 0.

  • EX0 - Kích hoạt ngắt bên ngoài 0.

Để kích hoạt ngắt, chúng tôi thực hiện các bước sau:

  • Bit D7 của thanh ghi IE (EA) phải cao để phần còn lại của thanh ghi có hiệu lực.

  • Nếu EA = 1, ngắt sẽ được bật và sẽ được phản hồi, nếu bit tương ứng của chúng trong IE cao. Nếu EA = 0, không có ngắt nào sẽ phản hồi, ngay cả khi các chân liên kết của chúng trong thanh ghi IE cao.

Mức độ ưu tiên ngắt trong 8051

Chúng ta có thể thay đổi mức ưu tiên ngắt bằng cách gán mức ưu tiên cao hơn cho bất kỳ ngắt nào. Điều này được thực hiện bằng cách lập trình một thanh ghi có tênIP (ưu tiên ngắt).

Hình sau cho thấy các bit của thanh ghi IP. Sau khi đặt lại, thanh ghi IP chứa tất cả các số 0. Để ưu tiên cao hơn cho bất kỳ ngắt nào, chúng tôi đặt bit tương ứng trong thanh ghi IP ở mức cao.

- - - - PT1 PX1 PT0 PX0

- IP.7 Không được thực hiện.
- IP.6 Không được thực hiện.
- IP.5 Không được thực hiện.
- IP.4 Không được thực hiện.
PT1 IP.3 Xác định mức ưu tiên ngắt của Timer 1.
PX1 IP.2 Xác định mức ưu tiên Ngắt ngoài 1.
PT0 IP.1 Xác định mức ưu tiên ngắt của Timer 0.
PX0 IP.0 Xác định mức ưu tiên Ngắt ngoài 0.

Ngắt bên trong Ngắt

Điều gì xảy ra nếu 8051 đang thực thi một ISR thuộc về một ngắt và một ngắt khác hoạt động? Trong những trường hợp như vậy, một ngắt có mức ưu tiên cao có thể ngắt một ngắt có mức ưu tiên thấp. Điều này được gọi làinterrupt inside interrupt. Trong 8051, ngắt có mức ưu tiên thấp có thể bị ngắt bởi ngắt có mức ưu tiên cao, nhưng không bị ngắt bởi bất kỳ ngắt có mức ưu tiên thấp nào khác.

Kích hoạt gián đoạn bởi phần mềm

Đôi khi chúng ta cần kiểm tra ISR bằng cách mô phỏng. Điều này có thể được thực hiện với các hướng dẫn đơn giản để thiết lập mức cao ngắt và do đó làm cho 8051 nhảy đến bảng vector ngắt. Ví dụ: đặt bit IE là 1 cho bộ định thời 1. Một lệnhSETB TF1 sẽ ngắt 8051 trong bất cứ điều gì nó đang làm và buộc nó phải nhảy đến bảng vectơ ngắt.