Làm quen với vi điều khiển 8051

pdf
Số trang Làm quen với vi điều khiển 8051 25 Cỡ tệp Làm quen với vi điều khiển 8051 369 KB Lượt tải Làm quen với vi điều khiển 8051 0 Lượt đọc Làm quen với vi điều khiển 8051 2
Đánh giá Làm quen với vi điều khiển 8051
4.3 ( 6 lượt)
Nhấn vào bên dưới để tải tài liệu
Đang xem trước 10 trên tổng 25 trang, để tải xuống xem đầy đủ hãy nhấn vào bên trên
Chủ đề liên quan

Nội dung

Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Cấu trúc bus Bus địa chỉ của họ vi điều khiển 8051 gồm 16 đường tín hiệu (thường gọi là bus địa chỉ 16 bit). Với số lượng bit địa chỉ như trên, không gian nhớ của chip được mở rộng tối đa là 216 = 65536 địa chỉ, tương đương 64K. Bus dữ liệu của họ vi điều khiển 8051 gồm 8 đường tín hiệu (thường gọi là bus dữ liệu 8 bit), đó là lý do tại sao nói 8051 là họ vi điều khiển 8 bit. Với độ rộng của bus dữ liệu như vậy, các chip họ 8051 có thể xử lý các toán hạng 8 bit trong một chu kỳ lệnh. Bộ nhớ chương trình Vi điều khiển họ 8051 có không gian bộ nhớ chương trình là 64K địa chỉ, đó cũng là dung lượng bộ nhớ chương trình lớn nhất mà mỗi chip thuộc họ này có thể có được. Bộ nhớ chương trình của các chip họ 8051 có thể thuộc một trong các loại: ROM, EPROM, Flash, hoặc không có bộ nhớ chương trình bên trong chip. Tên của từng chip thể hiện chính loại bộ nhớ chương trình mà nó mang bên trong, cụ thể là vài ví dụ sau: STT Tên chip ROM EPROM Flash 1 8051 4 Kbyte x x 2 8052 8 Kbyte x x 3 8031 x x x 4 8032 x x x 5 87C51 x 4 Kbyte x 6 87C52 x 8 Kbyte x 7 AT89C51 / AT89S51 x x 4 Kbyte 8 AT89C52 / AT89S52 x x 8 Kbyte Bộ nhớ dữ liệu Vi điều khiển họ 8051 có không gian bộ nhớ dữ liệu là 64K địa chỉ, đó cũng là dung lượng bộ nhớ dữ liệu lớn nhất mà mỗi chip thuộc họ này có thể có được (nếu phối ghép một cách chính tắc, sử dụng các đường tín hiệu của bus địa chỉ và dữ liệu). Bộ nhớ dữ liệu của các chip họ 8051 có thể thuộc một hay hai loại: SRAM hoặc EEPROM. Bộ nhớ dữ liệu SRAM được tích hợp bên trong mọi chip thuộc họ vi điều khiển này, có dung lượng khác nhau tùy loại chip, nhưng thường chỉ khoảng vài trăm byte. Đây chính là nơi chứa các biến trung gian trong quá trình hoạt động của chip. khi mất điện, do bản chất của SRAM mà giá trị của các biến này cũng bị mất theo. Khi có điện trở lại, nội dung của các ô nhớ chứa các biến này cũng là bất kỳ, không thể xác định trước. Bên cạnh bộ nhớ loại SRAM, một số chip thuộc họ 8051 còn có thêm bộ nhớ dữ liệu loại EEPROM với dung lượng tối đa vài Kbyte, tùy từng loại chip cụ thể. Dưới đây là một vài ví dụ về bộ nhớ chương trình của một số loại chip thông dụng thuộc họ 8051. STT Tên chip Bộ nhớ SRAM Bộ nhớ EEPROM 1 AT89C51 128 byte 0 2 AT89C52 256 byte 0 3 AT89C2051 128 byte 0 4 AT89S51 128 byte 0 5 AT89S52 256 byte 0 6 AT89S8252 256 byte 2048 byte Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 1 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Tổng quát về bộ nhớ của 8051, ta có thể thấy mỗi chip 8051 gồm có những bộ nhớ sau: 64 Kbyte Phần không gian địa chỉ cho bộ nhớ chương trình còn trống, bằng 64 Kbyte trừ đi lượng bộ nhớ onchip Phần không gian địa chỉ cho bộ nhớ dữ liệu (hoàn toàn trống rỗng 64K byte, dành cho bộ nhớ dữ liệu ghép thêm bên ngoài nếu có) Bộ nhớ chương trình onchip Bộ nhớ SRAM Dung lượng tùy loại chip Đối với các chip có bộ nhớ SRAM 128 byte thì địa chỉ của các byte SRAM này được đánh số từ 00h đến 7Fh. Đối với các chip có bộ nhớ SRAM 256 byte thì địa chỉ của các byte SRAM được đánh số từ 00h đến FFh. Ở cả hai loại chip, SRAM có địa chỉ từ 00h đến 7Fh được gọi là vùng RAM thấp, phần có địa chỉ từ 80h đến FFh (nếu có) được gọi là vùng RAM cao. Bên cạnh các bộ nhớ, bên trong mỗi chip 8051 còn có một tập hợp các thanh ghi chức năng đặc biệt (SFR – Special Function Register). Các thanh ghi này liên quan đến hoạt động của các ngoại vi onchip (các cổng vào ra, timer, ngắt ...). Địa chỉ của chúng trùng với dải địa chỉ của vùng SRAM cao, tức là cũng có địa chỉ từ 80h đến FFh. Vùng RAM cao, có địa chỉ từ 80h đến FFh Vùng SFR, cũng có địa chỉ từ 80h đến FFh Vùng RAM thấp có địa chỉ từ 00h đến 7Fh Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 2 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Vậy khi truy cập vào một địa chỉ thuộc dải từ 00h đến 7Fh thì sẽ truy cập đến ô nhớ thuộc vùng RAM thấp. Tuy nhiên khi truy cập đến một địa chỉ x thuộc dải từ 80h đến FFh thì xảy ra vấn đề cần giải quyết: sẽ truy cập đến thanh ghi SFR ở địa chỉ x hay truy cập đến ô nhớ ở địa chỉ x của vùng RAM cao? Nhà sản xuất quy định rằng, trong trường hợp này, nếu kiểu truy cập sử dụng chế độ địa chỉ trực tiếp thì sẽ truy cập vào vùng SFR, ngược lại nếu kiểu truy cập sử dụng chế độ địa chỉ gián tiếp thì sẽ truy cập vào vùng RAM cao. Bản đồ các thanh ghi SFR Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 3 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Nhắc lại về bộ nhớ của 8501 8051 có 2 không gian địa chỉ dành cho bộ nhớ chương trình và bộ nhớ dữ liệu riêng biệt. Cả 2 không gian này đều có 16bit địa chỉ, do đó có thể chứa được tối đa 216 = 64K = 65536 ô nhớ mỗi loại. Bộ nhớ onchip của 8051 gồm có 4 Kbyte bộ nhớ chương trình (ROM, EPROM, EEPROM hoặc Flash tùy loại biến thể) và 128byte bộ nhớ dữ liệu (RAM). 4 Kbyte bộ nhớ chương trình onchip nằm trong không gian địa chỉ 64 Kbyte dành cho bộ nhớ chương trình (thuộc dải địa chỉ từ 0x0000 đến 0x0FFF). 64K 4K Ngược lại, 128 byte RAM onchip lại không nằm trong không gian địa chỉ 64 Kbyte dành cho bộ nhớ dữ liệu. Ta có thể tưởng tượng không gian bộ nhớ chương trình là một chiếc thùng được lấp đầy 1/16 dung tích bởi 4 Kbyte bộ nhớ onchip, còn không gian bộ nhớ dữ liệu là một thùng to dung tích 64 Kbyte rỗng hoàn toàn và một hộp nhỏ dung tích 128 byte (địa chỉ từ 0x00 đến 0x7F) nằm riêng rẽ bên cạnh. 64K 128 byte Bộ nhớ chương trình dùng để chứa mã của chương trình nạp vào chip. Mỗi lệnh được mã hóa bởi 1 hay vài byte, dung lượng của bộ nhớ chương trình phản ánh số lượng lệnh mà bộ nhớ có thể chứa được. Địa chỉ đầu tiên của bộ nhớ chương trình (0x0000) chính là địa chỉ Reset của 8051. Ngay sau khi reset (do tắt bật nguồn, do mức điện áp tại chân RESET bị kéo lên 5V...), CPU sẽ nhảy đến thực hiện lệnh đặt tại địa chỉ này trước tiên, luôn luôn là như vậy. Phần còn trống trong không gian chương trình không dùng để làm gì cả. Nếu muốn mở rộng bộ nhớ chương trình, ta phải dùng bộ nhớ chương trình bên ngoài có dung lượng như ý muốn. Tuy nhiên khi dùng bộ nhớ chương trình ngoài, bộ nhớ chương trình onchip không dùng được nữa, bộ nhớ chương trình ngoài sẽ chiếm dải địa chỉ ngay từ địa chỉ 0x0000. Bộ nhớ dữ liệu RAM onchip thường dùng để chứa các biến tạm thời trong quá trình vi điều khiển hoạt động, đó cũng là nơi dành cho ngăn xếp hoạt động. Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 4 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Không gian dữ liệu 64Kbyte được để trống hoàn toàn và chỉ dùng được khi ghép nối với bộ nhớ dữ liệu bên ngoài. Khi ghép nối thêm bộ nhớ dữ liệu bên ngoài, dung lượng của các bộ nhớ này sẽ chiếm dần các vị trí trong không gian, tuy nhiên không hề ảnh hưởng đến 128byte RAM onchip. Ngăn xếp trong 8051 liên quan đến một thanh ghi tên là con trỏ ngăn xếp SP (Stack Pointer). Thanh ghi này luôn trỏ vào đỉnh của ngăn xếp, tức là nó chứa địa chỉ của vị trí ngay sát vị trí có thể lưu địa chỉ/dữ liệu tiếp theo vào. Khi cất 1 byte địa chỉ/dữ liệu vào ngăn xếp, SP tự động tăng lên 1 đơn vị sau đó mới cất địa chỉ/dữ liệu vào ô nhớ có địa chỉ bằng với giá trị của SP sau khi đã tăng. Khi lấy 1 byte địa chỉ/dữ liệu ra khỏi ngăn xếp, giá trị sẽ được lấy ra sau đó SP mới tự động trừ đi 1 đơn vị. Giá trị sau khi reset của SP là 0x07, do đó quy định ngăn xếp sẽ cất dữ liệu từ địa chỉ 0x08 trở đi. Tuy nhiên do đặc tính hoạt động bành trướng theo chiều tăng địa chỉ mà ngăn xếp thường được bố trí lên vùng trên cùng của bộ nhớ RAM onchip để tránh tranh chấp với các biến lưu trong RAM. Mô tả bộ nhớ chương trình của 8051: Thân chương trình (chương trình chính, chương trình con, chương trình xử lý ngắt, bảng các hằng số ...) 0x0FFF 0x0030 Vector ngắt thứ n ... Vector ngắt thứ 1 0x0003 địa chỉ reset 0x0000 Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 5 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Mô tả bộ nhớ dữ liệu RAM của 8051: 0x7F Vùng RAM thường (không đánh địa chỉ bit được) 0x30 Vùng RAM 16 byte có thể đánh địa chỉ bit từ 0x00 đến 0x7F 0x2F 4 băng thanh ghi mỗi băng có 8 thanh ghi R0..7 0x1F 0x20 8052 có thêm vùng RAM cao (địa chỉ cũng từ 0x80 đến 0xFF) nhưng truy nhập phải theo chế độ địa chỉ gián tiếp để phân biệt với vùng SFR Đây là vùng các thanh ghi chức năng đặc biệt SFR (Special Function Register) có ở cả 8051 và 8052. Truy nhập (ghi/đọc) vùng này là truy nhập vào các địa chỉ từ 0x80 đến 0xFF nhưng phải theo chế độ địa chỉ trực tiếp 0x00 Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 6 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Cổng vào/ra song song (Parrallel I/O Port) trong 8051 8051 có 4 cổng vào ra song song, có tên lần lượt là P0, P1, P2 và P3. Tất cả các cổng này đều là cổng vào ra hai chiều 8bit. Các bit của mỗi cổng là một chân trên chip, như vậy mỗi cổng sẽ có 8 chân trên chip. Hướng dữ liệu (dùng cổng đó làm cổng ra hay cổng vào) là độc lập giữa các cổng và giữa các chân (các bit) trong cùng một cổng. Ví dụ, ta có thể định nghĩa cổng P0 là cổng ra, P1 là cổng vào hoặc ngược lại một cách tùy ý, với cả 2 cổng P2 và P3 còn lại cũng vậy. Trong cùng một cổng P0, ta cũng có thể định nghĩa chân P0.0 là cổng vào, P0.1 lại là cổng ra tùy ý. Liên quan đến mỗi cổng vào/ra song song của 8051 chỉ có một thanh ghi SFR ( thanh ghi chức năng đặc biệt) có tên trùng với tên của cổng. Ta có các thanh ghi P0 dùng cho cổng P0, thanh ghi P1 dùng cho cổng P1 … Đây là các thanh ghi đánh địa chỉ đến từng bit (bit addressable), do đó ta có thể dùng các lệnh tác động bit đối với các bit của các thanh ghi này. Mỗi thanh ghi này gồm 8 bit tương ứng với các chân (bit) của cổng đó. Khi một chân (bit) cổng nào đó được dùng làm cổng vào thì trước đó bit tương ứng trong thanh ghi SFR phải được đặt ở mức 1. Nếu một chân (bit) cổng nào đó được dùng làm cổng ra thì giá trị của bit tương ứng trong thanh ghi SFR sẽ là giá trị lôgic muốn đưa ra chân cổng đó. Nếu muốn đưa ra mức lôgic cao (điện áp gần 5V), bit tương ứng trong thanh ghi phải được đặt bằng 1, hiển nhiên nếu muốn đưa ra mức lôgic thấp (điện áp gần 0V) thì bit tương ứng trong thanh ghi phải được đặt bằng 0. Như đã nói ở trên, các bit trong thanh ghi cổng có thể được đặt bằng 1/0 mà không làm ảnh hưởng đến các bit còn lại trong cổng đó bằng cách dùng các lệnh setb (đặt lên 1) hay clr (đặt về 0). Sau khi đặt một chân cổng làm cổng vào, ta có thể dùng các lệnh kiểm tra bit để đọc vào và kiểm tra các mức lôgic của mạch ngoài đang áp vào là mức 0 hay mức 1. Các lệnh này là jb (nhảy nếu bit bằng 1), jnb (nhảy nếu bit bằng 0). Mỗi cổng có cấu trúc gồm một latch (chính là các bit của thanh ghi cổng), mạch lái đầu ra (output driver) và mạch đệm đầu vào (input buffer). Ngoài chức năng vào/ra thông thường, một số cổng còn được tích hợp thêm chức năng của một số ngoại vi khác. Xem bảng liệt kê sau: Các chân cổng P1.0 và P1.1 được tích hợp với các tín hiệu của timer2 trong trường hợp chip là 8052. Khi dùng với các chức năng của các ngoại vi, chân cổng tương ứng phải được đặt lên 1. Nếu không các tín hiệu sẽ luôn bị ghim ở mức 0. Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 7 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Sơ đồ của mạch của một chân cổng: Cổng P0 không có điện trở treo cao (pullup resistor) bên trong, mạch lái tạo mức cao chỉ có khi sử dụng cổng này với tính năng là bus dồn kênh địa chỉ/dữ liệu. Như vậy với chức năng ra thông thường, P0 là cổng ra open drain, với chức năng vào, P0 là cổng vào cao trở (high impedance). Nếu muốn sử dụng cổng P0 làm cổng vào/ra thông thường, ta phải thêm điện trở pullup bên ngoài. Giá trị điện trở pullup bên ngoài thường từ 4K7 đến 10K. Các cổng P1, P2 và P3 đều có điện trở pullup bên trong, do đó có thể dùng với chức năng cổng vào/ra thông thường mà không cần có thêm điện trở pullup bên ngoài. Thực chất, điện trở pullup bên trong là các FET, không phải điện trở tuyến tính thông thường, tuy vậy nhưng khả năng phun dòng ra của mạch lái khi đầu ra ở mức cao (hoặc khi là đầu vào) rất nhỏ, chỉ khoảng 100 micro Ampe. Trong datasheet của AT89S5x (một trong những biến thể của họ 8051 do Atmel sản xuất) có thống kê số liệu như sau: Theo đó, nếu ta thiết kế để các cổng phải cung cấp cho tải ở đầu ra mức cao một lượng dòng điện IOH = 60 micro Ampe thì mức điện áp ở đầu ra VOH sẽ bị kéo sụt xuống, chỉ có thể đảm bảo từ 2.4V trở lên bởi nhà sản xuất, không thể cao sát với 5V như lý thuyết. Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 8 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Trong khi đó, khả năng nuốt dòng của mạch lái khi đầu ra ở mức thấp lại cao hơn rất nhiều, có thể đạt từ vài đến hàng chục mili Ampe. Như vậy, khi thiết kế với các phần tử bên ngoài, ta nên để ý đến đặc tính vào/ra của các chân cổng. Ví dụ khi dùng để ghép nối với LED đơn hoặc LED 7 thanh, ta nên thiết kế chân cổng nuốt dòng từ LED để làm LED sáng (cổng nối với Cathode của LED), không nên thiết kế chân cổng phun dòng cho LED để làm LED sáng (cổng nối với Anode của LED). Cơ chế ngắt của 8051 8051 chỉ có một số lượng khá ít các nguồn ngắt (interrupt source) hoặc có thể gọi là các nguyên nhân ngắt. Mỗi ngắt có một vector ngắt riêng, đó là một địa chỉ cố định nằm trong bộ nhớ chương trình, khi ngắt xảy ra, CPU sẽ tự động nhảy đến thực hiện lệnh nằm tại địa chỉ này. Bảng tóm tắt các ngắt trong 8051 như sau: STT Tên ngắt 1 INT0 2 Timer0 3 INT1 4 Timer1 5 Serial Port Mô tả Ngắt ngoài 0 khi có tín hiệu tích cực theo kiểu đã chọn ở chân P3.2 Ngắt tràn timer0 khi giá trị timer0 tràn từ giá trị max về giá trị min Ngắt ngoài 1 khi có tín hiệu tích cực theo kiểu đã chọn ở chân P3.3 Ngắt tràn timer1 khi giá trị timer1 tràn từ giá trị max về giá trị min Ngắt cổng nối tiếp khi vi điều khiển nhận hoặc truyền xong một byte bằng cổng nối tiếp Cờ ngắt IE0 Thanh ghi chứa cờ TCON Vector ngắt 0x0003 TF0 TCON 0x000B IE1 TCON 0x0013 TF1 TCON 0x001B TI, RI SCON 0x0023 Với 8052, ngoài các ngắt trên còn có thêm ngắt của timer2 (do vi điều khiển này có thêm timer2 trong số các ngoại vi onchip). Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 9 Làm quen với vi điều khiển 8051 - cấu trúc phần cứng và cách lập trình phần mềm Mỗi ngắt được dành cho một vector ngắt kéo dài 8byte. Về mặt lý thuyết, nếu chương trình đủ ngắn, mã tạo ra chứa đủ trong 8 byte, người lập trình hoàn toàn có thể đặt phần chương trình xử lý ngắt ngay tại vector ngắt. Tuy nhiên trong hầu hết các trường hợp, chương trình xử lý ngắt có dung lượng mã tạo ra lớn hơn 8byte nên tại vector ngắt, ta chỉ đặt lệnh nhảy tới chương trình xử lý ngắt nằm ở vùng nhớ khác. Nếu không làm vậy, mã chương trình xử lý ngắt này sẽ lấn sang, đè vào vector ngắt kế cận. Liên quan đến ngắt chủ yếu có hai thanh ghi là thanh ghi IE và thanh ghi IP. Để cho phép một ngắt, bit tương ứng với ngắt đó và bit EA phải được đặt bằng 1. Thanh ghi IE là thanh ghi đánh địa chỉ bit, do đó có thể dùng các lệnh tác động bit để tác động riêng rẽ lên từng bit mà không làm ảnh hưởng đến giá trị các bit khác. Cờ ngắt hoạt động độc lập với việc cho phép ngắt, điều đó có nghĩa là cờ ngắt sẽ tự động đặt lên bằng 1 khi có sự kiện gây ngắt xảy ra, bất kể sự kiện đó có được cho phép ngắt hay không. Do vậy, trước khi cho phép một ngắt, ta nên xóa cờ của ngắt đó để đảm bảo sau khi cho phép, các sự kiện gây ngắt trong quá khứ không thể gây ngắt nữa. Ví dụ trước khi cho phép ngắt timer0 mà timer 0 đã chạy và tràn (dù là tràn một hay nhiều lần) thì cờ TF0 sẽ bằng 1, nếu sau đó ta cho phép ngắt timer0 thì sẽ gây ra ngắt ngay do cờ tràn đang bằng 1 (sự kiện tràn gây ngắt trong trường hợp này là tràn trong quá khứ, không phải sự kiện ta quan tâm đến). Vì vậy hãy xóa cờ TF0 trước khi cho phép ngắt tràn timer0. Ngoại trừ cờ của của ngắt nối tiếp (và cờ của ngắt timer2 trong 8052), các cờ ngắt khác đều tự động được xóa khi CPU thực hiện chương trình phục vụ ngắt. Lý do là ngắt cổng nối tiếp (và ngắt timer2 trong 8052) được gây ra bởi 2 nguyên nhân (có 2 cờ cho mỗi ngắt), khi xảy ra ngắt, người lập trình cần phải kiểm tra xem cờ nào được đặt bằng 1 để phân biệt nguyên nhân gây ra ngắt đó là nguyên nhân nào để xử lý thích hợp. Ví dụ ngắt cổng nối tiếp là ngắt được gây ra bởi 1 trong 2 nguyên nhân: vi điều khiển nhận xong hoặc truyền xong một byte dữ liệu qua cổng nối tiếp. Xảy ra sự kiện nào thì cờ ngắt tương ứng sẽ tự động được đặt lên bằng 1, nếu nhận xong thì cờ RI bằng 1, nếu truyền xong thì cờ TI bằng 1. Trong chương trình xử lý ngắt, người lập trình phải kiểm tra cờ TI hay cờ RI bằng 1 để quyết định xử lý ngắt truyền hay xử lý ngắt nhận. Sau khi kiểm tra, Nguyễn Xuân Kiên – MicroStudy Group PDF created with pdfFactory Pro trial version www.pdffactory.com 10
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.