Professional Documents
Culture Documents
HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
NHÓM: L20_5
1
MỤC LỤC
BÀI THÍ NGHIỆM LAB1:................................................................................
A. THÍ NGHIỆM 1.1..................................................................................
B. THÍ NGHIỆM 1.2..................................................................................
C. THÍ NGHIỆM 1.3..................................................................................
D. THÍ NGHIỆM 1.4..................................................................................
E. THÍ NGHIỆM 1.5..................................................................................
F. THÍ NGHIỆM 1.6..................................................................................
G. THÍ NGHIỆM 1.7................................................................................
H. THÍ NGHIỆM 1.8................................................................................
BÀI THÍ NGHIỆM LAB2:..............................................................................
A. THÍ NGHIỆM 2.1................................................................................
B. THÍ NGHIỆM 2.2................................................................................
C. THÍ NGHIỆM 2.3................................................................................
D. THÍ NGHIỆM 2.4................................................................................
E. THÍ NGHIỆM 2.5................................................................................
F. THÍ NGHIỆM 2.6................................................................................
BÀI THÍ NGHIỆM LAB3:..............................................................................
A. THÍ NGHIỆM 3.1................................................................................
B. THÍ NGHIỆM 3.2................................................................................
C. THÍ NGHIỆM 3.3................................................................................
D. THÍ NGHIỆM 3.4................................................................................
E. THÍ NGHIỆM 3.5................................................................................
F. THÍ NGHIỆM 3.6................................................................................
G. THÍ NGHIỆM 3.7................................................................................
Mục tiêu: Nắm được cách thức điều khiển trực tiếp ngoại vi thông qua các port I/O của 8051.
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).
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.
ORG 2000H
SJMP LAP ;Lặp lại để chương trình liên tục đọc trạng thái nút
END
Câu hỏi:
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?
Vì khi nhấn nút nối với P1.0 thì catot của led sẽ nối đất còn anode nối với nguồn vcc nên
led sáng, led ở P3.0 sáng vì do chương trình được nạp vào kit thực hiện đọc trạng thái P1.0
và hiển thị ra P3.0 nên cả 2 led đều
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?
Mục tiêu: Nắm được cách viết chương trình con để tạo trễ
Yêu cầu:
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.
ORG 2000H
SJMP LAP ;Nhảy đến nhãn LAP để đảo bit p1.0 tạo trạng thái chớp tắt của led
MOV R5,#8 ; R5 8
DJNZ R7, $ ;3 câu lệnh sau thực hiện lặp vòng để tạo trễ
DJNZ R5,LAP1
RET
END
Câu hỏi:
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.
Thời gian 1s được tạo ra bởi vòng lặp: sử dụng 3 vòng lặp theo công thức 2*m*n*k(MC)
tính được m = 8; n = 250, k = 250
Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?
Sinh viên thay đổi chương trình con như thế nào để được tần số chớp tắt là 1KHz?
ORG 2000H
MOV R7,#230
DJNZ R7,$
SJMP LAP
END
Mục tiêu: Nắm được cách viết chương trình con để tạo trễ
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.
Kiểm tra:
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.
ORG 2000H
SETB P1.0 ; Đưa p1.0 lên 1 tạo xung vuông chu kỳ 50%
LCALL DELAY200MS
MOV R5,#6
DJNZ R7,$
DJNZ R6,LAP2
DJNZ R5,LAP1
RET
MOV R5,#4
DJNZ R7,$
DJNZ R6,LAP4
DJNZ R5,LAP3
RET
END
Câu hỏi:
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?
Giản đồ 2 xung:
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 thời điểm gọi ctc Delay3 00ms thì P1.1 = 0 (sáng), khi gọi ctc Delay 700ms thì
P1.1 = 1 (tắt)
Sau 2 lần gọi ctc Delay300ms và Delay700ms trạng thái P1.0 bị đảo
Để 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?
Mục tiêu: Nắm được cách hiển thị bar LED và tạo hiệu ứng
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.
ORG 2000H
MOV P1,#7FH ; Làm sáng led đầu tiên, các led còn lại tắt
DELAY1S: ;Chương trình con tạo trễ 1s giống các bài trước
MOV R5,#8
DJNZ R7,$
DJNZ R6,LAP2
DJNZ R5,LAP1
RET
END
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?
Mục tiêu: Nắm được cách thức giao tiếp với ngoại vi LED 7 đoạn
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
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.
Kiểm tra:
Yêu cầu 1
DisplayLed:
MOV A,#11101001B ;Gán giá trị điều khiểu LED (9) vào A
MOVX @DPTR,A ;Gán giá trị vào địa chỉ trên và hiển thị led
RET
Yêu cầu 2:
ORG 2000H
MAIN:
MOV R0,#9
LCALL DisplayLed
DisplayLed:
MOV A,#11101001B ;Gán giá trị điều khiểu LED (9) vào A
MOVX @DPTR,A ;Gán giá trị vào địa chỉ trên và hiển thị led
RET
Delay1s:
MOV R5,#8
DJNZ R7,$
DJNZ R6,LAP2
DJNZ R5,LAP1
RET
END
Mục tiêu: Kết hợp được các chương trình con: chương trình con tạo trễ và chương trình con
hiển thị LED 7 đoạn.
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.
Kiểm tra:
ORG 2000H
LAP: LCALL DisplayLed ;Gọi chương trình con hiển thị led
MOV A,#0E0H
ADD A,R0
MOV DPTR,#0000H
MOVX @DPTR,A
RET
MOV R5,#8
DJNZ R7,$
DJNZ R6,LAP2
DJNZ R6,LAP1
RET
END
BẮT ĐẦU
R0 = 0
Displayed LED
Delays 1s
R0 = R0 +1
S Đ
R0 > 9
S
Mục tiêu: Nắm được cách thức dùng chương trình con và giao tiếp LED 7 đoạn.
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.
Kiểm tra:
ORG 0000H
MOV R1,#3 ; R1 = 3
LAP:
RL A ; Xoay trái A
DJNZ B,LAP ; Giảm B đi 1, nếu khác 0 thì quay lại nhãn LAP
ANL A,#0F0H ; Nếu B giảm đến 0 thì giữ lại 4 bit cao của A
MOV A,R0 ; A R0
MOV R0,A ; R0 A
MOV DPTR,#0000H
MOVX @DPTR,A
RET
END
Câu hỏi:
Viết lại chương trình trên bằng phương pháp sử dụng bảng tra (Lookup table).
DisplayLED:
MOV DPTR,#TABLE
MOV A,R1
MOVC A,@A+DPTR
ADD A,R0
MOV DPTR,#0000H
MOVX @DPTR,A
RET
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 0000H
MAIN:
MOV R1,#0
MOV R0,#1
LOOP:
LCALL DisplayLED
LCALL Delay1s
INC R1
INC R0
CJNE R1,#4,LOOP
SJMP MAIN
DisplayLED:
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ADD A,R0
MOVX @DPTR, A
RET
Delay1s:
MOV R7,#8
DJNZ R5, $
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.
Với tần số thạch anh sử dụng là 11.0592 MHz , ta có: 1 MC= 12/ 11.0592 MHz= 1.085 µs
Vì khoảng cách giữa 2 lần sáng tối của 1 led là 4 khoảng => để mắt người coi LED như
sáng liên tục thì LED phải chớp tắt ít nhất 24 lần trong 1 giây Suy ra thời gian trễ nhất để
không còn thấy LED nhấp nháy là: 1s= 24*4x => = 10416us
Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
Không thấy led 7 sáng vì tần số chớp tắt quá nhanh
Mục tiêu: Nắm được cách thức xuất giá trị lên LCD.
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.
Kiểm tra:
ORG 2000H
MAIN:
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
SJMP $
MOV A, #38H
ACALL WRITECOM
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
MOV A, #01H
ACALL WRITECOM
RET
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
MOV A,#0
LOOP:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP
EXIT:
RET
MOV R6,#10
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
MESSAGE:
DB "HELLO WORLD!",0
END
Câu hỏi:
Giải thích ý nghĩa của các chương trình con trên project mẫu.
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.
Kiểm tra:
ORG 2000H
MAIN:
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,#0EH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
CLEAR:
MOV A, #01H
ACALL WRITECOM
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
WAIT_LCD:
MOV R6,#10
DL1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
DISPLAYSTRING:
JB F0,HANG2
MOV R0,#1
SJMP TOI
HANG2:
MOV R0,#2
ACALL GOTOXY
TOI:
MOV A, #0
LOOP:
JB F0,SO2
MOV DPTR,#MESSAGE1
SJMP NHAY
SO2:
MOV DPTR,#LOP
NHAY:
MOV R3,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R3
INC A
SJMP LOOP
EXIT:
RET
MOV A,#0
CJNE R0,#1,BANG2
ADD A,R1
JMP XUAT
BANG2:
ADD A,#3FH
ADD A,R1
XUAT:
ADD A,#80H
ACALL WRITECOM
RET
MESSAGE1:
LOP:
DB "L20",0
END
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?
Xóa màn hình: 01H
Dịch con trỏ đến vị trí thứ 1 của hàng 1: 80H
Dịch con trở đến vị trí thứ 1 của hàng 2: 0C0H
Thực hiện canh giữa hàng 2 của LCD. Cho biết cách làm?
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.
Kiểm tra:
ORG 2000H
MAIN:
CALL READADC
PUSH 0
CALL CLEAR
CALL INIT_LCD
CALL DISPLAYSTRING
POP ACC
MOV R0,A
MOV B,#100
DIV AB
ADD A,#30H
ACALL WRITETEXT
MOV A,B
MOV B,#10
DIV AB
ADD A,#30H
ACALL WRITETEXT
MOV A,B
ADD A,#30H
ACALL WRITETEXT
ACALL WAIT
SJMP MAIN
READADC:
MOV DPTR,#ADCADDR
MOV A,#0
MOVX @DPTR,A
MOVX A,@DPTR
MOV R0,A
MOV P1,A
RET
INIT_LCD:
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
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
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT:
MOV R6,#255
DL:
DJNZ R7, $
DJNZ R6,DL
RET
WAIT_LCD:
MOV R6,#10
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
END
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ị hiển thị này không phải 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?
Để hiển thị giá trị thực tế của mức điện áp đăt vào kệnh 0, ta phải chuyển đổi giá trị này
theo công thức: Vin= A .¿ ¿ (V)
5∗A
Nếu (REF+) = 5V và (REF-) = 0V thì: Vin= (V )
256
Mục tiêu: Nắm được cách thức giao tiếp ADC và chuyển giá trị đọc được sang điện áp.
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.
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
ORG 2000H
MAIN:
CALL READADC
PUSH 0
CALL CLEAR
CALL INIT_LCD
CALL DISPLAYSTRING
POP ACC
MOV R0,A
MUL AB
PUSH ACC
MOV A,B
ADD A,#30H
ACALL WRITETEXT
MOV A,#2CH
ACALL WRITETEXT
POP ACC
MOV R5,#4
LAPP:
MOV B,#10
MUL AB
PUSH ACC
MOV A,B
ADD A,#30H
ACALL WRITETEXT
POP ACC
MOV A,#56H
ACALL WRITETEXT
ACALL WAIT
SJMP MAIN
READADC:
MOV DPTR,#ADCADDR
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, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
CLEAR:
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:
MOV R6,#255
DL:
DJNZ R7, $
DJNZ R6,DL
RET
WAIT_LCD:
MOV R6,#10
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
DISPLAYSTRING:
LOOP:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET
END
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.
Kiểm tra:
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
ORG 2000H
MOV TMOD,#02H
MOV TH0, #-250
MOV TL0, TH0
START:
CPL P1.0
MOV R6, #10
LOOP1:
MOV R7, #200
LOOP2:
SETB TR0
CALL DELAY1_250us
DJNZ R7,LOOP2
DJNZ R6,LOOP1
JMP START
/*DELAY_250us*/
DELAY1_250us:
JNB TF0,$
CLR TR0
CLR TF0
RET
END
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?
Chương trình trên vẫn có sai số do ta cần phải tốn thời gian để nạp lại giá trị cho TL0 và
TH0.
Để giảm thiểu sai số ta cần hạn chế số lần nạp lại bằng cách tăng cao nhất có thể giá trị
nạp và TL0 và TH0
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.
Kiểm tra:
ORG 2000H
SETB TR0
MAIN:
CPL P1.0
ACALL DL500ms
SJMP MAIN
DL500ms:
MOV R1, #8
LOOP:
WAIT:
JNB TF0, $
CLR TF0
RET
END
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?
Ở chế độ 2, độ trễ gây ra lúc này không xuất phát từ việc nạp lại giá trị cho TL0 (do nạp lại
tự động), thay vào đó việc gọi CTC Delay nhiều lần hơn cũng khiến độ sai số tăng do giới
hạn giá trị nạp trong thanh ghi TL0 là 255
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.
Kiểm tra:
ORG 2000H
MAIN:
JB SW_310,$
JNB SW_310,$
CALL STRING
JMP MAIN
STRING:
MOV R0,#0
MOV A, R0
MOV DPTR,#MESSAGE
MOVC A,@A+DPTR
JZ KT
CALL PHAT
INC R0
JMP LOOP1
KT: RET
PHAT:
JNB TI, $
CLR TI
MOV SBUF, A
RET
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?
Muốn thay đổi tốc độ baud khác thì phải đảm bảo HyperTerminal cũng phải có chức năng
thay đổi baud có giá trị giống như ở MCU
Nếu HyperTerminal chỉ mặc định một tốc độ baud là 19200bps thì ở MCU ta cũng phải cố
định tốc độ 19200bps
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.
Kiểm tra:
ORG 2000H
ACALL INIT_LCD ;cài đặt các thông số ban đầu cho LCD
MAIN:
CALL THU
CALL WRITETEXT
CALL PHAT
/*=========================*/
JNB RI,$
CLR RI
MOV A, SBUF
RET
JNB TI,$
CLR TI
MOV SBUF, A
RET
MOV A, #01H
ACALL WRITECOM
RET
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
DL1:
DJNZ R7, $
RET
END
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:
EN EQU P3.3
RS EQU P3.5
ROW EQU 20H.0 ; Biến xác định hàng, 0/1: Hàng 1/ hàng 2
ORG 2000H
SETB TR1
MAIN:
SJMP MAIN
SJMP MAIN
SJMP MAIN
MOV A, R5
E_R1: MOV A, R1
E_R2: MOV A, R2
E_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor hàng mới
RET
MOV A, R1
MOV A, R2
B_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor tại vị trí xóa
RET
RET
RET
C_R1: INC R1
RET
C_R2: INC R2
RET
TRANSMIT:
JNB TI, $
CLR TI
MOV SBUF, A
RET
RECEIVE:
JNB RI, $
CLR RI
INIT_LCD:
MOV A, #38H
ACALL COMD
MOV A, #0EH
ACALL COMD
MOV A, #06H
ACALL COMD
RET
CLR_LCD:
MOV A, #01H
ACALL COMD
RET
COMD:
SETB EN
CLR RS
MOVX @DPTR, A
CLR EN
ACALL WAIT_LCD
RET
DISP:
SETB EN
SETB RS
CLR EN
ACALL WAIT_LCD
RET
WAIT_LCD:
DJNZ R6, $
DJNZ R7, DL
RET
END
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ả.
Kiểm tra:
ORG 0000H
LJMP START
ORG 0023H
LJMP ISR_SerialPort
SETB TR1
MAIN:
SJMP MAIN
ISR_SerialPort:
JNB RI, TRANSMIT ; Kiểm tra ngắt thu hay ngắt phát
RETI
DL10ms:
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
RET
END
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.
Kiểm tra:
START
Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho phép timer
chạy
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP ISR_TIMER0
ORG 0030H
MOV 20H, #1
MOV 21H, #2
MOV 22H, #3
MOV 23H, #4
SJMP $
ISR_TIMER0:
CLR TR0
SETB TR0
RETI
DisplayLED:
MOV A, R1
MOVC A, @A + DPTR
ORL A, R0
MOV DPTR, #0
MOVX @DPTR, A
RET
GET_R1:
INC R1
SKIP: RET
GET_R0:
MOV A, #20H
MOV R0, A
MOV A, @R0
MOV R0, A
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
Kiểm tra:
ORG 0000H
LJMP BEGIN
ORG 000BH
LJMP ISR_TIMER0
ORG 0030H
BEGIN:
MAIN:
WAIT:
JB P1.7, MAIN
ACALL DL10us
INC 23H
ACALL UPDATE
JNB P1.7, $
SJMP MAIN
UPDATE: ; Hàm con điều chỉnh các giá trị thanh ghi
MOV 23H, #0
INC 22H
MOV 22H, #0
INC 21H
MOV 21H, #0
INC 20H
MOV 20H, #0
RET
ISR_TIMER0:
CLR TR0
SETB TR0
RETI
DisplayLED:
MOV A, R1
MOVC A, @A + DPTR
ORL A, R0
MOV DPTR, #0
MOVX @DPTR, A
RET
GET_R1:
INC R1
SKIP:RET
GET_R0:
MOV A, #20H
MOV R0, A
MOV A, @R0
MOV R0, A
DL10us:
MOV R5, #4
DJNZ R5, $
RET
END
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.
Kiểm tra:
ORG 0000H
LJMP BEGIN
ORG 000BH
ORG 001BH
ORG 0030H
BEGIN:
SW311: ; Play
WAIT311:
ACALL DL10us
SW310: ; Reset
WAIT310:
ACALL DL10us
MOV 22H, #0
MOV 23H, #0
SW312: ; Pause
WAIT312:
ACALL DL10us
SJMP SW310
CLR TR1
SETB TR1
INC 23H
RETI
UPDATE: ; Hàm con điều chỉnh giá trị các thanh ghi
MOV A, 23H
MOV 23H, #0
INC 22H
MOV A, 22H
MOV 22H, #0
INC 21H
MOV 21H, #0
INC 20H
MOV A, 20H
RET
ISR_TIMER0:
CLR TR0
SETB TR0
RETI
DisplayLED:
MOV A, R1
MOVC A, @A + DPTR
ORL A, R0
MOV DPTR, #0
MOVX @DPTR, A
RET
INC R1
SKIP: RET
GET_R0:
MOV A, #20H
MOV R0, A
MOV A, @R0
MOV R0, A
RET
MOV R5, #4
DJNZ R5, $
RET
END