thi nghiem vxl
TRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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,$
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:
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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);
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) {
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); } }}
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);
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; } } }
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;
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);}
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);}
}