LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN 1.1 THÍ NGHIỆM .3 1.2 THÍ NGHIỆM .3 1.3 THÍ NGHIỆM .4 1.4 THÍ NGHIỆM .5 CHƯƠNG HIỂN THỊ LED ĐOẠN 2.1 THÍ NGHIỆM .6 2.2 THÍ NGHIỆM .7 2.3 THÍ NGHIỆM .8 2.4 THÍ NGHIỆM .8 CHƯƠNG GIAO TIẾP LCD VÀ ADC 10 3.1 THÍ NGHIỆM .10 3.2 THÍ NGHIỆM .11 3.3 THÍ NGHIỆM 3, 13 CHƯƠNG LẬP TRÌNH GIAO TIẾP TIMER VÀ SERIAL PORT 17 4.1 THÍ NGHIỆM .17 4.2 THÍ NGHIỆM .17 4.3 THÍ NGHIỆM .18 4.4 THÍ NGHIỆM .19 CHƯƠNG LẬP TRÌNH NGẮT .23 5.1 THÍ NGHIỆM .23 5.2 THÍ NGHIỆM .24 5.3 THÍ NGHIỆM .25 5.4 THÍ NGHIỆM .27 CHƯƠNG LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN 1.1 THÍ NGHIỆM 1.1.1 Yêu cầu Viết chương trình thực việc đọc liên tục trạng thái nút nhấn nối đến P1.0 hiển thị led nối chân P3.0
LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN
THÍ NGHIỆM 1
Viết chương trình để liên tục đọc trạng thái của nút nhấn kết nối với P1.0 và hiển thị kết quả trên đèn LED nối tại chân P3.0 (bit thứ 0 của đèn LED thanh BL202).
ORG 2000H %% bắt đầu chương trình tại địa chỉa 2000H
LOOP: %% khởi tạo vòng lặp
SETB P1.0 %% set chân P1.0, khi nhấn nút nó trả về 0
MOV C, P1.0 %% đọc giá trị chân P1.0 vào bit carry
MOV P3.0,C %% đọc giá trị cờ carry xuất ra P3.0
SJMP LOOP %% nhảy về vòng lặp
THÍ NGHIỆM 2
Viết chương trình tạo xung vuông 1 Hz, chu kỳ nhiệm vụ 50% trên P1.0.
ACALL DELAY05MS %% gọi chương trình con delay 0.5ms
SJMP CONT %% nhảy về cont
DELAY05MS: %% chương trình con delay 0.5ms
MOV R7,#230 %% move R7 giá giá trị 230
DJNZ R7,LOOP %% giảm R7 xuống 1 nếu chưa về 0 quay trở lại vòng lặp RET
Vòng trễ được tạo ra với thời gian trễ 0.5ms Mỗi vòng lặp DJNZ có thời gian thực thi là 2 chu kỳ máy, và mỗi chu kỳ máy tương đương với 12 chu kỳ thạch anh Đặt n là số lần lặp, ta có công thức: 0.5(10^-3) = 2n.Tmáy = 2n.12Txtal Từ đó, n được tính toán là n ≈ 0.4, do đó ta chọn n ≈ 0.
THÍ NGHIỆM 3
Viết chương trình con Delay1sIns và dùng chương trình con này để chớp/tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s.
LOOP: %% bắt đầu vòng lặp
ACALL DELAY1SINS %% gọi chương trình con delay1sins
SJMP LOOP %% nhảy về vòng lặp
DJNZ R5,LOOP3 %% nếu R5 chưa bằng 0 quay về vòng lặp 3
DJNZ R6,LOOP2 %% nếu R6 chưa bằng 0 quay về vòng lặp 2
DJNZ R7,LOOP1 %% nếu R7 chưa bằng 0 quay về vòng lặp 1
THÍ NGHIỆM 4
Chương trình tạo hiệu ứng quay LED sẽ làm cho các LED đơn trên BARLED1 sáng lần lượt từ trái sang phải trong khoảng thời gian 1 giây và lặp lại liên tục Để thực hiện điều này, chúng ta sẽ sử dụng chương trình con đã được viết trước đó với thời gian 1 giây.
ACALL DELAY1SINS %%gọi lại chương trình con delay1sins
CPL P1.6 ACALL DELAY1SINS CPL P1.6
CPL P1.7 ACALL DELAY1SINS CPL P1.7
SJMP LOOP %% nhảy về lại vòng lặp
DELAY1SINS: %% chương trình con delay1sins
DJNZ R5,LOOP3 DJNZ R6,LOOP2 DJNZ R7,LOOP1 RET
HIỂN THỊ LED 7 ĐOẠN
THÍ NGHIỆM 1
Viết chương trình con DisplayLed0 hiển thị lên LED 7 đoạn số 0 giá trị chứa trong thanh ghi R0.
Viết chương trình chính hiển thị số 9 lên LED 7 đoạn số 0 bằng cách cho R0 bằng 9 và gọi chương trình con DisplayLed0.
Viết chương trình con DisplayLed0 hiển thị lên LED 7 đoạn số 0 giá trị chứa trong thanh ghi R0.
DISPLAYLED0: %%chương trình con displayled0
MOV A,R0 %% đưa giá trị R0 vào thanh ghi A
ADD A,#0E0H %% cộng E0H với R0 ( E: cho dẫn led0, R0: số BCD)
MOV DPTR,#0000H %% trỏ DPTR đến địa chỉ IC 573 của led 7 đoạn
MOVX @DPTR,A %% ghi giá trị ra IC 573
RET %% kết thúc chương trình con
Viết chương trình chính hiển thị số 9 lên LED 7 đoạn số 0 bằng cách cho R0 bằng
9 và gọi chương trình con DisplayLed0.
ACALL DISPLAYLED0 %% gọi chương trình con displayled0
THÍ NGHIỆM 2
Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số từ 0 đến 9 sau các khoảng thời gian 1s.
MOV R0,#0 %% hiện số 0 đầu tiên
LOOP: %% khởi tạo vòng lặp
ACALL DISPLAYLED0 %% gọi chương trình con displayled0 INC R0 %% tăng R0 lên 1 đơn vị
ACALL DELAY1S %% gọi chương trình con delay1s
CJNE R0,#10,LOOP %%R0 khác 10 thì quay lại loop để hiện thị số tiếp theo
SJMP LOOP %% quay lại vòng lặp để tiếp tục
DISPLAYLED0: %% chương trình con displayled0
DELAY1S: %% chương trình con delay1s
MOV TMOD, #01H %%cài đặt timer0 mode 1 (16 bit) MOV TH0,#HIGH(-50000) %%đặt timer0 đến tới 50000MC
SETB TR0 %%cho chạy timer0 JNB TF0,$ %%chờ cho timer0 tràn
CLR TF0 %%xóa cờ báo tràn CLR TR0 %%dừng timer0 DJNZ R7,TIMELOOP %%lặp lại 20 lần 0.05s cho đủ 1s
RET %%kết thúc chương trình con
THÍ NGHIỆM 3
Viết chương trình con DisplayLED xuất giá trị chứa trong thanh ghi R0 lên LED 7 đoạn có số thứ tự chứa trong thanh ghi R1.
R0 nằm trong tầm từ 0-9 và R1 trong tầm từ 0-3.
Sau đó dùng chương trình con này viết chương trình chính xuất giá trị 1 lên LED 7 đoạn số 3.
MOV R1,#03 ;R1 chứa vị trí led
MOV R0,#07 ;R0 chứa giá trị led
TABLE: DB 0E0H,0D0H,0B0H,70H ;bảng giá trị chọn led
THÍ NGHIỆM 4
Chương trình sẽ hiển thị số 1 trên LED 7 đoạn 0, sau đó chuyển sang số 2 trên LED 7 đoạn 1 sau 1 giây, tiếp theo là số 3 trên LED 7 đoạn 2 sau 1 giây, và cuối cùng là số 4 trên LED 7 đoạn 3 sau 1 giây Quá trình này sẽ lặp lại liên tục Việc hiển thị được thực hiện thông qua chương trình con DisplayLED đã được viết trước đó.
Giảm thời gian trễ xuống còn 100 ms Quan sát hiện tượng.
Tính toán thời gian trễ sao cho không còn thấy LED nhấp nháy và áp dụng vào chương trình
Giảm thời gian trễ xuống bằng 0 (không sử dụng hàm delay) Quan sát hiện tượng.
MOV R0,#01H ACALL XUAT ACALL DL SJMP MAIN
;chương trình xuất giá trị chứa trong R0 và vị trí led chứa trong R1 XUAT:
MOV A,R1 MOV DPTR,#TABLE MOVC A,@A+DPTR ORL A,R0
MOV DPTR,#0MOVX @DPTR,ARET
; chương trình tạo trễ quét led
CLR TF1 CLR TR1 RET
- Khi giảm thời gian delay còn 100ms, các LED 7 đoạn chớp tắt nhanh hơn.
- Khi loại bỏ hàm delay, các LED 7 đoạn không quan sát được led sáng.
GIAO TIẾP LCD VÀ ADC
THÍ NGHIỆM 1
Download chương trình mẫu LCD.A51 trên trang web bộ môn điện tử. Biên dịch và chạy thử chương trình.
Sửa chương trình để hiển thị tên sinh viên lên hàng đầu.
CLR EN LCALL DL5MS RET
SETB EN SETB RS MOVX @DPTR,A CLR EN
MOV TMOD,#10H MOV TL1,#LOW(-5000) MOV TH1,#HIGH(-5000) SETB TR1
CLR TF1CLR TR1RET
TABLE: DB "HUYNH THANH SANG",0
THÍ NGHIỆM 2
Viết thêm chương trình con CLRSCREEN để xóa màn hình LCD.
Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD đến hàng x, cột y, với X chứa trong R0 và Y chứa trong R1.
Sửa chương trình ở thí nghiệm 1 để hiển thị thêm số nhóm ở hàng thứ 2.
MOV A, #01H ;đặt giá trị cho A ứng với lệnh xóa màn hình trong LCD LCALL NHAPLENH ;gửi lệnh tới LCD
Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD đến hàng x, cột y, với X chứa trong R0 và Y chứa trong R1
PUSH ACC ;cất dữ liệu đang chứa trong A
MOV A,R0 ;chọn hàng hiển thị trên LCD
ORL A,R1 ;chọn cột hiển thị trên LCD
LCALL NHAPLENH POP ACC ;lấy lại dữ liệu đang chứa trong A
Sửa chương trình ở thí nghiệm 1 để hiển thị thêm số nhóm ở hàng thứ 2
; xuất chuỗi tổ hàng R0 cột R1
MOV DPTR,#TABLE1 ;xuất chuỗi tổ
POP ACC INC A SJMP LAP1 KETTHUC:
SETB EN CLR RS MOVX @DPTR,A CLR EN
SETB EN SETB RS MOVX @DPTR,A CLR EN
MOV TMOD,#10HMOV TL1,#LOW(-5000)MOV TH1,#HIGH(-5000)SETB TR1
PUSH ACC MOV A,R0 MOV DPTR,#TB MOVC A,@A+DPTR ORL A,R1
TABLE: DB " VI XU LY ",0TABLE1: DB "NHOM: 09",0END
THÍ NGHIỆM 3, 4
Viết chương trình con READADC thực hiện đọc giá trị của kênh 0 và trả về giá trị trong R0.
Viết chương trình hiển thị giá trị của kênh 0 của ADC lên LCD dùng chương trình con READADC đã viết.
Viết chương trình con CALADC tính toán giá trị điện áp thực tế đặt vào kênh 0 ADC từ giá trị đo được của ADC.
Chương trình có giá trị vào chứa trong R0 (là kết quả của chương trình con READADC)
Giá trị trả về chứa trong R0 và R1, R0 chứa giá trị nguyên và R1 chứa giá trị thập phân.
Hiển thị giá trị đo được lên LCD theo cấu trúc: "Voltage: x.xx V" với x.xx là giá trị điện áp đo được, với hai số sau dấu chấm.
MOV DPTR,#4000H ;tao xung start
ACALL DELAY120US ;thoi gian de ADC tinh gia tri
MOVX A,@DPTR ; ket qua sau khi ADC tinh duoc chuyen vao A
CLR RS MOVX @DPTR,A CLR EN
MOV TMOD,#01H MOV TL0,#LOW(-5000) MOV TH0,#HIGH(-5000) SETB TR0
CLR TR0 CLR TF0 RET
MOV A,#01H LCALL NHAPLENH MOV A,#0EH
ADD A,#48 ;ma ASCII gia tri dien ap phan nguyen
MUL AB ; phan du nhan voi 10
MOV R4,B ; trong so cao chuyen vao R4, neu gia tri vuot qua 255 thi B co gtri 1
51 nen so du lon nhat la 500 CJNE R4,#1,TIEP1 DIV AB ; neu so du lon hon 255
ADD A,#5 ; cong them vao A gia tri 255:51=5
DIV AB ; phan du nho hon 255
MOV A,#8AH ACALL NHAPLENH MOV A,R4
ADD A,#48 ACALL XUAT1KYTU RET
MOV A,R3 MOV DPTR,#TABLE MOVC A,@A+DPTR
JZ EXITACALL XUAT1KYTU
LẬP TRÌNH GIAO TIẾP TIMER VÀ SERIAL PORT
THÍ NGHIỆM 1
Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng timer 0 ở chế độ 1.
LOOP: %% bắt đầu vòng lặp
ACALL DELAY05MS %%gọi lại ct con
SJMP LOOP %% nhảy lại vòng lặp
DELAY05MS: %% ct con delay 0.5ms
MOV TMOD,#01H %% cài đặt timer ở chế độ 1
MOV TH0,#HIGH(-461) %%nạp giá trị 461 MC cho timer (MC=1.0851us)
SETB TR0 %% cho timer0 chạy
JNB TF0,$ %% chờ đến khi timer0 tràn
CLR TF0 %% xóa cờ ngắt
THÍ NGHIỆM 2
Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng timer 0 ở chế độ 2.
MOV TMOD,#02H %%khai báo timer0 mode 2
MOV TH0,#-46 %% nạp giá trị 46MC cho timer0
LOOP: %% khởi tạo vòng lặp
JNB TF0,$ %% chờ cho timer 0 tràn
CLR TF0 %% xóa cờ ngắt timer
SJMP LOOP %% nhảy lại vòng lặp
THÍ NGHIỆM 3
Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thông qua HyperTerminal với tốc độ baud 19200 bps mỗi khi SW 310 (gắn vào P1.0) được nhấn.
MOV TMOD,#20H ;cài đặt port nối tiếp vào tốc độ baud
JB P1.0,$ ;chờ phím được nhấn
LCALL DL100MS ; chống rung phím
JNB P1.0,$ ;chờ phím được nhả
JZ LAP LCALL XUAT SJMP TTUC
; xuất ra port nt XUAT:
CLR TI MOV SBUF,A RET
MOV TMOD,#01HMOV TL0,#LOW(-50000)MOV TH0,#HIGH(-50000)SETB TR0
; -TABLE: DB "HELLO,WORLD",0END
THÍ NGHIỆM 4
Chương trình nhận ký tự từ máy tính gửi đến EME-MC8 qua HyperTerminal bằng cách nhập ký tự trên bàn phím, sau đó hiển thị các ký tự này lên màn hình LCD.
Nếu ký tự là chữ thì hiển thị lên LCD; Enter thì xuống hàng; ESC thì xóa màn hình LCD; Backspace thì xóa ký tự bên trái dấu nháy.
CLR F0 ;bien trang thai hang(enter)
CJNE A,#08H,OUT1 LCALL XOAKYTU OUT1:
DEC R1 ; chuyển con trỏ vị trí về vị trí trước
JB F0,H1 ; kiểm tra hàng hiện tại của con trỏ
MOV A,#0FEH ;thay ký tự hiện tại bằng ký tự trắng
DEC R1 ; vì con trỏ tự động tăng lên 1 nên phải giảm vị trí đi 1
;kiểm tra mã ASCII của phím enter
CPL F0 ; đảo cờ vị trí hàng con trỏ
JB F0,HANG1 ;kiem tra vi tri con tro
MOV R0,#01 ;cho con tro len hang tren MOV R1,#00 LCALL GOTOXY OUT4:
CJNE A,#27H,OUT3 ; ktra mã ASCII của phím ESC
MOV A,#01H LCALL NHAPLENH MOV R1,#0 ; khoi dong lai bộ đếm vị trí cột của con trỏ tên LCD RET
CJNE A,#30H,$+3 ; chỉ nhận ký tự mã ASCII trong khoảng hiển thị được
JNB RI,$ ; nhận ký tự từ port nối tiếp
SETB EN SETB RS MOVX @DPTR,A CLR EN
MOV TMOD,#10H MOV TL1,#LOW(-5000) MOV TH1,#HIGH(-5000) SETB TR1
CLR TF1 CLR TR1 RET
MOV A,#01H LCALL NHAPLENH MOV A,#0EH