Professional Documents
Culture Documents
MỤC TIÊU
➢ Nắm được cách sử dụng kit thí nghiệm, phần mềm lập trình.
➢ Nắm được cách lập trình giao tiếp IO port.
➢ Nắm được cách lập trình tạo thời gian trễ dùng các lệnh.
CHUẨN BỊ
➢ Đọc và làm bài thí nghiệm 0 tại nhà.
➢ Đọc bài chuẩn bị thí nghiệm 1 tại nhà.
➢ Chuẩn bị cho thí nghiệm 1: Viết chương trình và mô phỏng trên Proteus tất cả các bài trong thí
nghiệm 1 dựa trên bài chuẩn bị 1 (Prelab_1) và thí nghiệm 0.
➢ Nộp tất cả các kết quả (bài thí nghiệm 0 và bài chuẩn bị thí nghiệm 1) cho GVHD trước khi vào
lớp.
Sinh viên không thực hiện hoặc nộp thiếu nếu không có lí do chính đáng sẽ không được tham gia thí
nghiệm và bị đánh vắng buổi đó. Mọi hình thức gian lận, sao chép sẽ bị xử lý chính đáng.
Yêu cầu: Viết chương trình thực hiện việc đọc liên tục trạng thái của nút nhấn được nối đến P1.0
và hiển thị ra led được nối tại chân P3.0 (bit thứ 0 của led thanh BL202).
ORG 2000H
MOV P3.0,C
SJMP LOOP
END
Kiểm tra:
➢ Biên dịch và thực thi chương trình để kiểm tra kết quả thực hiện.
➢ Thử giải thích tại sao có đến 2 led cùng bị tác động khi nhấn hoặc thả nút?
Khi nhấn nút, led nối với chân P1.0 và led nối với chân P3.0 đều sáng; khi thả nút thì đều tắt. Vì
được tác động do lệnh: MOV C,P1.0; MOV P3.0,C
➢ Tổng kết xem các bit nào của 2 port có thể được dùng trong thí nghiệm trên và giải thích tại
sao?
Ta có thể sử dụng các bit từ P1.0 đến P1.7 và tương tự với Port 3. Nhưng không nên sử dụng Port
3 vì các chân Port 3 được sử dụng với các chức năng đặc biệt sau:
THÍ NGHIỆM 2
Mục tiêu: Nắm được cách viết chương trình con để tạo trễ
Yêu cầu:
• Chương trình chớp/tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s:
ORG 2000H
LOOP: CPL P1.0
ACALL Delay1s
SJMP LOOP
Delay1s:
MOV R5,#8
LP1: MOV R6,#250
LP2: MOV R7,#250
DJNZ R7,$
DJNZ R6,LP2
• Thay đổi chương trình con để tần số chớp tắt bây giờ là 1KHz.
ORG 2000H
LOOP: CPL P1.0
ACALL Delay1ms
SJMP LOOP
DELAY1ms:
LP: MOV R5, #2
MOV R6, #250
DJNZ R6, $
DJNZ R5, LP
RET
END
Kiểm tra:
➢ Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát LED đơn.
➢ Thời gian 1s được tạo ra như thế nào? Tính toán chính xác dựa trên chương trình đã viết.
1s = 2*MC*(Giá trị nạp), 1 MC là 1𝜇(𝑠) => Giá trị cần nạp là 500000
Giới hạn của 1 thanh ghi là 8 bit, chỉ lưu được giá trị tối đa là 255 nên ta phải chia nhỏ:
500000=250*250*8 => Chọn R5=8; R6=250; R7=250.
➢ Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?
Công thức tính chính xác Time delay với 3 vòng lặp như sau:
Time delay = 2*k*m*n +(3*m+3)*k+3 (MC) với k, m, n lần lượt là 8, 250, 250
→ Time delay = 1.006027(s). Sai số xấp xỉ 0.006207(s).
➢ Sinh viên thay đổi chương trình con như thế nào để được tần số chớp tắt là 1KHz?
Với tần số chớp tắt là 1Khz => Chu kì sẽ là 1000 𝜇(𝑠)(500 𝜇(𝑠) tín hiệu ở mức cao và 500 𝜇(𝑠) )
tín hiệu ở mức thấp. Do đó, thời gian trễ Time delay = 500 𝜇(𝑠) với công thức ở trên thì ta tính
được giá trị cần nạp là 250.
Yêu cầu: Viết chương trình tạo 2 xung vuông 0.5Hz (chu kỳ nhiệm vụ 50%) và 1Hz (chu kỳ
nhiệm vụ là 30%) lần lượt trên chân P1.0 và P1.1.
ORG 2000H
LOOP: CPL P1.0
CPL P1.1
ACALL DELAY300ms
CPL P1.1
ACALL DELAY700ms
SJMP LOOP
DELAY300ms:
MOV R5, #3
LP1: MOV R6, #200
LP2: MOV R7, #250
DJNZ R7, $
DJNZ R6, LP2
DJNZ R5, LP1
RET
DELAY700ms:
MOV R5, #7
LP3: MOV R6, #200
LP4: MOV R7, #250
DJNZ R7, $
DJNZ R6, LP4
DJNZ R5, LP3
RET
END
➢ Biên dịch, thực thi và kiểm tra chương trình bằng cách sử dụng oscilloscope để kiểm tra.
➢ Vẽ giản đồ của 2 xung? Các chương trình con viết với thời gian trễ là bao nhiêu?
Các chương trình con viết với thời gian trễ lần lượt là 0.3s và 0.7s.
➢ Tại mỗi thời gian tạo trễ, các chân P1.0 và P1.1 xuất tín hiệu như thế nào?
Tại 0.3s đầu, ta đảo bit chân P1.1, 0.7s sau ta tiếp tục đảo bị chân P1.1 vậy ta đã tạo được xung
1Hz với chu kì nhiệm vụ là 30%. Sau đó đồng thời đảo bit chân P1.0, do đó ta có được xung 0.5Hz
với chu kì nhiệm vụ là 50% tại chân P1.0.
➢ Để tạo các xung thỏa yêu cầu bài toán, các vòng trễ được viết như thế nào?
Vòng trễ được viết như sau:
Yêu cầu: Viết chương trình tạo hiệu ứng quay LED: các LED đơn trên BARLED1 sáng lần lượt
từ trái sang phải sau thời gian 1s và lặp lại. Sử dụng chương trình con Delay1s đã viết ở trên.
ORG 2000H
LOOP: MOV A,#7FH
MOV R1,#8
PHASE:
MOV P1,A
RL A
ACALL Delay1s
DJNZ R1,PHASE
SJMP LOOP
Delay1s:
MOV R5,#8
LP1: MOV R6,#250
LP2: MOV R7,#250
DJNZ R7,$
DJNZ R6,LP2
DJNZ R5,LP1
RET
END
Kiểm tra:
➢ Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát hiệu ứng trên bar led.
Câu hỏi:
➢ Led ngoài cùng bên trái kết nối đến MSB (most significant bit) hay LSB (less significant bit)
của port 1?
LED ngoài cùng bên trái kết nối đến MSB của port 1.
Yêu cầu:
➢ Viết chương trình con DisplayLed hiển thị lên LED 7 đoạn số 0 giá trị chứa trong thanh ghi
R0
DisplayLED:
MOV DPTR, #0000H
MOV A,R0
MOVX @DPTR,A
RET
➢ 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 DisplayLed.
ORG 2000H
MOV R0,#11101001B
CALL DisplayLED
LOOP:
SJMP LOOP
DisplayLED:
MOV DPTR, #0000H
MOV A,R0
MOVX @DPTR,A
RET
END
Kiểm tra:
Yêu cầu: 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 sử dụng 2 chương trình con ở Thí nghiệm 2 và Thí nghiệm 5.
ORG 2000H
START:
MOV R0,#0E0H
LOOP:
ACALL DisplayLED
ACALL DELAY1S
INC R0
CJNE R0,#0EAH,LOOP
AJMP START
DisplayLED:
MOV DPTR, #0000H
MOV A,R0
MOVX @DPTR,A
RET
DELAY1S:
MOV R5, #8
LP1: MOV R6, #250
LP2: MOV R7, #250
DJNZ R7, $
DJNZ R6, LP2
DJNZ R5, LP1
RET
END
Trong chương trình chính, đầu tiên cho thanh ghi R0 bằng 0. Sau đó vào vòng lặp gọi chương trình
con DisplayLed đã viết ở phần trước, tạo trễ 1s, tăng R0 lên 1 và lặp lại quá trình. Nếu R0 lớn hơn
9 thì cho R0 bằng 0 trở lại.
Kiểm tra:
Câu hỏi:
Yêu cầu:
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. Trong đó:
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.
Hướng dẫn:
Để hiển thị lên 1 LED 7 đoạn ta phải ghi ra ngoại vi ở vùng nhớ 0000H-1FFFH một byte, với 4 bit
thấp chứa giá trị của giá trị cần hiển thị và 4 bit cao được dùng để chọn LED. Trong 4 bit cao, bit
nào bằng 0 thì LED 7 đoạn tương ứng sẽ được bật.
Đoạn chương trình sau tính toán để xuất ra điều khiển LED dựa vào R0, R1
MOV B, R1
MOV A, #11110111B
SHIFTLOOP:
RL A
DJNZ B, SHIFTLOOP
ANL A, #0F0H
PUSH ACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
Bài làm:
ORG 2000H
LOOP:
MOV R0,#3
MOV R1,#3
ACALL DISPLAYLED
SJMP LOOP
DISPLAYLED:
INC R1
MOV B,R1
MOV A,#11110111B
SHIFTLOOP:
RL A
DJNZ B,SHIFTLOOP
ANL A,#0F0H
ADD A,R0
MOV DPTR,#0000H
MOVX @DPTR,A
RET
END
➢ Viết lại chương trình trên bằng phương pháp sử dụng bảng tra (Lookup table).
ORG 2000H
LOOP: MOV R0,#3
MOV R1,#2
MOV DPTR,#BANG
MOV A,R1
MOVC A,@A+DPTR
ADD A,R0
MOV DPTR,#0000H
MOVX @DPTR,A
SJMP LOOP
BANG: DB 0E0H,0D0H,0B0H,70H
END
THÍ NGHIỆM 8
Mục tiêu:
Yêu cầu:
Viết chương trình hiển thị số 1 lên LED7 đoạn 0, sau đó 1s hiển thị số 2 lên LED 7 đoạn 1, sau đó
1s hiển thị số 3 lên LED 7 đoạn 2, sau đó 1s hiển thị số 4 lên LED 7 đoạn 3. Quá trình này lặp đi
lặp lại. Việc hiển thị này sử dụng chương trình con DisplayLED đã viết ở trên.
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.
Kiểm tra:
ORG 2000H
RESET: MOV R0,#1
MOV R1,#0
LOOP:
ACALL DISPLAYLED
ACALL DELAY100MS
INC R0
INC R1
CJNE R0,#5,LOOP
SJMP RESET
DISPLAYLED:
INC R1
MOV B,R1
DEC R1
Department of Electronics Page | 17
Microprocessor Laboratory
BÀI THÍ NGHIỆM 1
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
MOV A,#11110111B
SHIFTLOOP:
RL A
DJNZ B,SHIFTLOOP
ANL A,#0F0H
ADD A,R0
MOV DPTR,#0000H
MOVX @DPTR,A
RET
DELAY100MS:
MOV R6,#200
LP1: MOV R7,#250
DJNZ R7,$
DJNZ R6,LP1
RET
END
Câu hỏi:
➢ Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết? Giải thích cách
tính.
MỤC TIÊU
➢ Nắm được cách sử dụng kit thí nghiệm, phần mềm lập trình.
CHUẨN BỊ
➢ Đọc bài chuẩn bị thí nghiệm 2 tại nhà.
➢ Chuẩn bị cho thí nghiệm 2: Viết chương trình và mô phỏng trên Proteus tất cả các bài trong thí
nghiệm 2 dựa trên bài chuẩn bị 2 và thí nghiệm 0.
➢ Nộp tất cả các kết quả (bài chuẩn bị thí nghiệm 2) cho GVHD trước khi vào lớp.
Sinh viên không thực hiện hoặc nộp thiếu nếu không có lí do chính đáng sẽ không được tham gia thí
nghiệm và bị đánh vắng buổi đó.
Yêu cầu:
➢ Download chương trình mẫu LCD.A51 trên trang web bộ môn điện tử hoặc trong folder thí
nghiệm của sinh viên.
➢ Sửa chương trình để hiển thị tên sinh viên lên hàng đầu
LCD_E BIT P3.4
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ORG 0000H
MAIN:
MOV @R0, 30H
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
SJMP $
INIT_LCD:
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
CLEAR:
MOV A, #01H
Department of Electronics Page | 2
Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
ACALL WRITECOM
RET
WRITECOM:
MOV DPTR, #LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP
Kiểm tra:
➢ Kiểm tra kết quả thực hiện của chương trình.
Câu hỏi:
➢ Giải thích ý nghĩa của các chương trình con trên project mẫu.
- CLEAR: XÓA MÀN HÌNH LCD
- INIT_LCD: KHỞI ĐỘNG MÀN HÌNH LCD
- DISPLAYSTRING : XUẤT CHUỖI KÝ TỰ BẰNG CÁCH TRA BẢNG
- WRITECOM: GHI LỆNH RA MÀN HÌNH LCD
- WRITETEXT: GHI DỮ LIỆU (KÍ TỰ) RA MÀ HÌNH LCD
- EXIT: THOÁT KHỎI CHƯƠNG TRÌNH
- MESSAGE: BẢNG ĐỊNH NGHĨA ĐỊA CHỈ KÍ TỰ
- WAIT_LCD: TẠO TRỄ CHO LCD
Yêu cầu:
➢ 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.
LCD_E BIT P3.3
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ORG 2000H
MAIN:
MOV @R0, 30H
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
CLR F0
ACALL DISPLAYSTRING
SETB F0
ACALL DISPLAYSTRING
SJMP $
INIT_LCD:
MOV A, #38H
ACALL WRITECOM
MOV A, #0DH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
Câu hỏi:
➢ Cho biết mã lệnh dùng để xóa màn hình, dịch con trỏ đến vị trí thứ 1 của hàng 1 và vị trí thứ 1
của hàng 2 của LCD?
- Mã lệnh xóa màn hình là : 01H
- Dịch con trỏ đến vị trí thứ 1 dòng 1 là: 80H
- Dịch con trỏ đến vị trí thứ 1 dòng 2 là : 0C0H
➢ Thực hiện canh giữa hàng 2 của LCD. Cho biết cách làm?
- Ta lấy (16 – độ dài chuỗi kí tự)/2 lấy phần nguyên
Đưa con trỏ vào vị trí 1 của dòng 2 bằng cách gán A = 0C0H sau đó lấy A cộng với giá trị đã tính
phần nguyên ở trên, ta được một chuỗi ký tự có vị trí ở giữa màn hình LCD.
Yêu cầu:
➢ 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.
ORG 0
MAIN:
CALL READADC
PUSH 0
CALL CLEAR
CALL INIT_LCD
CALL DISPLAYSTRING
XUONGDONG:
MOV A,#0C0H
CALL WRITECOM
POP ACC
CALL CONVERTTOBCD
CALL WRITETEXT
MOV A,R2
CALL WRITETEXT
MOV A,R1
CALL WRITETEXT
SJMP $
READADC:
MOV DPTR,#ADCADDR
MOV A,#0
MOVX @DPTR,A
CALL WAIT_LCD
MOVX A,@DPTR
MOV R0,A
MOV P1,A
RET
INIT_LCD:
MOV A, #38H
ACALL WRITECOM
MOV A, #0DH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
Department of Electronics Page | 17
Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
RET
CLEAR:
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM:
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD:
MOV R6,#20
Department of Electronics Page | 18
Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
DISPLAYSTRING:
MOV A,#0
LOOP:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET
CONVERTTOBCD:
MOV B,#100
DIV AB
MOV R3,A
MOV A,B
Department of Electronics Page | 19
Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
MOV B,#10
DIV AB
MOV R2,A
MOV A,B
MOV R1,A
MOV A,R3
ADD A,#30H
MOV R3,A
MOV A,R2
ADD A,#30H
MOV R2,A
MOV A,R1
ADD A,#30H
MOV R1,A
RET
END
Kiểm tra:
Câu hỏi:
➢ Giá trị này có phải giá trị thực của điện áp đặt vào kênh 0 hay không?
- Giá trị này không phải là giá trị thực của điện áp đặt vào kênh 0.
➢ Để hiển thị giá trị thực tế của mức điện áp đặt vào kênh 0 ta phải làm như thế nào?
- Ta có công thức tính Vin = (5*A)/256, với A là giá trị hiện thị trên LCD của thí nghiệm
trên.
Yêu cầu:
➢ 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.
ORG 2000H
RS BIT P3.5
E BIT P3.3
LCD EQU 6000H
ADC EQU 4000H
MAIN:
CALL LCD_INT
CALL READADC
CALL CALADC
MOV A, R1
ADD A, #30H
CALL WR_CHR
MOV A, #'.'
CALL WR_CHR
MOV A, R2
ADD A, #30H
CALL WR_CHR
MOV A, R3
ADD A, #30H
CALL WR_CHR
Department of Electronics Page | 19
Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
CALL DL1
JMP MAIN
CALADC:
MOV B, #5
MUL AB ;BA
MOV R1, B
MOV B, #10
MUL AB
MOV R2, B
MOV B, #10
MUL AB
MOV R3, B
RET
READADC:
MOV DPTR, #ADC
MOV A, #0
MOVX @DPTR, A
CALL WAIT_LCD
MOVX A, @DPTR
MOV R0, A
MOV P1, A
RET
LCD_INT:
MOV A, #38H
CALL WR_CMD
MOV A, #01H
CALL WR_CMD
MOV A, #0CH
CALL WR_CMD
MOV A, #06H
Kiểm tra:
➢ Biên dịch và kiểm tra hoạt động của chương trình, so sánh giá trị hiển thị với giá trị đo được
dùng VOM
Yêu cầu:
➢ 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 ở mode 1.
ORG 2000H
MOV TMOD, #01H
AGAIN:
MOV R7, #10
LOOP:
MOV TH0, #HIGH(-50000)
MOV TL0, #LOW(-50000)
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
DJNZ R7, LOOP
CPL P1.0
JMP AGAIN
END
Kiểm tra:
LAB2 TN5.mp4
Câu hỏi:
➢ Để tạo sóng 1 Hz, ta có thể sử dụng timer ở mode 2 được không? Nếu được, trình bày đoạn
chương trình tạo sóng 1 Hz sử dụng timer ở mode 2.
➢ Trong chương trình của sinh viên, khi sử dụng mode 1, sóng vuông 1 Hz có bị sai số không? Để
hạn chế sai số ta phải nạp các giá trị vào timer như thế nào?
- Dạng sóng ở mode 1 bị sai số do phần mềm do phải tốn chu kì máy để thực thi, để hạn
chế ta phải nạp vào timer ước lớn nhất mà timer có thể có của giá trị thời gian cần tạo trễ
(50000).
Yêu cầu:
➢ 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.
ORG 2000H
MOV TMOD, #02H
MOV TH0, #-250
MOV TL0, TH0
SETB TR0
AGAIN:
MOV R7, #10
AGAIN1:
MOV R6, #200
LOOP:
JNB TF0, $
CLR TF0
DJNZ R6, LOOP
DJNZ R7, AGAIN1
CPL P1.0
JMP AGAIN
END
Kiểm tra:
LAB2 TN6.mp4
Câu hỏi:
➢ Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit có gây sai số cho dạng sóng ngõ ra
không? Vì sao?
MỤC TIÊU
➢ Nắm được cách sử dụng kit thí nghiệm, phần mềm lập trình.
CHUẨN BỊ
➢ Đọc bài chuẩn bị thí nghiệm 3 tại nhà.
➢ Chuẩn bị cho thí nghiệm 3: Viết chương trình và mô phỏng trên Proteus tất cả các bài trong thí
nghiệm 3 dựa trên bài chuẩn bị 3 và thí nghiệm 0.
➢ Nộp tất cả các kết quả (bài chuẩn bị thí nghiệm 3) cho GVHD trước khi vào lớp.
Sinh viên không thực hiện hoặc nộp thiếu nếu không có lí do chính đáng sẽ không được tham gia thí
nghiệm và bị đánh vắng buổi đó.
Yêu cầu:
➢ 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.
ORG 2000H
MOV SCON, #52H
MOV TMOD, #20H
ORL PCON, #80H
MOV TH1, #-3
MOV TL1, TH1
SETB TR1
MOV DPTR, #TAB
LOOP:
CLR A
MOVC A, @A+DPTR
CALL PHAT
INC DPTR
CJNE A, #0, LOOP
JMP $
PHAT:
JNB TI, $
CLR TI
MOV SBUF, A
RET
TAB:
DB "Hello world!!!", 0
END
Câu hỏi:
➢ Trong chương trình khởi tạo serial port, ta có thể sử dụng tốc độ baud khác giá trị 19200bps
được không? Tại sao?
Không được. Các giá trị khác làm cho hiển thị trên LCD sai, không ra đúng chữ “Hello world!!! ”
Yêu cầu:
Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8 thông qua chương trình Hercules
(bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình Hercules). Kí tự nhận được
sẽ hiển thị lên LCD tại vị trí cột 0 hàng 0 và đồng thời phát trở lại serial port.
ORG 2000
SETB TR1
CALL INIT_LCD
LOOP:
MOV A, #80H
CALL WRITECOM
CALL THU
CALL WRITETEXT
CALL PHAT
JMP LOOP
PHAT:
CLR TI
MOV SBUF, A
RET
THU:
JNB RI, $
CLR RI
MOV A, SBUF
RET
INIT_LCD:
MOV A, #80H
ACALL WRITECOM
MOV A, #38H
ACALL WRITECOM
MOV A, #0CH
ACALL WRITECOM
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM:
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
RET
WRITETEXT:
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD:
MOV R6,#10
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
END
Kiểm tra:
Yêu cầu:
Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8 thông qua cương trình Hercules
(bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình Hercules) và hiển thị lên
LCD theo nguyên tắc sau:
Kiểm tra:
LAB3 TN3.mkv
Yêu cầu:
- Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình Hercules.
- Bật LED gắn vào P1.1 khi SW 317 (gắn vào P1.0) được nhấn, và tắt LED khi phím được nhả.
Hướng dẫn:
➢ Sử dụng ngắt serial port, nếu ngắt lả ngắt thu (cờ RI bằng 1) thì xóa RI, đọc SBUF và ghi
trở lại vào SBUF. Nếu TI bằng 1 thì xóa TI.
➢ Tác vụ đọc Switch và hiển thị LED được viết trong chương trình chính.
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP ISR_SERIAL
MAIN:
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
MOV SCON,#01010010B
MOV PCON,#80H
MOV IE,#10010000B
CHECK:
JB P1.0,TAT
CLR P1.1
SJMP CHECK
TAT:
SETB P1.1
SJMP CHECK
Kiểm tra:
lab3 tn4.mkv
Yêu cầu:
Viết chương trình hiển thị lên 4 LED 7 đoạn một số có 4 chữ số, 4 ký số này chứa trong các ô nhớ
20H, 21H, 22H và 23H. Ô nhớ 20H chứa số hàng nghìn.
Hướng dẫn:
➢ Ở Lab 1 ta đã viết chương trình con DisplayLED hiển thị giá trị chứa trong R0, với số thứ
tự LED chứa trong R1. Đồng thời, ta đã nắm được cách quét LED bằng cách cho 4 LED
lần lượt sáng sau mỗi khoảng thời gian trễ.
➢ Ở thí nghiệm này, các LED 7 đoạn được quét sử dụng ngắt timer. Để đạt được tần số quét
25 Hz, mỗi LED sẽ được sáng trong thời gian 10 ms.
- Sử dụng thanh ghi R1 để xác định LED nào cần được bật. Ban đầu R1 bằng 0, R1 tăng
lên 1 sau mỗi lần bật LED để chuyển sang LED tiếp theo. Khi R1 bằng 3, R3 sẽ quay lại bằng 0.
- Chương trình con DisplayLED chứa giá trị hiển thị trong R0. Giá trị này là 1 trong các
byte ô nhớ 20H, 21H, 22H và 23H, tương ứng giá trị R1 (0-3).
- Khi timer tràn, trong chương trình phục vụ ngắt ta cấu hình lại timer, hiển thị giá trị led
7 đoạn tương ứng, và cập nhật giá trị R1 để chỉ đến LED tiếp theo.
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP ISR_T0
ORG 0030H
START
Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho
phép timer chạy
Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho
phép timer chạy
END
Yêu cầu: Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên 4 LED 7 đoạn
Hướng dẫn:
➢ Kiểm tra nút nhấn, khi nút nhấn được nhấn, giá trị được cập nhật vào các ô nhớ 20H, 21H,
22H và 23H. Ô nhớ 20H chứa số hàng nghìn. Việc đếm số lần nhấn phím được thực hiện
trong chương trình chính.
➢ LED 7 đoạn được quét như ở thí nghiệm 2 dùng ngắt timer.
Kiểm tra:
lab3 tn6.mkv
Yêu cầu:
Viết chương trình thực hiện đồng hồ bấm giây, hiển thị lên LED 7 đoạn. Hai LED 3 và 2 thể hiện
số giây, 2 LED 1 và 0 thể hiện phần trăm của giây.
Hướng dẫn:
➢ LED 7 đoạn được quét như ở thí nghiệm 2 dùng ngắt timer.
➢ Khi đồng hồ chạy, các giá trị thời gian được cập nhật dùng ngắt timer 0. Giá trị được cập
nhật vào các ô nhớ 20H, 21H, 22H và 23H.
➢ Việc kiểm tra nhấn các phím SW310, SW311, SW312 được xử lý trong chương trình chính.
Kiểm tra:
lab3 tn7.mkv