Transcript 89c51
CẤU TRÚC VI XỬ LÝ VÀ VI ĐIỀU KHIỂN PHAN HẢI PHONG Khoa Vật Lý – Trường ĐH Khoa Học Huế [email protected] Mở đầu 1971: tập đoàn Inter đã giới thiệu 8080. Sau đó các tập đoàn như Motorola, MOS-Technology, Zilog cũng giới thiệu các bộ vi xử lý tương tự: 6800, 6520, Z80... 1976: Inter giới thiệu bộ vi điều khiển 8748, chip đầu tiên trong họ VĐK MCS-48. 8748 bao gồm: 1 CPU, 1Kb EPROM, 64 Byte RAM, 27 chân xuất nhập và một bộ định thời 8 bit. 1980: Inter công bố 89C51, VĐK đầu tiên của họ MSC-51. 89C51 chứa trên 60000 transistor bao gồm 4Kb ROM, 128 byte RAM, 32 đường IO, 1 port nối tiếp, 2 bộ định thời 16 bit. 4/13/2015 2 Chương I 4/13/2015 3 Sơ đồ khối một hệ vi xử lý 4/13/2015 4 Vi xử lý (μP) Thực hiện các thao tác tính toán trên dữ liệu Đưa ra tín hiệu điều khiển hoạt động cho toàn bộ hệ thống Gồm các mạch lô-gíc thực hiện liên tục việc nạp lệnh và thực hiện lệnh Hoạt động theo một chuỗi các lệnh máy có sẵn -> chương trình 4/13/2015 5 Phân loại vi xử lý Theo số bit có thể được xử lý đồng thời: 4 bit, 8 bit, 16 bit, 32 bit… Theo tập lệnh: tập lệnh phức hợp (CISC: Complex Instruction Set Computer) tập lệnh thu gọn (RISC: Reduced Instruction Set Computer) Theo kiến trúc: kiến trúc Von Neumann: vùng nhớ dữ liệu và chương trình không được phân chia độc lập (truy cập trên cùng một đường địa chỉ) kiến trúc Harvard: vùng nhớ cho chương trình và cho dữ liệu được phân biệt rõ ràng 4/13/2015 6 Cấu trúc một vi xử lý Luồng dữ liệu (Datapath): lưu giữ và xử lý (tính toán) dữ liệu, tác động trực tiếp trên thông tin Đơn vị điều khiển (Control Unit): đưa ra những tín hiệu điều khiển để điều khiển hoạt động của Datapath Hai thành phần này cùng được xây dựng từ các mạch dãy và mạch lô-gíc tổ hợp o 4/13/2015 7 Kiến trúc chung của vi xử lý 4/13/2015 8 Cấu trúc Datapath Khối tính toán số học lô-gíc (ALU: Arithmetic Logic Unit): xử lý thông tin (thực hiện các phép toán trên dữ liệu) Khối nhớ: lưu trữ dữ liệu đầu vào, đầu ra, các biến tạm thời, các tham số… Đường bus dữ liệu: vận chuyển dữ liệu giữa các phần tử nhớ và từ các phần tử nhớ đến khối tính toán 4/13/2015 9 Khối tính toán số học và logic Gồm: Bộ cộng Bộ trừ Bộ ghi dịch Khối thực hiện phép toán lô-gíc Bộ nhân chia Các mạch tính toán là mạch lô-gíc tổ hợp (không chứa các phần tử nhớ) => ở đường vào của các toán hạng và ở lối ra cho kết quả/trạng thái luôn phải có thêm các mạch chốt để lưu các giá trị này. 4/13/2015 10 Khối nhớ Các thanh ghi (register) chung: lưu dữ liệu tạm thời Các thanh ghi có chức năng đặc biệt: thanh ghi lệnh (instruction register): lưu trữ mã lệnh của lệnh (opcode) thanh ghi bộ đếm chương trình (Program counter): cung cấp địa chỉ hiện tại mà vi xử lý đang truy nhập tới bộ nhớ chương trình thanh ghi con trỏ chứa địa chỉ dữ liệu (DPTR: Data Pointer) địa chỉ vùng ngăn xếp (SP: Stack Pointer) Các thanh ghi được đánh địa chỉ và được quản lý như một vùng nhớ đặc biệt. 4/13/2015 11 Cấu trúc và hoạt động của đơn vị điều khiển Được thực thi bằng một máy trạng thái (SM), kết hợp với các mạch logic điều khiển. Tín hiệu ra của SM: điều khiển Datapath Tín hiệu vào của SM: các lệnh điều khiển Lệnh được lưu trong bộ nhớ chương trình Quá trình thực thi một lệnh: Nạp lệnh Giải mã lệnh Thực hiện lệnh 4/13/2015 12 Quá trình nạp lệnh Đơn vị điều khiển đưa nội dung của bộ đếm chương trình lên bus địa chỉ của bộ nhớ chương trình và cho phép đọc bộ nhớ này. Dữ liệu được đọc ra từ bộ nhớ chương trình sẽ được đưa lên bus lối vào của vi xử lý. Dữ liệu này chính là mã lệnh (opcode). Opcode được chốt vào thanh ghi lệnh của vi xử lý và bộ đếm chương trình được tăng lên một đơn vị, trỏ tới byte mã chương trình tiếp theo. 4/13/2015 13 Hoạt động bus cho chu kì tìm nạp lệnh Bus địa chỉ N Bộ đếm chương trình Bus dữ liệu Opcode Thanh ghi lệnh RAM N+2 N+1 Clock Read 4/13/2015 Opcode N N-1 14 Bộ nhớ bán dẫn Các chương trình và dữ liệu được lưu giữ trong bộ nhớ. Các bộ nhớ được truy xuất trực tiếp bởi CPU: ROM, RAM, flash. RAM: Bộ nhớ có thể đọc/ghi Mất nội dung khi mất nguồn nuôi. Chương trình và dữ liệu của người dùng sẽ được nạp vào RAM để thực thi. ROM: Bộ nhớ chỉ đọc Không mất nội dung khi không có nguồn nuôi. Flash: Bộ nhớ đọc/ghi, không mất dữ liệu khi mất nguồn nuôi 4/13/2015 15 BUS: địa chỉ, dữ liệu và điều khiển Bus: tập các dây dẫn mang những thông tin có cũng một mục đích. Việc truy cập đến một mạch quanh CPU sử dụng ba bus: bus địa chỉ, bus dữ liệu, bus điều khiển. Thao tác đọc/ghi: CPU xác định vị trí của dữ liệu bằng cách đặt một địa chỉ lên bus địa chỉ Xuất tín hiệu điều khiển lên bus điều khiển để xác định thao tác là đọc hay ghi Lấy byte dữ liệu từ bộ nhớ ở địa chỉ xác định, đặt byte này lên bus dữ liệu. CPU đọc dữ liệu và đưa vào các thanh ghi nội hoặc CPU xuất dữ liệu lên bus dữ liệu 4/13/2015 16 Cấu trúc chung của một VĐK Bus địa chỉ Bus dữ liệu CPU Bus điều khiển Mạch giao tiếp RAM ROM Thiết bị ngoại vi 4/13/2015 17 Chương II 4/13/2015 18 Tổng quát Vi mạch đặc trưng của họ MSC-51 là chip 89C51. 4 KB bộ nhớ Flash 128 byte RAM 4 port xuất nhập 8 bit 2 bộ định thời 16 bit Mạch giao tiếp nối tiếp UART Không gian nhớ chương trình ngoài 64Kbyte Không gian nhớ dữ liệu ngoài 64Kbyte Bộ xử lý bit 210 vị trí nhớ được đánh địa chỉ, mỗi vị trí 1 bit 4/13/2015 19 Sơ đồ chân của VĐK 89C51 4/13/2015 20 Sơ đồ khối tổng quát của chip 89C51 External interrupts Interrupt Control On-chip ROM for program code Timer/Counter On-chip RAM Timer 1 Timer 0 Counter Inputs CPU OSC Bus Control 4 I/O Ports P0 P1 P2 P3 Serial Port TxD RxD Address/Data 4/13/2015 21 Sơ đồ khối chi tiết của chip 89C51 4/13/2015 22 Các cổng vào ra của VĐK 89C51 Port 0 (các chân từ 32-39): làm nhiệm vụ xuất/nhập hoặc làm bus địa chỉ và bus dữ liệu đa hợp (byte thấp của bus địa chỉ). Port 1 (các chân từ 1-8): làm nhiệm vụ xuất/nhập để giao tiếp với thiết bị ngoài. Port 2 (các chân từ 21-28): làm nhiệm vụ xuất/nhập hoặc làm byte địa chỉ cao của bus địa chỉ 16-bit. Port 3 (các chân từ 10 đến 17): Nếu không làm chức năng xuất nhập thì mỗi chân của port 3 có những chức năng riêng khác nhau 4/13/2015 23 Chức năng các chân của P3 và P1 Bit Tên Địa chỉ bit P3.0 RxD B0h Nhận dữ liệu của port nối tiếp P3.1 TxD B1h Phát dữ liệu của port nối tiếp P3.2 /INT0 B2h Ngõ vào ngắt ngoài 0 P3.3 /INT1 B3h Ngõ vào ngắt ngoài 1 P3.4 T0 B4h Ngõ vào của bộ định thời/đếm 0 P3.5 T1 B5h Ngõ vào của bộ định thời/đếm 1 P3.6 /WR B6h Điều khiển ghi bộ nhớ dữ liệu ngoài P3.7 /RD B7h Điều khiển đọc bộ nhớ dữ liệu ngoài P1.0 T2 90h Ngõ vào của bộ định thời/đếm 2 P1.1 T2EX 91h Nạp lại/thu nhận tín hiệu của bộ định thời 2 4/13/2015 Chức năng 24 Chân cho phép bộ nhớ chương trình PSEN Cho phép truy xuất bộ nhớ chương trình ngoài. Chân này thường được nối với chân cho phép xuất OE của EPROM (hoặc ROM) để cho phép đọc các byte lệnh. Có mức tích cực thấp. Khi thực hiện chương trình ở RAM nội, chân này được duy trì ở mức logic 1. 4/13/2015 25 Chân cho phép chốt địa chỉ ALE Xuất tín hiệu cho phép chốt địa chỉ để giải đa hợp bus dữ liệu và bus địa chỉ. Khi port 0 được dùng làm bus địa chỉ/ dữ liệu đa hợp, chân ALE xuất tín hiệu để chốt địa chỉ và một thanh ghi ngoài trong suốt ½ chu kì đầu của chu kì bộ nhớ. Sau đó, các chân của port 0 sẽ xuất nhập dữ liệu hợp lệ trong ½ chu kì tiếp theo. ALE có f=1/6 fclock. 4/13/2015 26 Chân truy xuất ngoài EA Nếu ở mức logic “1” thì VĐK thực thi chương trình trong ROM nội. Nếu ở mức logic “0” thì VĐK thực thi chương trình ở trên bộ nhớ ngoài. 4/13/2015 27 Các chân khác Chân Vcc (chân 40) nối với nguồn +5V Chân GND (chân 20) nối với đất Chân RESET (chân 9) dùng để thiết lập lại trạng thái ban đầu cho hệ thống. Khi được treo ở logic 1 trong thời gian tối thiểu 2 chu kì máy, các thanh ghi bên trong 89C51 được nạp lại các giá trị thích hợp cho việc khởi động lại hệ thống Chân XTAL1 và XTAL2 (chân 18-19) nối với thạch anh cung cấp dao động ngoại cho VĐK, hoặc là nhận dao động từ nguồn xung clock TTL. 4/13/2015 28 Mạch dao động 89C51 Dao động TTL XTAL1 XTAL2 Ghép với mạch dao động TTL ngoài 4/13/2015 89C51 XTAL1 XTAL2 Ghép với mạch dao động thạch anh 29 Tổ chức bộ nhớ Bộ nhớ nội của chip 89c51 bao gồm ROM và RAM RAM trên chip bao gồm: Vùng RAM đa chức năng Vùng RAM định địa chỉ bit Các dãy thanh ghi Các thanh ghi chức năng đặc biệt Hai đặc tính cần chú ý: Các thanh ghi và các port xuất/nhập được định địa chỉ theo kiểu ánh xạ bộ nhớ và được truy xuất như một vị trí trong bộ nhớ. Vùng Stack thường trú trong RAM nội thay vì ở trong RAM ngoài như đối với vi xử lí 4/13/2015 30 Sơ đồ địa chỉ RAM nội 7Fh Vùng RAM đa mục đích 30h 2Fh Vùng RAM định địa chỉ bit 20h 1Fh 18h 17h 10h 0Fh 08h 07h 00h 4/13/2015 Bank 3 Bank 2 Bank 1 R0 –R7 31 Vùng RAM đa mục đích Gồm 80 byte từ địa chỉ 30h đến 7Fh Vùng RAM từ địa chỉ 00h đến 2Fh: vùng có thể định địa chỉ đến từng bit. Việc truy xuất một vị trí nhớ được thực hiện bằng cách sử dụng kiểu định địa chỉ trực tiếp hoặc gián tiếp. Ví dụ: đọc nội dung tại địa chỉ 5Fh của RAM nội vào thanh ghi A Định địa chỉ trực tiếp: MOV A,5Fh Định địa chỉ gián tiếp: MOV R0, #5FH MOV A,@R0 4/13/2015 32 Vùng RAM định địa chỉ bit 89C51 chứa 210 vị trí bit được định địa chỉ trực tiếp: 128 bit được chứa trong các byte từ 20h đến 2Fh. Phần còn lại nằm trong các thanh ghi đặc biệt (trong khoảng địa chỉ từ 80h đến FFh). Việc định địa chỉ đến từng bit cho phép các bit có thể được đặt và xóa...bằng một lệnh. Các port của 89C51 cũng được định địa chỉ bit Ví dụ: để set bit 67h ta dùng lệnh: SETB 67h Nếu không được định địa chỉ bit (với vi xử lí) thì ta phải dùng lệnh MOV A,2Ch OR A,#10000000b MOV 2Ch,A 4/13/2015 33 Các dãy thanh ghi Chứa trong 32 vị trí thấp nhất của RAM, gồm 4 dãy thanh ghi. Mỗi dãy gồm 8 thanh ghi từ R0 đến R7. Lệnh sử dụng các thanh ghi trong dãy là lệnh ngắn và thực hiện nhanh hơn so với kiểu định địa chỉ trực tiếp. Ví dụ: lệnh đọc nội dung tại địa chỉ 05h vào thanh chứa A hoặc: 4/13/2015 MOV A,R5 MOV A,05h ;lệnh 1 byte ;lệnh 2 byte 34 Các dãy thanh ghi Dãy thanh ghi đang hoạt động được gọi là dãy thanh ghi tích cực và có thể thay đổi bằng cách thay đổi các bit chọn dãy trong thanh ghi từ trạng thái chương trình PSW. Dãy thanh ghi mặc định sau khi reset hệ thống là dãy 0. Ví dụ: giả sử dãy 3 đang tích cực, lệnh ghi nội dung của thanh chứa A vào vị trí 18h là MOV R0,A 4/13/2015 35 Các thanh ghi chức năng đặc biệt (SFR) VĐK 89C51 có 21 thanh ghi đặc biệt SFR chiếm phần trên của RAM nội từ địa chỉ 80h đến FFh (Chú ý: không phải tất cả các địa chỉ đều được định nghĩa). 4/13/2015 36 Thanh ghi từ trạng thái chương trình PSW Bit Kí hiệu Địa chỉ Mô tả PSW.7 CY D7h Cờ nhớ PSW.6 AC D6h Cờ nhớ phụ PSW.5 F0 D5h Cờ 0 PSW.4 RS1 D4h Chọn dãy thanh ghi (bit 1) PSW.3 RS0 D3h PSW.2 OV D2h Cờ tràn PSW.1 - D1h Dự trữ PSW.0 P D0h Cờ kiểm tra chẵn lẻ 4/13/2015 Chọn dãy thanh ghi (bit 0) 00 = bank 0: địa chỉ từ 00h 01 = bank 1: địa chỉ từ 08h 10 = bank 2: địa chỉ từ 10h 11 = bank 3: địa chỉ từ 18h - 07h 0Fh 17h 1Fh 37 Thanh ghi B Địa chỉ: F0h – F7h Thanh ghi B có địa chỉ F0h được dùng chung với thanh ghi A trong các phép toán nhân, chia. Lệnh MUL AB: nhân hai số 8 bit không dấu chứa trong A và B. Kết quả 16 bit được chứa trong cặp thanh ghi B:A (thanh ghi A chứa byte thấp, thanh ghi B chứa byte cao). Lệnh DIV AB:chia A bởi B, thương số cất trong thanh chứa A và dư số cất trong thanh ghi B. 4/13/2015 38 Con trỏ Stack Con trỏ Stack (Stack pointer – SP) là 1 thanh ghi 8 bit ở địa chỉ 81h. SP chứa địa chỉ của dữ liệu hiện đang ở đỉnh của Stack. Nếu ta không khởi động SP, nội dung mặc định của thanh ghi này là 07h. 4/13/2015 39 Con trỏ dữ liệu DPTR Con trỏ dữ liệu DPTR (data pointer) được dùng để truy xuất bộ nhớ chương ngoài hoặc bộ nhớ dữ liệu ngoài. DPTR là 1 thanh ghi 16 bit có địa chỉ là 82h (DPL, byte thấp) và 83h (DPH, byte cao). Ví dụ: ghi giá trị 55h vào địa chỉ 1000h ở RAM ngoài MOV A,#55h MOV DPTR,#1000h MOV @DPTR,A 4/13/2015 40 Các thanh ghi cổng Các port xuất nhập của 89C51 bao gồm: 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, 3 không được dùng để xuất/nhập nếu ta sử dụng bộ nhớ ngoài hoặc các chức năng đặc biệt của 89C51. Các port đều được định địa chỉ từng bit. 4/13/2015 41 Các thanh ghi định thời 89C51 có 2 bộ định thời/đếm 16 bit: Bộ định thời 0 có địa chỉ 8Ah (TL0 – byte thấp) và 8Ch (TH0 – byte cao). Bộ định thời 1 có địa chỉ 8Bh (TL1 – byte thấp) và 8Dh (TH1 – byte cao). Hoạt động của bộ định thời được thiết lập bởi: Thanh ghi chế độ định thời TMOD (time mode register) ở địa chỉ 89h. Thanh ghi điều khiển định thời TCON (time control register) ở địa chỉ 88h. 4/13/2015 42 Các thanh ghi của cổng nối tiếp Thanh ghi đệm dữ liệu nối tiếp SBUF (serial data buffer): Có địa chỉ 99H. Nơi lưu dữ liệu truyền đi và dữ liệu nhận về Thanh ghi điều khiển port nối tiếp SCON (serial port control register) ở địa chỉ 98H. 4/13/2015 43 Các thanh ghi ngắt 89C51 có một cấu trúc ngắt với 2 mức ưu tiên và 5 nguyên nhân ngắt. Ngắt bị vô hiệu hóa khi reset hệ thống và sau đó được cho phép bằng cách ghi vào thanh ghi cho phép ngắt IE (interrupt enable register - A8h). Mức ưu tiên ngắt được thiết lập thông qua thanh ghi ưu tiên ngắt IP (interupt priority register - B8h). 4/13/2015 44 Thanh ghi điều khiển nguồn PCON (87h) Bit Kí hiệu Mô tả 7 SMOD Tăng gấp đôi tốc độ baud 6 - Không định nghĩa 5 - Không định nghĩa 4 - Không định nghĩa 3 GF1 Bit cờ đa mục đích 1 2 GF0 Bit cờ đa mục đích 2 1 PD Chế độ nguồn giảm 0 IDL Chế độ nguồn nghỉ 4/13/2015 45 Bộ nhớ ngoài Cấu trúc của MCS-51 cho phép mở rộng không gian bộ nhớ và không gian dữ liệu lên đến 64 Kbyte. Khi sử dụng bộ nhớ ngoài, port 0 trở thành bus địa chỉ (A0-A7) và bus dữ liệu (D0-D7) đa hợp. Port 2 thường được dùng làm byte cao của bus địa chỉ. 4/13/2015 46 Đa hợp và không đa hợp Chu kì máy A0-A15 Địa chỉ D0-D7 Dữ liệu Không đa hợp Chu kì máy A8-A15 AD0-AD7 Địa chỉ Địa chỉ Dữ liệu Đa hợp (Multiplex) 4/13/2015 47 Đọc ROM (1) P0.0 2. 74373 latches the address and send to OE ROM OC G 74LS373 A0 P0.7 A7 PSEN ALE 1. Send address to ROM D Address D0 D7 EA P2.0 A8 P2.7 A15 89C51 4/13/2015 ROM 48 Đọc ROM (2) PSEN ALE P0.0 P0.7 2. 74373 latches the address and send to ROM 74LS373 G D Address OE OC A0 A7 D0 D7 EA 3. ROM send the instruction back P2.0 A8 P2.7 A15 89C51 4/13/2015 ROM 49 Đọc RAM ALE P0.0 P0.7 74LS373 G D Address A0 A7 D0 EA P2.0 D7 A8 P2.1 A9 RS WR OE W 89C51 4/13/2015 CS RAM 50 Chương 3 4/13/2015 51 Các kiểu định địa chỉ Thanh ghi (register) Trực tiếp (direct) Gián tiếp (indirect) Tức thời (immediate) Tương đối (relative) Tuyệt đối (absolute) Dài (long) Chỉ số (indexed) 4/13/2015 52 Định địa chỉ thanh ghi Lệnh sử dụng kiểu đánh địa chỉ thanh ghi được mã hóa bằng cách dùng 3 bit thấp nhất của mã lệnh (opcode) để chỉ ra một thanh ghi bên trong không gian địa chỉ logic Mã lệnh và địa chỉ toán hạng (3 bit) kết hợp thành 1 lệnh ngắn (1 byte) Truy xuất trực tiếp 8 thanh ghi R0 – R7 Ví dụ: ADD A,R7 00101: lệnh cộng 111: thanh ghi R7 opcode 4/13/2015 (opcode: 00101111b) n n n 53 Định địa chỉ trực tiếp Được sử dụng để truy xuất các biến nhớ hoặc các thanh ghi trên chip Mã lệnh và địa chỉ toán hạng kết hợp thành 1 lệnh 2 byte Ví dụ: chuyển nội dung của thanh ghi A vào địa chỉ 90h (P1) MOV P1,A (opcode: 10001001 - 10010000) 10001001: opcode 10010000: địa chỉ của P1 (90h) 4/13/2015 54 Định địa chỉ gián tiếp Các thanh ghi R0 và R1 hoạt động như là các con trỏ Nội dung của chúng chỉ ra địa chỉ trong RAM, nơi dữ liệu được đọc hoặc ghi. Bit có ý nghĩa thấp nhất trong opcode xác định thanh ghi được dùng làm con trỏ. Được nhận biết nhờ vào kí tự @ đặt trước R0 hoặc R1. Ví dụ: nếu R1 chứa 40h và địa chỉ 40h chứa 55h, lệnh: MOV A,@R1 Nạp 55h cho A 4/13/2015 55 Định địa chỉ tức thời Dùng khi toán hạng nguồn là một hằng số thay vì một biến. Nhận biết nhờ vào kí tự # đặt trước toán hạng. Ví dụ: MOV A, #12; Nạp giá trị 12 (0Ch) vào thanh ghi A 4/13/2015 56 Các loại lệnh Nhóm lệnh số học Nhóm lệnh logic Nhóm lệnh di chuyển dữ liệu Nhóm lệnh xử lí bit Nhóm lệnh rẽ nhánh 4/13/2015 57 Một số phương pháp định địa chỉ Định địa chỉ thanh ghi: truy xuất trực tiếp các thanh ghi từ R0 – R7 Định địa chỉ trực tiếp: truy cập đến địa chỉ được trỏ bởi toán hạng. Định địa chỉ gián tiếp: Địa chỉ của toán hạng sẽ được chứa trong một thanh ghi con trỏ (R0 hoặc R1 đối với RAM trong, DPTR đối với RAM ngoài). Nhận biết bằng kí tự @ đặt trước thanh ghi Định địa chỉ tức thời: Giá trị của toán hạng được nêu ra rõ ràng ngay trong câu lệnh. Đặc điểm : luôn kèm theo ký tự “#” phía trước toán hạng. MOV A, 4Fh (Ram o 4Fh đang có 14h) 4/13/2015 58 Ví dụ MOV R0, #4Fh; đang chứa 14h MOV A,@R0 ; A chứa 14h 4/13/2015 59 Cú pháp [Nhãn]: [Lệnh] [Toán hạng đích],[Toán hạng nguồn] ;[chú thích] Ví dụ: Lenhcong: ADD A,#30H ; cong thanh ghi A voi gia tri 30H 4/13/2015 60 Các lệnh tính toán số học 4/13/2015 61 Các lệnh tính toán số học 4/13/2015 62 Các lệnh thực hiện các phép toán lôgic 4/13/2015 63 4Fh: nội dung 03h;11 A: nội dung 02h; ở trong RAM 02h có 01h ANL 4Fh, @A -> 4Fh:02h; ANL 4Fh,#01 -> 01 A: 00000001b RL A -> 0011 1011b SWAP A -> 1011 0011b 4/13/2015 64 Các lệnh thực hiện các phép toán lôgic 4/13/2015 65 Các lệnh trao đổi dữ liệu 4/13/2015 66 Các lệnh trao đổi dữ liệu 4/13/2015 67 Các lệnh trao đổi dữ liệu 4/13/2015 68 Các lệnh thao tác xử lý đại số Boolean 4/13/2015 69 Các lệnh rẽ nhánh 4/13/2015 70 Các lệnh rẽ nhánh chương trình 4/13/2015 71 Các lệnh rẽ nhánh chương trình 4/13/2015 72 Chương trình ASM mẫu #include <sfr51.inc> ; đầu chương trình, khai báo file chứa địa chỉ của các thanh ghi SFR ; định nghĩa tên gọi cho các chân cổng vào/ra (nếu muốn) #define led1 P1.0 #define led2 P1.1 ... ; khai báo các biến dạng byte (nếu có) var1 data 0x30 var2 data 0x31 ... 4/13/2015 73 Chương trình ASM mẫu (tt) ; khai báo các biến dạng bit (nếu có) flag1 bit 0x00 flag2 bit 0x01 ... ; định nghĩa các hằng số (nếu có) constant1 equ 123 constant2 equ 456 4/13/2015 74 Chương trình ASM mẫu (tt) org 0x0000 ; tạo mã đặt tại địa chỉ reset ajmp main ; tạo mã đặt tại các vector ngắt (nếu sử dụng ngắt) org 0x0003 ljmp ChuongTrinhXuLyNgatNgoai0 org 0x000B ljmp ChuongTrinhXuLyNgatTimer0 ... 4/13/2015 75 Chương trình ASM mẫu (tt) ; đặt địa chỉ đầu cho chương trình chính org 0x0030 main: ; bắt đầu viết các lệnh cho chương trình chính từ đây mov SP,#0x6F ; viết các thủ tục khởi tạo hệ thống ... ; viết thân chương trình chính (vòng lặp chính) main_loop: ... sjmp main_loop 4/13/2015 76 Chương trình ASM mẫu (tt) ; viết các chương trình con và các chương trình xử lý ngắt (nếu có) ChuongTrinhCon1: ; các lệnh xử lý của chương trình con 1 ... ; kết thúc bằng lệnh ret ret ChuongTrinhCon2: ; các lệnh xử lý của chương trình con 2 ... ret ; kết thúc bằng lệnh ret 4/13/2015 ... 77 Chương trình ASM mẫu (tt) ; định nghĩa các bảng hằng số lưu sẵn trong bộ nhớ chương trình Bang1: db 0,1,0x02,0x86 Bang2: db 156,235,8,9 ... ; chỉ dẫn báo hiệu kết thúc toàn bộ đoạn chương trình end 4/13/2015 78 Chương trình ASM mẫu (tt) ChuongTrinhXuLyNgatNgoai0: ; các lệnh xử lý của chương trình xử lý ngắt ngoài 0 ... ; kết thúc bằng lệnh reti reti ChuongTrinhXuLyNgatTimer0: ; các lệnh xử lý của chương trình xử lý ngắt timer 0 ... ; kết thúc bằng lệnh reti reti ... 4/13/2015 79 Chương 4 4/13/2015 80 Giới thiệu 89C51 có 2 bộ định thời 16 bít, mỗi bộ có 4 chế độ hoạt động Các bộ định thời được dùng để: Định thời trong một khoảng thời gian. Đếm sự kiện. Tạo tốc độ baud cho port nối tiếp của chip 89C51 4/13/2015 81 Bộ định thời 3-bit TIMER FLIP-FLOPS (3 bit) FLIP-FLOP CỜ XUNG NHỊP D /Q Q0 D /Q D Q1 /Q Q2 D /Q Q cờ Sơ đồ logic XUNG NHỊP Q0 Q1 Q2 Giản đồ thời gian FLAG 4/13/2015 82 Các SFR của bộ định thời Thanh ghi Địa chỉ Định địa chỉ bit TCON Điều khiển 88H Có TMOD Chọn chế độ 89H Không TL0 Byte thấp của bộ định thời 0 8AH Không TL1 Byte thấp của bộ định thời 1 8BH Không TH0 Byte cao của bộ định thời 0 8CH Không TH1 Byte cao của bộ định thời 1 8DH Không 4/13/2015 Mục đích 83 Thanh ghi chế độ định thời (TMOD) Bit Tên 7 GATE 6 Bộ định thời Mô tả 1 Bit điều khiển cổng. Khi được set lên 1, bộ định thời chỉ hoạt động trong khi INT1 ở mức cao và TRx = 1. 1 Bit chọn chức năng đếm hoặc định thời: 1 = đếm sự kiện 0 = định thời trong một khoảng thời gian. 5 M1 1 Bit chọn chế độ thứ nhất. 4 M0 1 Bit chọn chế độ thứ hai. 3 GATE 2 0 Bit điều khiển cổng cho bộ định thời 0. 0 Bit chọn chức năng đếm hoặc định thời cho bộ định thời 0. 1 M1 0 Bit chọn chế độ thứ nhất. 0 M0 0 Bit chọn chế độ thứ hai. 4/13/2015 84 Thanh ghi điều khiển định thời (TCON) Bit Ký Hiệu Địa chỉ bit TCON.7 TF1 8FH Cờ tràn của bộ định thời 1. TCON.6 TR1 8EH Bit điều khiển hoạt động của bộ định thời 1. TCON.5 TF0 8DH Cờ tràn của bộ định thời 0. TCON.4 TR0 8CH Bit điều khiển hoạt động của bộ định thời 0. TCON.3 IE1 8BH Cờ ngắt bên ngoài 1 (kích khởi cạnh). TCON.2 IT1 8AH Cờ ngắt bên ngoài 1 (kích khởi cạnh hoặc mức). TCON.1 IE0 89H Cờ ngắt bên ngoài 0 (kích khởi cạnh). TCON.0 IT0 88H Cờ ngắt bên ngoài 0 (kích khởi cạnh hoặc mức). 4/13/2015 Mô tả 85 Các chế độ hoạt động M1 M0 Chế độ Mô tả 0 0 0 Chế độ định thời 13 bit 0 1 1 Chế độ định thời 16 bit 1 0 2 1 1 3 Chế độ tự động nạp lại 8 bit Chế độ định thời chia sẻ 4/13/2015 86 Chế độ định thời 13 bit Byte cao THx được ghép với 5 bit thấp của TLx để tạo thành bộ định thời 13-bit. Khi có xung clock đến, bộ định thời đếm lên từ giá trị đếm được nạp. Tràn sẽ xuất hiện khi chuyển số đếm từ 2000H xuống 0000H và set cờ tràn TFx bằng 1. Time clock 4/13/2015 TLx THx (5 bit) (8 bit) TFx 87 Chế độ định thời 16 bit Có cấu hình giống chế độ định thời 13 bit Thanh ghi định thời TLx/THx có thể được đọc/ghi tại bất kì thời điểm nào Time clock 4/13/2015 TLx THx (8 bit) (8 bit) TFx 88 Chế độ tự nạp lại 8 bit Byte thấp của bộ định thời (TLx) hoạt động định thời 8 bit. Byte cao TFx lưu giữ giá trị nạp lại. Khi số đếm tràn từ FFH xuống 00H, cờ tràn được set và giá trị trong THx được nạp vào TLx. Time clock TLx (8 bit) TFx THx (8 bit) 4/13/2015 89 Chế độ định thời chia sẻ Bộ định thời 0: Được chia thành 2 bộ định thời 8 bit TL0 và TH0. Mỗi bộ sẽ set cờ tràn tương ứng là TF0 và TF1. Bộ định thời 1: Không hoạt động ở chế độ 3 nhưng có thể chuyển qua chế độ khác. Cờ tràn TF1 không bị ảnh hưởng. 4/13/2015 90 Chế độ định thời chia sẻ Time clock Time clock Time clock 4/13/2015 TL0 TF0 (8 bit) TH0 TF1 (8 bit) TL1 TH1 (8 bit) (8 bit) 91 Nguồn xung clock định thời C/T = 0: Nguồn xung clock do mạch dao động trong chip tạo ra. Được dùng để định một khoảng thời gian. C/T = 1: Được cấp xung clock từ nguồn ngoài (trên 2 chân P3.4 và P3.5) Được dùng để đếm sự kiện. Các thanh ghi định thời tăng khi có chuyển trạng thái từ 1 ->0 ở ngõ vào Tx. 4/13/2015 92 Điều khiển các bộ định thời Sử dụng bit TRx trong thanh ghi TCON: TRx = 1: khởi động TRx = 0 : dừng Sử dụng bit GATE và ngõ vào INTx: Khi INTx ở mức cao, bộ định thời nhận xung clock. Khi INTx ở mức thấp, bộ định thời bị khoá, không nhận xung nữa. 4/13/2015 93 Ví dụ MOV động MOV MOV SETB ..... CLR TR1 CLR TF1 4/13/2015 TMOD,#xxxxH ;thiết lập chế độ hoạt TL1,#xxH TH1,#XXH TRx ;ghi giá trị đếm vào TLx ;ghi giá trị đếm vào THx ;bộ định thời hoạt động ;ngừng bộ định thời ;xoá cờ tràn 94 Đọc bộ định thời đang hoạt động Sai pha có thể xảy ra khi đọc 2 thanh ghi định thời, do không thể đọc 2 thanh ghi bằng 1 lệnh Giải pháp: Đọc byte cao Đọc byte thấp Đọc lại byte cao Nếu byte cao đổi giá trị thì thực hiện lại thao tác đọc trên 4/13/2015 95 Ví dụ LAP: 4/13/2015 MOV A,TH1 MOV R6, TL1 CJNE A,TH1,LAP MOV R7,A 96 Chương 5 4/13/2015 97 Mở đầu Chip 89C51 có 1 cổng nối tiếp với 4 chế độ hoạt động khác nhau. Việc truy xuất port nối tiếp được thực hiện thông qua chân TxD và RxD Đặc trưng của port nối tiếp là khả năng hoạt động song công (full duplex) Các thanh ghi liên quan: SBUF: được dùng để truy xuất giá trị trên cổng nối tiếp SCOM: được dùng để điều khiển port nối tiếp. PCON: sử dụng bit PCON.7 (SMOD) để xác định tốc độ truyền SMOD = 0: truyền với tốc độ thường SMOD = 1: truyền với tốc độ gấp đôi 4/13/2015 98 Sơ đồ khối port nối tiếp TxD Q SBUF (write only) CLK Baud rate clock (transmit) RxD D Shift register CLK Baud rate clock (receive) SBUF (read only) 89C51 internal bus 4/13/2015 99 Thanh ghi điều khiển port nối tiếp SCON Bit Kí hiệu SCON.7 SM0 9FH Bit 0 chọn chế độ của port nối tiếp SCON.6 SM1 9EH Bit 1 chọn chế độ của port nối tiếp SCON.5 SM2 9DH Bit 2 chọn chế độ của port nối tiếp, cho phép truyền thông đa xử lí ở chế độ 2 và 3. SCON.4 REN 9CH Cho phép nhận dữ liệu. Phải bằng 1 để nhận kí tự SCON.3 TB8 9BH Bit dữ liệu thứ 9 được phát ở chế độ 2 và 3 (9 bit) SCON.2 RB8 9AH Bit dữ liệu thứ 9 trong trường hợp nhận 9 bit SCON.1 TI 99H Cờ ngắt phát, được set ngay khi kết thúc việc phát một khung dữ liệu SCON.0 RI 98H Cờ ngắt nhận, được set ngay khi kết thúc việc nhận một khung dữ liệu 4/13/2015 Địa chỉ Mô tả 100 Các chế độ hoạt động SM0 SM1 Mô tả Tốc độ baud 0 0 0 Đồng bộ 8 bit Cố định (fOSC/12) 0 1 1 UART 8bit Thay đổi (thiết lập bởi bộ định thời) 1 0 2 UART 9bit Cố định (fOSC/32 hoặc fOSC/64) 1 1 3 UART 9bit Thay đổi (thiết lập bởi bộ định thời) 4/13/2015 Chế độ 101 Chế độ 0 Là chế độ truyền đồng bộ duy nhất. Chân RxD sẽ là tín hiệu truyền/nhận dữ liệu, chân TxD là tín hiệu xung nhịp. Bit LSB (bit 0) của dữ liệu được phát đầu tiên Tốc độ baud cố định và bằng fOSC/12 Phát dữ liệu được khởi động bằng một lệnh ghi dữ liệu vào SBUF Nhận dữ liệu được khởi động khi bit REN ở mức 1 và RI ở mức 0. 4/13/2015 102 Chế độ 1 Port nối tiếp hoạt động như một bộ thu phát không đồng bộ UART Dữ liệu gồm 10 bit: 1 bit start (mức 0) 8 bit dữ liệu 1 bit stop (mức 1) Khi thu, bit stop được đưa đến RB8 của SCON Việc phát được khởi động bằng cách ghi vào SBUF Tốc độ baud được thiết lập bởi tốc độ tràn của bộ định thời 1. 4/13/2015 103 Chế độ 2 và 3 Dữ liệu gồm 11 bit:1 bit start, 8 bit dữ liệu, 1 bit stop, 1 bit lập trình được (bit thứ 9) Khi phát, bit 9 là bit được đặt vào TB8 của SCON Khi thu, bit 9 nhận được sẽ đặt vào RB8 Tốc độ baud bằng fOSC/32 hoặc fOSC/64 4/13/2015 104 Bit cho phép thu Bit REN trong thanh ghi SCON phải set bằng 1 để cho phép nhận kí tự Lệnh: SETB REN Hoặc MOV SCON,#xxx1xxxxB 4/13/2015 105 Bit dữ liệu thứ 9 Bit dữ liệu thứ 9 được phát ở chế độ 2 và 3 phải được nạp cho bit TB8 bằng phần mềm Bit dữ liệu thứ 9 thu được phải đặt vào bit RB8 của SCON 4/13/2015 106 Bit chẵn lẻ Bit thứ 9 thường được dùng làm bit chẵn lẻ (sử dụng bit P của PSW) Lệnh phát 8 bit với bit kiểm tra chẵn: MOV C,P MOV TB8,C MOV SBUF,A Lệnh phát 8 bit với bit kiểm tra lẻ: MOV C,P CPL C MOV TB8,C MOV SBUF,A 4/13/2015 107 Các cờ ngắt Cờ ngắt thu RI được set khi kết thúc nhận kí tự và chỉ ra bộ đệm thu đầy WAIT: JNB RI,WAIT CLR RI MOV A,SBUF Cờ ngắt phát TI được set khi kết thúc việc phát 1 kí tự và bộ đệm phát rỗng WAIT: JNB TI,WAIT CLR TI MOV SBUF,A 4/13/2015 108 Truyền thông đa xử lý Các chế độ 2 và 3 được ứng dụng để tạo thành một môi trường mạng sử dụng nhiều VĐK 89C51 sắp xếp theo mô hình master/slaver I/O 89C51 Master 4/13/2015 89C51 Slaver 1 I/O 89C51 Slaver 2 109 Tốc độ baud của port nối tiếp Mode 0: Baud rate = fOSC/12 Mode 2: Baud rate = (2SMOD/64)*fOSC Mode 1,3: 4/13/2015 110 Sử dụng cổng nối tiếp Chọn chế độ cho cổng nối tiếp (đồng bộ/dị bộ, 8bit/9bit...), từ đó chọn được giá trị cho các bit trong thanh ghi SCON. Lưu ý xóa các bit TI và RI. Chọn tốc độ truyền mong muốn, từ đó tính ra giá trị của thanh ghi TH1. Cho timer1 chạy ở chế độ Auto Reload 8bit (không dùng ngắt tràn timer1). Đặt mức ưu tiên ngắt và cho phép ngắt cổng nối tiếp nếu muốn. 4/13/2015 111 Sử dụng cổng nối tiếp Bắt đầu quá trình truyền dữ liệu bằng một lệnh ghi dữ liệu muốn truyền vào thanh ghi SBUF. Quá trình truyền kết thúc thì cờ TI sẽ tự động đặt lên 1. Khi một khung dữ liệu đã được nhận đầy đủ, cờ RI sẽ tự động đặt lên 1 và người lập trình lúc này có thể dùng lệnh đọc thanh ghi SBUF để lấy dữ liệu nhận được ra xử lý. 4/13/2015 112 Khởi động port nối tiếp Baud rate = 2400 Sử dụng bộ định thời 1 để cấp xung clock SM0 SM1 SM2 REN TB8 RB8 TI RI 0 1 0 1 0 0 1 0 GTE C/T M1 M0 GTE C/T M1 M0 0 0 1 0 0 0 0 0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TCON 0 1 0 0 0 0 0 0 TH1 1 1 1 1 0 0 1 1 SCON TMOD 4/13/2015 113 Lệnh khởi động port nối tiếp ORG INIT: MOV MOV MOV SETB END 4/13/2015 8100H SCON,#52H TMOD,#20H TH1,#F4H TR1 ;port nối tiếp, chế độ 1 ;bộ định thời 1, chế độ 2 ;giá trị nạp lại để có 2400 baud ;bộ định thời 1 hoạt động 114 Chương 6 4/13/2015 115 Giới thiệu Ngắt là việc xảy ra một sự kiện làm cho chương trình hiện hành bị tạm ngưng trong khi một điều kiện khác được thực hiện. time Main program Chương trình không có ngắt ISR Main time 4/13/2015 ISR Main ISR Main Main Chương trình có ngắt 116 Tổ chức ngắt 89C51 có 5 nguyên nhân ngắt: 2 ngắt ngoài 2 ngắt do bộ định thời 1 ngắt do port nối tiếp Có 2 sơ đồ xử lý ngắt: Sơ đồ chuỗi vòng Sơ đồ hai mức ưu tiên 4/13/2015 117 Thanh ghi cho phép ngắt (IE) Mỗi nguyên nhân ngắt được cho phép hoặc không thông qua thanh ghi cho phép ngắt IE có địa chỉ 0A8H Bit Kí hiệu Địa chỉ IE.7 EA AFH Cho phép/không cho phép toàn cục IE.6 - AEH Không sử dụng IE.5 ET2 ADH Cho phép ngắt do bộ định thời 2 IE.4 ES ACH Cho phép ngắt do port nối tiếp IE.3 ET1 ABH Cho phép ngắt do bộ định thời 1 IE.2 EX1 AAH Cho phép ngắt từ bên ngoài (1) IE.0 EX0 A8H Cho phép ngắt từ bên ngoài (0) IE.1 ET0 A9H Cho phép ngắt do bộ định thời 0 4/13/2015 Mô tả 118 Ưu tiên ngắt Mỗi nguyên nhân ngắt được lập trình để có một trong hai mức ưu tiên ngắt thông qua thanh ghi ưu tiên ngắt IE có địa chỉ 0B8H Bit Địa chỉ Mô tả IP.7 - Không sử dụng IP.6 - Không sử dụng IP.5 PT2 BDH Ưu tiên ngắt do bộ định thời 2 IP.4 PS BCH Ưu tiên ngắt do port nối tiếp IP.3 PT1 BBH Ưu tiên ngắt do bộ định thời 1 IP.2 PX1 BAH Ưu tiên ngắt từ bên ngoài (1) IP.1 PT0 B9H Ưu tiên ngắt do bộ định thời 0 IP.0 PX0 B8H Ưu tiên ngắt từ bên ngoài (0) 4/13/2015 Kí hiệu 119 Chuỗi vòng Chuỗi vòng xác định ngắt nào được ưu tiên phục vụ trước. Mức độ ưu tiên: Ngắt ngoài 0 Ngắt do bộ định thời 0 Ngắt ngoài 1 Ngắt do bộ định thời 1 Ngắt do port nối tiếp 4/13/2015 120 Xử lý ngắt Quá trình xử lý ngắt: Hoàn tất việc thực thi lệnh hiện hành Bộ đếm chương trình PC được cất vào stack Trạng thái của ngắt hiện hành được lưu giữ lại Các ngắt được chặn lại ở mức ngắt Bộ đếm chương trình PC được nạp địa chỉ vector của trình phục vụ ngắt ISR ISR được thực thi Việc thực thi ISR kết thúc khi gặp lệnh RETI.Lệnh này lấy lại giá trị cũ của bộ đếm chương trình PC từ stack và phục hồi trạng thái của ngắt cũ 4/13/2015 121 Các vector ngắt Giá trị được nạp cho bộ đếm chương trình được gọi là vector ngắt. Vector ngắt chính là địa chỉ bắt đầu của trình phục vụ ngắt của nguyên nhân tương ứng Khi trình gây ngắt được trỏ tới, cờ gây ngắt tự động bị xóa bởi phần cứng, ngoại trừ cờ RI và TI 4/13/2015 122 Địa chỉ các vector ngắt Ngắt Địa chỉ Reset hệ thống RST 0000H Ngắt ngoài 0 IE0 0003H Bộ định thời 0 TF0 000BH Ngắt ngoài 1 IE1 0013H Bộ định thời 1 TF1 001BH Port nối tiếp RI hoặc TI 0023H 4/13/2015 Cờ 123 Chương trình sử dụng ngắt ORG LJMP ... ORG MAIN: ... 4/13/2015 000H ;điểm nhập sau khi reset MAIN ;các điểm nhập của ISR 0030H;điểm nhập chương trình chính ;chương trình chính bắt đầu 124 Trình phục vụ ngắt kích thước nhỏ Các trình phục vụ phải được bắt đầu ở gần đáy của bộ nhớ. Chỉ có 8 byte giữa các điểm nhập của trình phục ngắt -> trình phục vụ ngắt tương ứng có độ dài không quá 8 byte. Ví dụ: ngắt do bộ định thời 0 ORG 0000H; reset LJMP MAIN ORG 000BH; điểm nhập của ngắt do bộ định thời 0 T0_ISR: ;bắt đầu ISR cho bộ định thời 0 RETI ;trở về chương trình chính MAIN: 4/13/2015 125 Trình phục vụ ngắt kích thước lớn Với trình phục vụ ngắt lớn hơn 8 byte, ta phải chuyển chương trình này đến một nơi khác trong bộ nhớ chương trình hoặc lấn qua điểm nhập của ISR khác Ví dụ: khảo sát bộ định thời 0 ORG LJMP ORG LJMP ORG MAIN: T0_ISR: RETI 4/13/2015 0000H MAIN 000BH T0_ISR 0030H ;reset ;điểm nhập bộ định thời 0 ;phía trên các vector ngắt ;ISR của bộ định thời 0 ;quay về chương trình chính 126 Ngắt do port nối tiếp Xuất hiện khi cờ ngắt phát TI hoặc cờ ngắt thu RI được set bằng 1 Ngắt phát xuất hiện khi việc phát một kí tự đã ghi vào SBUF hoàn tất(SBUF rỗng). Ngắt thu xuất hiện khi một kí tự được thu đầy đủ và đang ở trong SBUF (SBUF đầy). Cờ ngắt do port nối tiếp gây ra không được xóa bởi phần cứng. Nguyên nhân ngắt phải được xác định trong trình phục vụ ngắt và cờ ngắt phải được xóa bởi phần mềm 4/13/2015 127 Các ngắt ngoài Ngắt ngoài xảy ra khi có mức thấp hoặc cạnh âm trên chân /INT0 và /INT1 Cờ tạo ra các ngắt: bit IE0 và IE1 của thanh ghi TCON Cờ tạo ra ngắt được xóa bởi phần cứng nếu là ngắt thộc loại tác động cạnh. Nếu ngắt thuộc loại tác động mức, nguyên nhân ngắt sẽ điều khiển mức của cờ. Việc chọn loại tác động ngắt là cạnh hay mức được thực hiện thông qua bit IT0 và IT1 của TCON 4/13/2015 128