Giáo trình Vi điều khiển: Phần 2

81 56 0
Giáo trình Vi điều khiển: Phần 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giáo trình Vi điều khiển: Phần 2 có kết cấu gồm 7 bài học. Nội dung phần này trình bày về bộ định thời, cổng nối tiếp, ngắt (Interrupt), phần mềm hợp ngữ. Giáo trình dành cho sinh viên trường nghề và những ai quan tâm đến vấn đề trên.

GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Bài 4: BỘ ĐỊNH THỜI Mở đầu Định thời hoạt động để kiểm soát thời gian thực thi câu lệnh trình xử lý vi điều khiển 8051 có hai định thời/ đếm Chúng dùng định thời để tạo trễ thời gian đếm để đếm kiện xảy bên VĐK Các timer timer 16bit, giá trị đếm tính từ đến 0xFFFF(đếm từ đến 65535) Mỗi Timer có chế độ hoạt động khác dùng để: - Đếm kiện chân T0 (chân 14) hay T1 (chân 15) - Chờ khoảng thời gian - Tạo tốc độ cho port nối tiếp Quá trình điều khiển hoạt động Timer / Counter thực thông qua ghi sau: Bảng 4.1 : Các ghi điều khiển hoạt động timer Thanh ghi Địa byte Địa bit TCON 88H 88H – 8FH TMOD 89H Không TL0 90H Không TL1 91H Không TH0 92H Không TH1 93H Không Hoạt động Timer / Counter gồm có ghi timer THx TLx (x = 0, 1) mắc liên tầng tạo thành dạng ghi 16 bit Khi set bit TRx ghi TCON, timer tương ứng hoạt động giá trị ghi TLx tăng lên sau xung đếm Khi TLx tràn (thay đổi từ 255 đến 0), giá trị THx tăng lên Khi THx tràn, cờ tràn tương ứng TFx (trong ghi TCON) đưa lên mức Tuỳ theo nội dung bit C/T xung đếm lấy từ dao động nội (C/T = 0) hay từ chân Tx bên (C/T = 1) Lưu ý phải xoá bit TRx thay đổi chế độ hoạt động Timer Khi xung đếm lấy từ dao động nội, tốc độ đếm = fOSC/12 hay fOSC/2 chế độ X2(nghĩa fOSC = 12 MHz tốc độ xung đếm MHz hay 90 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái µs có xung đếm chế dộ chuẩn) hay tốc độ đếm = fPER/6 (fPER: tần số xung ngoại vi – peripheral clock) Khi lấy xung đếm từ bên (các chân Tx), đếm tăng lên ngõ vào Tx mức chu kỳ xuống mức chu kỳ Do đó, tần số xung tối đa chân Tx fOSC/24 chế độ thường hay fOSC/12 chế độ X2 (=fPER/12) Thanh ghi SFR timer 2.1 Thanh ghi chế độ TMOD Cả hai định thời Timer Timer dùng chung ghi gọi TMOD để thiết lập chế độ làm việc khác định thời Thanh ghi TMOD ghi bít gồm có bít thấp thiết lập dành cho Timer bít cao dành cho Timer Trong hai bít thấp chúng dùng để thiết lập chế độ định thời, bít cao dùng để xác định phép toán TMOD Register MSB LSB GATE C/T M1 M0 GATE C/T Timer1 M1 M0 Timer0 Chức bit ghi TMOD: - Các bit M1, M0 : Là bít chế độ Timer Timer Chúng chọn chế độ định thời: 0, 1, Chế độ định thời 13 bit, chế độ định thời 16 bít chế độ định thời bít Chúng ta tập chung vào chế độ thường sử dụng rộng rãi chế độ Các chế độ thiết lập theo trạng thái M1 M0 sau : M1 M0 Mode Chế độ hoạt động 0 Chế độ định thời 13 bit 1 Chế độ định thời 16 bit, không định tỉ lệ trước Chế độ bit tự nạp lại 1 Chế độ định thời chia tách Ví dụ: Xác định chế độ định thời trường hợp sau: 91 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái a) MOV TMOD, #20H b) MOV TMOD, #12H Giải: Trường hợp a: TMOD = 20H = 00100000B Đối chiếu với ghi TMOD ta thấy chế độ định thời Timer chọn Trường hợp b: TMOD = 12H = 00010010 Đối chiếu với ghi TMOD ta thấy chế độ định thời Timer chế độ định thời Timer chọn  Bit C/T ( Counter / Timer): Bít ghi TMOD dùng để định xem định thời dùng máy tạo độ trễ hay đếm kiện + C/T = 1: Đếm xung từ bên + C/T = : Đếm xung nội bên Nguồn đồng hồ cho chế độ trễ thời gian tần số thạch anh 8051  Bit cổng GATE : Một bít khác ghi TMOD bít cổng GATE Để ý ghi TMOD ta thấy hai định thời Timer Timer có bít GATE Mỗi định thời thực điểm khởi động dừng Một số định thời hực điều phần mềm, số khác phần cứng số khác vừa phần cứng vừa phần mềm Các định thời 8051 có hai Việc khởi động dừng định thời khởi động phần mềm bít khởi động định thời TR TR0 TR1 2.2 Thanh ghi điều khiển TCON MSB TF1 LSB TR1 TF0 TR0 IE1 IT1 IE0 IT0 Bảng 4.2 :Hoạt động bit ghi TCON Bit Ký hiệu Địa Chức TF1 8FH Cờ tràn Time 1: TF1=1 timer bị tràn xóa phần mềm vi điều khiển thực chương trình phục vụ ngắt timer tự động xóa ln cờ tràn TF1 92 GT: Vi điều khiển TR1 Trường Cao đẳng nghề Yên Bái 8EH Bit điều khiển timer đếm/ ngừng đếm: TR1=1 timer phép đếm xung TR1=0 timer ngừng đếm xung TF0 8DH Cờ tràn timer 0( hoạt động tương tự TF1) TR0 8CH Bit điều khiển timer IE1 8BH 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 Khi vi điều khiển thực chương trình phục vụ ngắt INT1 tự động xóa ln cờ báo ngắt IE1 IT1 8AH Bit điều khiển cho phép ngắt INT1 tác động mức hay cạnh: IT1=0 ngắt INT1 tác động mức IT1=1 ngắt INT1 tác động cạnh xuống IE0 89H Giống IE1 phục vụ cho ngắt INT0 IT0 88H Giống IT1 phục vụ cho ngắt INT0 Ví dụ: Tìm giá trị TMOD muốn lập trình Timer chế độ sử dụng thạch anh XTLA 8051 làm nguồn đồng hồ sử dụng lệnh để khởi động dừng định thời TMOD = 00010000 Chế độ chế độ hai chế độ sử dụng phổ biến, nghiên cứu kỹ Các chế độ làm việc 8051 có timer timer timer Ta dùng ký hiệu TLx THx để ghi byte cao va byte thấp timer timer Như trình bày timer có chế độ hoạt động, sau chi tiết kiểu hoạt động timer : 93 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 3.1 Chế độ time 13 bit (Mode 0) Chế độ chế độ 13 bit bao gồm bit ghi THx bit ghi TLx bit cao ghi TLx khơng sử dụng Mỗi lần có xung đếm, giá trị ghi 13 bit tăng lên Khi giá trị thay đổi từ 1111 1111 1111b đến đếm tràn làm cho TFx đặt lên mức Do chế độ sử dụng 13 bit nên giá trị đếm tối đa 213 = 8192 Chế độ cung cấp nhằm mục đích tạo khả tương thích với 8048 thường khơng sử dụng Hình 4.1: Timer chế độ 13 bit 3.2 Chế độ time 16 bit (Mode 1) Dưới đặc trưng phép tốn Model - Đó định thời 16 bit, giá trị từ 0000 – FFFFH nạp vào ghi TL TH định thời - Sau định thời khởi động nhờ lệnh “SETB TR0” cho Timer “SETB TR1” cho Timer - Sau khởi động định thời bắt đầu đếm tăng Bộ định thời đếm lên đạt giới hạn FFFFH Khi quay vòng từ FFFFH bật cờ định thời TF (Timer Flag) lên mức cao - Bộ định thời sau đạt giá trị giới hạn thực quay vòng Để lặp lại trình đếm ghi TH TL phải nạp lại giá trị ban đầu cờ TF cần xoá 94 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Hình 4.2: Chế độ timer 16 bit Các bước lập trình chế độ 1: Để tạo trễ thời gian dùng chế độ định thời cần phải thực bước đây: - Bước 1: Nạp giá trị cho ghi TMOD xác định định thời (Timer O hay Timer 1) chế độ chọn - Bước 2: Nạp giá trị đếm ban đầu cho ghi TL TH - Bước 3: Khởi động định thời - Bước 4: Kiểm tra trạng thái bật cờ định thời Thốt khỏi vòng lặp TF bật lên - Bước 5: Dừng định thời - Bước 6: Xố cờ TF cho vòng - Bước 7: Quay trở lại bước để nạp lại giá trị cho TL TH.Để tính tốn thời gian trễ xác (với XTAL cụ thể) ta sử dụng hai cách tính Tính theo số hexa Tính theo số thập phân (FFFFH – YYXXH +1)xT Đổi YYXXH số thập phân Trong đó:YYXXH: Giá trị khởi tạo NNNNN Sau tính (65536 – NNNNN)xT TH, TL tương ứng T: Chu kỳ định thời Ví dụ 1: Viết chương trình tạo xung vuông độ dày 50% chân P0.1 sử dụng định thời Timer để tạo trễ CLR TF0 ;xoa co Timer MOV TMOD,#01H 95 ;su dung Timer che GT: Vi điều khiển HERE: Trường Cao đẳng nghề Yên Bái MOV TL0,#0F2H ;TL0 = F2H, byte thap MOV TH0,#0FFH ;TH0 = FFH, byte cao CPL P0.1 ;su dung chan P0.1 ACALL DELAY ;tao tre SJMP ;nap lai TH, TL HERE ;************* Tao tre dung Timer DELAY: SETB TR0 ;khoi dong bo dinh thoi Timer AGAIN: JNB TF0,AGAIN ;kiem tra cờ định thời CLR TR0 ; Xóa cờ định thời CLR TF0 ;xoa co Timer RET Với giả thiết tần số XTAL = 11,0592MHz ta tính thời gian tạo trễ sau Bộ định thời làm việc tần số đồng hồ 1/12 tần số XTAL ta có: f = 11, 0592/12 = 0, 9216MHz T = 1/f = 1/0, 9216 = 1, 085 s Thời gian chương trình DELAY (FFFFH – FFF2H +1) x1, 085 = 14x1, 085 = 15, 19 s Ví dụ 2: Giả sử tần số XTAL = 11, O592 MHz Hãy viết chương trình tạo xung có tần số 2KHz chân P1.5 Giải: - Chu kỳ sóng vng là: T = 1/f = 1/2KHz = O, 5ms = 5OO s - Khoảng thời gian cao (hoặc thấp) là: O, 5T = O, 5.5OO = 25O s - Số nhịp đếm cần khoảng thời gian là: 25O/1, O85 = 23O nhịp - Giá trị cần nạp vào ghi TH TL là: 65536 – 23O = 653O6 = FF1AH Chương trình viết sau: 96 GT: Vi điều khiển AGAIN: Trường Cao đẳng nghề Yên Bái CLR TF0 ;xoa co Timer MOV TMOD,#01H ;su dung Timer che MOV TL0,#1AH ;TL0 = 1AH, byte thap MOV TH0,#0FFH ;TH0 = FFH, byte cao SETB TR0 ;khoi dong bo dinh ;thoi Timer BACK: JNB TF0,BACK 3.3 Chế độ tự nạp lại bit ( Mode 2) Chế độ chế độ bit sử dụng ghi TLx đế chứa giá trị đếm ghi THx chứa giá trị nạp lại (do chế độ gọi chế độ tự động nạp lại – autoreload) Trong chế độ 2, giá trị ghi TLx thay đổi từ 1111 1111b đến cờ TFx set lên mức đồng thời giá trị ghi THx chuyển vào ghi TLx Như vậy, giá trị đếm TLx THx nạp lần khởi động timer (có thể khơng cần nạp cho TLx chu kỳ hoạt động timer sai) Chế độ sử dụng bit đếm ghi TLx nên giá trị đếm tối đa 28 = 256 Hình 4.3: Chế độ tự nạp lại bit 3.4 Chế độ tách biệt time ( Mode 3) Ở chế độ chức Timer chức Timer khác Bộ Timer chế độ chứa chức đếm nó, kết giống đặt TR1 = Bộ Timer chế độ thiết lập TH0, TL0 đếm riêng biệt Mạch 97 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái logic chế độ Timer thể hình 2.7 Bộ đếm TL0 điều khiển bit: C/(/T), GATE, TR0, /INTO đếm tràn thiết lập cờ ngắt TF0 Bộ đếm TH0 điều khiển bit TR1 đếm tràn thiết lập cờ ngắt TF1 Vậy TH0 điều khiển ngắt Timer/Counter Chế độ thường dùng yêu cầu cần có thời gian đếm ngồi bit Đối với Timer chế độ 3, AT89C51 có Timer/Counter 8052 có Khi Timer hoạt động chế độ Timer bật tắt chuyển mạch ngồi Ở chế độ Timer1 sử dụng cổng nối tiếp tạo tốc độ Baud ứng dụng mà khơng u cầu ngắt Hình 4.4: Chế độ tách biệt timer Nguồn cung cấp xung cho time Có thể sử dụng hai nguồn tạo xung nhịp cung cấp cho timer Chúng chọn cách ghi vào bit C/T ( count/timer) TMOD Một nguồn tạo xung nhịp dùng cho định khoảng thời gian, khác cho đếm kiện 4.1 Chức định thời Nếu C/T = hoạt động timer liên tục chọn timer dùng cho việc định khoảng thời gian Lúc timer lấy xung nhịp từ dao động chip Xung nhịp ngõ tạo dao động giảm tần số chia 12 trước cấp vào timer để thích hợp cho phần lớn ứng dụng Như với thạch anh 12 MHz, tốc độ xung nhịp cung cấp cho timer MHz Báo tràn timer xảy số ( cố định) xung nhịp, tùy thuộc vào giá trị ban đầu nạp vào ghi timer TLx / THx 4.2 Chức đếm kiện Nếu C/T = timer lấy xung nhịp từ nguồn bên Trong hầu hết ứng dụng, nguồn bên cung cấp cho timer xung xảy “ kiện” timer dùng đếm kiện Số kiện xác định phần mềm cách đọc ghi TLx/THx, giá trị 16 bit ghi tăng thêm cho kiện 98 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Nguồn xung nhịp cung cấp chân cổng Bit cổng (P3.4) dùng ngõ vào tạo xung nhịp bên cho timer gọi “T0”, P3.5 hay “T1” ngõ vào tạo xung nhịp cho timer Trong ứng dụng đếm, ghi timer tăng thêm tương ứng với chuyển trạng thái logic từ xuống ngõ vào bên (Tx) Ngõ vào bên lấy mẫu S5P2 chu kỳ máy Như vậy, ngõ vào cao chu kỳ thấp chu kỳ kế số đếm tăng thêm Giá trị xuất ghi S3P1 chu kỳ theo sau chu kỳ phát chuyển trạng thái Do cần chu kỳ máy ( 2µs) để ghi nhận chuyển trạng thái sang 0, tần số tối đa 500 KHz ( giả sử hệ thống hoạt động 12 MHz) Hinh 4.5: Sơ đồ cung cấp xung nhịp cho timer Khởi động, dừng, điều khiển timer Phương pháp đơn giản để bắt đầu ( cho chạy) dừng timer dùng bit điều khiển chạy ( TRx) TCON TRx bị xóa sau reset hệ thống, timer theo mặc định bị cấm ( bị dừng) sau reset TRx đặt lên phần mềm timer chạy Vì TRx ghi TCON có địa theo bit, nên việc cho chạy dừng timer thực dễ dàng chương trình Ví dụ : Cho time chạy lệnh : SETB TR0 Dừng lệnh : CLR TR0 Trình hợp dịch thực việc chuyển đổi ký hiệu cần thiết từ “ TR0” sang địa bit tương ứng Lệnh SETB TR0 giống SETB 8CH Một cách khác để điều khiển timer dùng bit GATE TMOD ngõ vào bên INTx Đặt GATE = cho phép timer điều khiển INTx, cách hữu dụng cho việc đo độ rộng xung Ví dụ để đo độ rộng xung ngõ vào INT0 thực sau : 99 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái - Toán tử SHR expr SHR n dịch sang phải n bit - Toán tử SHL expr SHL n dịch sang trái n bit - Toán tử AND expr AND expr and cặp bit tương ứng - Toán tử OR expr OR - Toán tử XOR expr XOR expr xor cặp bit tương ứng expr or cặp bit tương ứng Trong đó: expr biểu thức x số vị trí cần dịch 4.6 Tốn tử quan hệ ( relation operator) EQ = ( equal) NE Không nha ( not equal) LT < Nhỏ hơn( less than) LE Lớn ( greater than or equal) Kết trả ( FFFFH) sai ( 0000H) Ví dụ : MOV a,#5 = MOV a,#5EQ MOV a,#54 4.7 Các tốn tử khác - Tốn tử LOW expr có chức lấy kết byte thấp expr - Tốn tử HIGT expr có chức lấy kết byte cao expr Ví dụ : MOV dph,#high( 1234h) MOV dph,#12h 4.8 Thứ tự ưu tiên toán tử Danh sách quyền ưu tiên toán tử xếp theo thứ tự từ cao đến thấp theo bảng sau: Thứ tự Toán tử () High low */ MOD SHL SHR +- EQ NE LT LE GT GE = < >= 156 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái NOT AND OR XOR Khi tốn tử sử dụng có quyền ưu tiên ngang việc tính tốn giá trị bắt đầu tính từ trái sang phải 4.9 Các dẫn cho Assembler - Là thị lệnh cho assembler chia làm nhóm sau: - Điều khiển trạng thái assembler: ORG, END, USING - Định nghĩa kí hiệu: segment, equ, set, data, Idata, Xdata, bit, code - Khởi tạo hay định nghĩa nhớ : DS, DBIT, DB, DW - Liên kết chương trình: Pulic, extrn, name - Chọn đoạn: Rseg, Cseg, Dseg, Iseg, Bseg, Xseg 4.9.1 Các dẫn điều khiển trạng thái assembler - ORG: Có chức thay đổi đếm vị trí segment thời để đặt gốc chương trình cho phát biểu theo sau: Cấu trúc: ORG expr 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 - USING Có chức báo cho assembler biết băng ghi tích cực thời khơng thực chuyển băng ghi sử dụng ta phải sử dụng AR0 đến AR7 sau 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ấu trúc: USING expr - END Là phát biểu cuối tập tin nguồn sau dẫn END không xử lý 4.9.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 157 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái nghĩa dẫn ngoại trừ dẫn SET cho phép định nghĩa lại - EQU hay SET Có chức gán kí tự hay kí hiệu ghi cho tên ký hiệu đặt tả Cấu trúc: symbol equ expr symbol set expr - Segment : Có chức khai báo segment tái định vị Cấu trúc: 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 đối 8051 00H÷FFH với 8052 - Bit: Segment vùng nhớ bit nằm vùng nhớ cho phép truy xuất bit từ 20H÷2FH 4.9.3 Chỉ dẫn khởi tạo giá trị nhớ - DB ( define byte): Định nghĩa byte có chức khởi tạo vùng nhớ mã với giá trị kiểu byte Cấu trúc: [ label:] db expr [,expr] […] Trong : label nhãn người dùng định nghĩa expr biểu thức - DW ( define word) : Định nghĩa từ có chức khởi tạo vùng nhớ mã với kiểu giá trị word Cấu trúc : [ label :] dw expr [,expr] […] Trong : label nhãn người dùng định nghĩa expr biểu thức 4.9.4 Chỉ dẫn dành chỗ nhớ DS ( define storage) : Dùng định nghĩa vùng lưu trữ có chức dành cho vùng nhớ theo byte Chỉ dẫn sử dụng loại segment ngoại trừ DBIT Cấu trúc : [ label :] ds expr Trong : label nhãn người dùng định nghĩa expr biểu thức khơng có tham chiếu tới Khi gặp dẫn chương trình đếm vị trí segment tăng thêm số byte giá trị expr 4.9.5 Các dẫn liên kết chương trình Cho phép tập tin hợp dịch riêng liên lạc với cách cho phép tham chiếu tập tin đặt tên tập tin 158 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái - Public : Liệt kê ký hiệu sử dụng tập tin đối tượng khác Cách sử dụng : public symbol [,symbol] […] Trong đó: Kí hiệu symbol khai báo Public phải định nghĩa tập tin hành - Extrn : Liệt kê kí hiệu tham chiếu tập tin nguồn hành chúng khai báo tập tin khác Cấu trúc: extrn segment_type( symbol [,symbol] […] Các segment_type Code, Xdata, data, Idata, bit number - Name: Dùng đặt tên tập tin đối tượng sinh chương trình hành Cấu trúc: Name module_name Trong đó: Module_ name tên module 4.9.6 Các dẫn chọn Segment Segment khối chứa mã lệnh hay vùng nhớ chứa liệu tập tin nguồn hợp ngữ 8051 Khi assembler gặp dẫn chọn segment chuyển hướng mã liệu theo sau vào segment chọn gặp dẫn chọn segment khác - Kiểu RSEG ( relacatable segment- segment tái định vị được): Cho phép chọn segment tái định vị định nghĩa trước segment Cấu trúc: Rseg segment_name Chỉ dẫn chuyển hướng mã liệu theo sau vào đoạn segment_name gặp dẫn chọn segment khác - Các kiểu dẫn chọn segment CSEG/ DSEG/ ISEG/ XSEG cho phép chọn segment tuyệt đối Cấu trúc: aSEG [ at address] Trong a C, D, I, B X address địa Các điều khiển ASSEMBLER Ta đặt dòng điều khiển chương trình nguồn để điều khiển công việc liên kết xuất Mỗi dòng điều khiển bắt đầu kí tự chữ “$” theo sau danh sách từ khóa điều khiển cách khoảng trống Phần lớn từ khóa điều khiển có dạng tích cực khơng tích cực thường từ khóa điều khiển viết tắt kí tự Một số từ khóa điều khiển thông dụng liệt kê bảng sau: Tên điều khiển PAGELENGTH Viết tắt PL Mặc nhiên PL( 60) ( n) 159 Ý nghĩa Đặt số dòng tối đa cho trang tập tin kết xuất ( tầm vị trí từ GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 10 đến 65536) PAGEWIDTH(n) PW PW(20) XREF/NOXREF XR/NOXR NOXR Tạo bảng liệt kê tham chiếu chéo tất kí hiệu sử dụng chương trình EJECT EJ Tiếp tục kết xuất trang kế GEN/NOGEN GE/NOGE NOGE Tạo đầy đủ khai triển macro INCLUDE IC Chỉ tập tin có tên filename xem phần chương trình LIST/NOLIST LI/NOLI LI Đặt số kí tự tối đa cho dòng( tầm 72 đến 132) In dòng có mã nguồn liên tục tập tin kết xuất SAVE/RESTORE SA/RS Lưu trữ cài đặt điều khiển cho LIST GEN lấy lại từ ngăn xếp TITLE( string) Đặt chuỗi kí tự string đầu trang tối đa 60 kí tự TT Hoạt động liên kết 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 ngồi thay giá trị đặt vào tập tin xuất minh họa sau: Hình : Hoạt động chương trình linker có tên RL51 160 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái MACRO Phương tiện xử lý macro ASM51 phương tiện thay chuỗi kí tự Maccro 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 maccro 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: Là từ gợi nhớ người dùng định nghĩa macro_body: Là 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 them 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ụ: 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 trên: push dph push dpl tập tin lst 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 người lập trình bận rộn với chi tiết cấp thấp 7.1 Truyền tham số cho macro Macro với tham số truyền từ chương trình có dạng sau: 161 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái %*define ( macro_name ( parameter_list) (macro_body) Trong đó: Macro_name : Là tên macro Parameter_list : Là danh sách tham số Macro_body : Là thân macro Ví dụ: Định nghĩa macro có truyền tham số sau %*define (cmpa#(value)) ( Cjnz a,#%value,$+3 ) Thì gọi phải truyền tham số sau: %Cmpa#(20H) Khi biên dịch trở thành Cjnz a,#20H,$+3 Chú ý: Lệnh Cjnz lệnh byte $+3 địa lệnh nằm sau lệnh cjnz Ví dụ : Để thực lệnh nhảy lớn ta tạo macro sau: %*define (JGT(value,label)) ( Cjnz 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=0 có ý nghĩa lớn ) 7.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) Trong đó: Macro_name: Là tên macro Parameter: Là danh sách tham số List_of_labels: Là danh sách nhãn cục Macro_body: Là thân macro Ví dụ: Định nghĩa macro có nhãn cục sau: 162 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái %*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 ASM 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 Skip:) 7.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 đó: 163 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Expression : Là biểu thức Text : Là văn cần lặp lại Ví dụ : Để 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.4 Các tác vụ điều khiển ASM51 cung cấp định nghĩa macro luồng điều khiển phép hợp dịch có điều kiện phần mã Dạng lệnh macro sau : %IF (expression) THEN (balaneced_text) [ELSE (balaneced_text)] FI Trong đó: Expression: Là biểu thức Balaneced_text: Là văn cần thay đổi theo điều kiện Ví dụ: Để thực 100 lệnh NOP ta sử dụng macro repeat sau: Intenal equ ; 1=8051 serial I/O drivers ; 0=8052 serial I/O drivers %IF (intenal) THEN (inchar: ; 8051 driver … ; Các lệnh nhận kí tự hay liệu … Outchar: … ; Các lệnh truyền kí tự hay liệu … )ELSE (inchar: … ; 8052 driver ; Các lệnh truyền kí tự hay liệu … Outchar: … ; Các lệnh truyền kí tự hay liệu … 164 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái ) Nếu biến INTENAL = thực việc truyền liệu theo kiểu 8051 INTENAL = truyền liệu theo kiểu 8052 Luyện tập 8.1 Phương pháp viết chương trình hợp ngữ - 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 : Các 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: 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 - Có thể sử dụng tên nhãn xếp như: skip 1, skip 2, skip 3… - Có 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 - Chỉ có cấu trúc chương trình: Các phát biểu, vòng lặp lựa chọn Mỗi cấu trúc có điểm vào điểm 8.2 Luyện tập Bài tập 1: Minh họa cấu trúc while/do cờ C=1 Bài làm: Chương trình minh họa cấu trúc while/do cờ C=1 Pseudo-code While [c==1] [ statement] Mã 8051 enter: JC skip ( phát biểu) skip: ( tiếp tục) Bài tập 2: 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 Bài làm: 165 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 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 dai end Với mã lệnh 8051 ( viết theo pseudo-code) Sum : clr a Loop : cjne r7,#0,continues Jmp exit Continues : add exit : a,@r0 inc r0 dec r7 jmp loop ret Với mã lệnh 8051 ( viết gọn hơn) Sum : clr Continues : add Inc a a,@r0 r0 Djnz r7,continues Ret Trong kiểu thứ chương trình viết gọn phải thỏa mãn điều kiện R7 > Bài tập : 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 Bài làm: Pseudo-code: While [ acc !=0 and R7!=0] [ statements] Với mã lệnh 8051 ( Viết theo pseudo-code) enter: cjne a,#0DH,skip 166 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái jmp skip: exit cjne R7,#0,statement jmp exit statement: … jmp enter Exit: Bài tập : 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ị 0.( Sử dụng cấu trúc lặp) Bài làm: Pseudo-code repeat [ Acc=@pointer] [increament pointer] Until [acc=’Z’ or Acc=0] Với mã lệnh 8051 ( viết theo pseudo-code) Statement: mov a,@ro inc ro jz exit cjne a,#’Z’,statement exit: ret Bài tập : 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 ( Sử dụng cấu trúc lựa chọn if/then/else Bài làm: pseudo-code if [ MSB ACC==1] then [ACC=FFH] else [ACC=0] 167 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái Với mã lệnh 8051 begin: rlc a jnc statement1: statement2 mov a,#0ffh statement2: jmp exit clr a exit: Bài tập : 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 Bài làm : pseudo-code case [kytu] of ‘0’: [statement 0] ‘0’: [statement 0] ‘0’: [statement 0] ‘0’: [statement 0] End-case Với mã lệnh 8051 Call inch Cjne a,#’0’,skip Xulyphim0: … ; xử lý công việc ứng với phím Jmp exit ;kết thúc Skip 1: cjne a,#’1’,skip 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 Skip 3: Cjne a,#’3’,exit Xulyphim3: … ; xử lý cơng việc ứng với phím Jmp exit 168 GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái 8.3 Bài tập Viết lại lệnh sau với phần toán hạng điều khiển số nhị phân MOV A, # 255 MOV A, # 11Q MOV A, # 1AH MOV A, # ‘A’ Có điểm sai câu lệnh sau? ORL ØH, # FØH Các ký hiệu sau có sai? ? byte.bit @ GOOD-bye 1ST – FLAG MY – PROGRAM Viết lại lệnh sau với biểu thức tính số hexa 16 bít MOV DPTR , # ‘Q’ EQ 48 MOV DPTR , # HIGH ‘AB’ MOV DPTR , # -1 MOV DPTR , # NOT (257 MOD 256) Kiểu đoạn định nghĩa theo ASM51 gì? Và chúng biểu diễn vùng nhớ nào? Một đoạn định vị lại vùng nhớ RAM nội định nghĩa chọn nào? Cách tạo vùng đệm 100 byte (Cho biết tên đoạn 0FFCHIP tên vùng đệm XBUFFER) Một ứng dụng cần bít trạng thái (FLAG đến FLAG 5) Một vùng đệm bít đoạn BIT tuyệt đối bắt đầu địa bít Ø 8H định nghĩa nào? Cho biết hai ưu điểm dùng dẫn EQU Sự khác dẫn DB DW gì? 10 Cho biết phân bố nhớ dẫn sau ORG Ø FH DW $ SHL DB 65535 DW ‘Q’ 11 Dùng dẫn để chọn đoạn mã lệnh tuyệt đối? 12 Một file có chứa 33 dẫn equote (tương đương) NUL 00H ; null byte SOH EQU 01H ; start of header ; 169 EQU GT: Vi điều khiển Trường Cao đẳng nghề Yên Bái US EQU 1FH ; unit separater DEL EQU 7FH ; delete Làm cách để dẫn nhận file khác mà không cần dùng dẫn EQU file đó? 13 Làm để in file liệt kê, chương trình ln vị trí bắt đầu trang? 14 Định nghĩa macro dùng để điền liệu vào vùng RAM Địa bắt đầu, độ dài giá trị liệu truyền thông số 15 Hãy viết định nghĩa macro sau JGE - jump to LABEL if accumulator is greater than or equal to VALUE JLT - jump to LABEL if accumulator is less than VALUE JLE - jump to LABEL if accumulator is less than or equal to VALUE JOR - jump to LABEL if accumulator is outside the range LOWER and UPPER 16 Định nghĩa macro có tên CJNE-DPTR để nhảy đến LABEL DPTR không chứa VALUE Định nghĩa macro cho nội dung tất ghi nhớ không bị ảnh hưởng 170 ... xung chân T2 (P1.0) chọn chế độ bit C/ ghi T2CON Họ vi điều khiển 80 52 có timer T0,T1,T2 Các timer T0 T1 có ghi hoạt động giống họ 8051 Ở trình bày thêm phần hoạt động timer T2 Các ghi điều khiển... T2CON, T2MOD, RCAP2H, RCAP2L, TH2 TL2 Timer T2 80 52 có chế độ hoạt động: Chế độ tự động nạp lại, chế độ thu nhận Các bit chọn chế độ mô tả bảng sau : Bảng 4.3 : Chức bít chọn chế độ 1 02 GT: Vi. .. ghi điều khiển T2CON TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2 Bảng 4.4 : Chức bit ghi T2CON mô tả bảng sau : Bit Ký hiệu Địa Chức TF2 CFH Cờ tràn timer : Hoạt động giống timer ( TF2 không thiết

Ngày đăng: 12/02/2020, 22:13

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan