luôn là một chẵn. Ví dụ nếu ACC chứa 10101101B, P sẽ là 1. Bit Parity thường được liên kết với chương trình truyền nối tiếp có sử dụng parity. Thanh ghi B Thanh ghi B có đòa chỉ F0h, chủ yếu dùng với thanh ghi ACC trong các phép toán nhân và chia. Lệnh MUL AB nhân các số 8 bit không dấu trong thanh ghi A và B. Kết quả là một số 16 bit chứa trong thanh ghi ACC (byte thấp) và B (byte cao). Lệnh DIV B chia thanh ghi ACC cho B. Kết quả thương số được lưu trong thanh ghi ACC số dư được lưu trong thanh ghi B. Thanh ghi B cũng được dùng như những thanh ghi khác và có thể truy xuất bit (đòa chỉ F0h đến F7h) Con trỏ ngăn chồng (stack pointer – SP) Stack – pointer là một thanh ghi 8 bit có đòa chỉ 81H. Nó chứa đòa chỉ hiện thời của đỉnh stack. Khi đẩy dữ liệu vào stack, SP tăng lên một giá trò, tiếp theo dữ liệu được ghi vào stack. Khi lấy dữ liệu ra khỏi stack, dữ liệu được đọc ra trước sau đó SP được giảm. Stack của 8051 nằm trong vùng RAM nội và có thể truy xuất bằng đòa chỉ trực tiếp. 128 bytes đầu tiên đối với 8051/8031 và 256 bytes đối với 8052/8032 trong vùng RAM nội có thể dùng làm stack. Để tạo ra stack bắt đầu tại 60H, ta khởi động thanh ghi SP: MOV SP, #5FH ; Như vậy stack được giới hạn trong 32 bytes. Ta dùng giá trò 5FH vì SP sẽ tăng lên 60H trước khi đẩy dữ liệu đầu tiên vào stack. Khi lập trình ta không cần phải khởi động lại thanh ghi SP vì nó đã được khởi động với giá trò khi reset. Thanh ghi SP chứa giá trò mặc đònh là 07H. Do đó stack mặc đònh bắt đầu tại 08H. Nếu trình không khởi động lại stack thì các thanh ghi 1, 2, 3 không thể sử dụng vì nó được dùng làm stack. Stack được truy xuất một cách rõ ràng bằng các lệnh PUSH, POP để lưu trữ tạm thời hay truy xuất dữ liệu. Nó cũng có thể được truy xuất ngầm khi có các lệnh gọi đến chương trình con. Các lệnh ACALL, LCALL hay ngắt sẽ đẩy thanh ghi đếm chương trình (PC) vào stack. Lệnh RET, RETI trả giá trò trong stack lại cho PC. Con trỏ dữ liệu (DPTR) Con trỏ dữ liệu dùng để truy xuất mã hay dữ liệu từ bộ nhớ ngoài và thanh ghi 16 bit. Thanh ghi này gồm hai thanh ghi DPL (byte thấp, đòa chỉ 82H) và DPH (byte cao, đòa chỉ 83H). Ba lệnh sau đây sẽ ghi giá trò 55H vào RAM ngoài tại đòa chỉ 1000H. MOV A, #55H; MOV DPTR, #1000H; MOV @DPTR, A; Các thanh ghi Port: Các port của 8051 gồm có port 0 đòa chỉ 80H, port 1 đòa chỉ 90H, port 2 đòa chỉ A0H, port 3 đòa chỉ B0H. Các port 0, 2 và 3 không được dùng để xuất nhập nếu đang sử dụng bộ nhớ ngoài. Còn lại port 1 có thể dùng để xuất nhập (I/O). Tất cả các port đều có thể dùng truy xuất bit. Điều này cung cấp cho vi điều khiển khả năng giao tiếp rất mạnh. Ta có thể dùng chân P1.7 để đóng mở động cơ. Chân P1.7 nối với transitor để lái một relay đóng mở động cơ. Lệnh SETB P1.7 mở động cơ. Lệnh CLR P1.7 tắt động cơ. Hai lệnh trên dùng toán tử dấu chấm để xác đònh đòa chỉ bit trong một byte. Các thanh ghi bộ đònh thời: 8051 có hai bộ đònh thời 16 bit. Timer 0 có đòa chỉ 8AH (TL0 byte thấp) và 8DH (TH1 byte cao). Ngoài bộ đònh thời còn có hai thanh ghi: thanh ghi điều khiển TCON đòa chỉ 88H và thanh ghi xác đònh mode cho timer TMOD đòa chỉ 89H. Trong đó chỉ có thanh ghi TCON truy xuất được từng bit. Các thanh ghi cổng nối tiếp: 8051 chứa cổng nối tiếp bên trong MCU để giao tiếp với các thiết bò nối tiếp như thiết bò đầu cuối, modem v.v… Cổng nối tiếp gồm có hai thanh ghi: một thanh ghi đệm SBUF là nạp dữ liệu để truyền đi. Đọc SBUF là nhận dữ liệu đã thu được vào. Các mode truyền có thể được lập trình thông qua thanh ghi điều khiển cổng kế tiếp. Thanh ghi này có thể truy xuất bit và có đòa chỉ 98H. Các thanh ghi ngắt: 8051 có 5 nguồn ngắt và hai mức ưu tiên. Các ngắt bò cấm khi reset hệ thống. Các ngắt được cho phép thông qua thanh ghi IE có đòa chỉ 0AH. Các mức ưu tiên cũng được set bởi thanh ghi IP tại đòa chỉ B8H. Cả hai thanh ghi này đều có thể truy xuất bit. IE có đòa chỉ A8H. Ngắt chỉ được chấp nhận khi thanh ghi này đã được lập trình. Thanh ghi PCON (Power Control Register) Thanh ghi PCON có đòa chỉ 87H, chứa các bits điều khiển linh tinh, được tóm tắt trong bảng 4.4. Bit SMOD nhân đôi tốc độ truyền nối tiếp ở các mode 1, 2 và 3. Các bit 4, 5, 6 không được đònh nghóa. Bit 3 và 2 là hai cờ được tùy ý trong lập trình ứng dụng. Các bit PD (power down) và IDL (idle) đều có trong các họ IC MCS-51 nhưng chỉ với IC dùng CMOS mà thôi. Lệnh set bit IDL là lệnh được thi hành cuối cùng trước khi CPU vào chế độ idle. Ở tín hiệu này chế độ xung clock được ngắt ra khỏi CPU, nhưng không ngắt ra khỏi ngắt quãng, timer và cổng nối tiếp. Trạng thái CPU và nội dung các thanh ghi được bảo toàn. Các chân của cổng song song được giữ ở mức trạng thái của chúng. ALE và PSEN ở mức cao. Các chế độ idle kết thúc khi có bất kỳ một ngắt nào hoặc reset hệ thống, đồng thời bit IDL bò xóa. + Power down Mode it K ý hiệu Mô tả S OMD G F1 G F0 P D I DL Tốc độ kép; khi được set, tốc độ truyền nối tiếp được nhân đôi các chế độ 1,2,3. Không được đònh nghóa “nt” “nt” Cờ dùng cho mục đích tổng quát 1 Cờ dùng cho mục đích tổng quát 2 Power down, set mode power down. Chỉ thoát khi reset Idle mode, set mode idle. Thoát khi có ngắt hoặc reset Bảng 4.4 Tóm tắt thanh ghi PCON Lệnh set bit PD là lệnh cuối cùng trước khi CPU chuyển sang mode power down. Ở chế độ này: (1) bộ dao động nội ngưng hoạt động, (2) các chức năng bò dừng, (3) nội dung RAM nội được giữ ở mức logic của chún, (5) ALE và PSEN ở mức thấp. Chỉ có thể thoát khỏi chế độ này khi reset hệ thống. Khi ở chế độ power down, Vcc có thể giảm đến 2V. Lưu ý cần phải trả lại mức áp 5V cho Vcc khi thoát khỏi chế độ power down. VI – BỘ NHỚ NGOÀI Mở rộng bộ nhớ là một khả năng quan trọng đối với vi điều khiển nhằm tránh gặp bế tắc trong vấn đề thiết kế. Họ MCs-51 có thể mở rộng 64Kbs và bộ nhớ mã lệnh 64Kbs dữ liệu. Các IC giao tiếp ngoại vi cũng có thể thêm vào để tăng năng xuất nhập. Nó trở thành một phần của bộ dữ liệu ngoại và được giải mã I/O như bộ nhớ. Khi bộ nhớ ngoài được sử dụng, port 0 không được dùng làm cổng xuất nhập. Nó trở thành bus dùng để phân kênh đòa chỉ và dữ liệu, ALE chốt nó như là bytes thấp của bus đòa chỉ khi bắt đầu mỗi chu kỳ truy xuất bộ nhớ ngoài. Port 2 thường dùng làm byte cao của bus đòa chỉ. Chu kỳ bộ nhớ A0 A15 Đòa chỉ D0 D7 Dữ liệu (a) Không phân kênh (24 chân) Chu kỳ bộ nhớ AD8 AD15 Đòa chỉ AD0 AD7 Đòa chỉ Dữ liệu (b) Phân kênh (16 chân) Hình 4.5 Phân kênh bus đòa chỉ và bus dữ liệu Hình trên mô tả việc phân kênh và không phân kênh bus đòa chỉ và bus dữ liệu. Nếu không phân kênh, với 16 chân đòa chỉ và 8 chân dữ liệu ta có 24 chân cho bus đòa chỉ và bus dữ liệu. Trong khi đó nếu phân kênh, 8 chân dữ liệu được dùng chung với 8 chân thuộc byte thấp của bus đòa chỉ nên chỉ có 16 chân cho bus đòa chỉ và bus dữ liệu. Điều này có ý nghóa lớn trong việc chế tạo IC. Thứ tự phân kênh như sau : ở nữa chu kỳ đầu, byte thấp của đòa chỉ xuất ra port 0 và được chốt bằng ALE. Byte này được chốt ở bộ chốt trong suốt chu kỳ bộ nhớ. Trong nữa chu kỳ tiếp theo port 0 là bus dữ liệu, có thể xuất nhập tùy ý. Truy xuất bộ nhớ mã lệnh ngoài (External Code memory): Bộ nhớ mã ngoài được đọc bằng tín hiệu PSEN (hình 4.6). Trong một chu kỳ máy ALE tác động 2 lần và 2 bytes được đọc từ bộ nhớ chương trình. Giản đồ thời gian của hoạt động này được gọi là chu kỳ lấy lệnh (hình 4.7). Truy xuất bộ nhớ dữ liệu ngoài (External Code memory): Đây là bộ nhớ chứa dữ liệu, thường là RAM và được truy xuất bởi tín hiệu RD và WR. Dữ liệu này chỉ được truy xuất bằng lệnh MOVX thông qua thanh ghi con trỏ dữ liệu DPTR, hoặc R0, R1. RAM giao tiếp với 8051 giống như EPROM. Ngoại trừ chân RD được nối với chân OE và chân WR được nối với chân W. Còn lại các bus dữ liệu và đòa chỉ nối như EPROM. Với 16 đường đòa chỉ ta có thể có đến 64Kbs cho vùng nhớ dữ liệu. Giản đồ thời gian của viêc đọc vùng nhó dữ liệu ngoài khi thi hành lệnh “MOV A,@DPRT” được cho ở hình 4.8. Lưu ý chỉ có chân RD được dùng cho phép RAM. Giản đồ thời gian của việc ghi cũng tương tự từ đường WR xuống mức thấp và dữ liệu xuất ra port 0. Port 2 có thể không dùng làm byte cao của bus đòa chỉ trong hệ thống không sử dụng vùng nhớ mã ngoài mà sử dụng vùng nhớ dữ liệu ngoài nhỏ. Tám bit đòa chỉ có thể truy xuất được một vùng nhớ 256 bytes, được gọi là một trang bộ nhớ. Nếu vùng nhớ này lớn hơn 256 bytes ta có thể dùng thêm một vài chân của port 2 để chọn trang. Khi truy xuất một trang (256 bytes) của vùng dữ liệu ngoài ta có thể dùng R0 hoặc R1 để làm con trỏ đòa chỉ trỏ đến byte dữ liệu cần truy xuất. Ví dụ những lệnh đọc nội dung của RAM ngoài có đòa chỉ 0050H vào thanh tích lũy. MOV R0, #50H ; MOV A, @R0 ; Giải mã đòa chỉ: Nếu 8051 sử dụng cả EPROM và RAM ngoài đòi hỏi phải giải mã đòa chỉ. Việc giải mã đòa chỉ rất quen thuộc đối với hầu hết vi xử lý. Ví dụ nếu dùng EPROM 8K và RAM 8K, bus đòa chỉ giải mã để chọn IC giới hạn trong 8Kbytes: 0000H đến 1FFFH, và 2000H đến 3FFFH, v.v… Thông thường ta dùng IC giải mã 74138 với ngõ vào là 3 bits cao nhất của bus đòa chỉ. Do đó mỗi ngõ tương ứng với 8Kbs. Các ngõ ra này đưa vào các chân CS của các IC nhớ. Lưu ý sự phân chia tín hiệu cho phép xuất của EPROM và RAM khác nhau (RD cho RAM và PSEN cho EPROM). 8051 có thể có đến 64Kbytes cho mỗi vùng ROM và RAM. Hình 4.8: Giản đồ thời gian khi đọc dữ liệu từ bộ nhớ ngoài RAM W OE Sự chồng lắp của vùng mã lệnh và dữ liệu ngoài: Vì bộ nhớ mã lệnh chỉ được đọc nên sẽ bất tiện trong việc phát triển phần mềm. Làm thế nào để sửa lỗi của chương trình nằm trong kit khi bộ nhớ mã lệnh chỉ có thể đọc. Biện pháp thường được sử dụng ở đây là chồng lắp hai vùng mã lệnh và dữ liệu lên nhau. Tín hiệu PSEN dùng để đọc mã lệnh và tín hiệu RD dùng để đọc dữ liệu trong cùng một bộ nhớ. RAM chứa cả chương trình và dữ liệu. Hai tín hiệu RD và PSEN được đưa vào cổng AND. Ngõ ra của cổng AND nối với chân OE của RAM. Mạch ở hình 4.9 cho phép ghi dữ liệu vào RAM. Vì vậy chương trình có thể được load vào RAM (bằng cách ghi dữ liệu vào RAM) và thi hành (bằng cách truy xuất như bộ nhớ mã lệnh). WR RD PSEN Hình 4.9 Mạch tạo nên sự chồng lắp hai vùng nhớ VII – HOẠT ĐỘNG RESET 8051 được reset khi giữ chân RST ở mức cao ít nhất trong hai chu kỳ máy và sau đó trả về mức thấp. RST có thể được nối với switch hoặc mạng tụ, trở để tạo tính reset. Trạng thái của tất cả thanh ghi sau khi reset hệ thống tóm tắt trong bảng 4.5. Thanh ghi đếm chương trình được nạp giá trò 0000H sau khi reset. Khi RST xuống mức thấp chương trình luôn bắt đầu tại điểm 0000H. Nội dung các thanh ghi trong RAM nội không bò ảnh hưởng bởi hoạt động reset. Thanh ghi Noọi dung PC ACC B PSW SP DPTR PORT 0 3 IP IE Timer registers SCON SBUF PCON (HMOS) PCON (CMOS) 0000H 00H 00H 00H 07H 0000H FFH XXX00000B 0XX00000B 00H 00H 00H 0XXXXXXXB 0XXX0000B Baỷng 4.5 Giaự trũ caực thanh sau khi reset heọ thoỏng Chương IV TÓM TẮT TẬP LỆNH I – GIỚI THIỆU: Chương trình được xây dựng nên từ tập lệnh, tuân theo cú pháp và cấu trúc logic. Một họ vi xử lý luôn đi kèm theo tập lệnh của nó. Chương này gới thiệu tập lệnh của họ MCs-51, việc đònh vò và một vài ví dụ về các tình huống gặp phải khi lập trình. Chương này không bàn về kỹ thuật lập trình cũng như về trình biên dòch. Tập lệnh họ vi điều khiển MCx-51 tối ưu cho các điều khiển ứng dụng 8 bit. Nó cung cấp các cách đònh vò nhanh, gọn thuận tiện cho việc truy xuất dữ liệu 8 bit trong vùng RAM nội. Tập lệnh cũng đưa ra một số lệnh thao tác trên bit thuận tiện cho việc điều khiển và các hệ thống logic có yêu cầu xử lý luận lý. Là một xử lý 8 bit, các lệnh của 8051 là mã 8 bit. Do đó tập lệnh có tối đa 256 lệnh. Trong đó 255 lệnh được đònh nghóa. Trong một lệnh, ngoài mã lệnh (1 byte) ra còn có thể có dữ liệu và đòa chỉ. Trong tập lệnh 8051 có 139 lệnh 1 byte, 92 lệnh 2 byte và 24 lệnh 3 byte. Phần phụ lục sẽ mô tả đầy đủ về mỗi mã, về mã gợi nhớ, số byte lệnh, số chu kỳ hành lệnh. II – CÁC MODE ĐỊNH VỊ (ADDRESSING MODE) Khi lệnh thao tác trên dữ liệu, một câu hỏi được đặt ra là “dữ liệu ở đâu?”. Để trả lời câu hỏi này ta xem xét qua các mode đònh vò của 8051. Đònh vò dữ liệu là một phần quan trọng trong tập lệnh. Chúng xác đònh dữ liệu nguồn và đích theo những cách khác nhau tùy theo cách lập trình. Trong phần này ta sẽ lhảo sát kỹ từng mode đònh vò và cho mỗi loại một ví dụ. Có 8 mode đònh vò: Thanh ghi Trực tiếp Gián tiếp Tức thời (Immediate) Tương đối Xa Chỉ số Đònh vò bằng thanh ghi: Người lâp trình truy xuất dữ liệu chứa trong các thanh ghi từ R0 đến R7 thông qua tên gọi của chúng. Đòa chỉ của 8 thanh ghi này được giải mã thông qua bit thấp nhất của chúng. Do đó mã lệnh và toán hạng đòa chỉ được gom chung vào 1 byte. Opcode 5-bit n n n . 8052/8032 trong vùng RAM nội có thể dùng làm stack. Để tạo ra stack bắt đầu tại 60H, ta khởi động thanh ghi SP: MOV SP, #5FH ; Như vậy stack được giới hạn trong 32 bytes. Ta dùng giá trò. tại 08H. Nếu trình không khởi động lại stack thì các thanh ghi 1, 2, 3 không thể sử dụng vì nó được dùng làm stack. Stack được truy xuất một cách rõ ràng bằng các lệnh PUSH, POP để lưu trữ tạm. chương trình con. Các lệnh ACALL, LCALL hay ngắt sẽ đẩy thanh ghi đếm chương trình (PC) vào stack. Lệnh RET, RETI trả giá trò trong stack lại cho PC. Con trỏ dữ liệu (DPTR) Con trỏ dữ liệu dùng