Chương III TỔNG QUAN VỀ HỌ VI ĐIỀU KHIỂN MCS-51 Họ vi điều khiển Mcs – 51 ra đời từ năm 1980 bởi hãng Intel, với sản phẩm đầu tiên là 8051. Các IC này gọi là vi điều khiển vì chúng bao gồm cả ROM, RAM, timer, các cổng nối tiếp và song song. Đây là đặc điểm chính để ta phân biệt giữa vi điều khiển và vi xử lý. 8051 không được sử dụng trong máy tính nhưng được sử dụng rộng rãi trong công nghiệp và trong sản phẩm máy móc tiêu dùng. Cùng họ với 8051 có một số vi điều khiển khác. Về cơ bản chúng đều giống nhau, chúng chỉ khác nhau ở vùng nhớ nội bao gồm vùng nhớ mã lệnh, vùng nhớ dữ liệu và số timer. Sự khác nhau đó được mô tả bằng bảng dưới đây. Vi điều khiển Vùng mã lệnh nội Vùng dữ liệu nội Số timer 8051 8031 8751 8052 8032 8732 4K ROM 0K 4K EPROM 8K ROM 0K 4K EPROM 128 bytes 128 bytes 128 bytes 256 bytes 256 bytes 256 bytes 2 2 2 3 3 3 Bảng 4.1 So sánh các IC của họ Msc-51 TM I – CẤU TRÚC CỦA 8051: Trung tâm của 8051 vẫn là vi xử lý trung tâm (CPU). Để kích thích cho toàn bộ hệ thống hoạt động, 8051 có bộ tạo dao động nội với thạch anh được ghép bên ngoài với tần số khoảng từ vài Mhz đến 12 Mhz. Liên kết các phần tử với nhau là hệ thống BUS nội, gồm có BUS dữ liệu, BUS đòa chỉ và BUS điều khiển. 8051 có 4K ROM, 128 bytes RAM và một số thanh ghi bộ nhớ … Nó giao tiếp với bên ngoài qua 3 cổng song song và một cổng nối tiếp có thể thu, phát dữ liệu nối tiếp với tốc độ lập trình được. Hai bộ đònh thời 16 bit của 8051 còn có 2 ngắt ngoài cho phép nó đáp ứng và xử lý điều kiện bên ngoài theo cách ngắt quãng, rất hiệu quả trong các ứng dụng điều khiển. Thông qua các chân điều khiển và các cổng song song 8051 có thể mở rộng bộ nhớ ngoài lên đến 64Kbs dữ liệu. II – SƠ LƯC VỀ CÁC CHÂN CỦA 8051 Mục này giới thiệu cấu trúc phần cứng của 8051 từ những chân được nhìn thấy bên ngoài. Dưới đây chỉ mô tả ngắn gọn chức năng của từng chân. Trong 40 chân có đến 32 chân có chức năng như cổng xuất nhập, 24 trong số chúng được dùng cho hai mục đích khác nhau. Mỗi chân có thể là đường xuất nhập, đường điều khiển hoặc là một phần của đòa chỉ hay dữ liệu. Thiết kế thường có bộ nhớ ngoài hay các thiết bò ngoại vi sử dụng những port để xuất nhập dữ liệu. Tám đường trong mỗi port được dùng như một đơn vò giao tiếp song song như máy in, bộ biến đổi tương tự số, v.v… Hoặc mỗi đường cũng có thể hoạt động một cách độc lập trong giao tiếp với các thiết bò đơn bit như: transitor, LED, switch, solenoids … Port 0 Port 0 là cổng song song dùng cho hai mục đích, nó là các chân từ 32 đến 39. Trong những thiết kế nhỏ nó được dùng trong cổng xuất nhập bình thường. Ở những thiết kế có sử dụng bộ nhớ ngoài, nó vừa là bus dữ liệu vừa là byte thấp của bus đòc chỉ. Nó còn dùng chứa bytes mã khi nạp ROM nội. Port 1 Port 1 dành cho cổng xuất nhập và chỉ dành cho mục đích này mà thôi. Nó dùng để giao tiếp với các thiết bò ngoại vi theo từng bit hoặc byte. Port 1 chiếm các chân từ 1 đến 8. Port 2 Port 2 (chân 21 28) là port có hai chức năng. Ngoài mục đích dành cho xuất nhập thông thường nó còn dùng làm byte cao cho bus đòa chỉ bộ nhớ ngoài. Port 3 Port 3 (chân 10 17) là port hai chức năng. Bên cạnh chức năng xuất nhập, các bit của port 3 còn có chức năng điều khiển. Chức năng các bit của port 3 và port 1 được mô tả trong bảng 4.2 PSEN (cho phép nạp chương trình) 8051 có 4 chân tín hiệu điều khiển. PSEN là tín hiệu điều khiển được xuất ra ở chân 29. Tín hiệu điều khiển này cho phép lập trình ở bộ nhớ ngoài và thường được nối với các chân OE của EPROM để đọc mã lệnh từ bộ nhớ ngoài vào thanh ghi lệnh của 8051. Nó xuống mức thấp trong khi đọc lệnh. Mã lệnh đọc từ EPROM, qua bus dữ liệu, được chốt vào thanh ghi của 8051. Khi thi hành chương trình từ ROM nội PSEN được giữ ở mức cao (trạng thái không tác động). EA (truy xuất vùng nhớ ngoài) EA là một tín hiệu vào có thể ở mức cao hay thấp. Nếu ở mức cao 8051 thi hành chương trình ở ROM nội, 4K/8K chương trình. Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ ngoài. Đối với 8031/8231 EA phải được giữ ở mức thấp vì chúng không có ROM nội. EA cũng chính là chân nhận điện áp mức cao để nạp EPROM nội. ALE (cho phép chốt đòa chỉ) ALE là tín hiệu được xuất ra ở chân 20, rất quen thuộc với những ai đã từng làm việc với vi xử lý 8085, 8086 của Intel. 8051 dùng ALE để phân kênh cho bus đòa chỉ và bus dữ liệu. Khi port 0 được dùng làm bus dữ liệu và byte thấp của bus đòa chỉ – ALE là tín hiệu dùng để chốt đòa chỉ vào thanh ghi chốt bên ngoài trong nữa đầu của một chu kỳ máy. Sau đó Port 0 sẵn sàng để truy xuất dữ liệu trong nữa chu kỳ còn lại. Xung ALE có tần số bằng 1 / 6 lần tần số bộ dao động nội và có thể dùng như một xung clock cho mục đích nào đó khi hệ thống không làm việc. Nếu tốc độ 8051 là 12 MHz thì tần số xung ALE là 2 MHz. Một xung ALE bò mất khi có một lệnh MOVX được thi hành. Ngõ vào dao động nội Bit Tên Chức năng P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 P1.0 P1.1 RXD TXD INT0 INT1 T0 T1 WR RD T2 T2EX Nhận dữ liệu Phát dữ liệu Ngắt ngoài 0 Ngắt ngoài 1 Ngõ vào của Timer / couter 0 Ngõ vào của Timer / couter 1 Đọc dữ liệu từ bộ nhớ ngoài Đọc dữ liệu vào bộ nhớ ngoài Ngõ vào của Timer / couter 2 Bảng 4.2 Chức năng của các chân điều khiển Ngõ vào dao động nội được mô tả như hình dưới đây, có một thạch anh được nối với chân 19 (XTAL1) và 18 (XTAL2). Có thể mắc thêm tụ để ổn đònh dao động. Thạch anh 12 MHz thường dùng cho họ MCs-51, trừ IC 80C31BH có thể dùng thạch anh lên đến 16 MHz. Tuy nhiên, không nhất thiết phải dùng thạch anh mà ta có thể dùng mạch dao động TTL tạo xung Clock đưa vào chân XTAL1 và lấy đảo của nó đưa vào XTAL2. RST (Reset) Ngõ vào RST (chân 19) là chân master reset của 8051. Khi nó ở mức cao (trong khoảng ít nhất 2 chu kỳ máy) các thanh ghi nội được nạp với giá trò tương ứng theo thứ tự khởi động hệ thống. Nguồn cung cấp 8051 sử dụng nguồn đơn 5V. III – CẤU TRÚC CỔNG XUẤT NHẬP Mạch bên trong của một chân port mô tả ngắn gọn trong hình 4.3. Khi ghi lên một chân của cổng, dữ liệu được chốt vào bộ chốt. Chốt lái một transitor thường nối với chân của cổng. Nhờ đó có thể kéo được 4 tải LS ở các cổng Port 1, 2 , 3 và 8 tải LS ở Port. Lưu ý Port 0 có điện trở kéo lên, ngoại trừ khi dùng nó với chức năng vừa là bus đòa chỉ, vừa là bus dữ liệu ngoại. Tùy theo đặc tính bên trong của tải mà ta có thể thêm vào điện trở kéo lên bên ngoài. D Chốt Bus nội của 8051 Vcc Đọc Đọc chốt chân Chân Port Ghi Chốt Hình 4.3 Sơ đồ mạch port Việc đọc chốt được phân biệt làm hai, đó là đọc từ chốt và đọc từ chân. Sự phân biệt này nhằm chống trường hợp chập mạch do quá tải gây nên. Lệnh đọc một bit cổng (ví dụ MOV C, P1.1) sẽ đọc chân của cổng. Trong trường hợp này, chốt phải được giữ ở mức cao, nếu không FET sẽ dẫn và ngõ ra xuống mức thấp. Tất cả các chốt của port đều được set khi reset hệ thống. Như vậy các chân chốt đều được dùng như ngõ vào mà không cần phải set chốt. Tuy nhiên, nếu đã xóa chốt (ví dụ CLEAR P1.1) không thể đọc dữ liệu đúng từ chân port trừ khi set chốt trở lại. IV – TỔ CHỨC BỘ NHỚ Hầu hết các bộ nhớ các vi xử lý đều dựa theo cấu trúc Von Neuman về phân chia vùng nhớ cho chương trình và dữ liệu. Điều này cho phép chương trình được lưu giữ trong đóa và chỉ load vào bộ nhớ mỗi khi thi hành. Do đó dữ liệu và chương trình đều nằm trong RAM. Đối với vi điều khiển thì khác, CPU được coi là hệ thống máy tính. Nó là trung tâm của thiết bò điều khiển. Nó bò giới hạn về bộ nhớ. Chương trình điều khiển nằm trong ROM. Vì lý do này mà bộ nhớ của vi điều khiển 8051 dựa theo cấu trúc Harvard để phân chia vùng chương trình (code mã lệnh) và dữ liệu. Như đã mô tả ở bảng 4.2 cả hai vùng mã lệnh và dữ liệu đều nằm ở bộ nhớ nội. Tuy nhiên cả hai cũng có thể mở rộng ra bộ nhớ ngoài, có thể lên đến 64Kb cho vùng đòa chỉ. Bộ nhớ nội gồm có ROM nội (chỉ đối với 8051/8052) và RAM ngoại. RAM chia thành nhiều vùng: vùng dành cho mục đích nào đó, vùng có thể truy xuất bit, các khối (bank) thanh ghi, và các thanh ghi đặc biệt. Có hai điều đáng lưu ý ở đây: (a) các thanh ghi và các cổng xuất nhập đều được phân chia đòa chỉ và có thể truy xuất chúng như những vùng khác. (b) stack thường được phân chia vào RAM nội hơn là vùng nhớ ngoài. Đây là một đặc điểm của vi điều khiển. Hình 4.4 mô tả bộ nhớ của 8031 (không có ROM nội) Hình 4.5 mô tả chi tiết về vùng nhớ dữ liệu nội. Các vùng nhớ được mô tả dưới đây. Vùng tổng quát Vùng RAM này chiếm 80 bytes từ đòa chỉ 30H đến đòa chỉ 7FH. Vùng nhớ 32 bytes bên dưới cũng có thể được dùng như vùng này mặc dù nó được dùng cho mục đích khác. Bất kỳ vò trí nào trong vùng này đều có thể truy xuất tự do bằng đòa chỉ trực tiếp hoặc gián tiếp. Ví dụ để đọc nội dung byte nhớ nội của đòa chỉ 5FH vào thanh ghi ACC, ta dùng lệnh sau: MOV A, 5FH ; Lệnh này chuyển một byte dữ liệu sử dụng đòa chỉ trực tiếp để xác đònh đòa chỉ nguồn (5FH). RAM nội cũng có thể được truy xuất bằng đòa chỉ gián tiếp thông qua R0 và R1 (chỉ hai thanh ghi này mà thôi). Ví dụ lênh sau sẽ thực hiện công việc giống như ví dụ trên MOV R0, 5FH ; MOV A, @R0 ; Lệnh đầu tiên nạp giá trò 5FH cho thanh ghi R0. Lệnh thứ hai dùng chuyển dữ liệu được chỉ ra bởi R0 và thanh ghi tích luỹ (ACC). FFFF FFFF Vùng Vùng mã lệnh dữ liệu FF Truy xuất Truy xuất thông qua RD và WR PSEN 0000 0000 Vùng nhớ nội Vùng nhớ ngoài Hình : 4.4 Tóm tắt vùng nhớ 8031 Vùng nhớ có khả năng truy xuất bit: 8051 có tất cả 210 vò trí có thể truy xuất bit. Trong đó có 128 bits (16 bytes) từ đòa chỉ 20H đến 2FH và các bit thuộc các thanh ghi chức năng. Khả năng truy xuất bit bằng các phần mềm là một điểm mạnh của vi điều khiển. Bits có thể được set, clear, and, or, v.v… bằng một lệnh đơn. Vùng nhớ này có thể truy xuất như bytes hoặc bit. Ví dụ để set bit 67H ta dùng lệnh sau: SETB 67H ; So với bộ nhớ bit là bit có trọng số lớn nhất của bytes 2CH, do đó ta cũng có thể set nó bằng lệnh sau: MOV A, 2CH ; ORL A, #10000000B ; MOV 2CH, A ; Hơn thế nữa các I/O ports của 8051 có thể truy xuất bit, làm đơn giản việc xuất nhập từng bit. Vùng nhớ này có thể xuất nhập từng byte tùy theo lệnh. Các ngăn thanh ghi (Register banks): 32 butyes nằm ở cuối vùng RAM nội là các ngăn thanh ghi. Tập lệnh của 8051 chỉ truy xuất 8 thanh ghi trong vùng này, từ R0 đến R7. Tại một thời điểm chỉ truy xuất được một ngăn thanh ghi mà thôi. Các thanh ghi này có đòa chỉ mặc đònh 00H đến 07H khi reset hệ thống (bank 0). Lệnh sau đây đọc nội dung byte nhớ có đòa chỉ 05H vào thanh ghi tích luỹ. MOV A, R5 ; Lệnh trên chỉ chiếm một bute sử dụng đòa chỉ thanh ghi. Dó nhiên công việc trên có được thực hiện bằng một lệnh hai bytes sử dụng đòa chỉ trực tiếp: MOV A, 05H ; Rõ ràng lệnh sử dụng thanh ghi R0 đến R7 ngắn hơn và nhanh hơn so với lệnh tương đương sử dụng đòa chỉ trực tiếp. Các ngăn thanh ghi có thể thay đổi bằng cách set lại thanh ghi trạng thái chương trình (PSW.3 PSW.4) trong chương trình. Giả sử sau khi cho phép sử dụng bank 3 thanh ghi R5 lúc này có đòa chỉ 20H. Lệnh sau ghi nội dung thanh ghi ACC vào vò trí 18H(R3) MOV R3, A; V – CÁC THANH GHI CÓ CHỨC NĂNG ĐẶC BIỆT Hầu hết các thanh ghi nội của các vi điều khiển đều có thể được truy xuất thông qua tên đã được đònh nghóa. Ví dụ INC A. Các thanh ghi nội của 8051 chiếm một phần của vùng nhớ nội, vì vậy mỗi thanh ghi đều có một đòa chỉ. Các thanh ghi chức năng (FSRs) nằm trong vùng nhớ cao từ 80H đến FFH. Lưu ý có một số bytes trong vùng này không được đònh nghóa. Chỉ có 21 đòa chỉ thanh ghi chức năng được đònh nghóa (26 đòa chỉ đối với 8052/8032). Mặc dù có thể truy xuất các thanh ghi chức năng thông qua tên của nó, hầu hết các thanh ghi này được truy xuất bằng đòa chỉ trực tiếp. Một số thanh ghi có thể truy xuất bằng byte hoặc bit. Trong lập trình phải cẩn thận khi truy xuất bit thông qua byte. Ví dụ lệnh sau: SETB 0E0H ; Set bit 0 trong thanh ghi ACC, các bit khác vẫn không thay đổi. Lưu ý đòa chỉ của một bit trong một thanh ghi chức năng luôn được xác đònh bởi 5 bit cao của đòa chỉ thanh ghi đó. Ví dụ một bit trong thanh ghi P1 (90H hay 10010000B) hay có đòa chỉ 9xH hay 10010xxxB. Thanh ghi trạng thái chương trình (PSW) sẽ được mô tả chi tiết trong phần sau, các thanh ghi chức năng còn lại được mô tả ngắn gọn và sẽ được mô tả chi tiết trong những chương sau. Thanh ghi trạng thái chương trình: Thanh ghi trạng thái chương trình có đòa chỉ 0Dh, chứa các bit trạng thái chương trình. Các bit trạng thái được mô tả như sau: * Cờ Carry: Cờ carry có hai chức năng: + Được dùng trong các phép toán số học thông thường. Nó là cờ nhớ của phép tính cộng và cờ mượn của phép tính trừ. Ví dụ các thanh ghi ACC có nội dugn FFH thì lệnh “ADD A, #1” làm cho ACC bằng 00H và cờ nhớ được set. + Cờ carry còn được dùng như “thanh ghi tích luỹ 1 bit” cho các phép toán luận lý trên bit. Ví dụ lệnh sau AND bit 25H với cờ carry và đặc kết quả vào cờ carry: “ANL C,25H ;”. * Cờ nhớ phụ (auxiliary carry – AC) : Khi cộng các giá trò BCD, cờ AC được set nếu bit thứ ba tràn hay 4 bit thấp có giá trò từ 0AH đến 0FH. Khi cộng số BCD, sau phép cộng phải dùng lệnh DA A (decimal adjust accumulator) để chỉnh kết quả cộng về dạng BCD. * Cờ 0: Cờ này dành cho người sử dụng trong các ứng dụng lập trình. * Bit chọn ngăn thanh ghi: Hai bit RS0 và RS1 dùng để cho ngăn thanh ghi, chúng được xóa khi reset hệ thống và có thể thay đổi bằng phần mềm. Ví dụ các lệnh sau sẽ chọn nhăn thanh ghi thứ ba và ghi nội dung R7 (đòa chỉ 1FH) vào ACC. SETB RS0 ; SETB RS1 ; MOV A, R7 ; * Cờ tràn (Overflow – OV): Cờ tràn được set kết quả bò tràn (số học) sau phép tính cộng hoặc trừ. Đối với phép toán cộng và trừ số có dấu, phần mềm có thể xét bit này để kiểm tra kết quả có vượt quá giới hạn hay không. Khi cộng số không dấu ta không quan tâm đến bit này. Như vậy kết quả của phép tính cộng hay trừ lớn hơn 127 hoặc nhỏ hơn –128 sẽ set cờ tràn. Ví dụ OV sẽ set sau phép tính cộng sau: Hex: 0F Decimal : 15 +7F +127 8E 142 8E tương đương với –116. Rõ ràng kết quả 142 không chính xác. Vì vậy bit OV được set. B it K ý hiệu Đ òa chỉ Chức năng P SW .7 P SW .6 P SW .5 P SW .4 P SW .3 P SW .2 P SW .1 P SW .0 C Y A C F 0 R S1 R S0 O V P D 7h D 6h D 5h D 4h D 3h D 2h D 1h D 0h Cờ nhớ Cờ nhớ phụ Cờ Zero Chọn thanh ghi dự trữ 1 Chọn thanh ghi dự trữ 2 00=bank0, đòa chỉ 00h-07h 01=bank1, đòa chỉ 08h-0Fh 10=bank2, đòa chỉ 10h-17h 11=bank3, đòa chỉ 18h-1Fh Cờ tràn Dự trữ Cờ chẵn lẽ Bảng 4.3 Thanh ghi PSW * Bit parity: Bit Parity được tự động set hoặc xóa trong mỗi chu kỳ máy để tạo nên parity chẵn đối với thanh ghi tích luỹ. Số bit 1 trong thanh ghi ACC cộng với P luôn . chính để ta phân biệt giữa vi điều khiển và vi xử lý. 8051 không được sử dụng trong máy tính nhưng được sử dụng rộng rãi trong công nghiệp và trong sản phẩm máy móc tiêu dùng. Cùng họ với. chương trình đều nằm trong RAM. Đối với vi điều khiển thì khác, CPU được coi là hệ thống máy tính. Nó là trung tâm của thiết bò điều khiển. Nó bò giới hạn về bộ nhớ. Chương trình điều khiển nằm trong. dành cho người sử dụng trong các ứng dụng lập trình. * Bit chọn ngăn thanh ghi: Hai bit RS0 và RS1 dùng để cho ngăn thanh ghi, chúng được xóa khi reset hệ thống và có thể thay đổi bằng phần mềm.