42
Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhó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 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:

Thi Nghiem VXL

Embed Size (px)

Citation preview

Page 1: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhó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.1LOOP: MOV C, P1.0

MOV P1.1, C SJMP LOOP END

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 lapLAP: 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

Page 2: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

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;POP 05 POP 06 POP 07 RETEND

Thí nghiệm 3:Viết chương trình tạo xung vuông 1 Hz dùng Timer0Code:

ORG 2000H;Tao xung vuong 1Hz tren P1.0 su dung Timer0LAP: CPL P1.0

CALL DL500 SJPM LAP

DL500: MOV TMOD, #01H ;Goi Timer0, Mode1PUSH 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 RETEND

Thí nghiệm 3: (Mở rộng)Tận dụng ngắt Timer0 để tạo xung

Code:

ORG 2000H;Tao xung 1Hz tren P1.0 dung ngat Timer0

LJMP MAINORG 200BH INC R5CJNE R5, #10, ISRT0

Page 3: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

MOV R5, #1 CPL P1.0

ISRT0: CLR TR0CLR TF0 MOV TH0, #HIGH(-50000)MOV TL0, #LOW(-50000) SETB TR0 RETIORG 2030H

MAIN: MOV TMOD ,#01HSETB TF0MOV IE, #82H SJMP $END

Thí nghiệm 4: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 cuCALL XUNGSJMP LOOP

TANG:;Xet xem A co la 255 hay chua

CJNE A, #255, TANG1SJMP LOOP

; A khac 255 TANG1:

INC ACALL XUNGSJMP LOOP

GIAM:CJNE A, #1, GIAM1 SJMP LOOP

GIAM1:DEC ACALL XUNGSJMP LOOP

XUNG:MOV R5, A

DL50:MOV TH0, #HIGH(-50000)MOV TL0, #LOW(-50000)SETB TR0JNB TF0, $CLR TR0CLR TF0DJNZ R5, DL50CPL P1.0RET

Page 4: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07END

Bài 2:

Thí nghiệm hiển thị dùng LED 7 đoạn

Thí nghiệm 1: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 AMAIN: MOV R1, #10

MOV A,#0E0HLOOP: MOV DPTR, #0000H

MOVX @DPTR, AINC ACALL DL2000DJNZ R1,LOOPSJMP MAIN

DL2000: PUSH 05 ;Delay 2sPUSH 06PUSH 07MOV R5, #20

DL2: MOV R6, #200 DL1: MOV R7, #250

DJNZ R7, $DJNZ R6, DL1DJNZ R5, DL2POP 07POP 06POP 05RETEND

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 doanAGAIN: CLR A

MOV R1, #4LOOP: MOV DPTR, #TABLE

MOVC A,@A+DPTRDJNZ R1,NEXTSJMP AGAIN ;lien tuc de tao hinh anh tren mat

NEXT:CALL XUATCALL DL3INC DPTR

Page 5: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

SJMP LOOPXUAT: PUSH DPH

PUSH DPLMOV DPTR, #0000HMOVX @DPTR, APOP DPLPOP DPHRET

DL3: PUSH 05PUSH 06MOV R5, #12

L1: MOV R6, #250DJNZ R6, $DJNZ R5, L1POP 06POP 05RET

TABLE: DB 71H,0B2H,0D3H,0E4H

END

Thí nghiêm 2: (Mở rộng) Hiển thị giá trị là mã BCD nén trong R7_R6 ra 4 LED

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, #00010010BMOV R6, #00110100BCALL BP_2_B

LOOP:;Copy R5=>A,roi OR voi 70H

MOV A,R5ORL A, #70HCALL XUAT

;Copy R4=>A,OR voi 0B0HMOV A, R4ORL A, #0B0HCALL XUAT

;Copy R3=>A,OR voi 0D0HMOV A, R3ORL A, #0D0HCALL XUAT

;Copy R2=>A,OR voi 0E0HMOV A,R2ORL A, #0E0HCALL XUATSJMP LOOP

BP_2_B: ;R7=>R5_R4,R6=>R3_R2MOV A,R7PUSH ACCANL A, #0FHMOV R4, APOP ACCANL A, #0F0HSWAP AMOV R5,A

Page 6: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

MOV A,R6PUSH ACCANL A, #0FHMOV R2, APOP ACCANL A, #0F0HSWAP AMOV R3,ARET

XUAT: ;Xuat + Delay 3msMOV DPTR, #0000HMOVX @DPTR, A

;Delay 3msPUSH 00PUSH 01MOV R0, #6

L1: MOV R1, #250DJNZ R1, $DJNZ R0, L1POP 01POP 00RET

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, R7CALL BIN_2_BCD

LOOP:;R6=>A,OR voi 0B0H roi xuat ra LED_2

MOV A, R6ORL A, #0B0HCALL XUAT

;R5=>A,OR voi 0D0H xuat ra LED_3MOV A, R5ORL A, #0D0HCALL XUAT

;R4=>A,OR voi 0E0H xuat ra LED_4MOV A, R4ORL A, #0E0HCALL XUATSJMP LOOP

BIN_2_BCD: ;R7=R6_R5_R4MOV B, #10DIV ABMOV R4,BMOV B, #10DIV ABMOV R6, A

Page 7: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

MOV R5, BRET

XUAT: ;Xuat + Delay 3msMOV DPTR, #0000HMOVX @DPTR, A

;Delay 3msPUSH 02PUSH 03MOV R2, #6

L1: MOV R3, #250DJNZ R3, $DJNZ R2, L1POP 03POP 02RET

END

Page 8: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

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.4RS BIT P3.5

CALL INIT_LCD

MAIN:MOV DPTR, #TABLE

LOOP: CLR AMOVC A, @A+DPTRCJNE A, #0, NEXTSJMP $

NEXT: CALL WRITE_LCDINC DPTRSJMP LOOP

;------------------------------------------------------INIT_LCD:

SETB ENCLR RSMOV A, #38HCALL SEND_COMMOV A, #06HCALL SEND_COMMOV A, #0EHCALL SEND_COMRET

SEND_COM:PUSH DPHPUSH DPLSETB ENCLR RSMOV DPTR, #8000HMOVX @DPTR, ACLR ENLCALL WAIT_LCDPOP DPHPOP DPLRET

WRITE_LCD:PUSH DPHPUSH DPLSETB EN

Page 9: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

SETB RSMOV DPTR, #8000HMOVX @DPTR, ACLR ENLCALL WAIT_LCDPOP DPHPOP DPLRET

WAIT_LCD:MOV R6, #200

DL1: MOV R7, #250DJNZ R7, $DJNZ R6, DL1RET

TABLE: DB 'Hello',0END

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 2000HRS BIT P3.5EN BIT P3.4CALL LCD_INITMOV DPTR, #TABLE

MAIN: CLR AMOVC A,@A+DPTRCJNE A,#0,NEXTSJMP KT

NEXT: CALL WRITE_LCDINC DPTRSJMP MAIN

KT: MOV R1, #6KT1: MOV A,#1CH

CALL WRITE_COMCALL WAIT_LCDDJNZ R1,KT1MOV R1,#6

KT2: MOV A,#18HCALL WRITE_COMCALL WAIT_LCDDJNZ R1,KT2SJMP KT

LCD_INIT:MOV A,#01HCALL WRITE_COMMOV A,#38HCALL WRITE_COMMOV A, #0EHCALL WRITE_COMMOV A,#06HCALL WRITE_COMRET

WRITE_COM:PUSH DPH

Page 10: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

PUSH DPLMOV DPTR, #8000HCLR RSSETB ENMOVX @DPTR, ACLR ENCALL WAIT_LCDPOP DPLPOP DPHRET

WAIT_LCD:MOV R6 ,#250

LOOP: MOV R7,# 250DJNZ R7,$DJNZ R6, LOOPRET

WRITE_LCD:PUSH DPHPUSH DPLMOV DPTR ,#8000HSETB RSSETB ENMOVX @DPTR,ACLR ENLCALL WAIT_LCDPOP DPLPOP DPH

RETTABLE:

DB 'DHBK TPHCM',0END

Page 11: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

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 2000HMAIN: MOV TMOD, #20H

MOV SCON, #42HMOV TH1, #-3SETB TR1

MOV DPTR, #TABLENEXT: CLR A

MOVC A, @A+DPTRCJNE A, #0, SENDSJMP $

SEND: JNB TI,$CLR TIMOV SBUF,AINC DPTRSJMP NEXT

TABLE: DB 'HELLO, WORLD',0END

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 2000HEN BIT P3.4RS BIT P3.5

MAIN:MOV DPTR,#8000HCALL LCD_INTLCALL CLR_LCDCALL UART_INTL

LOOP: CALL IN_CHARCALL WRT_TXTSJMP LOOP

UART_INTL:MOV SCON,#52HMOV TMOD,#20HMOV TH1,#-3SETB TR1RET

OUT_CHAR:JNB TI,$CLR TIMOV SBUF,ARET

IN_CHAR:JNB RI,$

Page 12: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

CLR RICALL CLR_LCDMOV A,SBUFRET

LCD_INTL:MOV A,#38HCALL WRT_COMMOV A,#0EHCALL WRT_COMMOV A,#06HCALL WRT_COMMOV A,#0CHCALL WRT_COMRET

WAIT_LCD:MOV R7,#50

DEL:MOV R6,#250DJNZ R6,$DJNZ R7,DELRET

WRT_TXT:CALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRT_COM:CALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

CLR_LCD:LCALL WAIT_LCDMOV A,#01HCALL WRT_COMRETEND

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 2000HEN BIT P3.4RS BIT P3.5

MAIN:MOV DPTR,#8000HCALL LCD_INTLCALL CLR_LCDCALL UART_INTL

LOOP: CALL IN_CHARCALL WRT_TXTCALL OUT_UARTSJMP LOOP

UART_INTL:

Page 13: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

MOV SCON,#52HMOV TMOD,#20HMOV TH1,#-3SETB TR1RET

OUT_CHAR:JNB TI,$CLR TIMOV SBUF,ARET

IN_CHAR:JNB RI,$CLR RIMOV A,SBUFRET

LCD_INTL:MOV A,#38HCALL WRT_COMMOV A,#0EHCALL WRT_COMMOV A,#06HCALL WRT_COMMOV A,#0CHCALL WRT_COMRET

WAIT_LCD:MOV R7,#50

DEL:MOV R6,#250DJNZ R6,$DJNZ R7,DELRET

WRT_TXT:CALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRT_COM:CALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

OUT_UART:PUSH ACCMOV SBUF, AJNB TI,$CLR TIPOP ACCRET

CLR_LCD:LCALL WAIT_LCDMOV A,#01HCALL WRT_COMRETEND

Page 14: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07BÀ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

tiếp. Tốc độ tuỳ chọn.

Code:

ORG 2000HMAIN:

EN BIT P3.4RS BIT P3.5CALL COM_INITCALL LCD_INIT

LOOP:CALL IN_CHARCJNE A,#13,KHAC13CALL XUONGHANG

KHAC13:CJNE A,#27,KHAC27CALL XOA_LCD

KHAC27:CALL CHUCALL SOJMP LOOP

SO:CJNE A,#30H,$+3JC THOATCJNE A,#3AH,$+3JNC THOATCALL LED

THOAT: RET

CHU:CJNE A,#41H,$+3JC THOAT1CJNE A,#5BH,$+3JNC KIEMTRACALL WRITE_TEXT

KIEMTRA:CJNE A,#61H,$+3JC THOAT1CJNE A,#7BH,$+3JNC THOAT1CALL WRITE_TEXT

THOAT1: RET

XOA_LCD:MOV A,#01HCALL WRITE_COMRET

XUONGHANG:MOV A,#0C0HCALL WRITE_COMRET

Page 15: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

COM_INIT:MOV SCON,#52HMOV TMOD,#20HMOV TH1,#-3SETB TR1RET

OUT_CHAR:JNB TI,$CLR TIMOV SBUF,ARET

IN_CHAR:JNB RI,$CLR RIMOV A,SBUFRET

LCD_INIT:MOV A,#0CHCALL WRITE_COMMOV A, #38HCALL WRITE_COMMOV A, #0EHCALL WRITE_COMMOV A, #06HCALL WRITE_COMMOV A, #01HCALL WRITE_COMRET

WAIT_LCD:MOV R7, #100LAP: MOV R6, #250DJNZ R6, $DJNZ R7, LAPRET

WRITE_TEXT:MOV DPTR,#8000HLCALL WAIT_LCDSETB RSSETB ENMOVX @DPTR, ACLR ENRET

WRITE_COM:MOV DPTR,#8000HLCALL WAIT_LCDCLR RSSETB ENMOVX @DPTR, ACLR ENRET

LED:SUBB A,#2FHORL A,#0E0HMOV DPTR,#0000hMOVX @DPTR,ARETEND

Page 16: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

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 2000HMAIN:

MOV TMOD,#20HLOOP: MOV DPTR,#4000H

MOV A,#0MOVX @DPTR,ACALL DELAY100USMOVX A,@DPTRCALL BINTOBCDMOV DPTR,#0000HMOV A,R2ORL A,#0E0HMOVX @DPTR,ACALL DELAY3MSMOV A,R3ORL A,#0D0HMOVX @DPTR,ACALL DELAY3MSMOV A,R4ORL A,#0B0HMOVX @DPTR,ACALL DELAY3MSSJMP LOOP

DELAY100US:MOV TH1,#-100MOV TL1,#-100SETB TR1JNB TF1,$CLR TF1CLR TR1RET

BINTOBCD:MOV B,#10DIV ABMOV R2,BMOV B,#10DIV ABMOV R3,BMOV R4,ARET

DELAY3MS:MOV R5,#10

LOOP1: MOV R6,#150DJNZ R6,$DJNZ R5,LOOP1RET

END

Page 17: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

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 2000HMAIN:

CALL LCD_INITMOV TMOD,#21H

LOOP: MOV DPTR,#4000HMOV A,#0MOVX @DPTR,ACALL DELAY100USMOVX A,@DPTRCALL BINTOASCIICALL CLR_LCDMOV A,R4CALL WRITE_TEXTMOV A,R3CALL WRITE_TEXTMOV A,R2CALL WRITE_TEXTCALL DELAY3MSCALL DELAY3MSSJMP LOOP

DELAY100US:MOV TH1,#-100MOV TL1,#-100SETB TR1JNB TF1,$CLR TF1CLR TR1RET

BINTOASCII:MOV B,#10DIV ABMOV R2,BMOV B,#10DIV ABMOV R3,BMOV R4,AMOV A,#30HADD A,R2MOV R2,AMOV A,#30HADD A,R3MOV R3,AMOV A,#30HADD A,R4MOV R4,ARET

DELAY3MS:CLR TF0MOV TH0,#HIGH(-10000)MOV TL0,#LOW(-10000)SETB TR0JNB TF0,$CLR TR0RET

Page 18: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

LCD_INIT:MOV DPTR,#8000HSETB P3.4CLR P3.5MOV A,#38HMOVX @DPTR,ACLR P3.4CALL DELAY3MSSETB P3.4CLR P3.5MOV A,#0EHMOVX @DPTR,ACLR P3.4CALL DELAY3MSSETB P3.4CLR P3.5MOV A,#06HMOVX @DPTR,ACLR P3.4CALL DELAY3MSRET

WRITE_TEXT:MOV DPTR,#8000HSETB P3.4SETB P3.5MOVX @DPTR,ACLR P3.4CALL DELAY3MSRET

CLR_LCD:MOV DPTR,#8000HSETB P3.4CLR P3.5MOV A,#01HMOVX @DPTR,ACLR P3.4CALL DELAY3MSRETEND

BÀI TẬP THÊM : Viết chương trình đọc điện áp thực của kênh 0 và hiển thị lên LCD

Code:

ORG 2000HRS BIT P3.5EN BIT P3.4MOV DPTR,#8000HACALL LCD_INIT

LAP: MOV DPTR,#4000HMOV A,#0MOVX @DPTR,AACALL DELAY_100USMOVX A,@DPTRMOV DPTR,#8000HACALL CHIA

Page 19: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

MOV A, #80HACALL WRITE_CMDSJMP LAP

LCD_INIT:MOV A, #38HACALL WRITE_CMD MOV A, #0CHACALL WRITE_CMDMOV A, #04HACALL WRITE_CMDMOV A, #01HACALL WRITE_CMDRET

WAIT_LCD:MOV R7,#100

LOOP: MOV R6, #250DJNZ R6,$DJNZ R7, LOOPRET

WRITE_CHAR:SETB RSMOVX @DPTR,ASETB ENCLR ENACALL WAIT_LCDRET

WRITE_CMD: CLR RSMOVX @DPTR,ASETB ENCLR ENACALL WAIT_LCDRET

DELAY_100US:MOV R6,#200DJNZ R6,$RET

CHIA: PUSH ACCPUSH BMOV B,#51DIV ABORL A,#30HACALL WRITE_CHARMOV A,#0A5HACALL WRITE_CHARMOV A,BMOV B,#5DIV ABORL A,#30HACALL WRITE_CHARPOP BPOP ACCRETEND

Page 20: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07Bài 6:

Thí nghiệm với LED ma trận

Thí nghiệm 1: Viết chương trình hiển thị chữ A ra LED ma trận

Code:

ORG 2000H;========================================;Xuat ky tu A tren LED ma tran;========================================MAIN:

MOV A, #01HMOV R0, #0

LAP: ACALL QUET_COTACALL QUET_HANGINC R0ACALL DELAYCJNE R0, #5, LAPSJMP MAIN

;-----------------------------------------QUET_COT:

PUSH DPHPUSH DPLRR AMOV DPTR, #MOVX @DPTR, APOP DPHPOP DPLRET

QUET_HANG:PUSH ACCPUSH DPHPUSH DPLMOV DPTR, #ACALL DU_LIEU_HANGMOVX @DPTR, APOP ACCPOP DPHPOP DPLRET

DU_LIEU_HANG:

PUSH DPHPUSH DPLMOV A, R0MOV DPTR, #CHAR_AMOVC A, @A+DPTRPOP DPHPOP DPLRET

DELAY:MOV R7, #4

LAPC1: MOV R6, #250DJNZ R6, $DJNZ R7, LAPC1

Page 21: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

RET

CHAR_A: DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFHEND

Thí nghiệm 2: Viết lại chương trình hiển thị chữ A ra LED ma trận có sử dụng chương trình con

Code:

ORG 2000H;==========================================;Xuat ky tu A tren LED ma tran (dung CTCon);==========================================MAIN:

MOV R0, #8MOV R1, #30HMOV DPTR, #CHAR_AMOV A, #0

LAP: MOVC A, @A+DPTRMOV @R1, AINC R1INC ADJNZ R0, LAPACALL XUAT

;-----------------------------------------XUAT:

PUSH ACCPUSH R0PUSH R1MOV A, #01HMOV R0, #0MOV R1, #30H

LAPC: ACALL QUET_COTACALL QUET_HANGINC R0INC R1ACALL DELAYCJNE R0, #7, LAPCPUSH ACCPUSH R0PUSH R1SJMP XUATRET

QUET_COT:PUSH DPHPUSH DPLRR AMOV DPTR, #MOVX @DPTR, APOP DPHPOP DPLRET

QUET_HANG:PUSH ACCPUSH DPH

Page 22: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

PUSH DPLMOV DPTR, #MOV A, @R1MOVX @DPTR, APOP ACCPOP DPHPOP DPLRET

DELAY:MOV R7, #4

LAPC1: MOV R6, #250DJNZ R6, $DJNZ R7, LAPC1RET

CHAR_A: DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFHEND

Page 23: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07Bài 7:

Thí nghiệm với động cơ DC

Thí nghiệm1: Viết chương trình cho phép động cơ chạy theo chiều thuận trong vòng 2s, nghỉ 2s, chạy theo chiều ngược 2s, nghỉ 2s và lặp lại.

Code:

ORG 2000HMAIN: MOV TMOD, #01H

MOV R1, #40MOV DPTR, #0E000H

NEXT: CLR ACALL THUANMOVX @DPTR, ACALL DELAYCALL NGHIMOVX @DPTR, ACALL DELAYCALL NGHICHMOVX @DPTR, ACALL DELAYCALL NGHIMOVX @DPTR, ACALL DELAYSJMP NEXT

NGHICH:SETB ACC.0CLR ACC.1RET

NGHI:CLR ACC.0CLR ACC.1RET

THUAN:CLR ACC.0SETB ACC.1RET

DELAY:PUSH 01

LAP: MOV TH0, #HIGH(-50000)MOV TL0, #LOW(-50000)SETB TR0JNB TF0, $CLR TR0CLR TF0DJNZ R1,LAPPOP 01RET

Page 24: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07Thí nghiệm2: Viết chương trình điều khiển động cơ với phương pháp PWM, trong đó thời gian bật của xung là 50% chu kỳ

Code:

ORG 2000H LJMP MAIN ORG 200BH LJMP ISR_T0 ORG 201BH LJMP ISR_T1 MAIN: MOV TMOD,#11H CLR A MOV IE,#8AH SETB TF0 MOV DPTR,#0E000HLAP: MOVX @DPTR,A SJMP LAPISR_T0: SETB ACC.0 CLR ACC.1 CLR TR0 MOV TL0,#LOW(-1000) MOV TH0,#HIGH(-1000) SETB TR0 CLR TR1 MOV TL1,#LOW(-500) MOV TH1,#HIGH(-500) SETB TR1 SETB ET1 RETIISR_T1: CLR ACC.0 CLR ACC.1 CLR ET1 RETI END

Thí nghiệm3: Viết chương trình điều khiển động cơ với phương pháp PWM, trong đó thời gian bật của xung lần lượt là 20%, 50%, và 80% chu kỳ. Mỗi độ rộng xung cách nhau 5s. Quy trình được lặp lại lien tục

Code:

ORG 2000H LJMP MAIN ORG 200BH LJMP ISR_T0 ORG 201BH LJMP ISR_T1 MAIN: MOV TMOD,#11H MOV R7,#50 MOV R6,#100 MOV R5,#0 CLR A MOV IE,#8AH SETB TF0 MOV DPTR,#0E000H

Page 25: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

LAP: MOVX @DPTR,A SJMP LAPISR_T0: SETB ACC.0 CLR ACC.1 CLR TR0 MOV TL0,#LOW(-1000) MOV TH0,#HIGH(-1000) SETB TR0 DJNZ R6,TT MOV R6,#100 DJNZ R7,TT MOV R7,#50 MOV R6,#100 INC R5TT: CJNE R5,#0,KHAC20 CLR TR1 MOV TL1,#LOW(-200) MOV TH1,#HIGH(-200) SETB TR1 SJMP EXITKHAC20: CJNE R5,#1,KHAC50 CLR TR1 MOV TL1,#LOW(-500) MOV TH1,#HIGH(-500) SETB TR1 SJMP EXIT

KHAC50: CJNE R5,#2,KHAC80 CLR TR1 MOV TL1,#LOW(-800) MOV TH1,#HIGH(-800) SETB TR1 SJMP EXITKHAC80: MOV R5,#00H

EXIT: SETB ET1 RETI

ISR_T1: CLR ACC.0 CLR ACC.1 CLR ET1 RETI END

Thí nghiệm4: Viết chương trình thực hiện việc tăng hoặc giảm dần tốc độ động cơ nhờ 2 nút nhấn P1.4 và P1.5. Khi không nhấn nút, tốc độ động cơ không đổi. Khi nút P1.4 được nhấn và giữ thì tốc độ động cơ tăng dần.Khi nút P1.5 được nhấn và giữ lại thì tốc độ động cơ giảm dần

Code:

org 2000hljmp mainorg 200bhljmp isr_t0

Page 26: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

org 201bhljmp isr_t1org 2030hic573 equ 0E000Hmain: mov tmod, #11hmov r1, #0 ;r1 la bien trang thai

;r1=0=> 0% ,r1=1=> 40%, r1=2=> 60%, r1=3=>80%, r1=4=>100%mov ie,#8Ahclr amov th0, #high(-1000)mov tl0, #low(-1000)setb tr0sjmp $

isr_t0:;nap lai gia tri

clr tr0clr tf0mov th0, #high(-1000)mov tl0, #low(-1000)setb tr0

call checkcjne r1, #0,state1sjmp 20per

state1: cjne r1, #1,state2sjmp 40per

state2: cjne r1, #1,state3sjmp 60per

state3: cjne r1, #1,state4sjmp 80per

state4: sjmp 100per

20per:mov th1,#high(-200)mov tl1, #low(-200)sjmp kt

40per:mov th1,#high(-400)mov tl1, #low(-400)sjmp kt

80per:mov th1,#high(-800)mov tl1, #low(-800)sjmp kt

100per:mov th1,#high(-1000)mov tl1, #low(-1000)

kt: setb tr1reti

check:jnb p1.4,tangjnb p1.5,giamsjmp kt1

tang: call delayjb p1.4,tang1

het_tang: mov r1, #4sjmp kt1

tang1: inc r1cjne r1, #5,het_tang

Page 27: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

sjmp kt1giam:

call delayjb p1.5,giam1

het_giam: mov r1, #0sjmp kt1

giam1: dec r1cjne r1, #255,het_giamsjmp kt1

kt1: ret

isr_t1:clr tr1clr tf1cpl acc.0mov dptr, #ic573movx @dptr,areti

delay: PUSH 07 PUSH 06 PUSH 05 MOV R5, #20 ;

L2_2: MOV R6, #250 ;L2_1: MOV R7, #250 ;

DJNZ R7, $ ;DJNZ R6, L2_1;DJNZ R5, L2_2;POP 05 POP 06 POP 07 RET

end

Page 28: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

Phần2: Làm việc với PIC 16F690

Bài 7:

Thí nghiệm với LED đơn

Thí nghiệm1: Viết chương trình chớp tắt LED được nối đến chân RC2 của PIC 16F690 với tần số chớp tắt là 1Hz.

Code:

#include <16F690.h>#use delay(clock=4000000)#use fast_io(C)void main(){set_tris_C(0x00);output_C(0x00);while(1) { output_high(PIN_C0); delay_ms(500); output_low(PIN_C0); delay_ms(500); }}

Thí nghiệm2: Viết chương trình thực hiện mạch LED chạy được nối đến 4 LED port C của PIC 16F690 như sau, biết thời gian giữa các trạng thái S (sáng) và T (tắt) là 0.5s: STTT->TSTT->TTST->TTTS->STTT->…

Code:

#include <16F690.h>#use delay(clock=4000000)#use fast_io(C)void main(){int value=1;set_tris_C(0x00);

Page 29: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

output_C(0x00);while(1) { output_C(value); delay_ms(500); if(value!=0x08) value<<=1; else value=1; }}

Thí nghiệm3: Viết chương trình thực hiện mạch đếm lên bắt đầu từ 0 đến 15, kết quả xuất ra 4 LED đơn được nối đến port C của PIC 16F690 . Giá trị mạch đếm tăng lên 1 đơn vị cách nhau 1s.

Code:

#include <16F690.h>#use delay(clock=4000000)#use fast_io(C)void main(){int value=0;set_tris_C(0x00);output_C(0x00);while(1){output_C(value);delay_ms(500);value++;if(value==16)value=0;}}

Thí nghiệm4: Viết chương trình thực hiện mạch đếm lên bắt đầu từ 0 đến 15, kết quả xuất ra4 LED đơn được nối đến port C của PIC 16F690. Mạch chỉ đếm khi SW1 được nhấn.

Code:

#include <16F690.h>#use delay(clock=4000000)#use fast_io(C)#use fast_io(A)void main(){int value=0;set_tris_A(0x08);set_tris_C(0x00);output_C(0xFF);while(1) {

Page 30: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

while(input(pin_A3)); while(!input(pin_A3)) { value++; if(value==16) value=0; output_C(value); } }}

Page 31: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

Bài 8:

Thí nghiệm với LED 7 đoạn

Thí nghiệm1: Viết chương trình thực hiện mạch đếm lên từ 0 đến F (số Hex), kết quả xuất ra LED 7 đoạn, giá trị bộ đếm tăng lên 1 đơn vị cách nhau mỗi 0.5s.

Code:

#include<16f690.h>#use delay (clock= 4000000)#use fast_io(a)#use fast_io(c)void main () { int state1[16]={0x06,0x04,0x07,0x07,0x05,0x03,0x03,0x06,0x07,0x07,0x07,0x01,0x02,0x05,0x03,0x03}; int state2[16]={0x0F,0x01,0x06,0x03,0x09,0x0B,0x0F,0x01,0x0F,0x0B,0x0D,0x0F,0x0E,0x07,0x0E,0x0c}; int i; set_tris_a(0x00); set_tris_c(0x00); while(1) { for(i=0;i<16;i++) { output_a(state1[i]); output_c(state2[i]); delay_ms(500); } } }

Thí nghiệm2: Viết chương trình đếm số lần nhấn SW1, kết quả xuất ra led đơn (giả sử số lần nhấn nhỏ hơn 10).

Code:

#include<16f690.h>#use delay (clock= 4000000)#use fast_io(a)#use fast_io(c)void main (){ int value=0; set_tris_a(0xFF); set_tris_c(0x00); output_C(0x00);

Page 32: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

while(1) { while(!input(pin_A1)) { value++; if(value==16) value=0; output_C(value); delay_ms(1000); } }}

Thí nghiệm3: Viết chương trình thực hiện mạch đếm thoả các yêu cầu sau:

Đếm lên từ 0 đến F (số Hex) khi mạch vừa reset,

Đếm xuống từ F đến 0 (số Hex) ki SW1 được nhấn.

Kết quả xuất ra led đơn , giá trị bộ đếm tăng lên (giảm xuống ) 1 đơn vị cách nhau mỗi 0.5s.

Code:

#include<16f690.h>#use delay (clock= 4000000)#use fast_io(a)#use fast_io(c)void main () { int value=0; int value2=16; set_tris_a(0xFF); set_tris_c(0x00); while(1) { Laplai: value++; if(value==16) value=0; output_C(value); delay_ms(1000); if(!input(pin_A1)) { while(1) { value2--; if(value2==0) value2=16; output_C(value2); delay_ms(1000); if(!input(pin_A1)) { value2=16; value=0; goto Laplai; } } }

Page 33: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

} }

Bài 9:

Thí nghiệm với ADC

Thí nghiệm1: Viết chương trình đọc giá trị điện áp của biến trở RP1 và xuất mức điện áp tương ứng với giá trị điện áp đọc được ra LED 7 đoạn ( dung ADC với độ phân giải 10 bits) được cho bởi bảng sau:

Mức (ngõ ra bộ ADC) Giá trị hiển thị trên LED 7 đoạn

0-63 0

64-127 1

128-191 3

… …

832-895 D

896-959 E

960-1023 F

Code:

#include <16f690.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#use delay (clock= 4000000)#use fast_io(a)#use fast_io(c)void main (){ int i; int a; set_tris_c(0x00); set_tris_a(0xff); setup_adc_ports( ALL_ANALOG ); setup_adc(ADC_CLOCK_DIV_32); set_adc_channel( 0); delay_ms(10);while(1){ a= read_adc(); if (0<=a&&a<=63) {i=0;

Page 34: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

} else if(64<=a&&a<=127) { i=1; } else if(128<=a&&a<=191) {i=2; } else if(192<=a&&a<=255) {i=3; } else if(256<=a&&a<=319) {i=4; } else if(320<=a&&a<=383) {i=5; } else if(384<=a&&a<=447) {i=6; } else if(448<=a&&a<=511) {i=7; } else if(512<=a&&a<=575) {i=8; } else if(576<=a&&a<=639) {i=9; } else if(640<=a&&a<=703) {i=10; } else if(704<=a&&a<=767) {i=11; } else if(768<=a&&a<=831) {i=12; } else if(832<=a&&a<=895) {i=13; } else if(896<=a&&a<=959) {i=14; } else if(960<=a&&a<=1023) {i=15; }

output_c(i);}

Page 35: Thi Nghiem VXL

Thí nghiệm Vi xử lí – Học kì hè 09-10 Nhóm 07

}

Thí nghiệm2: Viết chương trình đọc giá trị ngõ ra ADC với độ phân giải 10 bits dung để điều khiển thời gian chớp tắt LED đơn được nối đến chân RC0 của PIC 16F690.

Code:

#include <16f690.h>#include <math.h>#include <stdio.h>#include <stdlib.h>#use delay (clock= 4000000)#use fast_io(a)#use fast_io(c)void main (){ int i; int a; set_tris_c(0x00); set_tris_a(0xff); setup_adc_ports( ALL_ANALOG );

setup_adc(ADC_CLOCK_DIV_32);

set_adc_channel( 0); delay_ms(10);

while(1){ a= read_adc(); i=a/16; output_c(i);}

}