Bài giảng Vi điều khiển

pdf 64 trang ngocly 2670
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi điều khiển", để 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:

  • pdfbai_giang_vi_dieu_khien.pdf

Nội dung text: Bài giảng Vi điều khiển

  1. Chương 1. TỔNG QUAN VỀ VI ĐIỀU KHIỂN 8051 1.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. 1.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. - 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. 1
  2. 1.2.1 Sơ đồ khối INT0 INT1 SERIAL PORT TIMER 0 TIMER 1 TIME 2 128 byte ROM TIMER 2 RAM 4K: 8031 8051\8052 4K: 8051 TIMER1 EPROM INTERRUPT OTHER 128 byte 4K: 8951 TIMER1 CONTROL REGISTER RAM CPU BUS SERIAL CONTROL I/O PORT PORT OSCILATOR EA\ ALE\ HìnhPSEN 1.1\ Sơ đồP kh0 Pố1 iP 80512 P3 RST Address\Data TXD RXD Phần chính của vi điều khiển 8051 là bộ xử lý trung tâm (CPU: central processing unit) bao gồm: - Thanh ghi tích lũy A - Thanh ghi tích lũy phụ B, dùng cho phép nhân và phép chia - Đơn vị logic học (ALU: Arithmetic Logical Unit) - Từ trạng thái chƣơng trình (PSW: Program Status Word) - Bốn băng thanh ghi - Con trỏ ngăn xếp Ngoài ra, còn có bộ nhớ chƣơng trình, bộ giải mã lệnh, bộ điều khiển thời gian và logic. Đơn vị xử lý trung tâm nhận trực tiếp xung từ bộ dao động, ngoài ra, còn có khả năng đƣa một tín hiệu giữ nhịp từ bên ngoài. Chƣơng trình đang chạy có thể cho dừng lại nhờ một khối điều khiển ngắt ở bên trong. Các nguồn ngắt có thể là: các biến cố ở bên ngoài, sự tràn bộ đếm định thời hoặc cũng có thể là giao diện nối tiếp. Hai bộ định thời 16 bit hoạt động nhƣ một bộ đếm. Các cổng (port0, port1, port2, port3) sử dụng vào mục đích điều khiển.Ở cổng 3 có thêm các đƣờng dẫn điều khiển dùng để trao đổi với một bộ nhớ bên ngoài, hoặc để làm đầu nối giao diện nối nối tiếp, cũng nhƣ các đƣờng ngắt dẫn bên ngoài. Giao diện nối tiếp có chứa một bộ truyền và một bộ nhận không đồng bộ, làm 2
  3. việc độc lập với nhau. Tốc độ truyền qua cổng nối tiếp có thể đặt trong dãy rộng và đƣợc ấn định bằng một bộ định thời. Trong vi điều khiển 8051 có hai thành phần quan trọng khác đó là bộ nhớ và các thanh ghi. Bộ nhớ gồm có bộ nhớ Ram và bộ nhớ Rom (chỉ có ở 8051) dùng để lƣu trữ dữ liệu và mã lệnh. Các thanh ghi sử dụng để lƣu trữ thông tin trong quá trình xử lý. Khi CPU làm việc, nó làm thay đổi nội dung của các thanh ghi. 1.2.2 Chức năng của các chân vi điều khiển AT89C51 gồm có 40 chân có sơ đồ nguyên lý nhƣ sau: U1 39 21 38 P0.0/AD0 P2.0/A8 22 37 P0.1/AD1 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 AT89C51 Hình 1.2 Sơ nguyên lý của AT89C51 a. Port 0: (chân 32 – 39), có 8bit (P0.0 – P0.7), có hai công dụng: + Là các đƣờng xuất / nhập thông thƣờng + Khi sử dụng bộ nhớ ngoài thì port 0 không phải là các đƣờng xuất / nhập bình thƣờng nữa mà nó là sự kết hợp giữa bus địa chỉ (A0 – A7) và bus dữ liệu (D0 – D7) để hình thành nên bus đa hợp (AD0 – AD7). Lƣu ý: khi sử dụng Port 0 thì ta phải dùng điện trở kéo lên, vì cấu trúc của port 0 là ngõ ra cực D của Mosfet( không xác định trạng thái ngõ ra). b. Port1: (chân 1 – 8), có 8 bit (P1.0 – P1.7), chỉ có một công dụng duy nhất là các đƣờng xuất / nhập thông thƣờng dùng để giao tiếp với các thiết bị ngoại vi. c. Port2: (chân 21 – 28), có 8 bit (P2.0 – P2.7), có hai công dụng: + Khi sử dụng bộ nhớ nội thì port 2 là một port xuất / nhập thông thƣờng + Khi sử dụng bộ nhớ ngoài thì port 2 đóng vai trò là byte cao 3
  4. của bus địa chỉ (A8 – A15) d. Port3: (chân 10 – 17), có 8 bit (P3.0 – P3.7), có hai công dụng (port nối tiếp) + Là các đƣờng xuất / nhập thông thƣờng + Nó thực hiện các chức năng đặc biệt: ảng 1.1 Chức năng các chân của Port 3 Bit Tên Chức năng P3.7 RD Đọc dữ liệu từ bộ nhớ ngoài P3.6 WR Ghi dữ liệu từ bộ nhớ ngoài P3.5 T1 Ngõ vào Timer 1 P3.4 T0 Ngõ vào Timer 0 P3.3 INT1 Ngõ vào ngắt ngoài 1 P3.2 INT0 Ngõ vào ngắt ngoài 0 P3.1 TxD Truyền dữ liệu cho port nối tiếp P3.0 RxD Nhận dữ liệu cho port nối tiếp e. Vcc (chân 40), Vss (chân 20): Chân cung cấp nguồn cho MSC, nguồn cung cấp ở đây là 5VDC. Chân 20 là chân nối Mass. f. Chân RST (9): Reset. Chân số 9 có mức điện thế cao, tối thiểu 2 chu kỳ máy thì 8051 sẽ khởi động lại. Có hai cách reset: + Cách 1: Reset tự động( Auto Reset): Reset khi cấp nguồn + Cách 2: Reset bằng tay( Manual Reset) 5V 100 10uF Reset SW1 8K2 0 Hình 1.3 Mạch Reset g. Chân 18 và 19 (XTAL 2 và XTAL1): Là ngõ vào và ra của mạch dao động trên chip. Tần số dao động sẽ phụ thuộc vào linh kiện bên ngoài. Mạch dao động bên ngoài đƣợc thiết kế 30pF 19 (XTAL1) nhƣ sau: 12Mhz 30pF 18 (XTAL2) 4 0
  5. Hình 1.4 Mạch dao động h. PSEN (Program Store Enable): (chân 29), dùng điều khiển truy xuất bộ nhớ ngoài. Chân thƣờng đƣợc nối với chân OE của ROM để cho phép đọc dữ liệu từ ROM ngoài. i. ALE (Address Latch Enable): (chân 30), cho phép chốt địa chỉ. Khi giao tiếp với bộ nhớ ngoài thì nửa đầu của chu kỳ bộ nhớ, chân ALE tích cực để chốt byte thấp của bus địa chỉ (A0 – A7) vào một thanh ghi. Trong nửa sau của chu kỳ bộ nhớ, thì các bit của port 0 là các bit xuất / nhập dữ liệu (D0 – D7). 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à nguồn xung nhịp cho các hệ thống. j. EA (External Access): (chân 31), khi chƣơng trình thực thi trong bộ nhớ nội thì chân EA không cần tích cực ( EA phải nối lên nguồn Vcc). Khi thực thi chƣơng trình với bộ nhớ ngoài thì chân phải nối xuống mass, khi đó ROM nội bên trong vô hiệu hóa. 1.2.3 Đị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đến 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ỳ. 5
  6. Hình 1.5 Chu kỳ lệnh 6
  7. 1.3 Tổ chức bộ nhớ ộ nhớ trong ộ nhớ ngo i ROM 4KB ộ nhớ chƣơng trình 64K 0000H – 0FFFH 0000H – FFFFH Điều khiển bằng PSEN RAM 128 byte 00H – 7FH ộ nhớ dữ liệu 64KB 0000H – FFFFH SFR Điều khiển bằng RD và WR 80H – 0FFH Hình 1.6 - Các vùng nhớ trong AT89C51 ộ nhớ của họ MCS-51 có thể chia thành 2 phần: bộ nhớ trong và bộ nhớ ngoài. ộ 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). ộ nhớ ngoài bao gồm bộ nhớ chƣơng trình (điều khiển đọc bằng tín hiệu ) và bộ nhớ dữ liệu (điều khiển bằng tín hiệu hay để 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à 64K . 1.3.1 Tổ chức bộ nhớ trong ộ 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). ™ 7
  8. Các thanh ghi chức năng đặc biệt (SFR – Special Function Registers): ảng 1.2 – Các thanh ghi chức năng đặc biệt Địa Có thể Không định địa chỉ chỉ định bit byte địa chỉ F8h bit F0h B E8h E0h ACC D8h D0h PSW C8h (T2CON) (RCAP2L (RCAP2H (TL2) (TH2) ) ) C0h B8h IP SADE N B0h P3 A8h IE SADD R A0h P2 98h SCON SBUF BRL BDRCON 90h P1 88h TCON TMOD TL0 TH0 TL1 TH1 AUXR CKCO N 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. 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). 8
  9. Địa chỉ Địa chỉ Chức năng 7Fbyte bit 30 Vùng RAM đa dụng 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 27 3F 3E 3D 3C 3B 3A 39 38 chỉ bit 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 18 3 17 Bank 10 2 Các bank thanh ghi 1F Bank 08 07 1 Bank thanh ghi 0 ( mặc định cho 00 R0-R7) ảng 1.3 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 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ì 9
  10. 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. 1.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 64K chƣơng trình và 64K dữ liệu. ộ nhớ chƣơng trình đƣợc truy xuất thông qua chân còn bộ nhớ dữ liệu đƣơc truy xuất thông qua chân hay . 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 tích cực và đƣợc giữ cho đến khi không tích cực.Trong chu kỳ đọc, byte nhận đƣợc chấp nhận vừa trƣớc khi không tích cực. ộ nhớ chƣơng trình ngoài đƣợc xử lý 1 trong 2 điều kiện sau:  Tín hiệu 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ớ. 10
  11. Hình 1.7 – Thực thi bộ nhớ chƣơng trình ngoài  PCH: Program Counter High – PCL: Program Counter Low  DPH: Data Pointer High – DPL: Data Pointer Low ộ 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. 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ì 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. ộ nhớ dữ liệu ngo i 11
  12. ộ 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 hay (chân P3.7 và P3.6). ộ 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 và chân 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 sẽ tích cực. 1.4 Các thanh ghi chức năng đặc biệt (SFR – Special Function Registers) 1.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 cho cùng một kết quả. Hay: SETB ACC.4 SETB 0E4h cũng tƣơng tự. 12
  13. 1.4.2 Thanh ghi B Thanh ghi 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 có địa chỉ byte F0h và địa chỉ bit từ F0h – F7h có thể truy xuất giống nhƣ thanh ghi A. 1.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: ảng 1.4 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 CD). F0 (Flag 0): đƣợc sử dụng tuỳ theo yêu cầu của ngƣời sử dụng. RS1, RS0: dùng để chọn bank thanh ghi sử dụng. Khi reset hệ thống, bank 0 sẽ đƣợc sử dụng. RS1 RS0 Bank thanh 0 0 ghi Bank 0 0 1 Bank 1 1 0 Bank 2 1 1 Bank 3 ảng 1.4 Chọn bank thanh ghi 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. 1.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. 13
  14. Đố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. 1.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. 1.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ỉ 0h 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ừ 0h – 7h. 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: SETB P0.0 SETB 80h 1.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 S UF thì đó là thanh ghi truyền, nếu dữ liệu đƣơc đọc từ S UF thì đó là thanh ghi nhận. Các thanh ghi này không cho phép định địa chỉ bit. 1.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). 14
  15. 1.4.9 Các thanh ghi điều khiển ao 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). 15
  16. Chương 2. LẬP TRÌNH HỢP NGỮ VỚI HỌ VI ĐIỀU KHIỂN MCS-51 2.1 Các khái niệm Vi điều khiển hay vi xử lý là các IC lập trình, khi bạn đã thiết kế hệ thống điều khiển có sử dụng vi xử lý hay vi điều khiển ví dụ nhƣ hệ thống điều khiển đèn giao thông cho một ngã tƣ gồm có các đèn Xanh, Vàng, Đỏ và các led 7 đoạn để hiển thị thời gian thì đó mới chỉ là phần cứng, muốn hệ thống vận hành thì bạn phải viết một chƣơng trình điều khiển nạp vào bộ nhớ nội bên trong vi điều khiển hoặc bộ nhớ bên ngoài và gắn vào trong hệ thống để hệ thống vận hành và dĩ nhiên bạn phải viết đúng thì hệ thống mới vận hành đúng. Chƣơng trình gọi là phần mềm. Phần mềm và phần cứng có quan hệ với nhau, ngƣời lập trình phải hiểu rõ hoạt động của phần cứng để viết chƣơng trình. Ở chƣơng này sẽ trình bày chi tiết về tập lệnh của vi điều khiển giúp bạn hiểu rõ từng lệnh để bạn có thể lập trình đƣợc. Chương trình là một tập hợp các lệnh đƣợc tổ chức theo một trình tự hợp lí để giải quyết đúng các yêu cầu của ngƣời lập trình. Ngƣời lập trình là ngƣời biết giải thuật để viết chƣơng trình và sắp xếp đúng các lệnh theo giải thuật. Ngƣời lập trình phải biết chức năng của tất cả các lệnh của vi điều khiển để viết chƣơng trình. 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) 16
  17. 2.2 Các phương pháp định địa chỉ 2.2.1 Đị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 . 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. 2.2.2 Đị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, @R 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). 2.2.3 Đị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). 2.2.4 Đị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 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. 17
  18. 2.3 Các vấn đề liên quan khi lập trình hợp ngữ 2.3.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 LED EQU 30h ghi; Đị nAh nghĩa ô nhớ chứa mã On_Led BIT 00h ;l eCờd 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. 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.3.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 18
  19. 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: Đị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 ONLED 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.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  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 19
  20. (>=). 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.3.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 CALL chuongtrinhcon ; chuongtrinhcon: RET END ; 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ử 20
  21. 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. - Khi dịch ra file .hex, dùng một mạch nạp để nạp file .hex vào AT89C51 2.4 Tập lệnh 2.4.1 Nhóm lệnh di chuyển dữ liệu 2.4.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: ả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 Trực Gián tiếp Thanh MOV A,(byte) A = (byte) thờxi tiếpx x ghi x 1 MOV (byte),A (byte) = A x x x 1 MOV (byte1) x x x x 2 (byte1),(byte2 = MOV DPTR = ) (byte2) x 2 DPTR,#data1 data16 SP = SP + 1 6P USH (byte) x 2 [SP] = (byte) = POP (byte) (byte) x 2 [SP] SP = SPChu –yể 1 n đổi XCH A,(byte) dữ liệu giữa x x x 1 ACC và Chu(byểynte )đ ổi XCHD A,@Ri 4 bit thấp x 1 giữa ACC Lệnh MOV (Move):và @Ri 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 21
  22. 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 ghiA 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 R MOV A, #data8 ; Chuyển giá trị 8 bi tvà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. 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: 22
  23. ảng 2.2 – Các bit đƣợc định nghĩa trƣớc trong 8051 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 D7h SM0 9Fh C AC D6h SM1 9Eh F0 D5h SM2 9Dh PSW RS1 D4h SCON REN 9Ch RS0 D3h TB8 9Bh OV D2h RB8 9Ah P D0h TI 99h RI 98h P0.0 – P0.7 80h – PS BCh P1.0 – P1.7 87h PX1 BBh Các P2.0 – P2.7 90h – 97h IP PT1 BAh thanh P3.0 – P3.7 A0h – PX0 B9h ghi Port A7h B0h PT0 B8h Ví dụ: Lệnh MOV C, –P 0B7h.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 / ExchangeDigit): 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 23
  24. 2.4.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: ả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 MOVX A, @Ri Đọc nội dung từ RAM ngoại tại địa chỉ thi 2 MOVX @Ri, A Ri Ghi vào RAM ngoại tại địa chỉ Ri 2 MOVX A, Đọc nội dung từ RAM ngoại tại địa chỉ 2 MOVX@DPTR @ DPTR, DPTRGhi vào RAM ngoại tại địa chỉ DPTR 2 A (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, sẽ xuống mức thấp còn khi thực hiện lệnh ghi dữ liệu thì chân , sẽ xuống mức thấp. 2.4.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: ảng 2.4 – Các lệnh tìm kiếm dữ liệu Chu kỳ Lệnh Hoạt động thực Đọc nội dung bộ nhớ chƣơng trình tại MOVC A, @A + thi2 DPTR địa chỉ A + DPTR Đọc nội dung bộ nhớ chƣơng trình tại MOVC A, @A +PC 2 địa chỉ A + PC (MOVC: Move Code) 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, #BANGMA ; Địa chỉ nền của bảng tìm kiếm MOVC A, @A + DPTR ; Đọc nội dung phần tử BANGMA: 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. 24
  25. Ví dụ: Lấy phần tử thứ 2 trong bảng BANGMA: MOV A, #2 ; Phần tử thứ 2 CALL Read_Led7s Read_Led7s: MOVC A, @A +PC RET BANGMA: DB 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 BANGMA. 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 BANGMA: MOV A, #2 ; Phần tử thứ 2 CALL TRABANG TRABANG: INC A ; Tăng nội dung A lên 1 để hiệu chỉnh vị trí bảng MOVC A,@A+PC RET BANGMA: DB data8, data8, data8, data8, ; Nội dung bảng tìm kiếm 2.4.2 Nhóm lệnh xử lý bit Họ 8051 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: ảng 2.5 – Các lệnh logic Lệnh Hoạt động Chu kỳ thực ANL C,bit C = C AND bit 2thi 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 25
  26. 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á 2 bit 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: 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. 2.4.3 Nhóm lệnh rẽ nhánh 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 JMP addr Nhảy tới nhãn addr 2th i JMP Nhảy tới địa chỉ A + DPTR 2 CALL@A+DPTR 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ụ 2 NOP Khônngắt g làm gì cả 1 JMP: Jump RET: Return 26
  27. RETI: Return from Interrupt NOP: No Operation ảng 2.7 - Các lệnh rẽ nhánh 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 JZ rel Chỉ dùng cho thanh ghi A 2 rel nếu A = 0 Nhảy đến nhãn JNZ rel Chỉ dùng cho thanh ghi A 2 rel nếu A ≠ 0 (byte) = (byte) - 1 DJNZ Nếu (byte) ≠ 0 x x 2 (byte),re thì nhảy đến l CJNE Nhảy đến nhãn nhãn rel x x 2 A,(byte),re rel nếu A ≠ CJNE Nhảy đến nhãn l (byte) x x 2 (byte), rel nếu (byte) ≠ #data8, rel data8 JZ: Jump if Zero; JNZ: Jump if Not Zero DJNZ: Decrement and Jump if Not Zero 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à 64Kb. Do đó lệnh LJMP có thể thực hiện nhảy đến bất kỳ vị trí nàotrong 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 27
  28. 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. 2K Phạm vi thực hiện AJMP rel 2K AJMP rel Phạm vi thực hiện Hình 2.2 – Phạm vi thực hiện của lệnh AJMP Lệnh JMP PC : Cho phép chọn các vị trí nhảy khác nhau tùy 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_TA BLE: 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 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 28
  29. 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. CJNE A,#10,HERE; So sánh A với 10 JMP Xuat10 ; Nếu A = 10 thì xuất giá trị 10 HERE: 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: 2.4.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: ảng 2.8– Các lệnh logic 29
  30. 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 x 1 (bytA e)=(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) ORL (byte),#data8 x 2 ORdata8 XRL A,(byte) A = A XOR (byte) x x x x 1 XRL (byte),A (byte)=(byte) XOR x 1 (bytA e)=(byte) XRL (byte),#data8 x 2 XORdata8 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 RR A Chỉ dùng cho thanh ghi A 1 ghi QuA 1a ybit p hải thanh RLC A Chỉ dùng cho thanh ghi A 1 ghi QuA vaày CtrFá i1 th baitnh ghi RL A Chỉ dùng cho thanh ghi A 1 A Qu1 baity trái thanh ghi RLC A Chỉ dùng cho thanh ghi A 1 A SWAP A Đổvà iCF vị 1 t bitrí nib ble Chỉ dùng cho thanh ghi A 1 cao 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 30
  31. 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 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. 2.4.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: ảng 2.9 – Các lệnh số học Chu kỳ Lệnh Hoạt động Chế độ địa chỉ thực thi Tức Trực tiếp Gián tiếp Thanh ADD A = A + (byte) thời ghi x x x x 1 A,(byte ADDC A = A + (byte) + ) x x x x 1 A,(byte C SUBB A = A - (byte) - ) x x x x 1 A,(byte C )INC A A = A + 1 Chỉ dùng cho thanh ghi tích luỹ 1 INC (byte) = (byte) + ACC x x x 1 (byte) 1 INC DPTR = DPTR Chỉ dùng cho thanh ghi con trỏ lệnh 2 DPTR + 1 DPTR DEC A A = A - 1 Chỉ dùng cho thanh ghi tích luỹ 1 DEC (byte) = (byte) - ACC x x x 1 (byte) 1 Chỉ dùng cho thanh ghi tích luỹ MUL AB B_A = B x A 4 ACC và thanh ghi B 31
  32. A = A div B Chỉ dùng cho thanh ghi tích luỹ DIV AB 4 B= A mod B ACC và thanh ghi B Hiệu chỉnh trên số DA A Chỉ dùng cho thanh ghi tích luỹ 1 BCD ACC 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). 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 2.5 i tập chương 2 Bài 1: Viết chƣơng trình đếm và hiển thị trên led 7 đoạn loại anode chung số 0 đến số 9 trên Port2 Sơ đồ phần cứng: 32
  33. U1 19 39 XTAL1 P0.0/AD0 38 P0.1/AD1 37 P0.2/AD2 18 36 XTAL2 P0.3/AD3 35 P0.4/AD4 34 P0.5/AD5 33 P0.6/AD6 9 32 RST P0.7/AD7 21 P2.0/A8 22 P2.1/A9 23 P2.2/A10 29 24 PSEN P2.3/A11 30 25 ALE P2.4/A12 31 26 EA P2.5/A13 27 P2.6/A14 28 P2.7/A15 1 10 P1.0 P3.0/RXD 2 11 P1.1 P3.1/TXD 3 12 P1.2 P3.2/INT0 4 13 P1.3 P3.3/INT1 5 14 P1.4 P3.4/T0 6 15 P1.5 P3.5/T1 7 16 P1.6 P3.6/WR 8 17 P1.7 P3.7/RD AT89C51 Hình 2.3 Mạch hiển thị led 7 đoạn Anode chung Chương trình thực hiện: #include org 0000h Main: MOV R1, #0; BIEN DEM TRUNG GIAN LOOP: MOV A, R1 LCALL TRABANG MOV P2, A LCALL DELAY1S INC R1 CJNE R1, #10, LOOP; NEU CHUA BANG 10 LAP LAI LJMP Main TRABANG: INC A MOVC A, @A + PC RET BANGMA: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH DB 07H, 7FH, 6FH; BANG MA DANH CHO LED K CHUNG DELAY1MS: MOV R0, #250 HERE: DEC R0 ; (1T) NOP ; TAO TRE (1 T) CJNE R0, #0, HERE; NEU CHUA BANG 0 THI LAP LAI (2T) RET DELAY1S: MOV R7, #4 HERE1: 33
  34. MOV R6, #250 HERE2: LCALL DELAY1MS DJNZ R6, HERE2 DJNZ R7, HERE1 RET END Bài 2. Nhƣ yêu cầu ở bài 1 nhƣng ở đây có sử dụng thêm IC 7447 để giải mã Sơ đồ phần cứng: U1 19 39 XTAL1 P0.0/AD0 38 P0.1/AD1 37 P0.2/AD2 18 36 XTAL2 P0.3/AD3 35 P0.4/AD4 34 P0.5/AD5 33 P0.6/AD6 9 32 RST P0.7/AD7 U2 21 7 13 P2.0/A8 A QA 22 1 12 P2.1/A9 B QB 23 2 11 P2.2/A10 C QC 29 24 6 10 PSEN P2.3/A11 D QD 30 25 4 9 ALE P2.4/A12 BI/RBO QE 31 26 5 15 EA P2.5/A13 RBI QF 27 3 14 P2.6/A14 LT QG 28 P2.7/A15 74LS47 1 10 P1.0 P3.0/RXD 2 11 P1.1 P3.1/TXD 3 12 P1.2 P3.2/INT0 4 13 P1.3 P3.3/INT1 5 14 P1.4 P3.4/T0 6 15 P1.5 P3.5/T1 7 16 P1.6 P3.6/WR 8 17 P1.7 P3.7/RD AT89C51 Hình 2.4 Mạch hiển thị led 7 đoạn dùng IC 7447 Chương trình thực hiện: #include org 0000h Main: MOV A, #0 LOOP: MOV P2, A LCALL DELAY1S INC A CJNE A, #10, LOOP LJMP Main DELAY1MS: MOV R0, #250 HERE: DEC R0 ; (1T) NOP ; TAO TRE 1 T CJNE R0, #0, HERE; NEU CHUA BANG 0 THI LAP(2T) RET DELAY1S: MOV R7, #4 HERE1: 34
  35. MOV R6, #250 HERE2: LCALL DELAY1MS DJNZ R6, HERE2 DJNZ R7, HERE1 RET END 35
  36. Chương 3. TIMER – COUNTER 3.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). 3.2 Hoạt động của 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, 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 đến 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. Tùy theo nội dung của IT , xung đếm có thể lấy từ dao động nội ( =0) hay từ các chân Tx bên ngoài ( =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 40
  37. 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). 3.3 Các thanh ghi điều khiển hoạt động 3.3.1 Thanh ghi điều khiển Timer (TCON – Timer/Counter Control Register) TCON chứa các IT điều khiển và IT trạng thái 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ý Đia M hiệu chỉ tả TCON.7 TF1 8Fh Cờ báo tràn cho timer 1 (Timer 1 overflow Flag). Đƣợc xoá bởi phần cứng khi chuyển đến chƣơng trìnhcon 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). TCON.5 TF0 8Dh TiChomer ph 0é po vTeimrflerow 1 Flhoagạt động (= 1) hay ngừng (= TCON.4 TR0 8Ch Ti0).m er 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 TCON.1 IE0 89h 3 – xử lý ngắt) TCON.0 IT0 88h 3.3.2 Thanh ghi chế độ Timer (TMOD – Timer/Counter Mode) Thanh ghi TMOD đƣợc chia ra thành 2 nhóm 4 bit dùng để thiết lập các chế độ hoạt động của Timer0 và Timer1. Thanh ghi TMOD không đánh địa chỉ bit, thông thƣờng nó đƣợc thiết lập ở đầu chƣơng trình để định chế độ định thời. Các chế độ hoạt động của bộ định thời M1 = 0, M0 = 0: Mode 0 M1 = 0, M0 = 1: Mode 1. M1 = 1, M0 = 0: Mode 2. M1 = 1, M0 = 0: Mode 3 41
  38. Bảng 3.3: Các Bit trong thanh ghi TMOD Bit Tên Timer Chức năng 7 GATE 1 Khi GATE=1 và INT1 ở mức cao thì Timer mới hoạt động. 6 C/T 1 Bit chọn Counter/Timer 1(C/T = 1/0). 5 M1 1 Bit chọn Mode (xem bảng dƣới). 4 M0 1 Bit chọn Mode (xem bảng dƣới). 3 GATE 0 Bit GATE của Timer 0. 2 C/T 0 Bit chọn Counter/Timer của Timer 0. 1 M1 0 Bit chọn Mode . 0 M0 0 Bit chọn Mode . 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. 3.4 Các chế độ hoạt động 3.4.1 Chế độ định thời 13 bit (MODE 0): Mode 0 ít đƣợc sử dụng trong các hệ thống mới. yte cao của bộ định thời (THx) đƣợc kết hợp với 5 bit có trọng số nhỏ nhất của byte thấp của bộ định thời (TLx) để tạo nên bộ định thời 13 bit. Còn 3 bit trên của TLx không đƣợc sử dụng. Timer Cl ock TLx TFx THx (5Bit) (Cờ tràn) (8Bit) Hình 3.1 Mode định thời 13 Bit (Mode 0) 3.4.2 Chế độ định thời 16 bit (Mode 1): Trong Mode 1 hoạt động giống Mode 0 nhƣng với 16 bit. Khi nhận đƣợc xung đồng hồ, bộ đếm bắt đầu đếm lên từ 0000H. Hiện tƣợng tràn xảy ra khi có sự chuyển tiếp từ FFFFH qua 0000H, và tại thời điểm này cờ tràn sẽ đƣợc lập. Cờ tràn và các bit trong thanh ghi bộ dịnh thời có thể đọc viết bằng phần mềm. 42
  39. Timer TFx clock TLx THx (Cờ tràn) (8Bit) (8Bit) Hình 3.2 Mode định thời 16 Bit (Mode 1) 3.4.3 Chế độ tự động nạp lại 8 bit (Mode 2): Ở mode này, thanh ghi định thời TLx hoạt động nhƣ bộ định thời 8 bit còn byte cao của bộ định thời THx lƣu trữ giá trị nạp lại. Khi TLx chuyển từ FFH qua 00H thì cờ tràn đƣợc lập đồng thời giá trị trong THx đƣợc nạp vào TLx và tiếp tục quá trình đếm lên từ giá trị này. Và quá trình lại tiếp tục diễn ra nhƣ trên. Timer Clock TLx TFx Cờ tràn Nạp lại THx Hình 3.3 Chế độ tự động nạp lại 8 bit (mode2) 3.4.4 Chế độ định thời phân chia (Mode3): Ở mode 3 chỉ có Timer 0 đƣợc sử dụng và nó đƣợc chia làm hai bộ định thời 8 bit là TL0 và TH0 hoạt động tách biệt. Khi xảy ra sự tràn sẽ lập các bit TF0 và TF1 tƣơng ứng. Timer 1 vẫn có thể đƣợc dùng để tạo tốc độ truyền cho cổng nối tiếp hoặc bất kỳ một ứng dụng nào không yêu cầu ngắt. (khi nó không sử dụng TF1). Timer clock TL1 TH1 Timer clock TL0 TF 0 1/12 FOSC Cờ TH0 TF1tràn Cờ tràn Hình 3.4 Chế độ định thời phân chia 43
  40. 3.5 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. Ta có: f = 10 KHz suy ra T = 1/f = 0.1 ms = 100 µs , do đó một chu kỳ sóng vuông chiếm khoảng thời gian 100 chu kỳ máy nên thời gian trì hoãn cần thiết là 50 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 Chế độ 8 bit INT0 động nội TMOD = 0000 0010b (02h) Chƣơng trình thực hiện nhƣ sau: MOV TMOD,#02h MOVTH0,#(50) MOV TL0,#(50) SETB TR0 ; Cho phép timer 0 chạy HERE: JNB TF0,HERE ; Nếu Timer chƣa tràn thì chờ CLR TF0 CPL P1.0 ; Đảo bit P1.0 để tạo xung vuông SJMP HERE END V dụ 2. Viết chƣơng trình con tạo thời gian trì hoãn 1s dùng timer 0. 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 000000. MOV TMOD,#01h 44
  41. ; CHƢƠNG TRÌNH CHÍNH ; Delay1s: MOV R7,#100 ; Lặp 100 lần Lap: MOV TH0,#HIGH(-10000) ; Mỗi lần trì hoãn 10 000 µs MOV TL0,#LOW(-10000) SETB TR0 Lap1: CLR TF0 CLR TR0 DJNZ R7, Lap RET 45
  42. Chương 4. CỔNG N I TI P (Serial port) 4.1 Giới thiệu 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à chuyển đổi dữ liệu từ song song sang nối tiếp với trƣờng hợp xuất dữ liệu, vàchuyển đổi nối tiếp sang song song đối với nhận dữ liệu. 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: truyền / nhận dữ liệu 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. 46
  43. 4.2 Các thanh ghi điều khiển hoạt động 4.2.1 Thanh ghi SCON (Serial port controller) Bảng 4.1 – 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 1 1 UART 9 bit fOSCT/64ha y đổ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 47
  44. 4.2.2 Thanh ghi BDRCON (Baud Rate Control Register) Bảng 4.2 – Nội dung thanh ghi BDRCON x x x BRR TBCK RBCK SPD SRC Bit Ký M tả hiệu 7 x 6 x 5 x 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. 4.3 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. 48
  45. Hình 4.1 – Lựa chọn tốc độ baud Bảng 4.3 – 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  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: 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à bao nhiêu? 49
  46. Gi i: Ở đây chúng ta có 2 trƣờng hợp:  Trƣờng hợp 1: nếu SMOD =0 thì giá trị nạp là: = -6. Do đó giá trị nạp cho TH1 = -6  Trƣờng hợp 1: nếu SMOD =0 thì giá trị nạp là: = -12 . Do đó giá trị nạp cho TH1 = -12Các giá trị nạp thông dụng cho MCS-51 mô tả nhƣ sau: Bảng 4.4 – Các giá trị nạp thông dụng Tốc độ [bps] fOSC[MHz] SMOD Giá trị nạp Tố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% 4.4 Tru ền th ng đa ử 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 Tx Slave1 Slave2 Slave 3 Hình 4.2 – 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ỉ 50
  47. nhận đƣợc dữ liệu khi bit truyền thứ 9 (TB8 của master) là 1. - 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. 4.5 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 51
  48. 1111 x0x1B Nếu chỉ cần gởi dữ liệu cho slave 1, địa chỉ cần sử dụng có bit 0 = 0 (do địa chỉ của slave 2 và slave 3 có bit 0 = 1 còn địa chỉ của slave 1 có bit 0 tuỳ ý), giả sử là 1111 0000B. Nếu cần gởi cho slave 2 và slave 3 mà không gởi cho slave 1 thì địa chỉ cần dùng có bit 1 = 1 (do địa chỉ của slave 1 có bit 1 = 0 còn slave 2 và 3 thì tuỳ ý), giả sử nhƣ 1111 0011B. . Địa chỉ broadcast Địa chỉ broadcast tạo thành từ phép toán OR giữa các thanh ghi SADDR và SADEN trong đó các bit 0 xác định đó là các bit không quan tâm. Giả sử SADDR = 0101 0000B và SADEN = 1111 1101B thì 0101 0000B OR 1111 1101B 1111 1101B Địa chỉ broadcast là 1111 11x1B. . Kiểm tra lỗi khung Chế độ kiểm tra lỗi khung chỉ có trong các chế độ 1, 2 và 3 đƣợc thực hiện bằng cách đặt bit SMOD0 lên 1 (trong thanh ghi PCON). Khi SMOD0 = 1, bộ thu sẽ kiểm tra bit stop mỗi khi có dữ liệu đến. Nếu bit stop không hợp lệ, bit FE sẽ đƣợc đặt lên 1 (trong thanh ghi SCON). Phần mềm sau khi đọc byte dữ liệu sẽ kiểm tra bit FE để xác định có lỗi đƣờng truyền hay không. Lƣu ý rằng bit FE chỉ xoá bằng phần mềm hay khi reset hệ thống mà không bị xoá khi nhận bit stop hợp lệ. 4.6 Các v dụ Để điều khiển hoạt động của cổng nối tiếp, cần thực hiện các bƣớc sau: - Khởi động giá trị của thanh ghi SCON để xác định chế độ hoạt động. - Chọn bộ tạo tốc độ baud (mặc định là timer 1) và xác định các thông số cần thiết theo tốc độ baud yêu cầu. - Kiểm tra các bit TI và RI để xác định cho phép truyền hay nhận dữ liệu không. - Nếu cần truyền dữ liệu thì kiểm tra TI và chuyển nội dung truyền vào thanh ghi SBUF. - Nếu cần nhận dữ liệu thì kiểm tra RI và đọc nội dung từ SBUF vào thanh ghi A. 52
  49. Ví dụ 1: Khởi động cổng nối tiếp ở chế độ UART 8 bit với tốc độ baud 9600 bps, dùng timer 1 là bộ tạo tốc độ baud (giả sử tần số thạch anh là 11.0592 MHz). Giải: - Nội dung thanh ghi SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI 0 1 0 1 0 0 1 0 UART 8 Không ở chế độ đa xử Cho phép Cho phép bit lý thu truyền SCON = 0101 0010b (52h) - Nội dung thanh ghi TMOD: GATE1 C/T1 M11 M10 GATE0 C/T0 M01 M00 0 0 1 0 0 0 0 0 Không dùng INT1 Đếm bằng dao động Chế độ 8 Timer 0 không dùng nội bit TMOD = 0010 0000b (20h) - Giá trị đếm (theo bảng 3.10): TH1 = -3 Đoạn chƣơng trình khởi động nhƣ sau: MOV SCON,#52h MOV TMOD, #20h MOV TH1,#-3 SETB TR1 Ví dụ 2: Viết chƣơng trình xuất liên tục các ký tự từ ‘A’ đến ‘F’ ra cổng nối tiếp với tốc độ baud 9600 bps (giả sử tần số thạch anh là 11.0592 MHz). Giải Tốc độ = 9600 bps suy ra giá tri đếm là: TH1 = -3. Chƣơng trình thực hiện nhƣ sau: MOV SCON,#52h TMOD,#20h MOV TH1,#-3 SETB TR1 LOOP: MOV A,#’A’ 53
  50. Trans: JNB TI,$ ; Nếu chƣa cho phép truyền thì chờ CLR TI ; Xoá TI để không cho phép truyền MOV SBUF,A ; Truyền dữ liệu INC A ; Qua ký tự kế CJNE A,#’F’+1, Trans; Nếu đã truyền xong từ ‘A’ SJMP LOOP ; đến ‘Z’ thì lặp lại quá trình Ví dụ 3: Viết chƣơng trình nhận ký tự từ cổng nối tiếp với tốc độ baud 19200bps (giả sử tần số thạch anh là 11.0592 MHz). Giải Tốc độ = 1900 bps nên giá trị đếm: TH1 = -3 và SMOD = 1 Chƣơng trình thực hiện nhƣ sau: MOV SCON,#52h MOV TMOD,#20h MOV A,PCON ; Gán bit SMOD = 1 (do PCON không cho SETB ACC.7; phép định địa chỉ bit nên phải thực MOV PCON,A ; hiện thông qua thanh ghi A) MOV TH1,#-3 SETB TR1 Re: JNB RI,$ ; Nếu chƣa có ký tự đến thì chờ CLR RI ; Xoá RI để không cho phép nhận, sau khi ; có ký tự tiếp theo thì mới nhận MOV A,SBUF ; Nhận dữ liệu SJMP Re Lƣu ý rằng, đối với các ví dụ trên, khi truyền hay nhận dữ liệu thì MCS-51 phải chờ, không đƣợc thực hiện công việc khác. Vấn đề này có thể giải quyết bằng cách sử dụng ngắt. 54
  51. Chương 5. NGẮT ( Interupt Ngắt là quá trình dừng chƣơng trình đang thực thi để phục vụ cho một chƣơng trình khác khi xảy ra một sự kiện. Chƣơng trình xử lý sự kiện ngắt gọi là chƣơng trình phục vụ ngắt (ISR – Interrupt Service Routine). Họ MCS-51 có tổng cộng 5 nguồn ngắt khác nhau (không kể reset cũng có thể xem nhƣ là một ngắt): ngắt ngoài 0, 1 (tại các chân , ) timer 0, 1 (khi timer tƣơng ứng tràn), cổng nối tiếp (khi có ký tự đến hay khi truyền ký tự đi). 5.1 Các thanh ghi điều khiển ngắt 5.1.1 Thanh ghi cho ph p ho c cấm ng t IE ảng 5.1 – Nội dung thanh ghi IE EA - ET2 ES ET1 EX1 ET0 EX0 Bit Ký hiệu Địa chỉ M tả IE.7 EA AFh Enable All Cấm tất cả (= 0) hay cho phép ngắt IE.6 - IE.5 ET2 ADh Enable Timer 2 Cho phép ngắt tại timer 2 (= 1) IE.4 ES ACh Enable serial port Cho phép ngắt tại cổng nối tiếp (= 1) IE.3 ET1 ABh Enable Timer 1 Cho phép ngắt tại timer 1 (= 1) IE.2 EX1 AAh Enable External interrupt 1 Cho phép ngắt tại ngắt ngoài 1 (= 1) IE.1 ET0 A9h Enable Timer 0 Cho phép ngắt tại timer 0 (= 1) IE.0 EX0 A8h Enable External interrupt 0 Cho phép ngắt tại ngắt ngoài 0 (= 1) Giá trị khi reset: 00h, cho phép định địa chỉ bit Thanh ghi IE cho phép một ngắt có xảy ra hay cấm ngắt (để cho phép cần dùng 2 bit: bit EA = 1 và bit cho phép tƣơng ứng từng ngắt). 55
  52. 5.1.2 Thanh ghi IP (Interrupt Priority) Bảng 5.2 – Nội dung thanh ghi IP - - PT2 PS PT1 PX1 PT0 PX0 Bit Ký hiệu Địa chỉ Mô tả IP.7 - IP.6 - IP.5 PT2 BDh Chọn mức ƣu tiên cao (= 1) hay thấp (= 0) tại timer 2 IP.4 PS BCh Chọn mức ƣu tiên cao (= 1) hay thấp (= 0) tại cổng nối IP.3 PT1 BBh Ctiếphọ n mức ƣu tiên cao (= 1) hay thấp (= 0) tại timer 1 IP.2 PX1 BAh Chọn mức ƣu tiên cao (= 1) hay thấp (= 0) tại ngắt ngoài 1 IP.1 PT0 B9h Chọn mức ƣu tiên cao (= 1) hay thấp (= 0) tại timer 0 IP.0 PX0 B8h Chọn mức ƣu tiên cao (= 1) hay thấp (= 0) tại ngắt ngoài 0 Giá trị khi reset: 00h, cho phép định địa chỉ bit Thanh ghi IP cho phép chọn mức ƣu tiên cho các ngắt. Họ MCS-51 có 2 mức ƣu tiên: mức cao và mức thấp. Quá trình xử lý ƣu tiên ngắt mô tả nhƣ sau: - Nếu 2 ngắt xảy ra đồng thời thì ngắt nào có mức ƣu tiên cao hơn sẽ đƣợc phục vụ trƣớc. - Nếu 2 ngắt xảy ra đồng thời có cùng mức ƣu tiên thì thứ tự ƣu tiên thực hiện từ cao đến thấp nhƣ sau: ngắt ngoài 0 – timer 0 – ngắt ngoài 1 – timer 1 – cổng nối tiếp – timer 2. - Nếu ISR của một ngắt có mức ƣu tiên thấp đang chạy mà có ngắt khác xảy ra với mức ƣu tiên cao thì ISR này sẽ tạm dừng để chạy ISR có mức ƣu tiên cao (cũng có nghĩa là không thể dừng ISR có mức ƣu tiên cao). 5.1.3 Thanh ghi TCON (Timer/Counter Control) ảng 5.3 – 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 TCON.6 TR1 8Eh Xem phần timer TCON.5 TF0 8Dh TCON.4 TR0 8Ch 56
  53. CON.3 IE1 8Bh Cờ ngắt ngoài 1 Đặt bằng 1 khi phát hiện tác động ngắt tại INT1 Xoá bằng phần mềm hay bằng phần cứng khi chuyển điều khiển đển ISR TCON.2 IT1 8Ah Interrupt 1 Type control bit = 0: ngắt ngoài 1 đƣợc tác động bằng mức logic 0 = 1: ngắt ngoài 1 đƣợc tác động bằng cạnh âm TCON.1 IE0 89h Dùng cho ngắt ngoài 0 TCON.0 IT0 88h Giá trị khi reset: TCON = 00 5.2 ử lý ngắt Để kiểm tra khi nào ngắt xảy ra, các cờ ngắt đƣợc lấy mẫu ở thời gian S5P2 của mỗi chu kỳ máy. Các điều kiện ngắt đƣợc hỏi vòng cho đến chu kỳ máy kế tiếp để xác định xem có ngắt xảy ra hay không. Khi có điều kiện ngắt, hệ thống ngắt sẽ tạo ra lệnh LCALL để gọi ISR tƣơng ứng nhƣng lệnh này sẽ không đƣợc thực hiện khi tồn tại một trong các điều kiện sau: - Có một ngắt có mức ƣu tiên bằng hay cao hơn đang đƣợc phục vụ. - Chu kỳ hỏi vòng hiện tại không phải là chu kỳ cuối của một lệnh. - Đang thực thi lệnh RETI hay bất kỳ lệnh nào có ảnh hƣởng đến thanh ghi IE và IP. Khi có ngắt xảy ra, các thao tác thực hiện lần lƣợt là: - Hoàn tất lệnh hiện hành. - Cất nội dung của thanh ghi PC vào stack. - Lƣu trạng thái của ngắt hiện hành. - Đƣa vào thanh ghi PC địa chỉ của ISR tƣơng ứng. Sau khi thực hiện xong ISR (kết thúc bằng lệnh RETI), thực hiện quá trình: khôi phục trạng thái ban đầu của ngắt và lấy địa chỉ từ stack đƣa vào PC. Bảng vector ngắt Khi xảy ra ngắt, thanh ghi PC sẽ đƣợc nạp giá trị tƣơng ứng với các ngắt. Các giá trị này đƣợc gọi là vector ngắt, mô tả nhƣ sau: ảng 5.4 – Bảng vector ngắt Nguyên nhân ngắt Địa chỉ Reset 0000h Ngắt ngoài 0 0003h Timer 0 000Bh Ngắt ngoài 1 0013h Timer 1 001Bh Cổng nối tiếp 0023h Timer 2 002Bh 57
  54. Trong các nguyên nhân này, reset có thể đƣợc xem nhƣ một ngắt có vector ngắt là 0000h nhƣng cách xử lý khi reset không giống nhƣ ngắt: khởi động tất cả các thanh ghi về giá trị mặc định và không lƣu nội dung của PC vào stack. Theo bảng vector ngắt, ISR của ngắt ngoài 0 nằm từ địa chỉ 0003h đến 000Ah (chiếm tổng cộng 8 byte) nên khi sử dụng ISR có kích thƣớc thấp hơn 9 byte thì có thể dùng trực tiếp tại địa chỉ 0003h (xem thêm phần sau). Tuy nhiên, nếu kích thƣớc ISR lớn hơn thì phải dùng các lệnh nhảy tại các vector ngắt. Khi đó chƣơng trình sẽ có cấu trúc nhƣ sau (tên của các ISR có thể thay đổi): ORG 0000h LJMP main ORG 0003h LJMP Int0_ISR ORG 000Bh LJMP Timer0_ISR ORG 0013h LJMP Int1_ISR ORG 001Bh LJMP Timer1_ISR ORG 0023h LJMP Serial_ISR Main: Int0_ISR: RETI Timer0_ISR: RET I Int1_ISR: 58
  55. RETI Timer1_ISR: RETI Serial_ISR: RE TI END Lƣu ý rằng nếu không sử dụng ngắt nào thì không cần phải khai báo ISR cho ngắt đó. 5.3 Ngắt do bộ định th i MCS-51 có 2 nguồn ngắt từ timer: timer 0 và timer 1 (đối với họ 89x52 còn có thêm timer 2). Khi timer hoạt động ở chế độ ngắt, chƣơng trình vẫn hoạt động bình thƣờng cho đến khi timer tràn thì mới chuyển đến vị trí của ISR (trong khi đó, khi timer hoạt động không sử dụng ngắt thì chƣơng trình sẽ dừng lại – xem thêm phần ví dụ trong hoạt động định thời). Các nguồn ngắt này cho phép hay cấm bằng các bit trong thanh ghi IE: EA, ET0, ET1 và chọn chế độ ƣu tiên bằng các bit trong thanh ghi IP: PT0, PT1. Khi timer tràn, cờ TFx sẽ chuyển lên mức 1. Hệ thống ngắt khi phát hiện cờ TFx lên 1 sẽ chuyển đến ISR tƣơng ứng và tự động xoá cờ TFx. Quá trình điều khiển hoạt động bằng bộ định thời có sử dụng ngắt thực hiện nhƣ sau: - Xác định chế độ hoạt động của bộ định thời. - Nạp giá trị cho các thanh ghi THx, TLx. - Cho phép ngắt tại các bộ định thời tƣơng ứng (thanh ghi IE). - Xác định mức ƣu tiên (thanh ghi IP). - Cho phép timer chạy bằng các bit TRx. - Viết ISR cho timer tƣơng ứng. Ví dụ 1: Viết chƣơng trình tạo sóng vuông tần số f = 5 KHz tại P1.0 dùng ngắt timer 1 (giả sử tần số thạch anh là 12 MHz). Giải f = 5 KHz suy ra T = 200 µs (200 chu kỳ), do đó thời gian trì hoãn: 100 chu kỳ Giá trị đếm = 100 nên dùng chế độ 8 bit 59
  56. TMOD = 0010 0000b (20h) - Nội dung thanh ghi IE: EA - ET2 ES ET1 EX1 ET0 EX0 1 0 0 0 1 0 0 0 IE = 1000 1000b (88h) Chƣơng trình thực hiện nhƣ sau: ORG 0000h LJMP main ORG 001Bh CPL P1.0 ; đảo bit RETI ; trở về chƣơng trình chính từ ISR Main: MOV TMOD,#20h MOV IE,#88h ; Có thể thay thế bằng 2 lệnh sau: ; SETB EA ; SETB ET1 MOV TH1,#(-100) MOV TL1,#(-100) SETB TR1 SJMP $ ; Lặp tại chỗ, nghĩa là chƣơng trình ; không làm gì cả, chờ timer tràn (các ; ứng dụng thực tế có thể xử lý các ; công việc khác) END Lƣu ý rằng lệnh CPL P1.0 chiếm 2 byte, lệnh RETI chiểm 1 byte, tổng cộng ISR cho timer 1 là 3 byte không vƣợt quá 8 byte nên có thể đặt trực tiếp tại địa chỉ 001Bh. Ví dụ 2: Viết chƣơng trình tạo xung vuông tần số f = 10KHz tại P1.0 dùng ngắt timer 0 và xung vuông tần số f = 1 KHz tại P1.1 dùng ngắt timer 1. Giải Giá trị đếm cho timer 0: 50. Giá trị đếm cho timer 1: 500.  Timer 0: 8 bit, timer 1: 16 bit TMOD = 0001 0010b (12h) - Nội dung thanh ghi IE: EA - ET2 ES ET1 EX1 ET0 EX0 1 0 0 0 1 0 1 0 IE = 1000 1010b (8Ah) Chƣơng trình thực hiện nhƣ sau: ORG 0000h 60
  57. LJMP main ORG 000Bh CPL P1.0 RETI ORG 001Bh MOV TH1,#HIGH(-500) ; 2 byte MOV TL1,#LOW(-500) ; 2 byte CPL P1.1 ; 2 byte RETI ; 1 byte Main: MOV TMOD,#12h MOV IE,#8Ah SETB TR0 SETB TR1 MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) MOV TH0,#(-50) MOV TL0,#(-50) SJMP END Trong ví dụ này, do timer 1 hoạt động ở chế độ 16 bit nên mỗi lần timer tràn phải thực hiện nạp lại giá trị cho timer 1. 5.4 Ngắt do cổng nối tiếp MCS-51 có 2 nguồn ngắt do cổng nối tiếp: ngắt phát và ngắt thu. Hai nguồn ngắt này xác định bằng các bit RI, TI và dùng chung một địa chỉ ISR nên khi chuyển đến ISR, các cờ ngắt không tự động xoá bằng phần cứng mà phải thực hiện bằng phần mềm: kiểm tra nguyên nhân ngắt (RI hay TI) và xoá bit cờ tƣơng ứng. Ví dụ: Viết chƣơng trình khởi động cổng nối tiếp ở chế độ UART 8 bit với tốc độ truyền 4800 bps. Viết ISR cho cổng nối tiếp theo yêu cầu: truyền tuần tự các ký tự từ ‘A’ đến ‘Z’ ra cổng nối tiếp đồng thời mỗi lần có ký tự đến cổng nối tiếp thì nhận về và xuất ký tự nhận ra P0 (giả sử tần số thạch anh là 11.0592 MHz). Giải - Nội dung thanh ghi SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI 0 1 0 1 0 0 0 0 UART 8 Không ở chế độ đa Cho phép Không cho phép bit xử lý thu truyền SCON = 50h 61
  58. - Nội dung thanh ghi TMOD: GATE1 C/T1 M11 M10 GATE0 C/T0 M01 M00 0 0 1 0 0 0 0 0 Không dùng Đếm bằng dao động Chế độ 8 Timer 0 không dùng INT1 nội bit TMOD = 0010 0000b (20h) - Giá trị đếm (theo bảng 3.10): TH1 = -6 - Nội dung thanh ghi IE: EA - ET2 ES ET1 EX1 ET0 EX0 1 0 0 1 0 0 0 0 IE = 1001 0000b (90h) Chương trình thực hiện như sau: ORG 0000h LJMP main ORG 0023h ; Địa chỉ ISR của cổng nối tiếp LJMP Serial_ISR Main: MOV TMOD,#20h MOV TH1,#(-6) MOV TL1,#(-6) ; Tốc độ 4800 bps SETB TR1 MOV R7,#’A’ ; Ký tự truyền đầu tiên MOV IE,#90h ; Cho phép ngắt tại công nối tiếp SETB TI ;Cho phép truyền SJMP $ Serial_ISR: JNB RI,Transmit ; Nếu không phải ngắt do nhận ; ký tự thì truyền CLR RI MOV A,SBUF ; Nhận ký tự MOV P0,A ; Xuất ra Port 0 SJMP exitSerial Transmit: ; Truyền ký tự CLR TI MOV A,R7 MOV SBUF,A ; Truyền ký tự INC R7 ; Qua ký tự kế CJNE R7,#’Z’+1,exitSerial ; Nếu chƣa truyền’Z’ thì 62
  59. ; tiếp tục truyền, ngƣợc lại thì MOV R7,#’A’ ; bắt đầu truyền từ ký tự ‘A’ exitSerial: RETI END 5.5 Ngắt ngo i MCS-51 có 2 nguồn ngắt ngoài khác nhau: ngắt ngoài 0 và ngắt ngoài 1. Ngắt ngoài xảy ra khi bit IEx chuyển lên mức 1, quá trình chuyển mức của bit IEx xảy ra khi: - Bit ITx = 0 và xuất hiện mức logic 0 tại chân INTx tƣơng ứng (P3.2 cho ngắt ngoài 0 hay P3.3 cho ngắt ngoài 1). - Bit ITx = 1 và xuất hiện cạnh âm tại chân INTx. Khi có ngắt xảy ra và cho phép ngắt (dùng thanh ghi IE), chƣơng trình sẽ đƣợc chuyển đến địa chỉ của ISR tƣơng ứng (0003h cho ngắt ngoài 0 và 0013h cho ngắt ngoài 1) và xoá cờ ngắt TFx. Lƣu ý rằng các cờ ngắt đƣợc lấy mẫu trong mỗi chu kỳ nên để phát hiện ngắt, yêu cầu phải: - Ở mức thấp tối thiểu 1 chu kỳ nếu tác động bằng mức logic (ITx = 0). - Ở mức cao tối thiểu 1 chu kỳ trƣớc khi chuyển xuống mức thấp và mức thấp cũng phải tồn tại tối thiểu 1 chu kỳ (ITx = 1). Quá trình điều khiển ngắt ngoài mô tả nhƣ sau: - Xác định yêu cầu ngắt bằng cạnh âm hay bằng mức logic. - Cho phép ngắt tại ngắt ngoài tƣơng ứng (dùng thanh ghi IE). - Xác định mức ƣu tiên (thanh ghi IP). - Viết ISR cho các ngắt. Ví dụ: Viết chƣơng trình sao cho mỗi khi có mức logic 0 xuất hiện tại P3.2 (ngắt ngoài 0) thì tạo xung 1 KHz tại P1.0. Quá trình tạo xung chỉ dừng khi có mức logic 0 xuất hiện tại P3.3 (ngắt ngoài 1). Giải Chƣơng trình thực hiện có 3 ngắt xảy ra: ngắt ngoài 0 cho phép timer chạy để tạo xung tại P1.0, ngắt ngoài 1 cấm timer để ngừng quá trình tạo xung và ngắt timrer để tạo xung. f = 1 KHz suy ra T = 1ms (1000 chu kỳ): giá trị đếm là 500 (chế độ 16 bit) - 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) - Nội dung thanh ghi IE: EA - ET2 ES ET1 EX1 ET0 EX0 63
  60. 1 0 0 0 1 1 0 1 IE = 1000 1101b (8Dh) Chương trình thực hiện như sau: ORG 0000h LJMP main ORG 0003h ; Địa chỉ ISR ngắt ngoài 0 SETB TR1 ; Timer 1 chạy RETI ORG 0013h ; Địa chỉ ISR của ngắt ngoài 1 CLR TR1 ; Cấm timer 1 RETI ORG 001Bh ; Địa chỉ ISR timer 1 MOV TH1,#HIGH(-500); Chế độ 16 bit nên mỗi lần tràn MOV TL1,#LOW(-500); phải nạp lại giá trị CPL P1.0 ; Đảo bit P1.0 để tạo xung RETI Main: MOV TMOD,#10h MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) MOV IE,#8Dh ; Cho phép ngắt tại ngắt ngoài 0, 1 và SJMP $ ; timer 1 END 64
  61. Tài Liệu Tham Kh o [1] Tống Văn On (2006), Giáo trình 8051, NX Đại Học Bách Khoa HCM. [2] Phạm Quang Trí, Giáo trình thực hành Vi điều khiển, Đại học Công Nghiệp TP HCM. 65
  62. MỤC LỤC Chƣơng 1. TỔNG QUAN VỀ VI ĐIỀU KHIỂN 8051 1 1.1 Giới thiệu 1 1.2 Vi điều khiển AT89C51 1 1.2.1 Sơ đồ khối 2 1.2.2 Chức năng của các chân vi điều khiển 3 1.2.3 Định thì chu kỳ máy 5 1.3 Tổ chức bộ nhớ 7 1.3.1 Tổ chức bộ nhớ trong 7 1.3.2 Tổ chức bộ nhớ ngoài 10 1.4 Các thanh ghi chức năng đặc biệt (SFR – Special Function Registers) 12 1.4.1 Thanh ghi tích luỹ (Accumulator) 12 1.4.2 Thanh ghi B 13 1.4.3 Thanh ghi từ trạng thái chƣơng trình (PSW - Program Status Word) 13 1.4.4 Thanh ghi con trỏ stack (SP – Stack Pointer) 13 1.4.5 Con trỏ dữ liệu DPTR (Data Pointer) 14 1.4.6 Các thanh ghi port 14 1.4.7 Thanh ghi port nối tiếp (SBUF - Serial Data Buffer) 14 1.4.8 Các thanh ghi định thời (Timer Register) 14 1.4.9 Các thanh ghi điều khiển 15 Chƣơng 2. LẬP TRÌNH HỢP NGỮ VỚI HỌ VI ĐIỀU KHIỂN MCS-51 16 2.1 Các khái niệm 16 2.2 Các phƣơng pháp định địa chỉ 17 2.2.1 Định địa chỉ trực tiếp 17 66
  63. 2.2.2 Định địa chỉ gián tiếp 17 2.2.3 Định địa chỉ thanh ghi 17 2.2.4 Định địa chỉ tức thời 17 2.3 Các vấn đề liên quan khi lập trình hợp ngữ 18 2.3.1 Cú pháp lệnh 18 2.3.2 Khai báo dữ liệu 18 2.3.3 Các toán tử 19 2.3.4 Cấu trúc chƣơng trình 20 2.4 Tập lệnh 21 2.4.1 Nhóm lệnh di chuyển dữ liệu 21 2.4.2 Nhóm lệnh xử lý bit 25 2.4.3 Nhóm lệnh rẽ nhánh 26 2.4.4 Nhóm lệnh logic 29 2.4.5 Nhóm lệnh số học 31 2.5 Bài tập chƣơng 2 32 Chƣơng 3. TIMER – COUNTER 40 3.1 Giới thiệu 40 3.2 Hoạt động của Timer / Counter 40 3.3 Các thanh ghi điều khiển hoạt động 41 3.3.1 Thanh ghi điều khiển Timer (TCON – Timer/Counter Control Register) 41 3.3.2 Thanh ghi chế độ Timer (TMOD – Timer/Counter Mode) 41 3.4 Các chế độ hoạt động 42 3.4.1 Chế độ định thời 13 bit (MODE 0): 42 3.4.2 Chế độ định thời 16 bit (Mode 1): 42 3.4.3 Chế độ tự động nạp lại 8 bit (Mode 2): 43 3.4.4 Chế độ định thời phân chia (Mode3): 43 3.5 Các ví dụ 44 Chƣơng 4. CỔNG N I TI P (Serial port) 46 67
  64. 4.1 Giới thiệu 46 4.2 Các thanh ghi điều khiển hoạt động 47 4.2.1 Thanh ghi SCON (Serial port controller) 47 4.2.2 Thanh ghi BDRCON (Baud Rate Control Register) 48 4.3 Tạo tốc độ baud 48 4.4 Truyền thông đa xử lý 50 4.5 Nhận dạng địa chỉ tự động 51 4.6 Các ví dụ 52 Chƣơng 5. NGẮT ( Interupt) 55 5.1 Các thanh ghi điều khiển ngắt 55 5.1.1 Thanh ghi cho phép hoặc cấm ngắt IE 55 5.1.2 Thanh ghi IP (Interrupt Priority) 56 5.1.3 Thanh ghi TCON (Timer/Counter Control) 56 5.2 Xử lý ngắt 57 5.3 Ngắt do bộ định thời 59 5.4 Ngắt do cổng nối tiếp 61 5.5 Ngắt ngoài 63 68