Giáo trình Vi điều khiển - Tổng quan về vi điều khiển MCS-51
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi điều khiển - Tổng quan về vi điều khiển MCS-51", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- giao_trinh_vi_dieu_khien_tong_quan_ve_vi_dieu_khien_mcs_51.pdf
Nội dung text: Giáo trình Vi điều khiển - Tổng quan về vi điều khiển MCS-51
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Chương 1: TỔNG QUAN VỀ VI ĐIỀU KHIỂN MCS-51 Chương này giới thiệu tổng quan về họ vi điều khiển MCS-51(chủ yếu trên AT89C51): cấu trúc phần cứng, sơ đồ chân, các thanh ghi, đặc tính lập trình và các đặc tính về điện. 1. Giới thiệu Họ vi điều khiển MCS-51 do Intel sản xuất đầu tiên vào năm 1980 là các IC thiết kế cho các ứng dụng hướng điều khiển. Các IC này chính là một hệ thống vi xử lý hoàn chỉnh bao gồm các các thành phần của hệ vi xử lý: CPU, bộ nhớ, các mạch giao tiếp, điều khiển ngắt. MCS-51 là họ vi điều khiển sử dụng cơ chế CISC (Complex Instruction Set Computer), có độ dài và thời gian thực thi của các lệnh khác nhau. Tập lệnh cung cấp cho MCS-51 có các lệnh dùng cho điều khiển xuất / nhập tác động đến từng bit. MCS-51 bao gồm nhiều vi điều khiển khác nhau, bộ vi điều khiển đầu tiên là 8051 có 4KB ROM, 128 byte RAM và 8031, không có ROM nội, phải sử dụng bộ nhớ ngoài. Sau này, các nhà sản xuất khác như Siemens, Fujitsu, cũng được cấp phép làm nhà cung cấp thứ hai. MCS-51 bao gồm nhiều phiên bản khác nhau, mỗi phiên bản sau tăng thêm một số thanh ghi điều khiển hoạt động của MCS-51. 2. Vi điều khiển AT89C51 AT89C51 là vi điều khiển do Atmel sản xuất, chế tạo theo công nghệ CMOS có các đặc tính như sau: - 4 KB PEROM (Flash Programmable and Erasable Read Only Memory), có khả năng tới 1000 chu kỳ ghi xoá - Tần số hoạt động từ: 0Hz đến 24 MHz - 3 mức khóa bộ nhớ lập trình - 128 Byte RAM nội. - 4 Port xuất /nhập I/O 8 bit. - 2 bộ Timer/counter 16 Bit. - 6 nguồn ngắt. - Giao tiếp nối tiếp điều khiển bằng phần cứng. - 64 KB vùng nhớ mã ngoài - 64 KB vùng nhớ dữ liệu ngoài. - Cho phép xử lý bit. - 210 vị trí nhớ có thể định vị bit. - 4 chu kỳ máy (4 µs đối với thạch anh 12MHz) cho hoạt động nhân hoặc chia. Phạm Hùng Kim Khánh Trang 1
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 - Có các chế độ nghỉ (Low-power Idle) và chế độ nguồn giảm (Power-down). Ngoải ra, một số IC khác của họ MCS-51 có thêm bộ định thời thứ 3 và 256 byte RAM nội. 2.1. Sơ đồ P0.0 – P0.7 P2.0 – P2.7 VCC PORT 0 DRIVERS PORT 2 DRIVERS VSS ADDR PORT O PORT 2 RAM ROM LATCH LATCH REGISTER RAM PROGRAM ADDR REGISTER STACK ACC POINTER BUFFER PCON SCON TMOD TCON T2CON* TH0 TL0 TH1 TMP2 TMP1 PC TL1 TH2* TL2* RCAP2H* B INCREAMENTER REGISTER RCAP2L* SBUF IE IP ALU IINTERRUPT SERIAL PORT AND TIMER BLOCKS PROGRAM COUNTER PSW PSEN TIMING AND ALE DPTR CONTROL EA REGISTER RST INSTRUCTION PORT 1 LATCH PORT 3 LATCH OSC PORT 1 PORT 3 DRIVER DRIVER XTAL 1 XTAL 2 P1.0 – P1.7 P3.0 – P3.7 Note: * for Timer 2 only Hình 1.1 – Sơ đồ khối của AT89C51 Phạm Hùng Kim Khánh Trang 2
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 AT89C51 gồm có 40 chân, mô tả như sau: AT89C51 40 39 21 38 P0.0/AD0 P2.0/A8 22 37 P0.1/AD1 VCC P2.1/A9 23 36 P0.2/AD2 P2.2/A10 24 35 P0.3/AD3 P2.3/A11 25 34 P0.4/AD4 P2.4/A12 26 33 P0.5/AD5 P2.5/A13 27 32 P0.6/AD6 P2.6/A14 28 P0.7/AD7 P2.7/A15 1 10 2 P1.0 P3.0/RXD 11 3 P1.1 P3.1/TXD 12 4 P1.2 P3.2/INT0 13 5 P1.3 P3.3/INT1 14 6 P1.4 P3.4/T0 15 7 P1.5 P3.5/T1 16 8 P1.6 P3.6/WR 17 P1.7 P3.7/RD 19 30 18 XTAL1 ALE/PROG 29 XTAL2 PSEN 31 9 EA/VPP RST GND 20 Hình 1.2 – Sơ đồ chân của AT89C51 Port 0: Port 0 là port có 2 chức năng ở các chân 32 – 39 của AT89C51: - Chức năng IO (xuất / nhập): dùng cho các thiết kế nhỏ. Tuy nhiên, khi dùng chức năng này thì Port 0 phải dùng thêm các điện trở kéo lên (pull-up), giá trị của điện trở phụ thuộc vào thành phần kết nối với Port. Khi dùng làm ngõ ra, Port 0 có thể kéo được 8 ngõ TTL. Khi dùng làm ngõ vào, Port 0 phải được set mức logic 1 trước đó. - Chức năng địa chỉ / dữ liệu đa hợp: khi dùng các thiết kế lớn, đòi hỏi phải sử dụng bộ nhớ ngoài thì Port 0 vừa là bus dữ liệu (8 bit) vừa là bus địa chỉ (8 bit thấp). Ngoài ra khi lập trình cho AT89C51, Port 0 còn dùng để nhận mã khi lập trình và xuất mà khi kiểm tra (quá trình kiểm tra đòi hỏi phải có điện trở kéo lên). Phạm Hùng Kim Khánh Trang 3
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Port 1: Port1 (chân 1 – 8) chỉ có một chức năng là IO, không dùng cho mục đích khác (chỉ trong 8032/8052/8952 thì dùng thêm P1.0 và P1.1 cho bộ định thời thứ 3). Tại Port 1 đã có điện trở kéo lên nên không cần thêm điện trở ngoài. Port 1 có khả năng kéo được 4 ngõ TTL và còn dùng làm 8 bit địa chỉ thấp trong quá trình lập trình hay kiểm tra. Khi dùng làm ngõ vào, Port 1 phải được set mức logic 1 trước đó. Port 2: Port 2 (chân 21 – 28) là port có 2 chức năng: - Chức năng IO (xuất / nhập): có khả năng kéo được 4 ngõ TTL. - Chức năng địa chỉ: dùng làm 8 bit địa chỉ cao khi cần bộ nhớ ngoài có địa chỉ 16 bit. Khi đó, Port 2 không được dùng cho mục đích IO. Khi dùng làm ngõ vào, Port 2 phải được set mức logic 1 trước đó. Khi lập trình, Port 2 dùng làm 8 bit địa chỉ cao hay một số tín hiệu điều khiển. Port 3: Port 3 (chân 10 – 17) là port có 2 chức năng: - Chức năng IO: có khả năng kéo được 4 ngõ TTL. Khi dùng làm ngõ vào, Port 3 phải được set mức logic 1 trước đó. - Chức năng khác: mô tả như bảng 1.1 Bảng 1.1: Chức năng các chân của Port 3 Bit Tên Chức năng P3.0 RxD Ngõ vào port nối tiếp P3.1 TxD Ngõ ra port nối tiếp P3.2 INT0 Ngắt ngoài 0 P3.3 INT1 Ngắt ngoài 1 P3.4 T0 Ngõ vào của bộ định thời 0 P3.5 T1 Ngõ vào của bộ định thời 1 P3.6 WR Tín hiệu điều khiển ghi dữ liệu lên bộ nhớ ngoài. P3.7 RD Tín hiệu điều khiển đọc từ bộ nhớ dữ liệu ngoài. Phạm Hùng Kim Khánh Trang 4
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Nguồn: Chân 40: VCC = 5V ± 20% Chân 20: GND PSEN (Program Store Enable): PSEN (chân 29) cho phép đọc bộ nhớ chương trình mở rộng đối với các ứng dụng sử dụng ROM ngoài, thường được nối đến chân OC (Output Control) của ROM để đọc các byte mã lệnh. PSEN sẽ ở mức logic 0 trong thời gian AT89C51 lấy lệnh.Trong quá trình này, PSEN sẽ tích cực 2 lần trong 1 chu kỳ máy. Mã lệnh của chương trình được đọc từ ROM thông qua bus dữ liệu (Port0) và bus địa chỉ (Port0 + Port2). Khi 8951 thi hành chương trình trong ROM nội, PSEN sẽ ở mức logic 1. ALE/ PROG (Address Latch Enable / Program): ALE/ PROG (chân 30) cho phép tách các đường địa chỉ và dữ liệu tại Port 0 khi truy xuất bộ nhớ ngoài. ALE thường nối với chân Clock của IC chốt (74373, 74573). Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng làm tín hiệu clock cho các phần khác của hệ thống. Xung này có thể cấm bằng cách set bit 0 của SFR tại địa chỉ 8Eh lên 1. Khi đó, ALE chỉ có tác dụng khi dùng lệnh MOVX hay MOVC. Ngoài ra, chân này còn được dùng làm ngõ vào xung lập trình cho ROM nội ( PROG ). EA /VPP (External Access) : EA (chân 31) dùng để cho phép thực thi chương trình từ ROM ngoài. Khi nối chân 31 với Vcc, AT89C51 sẽ thực thi chương trình từ ROM nội (tối đa 8KB), ngược lại thì thực thi từ ROM ngoài (tối đa 64KB). Ngoài ra, chân EA được lấy làm chân cấp nguồn 12V khi lập trình cho ROM. RST (Reset): RST (chân 9) cho phép reset AT89C51 khi ngõ vào tín hiệu đưa lên mức 1 trong ít nhất là 2 chu kỳ máy. X1,X2: Ngõ vào và ngõ ra bộ dao động, khi sử dụng có thể chỉ cần kết nối thêm thạch anh và các tụ như hình vẽ trong sơ đồ. Tần số thạch anh thường sử dụng cho AT89C51 là 12Mhz. Phạm Hùng Kim Khánh Trang 5
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Giá trị C1, C2 = 30 pF ± 10 pF Hình 1.3 – Sơ đồ kết nối thạch anh 2.2. Định thì chu kỳ máy Một chu kỳ máy bao gồm 6 trạng thái (12 xung clock). Một trạng thái bao gồm 2 phần ứng với 12 xung clock : Phase 1 và Phase 2. Như vậy, một chu kỳ máy bao gồm 12 xung clock được biểu diễn từ S1P1 đến S6P2 (State 1, Phase 1 Æ State 6, Phase 2). Chu kỳ lấy lệnh và thực thi lệnh mô tả như hình 1.4. Tín hiệu chốt địa chỉ ALE tích cực 2 lần trong một chu kỳ máy (trong khoảng thời gian S1P2 đến S2P1 và từ S4P2 đến S5P1). Từ đó tần số xung tại chân ALE bằng 1/6 tần số thạch anh. ¾ Đối với các lệnh thực thi trong 1 chu kỳ: - Lệnh 1 byte: được thực thi tại thời điểm S1P2 sau khi mã lệnh được chốt vào thanh ghi lệnh tại S1P1. - Lệnh 2 byte: byte thứ 2 được đọc tại thời điểm S4 và sẽ được thực thi tại thời điểm S4. ¾ Đối với các lệnh thực thi trong 2 chu kỳ: Quá trình lấy lệnh thực hiện tại thời điểm S1 của chu kỳ đầu tiên (byte mà lệnh 1). Nếu lệnh có nhiều hơn 1 byte thì sẽ được lấy ở các thời điểm tiếp theo giống như các lệnh thực thi trong 1 chu kỳ. Phạm Hùng Kim Khánh Trang 6
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Hình 1.4 – Chu kỳ lệnh Phạm Hùng Kim Khánh Trang 7
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 2.3. Tổ chức bộ nhớ Bộ nhớ trong Bộ nhớ ngoài ROM 4KB Bộ nhớ chương trình 64 KB 0000h – 0FFFh 0000h – FFFFh Điều khiển bằng PSEN RAM 128 byte 00h – 7Fh Bộ nhớ dữ liệu 64 KB SFR 0000h – FFFFh Điều khiển bằng RD và WR 80h – 0FFh Hình 1.5 - Các vùng nhớ trong AT89C51 Bộ nhớ của họ MCS-51 có thể chia thành 2 phần: bộ nhớ trong và bộ nhớ ngoài. Bộ nhớ trong bao gồm 4 KB ROM và 128 byte RAM (256 byte trong 8052). Các byte RAM có địa chỉ từ 00h – 7Fh và các thanh ghi chức năng đặc biệt (SFR) có địa chỉ từ 80h – 0FFh có thể truy xuất trực tiếp. Đối với 8052, 128 byte RAM cao (địa chỉ từ 80h – 0FFh) không thể truy xuất trực tiếp mà chỉ có thể truy xuất gián tiếp (xem thêm trong phần tập lệnh). Bộ nhớ ngoài bao gồm bộ nhớ chương trình (điều khiển đọc bằng tín hiệu PSEN ) và bộ nhớ dữ liệu (điều khiển bằng tín hiệu RD hay WR để cho phép đọc hay ghi dữ liệu). Do số đường địa chỉ của MCS-51 là 16 bit (Port 0 chứa 8 bit thấp và Port 2 chứa 8 bit cao) nên bộ nhớ ngoài có thể giải mã tối đa là 64KB. 2.3.1. Tổ chức bộ nhớ trong Bộ nhớ trong của MCS-51 gồm ROM và RAM. RAM bao gồm nhiều vùng có mục đích khác nhau: vùng RAM đa dụng (địa chỉ byte từ 30h – 7Fh và có thêm vùng 80h – 0FFh ứng với 8052), vùng có thể địa chỉ hóa từng bit (địa chỉ byte từ 20h – 2Fh, gồm 128 bit được định địa chỉ bit từ 00h – 7Fh), các bank thanh ghi (từ 00h – 1Fh) và các thanh ghi chức năng đặc biệt (từ 80h – 0FFh). Phạm Hùng Kim Khánh Trang 8
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Các thanh ghi chức năng đặc biệt (SFR – Special Function Registers): Bảng 1.2 – Các thanh ghi chức năng đặc biệt Địa Có thể Không định địa chỉ bit chỉ định địa byte chỉ bit F8h F0h B E8h E0h ACC D8h D0h PSW C8h (T2CON) (RCAP2L) (RCAP2H) (TL2) (TH2) C0h B8h IP SADEN B0h P3 A8h IE SADDR A0h P2 98h SCON SBUF BRL BDRCON 90h P1 88h TCON TMOD TL0 TH0 TL1 TH1 AUXR CKCON 80h P0 SP DPL DPH PCON Các thanh ghi có thể định địa chỉ bit sẽ có địa chỉ bit bắt đầu và địa chỉ byte trùng nhau. Ví dụ như: thanh ghi P0 có địa chỉ byte là 80h và có địa chỉ bit bắt đầu từ 80h (ứng với P0.0) đến 87h (ứng với P0.7). Chức năng các thanh ghi này sẽ mô tả trong phần sau. Phạm Hùng Kim Khánh Trang 9
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 RAM nội: chia thành các vùng phân biệt: vùng RAM đa dụng (30h – 7Fh), vùng RAM có thể định địa chỉ bit (20h – 2Fh) và các bank thanh ghi (00h – 1Fh). Địa chỉ byte Địa chỉ bit Chức năng 7F Vùng RAM đa dụng 30 2F 7F 7E 7D 7C 7B 7A 79 78 2E 77 76 75 74 73 72 71 70 2D 6F 6E 6D 6C 6B 6A 69 68 2C 67 66 65 64 63 62 61 60 2B 5F 5E 5D 5C 5B 5A 59 58 2A 57 56 55 54 53 52 51 50 29 4F 4E 4D 4C 4B 4A 49 48 28 47 46 45 44 43 42 41 40 Vùng có thể định địa chỉ bit 27 3F 3E 3D 3C 3B 3A 39 38 26 37 36 35 34 33 32 31 30 25 2F 2E 2D 2C 2B 2A 29 28 24 27 26 25 24 23 22 21 20 23 1F 1E 1D 1C 1B 1A 19 18 22 17 16 15 14 13 12 11 10 21 0F 0E 0D 0C 0B 0A 09 08 20 07 06 05 04 03 02 01 00 1F Bank 3 18 17 Bank 2 10 Các bank thanh ghi 1F Bank 1 08 07 Bank thanh ghi 0 ( mặc định cho R0-R7) 00 Hình 1.6 – Sơ đồ phân bố RAM nội ¾ RAM đa dụng: RAM đa dụng có 80 byte từ địa chỉ 30h – 7Fh có thể truy xuất mỗi lần 8 bit bằng cách dùng chế độ địa chỉ trực tiếp hay gián tiếp. Các vùng địa chỉ thấp từ 00h – 2Fh cũng có thể sử dụng cho mục đich như trên ngoài các chức năng đề cập như phần sau. ¾ RAM có thể định địa chỉ bit: Vùng địa chỉ từ 20h – 2Fh gồm 16 byte (= 128 bit) có thể thực hiện giống như vùng RAM đa dụng (mỗi lần 8 bit) hay thực hiện truy xuất mỗi lần 1 bit bằng các lệnh Phạm Hùng Kim Khánh Trang 10
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 xử lý bit. Vùng RAM này có các địa chỉ bit bắt đầu tại giá trị 00h và kết thúc tại 7Fh. Như vậy, địa chỉ bắt đầu 20h (gồm 8 bit) có địa chỉ bit từ 00h – 07h; địa chỉ kết thúc 2Fh có địa chỉ bit từ 78h – Fh. ¾ Các bank thanh ghi: Vùng địa chỉ từ 00h – 1Fh được chia thành 4 bank thanh ghi: bank 0 từ 00h – 07h, bank 1 từ 08h – 0Fh, bank 2 từ 10h – 17h và bank 3 từ 18h – 1Fh. Các bank thanh ghi này được đại diện bằng các thanh ghi từ R0 đến R7. Sau khi khởi động hệ thống thì bank thanh ghi được sử dụng là bank 0. Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một bank thanh ghi được truy xuất bởi các thanh ghi R0 đến R7. Việc thay đổi bank thanh ghi có thể thực hiện thông qua thanh ghi từ trạng thái chương trình (PSW). Các bank thanh ghi này cũng có thể truy xuất bình thường như vùng RAM đa dụng đã nói ở trên. 2.3.2. Tổ chức bộ nhớ ngoài MCS-51 có bộ nhớ theo cấu trúc Harvard: phân biệt bộ nhớ chương trình và dữ liệu. Chương trình và dữ liệu có thể chứa bên trong nhưng vẫn có thể kết nối với 64KB chương trình và 64KB dữ liệu. Bộ nhớ chương trình được truy xuất thông qua chân PSEN còn bộ nhớ dữ liệu đươc truy xuất thông qua chân WR hay RD . Lưu ý rằng việc truy xuất bộ nhớ chương trình luôn luôn sử dụng địa chỉ 16 bit còn bộ nhớ dữ liệu có thể là 8 bit hay 16 bit tuỳ theo câu lệnh sử dụng. Khi dùng bộ nhớ dữ liệu 8 bit thì có thể dùng Port 2 như là Port I/O thông thường còn khi dùng ở chế độ 16 bit thì Port 2 chỉ dùng làm các bit địa chỉ cao. Port 0 được dùng làm địa chỉ thấp/ dữ liệu đa hợp. Tín hiệu ALE để tách byte địa chỉ và đưa vào bộ chốt ngoài. Trong chu kỳ ghi, byte dữ liệu sẽ tồn tại ở Port 0 vừa trước khi WR tích cực và được giữ cho đến khi WR không tích cực.Trong chu kỳ đọc, byte nhận được chấp nhận vừa trước khi RD không tích cực. Bộ nhớ chương trình ngoài được xử lý 1 trong 2 điều kiện sau: - Tín hiệu EA tích cực ( = 0). - Giá trị của bộ đếm chương trình (PC – Program Counter) lớn hơn kích thước bộ nhớ. Phạm Hùng Kim Khánh Trang 11
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 PCH: Program Counter High – PCL: Program Counter Low DPH: Data Pointer High – DPL: Data Pointer Low Hình 1.7 – Thực thi bộ nhớ chương trình ngoài Phạm Hùng Kim Khánh Trang 12
- Giáo trìnhvi P h Kết nối phần cứng khi thiết kế bộ nhớ ngoài mô tả như sau: ạ ùgKmKáh Trang 13 m Hùng Kim Khánh ADDRESS BUS DATA BUS đ i ề u khi U1 U8 U3 ể T n A8 21 39 D0 D0 2 19 A0 A0 10 11 D0 A9 22 P2.0/A8 P0.0/AD0 38 D1 D1 3 D0 Q0 18 A1 A1 9 A0 O0 12 D1 A10 23 P2.1/A9 P0.1/AD1 37 D2 D2 4 D1 Q1 17 A2 A2 8 A1 O1 13 D2 A11 24 P2.2/A10 P0.2/AD2 36 D3 D3 5 D2 Q2 16 A3 A3 7 A2 O2 15 D3 A12 25 P2.3/A11 P0.3/AD3 35 D4 D4 6 D3 Q3 15 A4 A4 6 A3 O3 16 D4 A13 26 P2.4/A12 P0.4/AD4 34 D5 D5 7 D4 Q4 14 A5 A5 5 A4 O4 17 D5 A14 27 P2.5/A13 P0.5/AD5 33 D6 D6 8 D5 Q5 13 A6 A6 4 A5 O5 18 D6 A15 28 P2.6/A14 P0.6/AD6 32 D7 D7 9 D6 Q6 12 A7 A7 3 A6 O6 19 D7 P2.7/A15 P0.7/AD7 D7 Q7 A8 25 A7 O7 10 1 11 A9 24 A8 11 P3.0/RXD P1.0 2 1 LE A10 21 A9 12 P3.1/TXD P1.1 3 OE A11 23 A10 13 P3.2/INT0 P1.2 4 A12 2 A11 14 P3.3/INT1 P1.3 5 74HC573 A13 26 A12 15 P3.4/T0 P1.4 6 A14 27 A13 16 P3.5/T1 P1.5 7 A15 1 A14 17 P3.6/WR P1.6 8 A15 P3.7/RD P1.7 22 30 19 20 OE/VPP 29 ALE/PROG XTAL1 18 CE PSEN XTAL2 28 31 VCC EA/VPP 9 RST ổ ROM 27512 ng quan v AT89C51 ề vi đ Hình 1.8 – Giao tiếp bộ nhớ chương trình ngoài i ề u khi ể n MCS-51
- Giáo trìnhvi P h ạ ùgKmKáh Trang 14 m Hùng Kim Khánh ADDRESS BUS DATA BUS đ i ề U4 U7 U6 u khi A8 21 39 D0 D0 2 19 A0 A0 12 13 D0 ể A9 22 P2.0/A8 P0.0/AD0 38 D1 D1 3 D0 Q0 18 A1 A1 11 T A0 I/O0 14 D1 n A10 23 P2.1/A9 P0.1/AD1 37 D2 D2 4 D1 Q1 17 A2 A2 10 A1 I/O1 15 D2 A11 24 P2.2/A10 P0.2/AD2 36 D3 D3 5 D2 Q2 16 A3 A3 9 A2 I/O2 17 D3 A12 25 P2.3/A11 P0.3/AD3 35 D4 D4 6 D3 Q3 15 A4 A4 8 A3 I/O3 18 D4 A13 26 P2.4/A12 P0.4/AD4 34 D5 D5 7 D4 Q4 14 A5 A5 7 A4 I/O4 19 D5 A14 27 P2.5/A13 P0.5/AD5 33 D6 D6 8 D5 Q5 13 A6 A6 6 A5 I/O5 20 D6 A15 28 P2.6/A14 P0.6/AD6 32 D7 D7 9 D6 Q6 12 A7 A7 5 A6 I/O6 21 D7 P2.7/A15 P0.7/AD7 D7 Q7 A8 27 A7 I/O7 10 1 11 A9 26 A8 11 P3.0/RXD P1.0 2 1 LE A10 23 A9 12 P3.1/TXD P1.1 3 OE A11 25 A10 13 P3.2/INT0 P1.2 4 A12 4 A11 14 P3.3/INT1 P1.3 5 74HC573 A13 28 A12 15 P3.4/T0 P1.4 6 A14 3 A13 16 P3.5/T1 P1.5 7 A15 31 A14 17 P3.6/WR P1.6 8 A15 P3.7/RD P1.7 24 30 19 29 OE 29 ALE/PROG XTAL1 18 22 WE PSEN XTAL2 30 CE1 31 CE2 EA/VPP 9 RST RAM 62512 AT89C51 ổ ng quan v ề vi đ i Hình 1.9 – Giao tiếp bộ nhớ dữ liệu ngoài ề u khi ể n MCS-51
- Giáo trìnhvi P h ADDRESS BUS ạ ùgKmKáh Trang 15 m Hùng Kim Khánh DATA BUS đ i ề U5 U10 U9 u khi A8 21 39 D0 D0 2 19 A0 A0 12 13 D0 A9 P2.0/A8 P0.0/AD0 D1 D1 D0 Q0 A1 A1 A0 I/O0 D1 ể 22 38 3 18 T 11 14 n A10 23 P2.1/A9 P0.1/AD1 37 D2 D2 4 D1 Q1 17 A2 A2 10 A1 I/O1 15 D2 A11 24 P2.2/A10 P0.2/AD2 36 D3 D3 5 D2 Q2 16 A3 A3 9 A2 I/O2 17 D3 A12 25 P2.3/A11 P0.3/AD3 35 D4 D4 6 D3 Q3 15 A4 A4 8 A3 I/O3 18 D4 A13 26 P2.4/A12 P0.4/AD4 34 D5 D5 7 D4 Q4 14 A5 A5 7 A4 I/O4 19 D5 A14 27 P2.5/A13 P0.5/AD5 33 D6 D6 8 D5 Q5 13 A6 A6 6 A5 I/O5 20 D6 A15 28 P2.6/A14 P0.6/AD6 32 D7 D7 9 D6 Q6 12 A7 A7 5 A6 I/O6 21 D7 P2.7/A15 P0.7/AD7 D7 Q7 A8 27 A7 I/O7 10 1 11 A9 26 A8 11 P3.0/RXD P1.0 2 1 LE A10 23 A9 12 P3.1/TXD P1.1 3 OE A11 25 A10 13 P3.2/INT0 P1.2 4 A12 4 A11 14 P3.3/INT1 P1.3 5 74HC573 A13 28 A12 15 P3.4/T0 P1.4 6 A14 3 A13 16 P3.5/T1 P1.5 7 A15 31 A14 17 P3.6/WR P1.6 8 A15 P3.7/RD P1.7 24 30 19 29 OE 29 ALE/PROG XTAL1 18 22 WE PSEN XTAL2 30 CE1 31 U11A CE2 EA/VPP 9 RST 1 RAM 62512 ổ 3 ng quan v AT89C51 2 7408 ề vi đ i ề Hình 1.10 – Giao tiếp bộ nhớ chương trình và dữ liệu ngoài dùng chung u khi ể n MCS-51
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Bộ nhớ chương trình ngoài: Quá trình thực thi lệnh khi dùng bộ nhớ chương trình ngoài có thể mô tả như hình 1.7. Trong quá trình này, Port 0 và Port 2 không còn là các Port xuất nhập mà chứa địa chỉ và dữ liệu. Sơ đồ kết nối với bộ nhớ chương trình ngoài mô tả như hình 1.8. Trong một chu kỳ máy, tín hiệu ALE tích cực 2 lần. Lần thứ nhất cho phép 74HC573 mở cổng chốt địa chỉ byte thấp, khi ALE xuống 0 thì byte thấp và byte cao của bộ đếm chương trình đều có nhưng ROM chưa xuất vì PSEN chưa tích cực, khi tín hiệu ALE lên 1 trở lại thì Port 0 đã có dữ liệu là mã lệnh. ALE tích cực lần thứ hai được giải thích tương tự và byte 2 được đọc từ bộ nhớ chương trình. Nếu lệnh đang thực thi là lệnh 1 byte thì CPU chỉ đọc Opcode, còn byte thứ hai bỏ qua. Bộ nhớ dữ liệu ngoài: Bộ nhớ dữ liệu ngoài được truy xuất bằng lệnh MOVX thông qua các thanh ghi xác định địa chỉ DPTR (16 bit) hay R0, R1 (8 bit). Sơ đồ kết nối với bộ nhớ dữ liệu ngoài mô tả như hình 1.9. Quá trình thực hiện đọc hay ghi dữ liệu được cho phép bằng tín hiệu RD hay WR (chân P3.7 và P3.6). Bộ nhớ chương trình và dữ liệu dùng chung: Trong các ứng dụng phát triển phần mềm xây dựng dựa trên AT89C51, ROM sẽ được lập trình nhiều lần nên dễ làm hư hỏng ROM. Một giải pháp đặt ra là sử dụng RAM để chứa các chương trình tạm thời. Khi đó, RAM vừa là bộ nhớ chương trình vừa là bộ nhớ dữ liệu. Yêu cầu này có thể thực hiện bằng cách kết hợp chân RD và chân PSEN thông qua cổng AND. Khi thực hiện đọc mà lệnh, chân PSEN tích cực cho phép đọc từ RAM và khi đọc dữ liệu, chân RD sẽ tích cực. Sơ đồ kêt nối mô tả như hình 1.10. 2.3.3. Giải mã địa chỉ Trong các ứng dụng dựa trên AT89C51, ngoài giao tiếp bộ nhớ dỡ liệu, vi điều khiển còn thực hiện giao tiếp với các thiết bị khác như bàn phím, led, động cơ, Các thiết bị này có thể giao tiếp trực tiếp thông qua các Port. Tuy nhiên, khi số lượng các thiết bị lớn, các Port sẽ không đủ để thực hiện điều khiển. Giải pháp đưa ra là xem các thiết bị này giống như bộ nhớ dữ liệu. Khi đó, cần phải thực hiện quá trình giải mã địa chỉ để phân biệt các thiết bị ngoại vi khác nhau. Quá trình giải mã địa chỉ thường được thực hiện thông qua các IC giải mã như 74139 (2 -> 4), 74138 ( 3 -> 8), 74154 (4 -> 16). Ngõ ra của các IC giải mã sẽ được đưa tới chân chọn chip của RAM hay bộ đệm khi điều khiển ngoại vi. Phạm Hùng Kim Khánh Trang 16
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 2.4. Các thanh ghi chức năng đặc biệt (SFR – Special Function Registers) 2.4.1. Thanh ghi tích luỹ (Accumulator) Thanh ghi tích luỹ là thanh ghi sử dụng nhiều nhất trong AT89C51, được ký hiệu trong câu lệnh là A. Ngoài ra, trong các lệnh xử lý bit, thanh ghi tích luỹ được ký hiệu là ACC. Thanh ghi tích luỹ có thể truy xuất trực tiếp thông qua địa chỉ E0h (byte) hay truy xuất từng bit thông qua địa chỉ bit từ E0h đến E7h. VD: Câu lệnh: MOV A,#1 MOV 0E0h,#1 có cùng kết quả. Hay: SETB ACC.4 SETB 0E4h cũng tương tự. 2.4.2. Thanh ghi B Thanh ghi B dùng cho các phép toán nhân, chia và có thể dùng như một thanh ghi tạm, chứa các kết quả trung gian. Thanh ghi B có địa chỉ byte F0h và địa chỉ bit từ F0h – F7h có thể truy xuất giống như thanh ghi A. 2.4.3. Thanh ghi từ trạng thái chương trình (PSW - Program Status Word) Thanh ghi từ trạng thái chương trình PSW nằm tại địa chỉ D0h và có các địa chỉ bit từ D0h – D7h, bao gồm 7 bit (1 bit không sử dụng) có các chức năng như sau: Bảng 1.3 – Chức năng các bit trong thanh ghi PSW Bit 7 6 5 4 3 2 1 0 Chức CY AC F0 RS1 RS0 OV - P năng CY (Carry): cờ nhớ, thường được dùng cho các lệnh toán học (C = 1 khi có nhớ trong phép cộng hay mượn trong phép trừ) AC (Auxiliary Carry): cờ nhớ phụ (thường dùng cho các phép toán BCD). F0 (Flag 0): được sử dụng tuỳ theo yêu cầu của người sử dụng. Phạm Hùng Kim Khánh Trang 17
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 RS1, RS0: dùng để chọn bank thanh ghi sử dụng. Khi reset hệ thống, bank 0 sẽ được sử dụng. Bảng 1.4 – Chọn bank thanh ghi RS1 RS0 Bank thanh ghi 00 Bank 0 0 1 Bank 1 10 Bank 2 11 Bank 3 OV (Overflow): cờ tràn. Cờ OV = 1 khi có hiện tượng tràn số học xảy ra (dùng cho số nguyên có dấu). P (Parity): kiểm tra parity (chẵn). Cờ P = 1 khi tổng số bit 1 trong thanh ghi A là số lẻ (nghĩa là tổng số bit 1 của thanh ghi A cộng thêm cờ P là số chẵn). Ví dụ như: A = 10101010b có tổng cộng 4 bit 1 nên P = 0. Cờ P thường được dùng để kiểm tra lỗi truyền dữ liệu. 2.4.4. Thanh ghi con trỏ stack (SP – Stack Pointer) Con trỏ stack SP nằm tại địa chỉ 81h và không cho phép định địa chỉ bit. SP dùng để chỉ đến đỉnh của stack. Stack là một dạng bộ nhớ lưu trữ dạng LIFO (Last In First Out) thường dùng lưu trữ địa chỉ trả về khi gọi một chương trình con. Ngoài ra, stack còn dùng như bộ nhớ tạm để lưu lại và khôi phục các giá trị cần thiết. Đối với AT89C51, stack được chứa trong RAM nội (128 byte đối với 8031/8051 hay 256 byte đối với 8032/8052). Mặc định khi khởi động, giá trị của SP là 07h, nghĩa là stack bắt đầu từ địa chỉ 08h (do hoạt động lưu giá trị vào stack yêu cầu phải tăng nội dung thanh ghi SP trước khi lưu). Như vậy, nếu không gán giá trị cho thanh ghi SP thì không được sử dụng các bank thanh ghi 1, 2, 3 vì có thể làm sai dữ liệu. Đối với các ứng dụng thông thường không cần dùng nhiều đến stack, có thể không cần khởi động SP mà dùng giá trị mặc định là 07h. Tuy nhiên, nếu cần, ta có thể xác định lại vùng stack cho MCS-51. 2.4.5. Con trỏ dữ liệu DPTR (Data Pointer) Con trỏ dữ liệu DPTR là thanh ghi 16 bit bao gồm 2 thanh ghi 8 bit: DPH (High) nằm tại địa chỉ 83h và DPL (Low) nằm tại địa chỉ 82h. Các thanh ghi này không cho phép định địa chỉ bit. DPTR được dùng khi truy xuất đến bộ nhớ có địa chỉ 16 bit. 2.4.6. Các thanh ghi port Các thanh ghi P0 tại địa chỉ 80h, P1 tại địa chỉ 90h, P2, tại địa chỉ A0h, P3 tại địa chỉ B0h là các thanh ghi chốt cho 4 port xuất / nhập (Port 0, 1, 2, 3). Tất cả các thanh ghi này đều cho phép định địa chỉ bit trong đó địa chỉ bit của P0 từ 80h – 87h, P1 từ 90h – 97h, P2 từ A0h – A7h, P3 từ B0h – B7h. Các địa chỉ bit này có thể thay thế bằng toán tử •. Ví dụ như: 2 lệnh sau là tương đương: Phạm Hùng Kim Khánh Trang 18
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 SETB P0.0 SETB 80h 2.4.7. Thanh ghi port nối tiếp (SBUF - Serial Data Buffer) Thanh ghi port nối tiếp tại địa chỉ 99h thực chất bao gồm 2 thanh ghi: thanh ghi nhận và thanh ghi truyền. Nếu dữ liệu đưa tới SBUF thì đó là thanh ghi truyền, nếu dữ liệu đươc đọc từ SBUF thì đó là thanh ghi nhận. Các thanh ghi này không cho phép định địa chỉ bit. 2.4.8. Các thanh ghi định thời (Timer Register) Các cặp thanh ghi (TH0, TL0), (TH1, TL1) và (TH2, TL2) là các thanh ghi dùng cho các bộ định thời 0, 1 và 2 trong đó bộ định thời 2 chỉ có trong 8032/8052. Ngoài ra, đối với họ 8032/8052 còn có thêm cặp thanh ghi (RCAP2L, RCAP2H) sử dụng cho bộ định thời 2 (sẽ thảo luận trong phần hoạt động định thời). 2.4.9. Các thanh ghi điều khiển Bao gồm các thanh ghi IP (Interrupt Priority), IE (Interrupt Enable), TMOD (Timer Mode), TCON (Timer Control), T2CON (Timer 2 Control), SCON (Serial port control) và PCON (Power control). - Thanh ghi IP tại địa chỉ B8h cho phép chọn mức ưu tiên ngắt khi có 2 ngắt xảy ra đông thời. IP cho phép định địa chỉ bit từ B8h – BFh. - Thanh ghi IE tại địa chỉ A8h cho phép hay cấm các ngắt. IE có địa chỉ bit từ A8h – AFh. - Thanh ghi TMOD tại địa chỉ 89h dùng để chọn chế độ hoạt động cho các bộ định thời (0, 1) và không cho phép định địa chỉ bit. - Thanh ghi TCON tại địa chỉ 88h điều khiển hoạt động của bộ định thời và ngắt. TCON có địa chỉ bit từ 88h – 8Fh. - Thanh ghi T2CON tại địa chỉ C8h điều khiển hoạt động của bộ định thời 2. T2CON có địa chỉ bit từ C8h – CFh. - Thanh ghi SCON tại địa chỉ 98h điều khiển hoạt động của port nối tiếp. SCON có địa chỉ bit từ 98h – 9Fh. Các thanh ghi đã nói ở trên sẽ được thảo luận thêm ở các phần sau. Phạm Hùng Kim Khánh Trang 19
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Thanh ghi điều khiển nguồn PCON Thanh ghi PCON tại địa chỉ 87h không cho phép định địa chỉ bit bao gồm các bit như sau: Bảng 1.5 – Chức năng các bit trong thanh ghi PCON Bit 7 6 5 4 3 2 1 0 Chức SMOD1 SMOD0 - POF GF1 GF0 PD IDL năng SMOD1 (Serial Mode 1): = 1 cho phép tăng gấp đôi tốc độ port nối tiếp trong chế độ 1, 2 và 3. SMOD0 (Serial Mode 0): cho phép chọn bit SM0 hay FE trong thanh ghi SCON ( = 1 chọn bit FE). POF (Power-off Flag): dùng để nhận dạng loại reset. POF = 1 khi mở nguồn. Do đó, để xác định loại reset, cần phải xoá bit POF trước đó. GF1, GF0 (General purpose Flag): các bit cờ dành cho người sử dụng. PD (Power Down): được xoá bằng phần cứng khi hoạt động reset xảy ra. Khi bit PD = 1 thì vi điều khiển sẽ chuyển sang chế độ nguồn giảm. Trong chế độ này: - Chỉ có thể thoát khỏi chế độ nguồn giảm bằng cách reset. - Nội dung RAM và mức logic trên các port được duy trì. - Mạch dao động bên trong và các chức năng khác ngừng hoạt động. - Chân ALE và PSEN ớ mức thấp. - Yêu cầu Vcc phải có điện áp ít nhất là 2V và phục hồi Vcc = 5V ít nhất 10 chu kỳ trước khi chân RESET xuống mức thấp lần nữa. IDL (Idle): được xoá bằng phần cứng khi hoạt động reset hay có ngắt xảy ra. Khi bit IDL = 1 thì vi điều khiển sẽ chuyển sang chế độ nghỉ. Trong chế độ này: - Chỉ có thể thoát khỏi chế độ nguồn giảm bằng cách reset hay có ngắt xảy ra. - Trạng thái hiện hành của vi điều khiển được duy trì và nội dung các thanh ghi không đổi. - Mạch dao động bên trong không gởi được tín hiệu đến CPU. - Chân ALE và PSEN ớ mức cao. Lưu ý rằng các bit điều khiển PD và IDL có tác dụng chính trong tất cả các IC họ MSC-51 nhưng chỉ có thể thực hiện được trong các phiên bản CMOS. Phạm Hùng Kim Khánh Trang 20
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 2.5. Cấu trúc port a. Cấu trúc Port 0 b. Cấu trúc Port 1 c. Cấu trúc Port 2 d. Cấu trúc Port 3 Hình 1.11 – Cấu trúc các Port của AT89C51 Cấu trúc các Port mô tả như hình vẽ, mỗi port có một bộ chốt (SFR từ P0 đến P3), một bộ đệm vào và bộ lái ngõ ra. Port 0: - Khi dùng ở chế độ IO: FET kéo lên tắt (do không có các tín hiệu ADDR và CONTROL) nên ngõ ra Port 0 hở mạch. Như vậy, khi thiết kế Port 0 làm việc ở chế độ IO, cần phải có các điện trở kéo lên. Trong chế độ này, mỗi chân của Port 0 khi dùng làm ngõ ra có thể kéo tối đa 8 ngõ TTL (xem thêm phần sink / source trong 2.7). Khi ghi mức logic 1 ra Port 0, ngõ ra Q của bộ chốt (latch) ở mức 0 nên FET tắt, ngõ ra Port 0 nối lên Vcc thông qua FET và có thể kéo xuống mức 0 khi kết nối với tín hiệu ngoài. Khi ghi mức logic 0 ra Port 0, ngõ ra Q của bộ chốt ở mức 1 nên FET dẫn, ngõ ra Port 0 được nối với GND nên luôn ở mức 0 bất kể ngõ vào. Do đó, để đọc dữ liệu tại Port 0 thì cần phải set bit tương ứng. Phạm Hùng Kim Khánh Trang 21
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 - Khi dùng ở chế độ địa chỉ / dữ liệu: FET đóng vai trò như điện trở kéo lên nên không cần thiết kế thêm các điện trở ngoài. Port 1, 2, 3: Không dùng FET mà dùng điện trở kéo lên nên khi thiết kế không cần thiết phải thêm các điện trở ngoài. Khi dùng ở chế độ IO, cách thức hoạt động giống như Port 0 (nghĩa là trước khi đọc dữ liệu thì cần phải set bit tương ứng). Port 1, 2, 3 có khả năng sink / source dòng cho 4 ngõ TTL. 2.6. Hoạt động Reset Để thực hiện reset, cần phải tác động mức cao tại chân RST (chân 9) của AT89C51 ít nhất 2 chu kỳ máy. Sơ đồ mạch reset có thể mô tả như sau: VCC C20 0.1uF R28 100 RST RESET R27 8.2K Hình 1.12 – Sơ đồ mạch reset của AT89C51 Sau khi reset, nội dung của RAM nội không thay đổi và các thanh ghi thay đổi về giá trị mặc định như sau: Bảng 1.6 - Giá trị mặc định của các thanh ghi khi reset Thanh ghi Nội dung Đếm chương trình PC 0000h A, B, PSW, SCON, SBUF 00h SP 07h DPTR 0000h Port 0 đến port 3 FFh IP XXX0 0000b IE 0X0X 0000b Các thanh ghi định thời 00h PCON (HMOS) 0XXX XXXXb PCON (CMOS) 0XXX 0000b Phạm Hùng Kim Khánh Trang 22
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 2.7. Các vấn đề khác 2.7.1. Dòng sink và source Dòng điện sink và source là một phần quan trọng khi thiết kế các mạch điện tử. Sự khác nhau của chúng được mô tả như hình 1.13. Hình 1.13 – Khác nhau giữa dòng sink và source Trong AT89C51, Port 0 có dòng sink của mỗi chân tương đương với 8 ngõ TTL còn các Port khác có dòng sink /source tương đương với 4 ngõ TTL. 2.7.2. Lập trình cho AT89C51 2.7.2.1. Các chế độ khoá bộ nhớ chương trình Bảng 1.7 – Các chế độ khoá chương trình Chế Lập trình các bit Mô tả độ khoá LB1 LB2 LB3 1 U U U Không khoá 2 P U U Không cho phép lệnh MOVC tại bộ nhớ chương trình ngoài, chân EA được lấy mẫu và chốt khi reset, không cho phép lập trình. 3 P P U Giống chế độ 2 và không cho phép kiểm tra. 4 P P P Giống chế độ 3 và không cho phép thực thi ngoài. Trong AT89C51, có 3 bit khoá (LB – lock bit) có thể được lập trình (P – programmed) hay không (U – unprogrammed) cho phép chọn các chế độ khoá khác nhau (bảng 1.7).
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 2.7.2.2. Lập trình Khi AT89C51 ở trạng thái xoá, tất cả các ô nhớ thường là 0FFh và có thể được lập trình. Điện áp lập trình có thể là 5V hay 12V tuỳ theo loại IC. Điện áp lập trình xác định bằng ký hiệu trên chip hay các byte nhận dạng khi đã xoá chip (xem bảng 1.8). Bảng 1.8 – Nhận dạng điện áp lập trình Vpp = 12V Vpp = 5V Ký hiệu AT89C51 AT89C51 xxxx xxxx-5 yyww yyww Byte nhận dạng (30h) = 1Eh (30h) = 1Eh (31h) = 51h (31h) = 51h (32h) = 0FFh (32h) = 05h Lưu ý rằng AT89C51 được lập trình theo từng byte nên phải thực hiện xoá tất cả chip trước khi lập trình. Quá trình lập trình cho AT89C51 được thực hiện theo các bước sau: - Bước 1: Đặt giá trị địa chỉ lên đường địa chỉ. - Bước 2: Đặt dữ liệu lên đường dữ liệu. - Bước 3: Đặt các tín hiệu điều khiển tương ứng (xem bảng 1.9). - Bước 4: Đặt chân EA/VPP lên điện áp 12V (nếu sử dụng điện áp lập trình 12V). - Bước 5: Tạo một xung tại chân ALE/ PROG (xem bảng 1.9). Thường chu kỳ ghi 1 byte không vượt quá 1.5 ms. Sau đó thay đổi địa chỉ và lặp lại bước 1 cho đến khi kết thúc dữ liệu cần lập trình. Bảng 1.9 – Các tín hiệu điều khiển lập trình Chế độ RST PSEN PROG Vpp P2.6 P2.7 P3.6 P3.7 Ghi mã H L H/12V L H H H Đọc mã H L H H L L H H Ghi lock bit LB1 H L H/12V H H H H LB2 H L H/12V H H L L LB3 H L H/12V H L H L Xoá chip H L H/12V H L L L Đọc byte nhận dạng H L H H L L L L Lưu ý rằng các xung PROG đòi hỏi thời gian không vượt quá 1.5 ms, chỉ có chế độ xoá chip cần xung 10ms. Sơ đồ mạch lập trình và kiểm tra cho AT89C51 mô tả như hình 1.14 và 1.15. Phạm Hùng Kim Khánh Trang 24
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Address 0000h – 0FFFh Xem bảng 1.9 Hình 1.14 – Sơ đồ mạch lập trình cho AT89C51 Phạm Hùng Kim Khánh Trang 25
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Address 0000h – 0FFFh Xem bảng 1.9 Hình 1.15 – Sơ đồ mạch kiểm tra cho AT89C51 Phạm Hùng Kim Khánh Trang 26
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Các dạng tín hiệu dùng để lập trình cho AT89C51 được mô tả như hình 1.16 và 1.17. Hình 1.16 – Dạng sóng lập trình ở điện áp 12V Hình 1.17 - Dạng sóng lập trình ở điện áp 5V Phạm Hùng Kim Khánh Trang 27
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Khi lập trình, các thông số về thời gian và điện áp được mô tả như bảng 1.10. Bảng 1.10 – Các đặc tính lập trình và kiểm tra 0 T = 0 – 70 C, VCC = 5V ± 10% Ký Đơn Mô tả Min Max hiệu vị VPP (1) Điện áp lập trình 11.5 12.5 V IPP (1) Dòng điện lập trình 1.0 mA 1/tCLCL Tần số thạch anh 3 24 MHz Khoảng thời gian từ lúc địa chỉ ổn định cho đến 48t t CLCL AVGL khi có thể tạo xung PROG (xuống mức thấp) Khoảng thời gian giữ lại địa chỉ sau khi chân 48t t CLCL GHAX PROG lên mức cao Khoảng thời gian từ lúc dữ liệu ổn định cho đến 48t t CLCL DVGL khi có thể tạo xung PROG (xuống mức thấp) Khoảng thời gian giữ lại dữ liệu sau khi chân 48t t CLCL GHDX PROG lên mức cao Khoảng thời gian từ lúc P2.7 (ENABLE) lên mức 48tCLCL tEHSH cao đến khi Vpp chuyển đến giá trị điện áp lập trình (5V/12V) Khoảng thời gian từ lúc Vpp chuyển lên giá trị 10 tSHGL điện áp lập trình đến khi chân PROG xuống mức μs thấp t 10 GHSL Khoảng thời gian từ lúc chân PROG lên mức cao μs (1) đến khi Vpp chuyển xuống giá trị điện áp thấp tGLGH Độ rộng xung lập trình 1 110 μs tAVQV Khoảng thời gian từ lúc đưa địa chỉ cho đến lúc 48tCLCL (2) có thể đọc dữ liệu tELQV Khoảng thời gian từ lúc chân P2.7 (ENABLE) 48tCLCL (2) xuống mức thấp đến khi có thể đọc dữ liệu tEHQZ Khoảng thời gian từ lúc chân P2.7 (ENABLE) lên 0 48tCLCL (2) mức cao đến khi thả nổi đường dữ liệu 1.0 μs t Khoảng thời gian từ lúc chân PROG lên mức cao GHBL đến khi chân P3.4 (BUSY) xuống mức thấp tWC Chu kỳ ghi byte 2.0 ms (1) Chỉ dùng cho điện áp lập trình 12V (2) Dùng cho chế độ kiểm tra (Tham khảo thêm một mạch lập trình cho AT89C51 tại Phụ lục 3) Phạm Hùng Kim Khánh Trang 28
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 2.7.3. Các đặc tính của AT89C51 2.7.3.1. Đặc tính DC Bảng 1.11 – Đặc tính DC của AT89C51 0 T = - 40 – 85 C; VCC = 5V ± 20% Ký Đơn Mô tả Điều kiện Min Max hiệu vị VIL Điện áp ngõ vào mức thấp Trừ EA -0.5 0.2 VCC - 0.1 V VIL1 Điện áp ngõ vào mức thấp EA -0.5 0.2 VCC - 0.3 V Trừ XTAL1, V Điện áp ngõ vào mức cao 0.2 VCC + 0.9 V + 0.5 V IH RST CC VIH1 Điện áp ngõ vào mức cao XTAL1, RST 0.7 VCC VCC + 0.5 V Điện áp ngõ ra mức thấp V I = 1.6 mA 0.45 V OL (1) (Port 1,2,3) OL Điện áp ngõ ra mức thấp V I = 3.2 mA 0.45 V OL1 (1) (Port 0,ALE, PSEN ) OL Điện áp ngõ ra mức cao IOH = -60 μA 2.4 V V VCC = 5V ± 10% OH (Ports 1,2,3, ALE, PSEN ) IOH = -25 μA 0.75 VCC V IOH = -10 μA 0.9 VCC V Điện áp ngõ ra mức cao IOH = -800 μA 2.4 V VCC = 5V ± 10% VOH1 (Port 0 trong chế độ địa chỉ dữ liệu đa hợp) IOH = -300 μA 0.75 VCC V IOH = -80 μA 0.9 VCC V Dòng ngõ vào mức 0 (Port I V = 0.45V -50 μA IL 1,2,3) IN Dòng điện xảy ra khi V = 2V, V I chuyển mức logic từ 1 IN CC -650 μA TL = 5V ± 10% xuống 0 (P1, 2, 3) 0.45 < VIN < ILI Dòng điện ngõ vào ±10 μA VCC Điện trở kéo xuống tại ngõ R 50 300 KΩ RST Reset Tần số = 1 MHz CIO Điện dung tại các chân 10 pF TA = 25°C Chế độ thường 20 mA Dòng tối thiểu của nguồn 12 MHz cung cấp Chế độ nghỉ 5 mA ICC 12 MHz V = 6V 100 μA Chế độ nguồn giảm (2) CC VCC = 3V 40 μA (1) Ở chế độ thường, IOL xác định như sau: - IOLmax tại mỗi chân là 10 mA. Phạm Hùng Kim Khánh Trang 29
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 - IOLmax tại mỗi port 8 bit: 26 mA cho Port 0 và 15 mA cho Port 1,2,3. - IOLmax tại tất cả các ngõ vào: 71 mA. Nếu IOL không thoả mãn các điều kiện trên, điện áp VOL có thể sẽ lớn hơn giá trị trong bảng 1.11 (2) Điện áp Vcc tối thiểu trong chế độ nguồn giảm là 2V. 2.7.3.2. Đặc tính AC Bảng 1.12 – Đặc tính AC của AT89C51 Thạch anh 12 Thạch anh 16 - 24 Ký Đơn vị Mô tả MHz MHz hiệu Min Max Min Max 1/tCLCL Tần số thạch anh 0 24 MHz tLHLL Độ rộng xung ALE 127 2tCLCL-40 ns Khoảng thời gian từ lúc địa chỉ ổn định t 43 t -13 ns AVLL đến khi ALE xuống CLCL mức thấp Khoảng thời gian giữ tLLAX lại địa chỉ sau khi 48 tCLCL-20 ns ALE xuống mức thấp Khoảng thời gian từ lúc ALE xuống mức t 233 4t -65 ns LLIV thấp đến khi mã lệnh CLCL vào hợp lệ Khoảng thời gian từ lúc ALE xuống mức t 43 t -13 ns LLPL thấp đến khi PSEN CLCL xuống mức thấp tPLPH Độ rộng xung PSEN 205 3tCLCL-20 ns Khoảng thời gian từ t lúc PSEN xuống 145 3t -45 ns PLIV mức thấp đến khi mã CLCL lệnh vào hợp lệ Khoảng thời gian giữ tPXIX lại mã lệnh sau tín 0 0 ns hiệu PSEN Khoảng thời gian từ tAVIV lúc đặt địa chỉ đến khi 312 5tCLCL-55 ns mã lệnh vào hợp lệ Khoảng thời gian thả tPXIZ nổi ngõ vào mã lệnh tCLCL-10 ns sau tín hiệu PSEN Phạm Hùng Kim Khánh Trang 30
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Khoảng thời gian từ tPXAV tín hiệu PSEN đến 75 tCLCL-8 ns khi địa chỉ hợp lệ Khoảng thời gian từ t lúc PSEN xuống 10 10 ns PLAZ mức thấp đến khi thả nổi địa chỉ tRLRH Độ rộng xung RD 400 6tCLCL-100 ns tWLWH Độ rộng xung WR 400 6tCLCL-100 ns Khoảng thời gian từ t lúc RD xuống mức 252 5t -90 ns RLDV thấp đến khi dữ liệu CLCL vào hợp lệ Khoảng thời gian giữ tRHDX lại dữ liệu sau tín 0 0 hiệu RD Khoảng thời gian thả tRHDZ nổi dữ liệu sau tín 97 2tCLCL-28 ns hiệu RD Khoảng thời gian từ lúc ALE xuống mức t 517 8tCLCL-150 ns LLDV thấp đến khi dữ liệu hợp lệ Khoảng thời gian từ tAVDV lúc đặt địa chỉ đến khi 585 9tCLCL-165 ns dữ liệu hợp lệ Khoảng thời gian từ lúc ALE xuống mức t 200 300 3tCLCL-50 3t +50 ns LLWL thấp đến khi RD hay CLCL WR xuống mức thấp Khoảng thời gian từ lúc đặt địa chỉ đến khi t 203 4tCLCL-75 ns AVWL RD hay WR xuống mức thấp Khoảng thời gian từ lúc dữ liệu hợp lệ đến tQVWX 23 tCLCL-20 ns khi WR chuyển mức logic Khoảng thời gian từ tQVWH lúc dữ liệu hợp lệ đến 433 7tCLCL-120 ns khi WR lên mức cao tWHQX Khoảng thời gian giữ 33 tCLCL-20 ns Phạm Hùng Kim Khánh Trang 31
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 lại dữ liệu sau tín hiệu WR Khoảng thời gian từ t lúc RD xuống mức 0 0 ns RLAZ thấp đến khi thả nổi địa chỉ Khoảng thời gian từ ns ns ns ns t lúc RD hay WR lên 43 123 t -20 t +25 WHLH mức cao đến khi ALE CLCL CLCL ns ns lên mức cao ns Các đặc tính AC được mô tả trong các hình vẽ sau: Hình 1.18 – Chu kỳ đọc bộ nhớ chương trình ngoài Hình 1.19 – Chu kỳ đọc bộ nhớ dữ liệu ngoài Phạm Hùng Kim Khánh Trang 32
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 Hình 1.20 – Chu kỳ ghi dữ liệu bộ nhớ ngoài Phạm Hùng Kim Khánh Trang 33
- Giáo trình Vi điều khiển Tổng quan về vi điều khiển MCS-51 BÀI TẬP CHƯƠNG 1 1. Giải thích tại sao thường phải có điện trở kéo lên (pull-up) tại Port 0? Trường hợp nào không cần sử dụng điện trở này? 2. Thiết kế mạch giải mã địa chỉ dùng 74LS138 cho 1 RAM 8 KB, 1 RAM 4KB và 1 ROM 16 KB. 3. Cho bản đồ bộ nhớ sau: Bộ nhớ Địa chỉ RAM1 1000h – 1FFFh RAM2 3800h – 3FFFh ROM 8000h – 9FFFh Lập bản đồ bộ nhớ đầy đủ và thiết kế mạch giải mã địa chỉ theo bản đồ trên. 4. Cho mạch như hình vẽ. Xác định địa chỉ các chân CS. Cho biết chân nào dùng để đọc, chân nào dùng để ghi. DATA BUS RD U14 U16 WR 21 39 D0 D0 3 2 A0 22 P2.0/A8 P0.0/AD0 38 D1 D1 4 D0 Q0 5 A1 23 P2.1/A9 P0.1/AD1 37 D2 D2 7 D1 Q1 6 A2 1 P2.2/A10 P0.2/AD2 D2 Q2 24 36 D3 D3 8 9 A3 3 CS1 25 P2.3/A11 P0.3/AD3 35 D4 D4 13 D3 Q3 12 A4 2 26 P2.4/A12 P0.4/AD4 34 D5 D5 14 D4 Q4 15 A5 27 P2.5/A13 P0.5/AD5 33 D6 D6 17 D5 Q5 16 A6 28 P2.6/A14 P0.6/AD6 32 D7 D7 18 D6 Q6 19 A7 4 P2.7/A15 P0.7/AD7 D7 Q7 6 CS3 10 1 ALE 11 5 11 P3.0/RXD P1.0 2 1 LE 12 P3.1/TXD P1.1 3 OE 13 P3.2/INT0 P1.2 4 9 14 P3.3/INT1 P1.3 5 U1574LS373 8 CS4 15 P3.4/T0 P1.4 6 10 P3.5/T1 P1.5 A5 WR 16 7 1 15 17 P3.6/WR P1.6 8 A6 2 A Y0 14 RD CS2 P3.7/RD P1.7 A7 3 B Y1 13 12 30 19 C Y2 12 11 ALE ALE/PROG XTAL1 Y3 CS5 29 18 VCC 6 11 13 PSEN XTAL2 4 G1 Y4 10 CS6 31 5 G2A Y5 9 CS7 EA/VPP 9 G2B Y6 7 RST Y7 CS8 AT89C51 74LS138 Phạm Hùng Kim Khánh Trang 34
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Chương 2: LẬP TRÌNH HỢP NGỮ TRÊN VI ĐIỀU KHIỂN MCS-51 Chương này giới thiệu cách thức lập trình trên MCS-51 cũng như giải thích hoạt động của các lệnh sử dụng cho họ MCS-51. Các ký hiệu cần chú ý: Rn : các thanh ghi từ R0 – R7 (bank thanh ghi hiện hành) Ri : các thanh ghi từ R0 – R1 (bank thanh ghi hiện hành) @Rn : định địa chỉ gián tiếp 8 bit dùng thanh ghi Rn @DPTR : định địa chỉ gián tiếp 16 bit dùng thanh ghi DPTR direct : định địa chỉ trực tiếp RAM nội (00h – 7Fh) hay SFR (80h – FFh) (direct) : nội dung của bộ nhớ tại địa chỉ direct #data8 : giá trị tức thời 8 bit #data16 : giá trị tức thời 16 bit bit : địa chỉ bit của các ô nhớ có thể định địa chỉ bit (00h – 7Fh đối với địa chỉ bit và 20h – 2Fh đối với địa chỉ byte) 1. Các phương pháp định địa chỉ Định địa chỉ trực tiếp Định địa chỉ trực tiếp chỉ dùng cho các thanh ghi chức năng đặc biệt và RAM nội của 8951. Giá trị địa chỉ trực tiếp 8 bit được thêm vào phía sau mã lệnh. Nếu địa chỉ trực tiếp từ 00h – 7Fh thì đó là RAM nội của 8951 (128 byte), còn địa chỉ từ 80h – FFh là địa chỉ các thanh ghi chức năng đặc biệt (xem bảng 1.2, chương 1). Các lệnh sau có kiểu định địa chỉ trực tiếp: MOV A, P0 MOV A, 30h Lệnh đầu tiên chuyển nội dung từ Port 0 vào thanh ghi A. Khi biên dịch, chương trình sẽ thay thế từ gợi nhớ P0 bằng địa chỉ trực tiếp của Port 0 (80h) và đưa vào byte 2 của mã lệnh. Lệnh thứ hai chuyển nội dung của RAM nội có địa chỉ 30h vào thanh ghi A. Định địa chỉ gián tiếp Định địa chỉ gián tiếp có thể dùng cho cả RAM nội và RAM ngoại. Trong chế độ này, địa chỉ của RAM xác định thông qua một thanh ghi (R0, R1, SP cho địa chỉ 8 bit và DPTR cho địa chỉ 16 bit). Các lệnh sau có kiểu địa chỉ gián tiếp: MOV A, @R0 Phạm Hùng Kim Khánh Trang 35
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 MOVX A, @DPTR Lệnh đầu tiên chuyển nội dung cúa RAM nội có địa chỉ chứa trong thanh ghi R0 vào thanh ghi A (giả sử R0 = 30h thì chuyển nội dung của ô nhớ 30h). Lệnh thứ hai chuyển nội dung RAM ngoại vào thanh ghi A (địa chỉ RAM chứa trong DPTR). Định địa chỉ thanh ghi Các thanh ghi từ R0 – R7 có thể truy xuất bằng cách định địa chỉ trực tiếp hay gián tiếp như trên. Ngoài ra, các thanh ghi này còn có thể truy xuất bằng cách dùng 3 bit trong mã lệnh để chọn 1 trong 8 thanh ghi (8 thanh ghi này có địa chỉ trực tiếp thay đổi tuỳ theo bank thanh ghi đang sử dụng). Định địa chỉ tức thời Giá trị của một hằng số có thể đưa trực tiếp vào mã lệnh của chương trình. Trong hợp ngữ, hằng số được xác định bằng cách sử dụng dấu #. Lệnh: MOV A, #10h có chế độ địa chỉ tức thời. Định địa chỉ chỉ số Quá trình định địa chỉ chỉ số chỉ có thể dùng cho bộ nhớ chương trình, được dùng để đọc dữ liệu trong các bảng tìm kiếm. Chế độ này thường dùng một thanh ghi nền 16 bit (PC hay DPTR) để chỉ vị trí của bảng và thanh ghi A chỉ vị trí của các phần tử trong bảng. 2. Các vấn đề liên quan khi lập trình hợp ngữ 2.1. Cú pháp lệnh Một lệnh trong chương trình hợp ngữ có dạng như sau: Nhãn Lệnh Toán hạng Chú thích A: MOV A, #10h ; Đưa giá trị 10h vào thanh ghi A LED EQU 30h ; Định nghĩa ô nhớ chứa mã led On_Led BIT 00h ; Cờ trạng thái led Trường nhãn định nghĩa các ký hiệu (có thể là địa chỉ trong chương trình, các hằng dữ liệu, tên đoạn hay các cấu trúc lập trình). Trường nhãn không bắt đầu bằng số và không trùng với các từ khoá có sẵn. Trường lệnh chứa các từ gợi nhớ cho các lệnh của MCS-51 hay các lệnh giả dùng cho chương trình dịch. Phạm Hùng Kim Khánh Trang 36
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Trường toán hạng chứa các thông số liên quan đến lệnh đang sử dụng. Trường chú thích dùng để ghi chú trong chương trình hợp ngữ. Trường này phải được bắt đầu bằng dấu ; và chương trình dịch sẽ bỏ qua các từ đặt sau dấu ;. Lưu ý rằng các chương trình dịch không phân biệt chữ hoa và chữ thường. 2.2. Khai báo dữ liệu - Khi khai báo hằng số, chữ h cuối cùng xác định hằng số là số thập lục phân; chữ b cuối cùng xác định số nhị phân và chữ d cuối (hay không có) xác định số thập phân. Lưu ý rằng đối với số thập lục phân, khi bắt đầu bằng chữ A → F thì phải thêm số 0 vào phía trước. Ví dụ: 1010b ; Số nhị phân 1010h ; Số thập lục phân 1010 ; Số thập phân 0F0h ; Số thập lục phân nhưng bắt đầu bằng chữ F nên phải thêm vào phía trước số 0. - Khi dùng dấu # phía trước một con số, đó chính là dữ liệu tức thời còn nếu không dùng dấu # thì đó là địa chỉ của ô nhớ. Lưu ý rằng khi dùng RAM nội thì chỉ dùng địa chỉ từ 00 – 7Fh còn vùng địa chỉ từ 80h – 0FFh dùng cho các thanh ghi chức năng đặc biệt. Đối với họ 89x52, RAM nội có 256 byte thì các byte địa chỉ cao (từ 80h – 0FFh) không thể truy xuất trực tiếp mà phải truy xuất gián tiếp. Ví dụ: MOV A,30h ; Chuyển nội dung ô nhớ 30h vào A MOV A,#30h ; Chuyển giá trị 30h vào A MOV A,80h ; Chuyển nội dung Port 0 vào A (80h là ; địa chỉ Port 0 MOV R0,#80h ; Chuyển nội dung ô nhớ 80h vào A (chỉ MOV A,@R0 ; dùng cho họ 89x52) - Để định nghĩa trước một vùng nhớ trong bộ nhớ chương trình, có thể dùng các chỉ dẫn DB (define byte – định nghĩa 1 byte) hay DW (define word – định nghĩa 2 byte). Ví dụ: Định nghĩa trước dữ liệu cho led như sau: Phạm Hùng Kim Khánh Trang 37
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Led: DB 01h,02h,04h,08h,10h,20h,40h,80h Đoạn chương trình này xác định tại nhãn Led có chứa các giá trị lần lượt từ 01h đến 80h. Nếu nhãn Led đặt tại địa chỉ 100h thì giá trị tương ứng như sau: Địa chỉ Giá trị 100h 01h 101h 02h 102h 04h 103h 08h 104h 10h 105h 20h 106h 40h 107h 80h - Để dễ nhớ và dễ hiểu khi lập trình, các chương trình dịch cho phép dùng các ký tự thay thế cho các ô nhớ bằng các lệnh giả EQU, BIT. Ví dụ: LED EQU 30h ON_LED BIT 00h Giả sử chương trình hợp ngữ có các lệnh sau: MOV A,LED SETB ON_LED Khi biên dịch, chương trình dịch sẽ tự động chuyển thành dạng lệnh sau: MOV A,30h SETB 00h 2.3. Các toán tử Các toán tử số học: Bao gồm các toán tử +, -, *, /, mod. Ví dụ: Các lệnh sau tương đương: MOV A,#12h MOV A,#10h + 2h MOV A,#21 mod 2 MOV A,#1 MOV A,#12/4 MOV A,#3 Phạm Hùng Kim Khánh Trang 38
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Các toán tử logic: Bao gồm các toán tử: OR, AND, NOT, XOR. Ví dụ: Các lệnh sau tương đương: MOV A,#01h MOV A,#03h AND 91h MOV A,#-5 MOV A,#NOT 5 MOV A,#24h MOV A,#20h OR 04h Các toán tử quan hệ: Bao gồm các toán tử: EQ (=), NE ( ), GE (>=). Lưu ý rằng khí sử dụng các toán tử quan hệ, chỉ có 2 kết quả: sai (= 0) hay đúng (= FFh hay FFFFh tuỳ theo kết quả là 8 bit hay 16 bit). Ví dụ: Các lệnh sau tương đương: MOV A,#00h MOV A,#5 EQ 6 MOV A,#0FFh MOV A,#7 < 9 MOV DPTR,#0FFFFh MOV DPTR,#5 NE 6 Các toán tử khác: Bao gồm các toán tử: SHR (dịch phải), SHL (dịch trái), HIGH (byte cao), LOW (byte thấp), (, ). Ví dụ: Các lệnh sau tương đương: MOV A,#06h MOV A,#03h SHL 1 MOV A,#01h MOV A,#HIGH 0123h MOV A,#02h MOV A,#LOW 0102h 2.4. Cấu trúc chương trình - Cấu trúc chương trình hợp ngữ cơ bản mô tả như sau: ORG 0000h ; Đặt lệnh LJMP main tại địa chỉ LJMP main ; 0000h (địa chỉ bắt đầu khi ; reset AT89C51) ORG 0030h ; Vùng địa chỉ 0003h – 002Fh Main: ; dùng để chứa các chương trình ; phục vụ ngắt Phạm Hùng Kim Khánh Trang 39
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 CALL Subname ; Subname: RET END ; kết thúc chương trình Các lệnh giả ORG cho biết lệnh phía sau đặt tại vị trí nào trong chương trình. Lưu ý rằng khi khởi động, chương trình trong AT89C51 sẽ được thực thi tại địa chỉ 0000h nên thông thường tại địa chỉ này sẽ có lệnh LJMP main để xác định chương trình chính sẽ bắt đầu tại nhãn main. Các dấu ; xác định đây là một chú thích, chương trình dịch sẽ bỏ qua tất cả các phần nằm sau dấu ;. Các địa chỉ từ 0003h – 002Fh phục vụ cho mục đích xử lý ngắt nên không sử dụng. Tuy nhiên, nếu chương trình không cần xử lý ngắt thì cũng có thể sử dụng luôn vùng địa chỉ này. - Khi thực hiện soạn thảo chương trình hợp ngữ, có thể dùng bất kỳ chương trình soạn thảo không định dạng (như NotePad, Norton Commander, ) và thường lưu file với phần mở rộng .asm, .a51 (tuỳ theo chương trình dịch). - Sau khi soạn thảo, dùng một chương trình dịch để chuyển từ file văn bản thành file .hex (có thể dùng sim51.exe, oh.exe). Ngoài ra, có nhiều chương trình soạn thảo bao gồm cả chương trình dịch bên trong (xem thêm phần phụ lục). - Khi dịch ra file .hex, dùng một mạch nạp để nạp file .hex vào AT89C51 (xem thêm phụ lục). Phạm Hùng Kim Khánh Trang 40
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 3. Tập lệnh 3.1. Nhóm lệnh chuyển dữ liệu 3.1.1. RAM nội Các lệnh trong nhóm lệnh chuyển dữ liệu trong RAM nội mô tả như bảng sau: Bảng 2.1 – Các lệnh chuyển dữ liệu trong RAM nội Chu kỳ Lệnh Hoạt động Chế độ địa chỉ thực thi Tức thời Trực tiếp Gián tiếp Thanh ghi MOV A,(byte) A = (byte) x x x x 1 MOV (byte),A (byte) = A x x x 1 MOV (byte1) = x x x x 2 (byte1),(byte2) (byte2) MOV DPTR = x 2 DPTR,#data16 data16 SP = SP + 1 PUSH (byte) x 2 [SP] = (byte) (byte) = [SP] POP (byte) x 2 SP = SP – 1 Chuyển đổi dữ XCH A,(byte) liệu giữa ACC x x x 1 và (byte) Chuyển đổi 4 XCHD A,@Ri bit thấp giữa x 1 ACC và @Ri Lệnh MOV (Move): Di chuyển dữ liệu giữa các thanh ghi và bộ nhớ trong đó 128 byte RAM có địa chỉ từ 80h – FFh (chỉ có trong 8x52) chỉ có thể truy xuất bằng cách định địa chỉ gián tiếp. Các dạng của lệnh MOV như sau: MOV A, Rn ; Chuyển nội dung thanh ghi Rn vào thanh ghi A MOV Rn, A ; Chuyển nội dung thanh ghi A vào thanh ghi Rn MOV A, direct ; Chuyển nội dung ô nhớ trực tiếp vào thanh ghi A MOV direct, A ; Chuyển nội dung thanh ghi A vào ô nhớ trực tiếp MOV A,@Ri ; Chuyển nội dung của ô nhớ có địa chỉ chứa trong Ri vào A MOV @Ri,A ; Chuyển nội dung củaA vào ô nhớ có địa chỉ chứa trong Ri Phạm Hùng Kim Khánh Trang 41
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 MOV A, #data8 ; Chuyển giá trị 8 bit vào A MOV Rn, direct; Chuyển nội dung ô nhớ trực tiếp vào thanh ghi Rn MOV direct, Rn ; Chuyển nội dung thanh ghi Rn vào ô nhớ trực tiếp MOV Rn, #data8; Chuyển giá trị 8 bit vào Rn MOV direct, direct; Chuyển nội dung giữa 2 ô nhớ trực tiếp MOV direct, @Ri; Chuyển nội dung của ô nhớ có địa chỉ chứa trong Ri vào ô nhớ trực tiếp MOV @Ri, direct; Chuyển nội dung của ô nhớ trực tiếp vào ô nhớ có địa chỉ chứa trong Ri MOV direct, #data8; Chuyển giá trị 8 bit vào ô nhớ trực tiếp MOV @Ri, #data8; Chuyển giá trị 8 bit vào ô nhớ có địa chỉ chứa trong Ri MOV C, bit ; Chuyển giá trị 1 bit vào cờ C MOV bit, C ; Chuyển giá trị cờ C vào 1 bit MOV DPTR, #data16 ; Chuyển giá trị tức thời 16 bit vào thanh ghi DPTR Trong lệnh MOV, khi sử dụng địa chỉ trực tiếp từ 80h – FFh thì có thể thay bằng các từ gợi nhớ của các thanh ghi chức năng đặc biệt. Ví dụ: lệnh MOV A, 80h có thể thay thế bằng lệnh MOV A, P0 (xem thêm bảng 1.2, chương 1). Khi lệnh MOV thực hiện truy xuất bit, các bit có thể là địa chỉ trực tiếp (từ 00h – 7Fh) hay các từ gợi nhớ đã được định nghĩa. Các bit được định nghĩa trước mô tả như sau: Bảng 2.2 – Các bit được định nghĩa trước trong 8951 Thanh ghi Từ gợi nhớ Địa chỉ bit Thanh ghi Từ gợi nhớ Địa chỉ bit A ACC.0 – ACC.7 E0h – E7h B B.0 – B.7 F0h – F7h CY hay C D7h SM0 9Fh AC D6h SM1 9Eh F0 D5h SM2 9Dh RS1 D4h REN 9Ch PSW SCON RS0 D3h TB8 9Bh OV D2h RB8 9Ah P D0h TI 99h RI 98h P0.0 – P0.7 80h – 87h PS BCh P1.0 – P1.7 90h – 97h PX1 BBh Các thanh P2.0 – P2.7 A0h – A7h IP PT1 BAh ghi Port P3.0 – P3.7 B0h – B7h PX0 B9h PT0 B8h Phạm Hùng Kim Khánh Trang 42
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 EA AFh TF1 8Fh ES ACh TR0 8Eh EX1 ABh TF0 8Dh ET1 AAh TR0 8Ch IE TCON EX0 A9h IE1 8Bh ET0 A8h IT1 8Ah IE0 89h IT0 88h Ví dụ: Lệnh MOV C, P0.0 có thể thay bằng lệnh MOV C, 80h. Lệnh PUSH / POP: Các lệnh này cho phép cất hay lấy nội dung của stack. Khi thực hiện lệnh PUSH, nội dung thanh ghi SP tăng lên 1 và cất byte vào stack. Khi thực hiện lệnh POP, byte được lấy ra từ stack và sau đó giảm SP 1 giá trị. Lưu ý rằng khi sử dụng 8951, do bộ nhớ nội chỉ có 128 byte (00h – 7Fh) nên giá trị của SP không được vượt quá 7Fh (nếu vượt qua thì dữ liệu sẽ bị mất khi dùng lệnh PUSH và dữ liệu không xác định khi dùng lệnh POP). Còn đối với 8x52, do RAM nội là 256 byte nên không có hiện tượng này. Các dạng của lệnh PUSH / POP: PUSH direct ; Cất vào stack POP direct ; Lấy dữ liệu từ stack Lưu ý rằng lệnh PUSH và POP chỉ dùng cho địa chỉ trực tiếp nên không thể thực hiện lệnh PUSH Rn do thanh ghi Rn có 4 địa chỉ khác nhau tuỳ theo bank thanh ghi sử dụng. Xét thanh ghi R0: 4 địa chỉ của R0 ứng với 4 bank là 00h, 08h, 10h, 18h. Mặc định khi reset, bank 0 được sử dụng nên các thanh ghi Rn có địa chỉ từ 00h – 07h. Khi đó thay vì dùng lệnh PUSH R0, ta có thể thay bằng lệnh PUSH 00h. Lệnh XCH / XCHD (Exchange / Exchange Digit): Lệnh XCH / XCHD dùng để hoán chuyển 8 bit / 4 bit thấp của thanh ghi A với các thanh ghi khác hay bộ nhớ (lệnh XCHD chỉ dùng cho bộ nhớ nội định địa chỉ gián tiếp). Các dạng lệnh như sau: XCH A,(byte) ; Hoán chuyển 8 bit XCHD A,@Ri ; Hoán chuyển 4 bit thấp Ví dụ: Xét đoạn lệnh: MOV A, #30h ; A = 30h Phạm Hùng Kim Khánh Trang 43
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 MOV R0, #54h ; R0 = 54h MOV 30h, #20h ; Ô nhớ 30h chứa giá trị 20h hay ;(30h) = 20h XCH A, R0 ; Hoán chuyển giữa A và R0 Æ A = 54h ; và R0 = 30h XCHD A, @R0 ; Chuyển 4 bit thấp giữa A và ô nhớ ; R0 = 30h Æ @R0: nội dung ô nhớ 30h Æ 20h ;Chuyển 4 bit thấpÆ A = 50h và (30h) = 24h 3.1.2. RAM ngoại Các lệnh trong nhóm lệnh chuyển dữ liệu trong RAM ngoại mô tả như sau: Bảng 2.3 – Các lệnh chuyển dữ liệu trong RAM ngoại Lệnh Hoạt động Chu kỳ thực thi MOVX A, @Ri Đọc nội dung từ RAM ngoại tại địa chỉ Ri 2 MOVX @Ri, A Ghi vào RAM ngoại tại địa chỉ Ri 2 MOVX A, @DPTR Đọc nội dung từ RAM ngoại tại địa chỉ DPTR 2 MOVX @DPTR, A Ghi vào RAM ngoại tại địa chỉ DPTR 2 (MOVX : Move eXternal) Đối với các lệnh đọc / ghi dữ liệu của RAM ngoại, chỉ cho phép thực hiện định địa chỉ gián tiếp. Khi địa chỉ RAM là 8 bit thì dùng thanh ghi R0 hay R1 còn nếu là địa chỉ 16 bit thì phải dùng thanh ghi DPTR. Lưu ý rằng khi dùng địa chỉ 8 bit thì các bit địa chỉ cao không sử dụng nên Port 2 có thể sử dụng cho mục đích khác nhưng nếu dùng địa chỉ 16 bit thì Port 2 chỉ có nhiệm vụ là xuất 8 bit địa chỉ cao. Khi thực hiện lệnh đọc từ RAM ngoại, chân RD sẽ xuống mức thấp còn khi thực hiện lệnh ghi, chân WR xuống mức thấp. 3.1.3. Bảng tìm kiếm Các lệnh trong nhóm lệnh tìm kiếm dữ liệu trong bảng mô tả như sau: Bảng 2.4 – Các lệnh tìm kiếm dữ liệu Chu kỳ thực Lệnh Hoạt động thi Đọc nội dung bộ nhớ chương trình tại địa MOVC A, @A + DPTR 2 chỉ A + DPTR Đọc nội dung bộ nhớ chương trình tại địa MOVC A, @A +PC 2 chỉ A + PC (MOVC: Move Code) Phạm Hùng Kim Khánh Trang 44
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Các lệnh này cho phép tìm kiếm dữ liệu đã định nghĩa sẵn trong bộ nhớ chương trình (nếu bộ nhớ chương trình là ROM ngoại thì tín hiệu đọc là PSEN ). Các thanh ghi DPTR hay PC (Program Counter: bộ đếm chương trình – xác định địa chỉ của lệnh kế tiếp sẽ thực hiện) chứa vị trí nền của các bảng tìm kiếm còn thanh ghi A chứa vị trí của phần tử (thông thường kích thước 1 phần tử trong bảng tìm kiếm là 1 byte). Ví dụ: Lấy phần tử thứ 2 trong bảng LED_7S: MOV A, #2 ; Phần tử thứ 2 MOV DPTR, #LED_7S ; Địa chỉ nền của bảng tìm kiếm MOVC A, @A + DPTR ; Đọc nội dung phần tử LED_7S: DB data8, data8, data8, data8, ; Nội dung bảng tìm kiếm có thể đặt tuỳ ý trong bộ nhớ chương trình Để sử dụng thanh ghi PC tìm kiếm dữ liệu, quá trinh tìm kiếm phải thưc hiện thông qua chương trình con và bảng phải được đặt ngay sau chương trình con. Ví dụ: Lấy phần tử thứ 2 trong bảng LED_7S: MOV A, #2 ; Phần tử thứ 2 CALL Read_Led7s Read_Led7s: MOVC A, @A+PC RET LED_7S: DB 0, data8, data8, data8, data8, ; Nội dung bảng tìm kiếm Lưu ý rằng trong đoạn lệnh trên, khi thực hiện lệnh MOVC, thanh ghi PC sẽ chỉ đến lệnh kế tiếp là lệnh RET chứ không phải bảng LED_7S. Do đó, bảng tìm kiếm trong trường hợp này sẽ không có phần tử 0 mà bắt đầu tại phần tử 1. Để chương trình giống như cách thực hiện dùng DPTR, cần phải thay đổi chương trình con như sau: Ví dụ: Lấy phần tử thứ 2 trong bảng LED_7S: MOV A, #2 ; Phần tử thứ 2 CALL Read_Led7s Read_Led7s: INC A ; Tăng nội dung A lên 1 để hiệu chỉnh vị trí bảng MOVC A, @A+PC RET Phạm Hùng Kim Khánh Trang 45
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 LED_7S: DB data8, data8, data8, data8, ; Nội dung bảng tìm kiếm 3.2. Nhóm lệnh xử lý bit Họ MCS-51 chứa một bộ xử lý bit hoàn chỉnh. RAM nội có 128 bit có thể xử lý bit và các thanh ghi chức năng đặc biệt có thể hỗ trợ lên tới 128 bit (các bit trong SFR xem tại bảng 2.2). Các địa chỉ bit từ 00h – 7Fh nằm trong RAM nội còn các địa chỉ từ 80h – FFh nằm trong SFR. Các lệnh trong nhóm lệnh logic mô tả như trong bảng sau: Bảng 2.5 – Các lệnh logic Lệnh Hoạt động Chu kỳ thực thi ANL C,bit C = C AND bit 2 ANL C,/bit C = C AND (NOT bit) 2 ORL C,bit C = C OR bit 2 ORL C,/bit C = C OR (NOT bit) 2 MOV C,bit C = bit 1 MOV bit,C Bit = C 2 CLR C C = 0 1 CLR bit Bit = 0 1 SETB C C = 1 1 SETB bit Bit = 1 1 CPL C C = NOT C 1 CPL bit Bit = NOT bit 1 JC rel Nhảy đến nhãn rel nếu C = 1 2 JNC rel Nhảy đến nhãn rel nếu C = 0 2 JB bit,rel Nhảy đến nhãn rel nếu bit = 1 2 JNB bit,rel Nhảy đến nhãn rel nếu bit = 0 2 JBC bit,rel Nhảy đến nhãn rel nếu bit = 1 và sau đó xoá bit 2 ANL: And logic; ORL: Or logic; CLR: Clear; CPL: Complement Bit: các bit trong RAM nội từ 00h – 7Fh hay trong SFR theo bảng 2.2 Rel: địa chỉ tương đối (cho phép trong vùng từ -128 ÷ 127 byte trong bộ nhớ chương trình) Ví dụ: Chuyển từ bit 00h vào P1.0 MOV C, 00h ; Chuyển bit 00h vào cờ Carry MOV P1.0, C ; Chuyển cờ Carry vào P1.0 Lưu ý rằng trong tập lệnh logic không có lệnh XOR mà phải thực hiện bằng phần mềm, cụ thể như sau: Thực hiện lệnh C = C XRL bit: Phạm Hùng Kim Khánh Trang 46
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 JNB bit, next CPL C Next: Ngoài ra, các lệnh nhảy trên đều dùng địa chỉ tương đối, nghĩa là chỉ cho phép trong vùng từ -128 ÷ 127 byte. Nếu cần nhảy đến dịa chỉ xa hơn thì phải dùng các lệnh nhảy khác, như mô tả trong phần sau. 3.3. Nhóm lệnh chuyển điều khiển Nhóm lệnh chuyển điều khiển bao gồm các lệnh nhảy, các lệnh liên quan đến chương trình con, mô tả như sau: Bảng 2.6 – Các lệnh chuyển điều khiển Lệnh Hoạt động Chu kỳ thực thi JMP addr Nhảy tới nhãn addr 2 JMP @A+DPTR Nhảy tới địa chỉ A + DPTR 2 CALL addr Gọi chương trình con tại địa chỉ addr 2 RET Trở về từ chương trình con 2 RETI Trở về từ chương trình con phục vụ ngắt2 NOP Không làm gì cả 1 JMP: Jump RET: Return RETI: Return from Interrupt NOP: No Operation Chu kỳ Lệnh Hoạt động Chế độ địa chỉ thực thi Tức Trực Gián Thanh thời tiếp tiếp ghi Nhảy đến nhãn rel JZ rel Chỉ dùng cho thanh ghi A 2 nếu A = 0 Nhảy đến nhãn rel JNZ rel Chỉ dùng cho thanh ghi A 2 nếu A ≠ 0 (byte) = (byte) - 1 DJNZ Nếu (byte) ≠ 0 thì x x 2 (byte),rel nhảy đến nhãn rel CJNE Nhảy đến nhãn rel x x 2 A,(byte),rel nếu A ≠ (byte) CJNE (byte), Nhảy đến nhãn rel x x 2 #data8,rel nếu (byte) ≠ data8 JZ: Jump if Zero; JNZ: Jump if Not Zero DJNZ: Decrement and Jump if Not Zero Phạm Hùng Kim Khánh Trang 47
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 CJNE: Compare and Jump if Not Equal Lệnh JMP (Jump): Lệnh JMP bao gồm 3 lệnh: LJMP (Long jump), AJMP (Absolute jump) và SJMP (Short jump) cho phép nhảy đến một vị trí bất kỳ trong chương trình. Lệnh LJMP có kích thước 3 byte trong đó 1 byte mã lệnh và 2 byte chứa địa chỉ nhãn nên phạm vi biểu diễn địa chỉ là 64K (2 byte = 16 bit Æ phạm vi biểu diễn 216 = 26 x 210 = 64K). Do đó lệnh LJMP có thể thực hiện nhảy đến bất kỳ vị trí nào trong chương trình và địa chỉ sử dụng trong lệnh LJMP là địa chỉ tuyệt đối. Lệnh SJMP có kích thước 2 byte trong đó có 1 byte mã lệnh và 1 byte địa chỉ nên phạm vi biểu diễn địa chỉ là 256 byte. Trong lệnh này, địa chỉ sử dụng không phải là địa chỉ tuyệt đối mà là địa chỉ tương đối (khoảng nhảy tính từ vị trí bắt đầu lệnh). Do byte địa chỉ sử dụng phương pháp bù 2 nên phạm vi biểu diễn từ -128 ÷ + 127, nghĩa là phạm vi nhảy của lệnh SJMP chỉ trong phạm vi từ - 128 đến 127 byte. Phạm vi thực hiện mô tả như hình vẽ. 128 byte SJMP rel 127 byte Hình 2.1 – Phạm vi thực hiện của lệnh SJMP Lệnh AJMP có kích thước 2 byte trong đó địa chỉ chứa trong 11 bit nên phạm vi biểu diễn địa chỉ là 211 (2K). Trong khi đó, vùng địa chỉ tối đa của MCS-51 là 64K nên khi thực hiện lệnh AJMP, 64K chương trình phải chia thành từng vùng 2K (tổng cộng 32 vùng) và lệnh AJMP chỉ có thể thực hiện trong một vùng. Tuy nhiên, khi lập trình cho MCS-51, thông thường các chương trình dịch đều cho phép sử dụng lệnh JMP thay thế cho 3 lệnh trên. Khi biên dịch, chương trình dịch sẽ tự động thay thế bằng các lệnh thích hợp. Phạm Hùng Kim Khánh Trang 48
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 0000h 2K Phạm vi AJMP rel thực hiện 07FFh F800h 2K Phạm vi AJMP rel thực hiện FFFFh Hình 2.2 – Phạm vi thực hiện của lệnh AJMP Lệnh JMP @A + DPTR cho phép chọn các vị trí nhảy khác nhau tuỳ theo giá trị trong thanh ghi A. Địa chỉ nhảy đến chính là tổng giá trị của thanh ghi A và DPTR. Ví dụ: MOV DPTR, # JUMP_TABLE ; Địa chỉ bảng nhảy MOV A, INDEX_NUMBER ; Vị trí nhảy MOV B, #3 ; x3 do lệnh LJMP MUL AB ; có kích thước 3 JMP @ A + DPTR JUMP_TABLE: LJMP LABEL0 ; Vị trí nhảy 0 LJMP LABEL1 ; Vị trí nhảy 1 LJMP LABEL2 ; Vị trí nhảy 2 LJMP LABEL3 ; Vị trí nhảy 3 LJMP LABEL4 ; Vị trí nhảy 4 Phạm Hùng Kim Khánh Trang 49
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Lệnh CALL, RET, RETI: Lệnh CALL dùng để gọi chương trình con, bao gồm 2 lệnh: ACALL (Absolute Call) và LCALL (Long Call). Vị trí có thể gọi lệnh CALL giống như đã xét trong lệnh JMP. Khi lập trình, thông thường các chương trình dịch cũng cho phép thay thế duy nhất bằng lệnh CALL và khi biên dịch, lệnh CALL sẽ được thay thế bằng lệnh ACALL hay LCALL tuỳ theo vị trí gọi lệnh. Lưu ý rằng khi thực hiện lệnh CALL thì trong chương trình con phải kết thúc bằng lệnh RET. Ngoài ra, khi sử dụng các chương trình con phục vụ ngắt, khi kết thúc phải dùng lệnh RETI. Lệnh RETI và lệnh RET chỉ khác nhau ở chỗ lệnh RETI báo cho hệ thống điều khiển ngắt biết rằng quá trình xử lý ngắt đã thực hiện xong. Lệnh JZ, JNZ: Lệnh JZ và JNZ dùng để kiểm tra nội dung của thanh ghi A. Lệnh JZ nhảy khi A = 0 và JNZ nhảy khi A ≠ 0. Lưu ý rằng phạm vi nhảy chỉ cho phép trong khoảng từ -128 ÷ 127 byte (giống như khi sử dụng lệnh SJMP). Lệnh DJNZ: Lệnh DJNZ thường được dùng để tạo vòng lặp. Số lần lặp được chuyển vào thanh ghi đếm ở đầu vòng lặp (thanh ghi đếm có thể dùng bất kỳ thanh ghi nào hay là bộ nhớ). Ví dụ: MOV R7, #10 ; Lặp 10 lần LOOP: DJNZ R7, LOOP Lệnh CJNE: Lệnh CJNE dùng để so sánh 2 giá trị với nhau, khi 2 giá trị này khác nhau thì sẽ thực hiện lệnh nhảy. Lưu ý rằng trong tập lệnh của MCS-51 không có lệnh lớn hơn hay nhỏ hơn nên chỉ có thể thực hiện các lệnh này bằng cách kết hợp lệnh CJNE và nội dung của cờ Carry. Trong lệnh CJNE, nếu byte đầu tiên nhỏ hơn byte thứ hai thì CF = 1. Ngược lại (byte đầu tiên lớn hơn hay bằng byte thứ hai) thì CF = 0. Ví dụ: Kiểm tra nội dung của thanh ghi A, nếu A nhỏ hơn 10 thì xuất giá trị trong thanh ghi A ra Port 1. Ngược lại thì xuất giá trị 10 ra Port 1. Phạm Hùng Kim Khánh Trang 50
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 CJNE A,#10,Khacnhau; So sánh A với 10 JMP Xuat10 ; Nếu A = 10 thì xuất giá trị 10 Khacnhau: JC XuatA ; Nếu CF = 1 (A < 10) thì xuất nội Xuat10: ; dung trong A ra P1 MOV P1,#10 SJMP Tiep XuatA: MOV P1,A Tiep: 3.4. Nhóm lệnh logic Nhóm lệnh logic bao gồm các lệnh liên quan đến xử lý logic theo từng byte, mô tả như sau: Bảng 2.7 – Các lệnh logic Chu kỳ Lệnh Hoạt động Chế độ địa chỉ thực thi Tức Trực Gián Thanh thời tiếp tiếp ghi ANL A,(byte) A = A AND (byte) x x x x 1 ANL (byte),A (byte)=(byte) AND A x 1 (byte)=(byte)AND ANL (byte),#data8 x 2 data8 ORL A,(byte) A = A OR (byte) x x x x 1 ORL (byte),A (byte)=(byte) OR A x 1 (byte)=(byte) OR ORL (byte),#data8 x 2 data8 XRL A,(byte) A = A XOR (byte) x x x x 1 XRL (byte),A (byte)=(byte) XOR A x 1 (byte)=(byte) XOR XRL (byte),#data8 x 2 data8 CLR A A = 0 Chỉ dùng cho thanh ghi A 1 CPL A A = NOT A Chỉ dùng cho thanh ghi A 1 Quay phải thanh ghi RR A Chỉ dùng cho thanh ghi A 1 A 1 bit Quay phải thanh ghi RLC A Chỉ dùng cho thanh ghi A 1 A và CF 1 bit Quay trái thanh ghi A RL A Chỉ dùng cho thanh ghi A 1 1 bit Phạm Hùng Kim Khánh Trang 51
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Quay trái thanh ghi A RLC A Chỉ dùng cho thanh ghi A 1 và CF 1 bit Đổi vị trí nibble cao SWAP A Chỉ dùng cho thanh ghi A 1 và thấp của ACC RL: Rotate Left, RLC: Rotate Left through Carry RR: Rotate Right; RRC: Rotate Right through Carry Lệnh ANL, ORL, XRL: Các lệnh logic này thực hiện giống như trong các lệnh xử lý bit nhưng thực hiện trên 8 bit của các thanh ghi hay bộ nhớ. Lệnh XRL còn được dùng để đảo tất cả các bit như sau: XRL P0, #0FFh Lệnh RR, RRC, RL, RLC: Các lệnh này dùng để quay phải hay quay trái thanh ghi A 1 bit. Ví dụ: Giả sử thanh ghi A = 39h (0011 1001b), CF = 1. Nội dung thanh ghi A sau khi thực hiện các lệnh quay tương ứng như sau: RR A: Trước khi quay: 0 0 1 1 1 0 0 1 Sau khi quay: 1 0 0 1 1 1 0 0 RL A: A = 0111 0010b (72h) RRC A: Trước khi quay: ACC CF 0 0 1 1 1 0 0 1 1 Sau khi quay: ACC CF 1 0 0 1 1 1 0 0 1 Phạm Hùng Kim Khánh Trang 52
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 RLC A: A = 0111 0011b (73h); CF = 0 Lệnh SWAP: Lệnh SWAP A dùng để hoán chuyển nội dung 2 nibble trong thanh ghi A. VÍ Dụ: Nếu nội dung thanh ghi A = 39h thì sau khi thực hiện lệnh SWAP A, nội dung thanh ghi A là 93h. 3.5. Nhóm lệnh số học Các lệnh trong nhóm lệnh số học mô tả như trong bảng sau: Bảng 2.8 – Các lệnh số học Chu kỳ Lệnh Hoạt động Chế độ địa chỉ thực thi Tức thời Trực tiếp Gián tiếp Thanh ghi ADD A = A + x x x x 1 A,(byte) (byte) ADDC A = A + x x x x 1 A,(byte) (byte) + C SUBB A = A - x x x x 1 A,(byte) (byte) - C INC A A = A + 1 Chỉ dùng cho thanh ghi tích luỹ ACC 1 INC (byte) = x x x 1 (byte) (byte) + 1 INC DPTR = Chỉ dùng cho thanh ghi con trỏ lệnh DPTR 2 DPTR DPTR + 1 DEC A A = A - 1 Chỉ dùng cho thanh ghi tích luỹ ACC 1 DEC (byte) = x x x 1 (byte) (byte) - 1 Chỉ dùng cho thanh ghi tích luỹ ACC và MUL AB B_A = B x A 4 thanh ghi B A = A div B Chỉ dùng cho thanh ghi tích luỹ ACC và DIV AB 4 B = A mod B thanh ghi B Hiệu chỉnh DA A Chỉ dùng cho thanh ghi tích luỹ ACC 1 trên số BCD Lệnh ADD: Thực hiện cộng giữa thanh ghi tích luỹ A và một toán hạng khác. Lệnh ADD ảnh hưởng đến các cờ Carry (C), Overflow (OV) và Auxiliary (AC). Phạm Hùng Kim Khánh Trang 53
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 Lệnh ADD có 4 chế độ địa chỉ khác nhau: - ADD A, #30h ; định địa chỉ tức thời (A = A + 30h) - ADD A, 30h ; định địa chỉ trực tiếp (A = A + [30h] trong đó [30h] là giá trị của RAM nội có địa chỉ 30h) - ADD A, @R0 ; định địa chỉ gián tiếp (A = A + [R0] trong đó [30h] là giá trị của RAM nội có địa chỉ chứa trong thanh ghi R0) MOV R0,#30h ; R0 = 30h ADD A,@R0 ; A = A + [R0] = A + [30h] (cộng nội dung của thanh ghi ACC với RAM nội có địa chỉ 30h) - ADD A,R0 ; định địa chỉ thanh ghi (A = A + R0) Lệnh ADDC, SUBB: Thực hiện cộng hay trừ nội dung của thanh ghi A với một toán hạng khác trong đó có dùng thêm cờ Carry. Lệnh ADDC và SUBB ảnh hưởng đến các cờ C, OV và AC. Lệnh MUL: Nhân nội dung của thanh ghi A với thanh ghi B. Lệnh MUL ảnh hưởng đến cờ OV và xoá cờ C (C = 0). Ví dụ: MOV A,#50 ; 50 x 25 = 1250 Æ 04E2h MOV B,#25 ; byte cao = 04h, byte thấp = E2h MUL AB ; B = 04h, A = E2h Lệnh DIV: Chia nội dung của thanh ghi A cho thanh ghi B. Lệnh DIV ảnh hưởng đến cờ OV và xoá cờ C (C = 0). Ví dụ: MOV A,#250 ; 250 / 40 = 6 dư 10 MOV B,#40 ; DIV AB ; B = 0Ah (10), A = 06h Lệnh DA A: Hiệu chỉnh nội dung thanh ghi A sau khi thực hiện các phép toán liên quan đến số BCD. Quá trình thực hiện lệnh DA A mô tả như sau: Phạm Hùng Kim Khánh Trang 54
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 - Nếu A[3-0] > 9 hay AC = 1 thì A[3-0] = A[3-0] + 6 - Nếu A[7-4] > 9 hay C = 1 thì A[7-4] = A[7-4] + 6 Lệnh DA A cũng ảnh hưởng đến cờ C. Phạm Hùng Kim Khánh Trang 55
- Giáo trình Vi điều khiển Lập trình hợp ngữ trên vi điều khiển MCS-51 BÀI TẬP CHƯƠNG 2 1. Xác định giá trị của các biểu thức sau: a. (10 SHL 2) OR ( 1000 1000b) b. (5*2 – 10 SHR 1) AND (11h) c. HIGH(10000) d. LOW(-30000) 2. Viết đoạn chương trình đọc nội dung của ô nhớ 30h. Nếu giá trị đọc lớn hơn hay bằng 10 thì xuất 10 ra P0, ngược lại thì xuất giá trị vừa đọc ra P0. 3. Viết đoạn chương trình xuất các giá trị trong ô nhớ 30h – 3Fh ra P1 (giữa các lần xuất có thời gian trì hoãn). 4. Viết đoạn chương trình theo yêu cầu sau: - Đọc dữ liệu từ P1 (10 lần) và lưu giá trị đọc mỗi lần vào ô nhớ 30h – 39h (mỗi lần đọc có trì hoãn một khoảng thời gian). - Tìm giá trị lớn nhất trong các ô nhớ 30h – 39h, lưu vào ô nhớ 3Ah và xuất giá trị này ra P2. - Kiểm tra nội dung ô nhớ 3Ah, nếu = 0 thì quay lại đầu chương trình, ngược lại thì xuất giá trị này ra P3. 5. Viết đoạn chương trình theo yêu cầu: - B1: Kiểm tra bit P3.0: P3.0 Thực hiện = 0 Đến bước 2 = 1 Đến bước 3 - B2: Đọc dữ liệu từ P2, đảo tất cả các bit và xuất ra P0. Sau đó quay lại bước 1. - B3: xuất nội dung tại ô nhớ 30h ra P1 và quay lại bước 1 Phạm Hùng Kim Khánh Trang 56
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Chương 3: CÁC HOẠT ĐỘNG CỦA VI ĐIỀU KHIỂN MCS-51 Chương này giới thiệu về các hoạt động đặc trưng của họ vi điều khiển MCS- 51: định thời, cổng nối tiếp, ngắt và các cách thức để điều khiển các hoạt động này. 1. Hoạt động định thời (Timer / Counter) 1.1. Giới thiệu AT89C51 có 2 bộ định thời 16 bit có thể hoạt động ở các chế độ khác nhau và có khả năng định thời hay đếm sự kiện (Timer 0 và Timer 1). Khi hoạt động định thời (timer), bộ Timer / Counter sẽ nhận xung đếm từ dao động nội còn khi đếm sự kiện (counter), bộ Timer / Counter nhận xung đếm từ bên ngoài. Bộ Timer / Counter bên trong AT89C51 là các bộ đếm lên 8 bit hay 16 bit tuỳ theo chế độ hoạt động. Mỗi bộ Timer / Counter có 4 chế độ hoạt động khác nhau và được dùng để: - Đếm sự kiện tại các chân T0 (chân 14) hay T1 (chân 15). - Chờ một khoảng thời gian. - Tạo tốc độ cho port nối tiếp. Quá trình điều khiển hoạt động của Timer / Counter được thực hiện thông qua các thanh ghi sau: Bảng 3.1 – Các thanh ghi điều khiển hoạt động Timer / Counter Thanh ghi Địa chỉ byte Địa chỉ bit TCON 88h 88h – 8Fh TMOD 89h Không TL0 90h Không TL1 91h Không TH0 92h Không TH1 93h Không Ngoài ra, trong họ 8x52 còn có thêm bộ định thời thứ 3 (Timer 2). 1.2. Hoạt động Timer / Counter Hoạt động cơ bản của Timer / Counter gồm có các thanh ghi timer THx và TLx (x = 0, 1) mắc liên tầng tạo thành dạng thanh ghi 16 bit. Khi set bit TRx trong thanh ghi TCON (xem thêm phần 1.3), timer tương ứng sẽ hoạt động và giá trị trong thanh ghi TLx tăng lên 1 sau mỗi xung đếm. Khi TLx tràn (thay đổi từ 255 → 0), giá trị của THx tăng lên 1. Khi THx tràn, cờ tràn tương ứng TFx (trong thanh ghi TCON) sẽ được đưa lên mức 1. Phạm Hùng Kim Khánh Trang 57
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Tuỳ theo nội dung của bit C/T (xem thêm thanh ghi TMOD, phần 1.3), xung đếm có thể lấy từ dao động nội (C/T = 0) hay từ các chân Tx bên ngoài (C/T = 1). Lưu ý rằng phải xoá bit TRx khi thay đổi chế độ hoạt động của Timer. Khi xung đếm lấy từ dao động nội, tốc độ đếm = fOSC/12 hay fOSC/2 trong chế độ X2(nghĩa là nếu fOSC = 12 MHz thì tốc độ xung đếm là 1 MHz hay cứ 1 µs thì có 1 xung đếm trong chế dộ chuẩn) hay tốc độ đếm = fPER/6 (fPER: tần số xung ngoại vi – peripheral clock). Khi lấy xung đếm từ bên ngoài (các chân Tx),bộ đếm sẽ tăng lên 1 khi ngõ vào Tx ở mức 1 trong 1 chu kỳ và xuống mức 0 trong chu kỳ kế tiếp. Do đó, tần số xung tối đa tại các chân Tx là fOSC/24 trong chế độ thường hay fOSC/12 trong chế độ X2 (=fPER/12). 1.3. Các thanh ghi điều khiển hoạt động 1.3.1. Thanh ghi điều khiển timer (TCON – Timer/Counter Control Register) TCON chứa các bit trạng thái và các bit điều khiển cho Timer 1, Timer 0. Bảng 3.2 – Nội dung thanh ghi TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 Bit Ký Địa Mô tả hiệu chỉ TCON.7 TF1 8Fh Cờ báo tràn timer 1 (Timer 1 overflow Flag). Được xoá bởi phần cứng khi chuyển đến chương trình con xử lý ngắt hay xoá bằng phần mềm. Đặt bằng phần cứng khi Timer 1 tràn TCON.6 TR1 8Eh Điều khiển Timer 1 chạy (Timer 1 Run Control Bit). Cho phép Timer 1 hoạt động (= 1) hay ngừng (= 0). TCON.5 TF0 8Dh Timer 0 overflow Flag TCON.4 TR0 8Ch Timer 0 Run Control Bit TCON.3 IE1 8Bh TCON.2 IT1 8Ah Dùng cho ngắt ngoài 0 và 1 (sẽ xét trong phần 3 – xử lý TCON.1 IE0 89h ngắt) TCON.0 IT0 88h Giá trị khi reset: TCON = 00h Phạm Hùng Kim Khánh Trang 58
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 1.3.2. Thanh ghi chế độ timer (TMOD – Timer/Counter Mode) Thanh ghi TMOD chứa hai nhóm 4 bit dùng để đặt chế độ làm việc cho Timer 0, và Timer 1. Lưu ý rằng khi lập trình cho AT89C51, thông thường thanh ghi TMOD chỉ được gán một lần ở đầu chương trình. Bảng 3.3 – Nội dung thanh ghi TMOD GATE1 C/T 1 M11 M01 GATE0 C/T 0 M10 M00 Bit Tên Timer Mô tả Timer 7 GATE1 1 Timer 1 Gating Control Bit GATE = 0: timer hoạt động bình thường GATE = 1: timer chỉ hoạt động khi chân INT1= 1 6 C/T1 1 Timer 1 Timer/Counter Select Bit = 1: đếm bằng xung ngoài tại chân T1 (chân 15) Dùng cho = 0: đếm bằng xung dao động bên trong Timer 1 5 M11 1 Timer 1 Mode Select Bit M11 M01 Chế độ 0 0 13 bit 0 1 8 bit tự động nạp lại 4 M01 1 1 0 16 bit 1 1 Không dùng Timer 1 3 GATE0 0 Timer 0 Gating Control Bit 2 C/T0 0 Timer 0 Timer/Counter Select Bit 1 M10 0 Timer 0 Mode Select Bit Dùng cho 0 M00 0 Các chế độ giống như timer 1 trong đó chế độ 3 Timer 0 dùng TH0 và TL0 làm 2 giá trị đếm của timer 0 và timer 1 (xem thêm phần 1.4) Giá trị khi reset: TMOD = 00h Ngoài ra, Timer còn các thanh ghi chứa giá trị đếm: TH0, TL0 (Timer 0) và TH1, TL1 (Timer 1), mỗi thanh ghi có kích thước 8 bit. Giá trị các thanh ghi này khi reset cũng là 00h. 1.4. Các chế độ hoạt động Các chế độ của timer được xác định bằng 4 bit trong thanh ghi TMOD, trong đó 4 bit thấp điều khiển timer 0 và 4 bit cao điều khiển timer 1, mô tả như sau: Phạm Hùng Kim Khánh Trang 59
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 1.4.1. Chế độ 0 Chế độ 0 là chế độ 13 bit bao gồm 8 bit của thanh ghi THx và 5 bit của thanh ghi TLx còn 3 bit cao của thanh ghi TLx không sử dụng. Mỗi lần có xung đếm, giá trị trong thanh ghi 13 bit tăng lên 1. Khi giá trị này thay đổi từ 1 1111 1111 1111b đến 0 thì bộ đếm tràn làm cho TFx được đặt lên mức 1. 13 Do chế độ 0 sử dụng 13 bit nên giá trị đếm tối đa là 2 = 8192. Chế độ này được cung cấp nhằm mục đích tạo khả năng tương thích với 8048 và thường không được sử dụng hiện nay. Hình 3.1 – Chế độ 0 của Timer/Counter 1.4.2. Chế độ 1 Chế độ 1 giống như chế độ 0 nhưng sử dụng 16 bit bao gồm 8 bit của THx và 8 bit của TLx nên giá trị đếm tối đa là 216 = 65536. Như vậy, chế độ 0 và chế độ 1 giống nhau nhưng chỉ khác ở số bit đếm nên thông thường chế độ 0 không sử dụng mà chỉ dùng chế độ 1. Khi bộ đếm tràn (giá trị trong cặp thanh ghi THx_TLx thay đổi từ 1111 1111 1111 1111b đến 0), cờ tràn TFx được set lên mức 1. Lưu ý rằng, khi timer tràn, giá trị của các thanh ghi đếm là 0 (THx = 0 và TLx = 0) nên nếu muốn timer hoạt động tiếp thì phải nạp lại giá trị cho các thanh ghi THx và TLx. Hình 3.2 – Chế độ 1 của Timer/Counter Phạm Hùng Kim Khánh Trang 60
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 1.4.3. Chế độ 2 Chế độ 2 là chế độ 8 bit trong đó sử dụng thanh ghi TLx đế chứa giá trị đếm còn thanh ghi THx chứa giá trị nạp lại (do đó chế độ này được gọi là chế độ tự động nạp lại – autoreload). Trong chế độ 2, mỗi khi giá trị trong thanh ghi TLx thay đổi từ 1111 1111b đến 0 thì cờ TFx được set lên mức 1 đồng thời giá trị trong thanh ghi THx được chuyển vào thanh ghi TLx. Như vậy, giá trị đếm trong TLx và THx chỉ được nạp một lần khi khởi động timer (có thể không cần nạp cho TLx nhưng khi đó chu kỳ hoạt động đầu tiên của timer sẽ sai). Chế độ 2 sử dụng 8 bit đếm trong thanh ghi TLx nên giá trị đếm tối đa là 28 = 256. Hình 3.3 – Chế độ 2 của Timer/Counter 1.4.4. Chế độ 3 Hình 3.4 – Chế độ 3 của Timer/Counter Chế độ 3 sử dụng các thanh ghi TL0 và TH0 như các bộ định thời độc lập trong đó TL0 điều khiển bằng các thanh ghi của timer 0 và TH0 điều khiển bằng các thanh ghi của tỉmer 1. Khi TL0 chuyển từ giá trị 1111 1111b đến 0 thì TF0 được đặt lên mức 1 còn TH0 chuyển từ 1111 1111b đến 0 thì TF1 được đặt lên mức 1. Lưu ý rằng trong chế độ 3 (chỉ có trong Timer 0), Timer 1 không tác động đến cờ TF1 nên thường được Phạm Hùng Kim Khánh Trang 61
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 dùng để tạo tốc độ baud cho port nối tiếp (xem thêm phần 2 – cổng nối tiếp) hay dùng cho mục đích khác. Chế độ này chỉ cho phép tác động đến cờ tràn TF1 thông qua xung đếm của dao động nội mà không đếm bằng dao động ngoài tại chân T1 đồng thời bit GATE1 (TMOD.7) không tác động đến quá trình đếm tại TH0. 1.5. Timer 2 Timer 2 là bộ định thời 16 bit (chỉ có trong họ 8x52). Giá trị đếm của timer 2 chứa trong các thanh ghi TH2 và TL2. Giống như timer 0 và timer1, timer 2 cũng hoạt động như bộ định thời (timer) hay đếm sự kiện (counter). Chế độ định thời đếm bằng dao động nội, chế độ đếm sự kiện đếm bằng xung ngoài tại chân T2 (P1.0) và chọn chế độ bằng bit C/T 2 của thanh ghi T2CON. Các thanh ghi điều khiển timer 2 bao gồm: T2CON, T2MOD, RCAP2H, RCAP2L, TH2 và TL2. Timer 2 có 3 chế độ hoạt động: capture (giữ), autoreload (tự động nạp lại) và tạo tốc độ baud (chọn chế độ trong thanh ghi T2CON). Các bit chọn chế độ được mô tả như bảng 3.4. Bảng 3.4 – Chọn chế độ trong Timer 2 RCLK TCLK CP/ RL 2 TR2 Chế độ 0 0 0 1 Tự động nạp lại 16 bit 0 0 1 1 Giữ 16 bit X 1 X 1 Tạo tốc độ baud 1 X X 1 XX X0Ngưng 1.5.1. Các thanh ghi điều khiển Timer 2 Thanh ghi T2CON: Bảng 3.5 – Nội dung thanh ghi T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T 2CP/RL 2 Bit Tên Mô tả 7 TF2 Timer 2 overflow Flag TF2 không được tác động khi RCLK hay TCLK = 1. TF2 phải được xoá bằng phần mềm và được đặt bằng phần cứng khi Timer tràn 6 EXF2 Timer 2 External Flag Được đặt khi EXEN2 = 1 và xảy ra chế độ nạp lại hay giữ do có cạnh âm tại chân T2EX (P1.1) (chuyển từ 1 xuống 0). Khi EXF2 = 1 và cho phép ngắt tại Timer 2 thì chương trình sẽ chuyển đến chương trình phục vụ ngắt của Timer 2. EXF2 phải được xoá bằng phần mềm Phạm Hùng Kim Khánh Trang 62
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 5 RCLK Receive Clock Bit (chỉ dùng cho port nối tiếp ở chế độ 1 và 3) RCLK = 0: dùng timer 1 làm xung clock thu cho port nối tiếp RCLK = 1: dùng timer 2 làm xung clock thu cho port nối tiếp 4 TCLK Transmit Clock Bit Giống như RCLK nhưng dùng cho xung clock phát 3 EXEN2 Timer 2 External Enable Bit = 0: bỏ qua tác động tại chân T2EX (P1.1) = 1: xảy ra chế độ nạp lại hay giữ do có cạnh âm tại chân T2EX (P1.1) (chuyển từ 1 xuống 0) 2 TR2 Timer 2 Run Control Bit = 0: cấm timer 2 = 1: chạy timer 2 1 C/T 2 Timer / Counter 2 Select Bit = 0: định thời (đếm bằng dao động nội) = 1: đếm sự kiện (đếm bằng xung tại T2 (P1.0)) 0 CP/ RL Timer 2 Capture / Reload Bit 2 Nếu RCLK = 1 hay TCLK = 1: bỏ qua Nếu RCLK = 0 và TCLK = 0: chọn chế độ giữ ( = 1) hay nạp lại (= 0) khi xuất hiện xung âm tại T2EX (P1.1) và EXEN2 = 1 Giá trị khi reset: T2CON = 00h, T2CON cho phép định vị bit Thanh ghi T2MOD: Bảng 3.6 – Nội dung thanh ghi T2MOD - - - - - - T2OE DCEN Bit Tên Mô tả 7 - 6 - 5 - 4 - 3 - 2 - 1 T2OE Timer 2 Output Enable Bit = 0: T2 (P1.0) là ngõ vào clock hay I/O port = 1: T2 là ngõ ra clock 0 DCEN Down Counter Enable Bit = 0: cấm timer 2 là bộ đếm lên / xuống = 1: cho phép timer 2 là bộ đếm lên / xuống Phạm Hùng Kim Khánh Trang 63
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Giá trị khi reset: T2MOD = xxxx xx00b, MOD không cho phép định vị bit Các thanh ghi TH2, TL2, RCAP2H và RCAP2L không cho phép định vị bit và giá trị khi reset là 00h. Các chế độ hoạt động của Timer 2 mô tả trong phần sau. 1.5.2. Chế độ capture Hình 3.5 – Chế độ giữ của Timer 2 Chế độ giữ của Timer 2 có 2 trường hợp xảy ra: - Nếu EXEN2 = 0: Timer 2 hoạt động giống như Timer 0 và 1, nghĩa là khi giá trị đếm tràn (TH2_TL2 thay đổi từ FFFFh đến 0) thì cờ tràn TF2 được đặt lên mức 1 và tạo ngắt tại Timer 2 (nếu cho phép ngắt). - Nếu EXEN2 = 1: vẫn hoạt động như trên nhưng thêm một tính chất nữa là: khi xuất hiện cạnh âm tại chân T2EX (P1.1), giá trị hiện tại của TH2 và TL2 được chuyển vào cặp thanh ghi RCAP2H, RCAP2L (quá trình giữ (capture) xảy ra); đồng thời, bit EXF2 = 1 (sẽ tạo ngắt nếu cho phép ngắt tại Timer 2). 1.5.3. Chế độ tự động nạp lại Chế độ tự động nạp lại cũng có 2 trường hợp giống như chế độ giữ: - Nếu EXEN2 = 0: khi Timer tràn, cờ tràn TF2 được đặt lên 1 và nạp lại giá trị cho TH2, TL2 (từ cặp thanh ghi RCAP2H, RCAP2L) đồng thời tạo ngắt tại timer 2 nếu cho phép ngắt. - Nếu EXEN2 = 1: hoạt động giống như trên nhưng khi có xung âm tại chân T2EX thì cũng nạp lại giá trị cho TH2, TL2 và đặt cờ EXF2 lên 1. Phạm Hùng Kim Khánh Trang 64
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Chế độ tự động nạp lại cũng cho phép thực hiện đếm lên hay xuống (điều khiển bằng bit DCEN trong thanh ghi T2MOD). Khi DCEN được đặt lên 1 và chân T2EX ở mức cao thì timer 2 sẽ đếm lên; còn nếu T2EX ở mức thấp thì timer 2 đếm xuống. Khi đếm lên, tỉmer tràn tại giá trị đếm 0FFFFh. Khi tràn, cờ TF2 được đặt lên mức 1 và giá trị trong cặp thanh ghi RCAP2H, RCAP2L chuyển vào căp thanh ghi TH2, TL2. Khi đếm xuống, timer tràn khi giá trị trong cặp thanh ghi TH2, TL2 bằng giá trị trong cặp thanh ghi RCAP2H, RCAP2L. Khi tràn, cờ TF2 được đặt lên 1 và giá trị 0FFFFh được nạp vào cặp thanh ghi TH2, TL2. Trong chế độ này, khi timer tràn, giá trị trong cờ EXF2 sẽ chuyển mức và không tạo ngắt (có thể dùng thêm EXF2 để tạo giá trị đếm 17 bit). Hình 3.6 – Chế độ tự động nạp lại 1.5.4. Chế độ tạo xung clock Trong chế độ này, timer tạo ra một xung clock có chu kỳ bổn phận (duty cycle) 50%. Khi timer tràn, nội dung của thanh ghi RCAP2H, RCAP2L được nạp vào cặp thanh ghi TH2, TL2 và timer tiếp tục đếm. Tần số xung clock tại chân T2 được xác định theo công thức sau: f x2 X2 f = OSC ⎛ RCAP2H ⎞ 2⎜65536 − ⎟ ⎝ RCAP2L ⎠ Phạm Hùng Kim Khánh Trang 65
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 X2: bit nằm trong thanh ghi CKCON. Trong chế độ X2: fOSC = fthạch anh, ngược lại thì fOSC = fthạch anh/2. Để timer 2 hoạt động ở chế độ tạo xung clock, cần thực hiện các bước sau: - Đặt bit T2OE trong thanh ghi T2MOD = 1. - Xoá bit C/T 2 trong thanh ghi T2CON = 0 (do chế độ này không cho phép đếm bằng dao động ngoài mà chỉ đếm bằng dao động nội). - Xác định giá trị của cặp thanh ghi RCAP2H và RCAP2L theo tần số xung clock cần tạo. - Khởi động giá trị cho cặp thanh ghi TH2, TL2 (có thể không cần thiết tuỳ theo ứng dụng). - Đặt bit TR2 trong thanh ghi T2CON = 1 để cho phép timer chạy. Hình 3.7 – Chế độ tạo xung clock 1.5.5. Chế độ tạo tốc độ baud Khi các bit TCLK và RCLK trong thanh ghi T2CON được đặt lên mức 1, timer 2 sẽ dùng để tạo tốc độ baud cho cổng nối tiếp. Chế độ này cùng hoạt động như timer 0 và timer 1 (sẽ khảo sát cụ thể tại phần 2 – cổng nối tiếp). Phạm Hùng Kim Khánh Trang 66
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 1.6. Các ví dụ Để điều khiển hoạt động của timer, cần thực hiện: - Nạp giá trị cho thanh ghi TMOD để xác định chế độ hoạt động (thông thường chỉ dùng chế độ 1 – 16 bit và chế độ 2 – 8 bit tự động nạp lại). - Nạp giá trị đếm trong các thanh ghi THx, TLx (thông thường sử dụng timer 0 và timer 1 nên quá trình đếm là đếm lên). - Đặt các bit TR0, TR1 = 1 (cho phép timer hoạt động) hay xoá các bit này về 0 (cấm timer). - Trong quá trình timer chạy, thực hiện kiểm tra các bit TF0, TF1 để xác định timer đã tràn hay chưa. - Sau khi timer tràn, nếu thực hiện kiểm tra tràn bằng phần mềm (không dùng ngắt) thì phải thực hiện xoá TF0 hay TF1 để có thể tiếp tục hoạt động. Ví dụ 1: Viết chương trình tạo sóng vuông tần số 10 KHz tại chân P1.0 dùng timer 0 (tần số thạch anh là fOSC = 12MHz). Giải Do fOSC = 12MHz nên chu kỳ máy = 1 µs. f = 10 KHz Æ T = 1/f = 0.1 ms = 100 µs Æ một chu kỳ sóng vuông chiếm khoảng thời gian 100 chu kỳ máy Æ thời gian trì hoãn cần thiết là 50 chu kỳ máy. Trì hoãn 50 chu kỳ máy T = 100 chu kỳ máy Do giá trị đếm là 50 (ứng với 50 chu kỳ máy) nên chỉ cần dùng chế độ 8 bit (có thể đếm từ 1 đến 256) cho timer 0 (chế độ 2). - Nội dung thanh ghi TMOD: GATE1 C/T1 M11 M10 GATE0 C/T0 M01 M00 0 0 0 0 0 0 1 0 Timer 1 không dùng Không dùng Đếm bằng dao động Chế độ 8 INT0 nội bit TMOD = 0000 0010b (02h) Phạm Hùng Kim Khánh Trang 67
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 - Giá trị đếm là 50 và do timer 0 đếm lên nên giá trị cần nạp cho TH0 là -50 (có thể không cần nạp cho TL0 nhưng lúc đó chu kỳ đầu tiên của xung sẽ sai). Chương trình thực hiện như sau: MOV TMOD,#02h MOV TH0,#(-50) MOV TL0,#(-50) SETB TR0 ; Cho phép timer 0 chạy Lap: JNB TF0,Lap ; Nếu Timer chưa tràn thì chờ CLR TF0 CPL P1.0 ; Đảo bit P1.0 để tạo xung vuông SJMP Lap END Ví dụ 2: Viết chương trình tạo xung vuông tần số f = 1 KHz tại P1.1 dùng timer 1(tần số thạch anh là fOSC = 12MHz). Giải Do fOSC = 12MHz nên chu kỳ máy = 1 µs. f = 1 KHz Æ T = 1/f = 1 ms = 1000 µs Æ một chu kỳ sóng vuông chiếm khoảng thời gian 1000 chu kỳ máy Æ thời gian trì hoãn cần thiết là 500 chu kỳ máy. Giá trị đếm là 500 vượt quá phạm vi của chế độ 8 bit nên phải sử dụng timer 1 ở chế độ 16 bit (chế độ 1). Đối với chế độ 16 bit, do không có giá trị nạp lại nên mỗi khi timer tràn, cần phải nạp lại giá trị cho thanh ghi TH1 và TL1. - Nội dung thanh ghi TMOD: GATE1 C/T1 M11 M10 GATE0 C/T0 M01 M00 0 0 0 1 0 0 0 0 Không dùng Đếm bằng dao động Chế độ 16 Timer 0 không dùng INT1 nội bit TMOD = 0001 0000b (10h) - Giá trị đếm là 500 nên giá trị cần nạp cho cặp thanh ghi TH0_TL0 là -500 (dùng các lệnh giả HIGH và LOW). Chương trình thực hiện như sau: MOV TMOD,#10h Batdau: MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) SETB TR1 ; Cho phép timer 1 chạy Phạm Hùng Kim Khánh Trang 68
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Lap: JNB TF1,Lap ; Nếu Timer chưa tràn thì chờ CLR TF1 CPL P1.1 ; Đảo bit P1.1 để tạo xung vuông CLR TR1 SJMP Batdau ; Quay lại nạp giá trị cho TH0_TL0 END Ví dụ 3: Viết chương trình tạo xung vuông tần số f = 10KHz tại P1.0 dùng timer 0 và xung vuông tần số f = 1 KHz tại P1.1 dùng timer 1. Giải Phân tích cho các thanh ghi giống như phần ví dụ 1 và 2 nhưng lưu ý rằng quá trình kiểm tra timer tràn sẽ khác: thực hiện kiểm tra timer 0, nếu chưa tràn thì kiểm tra timer 1 và kiểm tra tương tự cho timer 1. Chương trình thực hiện như sau: MOV TMOD,#12h MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) MOV TH0,#(-50) MOV TL0,#(-50) SETB TR0 SETB TR1 KtrT0: JNB TF0,KtrT1 CLR TF0 CPL P1.0 KtrT1: JNB TF1,KtrT0 CLR TF1 CPL P1.1 MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) SJMP KtrT0 END Lưu ý rằng, xung vuông tạo bằng cách như trên có thể không chính xác khi 2 timer tràn cùng lúc. Ví dụ 4: Viết chương trình tạo xung vuông tần số f = 1 Hz tại P1.2 dùng timer1. Giải f = 1 Hz Æ T = 1/f = 1 s = 1 000 000 µs Æ một chu kỳ sóng vuông chiếm khoảng thời gian 500 000 chu kỳ máy Æ thời gian trì hoãn cần thiết là 500 000 chu kỳ máy. Phạm Hùng Kim Khánh Trang 69
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Giá trị đếm là 500 000, vượt quá khả năng của timer (tối đa chỉ đếm được 65536 chu kỳ) nên phải thực hiện tạo vòng lặp đếm nhiều lần cho đến khi đạt đến giá trị 500 000 (có thể đếm mỗi lần 50 000 và thực hiện vòng lặp 10 lần). Chương trình thực hiện như sau: MOV TMOD,#10h Batdau: MOV R7,#10 ; Lặp 10 lần Lap: MOV TH1,#HIGH(-50000) MOV TL1,#LOW(-50000) SETB TR1 KtrT1: JNB TF1,KtrT1 CLR TF1 CLR TR0 DJNZ R7,Lap ; Nếu R7 ≠ 0 thì lặp lại CPL P1.2 ; Đảo bit để tạo xung SJMP Batdau END Ví dụ 5: Viết chương trình con tạo thời gian trì hoãn 1s dùng timer 0. Giải Do chương trình yêu cầu tạo thời gian trì hoãn nên số chu kỳ đếm là 1 000 000. Chương trình như sau: MOV TMOD,#01h ; CHƯƠNG TRÌNH CHÍNH ; Delay1s: MOV R7,#20 ; Lặp 20 lần Lap: MOV TH0,#HIGH(-50000) ; Mỗi lần trì hoãn 50 000 µs MOV TL0,#LOW(-50000) SETB TR0 Lap1: JNB TF0,Lap1 CLR TF0 CLR TR0 DJNZ R7,Lap ; Lặp đủ 20 lần thì thoát RET Phạm Hùng Kim Khánh Trang 70
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Lưu ý rằng khi viết chương trình trì hoãn như trên thì chương trình của AT89C51 xem như dừng lại, không làm gì cả (có thể giải quyết bằng cách sử dụng ngắt – xem thêm phần 3). 2. Cổng nối tiếp (Serial port) Cổng nối tiếp trong 89C51 có khả năng hoạt động ở chế độ đồng bộ và bất đồng bộ dùng 2 chân TxD (P3.1) và RxD (P3.0). Chức năng của port nối tiếp là thực hiện chuyển đổi song song sang nối tiếp đối với dữ liệu xuất, và chuyển đổi nối tiếp sang song song đối với dữ liệu nhập. Khi hoạt động ở chế độ truyền / nhận bất đồng bộ (UART – Universal Asynchronous Receiver / Transmitter), cổng nối tiếp có 3 chế độ song công (1, 2 và 3). Quá trình đọc / ghi cổng nối tiếp dùng thanh ghi SBUF (Serial Buffer), thực chất là 2 thanh ghi khác nhau: một thanh ghi truyền và một thanh ghi nhận. Cổng nối tiếp có tất cả 4 chế độ khác nhau: Chế độ 0: dữ liệu truyền / nhận thông qua chân RxD và xung clock dịch bit thông qua TxD với tốc độ baud bằng fthạch anh/12. Chế độ 1: truyền / nhận 10 bit: 1 bit start (luôn = 1), 8 bit dữ liệu và 1 bit stop (luôn = 0), tốc độ baud có thê thay đổi được và khi nhận, bit stop đưa vào RB8 của thanh ghi SCON. Chế độ 2: truyền / nhận 11 bit: 1 bit start, 8 bit dữ liệu, bit thứ 9 và 1 bit stop. Khi truyền, bit 9 là bit TB8 và khi nhận, bit 9 là bit RB8 trong thanh ghi SCON. Tốc độ baud cố định là 1/32 hay 1/64 tần số thạch anh. Chế độ 3: giống chế độ 2 nhưng tốc độ baud có thể thay đổi được. Trong 4 chế độ trên, thường sử dụng chế độ 1 hay 3 để truyền dữ liệu. Trong trường hợp truyền dữ liệu giữa các vi điều khiển AT89C51 với nhau, có thể dùng chế độ 2. Ngoài ra, cổng nối tiếp còn có các chế độ nâng cao: kiểm tra lỗi khung và nhận dạng địa chỉ tự động. Phạm Hùng Kim Khánh Trang 71
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 2.1. Các thanh ghi điều khiển hoạt động 2.1.1. Thanh ghi SCON (Serial port controller) Bảng 3.7 – Nội dung thanh ghi SCON FE/SM0 SM1 SM2 REN TB8 RB8 TI RI Bit Ký Địa Mô tả hiệu chỉ SCON.7 FE Framing Error – kiểm tra lỗi khung Được đặt lên 1 khi phát hiện lỗi tại bit stop và phải xoá bằng phần mềm. Bit FE chỉ truy xuất được khi bit SMOD0 9Fh = 1 (trong thanh ghi PCON). SM0 Serial port Mode bit 0 - Xác định chế độ cho cổng nối tiếp SCON.6 SM1 9Eh Serial port Mode bit 1 SM0 SM1 Mô tả Tốc độ baud 0 0 Thanh ghi dịch fOSC/12 0 1 UART 8 bit Thay đổi 1 0 UART 9 bit fOSC/32 hay fOSC/64 1 1 UART 9 bit Thay đổi SCON.5 SM2 9Dh Serial port Mode bit 2 – Chế độ đa xử lý = 0: bình thường = 1: cho phép truyền thông đa xử lý trong chế độ 2 và 3 SCON.4 REN 9Ch Reception Enable bit – Cho phép thu = 0: cấm thu = 1: cho phép thu tại cổng nối tiếp SCON.3 TB8 9Bh Transmitter Bit – Bit truyền thứ 9 trong chế độ 2 và 3 SCON.2 RB8 9Ah Receiver Bit – Bit nhận thứ 9 trong chế độ 2 và 3. Trong chế độ 1, nếu SM2 = 0 thì RB8 = stop bit. SCON.1 TI 99h Transmit Interrupt flag – Cờ ngắt phát Được đặt bằng 1 khi kết thúc quá trình truyền và xoá bằng phần mềm. SCON.0 RI 99h Receive Interrupt flag – Cờ ngắt thu Được đặt bằng 1 khi nhận xong dữ liệu và xoá bằng phần mềm. Giá trị khi reset: 00h, cho phép định địa chỉ bit Phạm Hùng Kim Khánh Trang 72
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 2.1.2. Thanh ghi BDRCON (Baud Rate Control Register) Bảng 3.8 – Nội dung thanh ghi BDRCON - - - BRR TBCK RBCK SPD SRC Bit Ký Mô tả hiệu 7 - 6 - 5 - 4 BRR Baud Rate Run control bit – Cho phép hoạt động = 0: cấm bộ tạo tốc độ baud nội (internal baud rate generator) hoạt động = 1: cho phép 3 TBCK Transmission Baud rate generator selection bit for UART – Chọn bộ tạo tốc độ baud truyền là bộ tạo tốc độ nội (= 1) hay bằng timer (= 0) 2 RBCK Reception Baud rate generator selection bit for UART – Chọn bộ tạo tốc độ baud nhận là bộ tạo tốc độ nội (= 1) hay bằng timer (= 0) 1 SPD Baud Rate Speed control bit for UART – Chọn tốc độ baud là nhanh (= 1) hay chậm (= 0) 0 SRC Baud Rate Source select bit in Mode 0 for UART – Chọn tốc độ baud trong chế độ 0 từ dao động thạch anh (= 0) hay từ bộ tạo tốc độ baud nội (= 1) Giá trị khi reset: 00h, không cho phép định địa chỉ bit Ngoài ra còn có các thanh ghi SBUF (Serial Buffer), BRL (Baud Rate Reload), SADEN (Slave Address Mark), SADDR (Slave Address). Lưu ý rằng các thanh ghi BDRCON, BRL, SADEN và SADDR chỉ có trong các phiên bản mới của MCS-51. 2.2. Tạo tốc độ baud - Chế độ 0: tốc độ baud cố định = 1/12 tần số thạch anh. - Chế độ 2: tốc độ baud = 1/32 tần số thạch anh khi SMOD = 1 hay 1/64 khi SMOD = 0 (SMOD: nằm trong thanh ghi PCON). - Chế độ 1 và 3: tốc độ baud xác định bằng tốc độ tràn của timer 1. Trong họ 89x52, có thể dùng timer 2 để tạo tốc độ baud còn trong các phiên bản mới, có thể dùng bộ tạo tốc độ nội (INT_BRG – Internal Baud Rate Generator). Việc xác định nguồn tạo tốc độ baud mô tả như hình 3.8 và bảng 3.9. Phạm Hùng Kim Khánh Trang 73
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 Hình 3.8 – Lựa chọn tốc độ baud Bảng 3.9 – Lựa chọn tốc độ baud TCLK RCLK TBCK RBCK Clock phát Clock thu 0 0 0 0 Timer 1 Timer 1 1 0 0 0 Timer 2 Timer 1 0 1 0 0 Timer 1 Timer 2 1 1 0 0 Timer 2 Timer 2 X 0 1 0 INT_BRG Timer 1 X 1 1 0 INT_BRG Timer 2 0 X 0 1 Timer 1 INT_BRG 1 X 0 1 Timer 2 INT_BRG X X 1 1 INT_BRG INT_BRG 2.2.1. Tạo tốc độ baud bằng Timer 1 Khi dùng timer 1 để tạo tốc độ baud, thông thường cần thiết lập timer 1 hoạt động ở chế độ 8 bit tự nạp lại và giá trị nạp ban đầu của timer 1 (chứa trong thanh ghi TH1) phụ thuộc vào tốc độ baud cần tạo theo công thức sau: f × 2SMOD Giá trị nạp = − OSC 12 × 32 × baud _ rate Ví dụ: Giả sử tần số thạch anh là fOSC = 11.0592 MHz, giá trị nạp khi tạo tốc độ baud 4800 bps là: Phạm Hùng Kim Khánh Trang 74
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 11.0592 ×10 6 × 2 0 Nếu SMOD = 0: giá trị nạp = − = −6 → TH1 = -6 hay TH1 12 × 32 × 4800 = FAh 11.0592 ×10 6 × 21 Nếu SMOD = 1: giá trị nạp = − = −12 → TH1 = -12 hay 12 × 32 × 4800 TH1 = F4h Ví dụ: Giả sử tần số thạch anh là fOSC = 12 MHz, giá trị nạp khi tạo tốc độ baud 4800 bps là: 12 ×10 6 × 2 0 Nếu SMOD = 0: giá trị nạp = − = −6.51 → chọn giá trị nạp là -6 12 × 32 × 4800 hay -7. Nếu chọn giá trị nạp = -6 thì tốc độ baud = 5208 bps còn nếu chọn -7 thì tốc độ baud là 4464 bps. 11.0592 ×10 6 × 21 Nếu SMOD = 1: giá trị nạp = − = −13.02→ chọn giá trị nạp 12 × 32 × 4800 là -13 → tốc độ baud là 4807 bps. Như vậy, khi dùng tần số thạch anh là 12 MHz thì tốc độ baud sẽ có sai số → chỉ dùng khi kết nối nhiều vi điều khiển MCS-51 với nhau còn khi kết nối với các thiết bị khác (như máy tính chẳng hạn) thì nên sử dụng tần số thạch anh 11.0592 MHz. Các giá trị nạp thông dụng cho MCS-51 mô tả như sau: Bảng 3.10 – Các giá trị nạp thông dụng Tốc độ [bps] fOSC[MHz] SMOD Giá trị nạpTốc độ thực [bps] Sai số 1200 11.059 0 -12 1200 0 4800 11.059 0 -6 4800 0 9600 11.059 0 -3 9600 0 1200 11.059 1 -24 1200 0 19200 11.059 1 -3 19200 0 1200 12 0 -26 1201.9 2.17% 2400 12 0 -13 2403.8 0.16% 4800 12 0 -6 5208.3 8.5% 9600 12 0 -3 10416.7 8.5% Phạm Hùng Kim Khánh Trang 75
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 2.2.2. Tạo tốc độ baud bằng Timer 2 Hình 3.9 – Tạo tốc độ baud bằng timer 2 Timer 2 được dùng để tạo tốc độ baud khi đặt các bit TCLK, RCLK lên 1 (trong thanh ghi T2CON). Công thức liên quan giữa tốc độ baud và giá trị nạp như sau (lưu ý rằng giá trị nạp chứa trong cặp thanh ghi RCAP2H_RCAP2L): f Giá trị nạp = − OSC 2 ×16 × baud _ rate Khi dùng Timer 2 để tạo tốc độ baud, xung clock thu và phát có thể tách riêng bằng cách chỉ dùng TCLK hay RCLK. Lúc đó, xung clock còn lại được xác định theo Timer 1. Ngoài ra, cũng có thể tạo ngắt cho Timer 2 bằng cách đặt bit EXEN2 = 1 và ngắt tạo ra khi xuất hiện cạnh âm tại chân T2EX. Ví dụ: Giả sử tần số thạch anh là fOSC = 11.0592 MHz, giá trị nạp khi tạo tốc độ baud 4800 bps là: 11.0592 ×10 6 Giá trị nạp = − = −72 → FFB8h 2 ×16 × 4800 → RCAP2H = FFh, RCAP2L = B8h Phạm Hùng Kim Khánh Trang 76
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 2.2.3. Bộ tạo tốc độ baud nội (INT_BRG – Internal Baud Rate Generator) Hình 3.10 – Bộ tạo tốc độ baud nội Giá trị nạp trong bộ tạo tốc độ nội chứa trong thanh ghi BRL và được xác định theo công thức sau: f × 2SMOD1 Giá trị nạp = − OSC 2 × 32 × 61−SPD × baud _ rate Trong đó SMOD1 nằm trong thanh ghi PCON và SPD nằm trong thanh ghi BDRCON. 2.3. Truyền thông đa xử lý Chế độ 2 và 3 của MCS-51 cho phép thực hiện kết nối nhiều vi điều khiển ở chế độ master – slave. Mô hình thực hiện của quá trình truyền thông mô tả như hình vẽ sau: Master Slave 1 Slave 2 RxD TxD RxD TxD RxD TxD RxD TxD RxD TxD RxD TxD Slave 3 Slave 4 Slave 5 Hình 3.11 – Truyền thông đa xử lý Quá trình truyền dữ liệu mô tả như sau: - Khi khởi động, các vi điều khiển slave có bit SM2 = 1 (trong thanh ghi SCON) và hoạt động ở chế độ UART 9 bit. Như vậy, slave chỉ nhận được dữ liệu khi bit truyền thứ 9 (TB8 của master) là 1. Phạm Hùng Kim Khánh Trang 77
- Giáo trình Vi điều khiển Các hoạt động của vi điều khiển MCS-51 - Mỗi slave được gán trước một địa chỉ. Khi cần trao đổi thông tin với slave nào, master sẽ gởi dữ liệu 9 bit gồm 8 bit địa chỉ của slave và bit 9 = 1. Dữ liệu này sẽ được tất cả các slave nhận về (do bit 9 = 1). Chương trình trong slave sẽ kiểm tra giá trị địa chỉ tương ứng, nếu trùng với địa chỉ đã cài đặt sẵn thì đảo bit SM2 (= 0), nếu khác thì bỏ qua. - Tiếp tục, master sẽ gởi dữ liệu đến slave nhưng lúc này bit 9 = 0. Khi đó, chỉ có slave nào có bit SM2 = 0 mới nhận được dữ liệu. - Sau khi truyền xong dữ liệu, master gởi lại 8 bit địa chỉ và bit 9 = 1. Slave nhận được sẽ đảo bit SM2 lần nữa để khôi phục trạng thái ban đầu. Như vậy, trong quá trình truyền thông đa xử lý, có 2 loại thông tin gởi: byte địa chỉ nếu bit 9 = 1 và byte dữ liệu nếu bit 9 = 0. 2.4. Nhận dạng địa chỉ tự động Trong các phiên bản mới của MCS-51, địa chỉ của các slave có thể nhận dạng bằng các thanh ghi SADDR và thanh ghi mặt nạ SADEN (các bit không quan tâm trong thanh ghi địa chỉ SADDR sẽ tương ứng với các bit 0 trong thanh ghi SADEN). Xét hệ thống có 1 master và 3 slave: Slave 1: SADDR = 1111 0001b, SADEN = 1111 1010b 1111 0001b 1111 1010b 1111 0x0xb Slave 2: SADDR = 1111 0011b, SADEN = 1111 1001b 1111 0011b 1111 1001b 1111 0xx1b Slave 3: SADDR = 1111 0001b, SADEN = 1111 1010b 1111 1011b 1111 0101b 1111 x0x1b Phạm Hùng Kim Khánh Trang 78