BÁO CÁO THÍ NGHIỆM MÔN: VI XỬ LÝ TP.HCM , THÁNG ...... NĂM 201... 1 Để tạo sự trực quan và dễ hiểu cho người đọc, một số chương trình có số câu lệnh nhiều sẽ được chia làm nhiều cột, được đọc từ trái sang phải. BÀI 1: LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ PHÍM ĐƠN THÍ NGHIỆM 1: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 LOOP: SETB P1.0 MOV C, P1.0 MOV P3.0,C SJMP LOOP END - LED nối vào P1.0 và P3.0 đều bị tác động. LED tại P1.0 bị tác động do phần cứng, khi nhấn phím, mức điện áp trên P1.0 bằng 0, đầu còn lại của LED được nối với điện trở và nối lên VCC nên đèn tại P1.0 sáng. Tương tự, tại P3.0, 1 đầu LED được nối vào điện trở và nối đến VCC, đầu còn lại nối đến P3.0. Khi nhấn nút, P1.0 có mức điện áp thấp, phần mềm sẽ đọc mức điện áp và đặt cho P3.0 mức điện áp thấp nên đèn sáng. - Tất cả các chân trên P1 và P3 đều có thể sử dụng do tất cả các chân đều có thể dùng làm chân IO. THÍ NGHIỆM 2: Biên dịch và thử nghiệm chương trình cho sẵn sau: ORG 2000H MAIN: CPL P3.0 JMP MAIN END - Theo lý thuyết, với thạch anh 11.0592MHz, chương trình trên sẽ tạo ra sóng vuông trên P3.0 với chu kì 6.5us - Vẽ dạng sóng: - Tần số tối đa một xung tuần hoàn có chu kỳ nhiệm vụ 50% có thể đạt được là 153600Hz với đoạn code như trên
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ
BÁO CÁO THÍ NGHIỆM
MÔN: VI XỬ LÝ
TP.HCM , THÁNG NĂM 201
Trang 2Để tạo sự trực quan và dễ hiểu cho người đọc, một số chương trình có số câu
lệnh nhiều sẽ được chia làm nhiều cột, được đọc từ trái sang phải.
BÀI 1: LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ PHÍM ĐƠN
THÍ NGHIỆM 1: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).
- LED nối vào P1.0 và P3.0 đều bị tác động LED tại P1.0 bị tác động do phần cứng, khi nhấn
phím, mức điện áp trên P1.0 bằng 0, đầu còn lại của LED được nối với điện trở và nối lên
VCC nên đèn tại P1.0 sáng Tương tự, tại P3.0, 1 đầu LED được nối vào điện trở và nối đến
VCC, đầu còn lại nối đến P3.0 Khi nhấn nút, P1.0 có mức điện áp thấp, phần mềm sẽ đọc
mức điện áp và đặt cho P3.0 mức điện áp thấp nên đèn sáng
- Tất cả các chân trên P1 và P3 đều có thể sử dụng do tất cả các chân đều có thể dùng làm
- Theo lý thuyết, với thạch anh 11.0592MHz, chương trình trên sẽ tạo ra sóng vuông trên
P3.0 với chu kì 6.5us
- Vẽ dạng sóng:
- Tần số tối đa một xung tuần hoàn có chu kỳ nhiệm vụ 50% có thể đạt được là 153600Hz với
đoạn code như trên
Trang 3- Vòng trễ 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 2 chu kì
máy, mỗi chu kì máy có thời gian bằng 12 chu kì thạch anh Gọi n là số lần lặp:
0.5(10^-3)=2n.Tmáy=2n.12Txtal=24n.(1/11059200) => n=230.4 => chọn n=230
- Vẽ lại dạng sóng:
- Sai số nhỏ nhất có thể đạt được: (230.4-230)/230.4=0.17%
THÍ NGHIỆM 4:
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
DJNZ R5,LOOP3 DJNZ R6,LOOP2 DJNZ R7,LOOP1 RET
END
- Tính thời gian delay 1s:
1=2n.Tmáy=2n.12Txtal=24n.( 1
11059200) => n=460800 => chọn n1=250; n2=250; n3=7
Trang 4THÍ NGHIỆM 5:
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 1s đã viết ở trên
MOV R5,#250 LOOP3:
DJNZ R5,LOOP3 DJNZ R6,LOOP2 DJNZ R7,LOOP1 RET
SIGNAL:
DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH END
- LED ngoài cùng bên trái nối với MSB của P1
Trang 5BÀI 2: LẬP TRÌNH TIMER VÀ HIỂN THỊ LED 7 ĐOẠN
JNB TF0,$
CLR TF0 CLR TR0 RET END
- Dạng sóng có thể bị sai số, để hạn chế sai số, ta nên tính toán giá trị nạp vào TH0 và TL0
- Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit gây sai số cho dạng sóng ngõ ra
Tuy nhiên sai số là không lớn
Trang 6MOV 22H, B ; LUU HANG CHUC
MOV 23H, A ; LUU HANG TRAM
Trang 7MOV R7,#18 TIMELOOP:
MOV TMOD, #01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0
JNB TF0,$
CLR TF0 CLR TR0 DJNZ R7,TIMELOOP RET
END
Trang 8BÀI 3: QUÉT LED 7 ĐOẠN VÀ GIAO TIẾP LCD
THÍ NGHIỆM 1:
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
CJNE A,#2,ANONUM3 MOV A,#0B0H
ADD A,R0 SJMP DONE ANONUM3:
MOV A,#70H ADD A,R0 DONE:
MOV DPTR,#0000H MOVX @DPTR,A RET
FINISH: NOP END
THÍ NGHIỆM 2:
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
ADD A,R0 SJMP DONE ANONUM1:
CJNE A,#1,ANONUM2 MOV A,#0D0H
ADD A,R0 SJMP DONE ANONUM2:
CJNE A,#2,ANONUM3 MOV A,#0B0H
ADD A,R0 SJMP DONE ANONUM3:
MOV A,#70H ADD A,R0
DONE:
MOV DPTR,#0000H MOVX @DPTR,A RET
DELAY1S:
MOV R7,#18 TIMELOOP:
MOV TMOD, #01H MOV TH0,#HIGH(- 50000)
MOV TL0,#LOW(-50000) SETB TR0
JNB TF0,$
CLR TF0 CLR TR0 DJNZ R7,TIMELOOP RET
END
Trang 9- 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 dường như hiển thị các số cùng lúc
- Mắt người có hiện tượng lưu ảnh, những hình ảnh chuyển động với tốc độ trên 24 khung
hình 1 giây sẽ khiến mắt ta không thể phân biệt được sự nhấp nháy của ảnh Vậy LED cần có
thời gian sáng mỗi chu kì quét là: 1/(4.25)=10ms
THÍ NGHIỆM 3:
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
- Tại cuối chương trình, sau nhãn MESSAGE, sửa các kí tự trong dấu “” thành tên sinh viên
THÍ NGHIỆM 4:
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
MOV A, #38H ACALL WRITECOM MOV A, #0EH ACALL WRITECOM MOV A, #06H ACALL WRITECOM RET
CLEAR:
MOV A, #01H ACALL WRITECOM RET
GOTOXY:
Trang 10INC A DJNZ B,LOOP EXIT:
RET DISPLAYSTRING1:
MOV A,#0 LOOP1:
DJNZ B,LOOP WAIT_LCD:
MOV R6,#10 DL1:
MOV R7, #250 DJNZ R7, $ DJNZ R6,DL1 RET
MESSAGE:
DB "HELLO WORLD!",0 MESSAGE1:
DB "NHOM 4",0
END
Trang 11BÀI 4: LẬP TRINH GIAO TIẾP PHÍM ĐƠN VÀ BÀN PHÍM SỐ HEX
THÍ NGHIỆM 1:Viết chương trình đếm số lần nhấn SW310 (phím đơn kết nối vào P1.0),
hiển thị lên LCD theo cấu trúc: Push Number = xx (xx là số lần nhấn)
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 MOV P1,#0FFH MOV R0,#0 LOOP:
ACALL CLEAR ACALL DISPLAYSTRING
ACALL DISPNUM MOV A,P1
CJNE A,#0FEH, LOOP
INC R0 SJMP LOOP DISPNUM:
MOV A,R0 DIV AB ADD A,#30H ACALL WRITETEXT MOV A,B
ADD A,#30H ACALL WRITETEXT 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:
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 LOOPDISPSTRING:
MOV DPTR,
#MESSAGE
MOV R0,A
Trang 12MOVC A,@A+DPTR
JZ EXIT ACALL WRITETEXT MOV A,R0
INC A DJNZ B,LOOPDISPSTRING
EXIT:
RET WAIT_LCD:
MOV R6,#10 DL1:
MOV R7, #250 DJNZ R7, $ DJNZ R6,DL1 RET
CLEAR:
MOV A,#01H 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 LOOPDISPSTRING:
MOV DPTR, #MESSAGE MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
Trang 13MOV R7, #250 DJNZ R7, $ DJNZ R6,DL1
RET DELAYBUTTON:
MOV R6,#40 DL2:
MOV R7, #250 DJNZ R7, $ DJNZ R6,DL2 RET
MESSAGE:
DB "PUSH NUMBER = ",0 END
THÍ NGHIỆM 3:Viết chương trình con SCANKEY quét bàn phím ma trận 4x4 trên board
thí nghiệm Các giá trị trả về từ 0-15 nếu có phím được nhấn hoặc 255 nếu không có phím
được nhấn Kết quả chứa trong R0
Sử dụng chương trình con này viết chương trình gửi lên máy tính các ký tự từ '0' cho đến 'F'
ứng với phím được nhấn trên bàn phím, baudrate là 19200
SJMP DONE ANOBUT4:
MOV P1,#0DFH ACALL DELAYBUTTON MOV A,P1
CJNE A,#0DEH,ANOBUT5 MOV R0,#'1'
SJMP DONE ANOBUT5:
CJNE A,#0DDH,ANOBUT6 MOV R0,#'5'
SJMP DONE ANOBUT6:
CJNE A,#0DBH,ANOBUT7 MOV R0,#'9'
SJMP DONE ANOBUT7:
CJNE A,#0D7H,ANOBUT8 MOV R0,#'D'
SJMP DONE ANOBUT8:
MOV P1,#0BFH ACALL DELAYBUTTON MOV A,P1
CJNE A,#0BEH,ANOBUT9 MOV R0,#'2'
SJMP DONE ANOBUT9:
CJNE A,#0BDH,ANOBUT10 MOV R0,#'6'
Trang 14SJMP DONE ANOBUT15:
CJNE A,#077H,ANOBUT16 MOV R0,#'F'
SJMP DONE ANOBUT16:
MOV R0,#255 DONE:
RET
DELAYBUTTON:
MOV R6,#40 DL2:
MOV R7, #250 DJNZ R7, $ DJNZ R6,DL2 RET
END
Trang 15BÀI 5: LẬP TRÌNH GIAO TIẾP SERIAL PORT VÀ ADC
THÍ NGHIỆM 1: 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 pbs mỗi khi SW 310 (gắn vào P1.0) được nhấn
JNB TI,$
CLR TI MOV SBUF, A RET
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 HyperTerminal
(bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình HyperTerminal) và hiển
thị lên LCD như sau:
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
MOV A, SBUF RET
LCD_INIT:
MOV A, #38H ACALL WRITE_COMMAND MOV A,#0EH
ACALL WRITE_COMMAND MOV A,#06H
ACALL WRITE_COMMAND RET
WAIT_LCD:
MOV R7,#100 WAITLCDLOOP:
MOV R6,#250 DJNZ R6,$
DJNZ R7,WAITLCDLOOP RET
Trang 16MOVX @DPTR,A SETB EN
CLR EN RET END
Trang 17BÀI 6: LẬP TRÌNH NGẮT
THÍ NGHIỆM 1:
Viết chương trình làm song song 2 công việc sau:
Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình terminal
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ả
SJMP LOOP SERIALINT:
JNB RI,SKIP CLR RI MOV A,SBUF MOV SBUF,A SKIP:
CLR TI RETI END
DISPLAYLED:
MOV A,R1 CJNE A,#0,ANONUM1 MOV A,#0E0H
ADD A,R0 SJMP DONE ANONUM1:
CJNE A,#1,ANONUM2 MOV A,#0D0H
Trang 18MOV DPTR,#0000H MOVX @DPTR,A RET
A,#7FH,COUNTDONE MOV R0,#23H
MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A SJMP COUNTDONE SKIP:
INC A
MOV @R0,A COUNTDONE:
RET DELAYBUTTON:
MOV R6,#40 DL2:
MOV R7, #250 DJNZ R7, $ DJNZ R6,DL2 RET
TIMER0INT:
CLR TR0 CJNE R1,#4,CONT MOV R1,#0
CONT:
MOV A,R1 ADD A,#20H MOV R0,A MOV A,@R0 MOV R0,A ACALL DISPLAYLED MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0
RETI DISPLAYLED:
Trang 19CJNE A,#2,ANONUM3 MOV A,#0B0H
ADD A,R0 SJMP DONE ANONUM3:
MOV A,#70H ADD A,R0 DONE:
MOV DPTR,#0000H MOVX @DPTR,A RET
END
THÍ NGHIỆM 4:
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
MOV P1,#0FFH MOV A,P1 CJNE A,#0FEH,ANOBUTTON1 MOV R0,#20H
MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 INC R0 MOV @R0,#0 CLR C
SJMP CONTCOUNT ANOBUTTON1:
CJNE A,#0FDH,ANOBUTTON2 SETB C
SJMP CONTCOUNT ANOBUTTON2:
CJNE A,#0FBH,CONTCOUNT
Trang 20MOV DPTR,#0000H MOVX @DPTR,A RET
TIMEVALUE:
JNC COUNTDONE MOV R0,#23H MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A DEC R0 MOV A,@R0 CJNE A,#9,SKIP MOV A,#0 MOV @R0,A SJMP COUNTDONE SKIP:
INC A MOV @R0,A SJMP COUNTDONE COUNTDONE:
Trang 21RET END
Trang 22ACALL DELAY1S CJNE R0,#59,INCS MOV R0,#0 CJNE R1,#59,INCM MOV R1,#0
CJNE R2,#23,INCH MOV R2,#0
SJMP FINISH INCS:
INC R0 SJMP FINISH INCM:
INC R1 SJMP FINISH INCH:
INC R2 FINISH:
ACALL CLEAR ACALL DISPHOUR ACALL DISPMIN ACALL DISPSEC SJMP LOOP
MOV A,P0 ACALL DELAY100MS CJNE A,#10111111B,ANOBUTHOUR1 MOV A,R2
CJNE A,#23,INCHOUR MOV R2,#0
ACALL CLEAR ACALL DISPHOUR SJMP ANOBUTHOUR3 INCHOUR:
INC R2 ACALL CLEAR ACALL DISPHOUR ANOBUTHOUR1:
CJNE A,#01111111B,ANOBUTHOUR2 MOV A,R2
CJNE A,#0,DECHOUR MOV R2,#23
ACALL CLEAR ACALL DISPHOUR SJMP ANOBUTHOUR3 DECHOUR:
DEC R2 ACALL CLEAR ACALL DISPHOUR ANOBUTHOUR2:
CJNE A,#11011111B,ANOBUTHOUR3 RET
INITMIN:
ACALL CLEAR MOV A,#0 MOV R4,#8 MOV DPTR,#MESSAGE3 INITMINLOOP:
MOV R5,A MOVC A, @A+DPTR ACALL WRITETEXT MOV A,R5
INC A DJNZ R4, INITMINLOOP ACALL DELAY1S
MOV R1,#0 ACALL CLEAR
Trang 23INC R0 ACALL CLEAR ACALL DISPSEC ANOBUTSEC1:
CJNE A,#01111111B,ANOBUTSEC2 MOV A,R0
CJNE A,#0,DECSEC MOV R0,#59
ACALL CLEAR ACALL DISPSEC SJMP ANOBUTSEC3 DECSEC:
DEC R0 ACALL CLEAR ACALL DISPSEC ANOBUTSEC2:
CJNE A,#11011111B,ANOBUTSEC3 RET
INITTIME:
ACALL CLEAR MOV A,#0 MOV R4,#9 MOV DPTR,#MESSAGE1 INITTIMELOOP:
MOV R5,A MOVC A, @A+DPTR ACALL WRITETEXT MOV A,R5
INC A DJNZ R4, INITTIMELOOP RET
DISPSEC:
MOV B,#10 MOV A,R0 DIV AB ADD A,#30H ACALL WRITETEXT MOV A,B
ADD A,#30H ACALL WRITETEXT RET
Trang 24MOV TMOD, #01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0
WAIT: JNB TF0, WAIT CLR TF0
CLR TR0 DJNZ R7,RECOUNT RET
DELAY100MS:
MOV R7,#2 RECOUNT1:
MOV TMOD, #01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0
WAIT1: JNB TF0, WAIT1 CLR TF0
CLR TR0 DJNZ R7,RECOUNT1 RET
MESSAGE1:
DB 'I','N','I','T',' ','T','I','M','E' MESSAGE2:
DB 'I','N','I','T',' ','H','O','U','R' MESSAGE3:
DB 'I','N','I','T',' ','M','I','N' MESSAGE4:
DB 'I','N','I','T',' ','S','E','C'
END