Giáo trình Vi điều khiển (Phần 1)

pdf 89 trang phuongnguyen 10850
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi điều khiển (Phần 1)", để 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:

  • pdfgiao_trinh_vi_dieu_khien_phan_1.pdf

Nội dung text: Giáo trình Vi điều khiển (Phần 1)

  1. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái LỜI NÓI ĐẦU Giáo trình “Vi điều khiển” trong bộ giáo trình nghề Điện tử công nghiệp, được xây dựng và biên soạn trên cơ sở chương trình khung đào tạo nghề do Bộ Lao động – Thương binh và Xã hội ban hành và được chi tiết hóa trong chương trình đào tạo nghề Điện tử công nghiệp của Trường Cao đẳng nghề Yên Bái. Đối tượng phục vụ là học sinh sinh viên trong các khoá đào tạo trình độ cao đẳng nghề, trung cấp nghề Điện tử công nghiệp trong các cơ sở sản xuất làm tài liệu học tập và nghiên cứu. Các nhà quản lý và người sử dụng nhân lực trong các cơ sở sản xuất làm tài liệu tham khảo. Giáo trình môn học “Vi điều khiển” được biên soạn theo các nguyên tắc: Tính định hướng thị trường lao động, tính hệ thống và khoa học, tính ổn định và linh hoạt, hướng tới liên thông, chuẩn đào tạo nghề trong nước và thế giới, tính hiện đại và sát thực với sản xuất. Trong quá trình thực hiện nhóm biên soạn đã tham khảo nhiều tài liệu liên quan của các trường bạn, sách kỹ thuật của các chuyên gia đồng thời tham khảo nhiều tài liệu của các trường đào tạo, hãng sản xuất; các yêu cầu của thực tế, các kiến thức mới cũng đã được nhóm biên soạn cố gắng cập nhật và thể hiện trong giáo trình Ngoài ra còn có sự tham gia đóng góp ý kiến tích cực của các cán bộ, kỹ sư kỹ thuật chuyên ngành trong và ngoài tỉnh để giáo trình được hoàn thiện. Giáo trình môn học “Vi điều khiển” đã được Hội đồng thẩm định Trường Cao đẳng nghề Yên Bái nghiệm thu và nhất trí đưa vào sử dụng làm tài liệu chính thống trong nhà trường phục vụ giảng dạy và học tập của học sinh sinh viên. Giáo trình này được biên soạn lần đầu nên mặc dù đã hết sức cố gắng song khó tránh khỏi những thiếu sót, chúng tôi mong nhận được các ý kiến đóng góp của người sử dụng và các đồng nghiệp để giáo trình ngày càng được hoàn thiện hơn. Xin trân trọng giới thiệu! HIỆU TRƯỞNG Thạc sỹ: Trịnh Tiến Thanh 1
  2. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MỤC LỤC GIỚI THIỆU VỀ MÔ ĐUN 7 Vị trí, ý nghĩa, vai trò mô đun 7 Mục tiêu của môdun 7 Mục tiêu thực hiện của mô đun 7 Nội dung chính của mô đun 7 Bài 1: Sơ lược về lịch sử và hướng phát triển 8 1. Lịch sử phát triển 8 2. Vi điều khiển 8 2.1. Nguyên lý cấu tạo 9 2.2. Các kiểu cấu trúc bộ nhớ 10 3. Lĩnh vực ứng dụng 11 4. Hướng phát triển 11 Bài 2: Cấu trúc họ vi điều khiển 8051 13 1. Tổng quan 13 2. Sơ đồ chân 14 2.1. Port 0 15 2.2. Port 1 15 2.3. Port 2 15 2.4. Port 3 15 2.5. Chân cho phép bộ nhớ chương trình PSEN 16 2.6. Chân cho phép chốt địa chỉ ALE 16 2.7. Chân truy xuất bộ ROM ngoài EA 16 2.8. Chân RESET 17 2.9. Các chân XTAL1 và XTAL2 17 3. Cấu trúc PORT I/O 17 4. Tổ chức bộ nhớ 18 4.1. Vùng RAM đa năng 19 4.2. Vùng RAM địa chỉ bít 21 4.3. Các dãy thanh ghi 22 2
  3. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 5. Các thanh ghi đặc biệt (SFR) 23 5.1. Từ trạng thái chương trình PSW 23 5.2. Thanh ghi B 25 5.3. Con trỏ stack 26 5.4. Con trỏ dử liệu DPTR 26 5.6. Các thanh ghi port 26 5.7. Các thanh ghi định thời 27 5.8. Các thanh ghi của port nối tiếp 27 5.9. Các thanh ghi ngắt 28 5.10. Thanh ghi điều khiển nguồn 28 6. Bộ nhớ ngoài 29 6.1. Truy xuất bộ nhớ chương trình ngoài 30 6.2. Truy xuất bộ nhớ dử liệu ngoài 32 6.3. Giãi mả địa chỉ 34 6.4. Các không gian nhớ chương trình và dữ liệu gối nhau 34 7. Các cải tiến của 8032/8052 35 8. Hoạt động RESET 36 9. Bài tập 37 Bài 3: TẬP LỆNH 8051 39 1. Mở đầu 39 2. Các cách định địa chỉ 39 2.1. Định địa chỉ bằng thanh ghi 39 2.2. Định địa chỉ trực tiếp 40 2.3. Định địa chỉ gián tiếp 41 2.4. Định địa chỉ tức thời 42 2.5. Định địa chỉ tương đối 43 2.6. Định địa chỉ tuyệt đối 44 2.7. Định địa chỉ dài 45 2.8. Định địa chỉ theo chỉ số 45 3. Các nhóm lệnh 47 3.1. Nhóm lệnh số học 47 3
  4. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 3.2. Nhóm lênh logic 55 3.3. Nhóm lệnh truyền dữ liệu 66 3.4. Nhóm lênh Boolean( Các lệnh một bit) 68 3.5 Nhóm lệnh rẽ nhánh chương trình 78 4. Luyện tập 88 Bài 4: BỘ ĐỊNH THỜI 90 1. Mở đầu 90 2. Thanh ghi SFR của timer 91 2.1. Thanh ghi chế độ TMOD 91 2.2. Thanh ghi điều khiển TCON 92 3. Các chế độ làm việc 93 3.1. Chế độ time 13 bit (Mode 0) 94 3.2. Chế độ time 16 bit (Mode 1) 94 3.3. Chế độ tự nạp lại 8 bit ( Mode 2) 97 3.4. Chế độ tách biệt time ( Mode 3) 97 4. Nguồn cung cấp xung cho time 98 4.1. Chức năng định thời 98 4.2. Chức năng đếm sự kiện 98 5. Khởi động, dừng, điều khiển timer 99 6. Khởi tạo truy xuất thanh ghi timer 100 6.1. Đọc thời gian đang hoạt động 101 6.2. Thời gian ngắn và thời gian dài 101 7. Time 2 của 8052 102 7.1. Chế độ tự động nạp lại 105 7.2. Chế độ thu nhận 106 8. Luyện tập 107 8.1. Phương pháp 107 8.2. Bài tập 107 Bài 5: CỔNG NỐI TIẾP 110 1. Mở đầu 110 1.1. Khái niệm truyền dữ liệu đơn công và song công 111 4
  5. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 1.2. Truyền thông nối tiếp dị bộ và đóng khung dữ liệu. 111 1.3. Các bít bắt đầu và dừng. 111 1.4. Tốc độ truyền dữ liệu 112 1.5. Chuẩn RS232 112 2. Thanh ghi điều khiển 113 2.1. Thanh ghi SCON 113 2.2. Thanh ghi SBUF 115 3. Chế độ làm việc 116 3.1. Thanh ghi dịch 8 bit 116 3.2. Chế độ UART 8 bit có tốc độ baud thay đổi 117 3.3. UART 9 bit với tốc độ baud cố định 118 3.4. Chế độ UART với tốc độ baud cố định 118 4. Khởi tạo và truy xuất thanh ghi PORT nối tiếp 118 4.1. Cho phép nhận 118 4.2. Bit dữ liệu thứ 9 119 4.3. Thêm vào bit chẵn – lẻ 119 4.4. Các cờ ngắt 120 5. Truyền thông đa xử lý 120 6. Tốc độ Baud 122 6.1. Tạo tốc độ baud bằng Timer 1 123 6.2. Tạo tốc độ baud bằng Timer 2 125 7. Luyện tập 125 Bài 6: Ngắt (Interrupt) 127 1. Mở dầu 127 2. Tổ chức ngắt của 8051 128 2.1. Cho phép và không cho phép các ngắt 128 2.2. Mức ưu tiên 129 2.3. Chuỗi pooling 130 3. Xử lý ngắt 130 Các vec tơ ngắt 131 4. Thiết kế chương trình dùng ngắt 132 5
  6. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 4.1. Chương trình phục vụ ngắt kích thước nhỏ 133 4.2. Chương trình phục vụ ngắt kích thước lớn 134 5. Ngắt cổng nối tiếp 137 6. Các ngắt ngoài 139 7. Đồ thị thời gian của ngắt 144 8. Bài tập 146 Bài 7: Phần mềm hợp ngữ 147 1. Mở đầu 147 2. Hoạt động của ASSEMBLER 148 3. Cấu trúc chương trình dữ liệu 150 4. Tính biểu thức trong khi hợp dịch 154 4.1. Các biểu thức và toán tử 154 4.2. Chuỗi kí tự ( character string) 154 4.3. Bộ đếm vị trí ( location counter) 155 4.4. Các toán tử số học ( arithmetic operation) 155 4.5. Các toán tử logic 155 4.6. Toán tử quan hệ ( relation operator) 156 4.7. Các toán tử khác 156 4.8. Thứ tự ưu tiên toán tử 156 4.9. Các chỉ dẫn cho Assembler 157 5. Các điều khiển của ASSEMBLER 159 6. Hoạt động liên kết 160 7. MACRO 161 7.1. Truyền tham số cho macro 161 7.2. Macro với nhãn cục bộ 162 7.3. Tác vụ Repeat ( lặp lại) 163 7.4. Các tác vụ điều khiển 164 8. Luyện tập 165 8.1. Phương pháp viết chương trình hợp ngữ 165 8.2. Luyện tập 165 6
  7. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái GIỚI THIỆU VỀ MÔ ĐUN 1. Vị trí, ý nghĩa, vai trò mô đun Đây là một mô đun chuyên ngành được học sau khi học viên đã hoàn tất các mô đun hỗ trợ trước đó như: Linh kiện điện tử, mạch điện tử, vi mạch tương tự, kỹ thuật số Điện tử công nghiệp là một trong các lĩnh vực ứng dụng của công nghệ điện tử để điều khiển thiết bị cũng như thực hiện các yêu cầu về tự động hóa quá trình sản xuất. Trong thực tế hiện nay việc ứng dụng các bộ vi điều khiển cho các yêu cầu này rất là phổ biến do tính linh hoạt, độ ổn định và khả năng giải quyết được những vấn đề phức tạp của nó. Chính vì vậy việc nắm bắt được cấu tạo và nguyên lý hoạt động các hệ dùng vi điều khiển là đièu rất cần thiết cho công tác vận hành cũng như sửa chữa của người công nhân ngành sửa chữa thiết bị điện tử công nghiệp. 2. Mục tiêu của môdun Sau khi hoàn tất mô-đun này, học viên có năng lực: • Giải thích nguyên lý hoạt động của hệ dùng vi điều khiển. • Thay thế các khối chức năng hư hỏng trong hệ dùng vi điều khiển. • Viết các chương trình ứng dụng đơn giản. 3. Mục tiêu thực hiện của mô đun • Vận hành được các thiết bị và dây chuyền sản xuất dùng vi điều khiển. • Xác định được các nguyên nhân gây hư hỏng thường xảy ra trong thực tế. • Sửa chữa và thay thế linh kiện hư hỏng. • Kiểm tra và viết được chương trình điều khiển. 4. Nội dung chính của mô đun Mô đun vi điều khiển bao gồm 7 bài học như sau : 1.Sơ lược về lịch sử và hướng phát triển của vi điều khiển 2.Cấu trúc họ 8051 3.Tập lệnh 8051 4.Bộ định thời 5.Cổng nối tiếp 6.Ngắt 7.Phần mềm ASEMBLER 7
  8. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bài 1: Sơ lược về lịch sử và hướng phát triển 1. Lịch sử phát triển Việc phát minh ra transistor vào năm 1948 là thời điểm bắt đầu cho quá trình phát triển của máy tính với tính năng ngày càng cao và kích thước ngày càng nhỏ. Linh kiện hội đủ 2 ưu điểm trên chính là vi xử lý. Máy tính điện tử đầu tiên của mỹ năm 1946 tên gọi ENIAC đã sử dụng 18.000 bóng đèn điện tử và sau đó năm 1960 được IBM thay thế bằng model 1410 với toàn bộ linh kiện là transistor. Vì chức năng phức tạp nên việc lắp ráp hệ thống cũng rất khó khăn và tốn kém, do đó đã phát sinh ý tưởng phải tìm cách thu nhỏ kích thước của các linh kiện rời như: Transistor, diode, điện trở và kết quả là sự ra đời của công nghệ vi mạch. Theo yêu cầu của các chuyên viên về tên lửa của cơ quan NASA luôn đòi hỏi tính ổn định và kích thước thật nhỏ nên vào năm 1958 Jack Kilby của hãng Texas instrument đã thiết kế được vi mạch đầu tiên và năm 1963 công ty Rockwell đã cho ra đời tên lửa Minerva II được chế tạo toàn bộ bằng vi mạch. Trong lĩnh vực dân sự vào năm 1961 công ty Fairchild lần đầu tiên giới thiệu một FF không dùng 2 hoặc 4 transistor rời mà được tích hợp trong một vi mạch đơn tinh thể. Các thế hệ vi mạch đầu tiên chỉ được sản xuất theo công nghệ lưỡng cực, trong trường hợp cần nhiều lớp khuếch tán, nhiều lỗ tiếp xúc và đường dẫn giá thành có thể lên đến 10 - 20 đô la một mạch. Nhờ kỹ thuật MOS mật độ tích hợp được tăng cao hơn hẳn kỹ thuật lưỡng cực. Hướng phát triển tiếp theo sau đó là công nghệ CMOS bao gồm 2 transistor trường bổ túc làm giảm công suất tiêu thụ vì tại cùng một thời điểm luôn có 1 transistor bị khóa. Với yêu cầu ngày càng phức tạp và đa dạng làm cho việc sản xuất vi mạch với số lượng lớn cũng khó khăn, điều này dẫn đến một suy nghĩ mới về một vi mạch có khả năng lập trình, các vi mạch này có cấu tạo giống nhau và chức năng sẽ thay đổi sau khi lập trình bằng phương pháp làm chảy các đường dẫn điện. Không bao lâu vào năm 1974 hãng INTEL đã sản xuất được chip vi xử lý đầu tiên lập trình theo yêu cầu của khách hàng mở đầu cho kỹ nguyên vi xử lý cũng còn được gọi là cuộc cách mạng công nghiệp lần thứ II. 2. Vi điều khiển Một vi xử lý chỉ giao tiếp được với bên ngoài thông qua các khối vào - ra và để lưu trữ dữ liệu lại phải cần đến bộ nhớ. Dữ liệu nhận vào được xử lý bởi chương trình và sau đó kết quả cũng như các tín hiệu điều khiển sẽ được đưa đến khối ra. Đầu tiên ba khối chức năng này được kết hợp với nhau: Đơn vị xử lý trung tâm, khối vào-ra và bộ nhớ để tạo thành micro computer, bus hệ thống có nhiệm vụ kết nối các khối kể trên với nhau. Do yêu cầu giảm nhỏ kích thước và giá thành sản xuất, người ta đã tích hợp các khối chức năng của micro computer trong cùng một linh kiện và được đặt tên là vi điều khiển (microcontroller). 8
  9. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 2.1. Nguyên lý cấu tạo Điểm cần lưu ý về vi điều khiển là sơ đồ khối cấu tạo của nó. Cấu tạo một họ microcontroller chủ yếu dựa trên một kiểu tiêu chuẩn bao gồm các tính năng quan trọng nhất, nhiều chủng loại phù hợp với các lĩnh vực ứng dụng đặc biệt khác nhau, có thể kết hợp thêm thiết bị ngoại vi để tăng khả năng hoặc giảm nhỏ kích thước đến mức tối thiểu trong các ứng dụng chuyên biệt như: Kết nối bus, kết nối video hoặc điều khiển trực tiếp các cơ cấu hiển thị LCD Với kiểu tiêu chuẩn cũng đủ dùng cho hầu hết các ứng dụng. Hình 1.1 Cấu trúc máy tính Hình 1.2 Cấu trúc vi điều khiển 9
  10. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Hình 1.3 Sơ đồ khối vi điều khiển 2.2. Các kiểu cấu trúc bộ nhớ Các bộ vi xử lý và vi điều khiển hiện nay chủ yếu được chế tạo theo 2 kiểu cấu trúc khác nhau: Cấu trúc Von Neumann và Harvard. 2.2.1. Cấu trúc Von Neumann Trong cấu trúc Von Neumann chỉ có một vùng địa chỉ tuyến tính bao gồm tất cả dữ liệu và lệnh điều khiển, độ lớn của vùng địa chỉ phụ thuộc vào chiều dài của bộ đếm chương trình, nếu không trang bị thêm linh kiện phụ thì việc định địa chỉ bộ nhớ chương trình và bộ nhớ dữ liệu không độc lập với nhau. Trong cấu trúc này chỉ tồn tại một bus dữ liệu và một bus địa chỉ để đọc-ghi dữ liệu và đọc lệnh điều khiển chương trình và không có khả năng thực. Trình hiện song song (truy xuất đồng thời bộ nhớ dữ liệu và bộ nhớ chương). Hình 1.4 Cấu trúc Von Neumann 10
  11. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 2.2.2. Cấu trúc Harvard Gồm hai vùng địa chỉ riêng biệt cho bộ nhớ dữ liệu và bộ nhớ chương trình nên có thể truy xuất song song dữ liệu và lệnh điều khiển, cấu trúc này đặc biệt thích hợp với các vi điều khiển 16 và 32 bít vì làm tăng tốc độ làm việc. Nếu chỉ có một hệ thống bus như thường thấy ở vi điều khiển 8 bít thì việc truy xuất bộ nhớ dữ liệu hoặc bộ nhớ chương trình sẽ được thực hiện thông qua các tín hiệu điều khiển, nếu không có yêu cầu ghi vào bộ nhớ chương trình thì cấu trúc này còn cho phép tăng tính an toàn của chương trình. Hình 1.5 Cấu trúc harvard 3. Lĩnh vực ứng dụng Vi điều khiển hiện nay được ứng dụng trong nhiều lĩnh vực như: TV, thiết bị HiFi, máy giặt, điện thoại và trong ô tô góp phần làm đơn giản hóa quá trình xử dụng với nhiều tính năng và độ an toàn cao hơn. Ngoài ra vi điều khiển còn được áp dụng trong lĩnh vực khoa học kỹ thuật như: Các thiết bị phân tích và đo lường trong công nghiệp như các dây chuyền sản xuất tự động, trong lĩnh vực máy công cụ như CNC và điều khiển chất lượng sản phẩm. 4. Hướng phát triển Yêu cầu đặt ra cho vi điều khiển hiện nay là tăng lĩnh vực ứng dụng với tốc độ xử lý ngày càng nhanh và kích thước nhỏ gọn, công suất tiêu thụ thấp. Vấn đề đặt ra là liệu với vi điều khiển 8 bít có còn phù hợp hay không ? hoặc trong tương lai phải thay bằng các vi điều khiển 16/32 bít. Khác với vi xử lý việc phát triển luôn kèm theo việc nâng cao khả năng tính toán bằng cách mở rộng hệ thống bus. Đối với vi điều khiển không nhất thiết phải như thế, một vi điều khiển 8 bít cũng đủ cho rất nhiều ứng dụng và vi điều khiển 16 bít là hoàn toàn quá dư thừa, trong trường hợp cần giảm giá thành, kích thước và công suất tiêu thụ thì vi điều khiển 4 bít là giải pháp tối ưu. Một vài ứng dụng cần vi điều khiển có nhiều khối ngoại vi, có ứng dụng lại cần ngoại vi tốc độ cao, hướng phát triển tương lai là tăng khả năng của CPU và khối ngoại vi. 11
  12. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Một hướng đơn giản là tăng tần số xung đồng hồ để rút ngắn thời gian thực hiện chương trình, giảm thời gian biến đổi A/D và tăng tần số giới hạn của timer. Tuy nhiên các linh kiện bên ngoài cũng phải có khả năng làm việc ở tần số cao, khi tăng tần số đồng cũng làm tăng công suất tiêu thụ của vi điều khiển. Việc tối ưu hóa cấu trúc chương trình và bộ nhớ cũng góp phần nâng cao khả năng hệ thống. Trong các ứng dụng đa nhiệm, phương pháp phân đoạn và phân dãy hóa có một ý nghĩa rất lớn. Với công nghệ sản xuất mới có thể đồng thời tăng tần số làm việc và giảm công suất tiêu thụ và cả điện áp nuôi điều này sẽ mở ra các lĩnh vực ứng dụng mới trong đó mạch điện rất đơn giản và năng lượng tiêu thụ rất thấp, bằng cách thay đổi cú pháp tập lệnh thích hợp cho phép biên dịch dể dàng từ các ngôn ngữ cấp cao như “C” hoặc “C#” sang mã lệnh của vi điều khiển. Hình 1.6 Lĩnh vực ứng dụng Hình 1.7 Hướng phát triển vi điều khiển 12
  13. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bài 2: Cấu trúc họ vi điều khiển 8051 1. Tổng quan MCS-51 là họ vi điều khiển của Intel. Các nhà sản xuất IC khác như Siemens, Advanced Micro Device, Fujitsu và Philips được cấp phép là các nhà cung cấp thứ hai cho các vi mạch họ MCS-51. Vi mạch tổng quát của họ MCS- 51 là chip 8051, linh kiện đầu tiên của họ này được đưa ra thị trường. Chip 8051 có các đặc điểm được tóm tắt như sau: - 4 Kbyte ROM nội - 128 byte RAM nội - 4 port I/O 8 bít - 2 bộ định thời 16 bít (timer) - Cổng giao tiếp nối tiếp - Không gian chương trình ngoài 64 K - Không gian nhớ dữ liệu ngoài 64 K - Có khả năng xử lý bít - 210 địa chỉ bít - Nhân/ chia trong 4 μS Hình 2.1 Sơ đồ khối 8051 Các thành viên khác của họ MCS-51 có dung lượng ROM (EPROM), RAM trên chip khác nhau hoặc có thêm bộ định thời thứ ba (bảng 2.1) 13
  14. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái BẢNG 2.1 Các chip họ MCS-51 Chip ROM nội (Kbyte) RAM nội (byte) Số timer 8031 0 128 2 8051 4 ROM 128 2 8751 4 EPROM 128 2 8032 0 256 3 8052 8 ROM 256 3 8752 8 EPROM 256 3 Thuật ngữ “8051” được dùng để chỉ chung cho các chip họ MCS-51 với các chip cải tiến từ 8051 sẻ được đề cập đến một cách rõ ràng khi cần thiết, cấu trúc cơ bản được trình bày trong sơ đồ khối hình 2.1. Hình 2.2 Sơ đồ chân của 8051 2. Sơ đồ chân Chức năng từng chân của 8051 được mô tả tóm tắt như sau: Như trong hình 2.2 32 trong số 40 chân của 8051 có công dụng xuất/ nhập. Tuy nhiên 24 trong 32 chân này có hai chức năng (26/32 đối với 8032 và 8052). Mỗi một chân ngoài chức năng xuất nhập còn có thể hoạt động như một đường điều khiển, đường dữ liệu hoặc đường địa chỉ 32 chân nói trên hình thành 4 port 8 bít, với các thiết kế yêu cầu tối thiểu các thành phần bên ngoài 14
  15. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái có thể sử dụng các port này làm nhiệm vụ xuất/ nhập 8 đường cho mỗi port có thể được xử lý như một đơn vị giao tiếp với các thiết bị song song như máy in, bộ biến đổi D-A hoặc mỗi đường có thể hoạt động độc lập giao tiếp với một thiết bị đơn bít như chuyển mạch, LED, BJT, FET, cuộn dây, động cơ, loa 2.1. Port 0 Port gồm các chân từ 32 đến 39 đối với 8051 có 2 công dụng. Trong các thiết kế cần tối thiểu hóa thành phần, port 0 được sử dụng làm nhiệm vụ xuất/nhập. Trong các thiết kế lớn hơn có bộ nhớ ngoài, port 0 trở thành bus địa chỉ/dữ liệu đa hợp (byte thấp địa chỉ). 2.2. Port 1 Port 1 chỉ có một công dụng là xuất/nhập (các chân 1 8 trên 8051). Các chân của port 1 được ký hiệu là P1.0, P1.1 P1.7 và được dùng để giao tiếp với thiết bị bên ngoài khi có yêu cầu. Không có chức năng nào khác nữa gán cho các chân của port 1, nghĩa là chúng chỉ được sử dụng để giao tiếp với các thiết bị ngoại vi ngoại lệ với 8032, 8052 có thể dùng P1.0 và P1.1 làm ngõ vào cho mạch định thời thứ ba. 2.3. Port 2 Port 2 gồm các chân từ 21 28 trên 8051 có hai công dụng hoặc làm nhiệm vụ xuất/nhập hoặc là byte địa chỉ cao của bus địa chỉ 16 bít cho các thiết kế có bộ nhớ chương trình ngoài hoặc các thiết kế có nhiều hơn 256 byte bộ nhớ dữ liệu ngoài. 2.4. Port 3 Port 3 gồm các chân từ 10 17 trên 8051 có hai công dụng, ngoài chức năng xuất/nhập các chân của port 3 còn có chức năng riêng như trình bày trong bảng 2.2. Bảng 2.2: Chức năng các chân PORT 3 và PORT 1 Bít Tên Địa chỉ bít Chức năng P3.0 RxD B0H Nhận dữ liệu port nối tiếp P3.1 TxD B1H Phát dữ liệu port nối tiếp P3.2 INT0 B2H Ngõ vào ngắt 0 ngoài P3.3 INT1 B3H Ngõ vào ngắt 1 ngoài P3,4 T0 B4H Ngõ vào timer 0 15
  16. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái P3,5 T1 B5H Ngõ vào timer 1 P3.6 WR B6H Ghi RAM ngoài P3.7 RD B7H Đọc RAM ngoài P1.0 T2 90H Ngõ vào timer 2 P1.1 T2EX 91H Nạp/nhận timer 2 2.5. Chân cho phép bộ nhớ chương trình PSEN 8051 cung cấp 4 tín hiệu điều khiển bus. Tín hiệu cho phép bộ nhớ chương trình PSEN (program store enable) là tín hiệu xuất trên chân 29, đây là tín hiệu điều khiển cho phép truy xuất bộ nhớ chương trình ngoài, chân này thường nối với chân cho phép xuất OE (output enable) của EPROM hoặc ROM để cho phép đọc các byte mã lệnh. Tín hiệu PSEN ở logic 0 trong suốt thời gian tìm nạp lệnh, các mã nhị phân của chương trình được đọc từ EPROM qua bus dử liệu và được chốt vào thanh ghi lệnh IR của 8051 để được giải mã. Khi thực hiện một chương trình chứa trong ROM nội, PSEN được duy trì ở mức logic 1. 2.6. Chân cho phép chốt địa chỉ ALE Đây là tín hiệu ra cho phép chốt địa chỉ ALE (address latch enable) để giãi đa hợp bus địa chỉ/dữ liệu khi port 0 được dùng làm bus đa hợp địa chỉ/dữ liệu, chân ALE xuất tín hiệu để chốt địa chỉ (byte thấp của địa chỉ 16 bít) vào một thanh ghi ngoài trong suốt nửa đầu của chu kỳ bộ nhớ. Sau khi thực hiện xong các chân của port 0 sẽ xuất/nhập dữ liệu hợp lệ trong nửa thứ hai của chu kỳ bộ nhớ. Tín hiệu ALE có tần số bằng 1/6 tần số của mạch dao động bên trong chip 8051 và có thể được dùng làm xung đồng hồ cho phần còn lại của hệ thống. Nếu mạch dao động có tần số 12 MHz thì tần số ALE là 2 MHz. Ngoại lệ duy nhất là trong thời gian thực hiện lệnh MOVX, một xung ALE sẽ bị bỏ qua (hình 2.10). Chân ALE còn được dùng để nhận xung ngõ vào lập trình cho EPROM trên chip. 2.7. Chân truy xuất bộ ROM ngoài EA Đây là ngõ vào (chân 31) có thể được nối với 5V (logic 1) hoặc với GND (logic 0). Nếu chân này nối lên 5V 8051 và 8052 sẽ thực hiện chương trình chứa trong ROM nội (chương trình nhỏ hơn 4K/8K). Nếu chân này nối với GND và chân PSEN cũng ở logic 0 thì chương trình thực hiện được chứa ở ROM ngoài. Đối với 8031/8032 chân EA phải ở logic 0 vì chúng không có bộ nhớ chương trình trên chip. Nếu chân EA ở logic 0 đối với 8051/8052 ROM nội bên trong chip được vô hiệu hóa và chương trình cần thực hiện chứa ở ROM ngoài. Các phiên bản EPROM của 8051 còn xử dụng chân EA làm chân nhận điện áp cấp 16
  17. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái điện 21V (VPP) cho việc lập trình EPROM nội. 2.8. Chân RESET Ngõ vào RST (chân 9) là ngõ vào xóa của 8051 dùng để thiết lập lại trạng thái ban đầu cho hệ thống hay thường gọi là reset hệ thống. Khi ngõ vào này được treo ở logic 1 ít nhất 2 chu kỳ máy, các thanh ghi bên trong của 8051 được nạp các gía trị thích hợp cho việc khởi động lại hệ thống. 2.9. Các chân XTAL1 và XTAL2 Như trên hình 2.2 mạch dao động bên trong chip 8051 được ghép với thạch anh bên ngoài ở hai chân XTAL1 và XTAL2 (chân 18 và 19). Tần số danh định là 12 MHz cho hầu hết các chip của họ MCS-51, trong hình 2.3 cho thấy một nguồn xung clock TTL có thể được nối vào các chân XTAL1 và XTAL2. 8051 XTAL1 Dao động TTL 7404 XTAL2 Hình 2.3. 8051 với mạch dao động bên ngoài 3. Cấu trúc PORT I/O Sơ đồ mạch bên trong các chân của port xuất/nhập được vẽ đơn giản như ở hình 2.4. Việc ghi đến một chân của port sẽ nạp dữ liệu vào bộ chốt của port, ngõ ra Q của bộ chốt điều khiển một transistor trường và transistor này nối đến chân của port. Khả năng fan-out của các port 1, 2 và 3 là 4 tải TTL loại LS còn của port 0 là 8 tải LS. Lưu ý là điện trở kéo lên sẽ không có ở port 0 trừ khi port này làm nhiệm vụ bus đa hợp địa chỉ/dữ liệu vì vậy một điện trở kéo lên bên ngoài phải được cần đến, giá trị điện trở này phụ thuộc vào đặc tính ngõ vào của thành phần ghép nối với chân của port. 17
  18. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bus nội Vcc Đọc chốt Đọc chân Chân port Chốt port Ghi vào chốt Ngõ ra open drain đối với port 0 ở chế độ I/O Hình 2.4 Sơ đồ port I/O Cấu trúc port cho thấy có hai khả năng: Đọc bộ chốt và đọc tại chân của port. Các lệnh yêu cầu thao tác đọc-sửa-ghi VD: CPL P1.5 sẽ đọc bộ chốt để tránh sự hiểu lầm mức điện áp do nguyên nhân dòng tải tăng. Các lệnh nhập một bít của port VD: MOV C,P1.5 sẻ đọc tại chân port. Trong trường hợp này bộ chốt của port phải chứa 1 nếu không FET sẽ được kích bảo hòa và điều này kéo ngõ ra xuống mức thấp. Việc reset hệ thống sẽ set tất cả các bộ chốt port. Do đó các chân port có thể được dùng làm các ngõ nhập mà không cần phải set các bộ chốt. Tuy nhiên, nếu một bộ chốt bị xóa VD: CLR P1.5 thì chân port không thể làm nhiệm vụ tiếp theo là ngõ nhập trừ khi trước đó phải set bộ chốt SETB P1.5 Hình 2.4 không trình bày mạch cho các chức năng khác của các port 0, 2 và 3. Khi các chức năng khác được xử dụng, các mạch kích ngõ ra được chuyển đến một địa chỉ nội (port 2), địa chỉ/dữ liệu (port 0) hoặc tín hiệu điều khiển (port 3) tương ứng. 4. Tổ chức bộ nhớ Hầu hết các bộ vi xử lý đều có không gian nhớ chung cho dữ liệu và chương trình. Điều này cũng hợp lý vì các chương trình thường được lưu trên đĩa và được nạp vào RAM để thực hiện, vậy thì cả hai dữ liệu và chương trình đều lưu trú trên RAM. Các chip vi điều khiển hiếm khi được xử dụng giống như các vi xử lý trong máy tính thay vào đó chúng được dùng làm thành phần trung tâm trong các thiết kế hướng điều khiển. Trong đó bộ nhớ có dung lượng giới hạn không có ổ đĩa và hệ điều hành. Chương trình điều khiển phải thường trú trong ROM. Do lý do trên 8051 có không gian bộ nhớ riêng cho chương trình và dữ liệu. Như đã thấy trong bảng 2.1 cả 2 bộ nhớ chương trình và dữ liệu đều đặt bên trong chip, tuy nhiên có thể mở rộng bộ nhớ chương trình và dữ liệu bằng cách dùng thêm các chip nhớ bên ngoài với dung lượng tối đa là 64K cho bộ nhớ chương trình và 64K cho bộ nhớ dữ liệu. Bộ nhớ nội trong chip bao gồm ROM (chỉ có trong 8051/8052) và RAM. RAM trên chíp bao gồm vùng RAM đa chức năng, vùng RAM địa chỉ bít, các dãy thanh ghi và các thanh ghi chức 18
  19. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái năng đặc biệt SFR (special funtion registers) hai đặc tính đáng lưu ý là: a. Các thanh ghi và các port xuất/nhập được định địa chỉ theo kiểu ánh xạ bộ nhớ và được truy xuất như một vị trí nhớ trong bộ nhớ. b. Vùng ngăn xếp thường trú trong RAM trên chíp thay vì trong RAM ngoài như đối với các bộ vi xử lý. Hình 2.5 tóm tắt các không gian nhớ của chíp 8031 không có ROM nội, không trình bày chi tiết về bộ nhớ dữ liệu trên chíp. Hình 2.6 trình bày chi tiết bộ nhớ dữ liệu trên chip, không gian nhớ nội này được chia thành: Các dãy thanh ghi (00H 1FH) vùng RAM địa chỉ bít (20H 2FH), vùng RAM đa năng (30H 7FH) và các thanh ghi chức năng đặc biệt (80H FFH). Bộ nhớ Bộ nhớ chương trình dữ liêu Cho phép Cho phép FF bởi bởi 00 và RAM nội Bộ nhớ ngoài Hình 2.5 Tổ chức bộ nhớ của 8031 4.1. Vùng RAM đa năng Vùng nhớ Ram đa dụng gồm có 80 byte có địa chỉ từ 30H đến 7FH vùng nhớ này không có gì đặc biệt so với hai vùng nhớ trên. Vùng nhớ bank thanh ghi 32 byte từ 00H đến 1 FH cũng có thể dùng làm vùng nhớ ram đa dụng mặc dù các ô nhớ này có chức năng như đã trình bầy. Mọi địa chỉ vùng Ram đa dụng đều có thể truy xuất tự do dùng kiểu địa chỉ trực tiếp hoặc gián tiếp. Bộ nhớ ngăn xếp của vi điều khiển dùng bộ nhớ Ram nội nên dung lượng của bộ nhớ ngăn xếp nhỏ trong khi đó các bộ vi xử lý dùng bộ nhớ ngoài làm bộ nhớ ngăn xếp nên dung lượng tùy ý mở rộng. Mặc dù hình 2.6 trình bày vùng RAM đa năng có 80 byte đặt ở địa chỉ từ 30H đến 7FH, bên dưới vùng này từ địa chỉ 00H đến 2FH là vùng nhớ có thể 19
  20. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái được xử dụng tương tự (mặc dù vùng này có công dụng khác). Bất kỳ vị trí nhớ nào trong vùng RAM đa năng đều có thể được truy xuất tự do bằng cách xử dụng cách định địa chỉ trực tiếp hoặc gián tiếp. Ví dụ để đọc nội dung tại 5FH của RAM nội vào thanh ghi A có thể dùng lệnh sau MOV A, 5FH Lệnh trên di chuyển một byte dữ liệu bằng cách dùng kiểu định địa chỉ trực tiếp để xác định vị trí nguồn (nghĩa là địa chỉ 5FH). Đích của dữ liệu được xác định rõ ràng trong mã lệnh là thanh ghi A. Vùng RAM đa năng còn có thể được truy xuất bằng cách dùng kiểu định địa chỉ gián tiếp qua các thanh ghi R0, R1. Ví dụ hai lệnh sau thực hiện cùng công việc như ở ví dụ trên. MOV R0,#5FH MOV A,@R0 Lệnh đầu tiên xử dụng kiểu định địa chỉ tức thời di chuyển giá trị 5FH vào thanh ghi R0, lệnh tiếp theo xử dụng cách định địa chỉ gián tiếp di chuyển dữ liệu trỏ bởi R0 vào thanh ghi A 7F FF F0 F7 F6 F5 F4 F3 F2 F1 F0 B E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC D0 D7 D6 D5 D4 D3 D2 - D0 PSW Vùng RAM đa năng 30 B8 - - - BC BB BA B9 B8 IP 2F 7F 7E 7D 7C 7B 7A 79 78 2E 77 76 75 74 73 72 71 70 B0 B7 B6 B5 B4 B3 B2 B1 B0 P3 2D 6F 6E 6D 6C 6B 6A 69 68 2C 67 66 65 64 63 62 61 60 A8 AF - - AC AB AA A9 A8 IE 2B 5F 5E 5D 5C 5B 5A 59 58 2A 57 56 55 54 53 52 51 50 A0 A7 A6 A5 A4 A3 A2 A1 A0 P2 29 4F 4E 4D 4C 4B 4A 49 48 28 47 46 45 44 43 42 41 40 99 Địa chỉ byte SBUF 27 3F 3E 3D 3C 3B 3A 39 38 98 9F 9E 9D 9C 9B 9A 99 98 SCON 20
  21. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 26 37 36 35 34 33 32 31 30 25 2F 2E 2D 2C 2B 2A 29 28 90 97 96 95 94 93 92 91 90 P1 24 27 26 25 24 23 22 21 20 23 1F 1E 1D 1C 1B 1A 19 18 8D Địa chỉ byte TH1 22 17 16 15 14 13 12 11 10 8C Địa chỉ byte TH0 21 0F 0E 0D 0C 0B 0A 09 08 8B Địa chỉ byte TL1 20 07 06 05 04 03 02 01 00 8A Địa chỉ byte TL0 1F 89 Địa chỉ byte TMOD 18 Bank 3 88 8F 8E 8D 8C 8B 8A 89 88 TCON 17 87 Địa chỉ byte PCON 10 Bank 2 0F 83 Địa chỉ byte DPH 08 Bank 1 82 Địa chỉ byte DPL 07 81 Địa chỉ byte SP Bank 0 (mặc định) R0-R7 00 80 87 86 85 84 83 82 81 80 P0 Hình 2.6 Cấu trúc RAM nội của 8051 4.2. Vùng RAM địa chỉ bít 8051 chứa 210 vị trí bít được định địa chỉ trong đó 128 bít chưa trong các byte ở địa chỉ từ 20H đến 2FH (16 byte x 8 bít = 128 bít) và phần còn lại chứa trong các thanh ghi chức năng đặc biệt. Ý tưởng truy xuất các bít riêng rẽ thông qua phần mềm là một đặc trưng mạnh của hầu hết các bộ vi điều khiển. Các bít có thể được set, xóa, AND, OR bằng một lệnh. Hầu hết các bộ vi xử lý yêu cầu một chuỗi lệnh đọc-sửa- ghi để nhận được cùng một kết quả. Ngoài ra, 8051 còn có port xuất/nhập có thể định địa chỉ từng bít, điều này làm đơn giản việc giao tiếp bằng phần mềm với các thiết bị xuất/nhập đơn bít. Như vừa đề cập ở trên, 8051 có 128 vị trí bít được định địa chỉ và có nhiều mục đích ở các byte có địa chỉ từ 20H đến 2FH. Các địa chỉ này được truy xuất như là các byte hay các bít tùy vào lệnh cụ thể. Ví dụ để set bít 67H bằng 1 ta dùng lệnh sau: SETB 67H Theo hình 2.6 cho thấy bít ở địa chỉ 67H là bít có ý nghĩa lớn nhất của byte ở địa chỉ 2CH. Lệnh vừa nêu trên không ảnh hưởng đến các bít khác trong 21
  22. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái byte này. Hầu hết các bộ vi xử lý muốn thực hiện công việc như trên phải dùng các lệnh có dạng tương tự như sau: MOV A, 2CH ; đọc cả byte MOV A, #10000000B ; set bít có ý nghĩa lớn nhất MOV 2CH, A ; ghi trở lại cả byte 128 ô nhớ bit cho phép truy xuất từng bit và cũng có thể truy xuất byte phụ thuộc vào lệnh được dùng là lệnh xử lý bit hay lệnh xử lý byte. Chú ý địa chỉ của ô nhớ byte và bit trùng nhau. Người lập trình dùng vùng nhớ để lưu trữ dữ liệu phục vụ cho việc xử lý dữ liệu byte hoặc bit. Các dữ liệu bit nên lưu vào vùng nhớ này. Chú ý các ô nhớ nào mà chia ra làm 8 và có các con số bên trong là các ô nhớ vừa cho truy xuất cả byte và truy xuất cả bit. Những ô nhớ còn lại không thể truy xuất bit. 4.3. Các dãy thanh ghi 32 vị trí thấp nhất của bộ nhớ nội chứa các dãy thanh ghi. Các lệnh của 8051 hỗ trợ 8 thanh ghi từ R0 đến R7 thuộc dãy 0 (bank 0). Đây là dãy mặc định sau khi reset hệ thống. Các thanh ghi này ở các địa chỉ từ 00H đến 07H. Lệnh sau đây đọc nội dung tại địa chỉ 05H vào thanh ghi A : MOV A, R5 Lệnh này là lệnh 1 byte dùng kiểu định địa chỉ thanh ghi. Dĩ nhiên thao tác tương tự có thể thực hiện vớI một lệnh 2 byte bằng cách dùng kiểu định địa chỉ trực tiếp: MOV A, 05H Các lệnh sử dụng các thanh ghi từ R0 đến R7 là các lệnh ngắn và thực hiện nhanh hơn so với các lệnh tương đương xử dụng cách định địa chỉ trực tiếp. Các giá trị dữ liệu thường được xử dụng nên chứa ở một trong các thanh ghi này. Dãy thanh ghi đang được xử dụng được gọi là dãy thanh ghi tích cực. Dãy thanh ghi tích cực có thể được thay đổi bằng cách thay đổi các bít chọn dãy trong từ trạng thái chương trình PSW. Giả sử rằng dãy thanh ghi 3(bank 3) tích cực, Lệnh sau đây ghi nộI dung thanh ghi A vào vị trí 18H 22
  23. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV R0, A Ý tưởng “các dãy thanh ghi” cho phép chuyển đổi ngữ cảnh nhanh và có hiệu quả ở những nơi mà các phần riêng rẽ của phần mềm sử dụng một tập thanh ghi riêng, độc lập với các phần khác của phần mềm. 5. Các thanh ghi đặc biệt (SFR) Các thanh ghi nộI của hầu hết các bộ vi xử lý đều được truy xuất rỏ ràng bởi một tập lệnh. Việc truy xuất các thanh ghi cũng được xử dụng trên 8051 ví dụ lệnh INC A tăng nộI dung A lên 1. Các thanh ghi nội của 8051 được cấu hình thành một phần của RAM trên chip, do vậy mỗi một thanh ghi cũng có một địa chỉ. Điều này hợp lý vớI 8051 vì chip này có rất nhiều thanh ghi, cũng như các thanh ghi từ R0 đến R7, trong 8051 còn có 21 thanh ghi chức năng đặc biệt (SFR) chiếm phần trên của RAM nộI từ địa chỉ 80H đến FFH (hình 2.6) Lưu ý là không phải tất cả địa chỉ từ 80H đến FFH đều được định nghĩa mà chỉ có 21 địa chỉ được địng nghĩa (26 trên 8032/8052). Thanh ghi A có thể được truy xuất rõ ràng như được minh họa trong các ví dụ ở các phần trên. Hầu hết các thanh ghi chức năng đặc biệt được truy xuất bằng kiểu định địa chỉ trực tiếp. Cần lưu ý trong hình 2.6 là một số thanh ghi chức năng đặc biệt được định địa chỉ từng bít. Ví dụ lệnh sau SETB 0E0H Set bít 0 của thanh ghi A lên 1, các bít khác không thay đổi. Một nhận xét là tại địa chỉ E0H có thể là địa chỉ byte cho cả thanh ghi A và địa chỉ bít của bít có ý nghĩa thấp nhất trong A. Vì lệnh SETB thao tác trên các bít và không thao tác trên các byte nên chỉ có bít được định địa chỉ bị ảnh hưởng. Lưu ý là các bít được định địa chỉ trong một thanh ghi chức năng đặc biệt có 5 bít cao của địa chỉ giống nhau cho tất cả các bít của thanh ghi này. Ví dụ port 1 có địa chỉ byte là 90H (10010000B) và các bít trong port này có các địa chỉ từ 90H đến 97H hay 10010xxxB. Từ trạng thái chương trình PSW (program status word) sẽ được thảo luận chi tiết trong phần sau. Các thanh ghi chức năng đặc biệt khác cũng được giới thiệu vắn tắt. 5.1. Từ trạng thái chương trình PSW Bảng 2.3: Thanh ghi PSW 23
  24. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bít Ký hiệu Mô tả Ghi chú PSW.7 CY D7H Cờ nhớ PSW.6 AC D6H Cờ nhớ phụ PSW.5 F0 D5H Cờ 0 PSW.4 RS1 D4H Chọn dãy thanh ghi (bít 1) PSW.3 RS0 D3H Chọn dãy thanh ghi (bít 0) 00 = bank 0 01 = bank 1 10 = bank2 11 = bank 3 PSW.2 OV D2H Cờ tràn PSW.1 - D1H Dự trử PSW.0 P D0H Cờ chẳn lẻ PSW có địa chỉ là D0H chứa các bít trạng thái có chức năng được tóm tắt trong bảng 2.3 Cờ nhớ Cờ nhớ CY (carrier flag) có hai công dụng: Công dụng truyền thống trong các phép toán số học là là được set bằng 1 nếu có số nhớ từ phép cộng bít 7 hoặc có số mượn mang đến bít 7. Ví dụ nếu thanh ghi A có nội dung là FFH ADD A,#1 Sẽ làm cho A có nội dung là 00H và cờ CY trong PSW được set bằng 1. Cờ nhớ CY còn là một bộ tích lũy logic được dùng như một thanh ghi 1 bít đối với các lệnh logic thao tác trên các bít. VD: Lệnh sau đây sẽ AND bít 25H với cờ CY và đặt kết quả vào cờ CY ANL C, 25H ; AND bít ở địa chỉ 25H với cờ nhớ Cờ nhớ phụ Khi cộng các giá trị BCD, cờ nhớ phụ AC (auxiliary carry flag) được set bằng 1 nếu có 1 số nhớ được tạo ra từ bít 3 chuyển sang bít 4 hoặc nếu kết quả trong decade thấp nằm trong khoảng từ 0AH đến 0FH. Nếu các giá trị được cộng là giá trị BCD, lệnh cộng phải được tiếp theo bởi lệnh DA A (hiệu chỉnh thập phân thanh ghi A) để đưa các kết quả lớn hơn 9 về giá trị đúng. Cờ 0 Đây là cờ có nhiều mục đích dành cho các ứng dụng của người lập trình Các bít chọn dãy thanh ghi 24
  25. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Các bít chọn dãy thanh ghi RS0, RS1 dùng để xác định dãy thanh ghi tích cực. Các bít này được xóa sau khi có thao tác reset hệ thống và đổi mức logic bởi phần mềm khi cần. VD: Ba lệnh sau cho phép dãy thanh ghi 3 (bank 3) tích cực, sau đó di chuyển nội dung của R7 (địa chỉ byte 1FH) vào thanh ghi A. SETB RS1 SETB RS0 MOV A, R7 Khi đoạn chương trình trên được dịch, các địa chỉ bít sẽ thay thế cho các ký hiệu RS0 và RS1, vậy thì lệnh SETB RS1 tương đương với lệnh SETB 0D4H. Cờ tràn Cờ tràn OV (over flag) được set bằng 1 sau phép toán cộng hoặc trừ nếu có xuất hiện một tràn số học. Khi các số có dấu được cộng hoặc được trừ, phần mềm có thể kiểm tra bít tràn OV để xác định xem kết quả có nằm trong phạm vi hợp lệ hay không. Với phép cộng các số không dấu, cờ tràn OV được bỏ qua. Kết quả lớn hơn +128 hoặc nhỏ hơn -127 sẽ set cờ OV bằng 1, ví dụ phép cộng sau đây gây ra một tràn và set cờ OV trong PSW Số hex 0F Số thập phân 15 +7F +127 8E +142 8EH biểu diển số âm -116, như vậy không đúng với kết quả mong muốn là 142 nên cờ OV được set bằng 1. Cờ chẳn lẻ Bít chẵn lẻ P tự động được set bằng 1 hay xóa bằng 0 ở mỗi chu kỳ máy để thiết lập kiểm tra chẵn cho thanh ghi A. Số các bít 1 trong A cộng với bít P luôn luôn là số chẵn. Ví dụ nếu thanh ghi A có nội dung là 10101101B, bít P sẽ là 1 để có số bít 1 là 6. Bít chẵn lẻ được xử dụng nhiều để kết hợp với các chương trình xuất/nhập nối tiếp trước khi truyền dữ liệu hoặc để kiểm tra chẵn lẻ sau khi nhận dữ liệu. 5.2. Thanh ghi B Thanh ghi B ở địa chỉ F0H được dùng chung với thanh ghi A trong các phép toán nhân, chia. Lệnh MUL AB nhân hai số 8 bít không dấu chứa trong A và B và chứa kết quả 16 bít vào cặp thanh ghi B:A (thanh ghi A cất byte thấp và thanh ghi B cất byte cao) Lệnh chia DIV AB chia A cho B, thương số cất trong A và dư số cất 25
  26. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái trong B. Thanh ghi B còn được xử lý như một thanh ghi nháp, các bít được định địa chỉ của thanh ghi B có địa chỉ từ F0H đến F7H. 5.3. Con trỏ stack Con trỏ stack SP (stack pointer) là một thanh ghi 8 bít ở địa chỉ 81H. SP chứa địa chỉ của dữ liệu hiện đang ở đỉnh của stack. Các lệnh liên quan đến stack bao gồm lệnh cất dữ liệu vào stack và lệnh lấy dữ liệu ra khỏi stack. Việc cất vào stack làm tăng SP trước khi ghi dữ liệu và việc lấy dữ liệu ra khỏi stack sẻ giảm SP. Vùng stack của 8051 được giữ trong RAM nội và được giới hạn đến các địa chỉ truy xuất được bởi kiểu định địa chỉ gián tiếp. Vùng RAM nội có 128 byte trên 8031/8051 hoặc 256 byte trên 8032/8052, lệnh sau khởi động SP để bắt đầu stack tại địa chỉ 60H MOV SP,#5FH Vùng stack được giới hạn là 32 byte trên 8031/8051 vì địa chỉ vì địa chỉ cao nhất của RAM trên chíp là 7FH. Giá trị 5FH được dùng ở đây vì SP tăng lên 60H trước khi thực hiện cất vào stack. Nếu không khởi động SP, nội dung mặc định của thanh ghi này là 07H nhằm duy trì sự tương thích với 8048, bộ vi điều khiển đời trước của 8051. Kết quả là thao tác cất vào stack đầu tiên sẽ lưu dữ liệu vào vị trí nhớ có địa chỉ 08H. Như vậy, nếu phần mềm ứng dụng không khởi động SP, dãy thanh ghi 1 và có thể 2 và 3 không còn hợp lệ vì vùng này được sử dụng làm stack. Các lệnh PUSH và POP sẽ cất dữ liệu vào stack và lấy dữ liệu từ stack, các lệnh gọi chương trình con (ACALL, LCALL) và lệnh trở về RET, RETI cũng cất và phục hồi nội dung của bộ đếm chương trình PC (program counter). 5.4. Con trỏ dữ liệu DPTR Con trỏ dữ liệu DPTR (data pointer) được dùng để truy xuất bộ nhớ chương trình ngoài hoặc bộ nhớ dữ liệu ngoài. DPTR là một thanh ghi 16 bít có địa chỉ là 82H (DPL byte thấp) và 83H (DPH byte cao), 3 lệnh sau đây ghi 55H vào RAM ngoài ở địa chỉ 1000H MOV A,#55H MOV DPTR,#1000H MOV @DPTR, A Lệnh đầu tiên xử dụng kiểu định địa chỉ tức thời để nạp hằng dữ liệu 55H vào thanh ghi A, lệnh thứ hai cũng xử dụng kiểu định địa chỉ tức thời, lần này nạp hằng địa chỉ 16 bít 1000H cho con trỏ dữ liệu DPTR. Lệnh thứ ba xử dụng kiểu định địa chỉ gián tiếp di chuyển giá trị 55H chứa trong A đến RAM ngoài tại địa chỉ chứa trong DPTR (1000H). 5.6. Các thanh ghi port Các port xuất/nhập của 8051 bao gồm port 0 tại địa chỉ 80H, port 1 tại 90H, port 2 tại A0H và port 3 tại B0H. Các port 0, 2 và 3 không được dùng để 26
  27. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái xuất nhập nếu dùng thêm bộ nhớ ngoài hoặc nếu có một số đặc tính đặc biệt của 8051 được xử dụng (như là ngắt, cổng nối tiếp )Ngược lại, P1.2 đến P1.7 luôn luôn là các đường xuất/nhập đa mục đích hợp lệ. Tất cả các port đều được định địa chỉ từng bít nhằm cung cấp các khả năng giao tiếp mạnh, ví dụ một động cơ nối qua một cuộn dây và một mạch kích dùng transistor nối đến bít 7 của port 1, động cơ có thể dừng hay chạy chỉ nhờ vào một lệnh đơn của 8051 SETB P1.7 ;Làm động cơ chạy CLR P1.7 ;Sẽ làm dừng động cơ Các lệnh trên xử dụng toán tử . (dot) để định địa chỉ 1 bít trong 1 byte, cho phép định địa chỉ từng bít. Trình dịch hợp ngữ thực hiện việc biến đổi dạng ký hiệu thành địa chỉ thực tế, nghĩa là hai lệnh sau tương đương nhau CLR P1.7 CLR 97H Việc xử dụng các ký hiệu được định nghĩa trước của trình dịch hợp ngữ sẽ được thảo luận chi tiết ở các bài sau Ví dụ sau đây khảo sát việc giao tiếp với một thiết bị có bít trạng thái gọi là BUSY, bít này được set bằng 1 khi thiết bị đang bận và được xóa khi thiết bị đã sẵn sàng. Nếu BUSY được nối với bít 5 của port 1, vòng lặp sau đây được dùng để chờ cho đến khi thiết bị sẵn sàng WAIT: JB P1.5, WAIT Lệnh trên có nghĩa là nếu bít P1.5 được set thì nhảy đến nhản WAIT cũng có nghĩa là nhảy về và kiểm tra lần nữa. 5.7. Các thanh ghi định thời 8051 có hai bộ đếm/định thời (timer/cunter) 16 bít để định các khoảng thời gian hoặc để đếm các sự kiện. Bộ định thời không có địa chỉ 8AH (TL0, byte thấp) và 8CH (TH0, byte cao), bộ định thời 1 có địa chỉ 8BH (TL1, byte thấp) và 8DH (TH1, byte cao). Hoạt động của bộ định thời được được thiết lập bởi thanh ghi chế độ định thời TMOD (timer mode register) ở địa chỉ 89H và thanh ghi điều khiển định thời TCON (timer control register) ở địa chỉ 88H. Chỉ có TCON được định địa chỉ từng bít. 5.8. Các thanh ghi của port nối tiếp Bên trong 8051 có một port nối tiếp để truyền thông với các thiết bị nối tiếp như các thiết bị đầu cuối hoặc modem, hoặc để giao tiếp với các IC khác có mạch giao tiếp nối tiếp (như các thanh ghi dịch). Một thanh ghi được gọi là bộ đệm dữ liệu nối tiếp SBUF (serial data buffer) ở địa chỉ 99H lưu dữ liệu truyền 27
  28. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái đi và dữ liệu nhận về. Việc ghi lên SBUF sẽ nạp dữ liệu để truyền và việc đọc SBUF sẽ lấy dữ liệu đã nhận được. Các chế độ hoạt động khác nhau được lập trình thông qua thanh ghi điều khiển port nối tiếp SCON (serial port control register) ở địa chỉ 98H, thanh ghi này được định địa chỉ từng bít. 5.9. Các thanh ghi ngắt 8051 có một cấu trúc ngắt với hai mức ưu tiên và năm nguyên nhân ngắt, các ngắt bị vô hiệu hóa sau khi reset hệ thống và sau đó được cho phép bằng cách ghi vào thanh ghi cho phép ngắt IE (interupt enable register) ở địa chỉ A8H, mức ưu tiên ngắt được thiết lập qua thanh ghi ưu tiên ngắt IP (interupt priority register) ở địa chỉ B8H, cả hai thanh ghi này đều được định địa chỉ từng bít. 5.10. Thanh ghi điều khiển nguồn Thanh ghi điều khiển nguồn PCON (power control register) có địa chỉ 87H chứa các bít điều khiển được tóm tắt trong bảng 2.4 Bít SMOD tăng gấp đôi tốc độ baud của port nối tiếp khi port này hoạt động ở các chế độ 1, 2 hoặc 3 các bít 4, 5 và 6 của PCON không được định nghĩa, các bít 2 và 3 là các bít cờ đa mục đích dành cho các ứng dụng của người sử dụng. Các bít điều khiển nguồn, nguồn giảm PD và nghỉ IDL, hợp lệ trong tất cả các chip họ MCS-51 nhưng chỉ được hiện thực trong các phiên bản CMOS của MCS-51, PCON không được định địa chỉ bít. Chế độ nguồn giảm Lệnh thiết lập bít PD bằng 1 sẽ là lệnh sau cùng được thực hiện trước khi đi vào chế độ nguồn giảm. Ở chế độ nguồn giảm: 1. Mạch dao động trên chip ngừng hoạt động 2. Mọi chức năng ngừng hoạt động 3. Nội dung của RAM trên chíp được duy trì 4. Các chân port duy trì mức logic của chúng 5. ALE và PSEN được giữ ở mức thấp chỉ ra khỏi chế độ này bằng cách reset hệ thống. Trong suốt thời gian ở chế độ nguồn giảm, VCC có điện áp là 2V, cần phải giữ cho VCC không thấp hơn sau khi đạt được chế độ nguồn giảm và cần phục hồi VCC = 5 V tối thiểu 10 chu kỳ dao động trước khi chân reset đạt mức thấp lần nữa. Bảng 2.4 Thanh ghi PCON Bít Ký hiệu Mô tả 28
  29. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 7 SMOD Bít tăng đôi tốc độ baud ở chế độ 1, 2 và 3 của 6 - port nối tiếp 5 - 4 - 3 Bít cờ đa mục đích 1 Nguồn giảm 2 Bít cờ đa mục đich 2 Chế độ nghỉ, thoát ra bằng 1 ngắt hoặc reset 1 PD IDL 0 Chế độ nghỉ Lệnh thiết lập bít IDL bằng 1 sẽ là lệnh sau cùng được thực hiện trước khi đi vào chế độ nghỉ. Ở chế độ nghỉ tín hiệu clock nội được khóa không cho đến CPU nhưng không khóa đối với các chức năng ngắt, định thời và port nối tiếp. Trạng thái của CPU được duy trì và nội dung của tất cả các thanh ghi cũng được giữ không đổi. Các chân port cũng được duy trì các mức logic của chúng. ALE và PSEN được giữ ở mức cao. Chế độ nghỉ kết thúc bằng cách cho phép ngắt hoặc bằng cách reset hệ thống, cả hai cách vừa nêu trên đều xóa bít IDL. 6. Bộ nhớ ngoài Các bộ vi điều khiển cần có khả năng mở rộng các tài nguyên trên chip (bộ nhớ, I/O ) để tránh hiện tượng cổ chai trong thiết kế. Cấu trúc của MCS-51 cho phép khả năng mở rộng không gian bộ nhớ chương trình đến 64 K và không gian bộ nhớ dữ liệu đến 64 K ROM và RAM ngoài được thêm vào khi cần. Các IC giao tiếp ngoại vi cũng có thể được thêm vào để mở rộng khả năng xuất/nhập. Chúng trở thành một phần của không gian bộ nhớ dữ liệu ngoài bằng cách xử dụng cách định địa chỉ kiểu I/O ánh xạ bộ nhớ. Khi bộ nhớ ngoài được xử dụng, port 0 không làm nhiệm vụ của port xuất/nhập, port này trở thành bus địa chỉ (A0 A7) và bus dữ liệu (D0 D7) đa hợp. Ngõ ra ALE chốt một byte thấp của địa chỉ ở thời điểm bắt đầu một chu kỳ bộ nhớ ngoài. Port 2 thường (nhưng không phải luôn luôn) được dùng làm byte cao của bus địa chỉ. 29
  30. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Chu kỳ bộ nhớ AO – A15 Địa chỉ DO – D7 Dữ liệu a) Không đa hợp (24 chân) Hình 2.7 Bú đa hợp địa chỉ/ dữ liệu Chu kỳ bộ nhớ A8 – A15 Địa chỉ ADO – AD7 Dữ liệu a) Có đa hợp (16 chân) Sắp xếp không đa hợp sử dụng 16 đường địa chỉ và 8 đường dữ liệu tổng cộng 24 đường. Sắp xếp đa hợp kết hợp 8 đường của bus dữ liệu và byte thấp của bus địa chỉ thì chỉ cần 16 đường. Việc tiết kiệm các chân cho phép đóng gói họ MCS-51 trong một vỏ 40 chân. Sắp xếp đa hợp hoạt động như sau: Trong ½ chu kỳ đầu của chu kỳ bộ nhớ, byte thấp của địa chỉ được cung cấp bởi port 0 và được chốt nhờ tín hiệu ALE. Mạch chốt 74373 giữ cho byte thấp của địa chỉ ổn định trong cả chu kỳ bộ nhớ. Trong ½ sau của chu kỳ bộ nhớ, port 0 được xử dụng làm bus dữ liệu và dữ liệu sẽ được đọc hay ghi. 6.1. Truy xuất bộ nhớ chương trình ngoài Bộ nhớ chương trình ngoài là bộ nhớ chỉ đọc, được cho phép bởi tín hiệu PSEN . 30
  31. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 8051 ROM Port 0 DO-D7 AO-A7 ALE Port 2 A8-A15 Hình 2.8 Truy xuất ROM ngoài Khi có một ROM ngoài được sử dụng, cả hai port 0 và port 2 đều không còn là các port xuất/nhập. Kết nối phần cứng với bộ ngoài được trình bày ở hình 2.8 Một chu kỳ máy của 8051 có 12 chu kỳ dao động. Nếu bộ dao động trên chíp có tần số 12 MHz thì một chu kỳ máy dài 1 μS. Trong 1 chu kỳ máy điển hình ALE có hai xung và 2 byte của lệnh được đọc từ bộ nhớ chương trình (nếu lệnh chỉ có 1 byte, byte thứ hai bị loại bỏ). Giản đồ thời gian của chu kỳ máy này được gọi là chu kỳ tìm-nạp lệnh được trình bày ở hình 2.9. Một chu kỳ máy S1 S2 S3 S4 S5 S6 S1 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 OSC ALE Port PCH PCH 2 PCL opcode PCL Byte 2 Hình 2.9 Chu kỳ tìm nạp lệnh ROM ngoài 31
  32. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 6.2. Truy xuất bộ nhớ dữ liệu ngoài Bộ nhớ dữ liệu ngoài là bộ nhớ đọc-ghi được cho phép bởi các tín hiệu RD và WR ở các chân P3.7 và P3.6. Lệnh dùng để truy xuất bộ nhớ dữ liệu ngoài là MOVX, sử dụng hoặc con trỏ dữ liệu 16 bít DPTR hoặc R0, R1 làm thanh ghi chứa địa chỉ. RAM có thể giao tiếp với 8051 theo cùng cách như ROM ngoại trừ đường RD nối với đường cho phép xuất OE của RAM và đường WR nối với đường W của RAM. Các kết nối với bus dữ liệu và bus địa chỉ giống như ROM bằng cách sử dụng port 0 và port 2 như ở phần trên dung lượng của RAM lên đến 64K. Giản đồ thời gian của thao tác đọc dữ liệu ở bộ nhớ dữ liệu ngoài được trình bày ở hình 2.10 cho lệnh MOVX A,@DPTR. Lưu ý là cả hai xung ALE và PSEN được bỏ qua ở nơi mà xung RD cho phép đọc RAM, nếu lệnh MOVX và RAM ngoài không bao giờ được dùng, các xung ALE luôn có tần số bằng 1/6 tần số của mạch dao động. Giản đồ thời gian của chu kỳ ghi (lệnh MOVX @DPTR, A) cũng tương tự ngoại trừ các xung WR ở mức thấp và dữ liệu được xuất ra ở port 0 ( RD vẫn ở mức cao). Một chu kỳ máy Một chu kỳ máy S1 S2 S3 S4 S5 S6 S1 S2 S3 S4 S5 S6 ALE Port PCH DPH 2 Etemal Port PCL opcode DPL 0 Hình 2.10 Giản đồ thời gian lệnh MOVX 32
  33. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 8051 RAM(1 K) Port 0 DO-D7 373 D Q AO-A7 ALE C P2.0 A8 P2.1 A9 Hình 2.11 Giao tiếp với 1 K RAM Port 2 giảm bớt được chức năng làm nhiệm vụ cung cấp byte cao của địa chỉ trong các hệ thống tối thiểu hóa thành phần, hệ thống không dùng bộ nhớ chương trình ngoài và chỉ có một dung lượng nhỏ bộ nhớ dữ liệu ngoài. Các địa chỉ 8 bít có thể truy xuất bộ nhớ dữ liệu ngoài với cấu hình bộ nhớ nhỏ hướng trang. Nếu có nhiều hơn một trang 256 byte RAM, một vài bít từ port 2 hoặc một port khác có thể chọn một trang. VD: Với một RAM 1 KB ( 4 trang 256) có thể được kết nối với 8051 như ở hình 2.11. Các bít 0 và 1 của port 2 phải được khởi động để chọn một trang, sau đó dùng lệnh MOVX để đọc hoặc ghi trên trang này. Giả sử P2.0 = P2.1 = 0, các lệnh sau có thể dùng để đọc nội dung của RAM ngoài tại địa chỉ 0050H vào thanh ghi A MOV R0,#50H MOVX A, @R0 Để đọc ở địa chỉ cuối cùng của RAM là 03FFH thì phải chọn trang 3, nghĩa là phải set các bít P2.0 và P2.1 băng 1 như chuỗi lênh sau SETB P2.0 SETB P2.1 MOV R0,#0FFH MOVX A, @R0 Một đặc trưng của thiết kế này là các bít từ 2 đến 7 của port 2 không còn cần làm bít địa chỉ nữa, các bít còn lại này có thể sử dụng cho mục đích xuất/nhập. 33
  34. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 6.3. Giãi mã địa chỉ D0 – D7 D0 – D7 2764 6264 A0 – A12 A0 – A12 74138 C(13) B(13) A(13) Hình 2.12 Giãi mã địa chỉ Nếu có nhiều ROM hoặc RAM giao tiếp với 8051 thì cần phải giải mã địa chỉ. Việc giải mã này cũng cần cho hầu hết các bộ vi xử lý. Ví dụ: nếu các ROM và RAM 8 KB được sử dụng, địa chỉ phải được giải mã để chọn các IC nhớ này trên các giới hạn 8 K (0000H 1FFFH, 2000H 3FFFH ) Một IC giải mã điển hình là 74138 được dùng với các ngõ ra được nối với các ngõ vào chọn chíp CS của các IC nhớ như mô tả ở hình 2.12 cho một bộ nhớ có nhiều EPROM 2764 và RAM 6264. Cần lưu ý là do các đường cho phép riêng rẽ ( PSEN cho bộ nhớ chương trình, RD và WR cho bộ nhớ dữ liệu) 8051 có thể quản lý không gian nhớ 64 K cho bộ nhớ ROM và 64 K cho bộ nhớ RAM. 6.4. Các không gian nhớ chương trình và dữ liệu gối nhau Vì bộ nhớ chương trình là bộ nhớ chỉ đọc, một tình huống khó xử được phát sinh trong quá trình phát triển phần mềm cho 8051. Làm thế nào phần mềm được viết cho một hệ thống đích để gỡ rối nếu phần mềm chỉ có thể được thực hiện từ không gian bộ nhớ chương trình chỉ đọc. Giải pháp tổng quát là cho các không gian bộ nhớ chương trình và dữ liệu 34
  35. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái ngoài gối lên nhau. Vì PSEN được dùng để đọc bộ nhớ chương trình và RD được dùng để đọc bộ nhớ dữ liệu, một RAM có thể chiếm không gian nhớ chương trình và dữ liệu bằng cách nối chân OE tới ngõ ra cổng AND có các ngõ vào là PSEN và RD .Mạch trình bày ở hình 2.13 cho phép IC RAM được ghi như là bộ nhớ dữ liệu và được đọc như là bộ nhớ chương trình hoặc dữ liệu. Vậy thì một chương trình có thể được nạp vào RAM bằng cách ghi vào RAM như là bộ nhớ dữ liệu và được thực hiện bằng cách truy xuất như là bộ đếm chương trình. RAM 7. Các cải tiến của 8032/8052 Các vi mạch 8032/8052 và các phiên bản CMOS có hai cải tiến so với 8031/8051. Một là có thêm 128 byte RAM trên chip từ địa chỉ 80H đến FFH, điều này không xung đột với các thanh ghi chức năng đặc biệt vì 128 byte RAM thêm vào chỉ có thể truy xuất bằng cách dùng kiểu định địa chỉ gián tiếp, xem lệnh sau MOV A, 0F0H Sẽ di chuyển nội dung của thanh ghi B vào thanh ghi A đối với họ MCS- 51 còn chuỗi lệnh sau MOV R0,#0F0H MOV A, @R0 Ghi vào thanh ghi A nội dung tại địa chỉ 0F0H đối với 8032/8052, tổ chức bộ nhớ nội của 8032/8052 được trình bày ở hình 2.14 35
  36. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 128 byte FFH Định địa chỉ gián tiếp Định địa chỉ trực tiếp cao 80H 7FH 128 byte Định địa chỉ gián tiếp Thanh ghi chức năng Thấp 00H và trực tiếp đặc biệt Hình 2.14 RAM nội của 8032/8052 BẢNG 2.5 Các thanh ghi của timer 2 Thanh ghi Địa chỉ Địa chỉ bít Mô tả T2CON C8H Có Điều khiển RCAP2L CAH Không Nhận byte thấp RCAP2H CBH Không Nhận byte cao TL2 CCH Không Byte thấp timer 2 TH2 CDH không Byte cao timer 2 Cải tiến thứ hai là có thêm bộ định thời 16 bít, bộ timer 2 này được lập trình nhờ vào 5 thanh ghi chức năng đặc biệt trong bảng 2.5. 8. Hoạt động RESET 8051 được reset bằng cách giữ chân RST ở mức cao tối thiểu 2 chu kỳ máy và sau đó chuyển về mức thấp. RST có thể được tác động bằng tay hoặc được tác động khi cấp nguồn bằng cách dùng một mạch RC như trình bày ở hình 2.15. Trạng thái của tất cả các thanh ghi sau khi reset hệ thống được tóm tắt ở bảng 2.6 Quan trọng nhất trong các thanh ghi này có lẽ là thanh ghi PC (bộ đếm chương trình) được nạp 0000H. Khi RST trở lại mức thấp, việc thực hiện chương trình luôn luôn bắt đầu ở vị trí đầu tiên trong bộ nhớ chương trình đó chính là địa chỉ 0000H, nội dung của RAM trên chíp không bị ảnh hưởng bởi reset. 36
  37. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái BẢNG 2.6 Giá trị của các thanh ghi sau khi reset hệ thống Thanh ghi Nội dung Bộ đếm chương 0000H trinh Thanh ghi A 00H Thanh ghi B 00H PSW SP 00H DPTR 07H 0000H FFH Port xxx00000B (8031/8051) 0 3 xx000000B (8032/8052) IP 0xx00000B (8031/8051) IE 0x000000B Thanh ghi định (8032/8052) 00H thời SCON 00H SBUF 00H PCON (HMOS) 0xxxxxxxB PCON (CMOS) 0xxx0000B +5V +5V +5V 100 + + 10F 10F Ω RST RST 8,2KΩ a) Bằng tay b) Khi cấp nguồn Hình 2.15 Sơ đồ mạch RESET 9. Bài tập 1. Viết lệnh set bit có giá trị thấp nhất tại địa chỉ byte 25H ? 2. Viết chuỗi lệnh thực hiện phép OR nội dung tai địa chỉ bít 00H với nội dung tại 01H, kết quả đưa vào địa chỉ bít 02H. 3. Một chương trình con sử dụng các thanh ghi R0 – R7. Chương trình sẽ chuyển sang dãy thanh ghi 3 khi bắt đầu và phục hồi trở lại dãy thanh ghi ban đầu trước khi thoát. Hãy mô tả chương trình con này 4. Vi điều khiển 80C31BH-1 hoạt động với thạch anh 16 MHz. Tần số xung ALE là bao nhiêu nếu không dùng lệnh MOVX ? 5. Địa chỉ của bít giá trị cao nhất tại byte RAM nội 25H trong 8051 là bao nhiêu ? 37
  38. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 6. Viết lệnh set bít cao nhất trong thanh ghi A 7. Cho biết trạng thái của bít P trong thanh ghi PSW sau khi thực hiện lênh sau MOV A,#55H 8. Viết chuỗi lệnh copy nội dung thanh ghi R7 đên địa chỉ 100H trong RAM ngoài? 9. Giả sử lệnh đầu tiên sau khi reset hệ thống là lệnh gọi chương trình con. Hãy cho biết nội dung của PC được lưu vào đâu trước khi chương trình con này được thực hiện ? 10. Trình bày điểm khác nhau giữa chế độ nghỉ với chế độ giảm nguồn ? 11. Viết lệnh thực hiện chế độ giảm nguồn. 12. Trình bày sơ đồ kết nối thêm 2 RAM ngoài mỗi RAM có dung lượng là 32 KB với 8051 38
  39. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bài 3: TẬP LỆNH 8051 1. Mở đầu Các cách định địa chỉ là phần cần thiết cho toàn bộ tập lệnh của mỗi một bộ vi xử lý hay vi điều khiển. Các kiểu định địa chỉ cho phép xác định rõ nguồn và đích của dữ liệu theo nhiều cách khác nhau mà vi xử lý hay vi điều khiển sử dụng trong quá trình thực thi lệnh. Có 8 kiểu định địa chỉ đối với họ MCS-51: - Thanh ghi (register) - Trực tiếp (direct) - Gián tiếp (indirect) - Tức thời (immediate) - Tương đối (relative) - Tuyệt đối (absolute) - Dài (long) - Chỉ số (index) 2. Các cách định địa chỉ 2.1. Định địa chỉ bằng thanh ghi Chế độ đánh địa chỉ bằng thanh ghi liên quan đến việc sử dụng các thanh ghi để dữ liệu cần được thao tác các ví dụ về đánh địa chỉ theo thanh ghi như sau: MOV A, RO : Sao nội dung thanh ghi RO vào thanh ghi A MOV R2, A : Sao nội dung thanh ghi A vào thanh ghi R2 ADD A; R5 : Cộng nội dung thanh ghi R5 vào thanh ghi A ADD A, R7 : Cộng nội dung thanh ghi R7 vào thanh ghi A MOV R6, A : Lưu nội dung thanh ghi A vào thanh ghi R6 Cũng nên lưu ý rằng các thanh ghi nguồn và đích phải phù hợp về kích thước. Hay nói cách khác, nếu viết “ MOV DPTR, A” sẽ cho một lỗi vì nguồn là thanh ghi 8 bit và đích lại là thanh ghi 16 bit. Xét đoạn mã sau: MOV DPTR, #25F5H MOV R7, DPL MOV R6, DPH Để ý rằng ta có thể chuyển dữ liệu giữa thanh ghi tích luỹ A và thanh ghi Rn (n từ 0 đến 7) nhưng việc chuyển dữ liệu giữa các thanh ghi Rn thì không được phép. Ví dụ, lệnh “MOV R4, R7” là không hợp lệ. Trong hai chế độ đánh địa chỉ đầu tiên, các toán hạng có thể hoặc ở bên trong một trong các thanh ghi hoặc được gắn liền với lệnh. Trong hầu hết các 39
  40. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái chương trình dữ liệu cần được xử lý thường ở trong một số ngăn của bộ nhớ RAM hoặc trong không gian mà của ROM. Có rất nhiều cách để truy cập dữ liệu này mà phần tiếp theo sẽ xét đến. 2.2. Định địa chỉ Trực tiếp Như đã nói ở chương 2 trong 8051 có 128 byte bộ nhớ RAM. Bộ nhớ RAM được gán các địa chỉ từ 00 đến FFH và được phân chia như sau 1. Các ngăn nhớ từ 00 đến 1FH được gán cho các băng thanh ghi và ngăn xếp. 2. Các ngăn nhớ từ 20H đến 2FH được dành cho không gian đánh địa chỉ theo bit để lưu các dữ liệu 1 bit. 3. Các ngăn nhớ từ 30H đến 7FH là không gian để lưu dữ liệu có kích thước 1byte. Mặc dù toàn bộ byte của bộ nhớ RAM có thể được truy cập bằng chế độ đánh địa chỉ trực tiếp, nhưng chế độ này thường được sử dụng nhất để truy cập các ngăn nhớ RAM từ 30H đến 7FH. Đây là do một thực tế là các ngăn nhớ dành cho băng ghi được truy cập bằng thanh ghi theo các tên gọi của chúng là R0 - R7 còn các ngăn nhớ khác của RAM thì không có tên như vậy. Trong chế độ đánh địa chỉ trực tiếp thì dữ liệu ở trong một ngăn nhớ RAM mà địa chỉ của nó được biết và địa chỉ này được cho như là một phần của lệnh. Khác với chế độ đánh địa chỉ tức thì mà toán hạng tự nó được cấp với lệnh. Dấu (# 0 là sự phân biệt giữa hai chế độ đánh địa chỉ. Xét các ví dụ dưới đây và lưu ý rằng các lệnh không có dấu (#): MOV R0, 40H ; Lưu nội dung của ngăn nhớ 40H của RAM vào R0 MOV 56H, A ; Lưu nội dung thanh ghi A vào ngăn nhớ 56H của RAM MOV R4, 7FH ; Chuyển nội dung ngăn nhớ 7FH của RAM vào R4 Như đã nói ở trước thì các ngăn nhớ trừ 0 đến 7 của RAM được cấp cho bằng 0 của các thanh ghi R0 - R7. Các thanh ghi này có thể được truy cập theo 2 cách như sau: MOV A, 4 ; Hai lệnh này giống nhau đều sao nội dung thanh ghi R4 vào A MOV A, R4 MOV A, 7 ; Hai lệnh này đều như nhau là sao nội dung R7 vào thanh ghi A MOV A,R7 Để nhấn mạnh sự quan trọng của dấu (#) trong các lệnh của 8051. Xét các mã cho sau đây: 40
  41. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV R2, #05 ; Gán R2=05 MOV A, 2 ; Sao nội dung thanh ghi R2 vào A MOV B, 2 ; Sao nội dung thanh ghi R2 vào B MOC 7,2 ; Sao nội dung thanh ghi R7 vì lệnh “MOV R7, R2” là không hợp lệ. Mặc dù sử dụng các tên R0 - R7 dễ hơn các địa chỉ bộ nhớ của chúng nhưng các ngăn nhớ 30H đến 7FH của RAM không thể được truy cập theo bất kỳ cách nào khác là theo địa chỉ của chúng vì chúng không có tên. 2.3. Định địa chỉ gián tiếp Trong chế độ này, một thanh ghi được sử dụng như một con trỏ đến dữ liệu. Nếu dữ liệu ở bên trong CPU thì chỉ các thanh ghi R0 và R1 được sử dụng cho mục đích này. Hay nói cách khác các thanh ghi R2 - R7 không có thể dùng được để giữ địa chỉ của toán hạng nằm trong RAM khi sử dụng chế độ đánh địa chỉ này khi Ro và R1 được dùng như các con trỏ, nghĩa là khi chúng giữ các địa chỉ của các ngăn nhớ RAM thì trước chúng phải đặt dấu (@) như chỉ ra dưới đây. MOV A, @ R0 ; Chuyển nội dung của ngăn nhớ RAM có địa chỉ trong R0 và A MOV @ R1, B ; Chuyển nội dung của B vào ngăn nhớ RAM có địa chỉ ở R1 Lưu ý rằng R0 cũng như R1 luôn có dấu “@” đứng trước. Khi không có dấu này thì đó là lệnh chuyển nội dung các thanh ghi R0 và R1 chứ không phải dữ liệu ngăn nhớ mà địa chỉ có trong R0 và R1. Ví dụ 3.1: Viết chương trình để sao chép giá trị 55H vào ngăn nhớ RAM tại địa chỉ 40H đến 44H sử dụng: a) Chế độ đánh địa chỉ trực tiếp b) Chế độ đánh địa chỉ gián tiếp thanh ghi không dùng vòng lặp c) Chế độ b có dùng vòng lặp Lời giải: a) MOV A, #55H ; Nạp A giá trị 55H MOV 40H, A ; Sao chép A vào ngăn nhớ RAM 40H MOV 41H, A ; Sao chép A vào ngăn nhớ RAM 41H MOV 42H, A ; Sao chép A vào ngăn nhớ RAM 42H MOV 43H, A ; Sao chép A vào ngăn nhớ RAM 43H 41
  42. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV 44H, A ; Sao chép A vào ngăn nhớ RAM 44H b) MOV A, # 55H ; Nạp vào A giá trị 55H MOV R0, #40H ; Nạp con trỏ R0 = 40 H MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ đến INC R0 ; Tăng con trỏ. Bây gì R0 = 41H MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ INC R0 ; Tăng con trỏ. Bây giờ R0 = 42H MOV @R0,A ; Sao chép Avào vị trí ngăn nhớ RAM do R0 chỉ INC R0 ; Tăng con trỏ. Bây giờ R0 = 43H MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do R0 chỉ MOV @R0, A ;Tăng con trỏ. Bây gờ R0 = 44H MOV @R0, A c) MOV A, # 55H ; Nạp vào A giá trị 55H MOV R0, #40H ; Nạp con trỏ địa chỉ ngăn nhớ RAM R0 = 40H MOV R2, #05 ; Nạp bộ đếm R2 = 5 AGAIN:MOV @R0, A ; Sao chép A vào vị trí ngăn nhớ RAM do Ro chi đến INC ; Tăng con trỏ Ro DJNZ R2, AGAIN ; Lặp lại cho đến khi bộ đếm = 0. 2.4. Định địa chỉ tức thời Các dữ liệu tức thời được dùng trực tiếp trong lệnh có thể là một hằng số, một ký số, một biểu thức toán học Trình dịch hợp ngữ sẽ tự động tính toán và thay thế dữ liệu tức thời vào mã lệnh. - Quy ước: dùng dấu # trước các toán hạng tức thời. Ví dụ: MOV A,#7 ; nạp giá trị 7 vào thanh ghi A, (A) = 7H 42
  43. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV A,#7+8 ; nạp giá trị 15 vào thanh ghi A, (A) = 0FH MOV A,#‘B’ ; nạp giá trị 66 (mã ASCII của ký tự B) vào thanh ghi A, (A) = 42H 2.5. Định địa chỉ tương đối Được dùng trong các lệnh nhảy ngắn. Một địa chỉ tương đối (hay còn gọi là offset) là một giá trị 8 bit có dấu (từ –128 đến +127) cho biết độ lệch từ vị trí lệnh theo ngay sau lệnh nhảy đến đích. Giá trị này được cộng thêm vào thanh ghi bộ đếm chương trình (PC) để tạo ra địa chỉ của lệnh tiếp theo cần được thực thi. Ví dụ: Tính offset cho kiểu định địa chỉ tương đối trong hai trường hợp nhảy tới và nhảy lùi. Thông thường các đích nhảy được xác định bằng các nhãn và trình dịch hợp ngữ sẽ xác định offset tương đối tương ứng. Ví dụ: Nếu nhãn THERE được đặt ở địa chỉ 1040H và lệnh: SJMP THERE Ở trong bộ nhớ chương trình tại địa chỉ 1000H và 1001H ? địa chỉ của lệnh kế tiếp sẽ là 1000H + 02H = 1002H, nên offset tương đối sẽ là: offset = 1040H – 1002H = 3EH. Trình dịch hợp ngữ sẽ gán offset tương đối là 3EH cho byte 2 của lệnh SJMP THERE. 43
  44. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái - Có ưu điểm là không phụ thuộc vào vị trí nhưng bị giới hạn về tầm nhảy. 2.6. Định địa chỉ tuyệt đối Chỉ dùng trong các lệnh AJMP và ACALL. - Cho phép rẽ nhánh chương trình trong trang 2K hiện hành của bộ nhớ chương trình (tức tầm nhảy của lệnh là trong trang 2K hiện hành của bộ nhớ chương trình). - 11 bit thấp của địa chỉ đích, trong đó 3 bit cao (A8 ÷ A10) được đưa vào cùng với opcode tạo thành byte thứ 1 của lệnh và 8 bit thấp (A0 ÷ A7) tạo thành byte thứ 2 của lệnh. 5 bit cao của địa chỉ đích là 5 bit cao hiện hành của bộ đếm chương trình (PC) ? lệnh theo ngay sau lệnh rẽ nhánh và đích đến phải ở trong cùng 1 trang 2K. - Kiểu định địa chỉ này có tầm nhảy bị hạn chế và cung cấp mã phụ thuộc vị trí. Ví dụ: Nếu nhãn THERE đặt tại địa chỉ 0F46H và lệnh: AJMP THERE ở trong bộ nhớ tại địa chỉ 0900H và 0901H ? lệnh theo ngay sau lệnh nhảy bắt đầu ở địa chỉ 0902H sẽ có 5 bit cao địa chỉ trùng với địa chỉ nhãn THERE là 00001. Mã hoá lệnh: 44
  45. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 2.7. Định địa chỉ dài Chỉ dùng trong các lệnh LCALL và LJMP. - Đây là các lệnh rẽ nhánh 3 byte, với 2 byte sau (byte 2 và byte 3) là địa chỉ đích của lệnh (16 bit). - Ưu điểm là có thể sử dụng toàn bộ vùng nhớ chương trình 64K, nhưng lệnh lại dài đến 3 byte và phụ thuộc vào vị trí. 2.8. Định địa chỉ theo chỉ số Chế độ đánh địa chỉ theo chỉ số được sử dụng rộng rãi trongviệc truy cập các phân tử dữ liệu của bảng trong không gian ROM chương trình của 8051. Lệnh được dùng cho mục đích này là “Move A, @ A + DPTR”. Thanh ghi 16 bit DPTR là thanh ghi A được dùng để tạo ra địa chỉ của phân tử dữ liệu được lưu cất trong ROM trên chíp. Do các phân tử dữ liệu được cất trong không gian mã (chương trình) của ROM trên chip của 8051, nó phải dùng lệnh Move thay cho lệnh MOV (chủ C ở cuối lệnh là chỉ mà lệnh Code). Trong lệnh này thì nội dung của A được bổ xung vào thanh ghi 16 bit DPTR để tạo ra địa chỉ 16 bit của dữ liệu cần thiết. Ví dụ 3.2: Giả sử từ “VSA” được lưu trong ROM có đĩa chỉ bắt đầu từ 200H và chương trình được ghi vào ROM bắt đầu từ địa chỉ 0. Hãy phân tích cách chương trình hoạt động và hãy phát biểu xem từ “VSA” sau chương trình này được cất vào đâu? Lời giải: ORG 0000H ; Bắt đầu đốt ROM tại địa chỉ 00H MOV DPTR, #200H ; Địa chỉ bẳng trình bày DPTR = 200H CLA A ; Xoá thanh ghi A (A = 0) MOVC A, @A + DPTR ; Lấy ký tự từ không gian nhớ chương trình MOV R0, A ; Cất nó vào trong R0 INC DPTR ; DPTR = 201, chỉ đến ký tự kế tiếp CLR A ; Xoá thanh ghi A MOVC A, @A + DPTR ; Lấy ký tự kế tiếp MOV R1, A ; Cất nó vào trong R1 INC DPTR ; DPTR = 202 con trỏ chỉ đến ký tự 45
  46. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái sau đó CLA A ; Xoá thanh ghi A MOVC A, @A + DPTR ; Nhận ký tự kế tiếp MOV R2, A ; Cắt nó vào R2 HERE: SJMP HERE ; Dừng lại ở đây. ; Dữ liệu được đốt trong không gian mã lệnh tại địa chỉ 200H ORG 200H MYDATA: DB “VSA” END ; Kết thúc chương trình Ở trong chương trình nói trên thì các vị trí ngăn nhớ ROM chương trình 200H - 2002H có các nội dung sau: 200 = (‘U’); 201= (‘S’) và 202 = (‘A’). Chúng ta bắt đầu với DPTR = 200H và A = 0.Lệnh “MOVC A, @ A + DPTR chuyền nội dung của vị trí nhớ 200H trong ROM (200H + 0 = 200H) vào A. Thanh ghi A chứa giá trị 55H là giá trị mà ASC của ký tự “U”. ký tự này được cất vào R0. Kế đó, DPTR được tăng lên tạo thành DPTR = 201H. A lại được xoá về 0 để lấy nội dung của vị trí nhớ kế tiếp trong ROM là 201H chưa ký tự “S”. Sau khi chương trình này chạy ta có R0 = 55H, R1 = 53H và R2 = 41H là các mã ASCII của các ký tự “U”, “S” và “A”. Ví dụ 3.3: Giả sử không gian ROM bắt đầu từ địa chỉ 250H có chứa “America”, hãy viết chương trình để truyền các byte vào các vị trí ngăn nhớ RAM bắt đầu từ địa chỉ 40H. Lời giải (a) Phương pháp này sử dụng một bộ đếm ORG 000 MOV DPTR, # MYDATA ; Nạp con trỏ ROM MOV R0, #40H ; Nạp con trỏ RAM MOV R2, #7 ; Nạp bộ đếm BACK: CLR A ; Xoá thanh ghi A MOVC A, @A + DPTR ;Chuyển dữ liệu từ khong gian mã MOV R0, A ;Cất nó vào ngăn nhớ RAM INC DPTR ; Tăng con trỏ ROM 46
  47. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái INC R0 ; Tăng con trỏ RAM DJNZ R2, BACK ; Lặp lại cho đếnkhi bộ đếm = 0 HERE: SJMP HERE ; không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H MYDATA: DB “AMER1CA” END (b) phương pháp này sử dụng ký tự null để kết thúc chuỗi ORG 000 MOV DPTR, #MYDATA ; Nạp con trỏ ROM MOV R0, #40 ; Nạp con trỏ RAM BACK: CLR A S ; Xoá thanh ghi A(A=0) MOVC A, @A + DPTR ; Chuyển dữ liệu từ không gian mã JZ HERE ; Thoát ra nếu có ký tự Null MOV DPTR, #MYDATA ; Cất nó vào ngădn nhớ của RAM INC @R0, A ; Tăng con trỏ ROM INC R0 ; Tăng con trỏ RAM SJM BACK ; Lặp lại HERE: SJMP HERE ; không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H MYADTA: DB “AMER1CA”, 0 ; Ký tự Null để kết thúc chuỗi END Lưu ý đến cách ta sử dụng lệnh JZ để phát hiện ký tự NOLL khi kết thúc chuỗi. 3. Các nhóm lệnh 3.1. Nhóm lệnh số học 3.1.1. Phép cộng các số không dấu. Trong 8051 để cộng các số với nhau thì thanh ghi tổng (A) phải được dùng đến. Dạng lệnh ADD là: ADD A, nguồn; A = A + nguồn Lệnh ADD được dùng để cộng hai toán hạng. Toán hạng đích luôn là thanh ghi A trong khi đó toán hạng nguồn có thể là một thanh ghi dữ liệu trực tiếp hoặc là ở trong bộ nhớ. Hãy nhớ rằng các phép toán số học từ bộ nhớ đến 47
  48. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái bộ nhớ không bao giờ được phép trong hợp ngữ. Lệnh này có thể thay đổi một trong các bit AF, CF hoặc PF của thanh ghi cờ phụ thuộc vào các toán hạng liên quan. Tác động của lệnh ADD lên cờ tràn sẽ được trình bày ở phần sau. Ví dụ 3.4: Hãy biểu diễn xem cá lệnh dưới đây tác động đến thanh ghi cờ như thế nào? MOV A, # 0F5H ; A = F5H ADD A, # 0BH ; A = F5 + 0B = 00 Lời giải: F5H 1111 0101 + 0BH + 0000 1011 100h 0000 0000 Sau phép cộng, thanh ghi A (đích) chứa 00 và các cờ sẽ như sau: CY = 1 vì có phép nhớ từ D7 PF = 1 vì số các số 1 là 0 (một số chẵn) cờ PF được đặt lên 1. AC = 1 vì có phép nhớ từ D3 sang D4 a) Phép cộng các byte riêng rẽ. Để tính tổng số của một số bất kỳ các toán hạng thì cờ nhớ phải được kiểm tra sau mỗi lần cộng một toán hạng. Ví dụ 3.5 dùng R7 để tích luỹ số lần nhớ mỗi khi các toán hạng được cộng vào A. Ví dụ 3.5: Giả sử các ngăn nhớ 40 - 44 của RAM có giá trị sau: 40 = (7D); 41 = (EB); 42 = (C5); 43 = (5B) và 44 = (30). Hãy viết một chương trình tính tổng của các giá trị trên. Cuối chương trình giá trị thanh ghi A chứa byte thấp và R7 chứa byte cao (các giá trị trên được cho ở dạng Hex). Lời giải: MOV R0, #40H ; Nạp con trỏ MOV R2, #5 ; Nạp bộ đệm CLR A ; Xoá thanh ghi A MOV R7, A ; Xoá thanh ghi R7 AGAIN:ADD A, @R0 ; Cộng byte con trỏ chỉ đến theo R0 JNC NEXT ; Nếu CY = 0 không tích luỹ cờ nhớ INC R7 ; Bám theo số lần nhớ NEXT: INC R0 ; Tăng con trỏ 48
  49. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái DJNZ R2, AGAIN ; Lặp lại cho đến khi R0 = 0 Phân tích ví dụ 3.5: Ba lần lặp lại của vòng lặp được chỉ ra dưới đây. Phần dò theo chương trình dành cho người đọc tự thực hiện. Trong lần lặp lại đầu tiên của vòng lặp thì 7DH được cộng vào A với CY = 0 và R7 = 00 và bộ đếm R2 = 04. Trong lần lặp lại thứ hai của vòng lặp thì EBH được cộng vào A và kết quả trong A là 68H với CY = 1. Vì cờ nhớ xuất hiện, R7 được tăng lên. Lúc này bộ đếm R2 = 03. Trong lần lặp lại thứ ba thì C5H được cộng vào A nên A = 2DH và cờ nhớ lại bận. Do vậy R7 lại được tăng lên và bộ đệm R2 = 02. ở phần cuối khi vòng lặp kết thúc, tổng số được giữ bởi thanh ghi A và R7, trong đó A giữ byte thấp và R7 chứa byte cao. b) Phép cộng có nhớ và phép cộng các số 16 bit. Khi cộng hai toán hạng dữ liệu 16 bit thì ta cần phải quan tâm đến phép truyền của cờ nhớ từ byte thấp đến byte cao. Lệnh ADDC (cộng có nhớ) được sử dụng trong những trường hợp như vậy. Ví dụ, xét phép cộng hai số sau: 3CE7H + 3B8DH. 3C E7 + 3B 8D 78 74 79 74 Khi byte thứ nhất được cộng (E7 + 8D = 74, CY = 1). Cờ nhớ được truyền lên byte cao tạo ra kết quả 3C + 3B + 1 = 78. Dưới đây là chương trình thực hiện các bước trên trong 8051. Ví dụ 3.6: Hãy viết chương trình cộng hai số 16 bit. Các số đó là 3CE7H và 3B8DH. Cất tổng số vào R7và R6 trong đó R6 chứa byte thấp. Lời giải: CLR ; Xoá cờ CY = 0 MOV A, #0E7H ; Nạp byte thấp vào A A = E7H ADD A, #8DH ; Cộng byte thấp vàoA A = 74H và CY=1 MOV R6, A ; Lưu byte thấp của tổng vào R6 MOV A, #3CH ; Nạp byte cao vào A đ A = 3CH ADDC A, #3BG ; Cộng byte cao có nhớ vào A đ A = 78H MOV R7, A ; Lưu byte cao của tổng vào R7 c) Hệ thống số BCD (số thập phân mã hoá theo nhị phân). Số BCD là số thập phân được mã hoá theo nhị phân 9 mà không dùng số thập phân hay số thập lục (Hex). Biểu diễn nhị phân của các số từ 0 đến 9 49
  50. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái được gọi là BCD (xem hình 3.1). Trong tài liệu máy tính ta thường gặp hai khái niệm đối với các số BCD là: BCD được đóng gói và BCD không đóng gói. Digit BCD Digit BCD 0 0000 5 0101 1 0001 6 0110 2 0010 7 0111 3 0011 8 1000 4 0100 9 1001 Hình 3.1: Mã BCD - BCD không đóng gói. Trong số BCD không đóng gói thì 4 bít thấp của số biểu diễn số BCD còn 4 bit còn lại là số 9. Ví dụ “00001001” và “0000 0101” là những số BCD không đóng gói của số 9 và số 5. Số BCD không đóng gói đòi hỏi một byte bộ nhớ hay một thanh ghi 8 bit để chứa nó. - BCD đóng gói. Trong số BCD đóng gói thì một byte có 2 số BCD trong nó một trong 4 bit thấp và một trong 4 bit cao. Ví dụ “0101 1001” là số BCD đóng gói cho 59H. Chỉ mất 1 byte bộ nhớ để lưu các toán hạng BCD. Đây là lý do để dùng số BCD đóng gói vì nó hiệu quả gấp đôi trong lưu giữ liệu. Có một vấn để khi cộng các số BCD mà cần phải được khắc phục. Vấn đề đó là sau khi cộng các số BCD đóng gói thì kết quả không còn là số BCD. Ví dụ: MOV A, #17H ADD A, #28H Cộng hai số này cho kết quả là 0011 1111B (3FH) không còn là số BCD! Một số BCD chỉ nằm trong giải 0000 đến 1001 (từ số 0 đến số 9). Hay nói cách khác phép cộng hai số BCD phải cho kết quả là số BCD. Kết quả trên đáng lẽ phải là 17 + 28 = 45 (0100 0101). Để giải quyết vấn đề này lập trình viên phải cộng 6 (0110) vào số thấp 3F + 06 = 45H. Vấn đề tương tự cũng có thể xảy ra trong số cao (ví dụ khi cộng hai số 52H + 87H = D94). Để giải quyết vấn đề này ta lại phải cộng 6 vào số cao (D9H + 60H = 139). Vấn đề này phổ biến đến mức mọi bộ xử lý như 8051 đều có một lệnh để sử lý vấn đề này. Trong 8051 đó là lệnh “DA A” để giải quyết vấn đề cộng các số BCD. d) Lệnh DA. Lệnh DA (Decimal Adjust for addition điều chỉnh thập phân đối với phép cộng) trong 8051 để dùng hiệu chỉnh sự sai lệch đã nói trên đây liên quan đến phép cộng các số BCD. Lệnh giả “DA”. Lệnh DA sẽ cộng 6 vào 4 bit thấp hoặc 4 bit cao nếu cần. Còn bình thường nó đê nguyên kết quả tìm được. Ví dụ sau sẽ làm rõ các điểm này. 50
  51. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Ví dụ 3.7: MOV A, #47H ; A = 47H là toán hạng BCD đầu tiên MOV B, #25H ; B = 25H là toán hạng BCD thứ hai ADD A, B ; Cộng các số hex (nhị phân) A = 6CH DA A ; Điều chỉnh cho phép cộng BCD (A = 72H) Sau khi chương trình được thực hiện thanh ghi A sẽ chứa 72h (47 + 25 = 72). Lệnh “DA” chỉ làm việc với thanh ghi A. Hay nói cách khác trong thanh ghi nguồn có thể là một toán hạng của chế độ đánh địa chỉ bất kỳ thì đích phải là thanh ghi A để DA có thể làm việc được. Cũng cần phải nhấn mạnh rằng lệnh DA phải được sử dụng sau phép cộng các toán hạng BCD và các toán hạng BCD không bao giờ có thể có số lớn hơn 9. Nói cách khác là không cho phép có các số A - F. Điều quan trọng cũng phải lưu ý là DA chỉ làm việc sau phép cộng ADD, nó sẽ không bao giờ làm việc theo lệnh tăng INC. Tóm tắt về hoạt động của lệnh DA. Hoạt động sau lệnh ADD hoặc ADDC. + Nếu 4 bi t thấp lớn hơn 9 hoặc nếu AC = 1 thì nó cộng 0110 vào 4 bít thấp. + Nếu 4 bit cao lớn hơn 9 hoặc cờ CY = 1 thì nó cộng 0110 vào 4 bit cao. Trong thực tế thì cờ AC chỉ để dùng phục vụ cho phép cộng các số BCD và hiệu chỉnh nó. Ví dụ, cộng 29H và 18H sẽ có kết quả là 41H sai với thực tế khi đó các số BCD và để sửa lại thì lệnh DA sẽ cộng 6 vào 4 bit thấp để có kết quả là đúng (vì AC = 1) ở dạng BCD. 29H 0010 1001 + 18H + 0001 1000 41H 0100 0001 AC=1 + 6H + 0110 47H 0100 0111 Ví dụ 3.8: Giả sử 5 dữ liệu BCD được lưu trong RAM tại địa chỉ bắt đầu từ 40H như sau: 40 = (71), 41 = (11), 42 = (65), 43 = (59) và 44 = (37). Hãy viết chương trình tính tổng của tất cả 5 số trên và kết quả phải là dạng BCD. Lời giải: MOV R0, #40H ; Nạp con trỏ MOV R2, #5 ; Nạp bộ đếm CLR A ; Xoá thanh ghi A 51
  52. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV R7, A ; Xoá thanhg ghi R7 AGAIN: ADD A, @R0 ; Cộng byte con trỏ chỉ bởi R0 DA A ; Điều chỉnh về dạng BCD đúng JNC NEXT ; Nếu CY = 0 không tích luỹ cờ nhớ JNC R7 ; Tăng R7 bám theo số lần nhớ NEXT: INC R0 ; Tăng R0 dịch con trỏ lên ô nhớ kế tiếp DJNZ R2, AGAIN ; Lặp lại cho đến khi R2 = 0 3.1.2. Phép trừ các số không dấu. Cú pháp: SUBB A, nguồn ; A = A - nguồn - CY. Trong rất nhiều các bộ xử lý có hai lệnh khác nhau cho phép trừ đó là SUB và SUBB (trừ có mượn - Sub, tract with Borrow). Trong 8051 ta chỉ có một lệnh SUBB duy nhất. Để thực hiện SUB từ SUB do vậy có hai trường hợp cho lệnh SUBB là: với CY = 0 và với CY = 1. Lưu ý rằng ở đây ta dùng cờ CY để mượn. a) Lệnh SUBB với CY = 0. Trong phép trừ thì các bộ vi xử lý 8051 (thực tế là tất cả mọi CPU hiện đại) đều sử dụng phương pháp bù 2. Mặc dù mỗi CPU đều có mạch cộng, nó có thể quá cồng kềnh (và cần nhiều bóng bán dẫn) để thiết kế mạch trừ riêng biệt. Vì ly do đó mà 8051 sử dụng mạch cộng để thực hiện lệnh trừ. Giả sử 8051 sử dụng mạch cộng để thực hiện lệnh trừ và rằng CY - 0 trước khi thực hiện lệnh thì ta có thể tóm tắt các bước mà phần cứng CPU thực hiện lệnh SUBB đối với các số không dấu như sau: 1. Thực hiện lấy bù 2 của số trừ (toán hạng nguồn) 2. Cộng nó vào số bị trừ (A) 3. Đảo nhớ Đây là 3 bước thực hiện bởi phần cứng bên trong của CPU 8051 đối với mỗi lệnh trừ SUBB bất kể đến nguồn của các toán hạng được cấp có được hỗ trợ chế độ đánh địa chỉ hay không? Sau ba bước này thì kết quả có được và các cờ được bật. Ví dụ sau hoạ 3 bước trên đây: Ví dụ 3.9: Trình bày các bước liên quan dưới đây: CLR C ; Tạo CY = 0 MOV A, #3FH ; Nạp 3FH vào A (A = 3FH) MOV R3, #23H ; Nạp 23H vào R3 (R3 = 23H) SUBB A, R3 ; Trừ A cho R3 đặt kết quả vào A Lời giải 52
  53. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái A = 3F 0011 1111 0011 1111 - R3= 23 0010 0011 + 1101 1101 bù 2 của R3 (bước 1) 1C 1 0001 1100 - 1C (bước 2) 0 CF=0 (bước 3) Các cờ sẽ được thiết lập như sau: CY = 0, AC = 0 và lập trình viên phải được nhìn đến cờ nhớ để xác định xem kết quả là âm hay dương. Nếu sau khi thực hiện SUBB mà CY = 0 thì kết quả là dương. Nếu CY = 1 thì kết quả âm và đích có giá trị bù 2 của kết quả. Thông thường kết quả được để ở dạng bù 2 nhưng các lệnh bù CPL và tăng INC có thể được sử dụng để thay đổi nó. Lệnh CPL thực hiện bù 1 của toán hạng sau đó toán hạng được tăng lên 1 (INC) để trở thành dạng bù 2. b) Lệnh SUBB khi CY = 1. Lệnh này được dùng đối với các số nhiều byte và sẽ theo dõi việc mượn của toán hạng thấp. Nếu CY = 1 trước khi xem thực hiện SUBB thì nó cũng trừ 1 từ kết quả. Ví dụ 3.10: Phân tích chương trình sau: CLR C ; CY = 0 MOV A, #62 ; A = 62H SUBB A, #96H ; 62H - 96H = CCH with CY = 1 MOV R7, A ; Save the result MOV A, #27H ; A = 27H SUBB A, #12H ; 27H - 12H - 1 = 14H MOV R6, A ; Save the result Lời giải: Sau khi SUBB thì A = 62H - 96H = CCH và cờ nhớ được lập báo rằng có mượn. Vì CY = 1 nên khi SUBB được thực hiện lần thứ 2 thì a = 27H - 12H - 1 = 14H. Do vậy, ta có 2762H - 1296H = 14CCH. 3.1.3. Nhân và chia các số không dấu. Khi nhân và chia hai số trong 8051 cần phải sử dụng hai thanh ghi A và B vì các lệnh nhân và chia chỉ hoạt động với những thanh ghi này. a) Nhân hai số không dấu. Bộ vi điều khiển chỉ hỗ trợ phép nhân byte với byte. Các byte được giả thiết là dữ liệu không dấu. Cấu trúc lệnh như sau: MOV AB ; Là phép nhân A * B và kết quả 16 bit được đặt trong 53
  54. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái A và B. Khi nhận byte với byte thì một trong các toán hạng phải trong thanh ghi A và toán hạng thứ hai phải ở trong thanh ghi B. Sau khi nhân kết quả ở trong các thanh ghi A và B. Phần tiếp thấp ở trong A, còn phần cao ở trong B. Ví dụ dưới đây trình bày phép nhân 25H với 65H. Kết quả là dữ liệu 16 bit được đặt trong A và B. MOV A, #25H ; Nạp vào A giá trị 25H MOV B, 65H ; Nạp vào B giá trị 65H MUL AB ; 25H*65H = E99 với B = 0EH và A = 99H Bảng 3.1: Tóm tắt phép nhân hai số không dấu (MULAB) Nhân Toán hạng 1 Toán hạng 2 Kết quả Byte*Byte A B A = byte thấp, B = byte cao b) Chia hai số không dấu. 8051 cùng chỉ hỗ trợ phép chia hai số không dấu byte cho byte với cú pháp: DIV AB ; Chia A cho B Khi chia một byte cho một byte thì tử số (số bị chia) phải ở trong thanh ghi A và mẫu số (số chia) phải ở trong thanh ghi B. Sau khi lệnh chia DIV được thực hiện thì thương số được đặt trong A, còn số dư được đặt trong B. Xét ví dụ dưới đây: MOV A, #95 ; Nạp số bị chia vào A = 95 MOV B, #10 ; Nạp số chia vào B = 10 DIV AB ; A = 09 (thương số); B = 05 (số dư) Lưu ý các điểm sau khi thực hiện “DIV AB” Lệnh này luôn bắt CY = 0 và OV = 0 nếu tử số không phải là số 0 Nếu tử số là số 0 (B = 0) thì OV =1 báo lỗi và CY = 0. Thực tế chuẩn trong tất cả mọi bộ vi xử lý khi chia một số cho 0 là bằng cách nào đó báo có kết quả không xác định. Trong 8051 thì cờ OV được thiết lập lên 1. Bảng 3.2: Tóm tắt phép chia không dấu (DIV AB). Phép chia Tử số Mẫu số Thương số Số dư Byte cho Byte A B A B c) Một ứng dụng cho các lệnh chia. 54
  55. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Có những thời điểm khi một bộ ADC được nối tới một cổng và ADC biểu diễn một số dư nhiệt độ hay áp suất. Bộ ADC cấp dữ liệu 8 bit ở dạng Hex trong dải 00 - FFH. Dữ liệu Hex này phải được chuyển đổi về dạng thập phân. Chúng ta thực hiện chia lặp nhiều lần cho 10 và lưu số dư vào như ở ví dụ sau. Ví dụ 3.11: a. Viết một chương trình để nhận dữ liệu dạng Hex trong phạm vi 00 - FFH từ cổng 1 và chuyển đổi nó về dạng thập phân. Lưu các số vào trong các thanh ghi R7, R6 và R5 trong đó số có nghĩa nhỏ nhất được cất trong R7. b. Phân tích chương trình với giả thiết P1 có giá trị FDH cho dữ liệu. Lời giải: a. Chương trình MOV A, #0FFH MOV P1, A ; Tạo P1 là cổng đầu vào MOV A, P1 ; Đọc dữ liệu từ P1 MOV B, #10 ; B = 0A Hex (10 thập phân) DIV AB ; Chia cho 10 MOV R7, B ; Cất số thấp MOV B, #10 ; DIV AB ; Chia 10 lần nữa MOV R6, B ; Cất số tiếp theo MOV R5, A ; Cất số cuối cùng b. Để chuyển đổi số nhị phân hay Hex về số thập phân ta thực hiện chia lặp cho 10 liên tục cho đến khi thương số nhỏ hơn 10. Sau mỗi lần chia số dư được lưu cất. Trong trường hợp một số nhị phân 8 bit như FDH chẳng hạn ta có 253 số thập phân như sau (tất cả trong dạng Hex) Thương số Số dư FD/0A 19 3 (Số thấp - cuối) 19/0A 2 5 (Số giữa) 2 (Số đầu) Do vậy, ta có FDH = 253. Để hiển thị dữ liệu này thì nó phải được chuyển đổi về ASCII mà sẽ được mô tả ở chương sau. 3.2. Nhóm lênh logic 3.2.1. Lệnh Và (AND). 55
  56. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Cú pháp: ANL đích, nguồn; đích = đích Và nguồn (kẻ bảng). Lệnh này sẽ thực hiện một phép Và lô-gíc trên hai toán hạng đích và nguồn và đặt kết quả vào đích. Đích thường là thanh ghi tổng (tích luỹ). Toán hạngnguồn có thể là thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Hãy xem phụ lục Appendix A1 để biết thêm về các chế độ đánh địa chỉ dành cho lệnh này. Lệnh ANL đối với toán hạng theo byte không có tác động lên các cờ. Nó thường được dùng để che (đặt về 0) những bit nhất định của một toán hạng. Ví dụ 3.12: Trình bày kết quả của các lệnh sau: MOV A, #35H ; Gán A = 35H ANL A, #0FH ; Thực hiện Và lô-gíc A và 0FH (Bây giờ A = 05) Lời giải: 35H 0 0 1 1 0 1 0 1 0FH 0 0 0 0 1 1 1 1 05H 0 0 0 0 0 1 0 1 35H và 0FH = 05H 3.2.2. Lệnh Hoặc (OR). Cú pháp ORL đích = đích Hoặc nguồn (kẻ bảng) Các toán hạng đích và nguồn được Hoặc với nhau và kết quả được đặt vào đích. Phép Hoặc có thể được dùng để thiết lập những bit nhất định của một toán hạng 1. Đích thường là thanh ghi tổng, toán hạng nguồn có thể là một thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Hãy tham khảo phụ lục Appendix A để biết thêm về các chế độ đánh địa chỉ được hỗ trợ bởi lệnh này. Lệnh ORL đối với các toán hạng đánh địa chỉ theo byte sẽ không có tác động đến bất kỳ cờ nào. Ví dụ 3.13: Trình bày kết quả của đoạn mã sau: MOV A, #04 ; A = 04 MOV A, #68H ; A = 6C Lời giải: 04H 0000 0100 68H 0110 1000 6CH 0110 1100 04 OR 68 = 6CH 3.2.3. Lệnh XOR (OR loại trừ). Cú pháp: XRL đích, nguồn; đích = đích Hoặc loại trừ nguồn (kẻ bảng). Lệnh này sẽ thực hiện phép XOR trên hai toán hạng và đặt kết quả vào đích. 56
  57. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Đích thường là thanh ghi tổng. Toán hạng nguồn có thể là một thanh ghi trong bộ nhớ hoặc giá trị cho sẵn. Xem phụ lục Appendix A.1 để biết thêm về chế độ đánh địa chỉ của lệnh này. Lệnh XRL đối với các toán hạng đánh địa chỉ theo byte sẽ không có tác động đến bất kỳ cờ nào. Ví dụ 3.14: Trình bày kết quả của đoạn mã sau: MOV A, #54H XRL A, #78H Lời giải: 54H 0 1 0 1 0 1 0 0 78H 0 1 1 1 1 0 0 0 2CH 0 0 1 0 1 1 0 1 54H XOR 78H = 2CH Ví dụ 3.15: Lệnh XRL có thể được dùng để xoá nội dung của một thanh ghi bằng cách XOR nó với chính nó. Trình bày lệnh “XRL A, A” xoá nội dung của A như thế nào? giả thiết AH = 45H. Lời giải: 45H 01000101 45H 01000101 00 00000000 54H XOR 78H = 2CH Lệnh XRL cũng có thể được dùng để xem nếu hai thanh ghi có giá trị giống nhau không? Lệnh “XRL A, R1” sẽ hoặc loại trừ với thanh ghi R1 và đặt kết quả vào A. Nếu cả hai thanh ghi có cùng giá trị thì trong A sẽ là 00. Sau đó có thể dùng lệnh nhả JZ để thực hiện theo kết quả. Xét ví dụ 7.5. Ví dụ 3.16: Đọc và kiểm tra cổng P1 xem nó có chứa giá trị 45H không? Nếu có gửi 99H đến cổng P2, nếu không xoá nó. Lời giải: MOV P2, #00 ; Xóa P2 MOV P1, #0FFH ; Lấy P1 là cổng đầu vào MOV R3, #45H ; R3 = 45H MOV A, P1 ; Đọc P1 XRL A, R3 JNZ EXIT ; Nhảy nếu A có giá trị khác 0 MOV P2, #99H EXIT: 57
  58. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Trong chương trình của ví dụ 7.5 lưu ý việc sử dụng lệnh nhảy JNZ. Lệnh JNZ và JZ kiểm tra các nội dung chỉ của thanh ghi tổng. Hay nói cách khác là trong 8051không có cờ 0. Một ứng dụng rộng rãi khác của bộ xử lý là chọn các bit của một toán hạng. Ví dụ để chọn 2 bit của thnh ghi A ta có thể sử dụng mã sau. Mã này ép bit D2 của thanh ghi A chuyển sang giá trị nghịch đảo, còn các bit khác không thay đổi. XRL A, #04H ; Nghĩa hoặc loại trừ thanh ghi A với ; Giá trị 0000 0100 3.2.4. Lệnh bù thanh ghi tổng CPL A. Lệnh này bù nội dung của thanh ghi tổng A. Phép bù là phép biến đổi các số 0 thành các số 1 và đổi các số 1 sang số 0. Đây cũng còn được gọi là phép bù 1. MOV A, #55H CPL A ; Bây giờ nội dung của thanh ghi A là AAH ; Vì 0101 0101 (55H) đ 1010 1010 (AAH) Để nhận được kết quả bù 2 thì tất cả mọi việc ta cần phải làm là cộng 1 vào kết quả bù 1. Trong 8051 thì không có lệnh bù 2 nào cả. Lưu ý rằng trong khi bù một byte thì dữ liệu phải ở trong thanh ghi A. Lệnh CPL không hỗ trợ một chế độ đánh địa chỉ nào cả. Ví dụ 3.17: Tìm giá trị bù 2 của 85H. Lời giải: MOV A, #85H ; Nạp 85H vào A (85H = 1000 0101) MOV A ; Lấy bù 1 của A (kết quả = 0111 1010) ADD A, #1 ; Cổng 1 vào A thành bù 2 A = 0111 1011 (7BH) 3.2.5 Lệnh so sánh. 8051 có một lệnh cho phép so sánh. Cú pháp: CJNE đích, nguồn, địa chỉ tương đối. Trong 8051 thì phép so sánh và nhảy được kết hợp thành môt lệnh có tên là CJNE (so sánh và nhảy nếu kết quả không bằng nhau). Lệnh CJNE so sánh hai toán hạng nguồn và đích và nhảy đến địa chỉ tương đối nếu hai toán hạng không bằng nhau. Ngoài ra nó thay đổi cờ nhớ CY để báo nếu toán hạng đích lớn hơn hay nhỏ hơn. Điều quan trọng cần để là các toán hạng vẫn không giữ nguyên không thay thay đổi. Ví dụ, sau khi thực hiện lệnh “CJNE A, #67H, NEXT” thì thanh ghi A vẫn có giá trị ban đầu của nó (giá trị trước lệnh 58
  59. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái CJNE). Lệnh này so sánh nội dung thanh ghi A với giá trị 67H và nhảy đến giá trị đích NEXT chỉ khi thanh ghi A có giá trị khác 67H. Ví dụ 3.18: Xét đoạn mã dưới đây sau đó trả lời câu hỏi: a) Nó sẽ nhảy đến NEXT không? b) Trong A có giá trị bao nhiêu sau lệnh CJNE? MOV A, #55H CJNE A, #99H, NEXT NEXT: Lời giải: a) Có vì 55H và 99H không bằng nhau b) A = 55H đây là giá trị trước khi thực hiện CJNE. Trong lệnh CJNE thì toán hạng đích có thể trong thanh ghi tổng hoặc trong một các thanh ghi Rn. Toán hạng nguồn có thể trong một thanh ghi, trong bộ nhớ hoặc giá trị cho sẵn. Hãy xem phụ lục Appendix A để biết thêm chi tiết về các chế độ đánh địa chỉ cho lệnh này. Lệnh này chỉ tác động cờ nhớ CY. Cờ này được thay đổi như chỉ ra trên bảng 3.3. Dưới đây trình bày phép so sánh hoạt động như thế nào đối với tất cả các điều kiện có thể: CJNE R5, #80, NOT-EQUAL ; Kiểm tra R5 có giá trị 80 ; R5 = 80 NOT-EQUAL: JNC NEXT ; Nhảy đến R5 > 80 NEXT: Bảng 3.3: Thiết kế cờ CY cho lệnh CJNE. Compare Carry Flag Destinatio > Source CY = 0 Destination < Source CY = 1 Để ý rằng trong lệnh CJNE thì không có thanh ghi Rn nào có thể được so sánh với giá trị cho sẵn. Do vậy không cần phải nói đến thanh ghi A. Cũng cần lưu ý rằng cờ nhớ CY luôn được kiểm tra để xem lớn hơn hay nhỏ hơn, nhưng chỉ khi đã xác định là nó không bằng nhau. Xét ví dụ 3.19 và 3.20 dưới đây. Ví dụ 3.19: Hãy viết mã xác định xem thanh ghi A có chứa giá trị 99H không? Nếu có thì hãy tạo R1 = FFH còn nếu không tạo R1 = 0. 59
  60. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Lời giải: MOV R1, #0 ; Xoá R1 CJNE A, #99H ; Nếu A không bằng 99H thì nhảy đến NEXT MOV R1, #0FFH ; Nếu chúng bằng nhau, gán R1 = 0FFH NEXT: ; Nếu không bằng nhau, gán R1 = 0 OVER: Ví dụ 3.20: Giả sử P1 là một cổng đầu vào được nối tới một cảm biến nhiệt. Hãy viết chương trình đọc nhiệt độ và kiểm tra nó đối với giá trị 75. Theo kết quả kiểm tra hãy đặt giá trị nhiệt độ vào các thanh ghi được chỉ định như sau: Nếu T = 75 thì A = 75 Nếu T 75 thì R2 = T Lời giải: MOV P1, 0FFH ; Tạo P1 làm cổng đầu vào MOV A, P1 ; Đọc cổng P1, nhiệt độ CJNE A, #75, OVER ; Nhảy đến OVER nếu A ạ 75 SJMP EXIT ; A = 75 thoát OVER: JNC NEXT ; Nếu CY = 0 thì A > 75 nhảy đến NEXT MOV R1, A ; Nếu CY = 1 thì A 75 lưu nó vào R2 EXIT: Lệnh so sánh thực sự là một phép trừ, ngoại trừ một điều là giá trị của các toán hạng không thay đổi. Các cờ được thay đổi tuỳ theo việc thực hiện lệnh trừ SUBB. Cần phải được nhấn mạnh lại rằng, trong lệnh CJNE các toán hạng không bị tác động bất kể kết quả so sánh là như thế nào. Chỉ có cờ CY là bị tác động, điều này bị chi phối bởi thực tế là lệnh CJNE sử dụng phép trừ để bật và xoá cờ CY. Ví dụ 3.21: Viết một chương trình để hiển thị liên tục cổng P1 đối với giá trị 63H. Nó chỉ mất hiển thị khi P1 = 63H. Lời giải: MOV P1, #0FFH ; Chọn P1 làm cổng đầu vào HERE: MOV A, P1 ; Lấy nội dung của P1 60
  61. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái CJNE A, #63, HERE ; Duy trì hiển thị trừ khi P1 = 63H Ví dụ 3.22: Giả sử các ngăn nhớ của RAM trong 40H - 44H chứa nhiệt độ hàng ngày của 5 ngày như được chỉ ra dưới đây. Hãy tìm để xem có giá trị nào bằng 65 không? Nếu giá trị 65 có trong bảng hãy đặt ngăn nhớ của nó vào R4 nếu không thì đặt R4 = 0. 40H = (76); 41H = (79); 42H = (69); 43H = (65); 44H = (64) Lời giải: MOV R4, #0 ; Xoá R4 = 0 MOV R0, #40H ; Nạp con trỏ MOV R2, #05 ; Nạp bộ đếm MOV A, #65 ; Gán giá trị cần tìm vào A BACK: CJNE A, @R0, NEXT ; So sánh dữ liệu RAM với 65 MOV R4, R0 ; Nếu là 65, lưu địa chỉ vào R4 SJMP EXIT ; Thoát NEXT: INC R0 ; Nếu không tăng bộ đếm DJNZ R2, BACK ;Tiếp tục kiểm tra cho đến khi bộ đếm bằng 0. EXIT: 3.2.6. Quay các bit của thanh ghi A sang trái hoặc phải. a) Quay phải: RR A ; Quay các bit thanh ghi A sang phải. Trong phép quay phải, 8 bit của thanh ghi tổng được quay sang phải một bit và bit D0 rời từ vị trí bit thấp nhất và chuyển sang bit cao nhất D7. Xem đoạn mã dưới đây. MOV A, #36H ; A = 0011 0110 RR A ; A = 0001 1011 RR A ; A = 1000 1101 RR A ; A = 1100 0110 RR A ; A = 0110 0011 b) Quay trái: Cú pháp: RL A ; Quay trái các bit của thanh ghi A (hình vẽ) Trong phép quay trái thì 8 bit của thanh ghi A được quay sang trái 1 bit và bit D7 rời khỏi vị trí bit cao nhất chuyển sang vị trí bit thấp nhất D0. Xem biểu đồ mã dưới đây. 61
  62. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV A, #72H ; A = 0111 0010 RL A ; A = 1110 0100 RL A ; A = 1100 1001 Lưu ý rằng trong các lệnh RR và RL thì không có cờ nào bị tác động. 3.2.7. Quay có nhớ. Trong 8051 còn có 2 kênh quay nữa là quay phải có nhớ và quay trái có nhớ. Cú pháp: RRC A và RLC A a) Quay phải có nhớ: RRC A Trong quay phải có nhớ thì các bit của thanh ghi A được quay từ trái sang phải 1 bit và bit thấp nhất được đưa vào cờ nhớ CY và sau đó cờ CY được đưa vào vị trí bit cao nhất. Hay nói cách khác, trong phép RRC A thì LSB được chuyển vào CY và CY được chuyển vào MSB. Trong thực tế thì cờ nhớ CY tác động như là một bit bộ phận của thanh ghi A làm nó trở thành thanh ghi 9 bit. CLR C ; make CY = 0 MOV A #26H ; A = 0010 0110 RRC A ; A = 0001 0011 CY = 0 RRC A ; A = 0000 1001 CY = 1 RCC A ; A = 1000 0100 CY = 1 b) Quay trái có nhớ (hình vẽ): RLC A. Trong RLC A thì các bit được dịch phải một bit và đẩy bit MSB vào cờ nhớ CY, sau đó CY được chuyển vào bit LSB. Hay nói cách khác, trong RLC thì bit MSB được chuyển vào CY và CY được chuyển vào LSB. Hãy xem đoạn mã sau. SETB C ; Make CY = 1 MOV A #15H ; A = 0001 0101 RRC A ; A = 0101 1011 CY = 0 RRC A ; A = 0101 0110 CY = 0 RCC A ; A = 1010 1100 CY = 0 RCC A ; A = 1000 1000 CY = 1 3.2.8. Lệnh trao đổi thanh ghi A: SWAP A Một lệnh hữu ích khác nữa là lệnh trao đổi SWAP. Nó chỉ hoạt động trên thanh ghi A, nó trao đổi nửa phần cao của byte và nửa phần thấp của byte với nhau. Hay nói cách khác 4 bit cao được chuyển thành 4 bit thấp và 4 bit thấp thành 4 bit cao. 62
  63. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Ví dụ 3.23: a) Hãy tìm nội dung của thanh ghi A ở đoạn mã sau. b) Trong trường hợp không có lệnh SWAP thì cần phải làm như thế nào để trao đổi những bit này? Hãy viết một mã chương trình đơn giản về quá trình đó. Lời giải: a) MOV A, #72H ; A = 72H SWAP A ; A = 27H b) MOV A, #72H ; A = 0111 0010 RL A ; A = 1110 0100 RL A ; A = 1100 1001 RL A ; A = 0010 0111 Ví dụ 3.24: Viết một chương trình để tìm số các số 1 trong một byte đã cho. Lời giải: MOV R1, #0 ; Chọn R1 giữ số các số 1 MOV R7, #8 ; Đặt bộ đếm = 8 để quay 8 lần MOV A, #97H ; Tim các số 1 trong byte 97H AGAIN: RLC A ; Quay trái có nhớ một lần JNC NEXT ; Kiểm tra cờ CY INC R1 ; Nếu CY = 1 thì cộng 1 vào bộ đếm NEXT: DJNZ R7, AGAIN ; Lặp lại quá trình 8 lần Để truyền 1 byte dữ liệu nói tiếp thì dữ liệu có thể được chuyển đổi từ song song sang nối tiếp bằng các lệnh quay như sau: RRC A ; Bít thứ nhất đưa vào cờ CY 63
  64. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV P1.3, C ; Xuất CY như một bit dữ liệu RRC A ; Bit thứ hai đưa vào CY MOV P1.3, C ; Xuất CY ra như một bit dữ liệu RRC A ; MOV P1.3, C ; Đoạn mã trên đây là một phương pháp được sử dụng rộng rãi trong truyền dữ liệu tới các bộ nhớ nối tiếp như các EEPROM nối tiếp. 3.2.9. Các chương trình ứng dụng của mã BCD và ASCII. Các số mã BCD đã được trình ở phần trước. Như đã nói ở đó rằng trong rất nhiều bộ vi điều khiển mới đều có một đồng hồ thời gian thực RTC (Real Time Clock) để giữ cho thời gian và cả lịch cho cả khi bị tắt nguồn. Các bộ vi điều khiển này cung cấp thời gian và lịch dưới dạng BCD. Tuy nhiên, để hiển thị chúng thì chúng phải được chuyển về mã ASCII. Trong phần này ta trình bày ứng dụng của các lệnh quay và các lệnh lô-gíc trong việc chuyển đổi mã BCD và ASCII. Bảng 3.4: Mã ASCII cho các chữ số từ 0- 9. Phím Mã ASCII (Hex) Mã ASCII nhị phân Mã BCD (không đóng gói) 0 30 011 0000 0000 0000 1 31 011 0001 0000 0001 2 32 011 0010 0000 0010 3 33 011 0011 0000 0011 4 34 011 0100 0000 0100 5 35 011 0101 0000 0101 6 36 011 0110 0000 0110 7 37 011 0111 0000 0111 8 38 011 1000 0000 1000 9 39 011 1001 0000 1001 a) Các số mã ASCII. Trên các bàn phím ASCII khi phím “0” được kích hoạt thì “011 0001” (30H) được cấp tới máy tính. Tương tự như vậy 31H (011 0001) được cấp cho phím “1” v.v như cyhỉ ra trong bảng 3.4. Cần phải ghi nhớ rằng mặc dù mã ASCII là chuẩn ở mỹ (và nhiều quốc gia khác) nhưng các số mã BCD là 64
  65. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái tổng quát. Vì bàn phìm, máy in và màn hình đều sử dụng mã ASCII nên cần phải thực hiện đổi chuyển giữa các số mã ASCII về số mã BCD và ngược lại. b) Chuyển đổi mã BCD đóng gói về ASCII. Các bộ vi điều khiển DS5000T đều có đồng bộ thời gian thực RTC. Nó cung cấp hiển thị liên tục thời gian trong ngày (giờ, phút và giây) và lịch (năm, tháng, ngày) mà không quan tâm đến nguồn tắt hay bật. Tuy nhiên dữ liệu này được cấp ở dạng mã BCD đóng gói. Để hiển thị dữ liệu này trên một LCD hoặc in ra trên máy in thì nó phải được chuyển về dạng mã ASCII. Để chuyển đổi mã BCD đóng gói về mã ASCII thì trước hết nó phải được chuyển đổi thành mã BCD không đóng gói. Sau đó mã BCD chưa đóng gói được móc với 011 0000 (30H). Dưới đây minh hoạ việc chuyển đổi từ mã BCD đóng gói về mã ASCII. Mã BCD đóng gói Mã BCD không đóng gói Mã ASCII 29H 02H & 09H 32H & 39H 0010 1001 0000 0010 & 0000 1001 11 0 & 0011 1001 c) Chuyển đổi mã ASCII về mã BCD đóng gói. Để chuyển đổi mã ASCII về BCD đóng gói trước thì trước hết nó phải được chuyển về mã BCD không đóng gói (để có thêm 3 số) và sau đó được kết hợp để tạo ra mã SCD đóng gói. Ví dụ số 4 và số 7 thì bàn phím nhận được 34 và 37. Mục tiêu là tạo ra số 47H hay “0100 0111” là mã BCD đóng gói. Quá trình này như sau: Phím Mã ASCII Mã BCD không đóng gói Mã BCD đóng gói 4 34 0000 0100 7 37 0000 0111 0100 0111 hay 47H MOV A, # ‘4’ ; Gán A = 34H mã ASCII của số 4 MOV R1, # ‘7’ ; Gán R1 = 37H mã ASCII của số 4 ANL A, #0FH ; Che nửa byte cao A (A = 04) ANL R1, #0FH ; Che nửa byte cao của R1 (R1 = 07) SWAP A ; A = 40H ORL A, R1 ; A = 47H, mã BCD đóng gói 65
  66. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Sau phép chuyển đổi này các số BCD đóng gói được xử lý và kết quả sẽ là dạng BCD đóng gói. Như ta đã biết có một lệnh đặt biệt là “DA A” đòi hỏi dữ liệu phải ở dạng BCD đóng gói. Ví dụ 3.25: Giả sử thanh ghi A có số mã BCD đóng gói hãy viết một chương trình để chuyển đổi mã BCD về hai số ASCII và đặt chúng vào R2 và R6. Lời giải: MOV A, #29H ; Gán A = 29, mã BCD đóng gói MOV R2, A ; Giữ một bản sao của BCD trong R2 ANL A, #0FH ; Che phần nửa cao của A (A = 09) ORL A, #30H ; Tạo nó thành mã ASCII A = 39H (số 9) MOV R6, A ; Lưu nó vào R6 (R6 = 39H ký tự của ASCII) MOV A, R2 ; Lấy lại giá trị ban đầu của A (A = 29H) ANL A, #0F0H ; Che nửa byte phần thấp của A (A = 20) RR A ; Quay phải RR A ; Quay phải RR A ; Quay phải RR A ; Quay phải (A = 02) ORL A, #30H ; Tạo nó thành mã ASCII (A = 32H, số 2) MOV R2, A ; Lưu ký tự ASCII vào R2 Trong ví dụ trên tất nhiên là ta có thể thay 4 lệnh RR quay phải bằng một lệnh trao đổi WAPA. 3.3. Nhóm lệnh truyền dữ liệu Lệnh chuyển MOV. Nói một cách đơn giản, lệnh MOV sao chép dữ liệu từ một vị trí này đến một ví trí khác. Cú pháp MOV ; Đích, nguồn; sao chép nguồn vào đích Lệnh này nói CPU chuyển (trong thực tế là sao chép) toán hạng nguồn vào toán hạng đích. Ví dụ lệnh “MOV A, R0” sao chép nội dung thanh ghi R0 vào thanh ghi A. Sau khi lênh này được thực hiện thì thanh ghi A sẽ có giá trị giống như thanh ghi R0. Lệnh MOV không tác động toán hạng nguồn. Đoạn chương trình dưới đây đầu tiên là nạp thanh ghi A tới giá trị 55H là giá trị 55 ở dạng số Hex) và sau đó chuyển giá trị này qua các thanh ghi khác nhau bên trong CPU. Lưu ý rằng dấu “#” trong lệnh báo rằng đó là một giá trị. Ví dụ 3.26: Tầm quan trọng của lệnh MOV. 66
  67. GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MOV A, #55H ; Nạp trí trị 55H vào thanh ghi A (A = 55H) MOV R0, A ; Sao chép nội dung A vào R0 (bây giờ R0=A) MOV R1, A ; Sao chép nội dung A và R1 (bây giờ R1=R0=A) MOV R2, A ; Sao chép nội dung A và R2 (bây giờ R2=R1=R0=A) MOV R3, #95H ; Nạp giá trị 95H vào thanh ghi R3 (R3 = 95H) MOV A, R3 ; Sáo chép nội dung R3 vào A (bây giờ A = 95H) Khi lập trình bộ vi điều khiển 8051 cần lưu ý các điểm sau: 1. Các giá trị có thể được nạp vào trực tiếp bất kỳ thanh ghi nào A, B, R0 - R7. Tuy nhiên, để thông báo đó là giá trị tức thời thì phải đặt trước nó một ký hiệu “#” như chỉ ra dưới đây. MOV A, #23H ; Nạp giá trị 23H vào A (A = 23H) MOV R0, #12H ; Nạp giá trị 12H vào R0 (R0 = 2BH) MOV R1, #1FH ; Nạp giá trị 1FH vào R1 (R1 = 1FH) MOV R2, #2BH ; Nạp giá trị 2BH vào R2 (R2 = 2BH) MOV B, # 3CH ; Nạp giá trị 3CH vào B (B = 3CH) MOV R7, #9DH ; Nạp giá trị 9DH vào R7 (R7 = 9DH) MOV R5, #0F9H ; Nạp giá trị F9H vào R5 (R5 = F9H) MOV R6, #12 ;Nạp giá trị thập phân 12 = 0CH vào R6 (trong R6 có giá trị 0CH). Để ý trong lệnh “MOV R5, #0F9H” thì phải có số 0 đứng trước F và sau dấu # báo rằng F là một số Hex chứ không phải là một ký tự. Hay nói cách khác “MOV R5, #F9H” sẽ gây ra lỗi. 2. Nếu các giá trị 0 đến F được chuyển vào một thanh ghi 8 bit thì các bit còn lại được coi là tất cả các số 0. Ví dụ, trong lệnh “MOV A,#5” kết quả là A=0.5, đó là A = 0000 0101 ở dạng nhị phân. 3. Việc chuyển một giá trị lớn hơn khả năng chứa của thanh ghi sẽ gây ra lỗi ví dụ: MOV A, #7F2H ; Không hợp lệ vì 7F2H > FFH MOV R2, 456 ; Không hợp lệ vì 456 > 255 (FFH) 4. Để nạp một giá trị vào một thanh ghi thì phải gán dấu “#” trước giá trị đó. Nếu không có dấu thì nó hiểu rằng nạp từ một vị trí nhớ. Ví dụ “MOV A, 17H” có nghĩa là nạp giá trị trong ngăn nhớ có giá trị 17H vào thanh ghi A và tại 67