4
Thc hin trờn Pinnacle
ễn tp li ton b kin thc ó hc
=============================================
Vi du 1: Ch-ơng trình đọc bảng dữ liệu và ghi vào vùng nhớ RAM
Chạy ch-ơng trình và quan sát vùng Internal RAM
ORG 00H
MOV DPTR, #MYDATA ; nap dia chi dau tien cua bang
MOV R0, #40H ; nap dia chi dau tien cua nho ram
BACK: CLR A ; xoa A=0
MOVC A,@A DPTR ; doc bang
JZ KT ; Nhay den KT neu gap 0 ket thuc chuoi
MOV @R0, A ; Nap bang vao ram
INC R0 ; Tang dia chi ram
INC DPTR ; Tang dia chi bang
SJMP BACK ;Tro ve nhan Back de doc lai
KT: SJMP KT ; cho tai cho
ORG 300H ; bat dau dia chi bang
MYDATA: DB "HA NOI", 0 ; du lieu bang ket thuc la 0
END
=====================================================
Vớ d 2 : Ch-ơng trình định thời tạo thời gian trể chế độ 1.
Chy tng lnh ca chng trỡnh v quan sỏt b nh thi.
ORG 00H ; bắt đầu ch-ơng trình từ địa chỉ 00H
MOV TMOD, #01H ; Timer0 ở chế độ 1 (đếm 16 bit tới FFFFH)
MOV TL0, #0F2H ; nạp TL0 = #0F2H
MOV TH0, #0FAH ; nạp TH0 = # 0FAH
MOV P0, #55h ; đ-a ra cổng P0 giá trị 55H
SETB TR0 ; bắt đầu đếm định thời gian trễ
HERE: JNB TF0, HERE ; chờ cờ tràn TF0 = 1
CLR TR0 ; ngừng đếm
CLR TF0 ; xoá cờ tràn
SJMP $ ; kết thúc ch-ơng trình bằng lệnh nhẩy tại chỗ
END ; kết thúc ch-ơng trình dịch
===========================================================
Vớ D 3. Ch-ơng trình định thời tạo thời gian trễ ở chế độ 2.
ORG 00H ; bắt đầu ch-ơng trình từ địa chỉ 00H
MOV TMOD, #20H ; Timer1 ở chế độ 2 (đếm 8 bit từ TH1)
MOV TH1, #0FDH ; nạp TH0 cho ttốc độ baud 9.6KHz
MOV TL1, TH1 ; nạp TL1 = TH1 = #0FDH
SETB TR1 ; bắt đầu đếm định thời gian trễ
HERE: JNB TF1, HERE ; chờ cờ tràn TF0 = 1
CLR TR1 ; ngừng đếm
CLR TF1 ; xoá cờ tràn
SJMP $ ; nhẩy ti ch
END ; kết thúc ch-ơng trình dịch
Vớ D 4. Ch-ơng trình định thời tạo thời gian trễ 1phút = 60 sec
Chy chng trỡnh bn s thy chng trỡnh ngng chy sau khong 65 giõy. Sa chng
trỡnh cú thi gian tr 10, 20, 30, 40, 50 giõy
ORG 00H ; Start at 00H
Formatted: Font: 12 pt, Font color: Custom
Color(RGB(8,8,8))
Formatted: Top: 1.5 cm, Bottom: 1.5 cm,
Gutter: 1.5 cm
Formatted: Font color: Custom
Color(RGB(8,8,8))
Formatted: Font: 12 pt, Font color: Custom
Color(RGB(8,8,8))
Formatted: Font color: Custom
Color(RGB(8,8,8))
Formatted: Font: 12 pt, Font color: Custom
Color(RGB(8,8,8))
Formatted: Font color: Custom
Color(RGB(8,8,8))
Formatted: Font: 12 pt, Font color: Custom
Color(RGB(8,8,8))
5
MOV R0, #20 ; Setup R0=20
MOV R1, #60 ; Setup R1=60
MOV TMOD,#01H ; Timer0 mode 1
DL: MOV DPTR, #15536 ; Counter 50000
MOV TL0, DPL
MOV TH0, DPH
SETB TR0
JNB TF0, $ ;Wait TF0 = 1 after 50000?sec
CLR TF0
CLR TR0
DJNZ R0, DL ; 1ses
MOV R0, #20
DJNZ R1, DL
END
====================================================
Ví dụ 5. Sử dụng 2 bộ định thời tạo xung chữ nhật tần số 2000Hz thời gian ở mức cao bằng 4 lần
thời gian ở mức thấp. (dưới đây là code chương trình, các bạn tự tìm hiểu và ghi lời giải thích
cho các dòng lệnh ) chạy chương trình, quan sát các bộ định thời làm việc
ORG 00H
MOV TMOD, #00100001B
LOOP:
SETB P0.3
ACALL DELAY0
CLR P0.3
ACALL DELAY1
LJMP LOOP
DELAY0: MOV TL0, #70H
MOV TH0, #FEH
SETB TR0
L0: JNB TF0, L0
CLR TR0
CLR TF0
RET
DELAY1: MOV TH1, #156
SETB TR1
L1: JNB TF1, L1
CLR TR1
CLR TF1
RET
END
Bài Tập ứng dụng định thời
(không sử dụng ngắt)
Trên cơ sở các ví dụ trên viết chương trình:
A. Tạo xung vuông f=2 KHz trên P1.7, dùng bộ định thời 1 ở Mode 2 (auto reload)
B. Tạo xung vuông f=50 Hz ở P1.7, dùng bộ định thời 1 ở Mode 1 (16 bit)
C. Tạo xung chữ nhật tần số 2000Hz thời gian ở mức cao bằng 2/3 lần thời gian ở mức thấp
(sử dụng bộ định thời)
D. Tạo xung chữ nhật tần số 2000Hz thời gian ở mức cao bằng 2/3 lần thời gian ở mức
thấp(không sử dụng bộ định thời)
6
================
Bi Tp ng dng nh thi
s dng ngt
S dng ngt ca cỏc b nh thi vit chng trỡnh
A. To xung vuụng f=2 KHz trờn P1.2, dựng b nh thi 1 Mode 2 (auto reload)
B. To xung vuụng f=50 Hz P1.2, dựng b nh thi 1 Mode 1 (16 bit)
C. To xung ch nht tn s 3000Hz thi gian mc cao bng 2/3 ln thi gian mc thp
THC HNH TRấN CHNG TRèNH Mễ PHNG
1. Soạn thảo, hợp dịch, cho chạy thử các ví dụ trên ch-ơng trình PINNACLE.
Ví dụ 1: Ch-ơng trình đ-a dữ liệu ra cổng (chy )
ORG 00H ; bắt đầu ch-ơng trình bằng địa chỉ nhớ 00h
MOV A, # 55h ; gán thanh ghi A bằng giá trị tức thì 55H
MOV P0, A ; đ-a ra cổng P0
MOV A, #0AAH ; gán thanh ghi A bằng giá trị tức thì 0AAH
MOV P1, A ; đ-a ra cổng P0
MOV A, #0FFH ; gán thanh ghi A bằng giá trị tức thì OFFH
MOV P2, A ; đ-a ra cổng P0
END ; kết thúc ch-ơng trình
Ví dụ 2: Ch-ơng trình dùng lệnh JMP addr. có vòng lặp vô hạn
ORG 00H ; ch-ơng trình trong vùng các vectơ ngắt
MOV A, # 55H ; nạp giá trị 55h vào A
NHAN: MOV P0, A ; gửi a ra cổng P0
MOV P1,A ; gửi a ra cổng P1
MOV P2,A ; gửi a ra cổng P2
SJMP NHAN ; trở về NHAN
END ; kết thúc dịch
Ví dụ 3: Ch-ơng trình dùng lệnh JMP addr. có kết thúc chờ
ORG 00H
LJMP MAIN ; nhẩy tới nhãn MAIN trong vùng địa chỉ 30H
ORG 30H; bỏ qua vùng nhớ dành cho các vectơ ngắt
MAIN: MOV A, # 55H ; ch-ơng trình nằm ngoài vùng vectơ ngắt
MOV P0, A
MOV P1,A
MOV P2,A
SJMP $ (hay HERE: SJMP HERE); chờ tại chỗ
End ; kết thúc dịch
Ví dụ 4: Ch-ơng trình dùng lệnh JMP @A+DPTR
MOV DPTR, # JMP_TBL
MOV A,#6 ;thay doi gia tri nap vao A va xem ket qua
JMP @A+DPTR
JMP_TBL:
AJMP LABEL0
AJMP LABEL1
AJMP LABEL2
AJMP LABEL3
7
LABEL0: MOV P0,#1h
LABEL1: MOV P1,#15h
LABEL2: MOV P2,#25h
LABEL3: MOV P3,#35h
END
Ví dụ 5: Ch-ơng trình có gọi ch-ơng trình con tạo trễ dùng DJN
ORG 00H
MOV R1, # 25
CALL DELAY ; gọi ch-ơng trình con
MOV P0, #0ABH ; đ-a ra cổng P0 giá trị ABH
SJMP $ ; chờ tại chỗ
DELAY: MOV R0, # 10 ; nạp R0 giá trị 10D
NHAN0:DJNZ R0, NHAN0 ; giảm R0 và nhẩy tại chỗ
DJNZ R1, DELAY ; giảm R1, nhẩy về DLAY nếu khác 0
RET ; kết thúc ch-ơng trình con DELAY
END ; kết thúc ch-ơng trình hợp dịch
Ví dụ 6: Ch-ơng trình dùng CJNE
ORG 00H
MOV A, # 05H ; nạp giá trị 05h vào A
NHAN: INC A ; tăng A lên 1
CJNE A, # 10H, NHAN ; so sánh a với 10H, nếu
; A<10H, nhẩy về NHAN
MOV P0,A ; khi A= 10H, gửi a ra cổng P0
SJMP $ ; kết thúc bằng chờ tại chỗ
END ; kết thúc dịch
Ví dụ 7: dùng CJNE và JNC
ORG 00H
LJMP MAIN ; nhẩy tới ch-ơng trình chính
ORG 30H
MAIN: MOV P1, #OFFH ; khởi tạo cổng P1 làm cổng vào
MOV A, P1 ; đọc cổng vào P1 vào A
CJNE A, #75, OVER ; so sánh với #75, nếu không, nhẩy tới OVER
SJMP EXIT ; nhẩy tới EXIT
OVER: JNC NEXT ; nếu CY = 0 khi A > 75 thì nhẩy tới NEXT
MOV R1, A ; nếu CY=1 khi A< 75 thì l-u A vào R1
SJMP EXIT ; nhẩy tới EXIT
NEXT: MOV R2, A ; l-u A vào R2 nếu > 75
E XIT : MOV P2, A ; đ-a hiển thị ra cổng pP2 nếu A = 75
SJMP $ ; kết thúc chờ
END ; kết thúc ch-ơng trình dịch
Chú ý : có thêm lệnh rẽ nhánh tiếp JNC NEXT vì có ba ph-ơng án lựa chọn
Ví dụ 8: Ch-ơng trình rẽ nhánh khi có cờ tràn TF0
ORG 00H
LJMP MAIN
ORG 30H
MAIN: CLR TF0 ; xoá cờ tràn
MOV TMOD, #01H ; ghi chế độ Timer1 M = 1
MOV TH0,#50H ; nạp TH0 = # 50H
MOV TL0, # 50H ; nạp TH0 = # 50H
8
SETB TR0 ; xác lập TR0 để Timer0 bắt đầu đếm
HERE: JNB TF0, HERE ; chờ bit TF0= 1
CLR TF0 ; xoá TF0
CLR TR0 ; xoá TR0 để Timer0 ngừng đếm
SJMP $
END
Ví dụ 9: ch-ơng trình ghi vo một vùng nhớ từ địa chỉ 60H tới 80H giá trị ff.
MOV 61h, 123
MOV R0, #60H ; nạp địa chỉ 60H cho R0
LOOP:MOV @R0, #0ffH ; ghi vào ô nhớ có địa chỉ 60H
INC R0 ; tăng R0 hay địa chỉ
CJNE R0, #80H, LOOP ; so sánh R0 = 80H ch-a, nếu ch- bằng, nhẩy về LOOP
Ví dụ 10: ch-ơng trình xoá một vùng nhớ từ địa chỉ 60H tới 80H.
MOV 61h, 123
MOV R0, #60H ; nạp địa chỉ 60H cho R0
LOOP:MOV @R0, #00H ; xoá ô nhớ có địa chỉ 60H
INC R0 ; tăng R0 hay địa chỉ
CJNE R0, #80H, LOOP ; so sánh R0 = 80H ch-a, nếu ch- bằng, nhẩy về LOOP
Ví Dụ 11. Các lệnh MOV với các loại địa chỉ đích và nguồn
ORG 00H
MOV A, #35H ; số 35H gửi vào thanh ghi A
MOV R1, #35H ; số 35H gửi vào thanh ghi R1
MOV 12H, #35H ; số 35H gửi vào ô nhớ địa chỉ 12H
MOV @R1, #35H ; số 35H gửi vào ô nhớ địa chỉ trong R1
MOV A, R1 ; nội dung thanh ghi R1 gửi vào A
MOV A, 25H ; nội dung ô nhớ địa chỉ 25H gửi vào A
MOV A, @R1 ; nội dung ô nhó địa chỉ ở R1 gửi vào A
MOV R2, A ; nội dung thanh ghi A gửi vào R2
MOV R2, 25H ; nội dung ô nhớ địa chỉ 25H gửi vào R2
MOV 10H, A ;thanh ghi A gửi vào ô nhớ địa chỉ 10H
MOV 10H, R1 ;thanh ghi R1 gửi vào ô nhớ địa chỉ 10H
MOV 10H, 12H ; ô nhớ địa chỉ 12H gửi vào ô nhớ địa chỉ 10H
END
===========================================================
Ví dụ 12. Nạp 20H ô nhớ ngoàI kể từ địa chỉ 2000H với giá trị 0FFH
ORG 00H
MOV DPTR, # 2000H ; nạp địa chỉ nhớ ngoài
MOV R1, #20H ; nạp số ô nhớ
MOV A, #0ffH ; ghi vào thanh ghi A
AGAIN: MOVX @DPTR , A ; nạp vào ô nhớ ngoài ở địa chỉ DPTR
INC DPTR ; tăng địa chỉ nhớ ngoài
DJNZ R1, AGAIN ; lặp lại 20H lần
END
=====================================================================
========
Ví dụ 13. Các lệnh hoán chuyển XCH, XCHD
ORG 00H
MOV R1,#20h
MOV A, #0A5H ; gửi #0A5H vào A
MOV R0, # 5AH ; gửi #05AH vào R0
MOV P0, A ; đ-a ra cổng P0
9
XCH A, R0 ; hoán chuyển 8 bit của A với R0
MOV P1, A ; đa ra cổng P1
MOV P0, A ; đa ra cổng P0
MOV P1, A ; đa ra cổng P1
XCHD A,@R1 ; hoán chuyển 4 bit thấp của R0 với A
MOV P0, A ; đa A ra cổng P0
MOV A, R0 ; chuyển R0 vào A
XCHD A, @R1
MOV P1, A ; đa R0 ra cổng P1
END
Ví dụ 14. Lệnh PUSH / POP trong chơng trình con
ORG 00H
LOOP: MOV A, #55H ; gửi #55H vào A
MOV P0, A ; đa ra cổng p0
CALL DELAY ; gọi trễ
MOV A, #0AAH ; đa #0AAH vào A
CALL DELAY ; gọi trễ
JMP LOOP ; trở về LOOP
DELAY:
PUSH 0E0H ; lu trữ A vào ngăn xếp có địa chỉ là SP = 08H
PUSH PSW ; lu trữ A vào ngăn xếp có địa chỉ là SP = 09H
MOV R1, #10 ; gửi #100H vào R1
HERE: DJNZ R1, HERE ; gim R1, nếu ch-a bngng 0, lại lặp lại
MOV A, #20H
POP PSW ; trả về giá trị PSW từ ngăn xếp có địa chỉ 09H
POP 0E0H ; trả về giá trị PSW từ ngăn xếp có địa chỉ 08H
RET ; trở về chng trình chính
END ; kết thúc chng trình dịch