Đề cương Bài giảng vi xử lý 8051

Đề cương Bài giảng vi xử lý 8051 Chương 1. TỔNG QUAN VỀ HỆ VI XỬ LÝ Kiến trúc hệ vi xử lý Sơ đồ khối tổng quát và chức năng của một bộ vi xử lý. Sơ đồ khối : Hình 1.1. Cấu trúc tổng quát của một hệ vi xử lý Các khối chức năng chính của hệ vi xử lý bao gồm: Khối xử lý trung tâm (CPU) Bộ nhớ bán dẫn (memory, M) Khối phối ghép với các thiết bị ngoại vi Các bus truyền thông tin Ba khối chức năng: CPU, M, I/O liên hệ với nhau thông qua tập các đường dây để truyền tín hiệu gọi chung là bu

doc59 trang | Chia sẻ: huongnhu95 | Lượt xem: 366 | Lượt tải: 0download
Tóm tắt tài liệu Đề cương Bài giảng vi xử lý 8051, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
s hệ thống. Bus hệ thống bao gồm 3 bus thành phần ứng với các tín hiệu địa chỉ, dữ liệu và điều khiển ta có bus địa chỉ, bus dữ liệu và bus điều khiển. Chức năng các khối : - Bộ xử lý trung tâm CPU (Central Processing Unit ) là trung tâm đầu não của hệ, nó có chức năng thu thập, xử lý thông tin và điều khiển mọi hoạt động của hệ vi xử lý. - Bộ nhớ trung tâm có nhiệm vụ lưu trữ thông tin dữ liệu trước khi CPU xử lý - Thiết bị I/O thực hiện việc nhận dữ liệu từ các kênh thông tin từ bên ngoài vào để cho CPU xử lý và xuất ra các tín hiệu điều khiển hệ thống - Các kênh thông tin hay Bus hệ thống là cầu nối liên kết giữa các khối trong đó thực hiện 3 việc chính là liên kết các Bus địa chỉ, Bus điều khiển và Bus dữ liệu. Một bus là tập hợp các dây dẫn mang thông tin có cùng một mục đích. Việc truy xuất tới một mạch xung quanh CPU sử dụng ba bus: bus địa chỉ, bus điều khiển và bus dữ liệu. Với mỗi thao tác đọc hoặc ghi CPU xác định rõ vị trí của dữ liệu hoặc lệnh bằng cách đặt một địa chỉ lên bus địa chỉ, sau đó tích cực một tín hiệu trên bus điều khiển để chỉ ra thao tác là đọc hay ghi. Thao tác đọc lấy một byte dữ liệu từ bộ nhớ ra vị trí xác định và đặt byte này lên bus dữ liệu. CPU đọc dữ liệu và và đặt dữ liệu vào một trong các thanh ghi nội của CPU. Với thao tác ghi, CPU xuất dữ liệu lên bus dữ liệu. Nhờ vào tín hiệu điều khiển, bộ nhớ nhận biết đây là thao tác ghi và lưu dữ liệu vào vị trí xác định. Bộ xử lý trung tâm (CPU). Bộ vi xử lý là hạt nhân của hệ vi xử lý, nó là thành phần quan trọng nhất kiểm soát tất cả các hoạt động của hệ và thực hiện các thao tác trên dữ liệu. Hầu hết các CPU được hình thành từ các mạch lôgic nhằm thực hiện liên tục 2 thao tác là tìm nạp lệnh từ bộ nhớ để giải mã và thực thi lệnh. CPU có khả năng hiểu và thực thi các lệnh dựa trên một tập các mã nhị phân gọi là mã máy trong đó mỗi mã nhằm thực hiện một thao tác nào đó.Tổ hợp các lệnh cho mỗi loại CPU gọi là tập lệnh và nó thường chia ra thành các nhóm lệnh như: Nhóm lệnh chuyển dữ liệu Nhóm lệnh số học Nhóm lệnh Lôgic Nhóm lệnh rẽ nhánh chương trình Nhóm lệnh xử lý bít Cấu trúc đơn giản của một loại CPU được minh họa như sau: EU: Execution unit (khối thực hiện lệnh) BIU: Bus interface unit (Khối phối ghép bus) ALU: Arithmetic and logic unit (khối số học và logic) Hình 1.2. Sơ đồ khối của bộ vi xử lý 8088 BIU và EU: Bên trong CPU 8088 có hai khối chính: khối phối ghép bus (BIU) và khối thực hiện lệnh (EU). Việc chia CPU ra làm hai phần làm việc đồng thời có liên hệ với nhau qua đệm lệnh làm tăng đáng kể tốc độ xử lý của CPU. Các bus bên trong CPU có nhiệm vụ truyền tải các tín hiệu của các khối khác. Trong số các bus đó có bus dữ liệu 16 bit của ALU, bus các tín hiệu điều khiển ở EU, và bus trong của hệ thống ở BIU. Trước khi đi ra bus ngoài hoặc đi vào bus trong của bộ vi xử lý, các tín hiệu truyền trên bus thường được cho đi qua bộ đệm để nâng cao tính tương thích cho nối ghép hoặc nâng cao khả năng phối ghép. BIU đưa ra địa chỉ, đọc mã lệnh từ bộ nhớ, đọc/ghi dữ liệu từ/vào cổng hoặc bộ nhớ. Nói cách khác BIU chịu trách nhiệm đưa địa chỉ ra bus và trao đổi địa chỉ với bus. Trong EU ta thấy có một khối điều khiển (control unit CU). Chính tại bên trong khối điều khiển này có mạch giải mã lệnh. Mã lệnh đọc vào từ bộ nhớ được đưa đến đầu vào của bộ giải mã, các thông tin thu được từ đầu ra của nó sẽ được đưa đến mạch tạo xung điều khiển, kết quả là ta thu được các dãy xung khác nhau (tùy theo mã lệnh) để điều khiển hoạt động của các bộ phận bên trong và bên ngoài CPU. Trong khối EU còn có khối số học và logic dùng để thực hiện các thao tác khác nhau với các toán hạng của lệnh. Tóm lại, khi CPU hoạt động EU sẽ cung cấp thông tin về địa chỉ cho BIU để khối này đọc lệnh và dữ liệu, còn bản thân nó thì giải mã lệnh và thực hiện lệnh. Trong BIU còn có một bộ nhớ đệm lệnh (hàng đợi lệnh) với dung lượng 4 byte dùng để chứa các mã lệnh đọc được nằm sẵn để chờ EU xử lý. Đây là cấu trúc mới được cấy vào bộ vi xử lý 8088 do việc Intel đưa cơ chế xử lý xen kẽ liên tục dòng mã lệnh (instruction pipelining) vào ứng dụng trong các bộ vi xử lý thế hệ mới. Pipeline là một cơ chế đã được ứng dụng từ những năm 60 trong các máy lớn. Cơ chế này hoạt động như sau: Hoạt động của CPU gồm 3 giai đoạn đọc mã lệnh (opcode fetch), giải mã lệnh (decode) và thực hiện lệnh (execution). Bộ vi xử lý 8088 sử dụng cơ chế xử lý xen kẽ liên tục dòng mã lệnh thì CPU được chia làm hai khối có sự phân chia công việc cho từng khối. Việc đọc mã lệnh do BIU thực hiện, việc giải mã lệnh và thực hiện lệnh là do khối EU đảm nhiệm. Các khối chức năng này có khả năng làm việc đồng thời và các bus sẽ liên tục được sử dụng. Trong khi EU lấy mã lệnh từ bộ đệm 4 byte để giải mã thì BIU vẫn có thể đọc mã lệnh từ bộ nhớ chính rồi đặt chúng vào bộ nhớ đệm lệnh đã nêu. Bộ đệm lệnh này làm việc theo kiểu vào trước – ra trước. Điều này làm tăng tốc độ của bộ vi xử lý. Tuy nhiên nếu trong bộ đệm lệnh chứa các mã lệnh CALL hay JMP thì nội dung cũ của bộ đệm sẽ bị xóa và thay thế vào đó là nội dung mới được nạp vào bởi các mã lệnh mới do lệnh nhảy hoặc lệnh con quyết định. Việc này tiêu tốn nhiều thời gian hơn so với việc xử lý theo kiểu tuần tự. Không có pipelining F1 D1 E1 F2 D2 E2 F2 D3 E3 Có pipelining F1 D1 E1 F2 D2 E2 F3 D3 E3 Hình 1.3. Dòng lệnh thường và dòng lệnh xen kẽ liên tục Các thanh ghi đoạn (segment register, 16 bit) Khối BIU đưa ra trên bus địa chỉ 20 bus địa chỉ, như vậy 8088 có khả năng phân biệt được 220 = 1.048.576 = 1M ô nhớ hay 1 Mbyte, vì các bộ nhớ nói chung tổ chức theo byte. Nói cách khác, không gian địa chỉ của 8088 là một Mbyte. Trong không gian 1 Mbyte này bộ nhớ cần được chia thành các vùng khác nhau Chứa mã chương trình Chứa dữ liệu và kết quả trung gian của chương trình Tạo ra một vùng nhớ đặc biệt gọi là ngăn xếp (stack) dùng vào việc quản lý các thông số của bộ vi xử lý khi gọi chương trình con hoặc chở về từ chương trình con Trong thực tế bộ vi xử lý 8088 có các thanh ghi 16 bit liên quan đến địa chỉ đầu của các vùng (các đoạn) kể trên và chúng được gọi là các thanh ghi đoạn. Đó là thanh ghi đoạn mã CS (code segment), thanh ghi đoạn dữ liệu DS (data segment), thanh ghi ngăn sếp SS (stack segment) và thanh ghi đoạn dữ liệu phụ ES (extra segment). Các thanh ghi đoạn 16 bit này chỉ ra địa chỉ đầu của 4 đoạn trong bộ nhớ, dung lượng lớn nhất của mỗi đoạn nhớ này là 64Kbyte và tại một thời điêm nhất định bộ vi xử lý chỉ làm việc được với 4 đoạn nhớ 64Kbyte này. Việc thay đổi giá trị của các thanh ghi đoạn làm cho các đoạn tương ứng có thể dịch chuyển linh hoạt trong phạm vi không gian 1 Mbyte, vì vậy các đoạn này có thể nằm tách nhau khi thông tin cần lưu trong chúng đòi hỏi dung lượng đủ 64 Kbyte hoặc cũng có thể nằm trùm nhau do có những đoạn không cần không cần dùng hết độ dài 64Kbyte. Và vì thế các đoạn khác có thể bắt đầu nối tiếp ngay sau đó. Điều này cũng cho phép ta truy nhập vào bất kỳ đoạn nhớ 64 Kbyte nào nằm trong toàn bộ không gian 1 Mbyte Nội dung các thanh ghi đoạn sẽ xác định địa chỉ của ô nhớ nằm ở đầu đoạn. Địa chỉ này gọi là địa chỉ cơ sở. Địa chỉ của các ô nhớ khác nằm trong đoạn gọi là địa chỉ lệnh hay độ lệnh (offset), gọi như thế vì nó ứng với khoảng lệch của tọa độ một ô nhớ cụ thể nào đó so với ô đầu đoạn. Độ lệnh này được xác định bởi cac thanh ghi 16 bit khác đóng vai trò thanh ghi lệnh (offset registers) mà ta sẽ nói đến sau. Cụ thể, để xác định địa chỉ vật lý 20 bit của một ô nhớ nào đó trong một đoạn bất kỳ. CPU 8088 phải dùng đến hai thanh ghi 16 bit (mọt thanh ghi để chứa địa chỉ cơ sở, còn thanh ghi kia chứa độ lệnh) và từ nội dung của cặp thanh ghi đó nó tạo ra địa chỉ vật lý theo công thức sau. Địa chỉ vật lý = thanh ghi đoanh *16 + thanh ghi lệnh Việc dùng hai thanh ghi để ghi nhớ thông tin về địa chỉ thực chất tạo ra một loại địa chỉ gọi là địa chỉ logic và được ký hiệu như sau: Thanhghiđoạn : thanhghilệch (segment : offset) Địa chỉ segment : offset là logic vì nó tồn tại dưới dạng giá trị của các thanh ghi cụ thể bên trong CPU và khi cần thiết truy nhập ô nhớ nào đó thì nó phải được đổi ra địa chỉ vật lý để rồi được đưa lên bus địa chỉ. Việc chuyển này do một bộ tạo địa chỉ thực hiện. Ví dụ: cặp CS:IP sẽ chỉ ra địa chỉ của lệnh sắp thực hiện trong đoạn mã. Nếu tại một thời điểm nào đó ta có CS=F000H và IP=FFF0H thì CS:IP~F000H*16+FFF0H = F0000H + FFF0H = FFFF0H Địa chỉ FFFF0H chính là địa chỉ khởi động của 8088. Dấu ‘~’ là để chỉ sự tương ứng. Địa chỉ các ô nhớ thuộc các đoạn khác cũng có thể tính được theo cách tương tự như vậy. Vì vậy khi cần nói đến địa chỉ của môt ô nhớ ta có tể sử dụng cả địa chỉ logic lẫn địa chỉ vật lý. Vì bao giờ cũng tồn tại sự tương ứng giữa hai loại địa chỉ này (thông qua bộ tạo địa chỉ S). Trước khi nói đến các thanh ghi khác ta nói thêm chút ít về tính đa trị của các thanh ghi đoạn và thanh ghi lệch trong địa chỉ logic ứng với một địa chỉ vật lý. Điều này cũng nói lên tính linh hoạt cua cơ chế segment : offset trong việc định địa chỉ của 8088/8086. Nhìn vào các giá trị cuối cùng của địa chỉ vật lý, ta thấy có thể tạo ra địa chỉ đó từ nhiều giá trị khác nhau cua thanh ghi đoạn và thanh ghi lệch. Ví dụ: địa chỉ vật lý 12345H có thể được tạo ra từ các giá trị Thanh ghi đoạn Thanh ghi lệch 1000H 1200H 1004H 0300H ... 2345H 0345H 2305H E345H ... Các thanh ghi đa năng Trong khối EU có 4 thanh ghi đa năng 16 bit AX, BX, CX, DX. Điều đặc biệt là khi cần chứa dữ liệu 8 bit thì mỗi thanh ghi này có thể tách ra thành 2 thanh ghi 8 bit cao và thấp làm việc độc lập. Đó là các cặp thanh ghi AH, AL, BH, BL, CH, CL, DH, DL (trong đó H chỉ phần cao L chỉ phần thấp). Mỗi thanh ghi có thể được dùng một cách vạn năng để chứa các loại dữ liệu khác nhau, nhưng cũng có những công việc đặc biệt nhất định chỉ thao tác với một vài thanh ghi nào đó và chính vì vậy các thanh ghi thường được gán cho các cái tên đặc biệt rất có ý nghĩa. Cụ thể: AX (accumulator, Acc) thanh chứa. Các kết quả của các thao tác thường được chứa ở đây (kếp quả của phép nhân, chia) nếu kết quả là 8 bit thì thanh ghi AL được coi là Acc BX (Base) thanh ghi cơ sở, thường chứa địa chỉ cơ sở của một bảng dùng trong lệnh XLAT. CX (counter) bộ đếm. Thường được dùng để chứa số lần lặp trong trường hợp các lệnh LOOP, còn CL thường được dùng để chứa số lần dịch hoặc quay trong các lệnh dịch hoặc quay thanh ghi DX (data) thanh ghi dữ liệu. DX cùng AX tham gia vào các thao tác của phép nhân hoặc chia các số 16 bit. DX còn dùng để chứa địa chỉ của các cổng trong các lệnh vào ra dữ liệu trực tiếp (IN/OUT) Các thanh ghi con trỏ và chỉ số Trong 8088 còn có 3 thanh ghi con trỏ và 2 thanh ghi chỉ số 16 bit. Các thanh ghi này (trừ IP) đều có thể được dùng như các thanh ghi đa năng, nhưng ứng dụng chính của mỗi thanh ghi là chúng được ngầm định như là thanh ghi lệnh cho các đoạn tương ứng. cụ thể: IP (con trỏ lệnh-instruction pointer) IP luôn trỏ vào lệnh tiếp theo sẽ được thực hiện nằm trong đoạn mã CS. Địa chỉ đầy đủ của lệnh tiếp theo này ứng với CS:IP và được xác định theo cách đã nêu ở trên. BP (con trỏ cơ sở-base pointer) BP luôn trỏ vào một dữ liệu nằm trong đoạn ngăn xếp SS. Địa chỉ đầy đủ của một phần tử trong đoạn ngăn xếp ứng với SS:BP và được xác định theo cách đã nói ở trên. SI (chỉ số gốc hay nguồn – source index) SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ cụ thể đầy đủ ứng với DS:SI và được xác định theo cách đã nêu ở trên DI (Chỉ số đích – destination index) DI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ cụ thể đầy đủ ứng với DS:SI và được xác định như cách đã nói ở trên Chú ý: Riêng trong các lệnh thao tác với dữ liệu kiểu chuỗi thì cặp ES:DI luôn ứng với địa chỉ của phần tử thuộc chuỗi đích, còn cặp DS:SI ứng với địa chỉ của phần tử thuộc chuỗi gốc. Thanh ghi cờ FR (flat register) Đây là thanh ghi khá đặc biệt trong CPU, mỗi bit của nó được dùng để phản ánh một trạng thái nhất định của kết quả phép toán do ALU thực hiện hoặc một trạng thái hoạt động của EU. Dựa vào các cờ này người lập trình có thể có các lệnh thích hợp tiếp theo cho bộ vi xử lý (các lệnh nhảy có điều kiện). Thanh ghi cờ gồm 16 bit nhưng người ta chỉ dùng hết 9 bit của nó để làm các bit cờ. x x x x O D I T S Z x A x P x C Hình 1.4. Sơ đồ thanh ghi cờ của bộ vi xử lý 8086/88 Các cờ cụ thể: - C hoặc CF (Carry Flat) cờ nhớ, CF = 1 khi có nhớ hoặc mượn từ MSB. - P hoặc FP (Parity Flat) cờ parity phản ánh tính chẵn lẻ của tổng số bit 1 có trong kết quả. PF = 1 khi tổng số bit 1 có trong kết quả là chẵn (even parity) PF = 0 khi tổng số bit 1 trong kết quả là lẻ. - A hoặc AF (auxiliary carry flat) cờ nhớ phụ rất có ý nghĩa khi ta làm việc với các số BCD. AF=1 khi có nhớ hoặc mượn từ một số BCD thấp (4 bit thấp) sang một số BCD cao(4 bit cao) - Z hoặc ZF (zero flat) cờ rỗng, ZF=1 khi kết quả bằng 0 - S hoặc SF (sign flat) cờ dấu, SF=1 khi kết quả âm. - O hoặc OF (over flow) cờ tràn OF = 1 khi kết quả là một số bù hai vượt ra ngoài giới hạn biểu diễn dành cho nó. Trên đây là 6 bit cờ trạng thái phản ánh các trạng thái khác nhau của kết quả sau một thao tác nào đó, trong đó 5 bit cờ đầu thuộc byte thấp của thanh ghi cờ là các cờ giống như bộ vi xử lý 8085 của intel. Chúng được lập hoặc xóa tùy theo các điều kiện cụ thể sau các thao tác của ALU. Ngoài ra, bộ vi xử lý 8088 còn có các cờ điều khiển sau đây (các cờ này được lập hoặc xóa nhờ các lệnh riêng). T hoặc TF (trap flat) cờ bẫy, TF = 1 thì CPU làm việc ở chế độ chạy từng lệnh (chế độ này dùng khi cần tìm lỗi trong một chương trình). I hoặc IF (interrupt enable flat) cờ cho phép ngắt, IF=1 thì CPU cho phép các yêu cầu ngắt (che ngắt) được tác động. D hoặc DF (direction flat) cờ hướng DF=1 khi CPU làm việc với chuỗi ký tự theo thứ tự từ phải sang trái. Với cờ tràn ta cần phải làm rõ hơn để ta hiểu được bản chất và cơ chế làm việc của nó. Cờ tràn thường được dùng đến khi ta làm việc với số bù hai có dấu, giả thiết ta làm việc với số bù hai có độ dài 8 bit. Kết quả để ở AL gọi C67 là cờ nhớ từ bit 6 lên bit 7. Trong đó b7 là MSB và cũng chính là bit dấu (SF) của AL. Ta có thể chứng minh được rằng quan hệ giữa cờ OF với các cờ CF và C67 tuân theo phương trình sau: OF = CF + C67 Nghĩa là khi thực hiện các phép toán với các số bù hai có dấu, hiện tượng tràn số xảy ra cờ OF = 1 nếu có nhớ từ MSB (tức là từ SF) sang CF nhưng lại không có nhớ vào chính nó (SF) hoặc ngược lại. Điều này có thể tổng quát hóa cho các trường hợp làm việc với số bù hai có dấu với độ dài 16/32 bit. Quá trình tìm nạp lệnh và thực thi lệnh của CPU Việc tìm nạp một lệnh từ Ram hệ thống là một trong những thao tác cơ bản nhất mà CPU phải thực hiện. Quá trình tìm nạp lệnh được thực hiện theo trình tự như sau: Hình 1.5. Hoạt động của Bus cho chu kỳ tìm nạp lệnh - Nội dụng của PC được đặt lên bus địa chỉ. - Tín hiệu điều khiển READ được xác lập, chuyển sang trạng thái tích cực. - Dữ liệu (opcode của lệnh) được đọc từ RAM và đưa lên bus dữ liệu. - opcode được chốt vào thanh ghi lệnh bên trong CPU - PC được tăng để chuẩn bị tìm nạp lệnh kế tiếp từ bộ nhớ. Giai đoạn thực thi lệnh bao gồm việc giải mã opcode và tạo ra các tín hiệu điều khiển, các tín hiệu này điều khiển việc xuất nhập giữa các thanh ghi nội với ALU và thông báo để ALU thực hiện thao tác đã được xác định. 1.1.4. Bộ nhớ chỉ đọc ROM (Read Only Memory) ROM cơ bản: ROM dùng để lưu trữ chương trình điều hành (Monitor) của hệ VXL. Chương trình này sẽ quy định mọi hoạt động của hệ VXL. Bộ VXL sẽ căn cứ vào các lệnh chứa trong chương trình để điều khiển hệ VXL thực hiện các chức năng, nhiệm vụ được ấn định trong lệnh. Nói cách khác, hệ VXL sẽ thực hiện một cách trung thực thuật toán mà người thiết kế phần mềm đã xây dựng và cài đặt vào ROM của hệ. Ngoài ra, ROM trong hệ VXL còn dùng để lưu trữ các bảng biểu, tham số của hệ thống mà trong quá trình hoạt động không được thay đổi như: bảng địa chỉ cổng giao tiếp, các bảng tra cứu số liệu, các bộ mã cần sử dụng trong hệ. ROM cũng được quản lý theo phương thức ma trận điểm, nó có nhiều chủng loại khác nhau: ROM, PROM, EPROM, EEPROM, ROM là bộ nhớ cố định có cấu trúc đơn giản nhất. Nội dung của nó do nhà sản xuất chế tạo, người sử dụng không thể thay đổi nội dung này được nữa. PROM (Programmable ROM - ROM có khả năng lập trình được): Đặc điểm chung: Nội dung của PROM do nhà sản xuất hoặc người thiết kế hệ VXL nạp vào nhưng chỉ đựoc 1 lần. Sau khi nạp xong nội dung này không thể thay đổi được nữa. EPROM (Eraseable PROM ROM nạp/xoá được nhiều lần): EPROM là bộ nhớ cố định có cấu trúc đặc biệt. Nội dung của nó do nhà sản xuất hay người thiết kế hệ VXL nạp vào và có thể nạp/xoá nhiều lần. Người ta tạo ra 1 bit thông tin trong EPROM dựa trên nguyên tắc làm việc của Transistor trường có cực cửa cách ly kênh cảm ứng (MOSFET kênh cảm ứng). EEPROM (Electrical EPROM ROM có khả năng lập trình và xoá được bằng điện). 1.1.5. Bộ nhớ truy cập ngẫu nhiên RAM (Random Acess Memory) RAM là bộ nhớ có thể ghi và đọc được, thông tin trên RAM sẽ bị mất khi mất nguồn cung cấp. Theo phương thức lưu trữ thông tin, RAM được chia thành 2 loại cơ bản: RAM tĩnh và RAM động. RAM tĩnh: Có thể lưu trữ thông tin lâu tuỳ ý miễn là được cung cấp điện năng - tất cả các loại phần tử nhớ bằng Trigơ đều thuộc loại này. RAM động: Chỉ lưu được thông tin trong 1 khoảng thời gian nhất định. Muốn kéo dài thời gian này cần có phương thức làm tươi lại thông tin trong phần tử nhớ RAM. Phần tử nhớ của RAM động đơn giản nhất là một linh kiện điện dung - tụ diện. Sử dụng RAM động có phức tạp nhưng về cấu trúc nhớ lại đơn giản, tiêu tốn ít năng lượng, tăng mật độ bộ nhớ và đôi khi còn làm tăng cả tốc độ làm việc của bộ nhớ. Cấu trúc mạch điện của các bộ nhớ RAM rất đa dạng cả về công nghệ chế tạo chúng (TTL, MOS, ) và các yêu cầu sử dụng chúng như các yêu cầu về ghép nối, tốc độ làm việc, mật độ linh kiện và dung lương cần thiết 1.1.6. Các thiết bị xuất nhập I/O 1.2. Các hệ thống số 1.2.1. Hệ thống số thập phân Hệ đếm thập phân còn gọi là hệ đếm cơ số mười và nó được biểu diễn bởi 10 con số từ (0,1,2,3,4,5,6,7,8,9 ) những con số này được sử dụng rất nhiều trong khoa học kỹ thuật cũng như trong đời sống hàng ngày, khi biểu diễn số thập phân thì dứng sau dãy số thường có chữ D. Ví dụ: Ba nghìn Chin trăm Bảy mươi Tám được biểu diễn như sau 3978 = 3x103 + 9x102 + 7x101 + 8x100 = 3000 + 900 + 70 + 8 1.2.2. Hệ thống số nhị phân Hệ đếm nhị phân còn gọi là hệ đếm cơ số hai và nó được biểu diễn bởi 2 con số là 0 và 1, trong kỹ thuật điện tử số thì số 0 gọi là mức logic thấp ứng với điện áp thấp, số 1gọi là mức logic cao tương ứng với điện áp cao nhất. Mỗi ký hiệu 0 hoặc 1 được gọi là 1 Bit (Binary Digit), khi biểu diễn số nhị phân thì dứng sau dãy số phải có chữ B. Ví dụ: 1100b ; gọi là 1 nibble 1001 1001b ; gọi là 1 Byte 1010 1011 1100 1101b ; gọi là 1 Word Trong dãy số nhị phân được biểu diễn thì số nhị phân sát phải gọi là bít LSB còn số nhị phân sát trái gọi là bít MSB Ví dụ: 1 1 0 0 1 1 1 0 MSB LSB Số nhị phân thường được biểu diễn ở 2 dạng là số nhị phân có dấu và số nhị phân không dấu, nếu số nhị phân không dấu sẽ chỉ biểu diễn các số không âm (³0) còn số nhị phân có dấu thì biểu diễn được cả giá trị âm Ví dụ : (1101) = 1x23 + 1x22 + 0x21 + 1x20 = 8 + 4 + 0 + 1 = 13 Giải giá trị của các số có dấu 8 bit là: -128 đến 127 Giải giá trị của các số có dấu 16 bit là: -32768 đến 32767 Trong khi biểu diễn dãy số nhị phân có dấu thì người ta sử dụng bít MSB để quy ước cho bít dấu, với bít 0 cho dãy số nhị phân dương còn bít 1 cho dãy số nhị phân âm. 1.2.3. Hệ thống số bát phân (BCD-Binary Coded Decimal) Số đếm BCD được định nghĩa là số thập phân nhưng được biểu diễn dưới dạng nhị phân 4 bít, nhưng dãy số nhị phân 4 bít này khi quy sang hệ thập phân thì giá trị của nó phải £ 9 .Trong kỹ thuật điện tử nói chung thì mã BCD được sử dụng để giải mã hiển thị LED bảy thanh Ví dụ: (0011), (0100), (0101), (0110), (1001) ; đây gọi là số BCD không nén Ví dụ: (00110100), (01010110), (01111000) ; đây gọi là số BCD nén Dưới đây là bảng các mã BCD Thập phân BCD 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 Ví dụ: số 15 biểu diễn dưới dạng BCD: 0001 0101 1.2.4. Hệ thống số thập lục (Hexadecimal) Hệ đếm thập phân còn gọi là hệ đếm cơ số mười sáu và nó được biểu diễn bởi 16 ký số (0,1,2,3,4,5,6,7,8,9,B,C,D,E,F) những con số này được sử dụng rất nhiều trong khoa học kỹ thuật đặc biệt là khoa học máy tính vì biểu diễn mã Hexa rất ngắn gọn, khi biểu diễn số thập lục phân thì sau dãy số phải có chữ H. Ví dụ: 3978h , 12CCh, 1998h, ABCDh, 2008h 1.2.5. Số bù hai Trong kỹ thuật Vi xử lý để biểu diễn một con số nào đó dưới dạng dãy số nhị phân thì ngoài việc biểu diễn số không dấu, số có dấu thì người ta còn sử dụng cách biểu diễn số bù 2. Vậy số bù 2 sẽ biểu diễn như thế nào? Ví dụ: Hãy biểu diễn dãy số A = 10011001 sang số bù 2 của nó: b1: Tìm số bù 1 của A(bằng cách lấy bù tất cả các bit của A): 01100110 b2: Tìm số bù 2 của A (bằng cách lấy số bù 1 cộng cho 1) : 01100111 đến đây ta nhận thấy rằng số bù 2 của một số nào đó nó chính là số đối của nó và tổng =0 1.2.6. Các phép toán số học đối với hệ nhị phân a. phép cộng nhị phân không dấu Quy ước: 0 + 0 = 0 0 + 1 = 1 1 + 1 = 0 nhớ 1 Ví dụ: Cho 2 số nhị phân như sau A = 10010011 ; B = 00111001 hãy tìm tổng Y của 2 số nhị phân đã cho b. Phép trừ nhị phân Quy ước: 0 – 0 = 0 0 – 1 = 1 mượn 1 1 – 0 = 1 1 – 1 = 0 Ví dụ : Cho 2 số nhị phân như sau A = 10010011 ; B = 00111001 hãy tìm hiệu Z của 2 số nhị phân đã cho (Lưu ý rằng phép trừ có thể thực hiện bằng cách biến thành phép cộng bằng cách cộng với số bù 2 ) c. Phép nhân nhị phân Ví dụ : Cho 2 số nhị phân như sau A = 00100101 ; B = 00000100 hãy tìm tích F Khi nhân 2 dãy số nhị phân với nhau thì ta đặt phép toán nhân giống như nhân số thập phân, kết quả của phép nhân 2 dãy số nhị phân 8 bít sẽ thu được dãy số nhị phân là 16 bít, như vậy ta có F = A*B = 0000000010010100b d. Phép chia nhị phân Ví dụ : Cho 2 số nhị phân như sau A = 10010110 ; B = 00000100 hãy tìm thương Khi chia 2 dãy số nhị phân với nhau thì ta đặt phép toán chia cũng giống như khi chia 2 số thập phân, kết quả của phép chia cũng như phần dư (nếu có) thu được tương tự như khi làm phép chia đối với số thập phân, như vậy ta có M = A/B = 00100101b dư 0010b 1.2.7. Chuyển đổi qua lại giữa các hệ thống số Chuyển đổi số thập phân sang nhị phân : Để chuyển đổi số thập phân sang số nhị phân người ta thường dùng phương pháp lấy số thập phân cần chuyển rồi chia 2 liên tiếp đến khi không thể chia được nữa thì dừng Ví dụ : Chuyển số thập phân 25 sang số nhị phân không dấu Chia 2 Thương số Dư số 25/2 = 12 1 LSB 12/2 = 6 0 6/2 = 3 0 3/2 = 1 1 1/2 = 0 1 MSB Kết quả thu được là: 11001 với số dư lần thứ nhất là bít có trọng số nhỏ nhất Chuyển đổi số nhị phân sang thập phân : Để chuyển đổi số nhị phân sang số thập phân người ta thường dùng phương pháp lấy tổng của tích n các số nhị phân cần chuyển nhân với 20 đến 2N-1 hay theo biểu thức tổng quát như sau: A = B(N-1)* 2(N-1) + B(N-2)* 2(N-2) + B(N-3)* 2(N-3) + + B(1)* 2(1) + B(0)* 2(0) Ví dụ : Chuyển số nhị phân không dấu 01011110b sang số thập phân A = 0*27 + 1*26 +0*25 + 1*24+ 1*23 + 1*22 + 1*21 + 0*20 = 94 như vậy ta có 01011110b = 94 Chuyển đổi số nhị phân sang Hexa : Ví dụ : Chuyển số nhị phân 1100101011111110 sang số hexa Trước hết ta chia số nhị phân đã cho thành các nhóm 4-bit tính từ bít có trọng số nhỏ nhất, sau đó thay thế mỗi nhóm 4-bit bằng ký hiệu hexa tương ứng với nó ta sẽ thu được kết quả như sau: 1100 1010 1111 1110 Kết quả CAFEh C A F E Chuyển đổi số Hexa sang nhị phân: Ví dụ : Chuyển số hexa 2F8h và ABBAh sang số nhị phân Tương tự như trường hợp trên ta sẽ thay thế mỗi ký hiệu hexa bằng 4-bit nhị phân tương ứng với nó và ta sẽ thu được kết quả như sau: (tham khảo chuyển đổi nhị phân sang hexa). Mã ASCII: (American Standard Code for Information Interchange ) Quá trình trao đổi thông tin trong máy tính nói chung cũng như quá trình xử lý thông tin của các bộ vi xử lý, tất cả các thông tin đều được biểu diễn dưới dạng các số 0 và 1. Mỗi tổ hợp số 0 hoặc 1 được gán một ký tự chữ cái, chữ số hoặc một ký tự đặc biệt nào đó. Khi thông tin được truyền đi, được lưu giữ trong bộ nhớ và hiển thị trên màn hình đều ở dưới dạng ký tự và tuân theo một loại mã chuẩn được sử dụng rất rộng rãi gọi là mã ASCII. Chương 2 BỘ VI ĐIỀU KHIỂN 8051 2.1. Khái quát chung về các bộ vi điều khiển Vi điều khiển (VĐK) là một “hệ” Vi xử lý (VXL) được tổ chức trong một chip. Nó bao gồm: Bộ VXL (CPU) Bộ nhớ chương trình (ROM/EPROM/EEPROM/FLASH). Bộ nhớ dữ liệu (RAM). Các thanh ghi chức năng, các cổng I/O, cơ chế điều khiển ngắt và truyền tin nối tiếp. Các bộ thời gian dùng trong lĩnh vực chia tần và tạo thời gian thực. Bộ VĐK có thể được lập trình để điều khiển các thiết bị thông tin, viễn thông, thiết bị đo lường, thiết bị điều chỉnh cũng như các ứng dụng trong công nghệ thông tin và kỹ thuật điều khiển tự động. Có thể xem bộ VĐK như một hệ VXL On-chip, đối với AT89C51, nó có đầy đủ chức năng của một hệ VXL 8 bit, đựoc điều khiển bởi một hệ lệnh, có số lệnh đủ mạnh, cho phép lập trình bằng hợp ngữ (Assembly, C). Các thành viên khác của họ 8051 Có hai bộ vi điều khiển thành viên khác của họ 8052 là 8031 và 8052 a- Bé vi ®iÒu khiÓn 8052: Bé vi ®iÒu khiÓn 8052 lµ mét thµnh viªn kh¸c cña hä 8051, 8052 cã tÊt c¶ c¸c ®Æc tÝnh chuÈn cña 8051 ngoµi ra nã cã thªm 128 byte RAM vµ mét bé ®Þnh thêi n÷a. Hay nãi c¸ch kh¸c lµ 8052 cã 256 byte RAM vµ 3 bé ®Þnh thêi. Nã còng cã 8K byte ROM. Trªn chÝp thay v× 4K byte nh­ 8051. Xem b¶ng 1.4. B¶ng2.1: so s¸nh c¸c ®Æc tÝnh cña c¸c thµnh viªn hä 8051. §Æc tÝnh 8051 8052 8031 ROM trªn chÝp 4K byte 8K byte OK RAM 128 byte 256 byte 128 byte Bé ®Þnh thêi 2 3 2 Ch©n vµo - ra 32 32 32 Cæng nèi tiÕp 1 1 1 Nguån ng¾t 6 8 6 Nh­ nh×n thÊy tõ b¶ng 1.4 th× 8051 lµ tËp con cña 8052. Do vËy tÊt c¶ mäi ch­¬ng tr×nh viÕt cho 8051 ®Òu ch¹y trªn 8052 nh­ng ®iÒu ng­îc l¹i lµ kh«ng ®óng. b- Bé vi ®iÒu khiÓn 8031: Mét thµnh viªn kh¸c n÷a cña 8051 lµ chÝp 8031. ChÝp nµy th­êng ®­îc coi nh­ lµ 8051 kh«ng cã ROM trªn chÝp v× nã cã OK byte ROM trªn chÝp. §Ó sö dông chÝp nµy ta ph¶i bæ xung ROM ngoµi cho nã. ROM ngoµi ph¶i chøa ch­¬ng tr×nh mµ 8031 sÏ n¹p vµ thùc hiÖn. So víi 8051 mµ ch­¬ng tr×nh ®­îc chøa trong ROM trªn chÝp bÞ giíi h¹n bëi 4K byte, cßn ROM ngoµi chøa ch­¬ng trinh ®­îc g¾n vµo 8031 th× cã thÓ lín ®Õn 64K byte. Khi bæ xung cæng, nh­ vËy chØ cßn l¹i 2 cæng ®Ó thao t¸c. §Ó gi¶i quyÕt vÊn ®Ò nµy ta cã thÓ bæ xung cæng vµo - ra cho 8031. Phèi phÐp 8031 víi bé nhí vµ cæng vµo - ra ch¼ng h¹n víi chÝp 8255 ®­îc tr×nh bµy ë ch­¬ng 14. Ngoµi ra cßn cã c¸c phiªn b¶n kh¸c nhau vÒ tèc ®é cña 8031 tõ c¸c h·ng s¶n xuÊt kh¸c nhau. c. C¸c bé vi ®iÒu khiÓn 8051 tõ c¸c h·ng kh¸c nhau. MÆc dï 8051 lµ thµnh viªn phæi biÕn nhÊt cña hä 8051 nh­ng chóng ta sÏ thÊy nã trong kho linh kiÖn. §ã lµ do 8051 cã d­íi nhiÒu d¹ng kiÓu bé nhí kh¸c nhau nh­ UV - PROM, Flash vµ NV - RAM mµ chóng ®Òu cã sè ®¨ng ký linh kiÖn kh¸c nhau. ViÖc bµn luËn vÒ c¸c kiÓu d¹ng bé nhí ROM kh¸c nhau sÏ ®­îc tr×nh bµy ë ch­¬ng 14. Phiªn b¶n UV-PROM cña 8051 lµ 8751. Phiªn b¶n Flash ROM ®­îc b¸n bëi nhiÒu h·ng kh¸c nhau ch¼ng h¹n cña Atmel corp víi tªn gäi lµ AT89C51 cßn phiªn b¶n NV-RAM cña 8051 do Dalas Semi Conductor cung cÊp th× ®­îc gäi lµ DS5000. Ngoµi ra cßn cã phiªn b¶n OTP (kh¶ tr×nh mét lÇn) cña 8051 ®­îc s¶n xuÊt bëi rÊt nhiÒu h·ng. Bé vi ®iÒu khiÓn 8751: ChÝp 8751 chØ cã 4K byte bé nhí UV-EPROM trªn chÝp. §Ó sö dông chÝp nµy ®Ó ph¸t triÓn yªu cÇu truy cËp ®Õn mét bé ®èt PROM còng nh­ bé xo¸ UV- EPROM ®Ó xo¸ néi dung cña bé nhí UV-EPROM bªn trong 8751 tr­íc khi ta cã thÓ lËp tr×nh l¹i nã. Do mét thùc tÕ lµ ROM trªn chÝp ®èi víi 8751 lµ UV-EPROM nªn cÇn ph¶i mÊt 20 phót ®Ó xo¸ 8751 tr­íc khi nã cã thÓ ®­îc lËp tr×nh trë l¹i. §iÒu nµy ®· dÉn ®Õn nhiÒu nhµ s¶n xuÊt giíi thiÖu c¸c phiªn b¶n Flash Rom vµ UV-RAM cña 8051. Ngoµi ra cßn cã nhiÒu phiªn b¶n víi c¸c tèc ®é kh¸c nhau cña 8751 tõ nhiÒu h·ng kh¸c nhau. Bé vi ®iÒu khiÓn AT8951 tõ Atmel Corporation. ChÝp 8051 phæ biÕn nµy cã ROM trªn chÝp ë d¹ng bé nhí Flash. §iÒu nµy lµ lý t­ëng ®èi víi nh÷ng ph¸t triÓn nhanh v× bé nhí Flash cã thÓ ®­îc xo¸ trong vµi gi©y trong t­¬ng quan so víi 20 phót hoÆc h¬n mµ 8751 yªu cÇu. V× lý do nµy mµ AT89C51 ®Ó ph¸t triÓn mét hÖ thèng dùa trªn bé vi ®iÒu khiÓn yªu cÇu mét bé ®èt ROM mµ cã hç trî bé nhí Flash. Tuy nhiªn l¹i kh«ng yªu cÇu bé xo¸ ROM. L­u ý r»ng trong bé nhí Flash ta ph¶i xo¸ toµn bé néi dung cña ROM nh»m ®Ó lËp tr×nh l¹i cho nã. ViÖc xo¸ bé nhí Flash ®­îc thùc hiÖn bëi chÝnh bé ®èt PROM vµ ®©y chÝnh lµ lý do t¹i sao l¹i kh«ng cÇn ®Õn bé xo¸. §Ó lo¹i trõ nhu cÇu ®èi víi mét bé ®èt PROM h·ng Atmel ®ang nghiªn cøu mét phiªn b¶n cña AT 89C51 cã thÓ ®­îc lËp tr×nh qua cæng truyÒn th«ng COM cña m¸y tÝnh IBM PC . B¶ng 2.2: C¸c phiªn b¶n cña 8051 tõ Atmel (Flash ROM). Sè linh kiÖn ROM RAM Ch©n I/O Timer Ng¾t Vcc §ãng vá AT89C51 4K 128 32 2 6 5V 40 AT89LV51 4K 128 32 2 6 3V 40 AT89C1051 1K 64 15 1 3 3V 20 AT89C2051 2K 128 15 2 6 3V 20 AT89C52 8K 128 32 3 8 5V 40 AT89LV52 8K 128 32 3 8 3V 40 Còng cã nh÷ng phiªn b¶n ®ãng vá vµ tèc ®é kh¸c nhau cña nh÷ng s¶n phÈm trªn ®©y. Xem b¶ng 1.6. VÝ dô ®Ó ý r»ng ch÷ “C” ®øng tr­íc sè 51 trong AT 89C51 -12PC lµ ký hiÖu cho CMOS “12” ký hiÖu cho 12 MHZ vµ “P” lµ kiÓu ®ãng vá DIP vµ ch÷ “C” cuèi cïng lµ ký hiÖu cho th­¬ng m¹i (ng­îc víi ch÷ “M” lµ qu©n sù ). Th«ng th­êng AT89C51 - 12PC r¸t lý t­ëng cho c¸c dù ¸n cña häc sinh, sinh viªn. B¶ng 2.3: C¸c phiªn b¶n 8051 víi tèc ®é kh¸c nhau cña Atmel. M· linh kiÖn Tèc ®é Sè ch©n §ãng vá Môc ®Ých AT89C51-12PC 42MHZ 40 DTP Th­¬ng m¹i Bé vi ®iÒu khiÓn DS5000 tõ h·ng Dallas Semiconductor. Mét phiªn b¶n phæ biÕn kh¸c n÷a cña 8051 lµ DS5000 cña h·ng Dallas Semiconductor. Bé nhí ROM trªn chÝp cña DS5000 ë d­íi d¹ng NV-RAM. Kh¶ n¨ng ®äc/ ghi cña nã cho phÐp ch­¬ng tr×nh ®­îc n¹p vµo ROM trª...ghi có chức năng đặc biệt và được truy cập bằng địa chỉ trực tiếp. Các lệnh truy cập bộ nhớ dữ liệu nội trú - MOV A, : Chuyển dữ liệu từ toán hạng nguồn (các ô nhớ, thanh ghi có địa chỉ trực tiếp hoặc gián tiếp trong on chip, các giá trị trực hằng chứa trong câu lệnh) vào thanh ghi tích luỹ. - MOV , : Chuyển dữ liệu từ toán hạng nguồn vào toán hạng đích (các ô nhớ, thanh ghi có địa chỉ trực tiếp hoặc gián tiếp trong on chip). - MOV , A : Chuyển dữ liệu từ A vào toán hạng đích. - MOV DPTR, #data16: Chuyển giá trị hằng 16 bit vào thanh ghi con trỏ dữ liệu. - PUSH : Chuyển giá trị từ toán hạng nguồn vào ngăn xếp. - POP : Chuyển giá trị từ ngăn xếp vào toán hạng đích. - XCH A, : Chuyển đổi dữ liệu giữa toán hạng nguồn dạng byte vớiA. - XCHD A, @Ri: Chuyển đổi nửa thấp của A với nội dung trong RAM tại địa chỉ là nội dung của Ri. Hình 2.5. Sẽ minh họa bản đồ bộ nhớ RAM trong của 80C51/89C51 Hình 2.6. 128 byte của RAM trong 2.7.3. Bộ nhớ chương trình và bộ nhớ dữ liệu ngoại trú Để tăng khả năng ứng dụng trong các lĩnh vực điều khiển, đo lường Bộ VĐK cho phép mở rộng không gian nhớ RAM ngoài đến 64 Kbyte và ROM ngoài đến 64 Kbyte khi cần thiết. Các IC giao tiếp ngoại vi cũng có thể được thêm vào để mở rộng khả năng xuất/nhập và chúng trở thành 1 phần của không gian nhớ dữ liệu ngoài. Khi bộ nhớ ngoài được sử dụng, cổng P0 không còn đảm nhận chức năng xuất/nhập nữa, mà nó trở thành kênh địa chỉ (A0A7) và kênh dữ liệu đa hợp (D0D7). Ngõ ra ALE chốt byte thấp của địa chỉ ở thời điểm bắt đầu của mỗi 1 chu kỳ bộ nhớ ngoài. Cổng P2 thường được dùng làm byte cao của kênh địa chỉ. Hoạt động của các bộ nhớ ngoài thường được thực hiện theo kiểu sắp xếp đa hợp, nghĩa là: trong nửa chu kỳ đầu của chu kỳ bộ nhớ, byte thấp của địa chỉ được cung cấp bởi cổng P0 và được chốt nhờ tín hiệu ALE. Mạch chốt giữ cho byte thấp của địa chỉ ổn định trong cả chu kỳ bộ nhớ. Trong nửa chu kỳ sau của bộ nhớ, cổng P0 được sử dụng làm kênh dữ liệu, lúc này dữ liệu có thể được đọc hoặc ghi. 2.7.3.1. Bộ nhớ chương trình ngoại trú: Để tăng khả năng ứng dụng trong các lĩnh vực điều khiển, đo lường Bộ VĐK cho phép mở rộng không gian nhớ RAM ngoài đến 64 Kbyte và ROM ngoài đến 64 Kbyte khi cần thiết. Các IC giao tiếp ngoại vi cũng có thể được thêm vào để mở rộng khả năng xuất/nhập và chúng trở thành 1 phần của không gian nhớ dữ liệu ngoài. Khi bộ nhớ ngoài được sử dụng, cổng P0 không còn đảm nhận chức năng xuất/nhập nữa, mà nó trở thành kênh địa chỉ (A0A7) và kênh dữ liệu đa hợp (D0D7). Ngõ ra ALE chốt byte thấp của địa chỉ ở thời điểm bắt đầu của mỗi 1 chu kỳ bộ nhớ ngoài. Cổng P2 thường được dùng làm byte cao của kênh địa chỉ. Hoạt động của các bộ nhớ ngoài thường được thực hiện theo kiểu sắp xếp đa hợp, nghĩa là: trong nửa chu kỳ đầu của chu kỳ bộ nhớ, byte thấp của địa chỉ được cung cấp bởi cổng P0 và được chốt nhờ tín hiệu ALE. Mạch chốt giữ cho byte thấp của địa chỉ ổn định trong cả chu kỳ bộ nhớ. Trong nửa chu kỳ sau của bộ nhớ, cổng P0 được sử dụng làm kênh dữ liệu, lúc này dữ liệu có thể được đọc hoặc ghi. Hình 2.7. Truy cập bộ nhớ chương trình ngoài Hình 2.8. Đồ thị thời gian quá trình nhận lệnh từ ROM ngoài Bộ nhớ chương trình ngoài là bộ nhớ chỉ đọc, được cho phép bởi tín hiệu /PSEN. Khi có một EPROM ngoài được sử dụng, cả P0 và P2 đều không còn là các cổng I/O nữa. Khi bộ VĐK truy cập bộ nhớ chương trình ngoại trú, nó luôn sử dụng kênh địa chỉ 16 bit thông qua P0 và P2. Một chu kỳ máy của bộ VĐK có 12 chu kỳ dao động. Nếu bộ dao động trên chip có tần số 12 MHz, thì 1 chu kỳ máy dài 1µs. Trong một chu kỳ máy điển hình, ALE có 2 xung và 2 Byte của lệnh được đọc từ bộ nhớ chương trình (nếu lệnh chỉ có 1 byte thì byte thứ 2 được loại bỏ). Khi truy cập bộ nhớ chương trình ngoại trú, bộ VĐK phát ra 2 xung chốt địa chỉ trong mỗi chu kỳ máy. Mỗi xung chốt tồn tại trong 2 chu kỳ dao động từ P2-S1 đến P1-S2, và từ P2-S4 đến P1-S5. Để địa chỉ hoá bộ nhớ chương trình ngoại trú, byte thấp của địa chỉ (A0A7) từ bộ đếm chương trình của bộ VĐK được xuất qua cổng P0 tại các trạng thái S2 và S5 của chu kỳ máy, byte cao của địa chỉ (A8A15) từ bộ đếm chương trình được xuất qua cổng P2 trong khoảng thời gian của cả chu kỳ máy. Tiếp theo xung chốt, bộ VĐK phát ra xung chọn /PSEN. Mỗi chu kỳ máy của chu kỳ lệnh gồm 2 xung chọn, mỗi xung chọn tồn tại trong 3 chu kỳ dao động từ P1-S3 đến hết P1-S4 và từ P1-S6 đến hết P1-S1 của chu kỳ máy tiếp theo. Trong khoảng thời gian phát xung chọn thì byte mã lệnh được đọc từ bộ nhớ chương trình để nhập vào On chip. 2.7.3.2. . Bộ nhớ dữ liệu ngoại trú Hình 2.9. Truy cập bộ nhớ dữ liệu ngoài Hình 2.10. Đồ thời gian chu kỳ đọc dữ liệu từ RAM ngoài Hình 2.11. Đồ thị thời gian chu kỳ ghi dữ liệu vào RAM ngoài * Quá trình ghi dữ liệu vào bộ nhớ ngoại trú: Tương tự như quá trình đọc dữ liệu, nhưng ở đây dùng tín hiệu điều khiển ghi /WR. * Các lệnh truy cập bộ nhớ dữ liệu ngoại trú: - MOVX A, @Ri: Chuyển (đọc) dữ liệu 8 bit từ ô nhớ của RAM ngoài tại địa chỉ được xác đinh trong thanh ghi của băng thanh ghi hiện hành vào A. - MOVX @Ri, A: Chuyển (ghi) dữ liệu 8 bit từ A vào ô nhớ của RAM ngoài tại địa chỉ được xác định trong thanh ghi của băng thanh ghi hiện hành. - MOVX A,@DPTR: Chuyển (đọc) dữ liệu 16 bit từ ô nhớ của RAM ngoài tại địa chỉ được xác đinh trong thanh ghi con trỏ dữ liệu vào A. - MOVX @DPTR, A: Chuyển (ghi) dữ liệu 16 bit từ A vào ô nhớ của RAM ngoài tại địa chỉ được xác định trong thanh ghi con trỏ dữ liệu. Ví dụ: MOV R0, #4Fh MOVX A,@R0 Sẽ chuyển nội dung ở RAM ngoài tại địa chỉ 4Fh vào A. 2.8. Cơ chế ngắt trong On-chip 80C51 2.8.1. Khái niệm về ngắt ( GV :Lấy ví dụ minh họa) Ngắt là sự đáp ứng các sự kiện bên trong hoặc bên ngoài nhằm thông báo cho bộ vi điều khiển biết thiết bị đang cần phục vụ 2.8.2. Phân loại ngắt trong 8051/8951 (bảng địa chỉ vetor) Vi điều khiển AT89C51có tất cả 5 nguyên nhân gây ra hiện tượng ngắt quãng của chương trình. Trong 5 nguyên nhân gây ra ngắt gồm có : 2 ngắt ngoài (/INT0 và /INT1), 2 ngắt cờ tràn của khối thời gian (Timer 0, 1), và 1 ngắt cổng truyền tin nối tiếp. Mỗi nguồn ngắt có thể được kích hoạt hoặc không kích hoạt bằng cách đặt hoặc xoá Bit ở trong IE. IE cũng chứa bit có thể không cho tất cả các ngắt hoạt động EA (Nếu EA=0). Các ngắt ngoài có thể được kích hoạt theo mức hoặc theo sườn xung, tuỳ thuộc vào giá trị của các bit IT0, IT1 trong TCON. Ngắt ngoài có 2 cờ ngắt tương ứng là IE0, IE1 cũng nằm trong thanh ghi TCON. Khi một ngắt được thực hiện thì cờ ngắt tương ứng của nó bị xoá bằng phần cứng. Chương trình con phục vụ ngắt ngoài hoạt động chỉ khi ngắt được kích hoạt theo sườn xung. Nếu ngắt đựơc kích hoạt theo mức thì nguồn yêu cầu ngắt từ bên ngoài điều khiển cờ ngắt. Khi mỗi ngắt được kích hoạt thì chương trình chính sẽ bị dừng ở địa chỉ đó và nhảy thẳng về địa chỉ vector của ngắt tương ứng, địa chỉ tương ứng của các ngắt được cho trong bảng vector ngắt như sau: Bảng 2.11. Bảng địa chỉ véc tơ của các ngắt Ngắt Nguồn ngắt Địa chỉ Véc tơ External 0 IE0 0003h Timer 0 TF0 000Bh External 1 IE1 0013h Timer 1 TF1 001Bh Serial Port RI hoặc TI 0023h Timer 2 (AT89C52) TF2 hoặc EXF2 002Bh System Reset RST 0000h 2.8.3. Nguyên lý điều khiển ngắt Các cờ ngắt được thiết lập tại thời điểm S5P2 của mỗi chu kỳ máy. Chu kỳ máy tiếp theo sau chu kỳ máy có cờ ngắt được thiết lập, thì chương trình con phục vụ ngắt được thực hiện khi có lệnh gọi LCALL. Lệnh LCALL phát sinh nhưng lại bị cấm hoạt động khi gặp các tình huống sau: a- Đồng thời có ngắt với mức ưu tiên cao hơn hoặc bằng ngắt đang phục vụ. (Một ngắt có mức ưu tiên bằng hoặc cao hơn đang sẵn sàng để được phục vụ) b- Chu kỳ máy hiện hành không phải là chu kỳ máy cuối của lệnh đang thực hiện. c- Lệnh đang thực hiện là RETI hoặc bất kỳ lệnh nào ghi vào thanh ghi IE hoặc IP. Hệ thống ngắt của AT89C51 Bất kỳ một trong 3 điều kiện này xuất hiện sẽ cản trở việc tạo ra LCALL đối với chương trình phục vụ ngắt. Điều kiện 2 đảm bảo rằng, lệnh đang thực hiện sẽ được hoàn thành trước khi trỏ tới bất kỳ chương trình phục vụ nào. Điều kiện 3 đảm bảo rằng, nếu lệnh đang thực hiện là RETI hoặc bất kỳ sự truy cập nào vào IE hoặc IP, thì ít nhất một lệnh nữa sẽ được thực hiện trước khi bất kỳ ngắt nào được trỏ tới. Chu trình kiểm tra vòng được lặp lại với mỗi chu trình máy, và các giá trị được kiểm tra là các giá trị mà đã xuất hiẹn ở thời điểm S5P2 của chu trình máy trước đó. Nếu một chỉ thị ngắt có hiệu lực nhưng không được đáp ứng vì các điều kiện trên và nếu chỉ thị này vẫn chưa có hiệu lực khi điều kiện cản trở được loại bỏ, thì ngắt bị từ chối này sẽ không được phục vụ nữa. LCALL do phần cứng tạo ra sẽ chuyển nội dung của bộ đếm chương trình vào ngăn xếp (Nhưng không ghi vào PSW) và nạp lại cho PC một địa chỉ phụ thuộc vào nguồn gây ra ngắt đang được phục vụ, như bảng địa chỉ vec tơ ngắt (Bảng 7.5) Lệnh RETI thông báo cho bộ VXL rằng thủ tục ngắt này đã kết thúc, sau đó lấy ra 2 Byte từ ngăn xếp và nạp lại cho PC để trả lại quyền điều khiển cho chương trình chính. 2.8.4. Trình tự các bước thực hiện chương trình ngắt Theo đúng trình tự, để sử dụng các ngắt trong Flash Microcontroller, cần thực hiện các bước như sau: - Đặt bit EA ở trong IE mức logic 1. - Đặt bit cho phép ngắt tương ứng ở trong IE mức logic 1. - Bắt đầu chương trình con phục vụ ngắt tại địa chỉ của ngắt tương ứng đó. (Xem bảng địa chỉ Vector của các nguồn ngắt) Ngoài ra, đối với các ngắt ngoài, các chân /INT0, /INT1 phải được đặt mức 1. Và tuỳ thuộc vào ngắt được kích hoạt bằng mức hay sườn xung, mà các bit IT0, IT1 ở trong TCON có thể cần phải đặt mức 1. ITx=0: Kích hoạt bằng mức ITx=1: Kích hoạt bằng sườn xung. 2.8.5. Mức ngắt ưu tiên trong chíp Mỗi nguồn ngắt có thể được lập trình riêng cho 1 hoặc 2 mức ưu tiên bằng cách đặt hoặc xoá 1 bit trong IP của SFR. Mỗi ngắt ưu tiên ở mức thấp có thể được ngắt bằng ngắt ưu tiên ở mức cao hơn nhưng không thể ngắt bằng ngắt có mức ưu tiên ở mức thấp hơn được. Một ngắt ưu tiên ở mức cao có thể được ngắt bởi bất kỳ nguồn ngắt nào khác. Nếu có yêu cầu ngắt của 2 mức ưu tiên cùng nhau (cùng 1 lúc), yêu cầu của mức ưu tiên cao hơn sẽ được phục vụ (Ngắt nào có mức ưu tiên cao hơn sẽ được phục vụ). Nếu các yêu cầu ngắt có cùng mức ưu tiên, thì thứ tự quay vòng bên trong sẽ quyết định ngắt nào được phục vụ. Thứ tự ưu tiên ngắt từ cao xuống thấp của AT89C51 như sau: IE0, TF0, IE1, TF1, RI hoặc TI. 2.8.6. Các ngắt ngoài Vì các chốt ngắt ngoài được tạo mẫu mỗi lần trong mỗi chu trình máy, nên một giá trị cao hoặc thấp của đầu vào sẽ duy trì trong ít nhất là 12 chu kỳ xung nhịp của bộ dao động để đảm bảo tạo mẫu. Nếu ngắt ngoài được kích hoạt bằng sườn xung , thì nguồn ngắt ngoài phải duy trì ở chốt yêu cầu giá trị cao ít nhất 1 chu kỳ máy và sau đó duy trì giá trị thấp ít nhất 1 chu kỳ máy nữa. Việc này được thực hiện để đảm bảo rằng quá trình chuyển tiếp cho thấy chỉ thị yêu cầu ngắt IEx sẽ được xác lập. IEx sẽ tự động được xoá bởi CPU khi thủ tục ngắt đáp ứng được gọi. Nếu ngắt ngoài được kích hoạt theo mức, thì nguồn ngắt bên ngoài phải duy trì cho yêu cầu này có hiêụ lực cho đến khi ngắt đã được yêu cầu thực sự được tạo ra. Sau đó nguồn ngắt ngoài phải huỷ yêu cầu đó trước khi thủ tục phục vụ ngắt hoàn thành, nếu không ngắt khác sẽ được tạo ra. 2.8.7. Vận hành Step Cấu trúc ngắt AT89C51 cho phép thực hiện các bước đơn với sự tham gia của rất ít phần mềm. Như đã lưu ý trước đây, một yêu cầu ngắt sẽ không được đáp ứng khi một ngắt khác có cùng mức ưu tiên vẫn đang hoạt động, nó cũng không được đáp ứng sau khi có lệnh RETI cho đến khi có ít nhất một lệnh khác đã được thực hiện. Do đó mỗi khi một thủ tục ngắt được đưa vào, thì nó không thể được đưa vào lần nữa cho đến khi ít nhất một lệnh của chương trình ngắt được thực hiện. Một cách để sử dụng đặc điểm này đối với hoạt động theo bước đơn lẻ là lập trình cho 1 trong những ngắt ngoài(chẳng hạn /INT0) được kích hoạt theo mức. Nếu chân /INT0 được duy trì ở mức thấp, thì CPU sẽ chuyển ngay đến thủ tục ngắt ngoài 0 và dừng ở đó cho tới khi INT0 được nhận xung từ thấp lên cao rồi xuống thấp. Sau đó nó sẽ thực hiện lệnh RETI, trở lại nhiệm vụ chương trình, thực hiện một lệnh, và ngay sau đó nhập lại thủ tục ngfắt ngoài 0 để đợi xung nhịp tiếp theo của P3.2. Mỗi bước của nhiệm vụ chương trình được thực hiện vào mỗi thời điểm chân P3.2 được nhận xung. 2.9. Nguyên lý truyền tin nối tiếp của On-chip 80C51. Hệ VXL on-chip này truyền tin nối tiếp bằng cổng RxD và TxD, dữ liệu xuất nhập truyền qua cổng nối tiếp bằng tốc độ Baud và đều qua vùng đệm nối tiếp SBUF. Cổng truyền nối tiếp là cổng truyền tin 2 chiều, nghĩa là nó có thể đồng thời truyền và nhận thông tin cùng 1 lúc. Nó cũng có khả năng vừa thực hiện chức năng nhận vừa thực hiện chức năng đệm, tức là nó có thể nhận byte kế tiếp trước khi byte được nhận trước đó được đọc từ thanh ghi đệm. (Tuy nhiên, nếu byte đầu tiên vẫn chưa được đọc tại thời điểm nhận của byte thứ 2, thì một trong 2 byte này sẽ bị mất). Điều khiển cổng nối tiếp bằng thanh ghi SCON, trạng thái của 2 bit SM0 và SM1 trong thanh ghi này thiết lập nên 4 chế độ hoạt động giao tiếp nối tiếp chuẩn như sau: Chế độ 0: Dữ liệu nối tiếp vào và ra sẽ thông qua chân RxD. Chân TxD đưa ra xung nhịp đồng hồ. 8 bit dữ liệu được truyền/nhận nối tiếp, với bit LSB được thực hiện đầu tiên. Tốc độ Baud được cố định bằng 1/12 tần số của bộ dao động. Chế độ 1: 10 bit được truyền (thông qua TxD) hoặc nhận (thông qua RxD), trong đó gồm có: 1 bit khởi động (có giá trị 0), 8 bit dữ liệu (đầu tiên là LSB), và 1 bit dừng (có giá trị là 1). Khi nhận, bit dừng được chuyển vào RB8 của thanh ghi SCON. Tốc độ Baud có thể thay đổi được. Chế độ 2: 11 bit được truyền (thông qua TxD) hoặc nhận (thông qua RxD) bao gồm: bit khởi động (có giá trị 0), 8 bit dữ liệu (đầu tiên là LSB), một bit dữ liệu thứ 9 có thể lập trình được, và một bit dừng (có giá trị 1). Khi truyền, bit dữ liệu thứ 9 (TB8 ở trong SCON) có thể được gán giá trị 0 hoặc 1. Chẳng hạn như bit chẵn lẻ (P ở trong PSW) có thể được chuyển vào TB8. Khi nhận, bit dữ liệu thứ 9 được chuyển vào RB8 ở thanh ghi SCON, trong khi bit dừng được lọc bỏ. Tốc độ Baud có thể lập trình được bằng 1/32 hoặc 1/64 tần số bộ dao động. Chế độ 3: 11 bit được truyền (thông qua TxD) hoặc được nhận (thông qua RxD) bao gồm: 1 bit khởi động (có giá trị 0), 8 bit dữ liệu (đầu tiên là LSB), 1 bit dữ liệu thứ 9 có thể lập trình được, và 1 bit dừng (có giá trị 1). Trên thực tế, chế độ 3 giống chế độ 2 ở mọi góc độ trừ tốc độ Baud. Tốc độ Baud ở chế độ 3 là khả biến và được xác định theo bộ Timer 1. Trong cả 4 chế độ trên, việc truyền được bắt đầu bởi bất kỳ một lệnh nào mà sử dụng thanh ghi SBUF như là một thanh ghi đích. Việc nhận được bắt đầu ở chế độ 0 khi RI=0 và REN=1. Đối với các chế độ khác, việc nhận được bắt đầu khi bit REN=1. Kết nối hệ thống(Nguyên lý khởi động/Mạch dao động/Kết nối phần cứng). (Kết nối hệ thống phần cứng, SV xem tài liệu VĐK 8051 của Thầy Tống Văn On) 1. Thiết kế mạch khởi động cho chíp 2. Thiết kế mạch khởi động tự động và bán tự động 3. Thiết kế mạch điều khiển LED đơn 4. Thiết kế mạch điều khiển LED 7 thanh 5. Thiết kế mạch điều khiển động cơ DC, động cơ bước... 7.10.6. Thiết kế mạch điều khiển đèn giao thông Chương 3 TẬP LỆNH CỦA BỘ VI ĐIỀU KHIỂN 80C51/89C51 3.1. Khái quát về tập lệnh của VĐK 80C51/ 89C51 Bộ VĐK có tập lệnh được tối ưu hoá để ứng dụng trong các hệ thống điều khiển, đo lường 8 bit. Để tăng khả năng truy xuất RAM nội trên các dữ liệu nhỏ, các kiểu định địa chỉ đặc biệt đã được áp dụng. Ngoài ra tập lệnh của VĐK còn hỗ trợ các biến 1 bit, cho phép quản lý bit trực tiếp trong các hệ logic và điều khiển bit có yêu cầu xử lý bit. Do họ VĐK AT89/80C51 có các mã lệnh 8 bit, nên số lệnh có thể lên đến 256 lệnh (thực tế có 255 lệnh, còn 1 lệnh chưa được định nghĩa). Trong 255 byte thì bao gồm: - 139 lệnh 1 byte - 92 lệnh 2 byte - 24 lệnh 3 byte Mỗi lệnh đều được đặc trưng bởi mã lệnh hay còn gọi là mã máy, mã gợi nhớ, số byte của lệnh và số chu kỳ máy cần để thực thi lệnh. Các lệnh của AT89/80C51 chia thành 5 nhóm lệnh: - Nhóm lệnh di chuyển dữ liệu. - Nhóm lệnh số học. - Nhóm lệnh logic. - Nhóm lệnh rẽ nhánh chương trình. - Nhóm lệnh điều khiển biến logic. 3.2. Một số quy ước và các phương pháp định địa chỉ Các quy ước trong tập lệnh + Rn: Thanh ghi R0-R7 của băng thanh ghi hiện hành đang được chọn để định địa chỉ thanh ghi. + Direct: Địa chỉ 8 bit của ô nhớ dữ liệu nội trú, nó có thể là ô nhớ trong RAM nội hoặc SFR. (00h-FFh) + @Ri: Ô nhớ 8 bit của RAM nội được định địa chỉ gián tiếp thông qua thanh ghi R0 họăc R1. + Source (Src): toán hạng nguồn, có thể là Rn hoặc direct hoặc @Ri. + Dest: Toán hạng đích, có thể là Rn hoặc direct hoặc @Ri. + #Data: Hằng số 8 bit chứa trong lệnh. + #Data16: Hằng số 16 bit chứa trong lệnh. + Bit: Bit được định địa chỉ trực tiếp trong RAM nội trú hoặc SFR. + Rel: Offset 8 bit có dấu (từ -128 đến +127). Nó được lệnh SJMP và các lệnh nhảy có điều kiện sử dụng. + Addr11: địa chỉ 11 bit của bộ nhớ chương trình , thường dùng lệnh ACALL + Addr16: địa chỉ 16 bit của 64Kb bộ nhớ chương trình, thường dùng lệnh LCALL Một số chỉ dẫn thường găp: ORG (Origin): Chỉ dẫn Org để báo địa chỉ bắt đầu của chương trình. Số sau của Org có thể viết dạng mã Hexa, nhị phân hay thập phân... EQU (Equate): Nó được dùng để định nghĩa một hằng số, người ta gán cho nhãn bằng một giá trị hằng số nào đố và khi nhãn xuất hiện trong chương trình thì nhãn sẽ thay cho giá trị hằng số đó. Vậy ưu điểm của việc sử dụng chỉ dẫn EQU là khi trong chương trình mà giá trị của hằng số được sử dụng ở nhiều chỗ khác nhau, nay muốn thay đổi giá trị này thì ta chỉ việc thay một lần giá trị cho nhãn là xong. END: Chỉ dẫn END sẽ báo cho trình dịch biết kết thúc một tập nguồn ASM, tất cả những lệnh sau chỉ dẫn END đều vô nghĩa và bị trình dịch bỏ qua. Quy định tên nhãn: Tên của nhãn thường dùng các từ gợi nhớ và phải là duy nhất không được trùng. Có thể dùng các chữ cái viết hoa hay viết thường, các dấu ghạch chân, dấu chấm, các số 0, 1 , 2 , 3 vv... nhưng không được dùng các từ khoá trùng với các câu lệnh, phía sau của nhãn bao giờ cũng phải có dấu 2 chấm. Các lời chú giải: Trong chương trình mà muồn có lời chú giải thì phía trước lời chú giải phải có dấu chấm phẩy. Tương tự như trong một chương trình mà muốn bỏ qua một câu lệnh nào đó phía trước của câu lệnh cũng phải có dấu chấm phẩy. Các ký hiệu dùng trong mô tả lệnh: Ký hiệu ý nghĩa <- Được thay thế bởi ( ) Nội dung của (( )) Dữ liệu được trỏ bởi rrr 1 trong 8 thanh ghi (R0-R7) của các băng thanh ghi dddddddd Các bit dữ liệu aaaaaaaa Các bit địa chỉ bbbbbbbb địa chỉ của 1 bit i Định địa chỉ gián tiếp thông qua R0 hoặc R1 eeeeeeee Địa chỉ tương đối 8 bit Các phương pháp định địa chỉ Tập lệnh của Vi điều khiển 80C51/89C51 cho phép sử dụng 7 phương pháp định địa chỉ , tuy nhiên ta thường xuyên sử dụng 5 cách : Phương pháp định địa chỉ tức thời Ví dụ: Mov A, # 15h Phương pháp định địa chỉ thanh ghi Ví dụ: Mov A, R2 Phương pháp định địa chỉ trực tiếp Ví dụ: Mov R2, 03h Phương pháp định địa chỉ gián tiếp Ví dụ: Mov A, @ R0 Phương pháp định địa chỉ cơ sở Ví dụ: Movc A, @ a + Dptr Còn 2 cách định địa chỉ còn lại ta sẽ giới thiệu trong quá trình phân tích tập lệnh 3.3. Nhóm lệnh di chuyển dữ liệu. 3.3.1. Lệnh di chuyển dạng Byte Cú pháp câu lệnh: MOV , Chức năng: Sao chép nội dung của toán hạng nguồn vào toán hạng đích, nội dung của toán hạng nguồn không thay đổi. Lệnh này không làm ảnh hưởng tới các cờ và các thanh ghi khác. Câu lệnh Số byte Số Chu kỳ Mã lệnh Hoạt động MOV A, Rn 1 1 11101rrr (A)<-(Rn) MOV A, direct 2 1 11100101 aaaaaaaa (A)<-(direct) MOV A, @Ri 1 1 1110111i (A)<-((Ri)) MOV A, #data 2 1 01110100 dddddddd (A)<-#data MOV Rn, A 1 1 11111rrr (Rn)<-(A)) MOV Rn, direct 2 2 10101rrr aaaaaaaa (Rn)<-(direct) MOV Rn, #data 2 1 01111rrr dddddddd (Rn)<-#data MOV direct, A 2 1 11110101 aaaaaaaa (direct)<-(A) MOV direct, Rn 2 2 10001rrr aaaaaaaa (direct)<-(Rn) MOV direct, direct 3 2 10000101 aaaaaaaa aaaaaaaa (direct)<(direct) MOV direct, @Ri 2 2 1000011i aaaaaaaa (direct)<-((Ri)) MOV direct, #data 3 2 01110101 aaaaaaaa dddddddd (direct)<-#data MOV @Ri, A 1 1 1111011i ((Ri))<-(A) MOV @Ri, direct 2 2 1010011i ((Ri))<-(direct) MOV @Ri, #data 2 1 0111011i dddddddd ((Ri))<-#data Ví dụ 1: Chuyển nội dung của R1 vào RAM trong tại địa chỉ 30h. - Cách 1: Định địa chỉ kiểu thanh ghi và trực tiếp MOV 30h, R1 ; (30h) = (R1) - Cách 2: Định địa chỉ kiểu trực tiếp MOV 30h, 01h ; (30h) = (01h) - Cách 3: Định địa chỉ kiểu gián tiếp MOV R0, #30h ; (R0) = 30h MOV @R0, 01h ; ((R0)) = (01h) Ví dụ 2: Chuyển nội dung 35h vào RAM trong tại địa chỉ 20h. - Cách 1: Định địa chỉ kiểu dữ liệu tức thời và trực tiếp MOV 20h, #35h ; (20h) = 35 - Cách 2: Định địa chỉ kiểu dữ liệu tức thời và gián tiếp MOV R1,#20h ; (R1) = 20h MOV @R1,#35h ; ((R1)) = 35h 3.3.2. Lệnh MOV di chuyển dạng Bít : Cú pháp câu lệnh: MOV , Chức năng: Chuyển bit dữ liệu ở dạng sao chép toán hạng nguồn vào toán hạng đích. Một trong 2 toán hạng phải là cờ nhớ (C), toán hạng còn lại sẽ là bit bất kỳ được định địa chỉ trực tiếp. Lệnh không làm ảnh hưởng tới các thanh ghi khác hoặc các cờ khác. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động MOV C, bit 2 1 10100010 bbbbbbbb (C)<-(bit) MOV bit, C 2 2 10010010 bbbbbbbb (bit)<-(C) Ví dụ: Thiết lập cờ nhớ bằng lệnh MOV MOV A, #80h ; (A) = 80h MOV C, Acc.7 ; (C) =(Acc.7) = 1 8.3.3. Lệnh di chuyển dạng Word Cú pháp câu lệnh: MOV DPTR, #data16 Chức năng: Giá trị 16 bit ở toán hạng thứ 2 trực tiếp trong câu lệnh được nạp vào thanh ghi DPTR. Hằng số 16 bit này được đặt ở byte 2 và byte 3 của lệnh. Byte 2 là byte cao được nạp cho thanh ghi DPH, byte 3 là byte thấp được nạp vào thanh ghi DPL. Lệnh này không ảnh hưởng tới các cờ. Câu lệnh Số byte Sốchu kỳ Mã lệnh Hoạt động MOV DPTR,#data16 3 2 10010000 dddddddd (C)<-(bit) Ví dụ: Trỏ DPTR tới vùng dữ liệu có địa chỉ bắt đầu là 1020h - Cách 1: MOV DPTR,#1020h ; (DPTR) = 1020h - Cách 2: MOV DPH,#10h ; (DPH) = 10h MOV DPL, #20h ; (DPL) = 20h 3.3.4. Lệnh chuyển Byte mã lệnh Cú pháp câu lệnh: MOVC A, @A + Chức năng: Nạp cho thanh ghi tích luỹ byte mã lệnh từ bộ nhớ chương trình. Địa chỉ của byte được tìm nạp trong bộ nhớ là tổng nội dung của thanh ghi A 8 bit với nội dung của thanh ghi cơ sở 16 bit (có thể là DPTR hoặc PC - thanh ghi đếm chương trình). Trong trường hợp sau, PC được tăng để trỏ đến địa chỉ của lệnh tiếp theo ((PC)<-(PC+1)) trước khi được công với nội dung của thanh ghi A, còn thanh ghi DPTR không bị thay đổi. Lệnh không ảnh hưởng tới các cờ. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động MOVC A,@A+DPTR 1 2 10010011 (A)<((A)+(DPTR)) MOVC A,@A+PC 1 2 10000011 (A)<-((A)+(PC)) Ví dụ: Chuyển nội dung tại địa chỉ 1234h ở trong bộ nhớ chương trình ra cổng P1 MOV A, #0 ; (A) = 0 MOV DPTR, #1234h ; (DPTR) = 1234h MOVC A, @A+DPTR ; (A) = ((DPTR)) MOV P1, A ; (P1) = (A) 3.3.5. Lệnh truy xuất dữ liệu ngoài Cú pháp câu lệnh: MOVX , Chức năng: Chuyển dữ liệu giữa thanh ghi tích luỹ với bộ nhớ ngoài. Các lệnh này được chia làm 2 loại, một loại cung cấp địa chỉ 8 bit và 1 loại cung cấp địa chỉ 16 bit. Nếu dữ liệu được chuyển là 8 bit, nội dung của R0 hoặc R1 trong băng thanh ghi hiện hành sẽ cung cấp địa chỉ 8 bit đa hợp với dữ liệu trên P0. 8 bit địa chỉ này đủ để mã hoá cho các cổng I/O mở rộng bên ngoài chip hoặc cho 1 dãy RAM kích thước tương đối nhỏ. Với các dãy RAM có kích thước lớn hơn một chút, một vài chân của cổng bất kỳ nào đó có thể được sử dụng để tạo ra các bit địa chỉ cao. Các chân này nên được điều khiển bởi 1 lệnh xuất đặt trước lệnh MOVX. Nếu dữ liệu được chuyển là 16 bit, thì DPTR tạo ra địa chỉ 16 bit. P2 xuất ra 8 bit địa chỉ cao (nội dung của DPH), còn P0 xuất ra 8 bit địa chỉ thấp đa hợp với dữ liệu.Thanh ghi chức năng đặc biệt P2 duy trì nội dung trước đó trong khi các bộ đệm xuất của P2 đang phát các nội dung của DPH. Dạng này nhanh hơn và hiệu quả hơn khi truy xuất nhiều dãy dữ liệu rất lớn (lên đến 64 Kb) do ta không cần thêm lệnh để thiết lập các cổng khác. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động MOVX A, @Ri 1 2 11100011 (A)<-((Ri)) MOVX @Ri, A 1 2 11110011 ((Ri))<(A) MOVX A, @DPTR 1 2 11100000 (A)<-((DPTR)) MOVX @DPTR, A 1 2 11110000 ((DPTR))<-(A) Ví dụ: Chuyển nội dung 34h vào địa chỉ 1234h ở RAM ngoài MOV A, #34h ; (A) = 34h MOV DPTR, #1234h ; (DPTR) = 1234h MOVX @DPTR, A ; ((DPTR)) = (A) 3.3.6. Lệnh chuyển dữ liệu vào ngăn xếp Cú pháp câu lệnh: PUSH direct Chức năng: Chuyển số liệu có trong câu lệnh vào ngăn xếp. Trước tiên, con trỏ ngăn xếp (SP) được tăng lên 1, sau đó số liệu sẽ được chuyển vào đỉnh của ngăn xếp mà địa chỉ đỉnh này được trỏ bởi SP. Ngăn xếp nằm ở RAM nội trú. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động PUSH direct 2 2 11000000 aaaaaaaa (SP)<-(SP+1) ((SP))<-(direct) Ví dụ: Ghi giá trị 55h vào địa chỉ 35h của ngăn xếp MOV SP,#34h ; (SP) = 34h MOV A, #55h ; (A) = 55h PUSH 0E0h ; (SP) = (SP) + 1 = 35h ; ((SP)) = (A) Ta thấy rằng, khi lệnh PUSH được thực hiện thì giá trị mà SP đang trỏ sẽ tự động tăng lên 1 đơn vị. 3.3.7. Lệnh chuyển dữ liệu ra khỏi ngăn xếp Cú pháp câu lệnh: POP direct Chức năng: Chuyển nội dung của ngăn xếp ở RAM trong, có địa chỉ được SP trỏ tới đến nơi có địa chỉ trực tiếp trong câu lệnh. Sau đó, con trỏ ngăn xếp (SP) được giảm đi 1. Lệnh không ảnh hưởng tới các cờ. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động POP direct 2 2 11010000 aaaaaaaa (direct)<-((SP)) (SP)<-(SP-1) Ví dụ: Chuyển nội dung tại đỉnh ngăn xếp (có địa chỉ 20h) ra A MOV SP,#20h ; (SP) = 20h POP 0E0h ; (A) = ((SP)) ; (SP) = (SP) -1= 1Fh Sau khi thực hiện lệnh POP thì giá trị của SP sẽ giảm đi 1 đơn vị. 3.3.8. Lệnh hoán chuyển dữ liệu Cú pháp câu lệnh: XCH A, Chức năng: Hoán chuyển nội dung giữa thanh ghi A với thanh ghi hoặc bộ nhớ có địa chỉ chứa trong toán hạng thứ 2 của câu lệnh. Toán hạng thứ 2 có thể được định địa chỉ kiểu thanh ghi, thanh ghi trực tiếp hoặc thanh ghi gián tiếp. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động XCH A, Rn 1 1 11001rrr (A)(Rn) XCH A, direct 2 1 11000101 aaaaaaaa (A) (direct) XCH A, @Ri 1 1 1100011i (A) ((Ri)) Ví dụ: Hoán chuyển nội dung của A với nội dung của R1 XCH A, R1 ; (A)(R1) Sau khi thực hiện lệnh XCH thì nội dung của A trước đây sẽ nằm trong thanh ghi R1 còn nội dung của R1 sẽ được chuyển vào A. 3.3.9. Lệnh hoán chuyển nội dung 4 bít thấp Cú pháp câu lệnh: XCHD A, @Ri Chức năng: Hoán chuyển 4 bit thấp nội dung trong thanh ghi A với ô nhớ của RAM bên trong, có địa chỉ được định gián tiếp qua thanh ghi được chỉ ra trong lệnh. Lệnh này không ảnh hưởng tới trạng thái các cờ và nửa cao của các thanh ghi trong lệnh. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động XCHD A, @Ri 1 1 1101011i (A3-A0)((Ri3-Ri0)) Ví dụ: Hoán chuyển 4 bit thấp của A với 4 bit thấp của R5 MOV 30h, R5 ; (30h) = (R5) MOV R0, #30h ; (R0) = 30h XCHD A, @R0 ; (A3-A0)((R0.3-R0.0)) 3.4. Nhóm lệnh số học 3.4.1. Lệnh thực hiện phép cộng Cú pháp của câu lệnh: ADD A, Chức năng: Cộng giá trị 1 byte ở địa chỉ được chỉ ra ở câu lệnh với nội dung trong thanh ghi tích luỹ, kết quả được lưu vào thanh ghi tích luỹ. Nếu có nhớ từ bit số 7 hoặc bit số 3 thì cờ nhớ hoặc cờ nhớ phụ được thiết lập, ngược lại các cờ nêu trên được xoá. Khi cộng 2 số nguyên không dấu mà bị tràn thì cờ nhớ cũng được thiết lập để cho ta biết phép toán bị tràn. Trường hợp thực hiện lệnh ADD mà có nhớ từ bit số 6 nhưng không có nhớ từ bit số 7, hoặc có nhớ từ bit số 7 nhưng không có nhớ từ bit số 6 thì cờ tràn sẽ được thiết lập, ngược lại thì OV bị xoá. Khi cộng 2 số nguyên có dấu mà tổng là 1 số âm thì OV được thiết lập. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động ADD A, Rn 1 1 00101rrr (A)<- (A) + (Rn) ADD A, direct 2 1 00100101 aaaaaaaa (A)<- (A) + (direct) ADD A, @Ri 1 1 0010011i (A)<- (A) + ((Ri)) ADD A, #data 2 1 00100100 dddddddd (A)<- (A) + #data Ví dụ 1: Thực hiện phép tính F = 25h + 34h MOV A, #25h ; (A) = 25h ADD A, #34h ; (A) = (A) + 34h = 59h ; (PSW) = 00h Ví dụ 2: 3.4.2. Lệnh cộng có nhớ Cú pháp của câu lệnh: ADDC A, Chức năng: Cộng đồng thời nội dung của 1 byte ở địa chỉ được chỉ ra trong câu lệnh với nội dung chứa trong thanh ghi tích luỹ và cờ nhớ. Nếu có nhớ từ bit số 7 hoặc số 3 thì cờ nhớ hoặc cờ nhớ phụ được thiết lập bằng 1, ngược lại các cờ nêu trên bị xoá. Khi cộng các số nguyên không dấu mà bị tràn thì cờ nhớ cũng được thiết lập. Trường hợp thực hiện lệnh ADDC mà có nhớ từ bit số 6 nhưng không nhớ từ bit số 7, hoặc có nhớ từ bit só 7 nhưng không nhớ từ bit số 6 thì cờ tràn sẽ được thiết lập, ngược lại cờ này bị xoá. Khi cộng các số nguyên có dấu mà tổng là 1 số âm thì OV được thiết lập. Câu lệnh Số byte Số chu kỳ Mã lệnh Hoạt động ADDC A, Rn 1 1 00110rrr (A)<- (A) + (C) + (Rn) ADDC A, direct 2 1 00110101 aaaaaaaa (A)<- (A) + (C) + (direct) ADDC A, @Ri 1 1 0011011i (A)<- (A) + (C) + ((Ri)) ADDC A, #data 2 1 00110100dddddddd (A)<- (A) + (C) + #data Ví dụ: Thực hiện phép tính F = 25h + 34h + (C) MOV A, #25h ; (A) = 25h SETB C ; (C) = 1 ADDC A, #34h ; (A) = (A) + 34h + (C) = 5Ah ; (PSW) = 00h 3.4.3. Lệnh thực hiện phép trừ Cú pháp của câu lệnh: SUBB A, Chức năng: Trừ thanh ghi tích luỹ cho toán hạng thứ 2 và cờ nhớ, kết quả được lưu vào thanh ghi tích luỹ. Cờ nhớ được đặt bằng 1 nếu có số mượn được cần đến cho bit số 7, ngược lại thì cờ nhớ bị xoá. Cờ nhớ phụ được thiết lập nếu có nhớ cho bit 3. Trường hợp thực hiện lệnh SUBB mà có số mượn được cần đến cho bit 7(không phải cho bit 6), hoặc cho bit 6 (không phải cho bit 7) thì cờ tràn sẽ được thiết lập, ngược lại thì OV bị xoá. Khi trừ các số nguyên có dấu mà kết quả là 1 số âm thì OV được thiết lập. Câu lệnh

Các file đính kèm theo tài liệu này:

  • docde_cuong_bai_giang_vi_xu_ly_8051.doc
Tài liệu liên quan