Báo cáo thí nghiệm Vi xử lý BKHCM

Báo cáo thí nghiệm Vi xử lý BKHCM

Nội dung Text: Báo cáo thí nghiệm vi xử lý

  1. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 ĐẠ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 VI XỬ LÍ Lớp : DD07TD Nhóm : 01 Tổ : 07 Họ và tên SV: MSSV: Nguyễn Thành Nam 40701531 Vũ Xuân Tầm 40702162 Dương Lâm Phương Nguyễn Thanh Nam 40701876 Phương Lê Bá Tấn
  2. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07
  3. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 Phần 1:  Làm việc với Vi điều khiển 89C51 Bài 1:  Thí Nghiệm với nút nhấn và LED đơn Thí nghiệm 1:  Viết chương trình thực hiện việc đọc liên tục trạng trạng thái của nút nhấn P1.0 và hiển thị ra LED được nối tại  chân P1.1 Code: ORG 2000H ;Doc trang thai cua chan P1.0 va xuat ra P1.1 LOOP: MOV C, P1.0 MOV P1.1, C SJMP LOOP END
  4. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz ra chân P1.0,biết tần số dao động được dùng trong KIT là 11.059MHz Code: ORG 2000H ;Tao xung vuong 1Hz tren P1.0 dung vong lap LAP: CPL P1.0 ACALL DL500 SJMP LAP DL500: PUSH 05 PUSH 06 PUSH 07 MOV R5, #10 L2: MOV R6, #100 L1: MOV R7, #250 DJNZ R7, $ DJNZ R6, L1 DJNZ R5, L2 POP 07 POP 06 POP 05 RET END Thí nghiệm 2: (Mở rộng) Thay đổi tần số xung vuông thành 0.5Hz, với chu kì nhiệm vụ là 30% Code: ORG 2000H ;Tao xung tan so 0.5Hz tren P1.0 voi chu ki nhiem vu 30% LAP: SETB P1.0 ; LCALL DL150 ; CLR P1.0 ; LCALL DL350 ; SJMP LAP ; DL150: PUSH 07 PUSH 06 PUSH 05 MOV R5, #2 ; L1_2: MOV R6, #150 ; L1_1: MOV R7, #250 ; DJNZ R7, $ ; DJNZ R6, L1_1; DJNZ R5, L1_2; POP 05 POP 06 POP 07 RET DL350: PUSH 07 PUSH 06 PUSH 05 MOV R5, #7 ; L2_2: MOV R6, #100 ; L2_1: MOV R7, #250 ; DJNZ R7, $ ; DJNZ R6, L2_1; DJNZ R5, L2_2;
  5. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 POP 05 POP 06 POP 07 RET END Thí nghiệm 3: Viết chương trình tạo xung vuông 1 Hz dùng Timer0 Code: ORG 2000H ;Tao xung vuong 1Hz tren P1.0 su dung Timer0 LAP: CPL P1.0 CALL DL500 SJPM LAP DL500: MOV TMOD, #01H ;Goi Timer0, Mode1 PUSH 05 MOV R5, #10 LOOP: MOV TH0, #HIGH(-50000) MOV TL0, #LOW(-50000) SETB TR0 JNB TF0, $ CLR TF0 CLR TR0 DJNZ R5, LOOP POP R5 RET END Thí nghiệm 3: (Mở rộng) Tận dụng ngắt Timer để tạo xung Code: ORG 2000H ;Tao xung 1Hz tren P1.0 dung ngat Timer0 LJMP MAIN ORG 200BH INC R5 CJNE R5, #10, ISRT0 MOV R5, #1 CPL P1.0 ISRT0: CLR TR0 CLR TF0 MOV TH0, #HIGH(-50000) MOV TL0, #LOW(-50000) SETB TR0 RETI ORG 2030H MAIN: MOV TMOD ,#01H SETB TF0 MOV IE, #82H SJMP $ END Thí nghiệm 4:
  6. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 Viết chương trình làm cho LED nối đến chân P1.0 chớp tắt với tần số có thể thay đổi được bằng cách nhấn P1.1 (tăng) hoặc  P1.2 (giảm) Code: ORG 2000H ;Tao xung tren P1.0 va thay doi theo P1.1 (tang), P1.2 (giam) MOV TMOD, #01H MOV A,#10 LOOP: JNB P1.1,TANG JNB P1.2,GIAM ;Tan so 1Hz lam trung binh,neu ko nhan nut nao thi van giu nguyen tan so cu CALL XUNG SJMP LOOP TANG: ;Xet xem A co la 255 hay chua CJNE A, #255, TANG1 SJMP LOOP ; A khac 255 TANG1: INC A CALL XUNG SJMP LOOP GIAM: CJNE A, #1, GIAM1 SJMP LOOP GIAM1: DEC A CALL XUNG SJMP LOOP XUNG: MOV R5, A DL50: MOV TH0, #HIGH(-50000) MOV TL0, #LOW(-50000) SETB TR0 JNB TF0, $ CLR TR0 CLR TF0 DJNZ R5, DL50 CPL P1.0 RET END Bài 2: Thí nghiệm hiển thị dùng LED 7 đoạn Thí nghiệm 1:
  7. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 Viết chương trình thực hiện bộ đếm từ 0 đến 9 và hiển thị ra LED 7 đoạn,mỗi lần cách nhau 2s Code: ORG 2000H ;bo dem tu 0 toi 9, hien thi tren LED 7 doan, moi lan cach nhau 2s CLR A MAIN: MOV R1, #10 MOV A,#0E0H LOOP: MOV DPTR, #0000H MOVX @DPTR, A INC A CALL DL2000 DJNZ R1,LOOP SJMP MAIN DL2000: PUSH 05 ;Delay 2s PUSH 06 PUSH 07 MOV R5, #20 DL2: MOV R6, #200 DL1: MOV R7, #250 DJNZ R7, $ DJNZ R6, DL1 DJNZ R5, DL2 POP 07 POP 06 POP 05 RET END Thí nghiệm 2: Viết chương trình hiển thị giá trị 1234 ra LED 7 đoạn. Code: ORG 2000H ;Bai 2, Thi nghiem 2 ;Hien thi 1234 len 4 LED 7 doan AGAIN: CLR A MOV R1, #4 LOOP: MOV DPTR, #TABLE MOVC A,@A+DPTR DJNZ R1,NEXT SJMP AGAIN ;lien tuc de tao hinh anh tren mat NEXT: CALL XUAT CALL DL3 INC DPTR SJMP LOOP XUAT: PUSH DPH PUSH DPL MOV DPTR, #0000H MOVX @DPTR, A POP DPL POP DPH RET DL3: PUSH 05 PUSH 06 MOV R5, #12 L1: MOV R6, #250
  8. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 DJNZ R6, $ DJNZ R5, L1 POP 06 POP 05 RET TABLE: DB 71H,0B2H,0D3H,0E4H END Thí nghiêm 2: Mở rộng Code: ORG 2000H ;Bai 2 Thi nghiem 2 mo rong ;Hien thi gia tri la ma BCD nen trong R7_R6 ra 4 LED ;R7=1_2, R6=3_4 MOV R7, #00010010B MOV R6, #00110100B CALL BP_2_B LOOP: ;Copy R5=>A,roi OR voi 70H MOV A,R5 ORL A, #70H CALL XUAT ;Copy R4=>A,OR voi 0B0H MOV A, R4 ORL A, #0B0H CALL XUAT ;Copy R3=>A,OR voi 0D0H MOV A, R3 ORL A, #0D0H CALL XUAT ;Copy R2=>A,OR voi 0E0H MOV A,R2 ORL A, #0E0H CALL XUAT SJMP LOOP BP_2_B: ;R7=>R5_R4,R6=>R3_R2 MOV A,R7 PUSH ACC ANL A, #0FH MOV R4, A POP ACC ANL A, #0F0H SWAP A MOV R5,A MOV A,R6 PUSH ACC ANL A, #0FH MOV R2, A POP ACC ANL A, #0F0H SWAP A MOV R3,A RET XUAT: ;Xuat + Delay 3ms
  9. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 MOV DPTR, #0000H MOVX @DPTR, A ;Delay 3ms PUSH 00 PUSH 01 MOV R0, #6 L1: MOV R1, #250 DJNZ R1, $ DJNZ R0, L1 POP 01 POP 00 RET END Thí nghiệm 3: Viết chương trình thể hiện giá trị nhị phân trong thanh ghi R7 ra LED 7 đoạn. Code: ORG 2000H ;Bai 2 Thi nghiem 3 ;Hien thi gia tri nhi phan trong R7 len LED 7 doan MOV R7, #0A0H ;Example R7= 160 MOV A, R7 CALL BIN_2_BCD LOOP: ;R6=>A,OR voi 0B0H roi xuat ra LED_2 MOV A, R6 ORL A, #0B0H CALL XUAT ;R5=>A,OR voi 0D0H xuat ra LED_3 MOV A, R5 ORL A, #0D0H CALL XUAT ;R4=>A,OR voi 0E0H xuat ra LED_4 MOV A, R4 ORL A, #0E0H CALL XUAT SJMP LOOP BIN_2_BCD: ;R7=R6_R5_R4 MOV B, #10 DIV AB MOV R4,B MOV B, #10 DIV AB MOV R6, A MOV R5, B RET XUAT: ;Xuat + Delay 3ms MOV DPTR, #0000H MOVX @DPTR, A ;Delay 3ms PUSH 02 PUSH 03 MOV R2, #6
  10. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 L1: MOV R3, #250 DJNZ R3, $ DJNZ R2, L1 POP 03 POP 02 RET END Bài 3: Thí nghiệm hiển thị dùng LCD Thí nghiệm 1: Code: ORG 2000H ;**************************************************** ;Hien thi chuoi "Hello" tren LCD ;**************************************************** EN BIT P3.4 RS BIT P3.5 CALL INIT_LCD MAIN: MOV DPTR, #TABLE LOOP: CLR A MOVC A, @A+DPTR CJNE A, #0, NEXT SJMP $ NEXT: CALL WRITE_LCD INC DPTR SJMP LOOP ;------------------------------------------------------ INIT_LCD: SETB EN CLR RS MOV A, #38H CALL SEND_COM MOV A, #06H CALL SEND_COM MOV A, #0EH CALL SEND_COM RET SEND_COM: PUSH DPH PUSH DPL SETB EN CLR RS MOV DPTR, #8000H MOVX @DPTR, A CLR EN LCALL WAIT_LCD POP DPH
  11. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 POP DPL RET WRITE_LCD: PUSH DPH PUSH DPL SETB EN SETB RS MOV DPTR, #8000H MOVX @DPTR, A CLR EN LCALL WAIT_LCD POP DPH POP DPL RET WAIT_LCD: MOV R6, #200 DL1: MOV R7, #250 DJNZ R7, $ DJNZ R6, DL1 RET TABLE: DB 'Hello',0 END • Thí nghiệm thêm: viết chương trình hiển thị lên LCD chữ “DHBK TPHCM” dịch trái và dịch phải: ORG 2000H RS BIT P3.5 EN BIT P3.4 CALL LCD_INIT MOV DPTR, #TABLE MAIN: CLR A MOVC A,@A+DPTR CJNE A,#0,NEXT SJMP KT NEXT: CALL WRITE_LCD INC DPTR SJMP MAIN KT: MOV R1, #6 KT1: MOV A,#1CH CALL WRITE_COM
  12. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 CALL WAIT_LCD DJNZ R1,KT1 MOV R1,#6 KT2: MOV A,#18H CALL WRITE_COM CALL WAIT_LCD DJNZ R1,KT2 SJMP KT LCD_INIT: MOV A,#01H CALL WRITE_COM MOV A,#38H CALL WRITE_COM MOV A, #0EH CALL WRITE_COM MOV A,#06H CALL WRITE_COM RET WRITE_COM: PUSH DPH PUSH DPL MOV DPTR, #8000H CLR RS SETB EN MOVX @DPTR, A CLR EN CALL WAIT_LCD POP DPL POP DPH
  13. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 RET WAIT_LCD: MOV R6 ,#250 LOOP: MOV R7,# 250 DJNZ R7,$ DJNZ R6, LOOP RET WRITE_LCD: PUSH DPH PUSH DPL MOV DPTR ,#8000H SETB RS SETB EN MOVX @DPTR,A CLR EN LCALL WAIT_LCD POP DPL POP DPH RET TABLE: DB 'DHBK TPHCM',0 END Bài 4: Thí nghiệm giao tiếp qua cổng nối tiếp 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 Hyper Terminal với tốc độ 19200pbs. Code: ORG 2000H MAIN: MOV TMOD, #20H MOV SCON, #42H MOV TH1, #-3 SETB TR1
  14. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 MOV DPTR, #TABLE NEXT: CLR A MOVC A, @A+DPTR CJNE A, #0, SEND SJMP $ SEND: JNB TI,$ CLR TI MOV SBUF,A INC DPTR SJMP NEXT TABLE: DB 'HELLO, WORLD',0 END Thí nghiệm 2: 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 Hyper Terminal (bằng cách gõ các  ký tự trên  bàn phím khi đang ở trong chương trình Hyper Terminal) và hiển thị lên LCD. Code: ORG 2000H EN BIT P3.4 RS BIT P3.5 MAIN: MOV DPTR,#8000H CALL LCD_INTL CALL CLR_LCD CALL UART_INTL LOOP: CALL IN_CHAR CALL WRT_TXT SJMP LOOP UART_INTL: MOV SCON,#52H MOV TMOD,#20H MOV TH1,#-3 SETB TR1 RET OUT_CHAR: JNB TI,$ CLR TI MOV SBUF,A RET IN_CHAR: JNB RI,$ CLR RI CALL CLR_LCD MOV A,SBUF RET LCD_INTL: MOV A,#38H CALL WRT_COM MOV A,#0EH CALL WRT_COM MOV A,#06H CALL WRT_COM MOV A,#0CH CALL WRT_COM RET
  15. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 WAIT_LCD: MOV R7,#50 DEL: MOV R6,#250 DJNZ R6,$ DJNZ R7,DEL RET WRT_TXT: CALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET WRT_COM: CALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET CLR_LCD: LCALL WAIT_LCD MOV A,#01H CALL WRT_COM RET END Thí nghiệm 3: Viết chương trình  nhận một ký tự từ cổng nối tiếp hiển thị lên LCD đồng thời phát ra cổng nối tiếp. Tốc độ tuỳ  chọn. Code: ORG 2000H EN BIT P3.4 RS BIT P3.5 MAIN: MOV DPTR,#8000H CALL LCD_INTL CALL CLR_LCD CALL UART_INTL LOOP: CALL IN_CHAR CALL WRT_TXT CALL OUT_UART SJMP LOOP UART_INTL: MOV SCON,#52H MOV TMOD,#20H MOV TH1,#-3 SETB TR1 RET OUT_CHAR: JNB TI,$ CLR TI MOV SBUF,A RET IN_CHAR: JNB RI,$
  16. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 CLR RI MOV A,SBUF RET LCD_INTL: MOV A,#38H CALL WRT_COM MOV A,#0EH CALL WRT_COM MOV A,#06H CALL WRT_COM MOV A,#0CH CALL WRT_COM RET WAIT_LCD: MOV R7,#50 DEL: MOV R6,#250 DJNZ R6,$ DJNZ R7,DEL RET WRT_TXT: CALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET WRT_COM: CALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET OUT_UART: PUSH ACC MOV SBUF, A JNB TI,$ CLR TI POP ACC RET CLR_LCD: LCALL WAIT_LCD MOV A,#01H CALL WRT_COM RET END BÀI TẬP THÊM : Viết chương trình nhận ký tự từ cổng nối tiếp, đông thới phát ra cổng n ối tiếp, v ới điều ki ện: - Nếu ký tự nhân được là số thì xuất ra Led - Nếu ký tự nhân được là chữ A-Z, a-z thì xuất ra LCD - Nếu ký tự nhận được là Enter thì xuống hàng , là ESC thì xóa trong màn hình LCD. Mã ASCII của Enter là 13, ESC là 27 ORG 2000H EN BIT P3.4 RS BIT P3.5 MOV TMOD,#20H MOV TL1,#-3
  17. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 MOV TH1,#-3 MOV SCON,#52H SETB TR1 MOV R1,#0 MOV DPTR,#8000H ACALL LCD_INIT LAP: ACALL RECEIVE ; kiểm tra phím nhấn Enter CJNE A,#13,TT MOV A,#0C0H ACALL WRITE_CMD SJMP THOAT ; kiểm tra phím nhấn ESC TT: CJNE A,#27,TT1 MOV A,#01H ACALL WRITE_CMD SJMP THOAT TT1: ; bắt đầu kiểm tra phím nhấn là số CJNE A,#30H,SO SO: JC THOAT CJNE A,#3AH,CHU ; kết thúc kiểm tra phím nhấn là số CHU: JC LED CJNE A,#41H,KHAC ; bắt đầu kiểm tra phím nhấn là chữ hoa KHAC: JC THOAT CJNE A,#5BH,HOA ; kết thúc kiểm tra phím nhấn là chữ hoa HOA: JC NHO CJNE A,#61H,KHAC1 ; bắt đầu kiểm tra phím nhấn là chữ thường KHAC1: JC THOAT CJNE A,#7BH,THUONG ; kết thúc kiểm tra phím nhần là chữ thường THUONG: JC NHO SJMP THOAT NHO: MOV DPTR,#8000H INC R1 ; kiểm tra nếu hiển thị hết hàng đầu tiên thì xuông hàng trong màn hình LCD CJNE R1,#17,XUONG XUONG: JC XUATLCD PUSH ACC MOV A,#0C0H ACALL WRITE_CMD POP ACC MOV R1,#0 XUATLCD: ACALL WRITE_cHAR SJMP THOAT LED: MOV DPTR,#0000H ANL A,#0FH ORL A,#0E0H MOVX @DPTR,A THOAT: MOV DPTR,#8000H ACALL SEND SJMP LAP LCD_INIT: MOV A, #38H ACALL WRITE_CMD MOV A, #0EH ACALL WRITE_CMD
  18. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 MOV A, #06H ACALL WRITE_CMD MOV A, #01H ACALL WRITE_CMD RET WAIT_LCD: MOV R7,#100 LOOP: MOV R6, #250 DJNZ R6,$ DJNZ R7, LOOP RET WRITE_CHAR: ACALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET WRITE_CMD: ACALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET RECEIVE: JNB RI,RECEIVE MOV A, SBUF CLR RI RET SEND: JNB TI,SEND MOV SBUF,A CLR TI RET END Bài 5: Thí nghiệm điều khiển ADC Thí nghiệm 1: Viết chương trình thực hiện đọc điện áp của biến trở trên kênh 0 và hiển thị ra led 7 đoạn. Code: ORG 2000H MAIN: MOV TMOD,#20H LOOP: MOV DPTR,#4000H MOV A,#0 MOVX @DPTR,A CALL DELAY100US MOVX A,@DPTR CALL BINTOBCD MOV DPTR,#0000H MOV A,R2
  19. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 ORL A,#0E0H MOVX @DPTR,A CALL DELAY3MS MOV A,R3 ORL A,#0D0H MOVX @DPTR,A CALL DELAY3MS MOV A,R4 ORL A,#0B0H MOVX @DPTR,A CALL DELAY3MS SJMP LOOP DELAY100US: MOV TH1,#-100 MOV TL1,#-100 SETB TR1 JNB TF1,$ CLR TF1 CLR TR1 RET BINTOBCD: MOV B,#10 DIV AB MOV R2,B MOV B,#10 DIV AB MOV R3,B MOV R4,A RET DELAY3MS: MOV R5,#10 LOOP1: MOV R6,#150 DJNZ R6,$ DJNZ R5,LOOP1 RET END Thí nghiệm 2: Viết chương trình thực hiện đọc điện áp của biến trở trên kênh 0 và hiển thị ra LCD. Code: ORG 2000H MAIN: CALL LCD_INIT MOV TMOD,#21H LOOP: MOV DPTR,#4000H MOV A,#0 MOVX @DPTR,A CALL DELAY100US MOVX A,@DPTR CALL BINTOASCII CALL CLR_LCD MOV A,R4
  20. Thí nghiệm Vi xử lí – Học kì hè 09­10Nhóm 07 CALL WRITE_TEXT MOV A,R3 CALL WRITE_TEXT MOV A,R2 CALL WRITE_TEXT CALL DELAY3MS CALL DELAY3MS SJMP LOOP DELAY100US: MOV TH1,#-100 MOV TL1,#-100 SETB TR1 JNB TF1,$ CLR TF1 CLR TR1 RET BINTOASCII: MOV B,#10 DIV AB MOV R2,B MOV B,#10 DIV AB MOV R3,B MOV R4,A MOV A,#30H ADD A,R2 MOV R2,A MOV A,#30H ADD A,R3 MOV R3,A MOV A,#30H ADD A,R4 MOV R4,A RET DELAY3MS: CLR TF0 MOV TH0,#HIGH(-10000) MOV TL0,#LOW(-10000) SETB TR0 JNB TF0,$ CLR TR0 RET LCD_INIT: MOV DPTR,#8000H SETB P3.4 CLR P3.5 MOV A,#38H MOVX @DPTR,A CLR P3.4 CALL DELAY3MS SETB P3.4 CLR P3.5 MOV A,#0EH MOVX @DPTR,A CLR P3.4 CALL DELAY3MS SETB P3.4