(NB) Bài giảng Vi điều khiển: Phần 2 cung cấp cho người học các kiến thức: khảo sát timercounter của vi điều khiển, khảo sát ngắt của vi điều khiển, lập trình hợp ngữ cho vi điều khiển MCS51.
Chương 5: KHẢO SÁT TIMER - COUNTER CỦA VI ĐIỀU KHIỂN 5.1 Giới thiệu 5.1.1 Cấu tạo Bộ đếm/định thời 8051 có 02 Bộ đếm/Bộ định thời Timer/Counter0 Timer/Counter1, ta gọi chung Timer/Counterx Bộ Timer/Counterx loại ngoại vi 8051 thiết kế để thực nhiệm vụ đơn giản: đếm xung nhịp (Pulse Input) Mỗi có thêm xung nhịp đầu vào đếm giá trị Bộ đếm tăng lên 01 đơn vị (trong chế độ đếm tiến/đếm lên) hay giảm 01 đơn vị (trong chế độ đếm lùi/đếm xuống) Hình 5.1 - Sơ đồ khối tổng quan Bộ đếm/ định thời Xung nhịp đưa vào đếm hai loại: - Xung nhịp bên IC: Đó xung nhịp tạo nhờ kết hợp mạch dao động bên IC thạch anh bên nối với IC Trong trường hợp sử dụng xung nhịp loại này, người ta gọi Bộ định thời (Timers) Do xung nhịp bên loại thường đặn nên ta dùng để đếm thời gian cách xác - Xung nhịp bên ngồi IC: Đó tín hiệu logic thay đổi hai mức tín hiệu - không thiết phải đặn từ kiện bên vi điều khiển Trong trường hợp người ta gọi Bộ đếm (Counters) 70 5.1.2 Hoạt động Bộ đếm/định thời Hoạt động Bộ đếm/định thời sau: xung đưa vào (Pulse Input), ghi 16 bit THxTLx (ghép từ hai ghi bit THx, TLx) tăng (hoặc giảm) giá trị xảy tượng tràn, cờ TFx bật lên Sự kiện “tràn” (overflow) hiểu kiện Bộ đếm đếm vượt giá trị tối đa mà biểu diễn quay trở giá trị (Hình 5.2) Với Bộ đếm bit, giá trị tối đa 255 (tương đương với FF hệ Hexa) với Bộ đếm 16 bit 65535 (FFFFH) Trong phần mềm, vào cờ TFx bật lên, biết Bộ đếm đếm hết chu kỳ (một khoảng thời gian) Hình 5.2 - Một chu trình đếm Timer0 Các giá trị đếm Timer/Counter T0 lưu ghi TH0 TL0 – ghi bit kết hợp lại thành 16 bit Tương tự, giá trị đếm Timer/Counter T1 lưu ghi TH1 TL1 – ghi bit kết hợp lại thành 16 bit Bộ đếm/định thời lựa chọn hay hoạt động chế độ việc thiết đặt ghi chức đặc biệt SFR (Special Function Registers) TCON TMOD mà ta xét phần 5.2 5.3 5.1.3 Ứng dụng Bộ đếm/định thời Ứng dụng phổ biến Bộ đếm dùng để thiết kế ứng dụng đếm kiện xảy bên vi điều khiển đếm sản phẩm chạy băng chuyền, đếm xe ra/vào kho bãi, đếm khách vào siêu thị, trung tâm thương mại… (a) (b) 71 Cảm biến Bảng Led (c) Hình 5.3 - Các ứng dụng tiêu biểu Bộ đếm (a) - Máy đếm sản phẩm c hạy băng chuyền; (b) - Bộ đếm khách vào trung tâm thương mại; (c) – Bảng Led kết hợp với đếm hiển thị số lượng chỗ đậu xe trống bãi Bộ định thời sử dụng hầu hết ứng dụng Vi điều khiển, từ việc tạo hàm trễ (delay), việc tạo giá trị baudrate cho truyền thông nối tiếp (Serial Communication) Tuy nhiên, ứng dụng phổ biến Bộ định thời điều chế độ rộng xung PWM (Pulse Width Modulation) Đây chức quan trọng Vi điều khiển nhiều ứng dụng: điều khiển tốc độ động cơ, điều khiển góc quay động Servo, thiết kế nguồn ổn áp xung… (a) (b) Hình 5.4 - Các ứng dụng tiêu biểu Bộ định thời (a) - Bộ định thời đếm ngược đèn giao thông; (b) - Chỉnh góc quay servo theo PWM 72 5.2 Thanh ghi chọn chế kiểu làm việc cho Timer Thanh ghi TMOD (TIMER MODE) ghi bit, truy xuất BYTE dùng để xác định chế độ hoạt động Timer Nó gồm hai nhóm bit: bit thấp (0 - 3) dùng để thiết lập chế độ hoạt động cho Timer bit cao (4 – 7) thiết lập chế độ hoạt động cho Timer Hình 5.5 - Thanh ghi TMOD Bảng 5.1 - Bảng tóm tắt bit ghi TMOD Bit Kí hiệu Timer GATE C/T T1M1 Chức Nếu GATE = Timer làm việc chân INT1 hay P3.3 mức cao Bit lựa chọn Counter hay Timer: C/T = 0: Bộ định thời đếm xung từ dao động thạch anh/12 C/T = 1: đếm xung từ bên đưa đến ngõ vào T1 Bit chọn Mode Timer T1M0 Bit chọn Mode Timer GATE Nếu GATE = Timer làm việc INT0 = C/T Bit lựa chọn Counter hay Timer: giống T0M1 Bit chọn mode Timer 0 T0M0 Bit chọn mode Timer Ø Hai bit M0 M1 tạo tổ hợp trạng thái tương ứng với kiểu làm việc khác Timer Timer theo bảng sau: Bảng 5.2 - Chế độ hoạt động Timer/Counter M1 M0 Chế độ Chức 0 Timer/Counter 13 bit 1 Timer/Counter 16 bit Timer/Counter bit, auto 1 Timer/Counter bit Trong chế độ này, có chế độ hay sử dụng, chế độ sử dụng Để hiểu cách truy xuất ghi TMOD, ta khảo sát ví dụ sau: 73 - TMOD = 0000 0001 (0x01): chế độ Bộ định thời Timer chọn - TMOD = 0010 0000 (0x20): chế độ Bộ định thời Timer chọn TMOD = 0001 0010 (0x12): chế độ Bộ định thời Timer chế độ Bộ định thời Timer chọn 5.3 Thanh ghi điều khiển Timer Thanh ghi TCON (TIMER CONTROL) ghi điều khiển hoạt động Timer, chứa bit trạng thái bit điều khiển cho Timer0 Timer1 Gồm bit cho phép truy xuất byte bit Hình 5.6 - Thanh ghi TCON Hoạt động bit ghi TCON tóm tắt sau: Bảng 5.3 - Bảng mơ tả bit ghi TCON Bit Kí hiệu Tên đầy đủ TF1 Timer Flag TR1 Timer Run Control TF0 TR0 Timer Flag Timer Run Control Chức Cờ tràn Timer Cờ set phần cứng có tràn, xóa phần mềm (lập trình) phần cứng trình phục vụ ngắt hoạt động Bit điều khiển Timer đếm / ngừng đếm: TR1 = : Timer phép đếm xung TR1 = : Timer không phép đếm xung (ngừng) Cờ tràn Timer (hoạt động tương tự TF1) Bit điều khiển Timer (hoạt động tương tự TR1) Cờ báo ngắt ngắt INT1 Khi có ngắt xảy ngõ vào INT1 (cạnh xuống) cờ IE1 tác động lên mức IE1 Interrupt enable Khi vi điều khiển thực chương trình phục vụ ngắt INT1 tự động xóa cờ báo ngắt IE1 Bit điều khiển cho phép ngắt INT1 tác động mức hay cạnh IT1 = ngắt INT1 tác động IT1 Interrupt type mức IT1 = ngắt INT1 tác động cạnh xuống IE0 Interrupt enable Giống IE1 phục vụ cho ngắt INT0 IT0 Interrupt type Giống IT1 phục vụ cho ngắt INT0 Ø bit thấp (IEx, ITx) sử dụng cho phần lập trình ngắt, phần trình bày chương sau 74 Để hiểu thêm cách truy xuất ghi TCON ta xét ví dụ sau: - Truy xuất BYTE: TCON = 0001 0010; - Truy xuất BIT: TR0 = 1; IE0 = 1; 5.4 Các kiểu hoạt động Timer cờ tràn Như trình bày Timer có kiểu hoạt động (Bảng 5.2), phần ta khảo sát chi tiết kiểu hoạt động Timer Ta dùng ký hiệu TLx THx để ghi byte thấp byte cao Timer0 Timer1 v Chế độ (Chế độ 13 bit): TLx sử dụng bit đầu để ghép với 8bit THx, tạo thành 13 bit Thời gian tối đa định thời 213 = 8192 µs (với thạch anh 11.0592 MHz) Hình 5.7 - Thanh ghi TH TL chế độ v Chế độ (Chế độ 16 bit): Thời gian tối đa định thời 216 = 65536 µs Hình 5.8 - Thanh ghi TH TL chế độ v Chế độ (Chế độ tự động nạp lại bit): Chế độ bit, tự động nạp lại Khi TLx hoạt động để đếm (định thời), THx chứa giá trị nạp lại Khi xảy tràn, TFx bật lên, đồng thời cho phép giá trị THx nạp vào TLx Hình 5.9 - Thanh ghi TH TL chế độ 75 v Chế độ (Chế độ tách ra): Bộ đếm/định thời bit Tuy nhiên sử dụng hai ghi TH0 TL0 (TH0 thay vai trò TH1, TH1 khơng sử dụng) Hình 5.10 - Thanh ghi TH TL chế độ 5.5 Các nguồn xung đếm Timer/Counter đếm xung từ hai nguồn: Bộ Timer/Counter sử dụng chế độ Định thời - Timer đếm xung bên (xung nội) biết tần số, Bộ Timer/Counter sử dụng chế độ Đếm - Counter đếm xung từ bên ngồi Hình 5.11 Bit C/T TMOD cho phép chọn chế độ Timer hay Counter khởi tạo ghi TMOD Hình 5.11 - Các nguồn xung đếm 5.5.1 Chức định thời (đếm thời gian) Nếu bit C/T = Bộ định thời hoạt động Bộ đếm thời gian với xung vào xung đồng hồ chip, mạch chia 12 thêm vào để giảm tần số xung đồng hồ đến giá trị phù hợp với hầu hết ứng dụng 76 Ở chế độ Bộ định thời dùng để đếm thời gian, cặp ghi TLx/THx tăng dần với tốc độ 1/12 tần số xung dao động chip (chẳng hạn tần số thạch anh 12 MHz tốc độ xung đếm MHz), tượng tràn xảy đếm đủ số xung tương ứng với thời gian quy định, phụ thuộc vào giá trị khởi tạo đặt vào ghi THx TLx Dao động chip :12 Tần số đồng hồ Bộ định thời Hình 5.12 - Tần số Bộ đếm/Bộ định thời Bảng 5.4 - Một số tần số thông dụng Tần số thạch anh Tần số Bộ định thời Chu kỳ Bộ định thời 20MHz 20MHz/12=1.6666MHz 1/1.6666MHz=0.6µs 12MHz 12MHz/12=1MHz 1/1MHz=1µs 11.0592MHz 11.0592MHz/12=0.9216MHz 1/0.9216MHz=1.085µs Mặc dù hệ thống 8051 sử dụng tần số thạch anh từ 10 đến 40MHz, song ta tập trung vào tần số thạch anh 11.0592MHz Lý đằng sau số lẻ tốc độ baud truyền thông nối tiếp 8051 Tần số XTAL = 11.0592MHz cho phép 8051 truyền thông với PC mà khơng có lỗi 5.5.2 Chức đếm kiện Nếu bit C/T = Timer hoạt động đếm xung đến từ bên chu kỳ xung nguồn tạo tín hiệu bên ngồi định Hoạt động thường dùng để đếm kiện Số lượng kiện lưu trữ ghi Timer Nguồn xung clock bên đưa vào chân T0 (P3.4 - chân 14) và chân T1 (P3.5 - chân 15) vi điều khiển Trong ứng dụng đếm xung từ bên ngoài: ghi Timer tăng giá trị đếm xung ngõ vào Tx chuyển trạng thái từ sang (tác động xung clock cạnh xuống) 77 5.6 Điều khiển Timer đếm, ngừng đếm v Phương pháp đơn giản để khởi động dừng Bộ định thời dùng bit điều khiển khởi động TRx ghi TCON, TRx tự động xóa reset hệ thống, trạng thái mặc định Bộ định thời trạng thái dừng Bộ định thời khởi động bit TRx trạng thái (hình 5.13) Vì TRx nằm ghi định địa bit TCON nên dễ khởi động dừng Timer cách thiết lập trạng thái cho TRx = (chạy) TRx = (ngừng) Hình 5.13 - Điều khiển đếm, ngừng Timer v Một phương pháp khác để điều khiển Bộ định thời dùng bit GATE TMOD ngõ vào từ bên INTx GATE = Timer cho phép điều khiển INTx, khả thường dùng để đo bề rộng xung sau: Giả sử INT0 mức thấp lên mức cao khoảng thời gian cần đo Trước tiên, khởi tạo Timer mode mode Timer 16 bit với TL0/TH0 = 0000H, GATE = TR0 = Khi INT0 lên mức cao, Bộ định thời mở cổng đếm với xung MHz, INT0 xuống mức thấp, Bộ định thời bị khóa cổng bề rộng xung tính µS số xung đếm chứa TL0/TH0 (INT0 lập trình để tạo ngắt trở mức thấp) 78 5.7 Khởi tạo truy xuất ghi Timer/Counter Các Timer thường khởi tạo lần đầu chương trình để thiết lập mode hoạt động phục vụ cho ứng dụng điều khiển liên quan đến định thời hay đếm xung ngoại Tùy thuộc vào yêu cầu điều khiển cụ thể mà ta điều khiển timer bắt đầu đếm, ngừng hay khởi động đếm lại từ đầu … Thanh ghi TMOD ghi cần phải khởi tạo để thiết lập mode hoạt động cho Timer Ví dụ khởi động cho Timer0 hoạt động mode (mode Timer 16 bit) hoạt động định thời đếm xung nội bên ta khởi tạo lệnh: MOV TMOD, # 00000001B Trong lệnh M1 = 0, M0 = để vào mode C/T = 0, GATE = phép đếm xung nội bên đồng thời xóa bit mode Timer Sau lệnh Timer chưa đếm timer đếm set bit điều khiển chạy TR0 Nếu ta không thiết lập giá trị bắt đầu đếm cho ghi TLx/THx Timer bắt đầu đếm từ 0000H lên chuyển trạng thái từ FFFFH sang 0000H sinh tràn làm cho bit TFx = tiếp tục đếm từ 0000H lên tiếp Nếu ta thiết lập giá trị bắt đầu đếm cho TLx/THx khác 0000H, Timer bắt đầu đếm từ giá trị thiết lập lên chuyển trạng thái từ FFFFH sang 0000H timer lại đếm từ 0000H lên Để timer bắt đầu đếm từ giá trị ta gán ta lập trình chờ sau lần tràn ta xóa cờ TFx gán lại giá trị cho TLx/THx để Timer luôn bắt đầu đếm từ giá trị khởi gán lên Đặc biệt định thời hoạt động phạm vi nhỏ 256 µs ta nên dùng Timer mode (tự động nạp bit) Sau khởi tạo giá trị đầu cho ghi THx, TLx, set bit TRx Timer bắt đầu đếm từ giá trị gán TLX tràn từ FFH sang 00H TLx, cờ tràn TFx tự động set, đồng thời giá trị Thx tự động nạp sang cho TLx Timer bắt đầu đếm từ giá trị khởi gán lên Nói cách khác, sau lần tràn ta khơng cần khởi gán lại cho ghi Timer mà chúng đếm lại từ giá trị gán Ví dụ 1: Chương trình tạo xung vng tần số 1kHz sử dụng timer mode1: mov tmod,#01h loop1: mov th0,#0feh ;chọn mode timer đếm 16 bit ;độ rộng xung 500µs 79 2204 7435 MOV A,#35H 3000 ORG ($+1000H) and 0F000h ;khai báo địa địa cộng 3000 7435 MOV A,#35H ;thêm 1000H END ;sang kbyte kế and với F000H để chuyển Nếu bỏ lệnh AND với F000H địa 3206H = 2206H + 1000H Ta sử dụng khai báo ORG loại segment Nếu segment thời tuyệt đối giá trị địa tuyệt đối segment thời Nếu segment thời tái định vị giá trị biểu thức ORG xử lý offset địa segment thời v USING: có chức báo cho assembler biết bank ghi tích cực thời, khơng chuyển băng ghi, để sử dụng ta phải sử dụng AR0 đến AR7 sau khai báo USING thay dùng R0 đến R7 Khi assembler tự động sử dụng ghi băng ghi mong muốn dịch assembler đổi ARN sang địa trực tiếp Cách sử dụng: USING expr Ví dụ 20: USING MOV AR3,#70H MOV R0,#22H Trong lệnh thứ nhất, AR3 ghi R3 bank ghi thay địa trực tiếp 13H Trong lệnh thứ hai, R0 truy cập bank ghi bank END: phát biểu cuối tập tin nguồn, sau dẫn end khơng xử lý 103 7.5.2 Chỉ dẫn định nghĩa kí hiệu Những dẫn tạo ký hiệu để biểu diễn segment, ghi, số địa Không sử dụng nhãn cho dẫn Những ký hiệu định nghĩa dẫn nhất, ngoại trừ dẫn SET cho phép định nghĩa lại v EQU hay SET: có chức gán ký số hay ký hiệu ghi cho tên ký hiệu đặt tả Cách sử dụng: symbol equ expr symbol set expr Trong symbol ký hiệu người dùng định nghĩa expr biểu thức Ví dụ 21: BDN EQU R2 GIAY SET 40 v Segment: có chức khai báo segment tái định vị Cách sử dụng: symbol segment segment_type Trong symbol ký hiệu người dùng định nghĩa segment_type kiểu segment Có kiểu segment sau: - Code: segment mã chương trình - Xdata: segment vùng liệu chứa nhớ bên - Data: segment vùng liệu nội có địa trực tiếp từ 00H÷7FH - Idata: segment vùng liệu nội có địa gián tiếp từ 00H÷7FH 8051 00H÷FFH 8052 - Bit: segment vùng nhớ bit nằm vùng nhớ cho phép truy xuất bit từ 20H÷2FH Ví dụ 22: EPROM SEGMENT CODE Khai báo ký hiệu eprom segment kiểu code Chú ý phát biểu khai báo EPROM kiểu code, để sử dụng segment phải sử dụng dẫn RSEG CODE/DATA/IDATA/XDATA/BIT Dùng để gán địa kiểu tương ứng với ký hiệu, nhiên có sử dụng assembler kiểm tra kiểu 104 Ví dụ 23: LOC OBJ 0005 0005 LINE SOURCE flag1 equ 05h flag2 bit 05h 0000 D205 SETB flag1 0002 D205 SETB flag2 0004 750500 MOV flag1,#0 0007 750500 MOV flag2,#0 ***ERROR #37, LINE #6 (0), DATA SEGMENT ADDRESS EXPECTED end SYMBOL TABLE LISTING - N A M E T Y P E V A L U E A T T R I B U T E S FLAG1 NUMB 0005H A FLAG2 B ADDR 0020H.5 A REGISTER BANK(S) USED: ASSEMBLY COMPLETE, ERROR FOUND (6) Trong chương trình ví dụ ta khai báo flag1 nhớ có địa 05H, flag2 bit có địa 05H Hai lệnh setb biên dịch khơng có lỗi assembler xem chúng bit có địa 05H Lệnh thứ biên dịch xem flag1 nhớ có địa 05H, lệnh thứ biên dịch báo lỗi lệnh MOV khơng thể thực ô nhớ bit 7.6 Các điều khiển trình biên dịch Assembler Ta đặt dòng điều khiển chương trình nguồn để điều khiển cơng việc kết xuất (listing) Mỗi dòng điều khiển bắt đầu ký tự chữ “$” theo sau danh sách từ khố điều khiển cách khoảng trống Phần lớn từ khoá điều khiển có dạng tích cực khơng tích cực thường từ khoá điều khiển viết tắt ký tự Một số từ khố điều khiển thơng dụng liệt kê bảng sau: 105 Bảng 7.3 - Các từ khoá điều khiển biên dịch Tên điều khiển Viết tắt PAGELENGTH(n) PL PAGEWIDTH(n) PW XREF/NOXREF XR/NOXR EJECT GEN/NOGEN INCLUDE (filename) EJ GE/NOGE IC LIST/NOLIST LI/NOLI SAVE/RESTORE SA/RS TITLE(string) TT TT Mặc nhiên Ý nghĩa Đặt số dòng tối đa cho trang tập tin kết xuất (tầm vị trí từ 10 đến 65536) Đặt số ký tự tối đa cho dòng PW(120) (tầm trị từ 72 đến 132) Tạo bảng liệt kê tham chiếu chéo NOXR tất ký hiệu sử dụng chương trình Tiếp tục kết xuất trang kế Tạo đầy đủ khai triển NOGE macro Chỉ tập tin có tên filename xem phần chương trình In dòng mã nguồn liên tục LI tập tin kết xuất Lưu trữ cài đặt điều khiển cho LIST GEN, lấy lại từ ngăn xếp Đặt chuỗi ký tự string đầu trang tối đa 60 ký tự PL(60) 7.7 Hoạt động liên kết – linker Với ứng dụng lớn người lập trình thường chia chương trình thành nhiều chương trình hay module tái định vị Ta cần chương trình liên kết định vị để kết hợp module thành module đối tượng tuyệt đối mà thực thi Tất ký hiệu thay giá trị đặt vào tập tin xuất minh hoạ hình Hình 7.2 - Hoạt động chương trình linker có tên RL51 106 7.8 Sử dụng macro Phương tiện xử lý macro ASM51 phương tiện thay chuỗi ký tự Macro cho phép phần mã sử dụng thường xuyên định nghĩa lần cách dùng từ gợi nhớ đơn giản sử dụng chỗ chương trình cách chèn vào từ gợi nhớ Ta định nghĩa macro chỗ chương trình nguồn sau sử dụng lệnh khác Cú pháp định nghĩa macro sau: %*define (call_pattern) (macro_body) Trong call_pattern từ gợi nhớ người dùng định nghĩa macro_body thân macro đoạn chương trình thường lặp lại Để phân biệt với lệnh thật người ta đặt thêm ký hiệu “%” trước tên macro hợp dịch tất lệnh thân macro thay vào nơi gọi chương trình macro Ví dụ 24: Nếu định nghĩa macro sau đầu tập tin nguồn %*define (push_dptr) ( PUSH DPH PUSH DPL ) Thì gặp phát biểu %push_dptr chương trình nguồn trình biên dịch thay lệnh PUSH DPH PUSH DPL tập tin lst v Các tiện lợi sử dụng macro: - Chương trình nguồn có sử dụng macro dễ đọc từ gợi nhớ macro cho biết ý nghĩa công việc phải thực - Chương trình ngắn gọn nên đánh máy - Sử dụng macro làm giảm bớt lỗi - Sử dụng macro giúp cho người lập trình khơng phải bận rộn với chi tiết cấp thấp 107 7.8.1 Truyền tham số cho macro Macro với tham số truyền từ chương trình có dạng sau: %*define (macro_name (parameter_list)) (macro_body) Trong macro_name tên macro, parameter_list danh sách tham số macro_body thân macro Ví dụ 25: Định nghĩa macro có truyền tham số sau %*define (cmpa#(value)) ( CJNE A,#%value,$+3 ) Thì gọi phải truyền tham số sau: %Cmpa#(20H) Khi biên dịch trở thành CJNE A,#20H,$+3 Chú ý: lệnh cjne lệnh byte, $+3 địa lệnh kế nằm sau lệnh cjne Ví dụ 26: Để thực lệnh nhảy lớn ta tạo macro sau: %*define (JGT(value,label)) ( CJNE a,#%value+1,$+3 ;so sánh với giá trị ;(value+1) nhảy tới $+3 JNC %label ;nhảy tới label cờ C ;= có nghĩa lớn ) 7.8.2 Macro với nhãn cục Ta sử dụng nhãn cục macro có dạng sau: %*define (macro_name [(parameter_list)]) [local list_of_labels](macro_body) 108 Trong macro_name tên macro, parameter_list danh sách tham số, list_of_labels danh sách nhãn cục macro_body thân macro Ví dụ 27: Định nghĩa macro có nhãn cục sau %*define (dec_dptr) local skip ( DEC DPL MOV A,DPL CJNE A,#0FFh,%skip DEC DPH %Skip:) Khi macro gọi %dec_dptr Thì trình biên dịch thay lệnh gọi lệnh định nghĩa macro file lst sau: DEC DPL MOV A,DPL CJNE A,#0FFh,skip00 DEC DPH Skip00: Nhãn cục không quan hệ với nhãn có tên chương trình trình biên dịch ASM51 tự động thêm vào mã số theo sau nhãn cục biên dịch Nhưng định nghĩa macro sau biên dịch ASM51 khơng đổi tên nhãn cục bộ: %*define (dec_dptr) local skip ( DEC DPL MOV A,DPL CJNE A,#0FFH,SKIP DEC DPH 109 Skip:) 7.8.3 Tác vụ repeat (lặp lại) Là macro xây dựng sẵn Assembler Cú pháp: %repeat (expression) (text) Trong expression biểu thức text văn cần lặp lại Ví dụ 28: để thực 100 lệnh NOP ta sử dụng macro repeat sau: %repeat(100) ( Nop ) Khi biên dịch file lst thay hàng lệnh 100 lệnh NOP 7.9 Cách viết chương trình hợp ngữ 7.9.1 Giới thiệu - Đặc điểm chương trình là: giảm bớt mức độ phức tạp, công việc hay tác vụ xử lý rõ ràng tiện lợi cho việc gỡ rối chỉnh sửa - Các kỹ thuật để phát triển chương trình: lập trình có cấu trúc, chương trình có cấu trúc chứa hệ phân cấp chương trình - Chỉ có cấu trúc chương trình: phát biểu, vòng lặp lựa chọn - Đặc tính cấu trúc: cấu trúc có điểm vào điểm - iASM51 cung cấp định nghĩa macro luồng điều khiển phép hợp dịch có điều 7.9.2 Phân tích a Phát biểu (statement) Ví dụ 29: Gán giá trị cho biến pseudo-code (mã giả) [count=0] Ví dụ 30: Gọi chương trình pseudo-code 110 Print_string(“select option”) Ví dụ 31: Khối phát biểu pseudo-code Begin [statement1] [statement2] [statement3] end b Cấu trúc lặp while/do: Ví dụ 32: Minh hoạ cấu trúc while/do cờ C = thực thi phát biểu: pseudo-code: while [c==1] [statement] mã 8051: enter: JNC skip (phát biểu) [statement] skip: (tiếp tục) Ví dụ 33: u cầu tốn: Chương trình tính tổng SUM chuỗi số: tổng số liệu dạng byte lưu ghi R7 địa bắt đầu vùng liệu lưu ghi R0, kết tổng lưu ghi A Với pseudo-code: [summ =0] while [chieu_dai>0] begin [sum= sum+@pointer] [pointer=pointer+1] ;tăng pointer [chieu_dai=chieu_dai - 1] ;giảm chiều dài end Với mã lệnh 8051 (viết theo pseudo-code) Sum: CLR A Loop: CJNE R7,#0, continues JMP exit ADD A,@R0 continues: 111 exit: INC R0 DEC R7 JMP Loop RET Với mã lệnh 8051 (viết gọn hơn) Sum: CLR A continues: ADD A,@R0 INC R0 DJNZ R7,continues RET Trong kiểu thứ chương trình viết gọn phải thoả điều kiện R7 > Ví dụ 34: Yêu cầu toán: sử dụng cấu trúc while/do để thực thi “phát biểu” ghi A khác 0Dh ghi R7 khác Pseudo-code: While [acc != 0DH and R7!= 0] [statements] Với mã lệnh 8051 (viết theo pseudo-code) enter: skip: CJNE A,#0DH, skip JMP exit CJNE R7,#0,statement JMP exit statement: … JMP enter Exit: c Cấu trúc vòng lặp repeat/until Ví dụ 35: u cầu tốn: viết chương trình tìm kiếm mã ký tự Z chuỗi ký tự (kết thúc ký tự rỗng) có địa bắt đầu lưu ghi R0 Thanh ghi A trả với ký tự ASCII “Z” có chuỗi ký tự, ngược lại ghi A chứa giá trị pseudo-code: 112 repeat [Acc=@pointer] [increament pointer] Until [acc ==’Z’ or Acc=0] Với mã lệnh 8051 (viết theo pseudo-code) statement: exit: MOV A,@R0 INC R0 JZ exit CJNE A,#’Z’,statement RET d Cấu trúc lựa chọn if/then/else Ví dụ 36: u cầu tốn: viết chương trình kiểm tra ghi A: MSB ghi A nạp giá trị FFH ngược lại nạp 00H vào ghi A pseudo-code: if [MSB ACC ==1] then [ACC = FFH] else [ACC=0] Với mã lệnh 8051 begin: statement1: statement2: RLC A JNC statement2 MOV A,#0FFH JMP exit CLR A exit: e Cấu trúc lựa chọn (case) Ví dụ 37: Yêu cầu tốn: Giả sử có chương trình có tên INCH gọi để đọc phím nhấn [‘0’, ‘1’, ‘2’, ‘3’] trả mã ASCII phím lưu ghi A Hãy viết chuỗi lệnh đọc phím nhấn thực thi đoạn lệnh tương ứng pseudo-code: case [kytu] of 113 ‘0’: [statement 0] ‘1’: [statement 1] ‘2’: [statement 2] ‘3’: [statement 3] End_case Với mã lệnh 8051 CALL inch CJNE A,#’0’,skip1 … ;xử lý cơng việc ứng với phím JMP exit ;kết thúc Skip1: CJNE A,#’1’,skip2 Xulyphim1: … ;xử lý công việc ứng với phím JMP exit Skip2: CJNE A,#’2’,skip3 Xulyphim2: … ;xử lý cơng việc ứng với phím JMP exit Skip3: CJNE A,#’3’,exit Xulyphim3: … ;xử lý công việc ứng với phím JMP exit Xulyphim0: v Phong cách lập trình: ü Chương trình phải rõ ràng quán điều quan trọng lập trình theo nhóm gồm nhiều người ü Cách đặt tên nhãn chương trình: nhãn gán lần chương trình Sử dụng nhãn phải làm cho việc đọc chương trình rõ ràng dễ dàng ü Với lệnh lặp lại nhãn nên đặt tên là: loop, back, more, … ü Với lệnh rẽ nhánh chương trình nhảy qua nhiều lệnh nên đặt tên nhãn là: skip, ahead,… ü Với lệnh rẽ nhánh chương trình đọc bit trạng thái nên đặt tên nhãn là: wait, again, 114 ü Có thể sử dụng tên nhãn xếp như: skip1, skip2, skip3, … ü Cách thích lệnh thích khối: khơng nên thích dòng mã lệnh mà thích lệnh có nghĩa ẩn Ví dụ 38: Các dòng lệnh sau cần thích: PUSH 00H ;cất R0 vào ngăn xếp MOV R0,#60h ;R0 quản lý vùng nhớ có địa ;chỉ 60h MOV R7,#31 ;R7 dùng làm đếm Ví dụ 39: Các dòng lệnh sau khơng cần phải thích lệnh rõ ràng: PUSH ACC ;cất A vào ngăn xếp INC R0 ;tăng R0 DEC r7 ;giảm đếm1 ü Các thích khối có bắt đầu chương trình thích bao gồm: - Tên chương trình - Chức giới hạn chương trình - Các điều kiện nhập xuất hay gọi liệu đầu vào liệu sau xử lý - Các chương trình khác sử dụng chương trình - Các ghi sử dụng v Một chương trình minh họa: ; -;tên chương trình: ;chức năng: ;dữ liệu vào: ;dữ liệu ra: ;các chương trình sử dụng: ;các ghi có sử dụng: ; -v Lưu trữ nội dung ghi khơi phục: 115 Khi gọi chương trình chương trình sử dụng số ghi để phục vụ cho việc xử lý nên phải tiến hành việc lưu liệu ghi vào ngăn xếp tiến hành lấy lại trước kết thúc chương trình v Tổ chức chương trình: Các phần chương trình xếp theo thứ tự sau: - Cho - Các lệnh khởi tạo trị - Chương trình - Các chương trình - Khai báo vùng liệu số - Các ô nhớ liệu RAM (sử dụng dẫn DS) 116 TÀI LIỆU THAM KHẢO Nguyễn Tăng Cường, Cấu trúc lập trình họ vi điều khiển 8051, Nhà xuất Khoa học Kỹ thuật 2008 Hồ Trung Mỹ, Vi xử lý, Nhà xuất Đại học Quốc gia Thành phố Hồ Chí Minh, 2013 Tống Văn On, Hoàng Đức Hải, Họ vi điều khiển 8051, Nhà xuất Lao động – Xã hội, 2001 I Scott MacKenzie, The 8051 Microcontroller, 2nd Edition, Prentice-Hall, 1995 Kenneth J Ayala, The 8051 Microcontroller: Architecture, Programming, and Applications, West Publishing Company, 2004 117 ... T2 MCS 52 Họ vi điều khiển MCS 52 có timer T0, T1, T2 Các timer T0 T1 có ghi hoạt động giống họ 51 Ở trình bày thêm phần hoạt động timer T2 Các ghi timer/counter T2 bao gồm: ghi TL2, TH2, ghi điều. .. T2EX đồng thời làm cho bit EXF2 = Tương tự cờ TF2 cờ EXF2 kiểm tra phần mềm tạo ngắt Bit EXF2 phải xóa phần mềm Hoạt động tự nạp timer T2 trình bày hình 5.15 5.8 .2 Chế độ thu nhận Khi RLCP = 12/ ... tượng 123 4 LINE SOURCE hàng mã nguồn) org 123 4h INC A JMP start org start +20 0 JMP start 123 4 04 123 5 80FD start: 12FC 12FC 4134 12FE 021 304 JMP finish 1301 121 307 10 CALL delay A 11 1304 14 12 finish: