TN vi xu ly

Màu nền
Font chữ
Font size
Chiều cao dòng

 THÍ NGHIỆM VI X? LÝ EME – MC8

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 đọc liện tục trạng thái nút nhấn được nối đến P1.0 và hiển thị ra Led được nối tại chân P1.1 ( bit thứ 1 của port 1)

ORG   2000H

MAIN:

                  MOV  C,P1.0

                  MOV  P1.1,C

                  SJMP  MAIN

                  END

Khi nhấn có 2 đèn sáng cùng lúc vì:

-Tác động tới led nối với chân P1.0

-Tác động tới led nối với chân P1.1 thông qua chương trình. Vì chương trình thực thi trong thời gian rất ngắn nên 2 led sáng cùng lúc.

Các bit của 4 port được sử dụng trong thì nghiệm trên: Vì EME-MC8 thiết kế hoat động ở chế độ 3 bus, nên port 0: bus dữ liệu, port 2: bus địa chỉ, P3.0, P3.1, P3.6, P3.7 dùng làm bus điều khiển. Các chân còn lại của các port đều có thể dùng trong thí nghiệm này.

Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz được nối đến chân P1.0 với tần số dao động dùng trong hệ thống là 11.059MHz

a.      Duty cycle: 50% - Hz

ORG   2000H

LAP:  

                  CPL     P1.0

                  CALL  DL500MS

                  SJMP  LAP

DL500MS:    

                  MOV  R5,#10

L2:     

                  MOV  R6,#100

L1:     

                  MOV  R7,#250

                  DJNZ  R7,$

                  DJNZ  R6,L1

                  DJNZ  R5,L2

      RET

END

b.      Duty cycle: 30% - tần số 0.5Hz

ORG   2000H

LAP:  

MOV R1,#3

                        MOV R2,#7

                        CLR    P1.0

LAP1:

                        ACALL  DL

                         DJNZ  R1,LAP1

                        SETB  P1.0

LAP2:

                        ACALL  DL

                        DJNZ  R2,LAP2

                        SJMP  LAP

DL:                             ;Chương trình delay 50ms

            L2:      MOV  R5,#4

            L1:      MOV  R6,#200

                        MOV  R7,#250

                        DJNZ  R7,$

                        DJNZ  R6,L1

                        DJNZ  R5,L2

                        RET

END

Thí nghiệm 3:

a.      Viết chương trình tạo xung vuông 1Hz dùng timer 0

ORG   2000H

MAIN:

                        CPL     P1.0

                        ACALL  DL500

                        SJMP  MAIN

DL500:

                        MOV  TMOD,#01H

                        MOV  R7,#10

LOOP:

                        MOV  TH0,#HIGH(-50000) ; giá trị nạp là 50000*10 = 500000us = 0.5s

                        MOV  TL0,#LOW(-50000)

                        SETB  TR0

                        JNB     TF0,$                          ; đợi cờ TF0 tràn và xóa cờ tràn

                        CLR    TF0

                        CLR    TR0

                        DJNZ  R7,LOOP

                        RET

                        END

b.      Dùng ngắt Timer 0:

ORG   2000H

LJMP  MAIN

ORG    200BH                       

LJMP  ISRT0

MAIN:

      MOV  TMOD,#01H

      SETB  TF0

      MOV  IE,#82H

      MOV  R7,#11

      SJMP  $

ISRT0: 

DJNZ  R7,DAT

      CPL     P1.0

      MOV  R7,#10

      SJMP  KT

DAT: 

CLR    TR0

      MOV  TH0,#HIGH(-50000)

      MOV  TL0,#LOW(-50000)

      SETB  TR0

KT:     RETI

      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ể tăng hoặc giảm bằng cách nhấn nút nối đến chân P1.1 hoặc P1.2.  Chu kì chớp tắt trung bình là 1s

ORG   2000H

MAIN:

            CPL     P1.0

                        MOV  A,#10

                        MOV  R7,A

                        JB        P1.1, GIAM

                        DEC    A                     ;Khi nhấn P1.1 thì f tăng  Chu kỳ giảm  giảm R7

                        MOV  R7,A 

                        SJMP  LAP                ; mỗi lần giảm là 1*25000us = 0.025s

GIAM:

                        JB        P1.2,LAP

                        INC     A

                        MOV  R7,A

LAP:

                        ACALL  DL500

                        DJNZ  R7,LAP

                        SJMP  MAIN

DL500:

                        MOV  TMOD,#01H

                        MOV  TH0,#HIGH(-25000) ; giá trị là 50000*R7 (R7TB = 10) = 500000us = 0.5s

                        MOV  TL0,#LOW(-25000)

                        SETB  TR0

                        JNB     TF0,$                          ; đợi cờ TF0 tràn và xóa cờ tràn

                        CLR    TF0

                        CLR    TR0

                        RET

                        END

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->9 và hiển thị trên led 7 đoạn, mỗi lần cách nhau 2s

            ORG 2000H

MAIN:            MOV R7,#0

L2:      MOV A,R7

            MOV DPTR,#TABLE

            MOVC A,@A+DPTR

            INC R7

            CJNE R7,#10,L1

            MOV R7,#0

L1:      MOV DPTR,#0

            MOVX @DPTR,A

            ACALL DL

            SJMP L2

DL:     MOV R6,#40

LAP:   MOV TMOD,#01H  

            MOV TH0,#HIGH(-50000)

            MOV TL0,#LOW(-50000)

            SETB TR0     

            JNB TF0,$

            CLR TF0

            CLR TR0

            DJNZ R6, LAP

            RET

END

TABLE:

            DB 0E0H, 0E1H, 0E2H, 0E3H, 0E4H, 0E5H, 0E6H, 0E7H, 0E8H, 0E9H

Thí nghiệm 2:

a.      Viết chương trình hiển thị giá trị 1234 lên led 7 đoạn

                                    ORG 2000H

MAIN:            MOV R7,#0

L2:      MOV DPTR,#TABLE

            MOV A,R7

            MOVC A,@A+DPTR

            INC R7

            CJNE R7,#4,L1

            MOV R7,#0

L1:      MOV DPTR,#0

            MOVX @DPTR,A

            ACALL DL

            SJMP L2

DL:     MOV TMOD,#01H  

            MOV TH0,#HIGH(-1000)

            MOV TL0,#LOW(-1000)

            SETB TR0     

            JNB TF0,$

            CLR TF0

            CLR TR0

            RET

            END

TABLE:

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

b.      Thay đổi chương trình để giá trị 1234 có thể hiển thị thông qua mã BCD nén chứa trong cặp thanh ghi R7 & R6,Biết R7 là MSB

                        ORG 2000H

MAIN:            MOV DPTR,#0

L1:      MOV A,R7

            MOV B,#0

            DIV AB

            ADD A,#70H

            MOVX @DPTR,A

            ACALL DL

            MOV A,B

            ADD A,#0B0H

            MOVX @DPTR,A

            ACALL DL

            MOV A,R6

            MOV B,#0

            DIV AB

            ADD A,#0D0H

            MOVX @DPTR,A

            ACALL DL

            MOV A,B

            ADD A,#0E0H

            MOVX @DPTR,A

            ACALL DL

            SJMP L1

DL:     MOV TMOD,#01H  

            MOV TH0,#HIGH(-1000)

            MOV TL0,#LOW(-1000)

            SETB TR0     

            JNB TF0,$

            CLR TF0

            CLR TR0

            RET

            END

Thí nghiệm 3: Viết chương trình hiển thị giá trị nhị phân trong thanh ghi R7 lên led 7 đoạn

            ORG 2000H

MAIN:            MOV DPTR,#0

L1:      MOVX @DPTR,#70H

            ACALL DL

            MOV A,R7

            MOV B,#10

            DIV AB

            MOV R6,A

            MOV A,B

            ADD A,#0E0H

            MOVX @DPTR,A

            ACALL DL

            MOV B,#10

            MOV A,R6

            DIV AB

            ADD A,#0B0H

            MOVX @DPTR,A

            MOV A,B

            ADD A,#0D0H

            MOVX @DPTR,A

            ACALL DL

            SJMP L1

DL:     MOV TMOD,#01H  

            MOV TH0,#HIGH(-1000)

            MOV TL0,#LOW(-1000)

            SETB TR0     

            JNB TF0,$

            CLR TF0

            CLR TR0

            RET

            END

BÀI TẬP:

Viết chương trình đếm từ 0-60 rồi lặp lại, mỗi lần đếm cách nhau 1s

ORG   2000H

                        MOV  R6,#0

                        MOV  R7,#0

LOOP1:

                        MOV  R5,#100          ; gán R5 = 100*(5ms+5ms) = 1s để led xuất ra có sự lưu ảnh.

LOOP:

            MOV  DPTR,#0

                        MOV  A,R7

                        ADD   A,#0E0H

                        MOVX  @DPTR,A

                        ACALL  DL5MS

                        MOV  A,R6

                        ADD   A,#0D0H

                        MOVX  @DPTR,A

                        ACALL  DL5MS

                        DJNZ  R5,LOOP

                        INC     R7

                        CJNE  R7,#0AH,LOOP1

                        MOV  R7,#0

                        INC     R6

                        CJNE  R6,#6,LOOP1

                        MOV  R6,#0

                        SJMP  LOOP1

DL5MS:        

                        MOV  TMOD,#01H

                        MOV  TH0,#HIGH(-5000)

                        MOV  TL0,#LOW(-5000)

                        SETB  TR0

                        JNB     TF0,$

                        CLR    TF0

                        CLR    TR0

                        RET

                        END

BÀI 3: THÍ NGHI?M HI?N TH?  B?NG LCD

Thí nghi?m 1:

a. Hi?n th? chu?i “Hello” lên LCD

ORG         2000H

EN BIT P3.4

RS BIT P3.5        

MAIN:

                  MOV  DPTR,#8000H

                              ACALL  INIT_LCD

                  ACALL  HIEN_CHU

                  SJMP $

INIT_LCD:          MOV  A,#01H

                  ACALL  WRITECOM

                  MOV  A,#38H

                  ACALL  WRITECOM

                  MOV  A,#0CH

                  ACALL  WRITECOM

                  MOV  A,#06H

                  ACALL  WRITECOM

                  RET

WRITECOM:      MOV DPTR,#8000H

                  SETB EN

                  CLR RS

                  MOVX  @DPTR,A

                  CLR    EN

                  ACALL  DELAY_5MS

                  RET

WRITETEXT:     MOV DPTR,#8000H

                  SETB  EN

                  SETB  RS

                  MOVX  @DPTR,A

                  CLR    EN

                  ACALL  DELAY_5MS

                  RET

HIEN_CHU:

                  MOV  A,#'H'

                  ACALL  WRITETEXT

                  MOV  A,#'E'

                  ACALL  WRITETEXT

                  MOV  A,#'L'

                  ACALL  WRITETEXT

                  MOV  A,#'L'

                  ACALL  WRITETEXT

                  MOV  A,#'O'

                  ACALL  WRITETEXT

                  RET

DELAY_5MS:                

                  MOV  R3,#10

LOOP1:               

                  MOV  R7,#250

                  DJNZ  R7,$

                  DJNZ  R3,LOOP1

                  RET

END

b.Xuất chuỗi ‘HELLO’ dùng phương pháp tra bảng:

ORG 2000H

EN BIT P3.4

RS BIT P3.5

MAIN:            CALL INIT_LCD

            MOV R4,#0

LAP:   MOV DPTR,#BANG

            MOV A,R4

            MOVC A,@A+DPTR

            CALL WRITETEXT

            INC R4

            CJNE R4,#5,LAP

            SJMP $

INIT_LCD:    MOV  A,#01H

                        ACALL  WRITECOM

                        MOV  A,#38H

                        ACALL  WRITECOM

                        MOV  A,#0CH

                        ACALL  WRITECOM

                        MOV  A,#06H

                        ACALL  WRITECOM

                        RET

WRITECOM:            MOV DPTR,#8000H

                        SETB EN

                        CLR RS

                        MOVX  @DPTR,A

                        CLR    EN

                        ACALL  DELAY_5MS

                        RET

WRITETEXT:           MOV DPTR,#8000H

                        SETB  EN

                        SETB  RS

                        MOVX  @DPTR,A

                        CLR    EN

                        ACALL  DELAY_5MS

                        RET

DELAY_5MS:                      

                        MOV  R3,#10

LOOP1:                     

                        MOV  R7,#250

                        DJNZ  R7,$

                        DJNZ  R3,LOOP1

                        RET

BANG:DB 'HELLO'

END  

BÀI 4: THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP

Thí nghi?m 1: Phát chu?i “Hello World” ra port n?i ti?p

                        ORG   2000H

MAIN:

                        MOV  SCON,#52H

                        MOV  TMOD,#20H

                        MOV  TH1,#-3

                        SETB  TR1

                        MOV  DPTR,#TABLE

LAP:  

                        CLR    A

                        MOVC  A,@A+DPTR

                        INC     DPTR

                        ACALL  OUT_CHAR

                        JNZ LAP       

                        SJMP  $         

OUT_CHAR:

                        JNB     TI, $   

                        CLR    TI

                        MOV  SBUF, A

                        RET

TABLE:

                        DB      'Hello world',0

END

Thí nghi?m 2: Nh?n kí t? t? port n?i ti?p hi?n th? ra LCD (t?c đ? port ch?n là 9600pbs)

                        ORG   2000H

EN       BIT     P3.4

RS       BIT     P3.5

MAIN:                                                           

                        MOV  DPTR, #8000H

                        ACALL  LCD_INIT

                        ACALL  UART_INIT

LOOP:                        ACALL  CLEAR

MOV  R4,#16

LAP1:            

                        ACALL  IN_CHAR

                        ACALL  WRITE_TEXT

                        DJNZ  R4,LAP1

MOV  R4,#16

                        MOV  A,#0C0H

                        ACALL  WRITE_COM

LAP2:            

                        ACALL  IN_CHAR

                        ACALL  WRITE_TEXT

                        DJNZ  R4,LAP2

                        SJMP  LOOP

UART_INIT:

                        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

                        MOV  A, SBUF

                        SUBB A,#27

                        JZ LOOP

                        ADD A,#27

RET

LCD_INIT:

                        MOV  A,#38H

                        ACALL  WRITE_COM

                        MOV  A,#0CH

                        ACALL  WRITE_COM

                        MOV  A,#06H

                        ACALL  WRITE_COM

                        RET

CLEAR:

                        MOV  A,#01H

                        ACALL  WRITE_COM

                        RET

WAIT_LCD: 

                        MOV  R7, #100

DEL1: 

                        MOV  R6, #250

                        DJNZ  R6, $

                        DJNZ  R7, DEL1

                        RET

WRITE_TEXT:        

                        ACALL  WAIT_LCD

                        SETB  RS

                        MOVX  @DPTR, A

                        SETB  EN

                        CLR    EN

                        RET

WRITE_COM:         

                        ACALL  WAIT_LCD

                        CLR    RS

                        MOVX  @DPTR, A

                        SETB  EN

                        CLR    EN

                        RET

                        END

3.    Thí nghi?m 3: Nh?n kí t? t? port n?i ti?p hi?n th? ra LCD đ?ng th?i phát ra l?i port n?i ti?p (t?c đ? port ch?n là 9600pbs)

ORG         2000H

EN BIT     P3.4

RS BIT     P3.5

MAIN:

                  MOV  DPTR, #8000H

                  ACALL  LCD_INIT

                  ACALL  UART_INIT

                  ACALL  CLEAR

LOOP:     

MOV        R4,#16

LAP1:      

                  ACALL  IN_CHAR

                  ACALL  WRITE_TEXT

                  ACALL  OUT_CHAR

                  DJNZ R4,LAP1

                  MOV  R4,#16

                  MOV  A,#0C0H

                  ACALL  WRITE_COM

LAP2:      

                  ACALL  IN_CHAR

                  ACALL  WRITE_TEXT

                  ACALL  OUT_CHAR

                  DJNZ  R4,LAP2

                  ACALL  CLEAR

                  SJMP  LOOP

UART_INIT:

                  MOV  SCON,#52H

                  MOV  TMOD,#20H

                  MOV  TH1,#-12

                  SETB  TR1

                  RET

OUT_CHAR:

                  JNB     TI, $

                  CLR    TI

                  MOV  SBUF, A

                  RET

IN_CHAR:

                  JNB     RI, $

                  CLR    RI

                  MOV  A, SBUF

                  RET

LCD_INIT:

                  MOV  A,#38H

                  ACALL  WRITE_COM

                  MOV  A,#0EH

                  ACALL  WRITE_COM

                  MOV  A,#06H

                  ACALL  WRITE_COM

                  RET

CLEAR:

                  MOV  A,#01H

                  ACALL  WRITE_COM

                  RET

WAIT_LCD:                    MOV  R7, #100

DEL1: 

                  MOV  R6, #250

                  DJNZ  R6, $

                  DJNZ  R7, DEL1

                  RET

WRITE_TEXT:

                  ACALL  WAIT_LCD

                  SETB  RS

                  MOVX  @DPTR, A

                  SETB  EN

                  CLR    EN

                  RET

WRITE_COM:

                  ACALL  WAIT_LCD

                  CLR    RS

                  MOVX  @DPTR, A

                  SETB  EN

                  CLR    EN

                  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.

            ORG   2000H

MAIN:  

 MOV DPTR,#4000H

            MOV  A,#0

            MOVX  @DPTR,A

            ACALL  DELAY_100US

            MOVX  A,@DPTR

            MOV  DPTR,#0000H

            MOV  B,#10

            DIV     AB

            MOV  R7,B

            MOV  B,#10

            DIV     AB

            ORL    A,#0B0H

            MOVX  @DPTR,A  

            ACALL  DELAY_1MS

            MOV  A,B

            ORL    A,#0D0H

            MOVX  @DPTR,A

            ACALL  DELAY_1MS

            MOV  A,R7

            ORL    A,#0E0H

            MOVX  @DPTR,A

            ACALL  DELAY_1MS

            SJMP  MAIN

DELAY_100US:

            MOV  R6,#50

            DJNZ  R6,$

            RET

DELAY_1MS:

MOV  R6,#5

LOOP:           

MOV  R5,#100

            DJNZ  R5,$

            DJNZ  R6,LOOP

            RET

            END

Thí nghiệm 2: Viết chương trình đọc điện áp của kênh 0 và hiển thị lên LCD

ORG   2000H

            ACALL  INIT_LCD

MAIN:            MOV  DPTR,#4000H

            MOV  A,#0

            MOVX  @DPTR,A

            ACALL  DELAY_100US

            MOVX  A,@DPTR

            MOV  B,#10

            DIV     AB

            MOV  R2,B    ;R2=DON VI

            MOV  B,#10

            DIV     AB

            MOV  R0,A   ;R0=TRAM

            MOV  R1,B    ;R1=CHUC

            MOV  DPTR,#8000H

            MOV  A,#80H

            ACALL  WRITECOM

                        ACALL  HIEN_CHU

                        ACALL  DELAY1

                        SJMP MAIN

INIT_LCD:

                        MOV  A,#38H

                        ACALL  WRITECOM

                        MOV  A,#0CH

                        ACALL  WRITECOM

                        MOV  A,#06H

                        ACALL  WRITECOM

                        RET

CLEAR:                     MOV  DPTR,#8000H

                        MOV  A,#01H

                        ACALL  WRITECOM                     

                        RET

WRITECOM:            MOV  DPTR,#8000H

                        SETB  P3.4

                        CLR    P3.5

                        MOVX  @DPTR,A

                        CLR    P3.4

                        ACALL  DELAY_5MS

                        RET

WRITETEXT:           MOV  DPTR,#8000H

                        SETB  P3.4

                        SETB  P3.5

                        MOVX  @DPTR,A

                        CLR    P3.4

                        ACALL  DELAY_5MS

                        RET

HIEN_CHU:  MOV  A,R0

                        ADD   A,#30H

                        ACALL  WRITETEXT

                        MOV  A,R1

                        ADD   A,#30H

                        ACALL  WRITETEXT

                        MOV  A,R2

                        ADD   A,#30H

                        ACALL  WRITETEXT

RET

DELAY_5MS:                      

                        MOV  R3,#10

LOOP1:                     

                        MOV  R7,#250

                        DJNZ  R7,$

                        DJNZ  R3,LOOP1

                        RET

DELAY1:                                           ; delay 300ms

                        MOV  R6,#2

LOP1:            

                        MOV  R5,#100

LOP:                          

                        MOV  R4,#250

                        DJNZ  R4,$

                        DJNZ  R5,LOP

                        DJNZ  R6,LOP1

                        RET

DELAY2:                   MOV  R3,#8                                                             

LAP:               MOV  R7,#250

                        DJNZ  R7,$

                        DJNZ  R3,LAP

                        RET

DELAY_100US:

            MOV  R6,#50

            DJNZ  R6,$

            RET

END

BÀI 6: THÍ NGHI?M VỚI LED MA TRẬN

Thí nghiệm 1: Viết chương trình hiển thị kí tự A lên LED ma trận.

                   ORG   2000H

 LOOP:          

MOV  A,#0

                        MOV  R7,#8

 LAP: 

MOV  R4,A

                        MOV  DPTR,#COT                          ;quét cột của LED ma trận

                        MOVC  A,@A+DPTR

                        ACALL  XUAT_COT

                        MOV  A,R4

                        MOV  DPTR,#HANG

                        MOVC  A,@A+DPTR

                        ACALL  XUAT_HANG                   ;quét hàng của LED ma trận

                        ACALL  DL2MS

                        MOV  A,R4

                        INC     A

                        DJNZ  R7,LAP

                        SJMP  LOOP

XUAT_COT:

                        MOV  DPTR,#0C00H                       ;địa chỉ cột của LED ma trận

                        MOVX  @DPTR,A

                        RET

XUAT_HANG:

                        MOV  DPTR,#0A00H                       ;địa chỉ hàng của LED ma trận

                        MOVX  @DPTR,A

                        RET

DL2MS:

                        MOV  R6,#4

LAP1:

MOV R5,#250

                        DJNZ  R5,$

                        DJNZ  R6,LAP1

                        RET

COT:   DB      01H, 02H, 04H, 08H, 10H, 20H, 40H, 80H

HANG:DB     03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFH

                        END

Thí nghiệm 2: Viết chương trình chạy chữ A B từ phải sang trái hiển thị lên LED ma trận

            ORG   2000H

 TT:    

MOV  R4,#10

            MOV  R0,#0

            MOV  DPTR,#CHAR

            MOV  R5,#24

LOOP1:         

MOV  R2,DPH

            MOV  R3,DPL

LOOP:

            MOV  DPH,R2

            MOV  DPL,R3

            MOV  R1,#8

            MOV  A,#00000001B

LAP:  

ACALL  HT_COT

            PUSH  ACC

            CLR    A

            MOVC  A,@A+DPTR

            ACALL  HT_HANG

            INC     DPTR

            POP     ACC

            RL       A

            DJNZ  R1, LAP

            DJNZ  R4,LOOP

            MOV  R4,#10

            INC     R0

            MOV  A,R0

            MOV  DPTR,#CHAR

            ADD   A,DPL

            MOV  DPL,A

            DJNZ  R5,LOOP1

            SJMP  TT

CHAR:

DB       0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,03H, 0EDH, 0EEH,

DB       0EEH, 0EDH, 03H, 0FFH, 0FFH,00H, 76H, 76H, 76H, 89H, 0FFH, 0FFH, DB            0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

HT_COT:

            PUSH  DPH

            PUSH  DPL

            MOV  DPTR,#0C000H

            MOVX  @DPTR,A

            POP     DPL

            POP     DPH

            RET

HT_HANG:

            PUSH  DPH

            PUSH  DPL

            MOV  DPTR,#0A000H

            MOVX  @DPTR,A

            ACALL  DELAY_1MS

            POP     DPL

            POP     DPH

            RET

DELAY_1MS:

            MOV  R7,#5

DL:    

MOV  R6,#100

            DJNZ  R6,$

            DJNZ  R7,DL

            RET

            END

BÀI 7: THÍ NGHI?M VỚI ĐỘNG CƠ DC

Thí nghiệm 1: 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.

            ORG   2000H

MAIN:           

MOV  DPTR,#0E000H                     ;địa chỉ của động cơ

LOOP:

            MOV  A,#02H                                   ;động cơ quay ngược

            MOVX  @DPTR,A

            ACALL  DL2S

            MOV  A,#00H                                   ;động cơ dừng

            MOVX  @DPTR,A

            ACALL  DL2S

            MOV  A,#01H                                   ;động cơ quay thuận

            MOVX  @DPTR,A

            ACALL  DL2S

            MOV  A,#00H

            MOVX  @DPTR,A

            ACALL  DL2S

            SJMP  LOOP

DL2S:

            MOV  R5,#40

LAP1:

            MOV  R6,#100

LAP:  

MOV  R7,#250

            DJNZ  R7,$

            DJNZ  R6,LAP

            DJNZ  R5,LAP1

            RET

            END

Thí nghiệm 2: 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ỳ.

            ORG   2000H

            LJMP  MAIN

            ORG   200BH                                    ;địa chỉ ngắt timer 0

            LJMP  ISRT0

            ORG   201BH                                    ;địa chỉ ngắt timer 1

            LJMP  ISRT1

MAIN:           

MOV  DPTR,#0E000H         ;địa chỉ của động cơ

            MOV  A,#01H

            MOVX  @DPTR,A

            MOV  TMOD,#11H

            SETB TF0

            MOV  IE,#8AH                     ;cho phép ngắt timer 0 và timer 1

            SJMP  $

ISRT0:                                                            ;ngắt timer 0 tạo chu kỳ 1000us

SETB  ACC.0

            CLR    ACC.1

            MOVX  @DPTR,A

            CLR    TR0

            MOV  TH0,#HIGH(-1000)

            MOV  TL0,#LOW(-1000)

            SETB  TR0

            CLR    TR1

            MOV  TH1,#HIGH(-500)

            MOV  TL1,#LOW(-500)

            SETB  TR1

            RETI

ISRT1:                                                            ;ngắt timer 1 tạo độ rộng xung 500us

CLR    ACC.0

            CLR    ACC.1

            MOVX  @DPTR,A

            RETI

            END

Thí nghiệm 3: 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%, 80% chu kỳ. Mỗi độ rộng xung cách nhau 5s. Qui trình được lặp lại liên tục.

            ORG   2000H

            LJMP  MAIN

            ORG   200BH

            LJMP  ISRT0

            ORG   201BH

            LJMP  ISRT1

MAIN:           

MOV R7,#250

            MOV  R6,#20

            MOV  R3,#0

            MOV  DPTR,#0E000H

            MOV  A,#01H

            MOVX  @DPTR,A

            MOV  TMOD,#11H

            SETB TF0

            MOV  IE,#8AH

            SJMP  $

ISRT0:           

CJNE  R3,#0,NHAY

            DJNZ  R7,LOP

            DJNZ  R6,LOP1

            INC     R3

            MOV  R6,#20

MOV  R7,#250

            SJMP  LOP2

LOP1:

MOV  R7,#250

LOP:  

SETB  ACC.0

            CLR    ACC.1

            MOVX  @DPTR,A

            CLR    TR0

            MOV  TH0,#HIGH(-1000)

            MOV  TL0,#LOW(-1000)

            SETB  TR0

            CLR    TR1

            MOV  TH1,#HIGH(-200)

            MOV  TL1,#LOW(-200)

            SETB  TR1

            SJMP  THOAT

NHAY:          

CJNE  R3,#1,NHAY1

            DJNZ  R7,LOP2

            DJNZ  R6,LOP3

            INC     R3

            MOV  R6,#20

            MOV  R7,#250

            SJMP  LOP2

LOP3:

MOV  R7,#250

LOP2:

            SETB  ACC.0

            CLR    ACC.1

            MOVX  @DPTR,A

            CLR    TR0

            MOV  TH0,#HIGH(-1000)

            MOV  TL0,#LOW(-1000)

            SETB  TR0

            CLR    TR1

            MOV  TH1,#HIGH(-500)

            MOV  TL1,#LOW(-500)

            SETB  TR1

            SJMP  THOAT

NHAY1:

            DJNZ  R7,LOP4

            DJNZ  R6,LOP5

            MOV  R3,#0

            MOV  R6,#20

            MOV  R7,#250

            SJMP THOAT

LOP5:

MOV  R7,#250

LOP4:

            SETB  ACC.0

            CLR    ACC.1

            MOVX  @DPTR,A

            CLR    TR0

            MOV  TH0,#HIGH(-1000)

            MOV  TL0,#LOW(-1000)

            SETB  TR0

            CLR    TR1

            MOV  TH1,#HIGH(-800)

            MOV  TL1,#LOW(-800)

            SETB  TR1

            SJMP  THOAT

THOAT:

RETI

ISRT1:

            CLR    ACC.0

            CLR    ACC.1

            MOVX  @DPTR,A

            RETI

            END

Thí nghiệm 4: Viết chươg trình thực hiện việc tăng hoặc giảm dần tốc độ động cơ nhờ hai 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ữ thì tốc độ động cơ giảm dần.

ORG   2000H

MAIN:

            MOV  DPTR,#0E000H

            MOV  R3,#5

            MOV  R4,#5 

KT:    

JNB     P1.4,NHAY1                          ;nhấn P1.4 thì đến NHAY1

            MOV  A,#01H

            MOVX  @DPTR,A

            ACALL  DLC

            MOV  A,#00H

            MOVX  @DPTR,A

            ACALL  DLT           

            JNB     P1.5,NHAY2                          ;nhấn P1.5 thì đến NHAY2

            MOV  A,#01H

            MOVX  @DPTR,A

            ACALL   DLC

            MOV  A,#00H

            MOVX  @DPTR,A

            ACALL  DLT

            SJMP  KT

NHAY1:

INC     R3

            DEC    R4

            MOV  A,#01H

            MOVX  @DPTR,A

            ACALL  DLC

            MOV  A,#00H

            MOVX  @DPTR,A

            ACALL  DLT

            SJMP  KT

NHAY2:        

INC     R4

            DEC    R3

SKIP2:

            MOV  A,#01H

            MOVX  @DPTR,A

            ACALL   DLC

            MOV  A,#00H

            MOVX  @DPTR,A

            ACALL  DLT

            SJMP  KT      

DLC:

            MOV  R6,03H

LAP1:

MOV  R5,#100

            DJNZ  R5,$

            DJNZ  R6,LAP1

            RET

DLT:  

            MOV  R6,04H

LAP:  

MOV  R5,#100

            DJNZ  R5,$

            DJNZ  R6,LAP

            RET

            END

THÍ NGHIỆM VI XỬ LÝ PHẦN PIC 16F690

BÀI 1: THÍ NGHI?M VỚI LED ĐƠN

Thí nghiệm 1: 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.

#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_C2);

delay_ms(1000);

output_low(PIN_C2);

delay_ms(1000);

}

}

Thí nghiệm 2: 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) la 0.5s: STTT – TSTT – TTST – TTTS – STTT - .....

#include<16F690.h>

#use delay(clock=4000000)

#use fast_io(C)

void main()

{

set_tris_C(0x00);

output_C(0x00);

while(1)

{

output_C(0x01);

delay_ms(250);

output_C(0x02);

delay_ms(250);

output_C(0x04);

delay_ms(250);

output_C(0x08);

delay_ms(250);

}

}

Thí nghiệm 3: 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 PIC16F690. Giá trị mạch đếm tăng lên 1 đơn vị cách nhau 1s.

#include <16F690.h>

#use delay(clock=4000000)

#use fast_io(C)

#use fast_io(B)

void main()

{

int value=0;

set_tris_C(0x00);

set_tris_B(0x10);

output_C(0x00);

while(1)

{

if(input(PIN_B4)==0)

{value++;

while(input(PIN_B4)==0);

}

output_C(value);

delay_ms(200);

if(value==16)

value=0;

}

}

4.Thí nghiệm 4: 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 PIC16F690. Mạch chỉ đếm khi SW1 được nhấn.

#include <16F690.h>

#use delay(clock=4000000)

#use fast_io(C)

#use fast_io(B)

void demlen(void);

void demxuong(void);

int value=0;

void main()

{

set_tris_C(0x00);

set_tris_B(0x30);

output_C(0x00);

while(1)

{

while(input(PIN_B4)==1)

demlen();

while(input(PIN_B4)==0)

demxuong();

}

}

void demlen()

{

value++;

output_C(value);

delay_ms(1000);

}

void demxuong()

{

value--;

output_C(value);

delay_ms(1000);

}

BÀI 2: THÍ NGHI?M VỚI LED 7 ĐOẠN

Thí nghiệm 1: 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

#include<16F690.h>

#use delay(clock=4000000)

#use fast_io(A)

#use fast_io(C)

#use fast_io(B)

void main()

{

int const pa[10]={0,7,1,3,6,2,0,7,0,2};

int const pc[10]={8,12,1,0,4,2,2,8,0,0};

int value=0;

set_tris_a(0x00);

set_tris_c(0x00);

set_tris_b(0x10);

while(1)

{

if(input(PIN_B4)==0)

{value++;

while(input(PIN_B4)==0);

}

output_C(pc[value]);

output_A(pa[value]);

delay_ms(200);

if(value==10)

value=0;

}

}

BÀI 3: THÍ NGHI?M ĐIỀU KHIỂN ADC

Thí nghiệm 1: 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 (dùng 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

0 – 63

0

64 – 127

1

128 – 191

2

...

...

832 – 895

D

896 – 959

E

960 – 1023

F

#include<16F690.h>

#device ADC=10

#use delay(clock=4000000)

#use fast_io(A)

#use fast_io(C)

void main()

{

int16 a;

set_tris_A(0x01);

set_tris_C(0x00) ;

setup_adc(adc_clock_internal);

setup_adc_ports(sAN0);

set_adc_channel(0);

while(1)

{

delay_us(10);

a=read_adc();

a=a/64;

output_c(a);

}

}

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

#include<16F690.h>

#device ADC=10

#use delay(clock=4000000)

#use fast_io(A)

#use fast_io(C)

int16 a;

void adc(void);

void main()

{

set_tris_A(0x01);

set_tris_C(0x00) ;

setup_adc(adc_clock_internal);

setup_adc_ports(sAN0);

set_adc_channel(0);

while(1)

{

output_C(0x01);

adc();

delay_ms(a);

output_C(0x02);

adc();

delay_ms(a);

output_C(0x04);

adc();

delay_ms(a);

output_C(0x08);

adc();

delay_ms(a);

}

}

void adc(void)

{

delay_us(10);

a=read_adc();

a=a/64;

a*=100;

}

BÀI TẬP LỚN

Đề bài: viết chương trình kiểm tra password nhập từ bàn phím máy tính : “DHBK10”. Nếu đúng thì xuất ra LCD dòng chữ “Successful!”, nếu sai thì xuất “Access denied!” (canh giữa LCD) nhấp nháy với tần số 1Hz

ORG 2000H

EN BIT P3.4

RS BIT P3.5

LOP1: MOV R6,#0

            MOV R5,#0

            ACALL INIT_LCD

            ACALL INIT_UART

            MOV A,#85H

            ACALL WRITECOM

LOP4: ACALL IN_CHAR

            CJNE A,#13,LOP2

            CJNE R6,#6,LOP3

            ACALL DUNG

LOP3:

ACALL SAI

LOP2: MOV R0,A

            MOV DPTR,#PASS

            MOV A,R5

            MOVC A,@A+DPTR

            INC R5

            CJNE A,00H,$+4

            INC R6

            MOV A,#2AH

            ACALL WRITETEXT

            SJMP LOP4

;CHUONG TRINH DINH DANG LCD

INIT_LCD:    MOV  A,#01H

                        ACALL  WRITECOM

                        MOV  A,#38H

                        ACALL  WRITECOM

                        MOV  A,#0CH

                        ACALL  WRITECOM

                        MOV  A,#06H

                        ACALL  WRITECOM

                        RET

;CHUONG TRINH DINH DANG UART

INIT_UART:

                        MOV  SCON,#52H

                        MOV  TMOD,#20H

                        MOV  TH1,#-3

                        SETB  TR1

                        RET

;CHUONG TRINH NHAP KY TU

IN_CHAR:       

                        JNB     RI, $

                        CLR    RI

                        MOV  A, SBUF

                        RET

;CHUONG TRINH XUAT DATA RA LCD

WRITETEXT:           MOV DPTR,#8000H

                        SETB  EN

                        SETB  RS

                        MOVX  @DPTR,A

                        CLR    EN

                        ACALL  DELAY_5MS

                        RET

;CHUONG TRINH XUAT LENH LCD

WRITECOM:            MOV DPTR,#8000H

                        SETB EN

                        CLR RS

                        MOVX  @DPTR,A

                        CLR    EN

                        ACALL  DELAY_5MS

                        RET

;DELAY 5MS

DELAY_5MS:           PUSH 03

                        PUSH 07        

                        MOV  R3,#10

LOOP1:                     

                        MOV  R7,#250

                        DJNZ  R7,$

                        DJNZ  R3,LOOP1

                        POP 07

                        POP 03

                        RET

;CHUONG TRINH CON KIEM TRA PASS

; CHUONG TRINH DELAY 500MS

DELAY500:

            MOV R3,#10

LAP1: MOV R2,#100

LAP2: MOV R1,#250

            DJNZ R1,$

            DJNZ R2,LAP2

            DJNZ R3,LAP1

RET

;CHUONG TRINH XUAT SUCCESSFUL

XUAT_SUCCESS:

            PUSH ACC

            MOV A,#0C2H

            CALL WRITECOM

            MOV R4,#0

LAP3: MOV DPTR,#BANG1

            MOV A,R4

            MOVC A,@A+DPTR

            CALL WRITETEXT

            INC R4

            CJNE R4,#11,LAP3

            POP ACC

RET

XUAT_DENY:

            PUSH ACC

            MOV A,#0C2H

            CALL WRITECOM

            MOV R4,#0

LAP4: MOV DPTR,#BANG2

            MOV A,R4

            MOVC A,@A+DPTR

            CALL WRITETEXT

            INC R4

            CJNE R4,#13,LAP4

            POP ACC

RET

; CHUONG TRINH XOA MAN HINH

XOAMH: PUSH ACC

            MOV A,#0C2H

            CALL WRITECOM

            MOV R4,#0

LAP5: MOV DPTR,#BANG3

            MOV A,R4

            MOVC A,@A+DPTR

            CALL WRITETEXT

            INC R4

            CJNE R4,#13,LAP5

            POP ACC

RET

DUNG:          

            CALL XUAT_SUCCESS

            CALL DELAY500

            CALL XOAMH

            CALL DELAY500

            JNB RI,DUNG

                        CLR RI

                        MOV A,SBUF

                        CJNE A,#27,DUNG

                        LJMP LOP1

            SJMP DUNG

RET

sAI:    

            CALL XUAT_DENY

            CALL DELAY500

            CALL XOAMH

            CALL DELAY500

            JNB RI,SAI

                        CLR RI

                        MOV A,SBUF

                        CJNE A,#27,SAI

                        LJMP LOP1

            SJMP SAI

RET

BANG1: DB 'Successful!'

BANG2: DB 'Access denied'

PASS:  DB 'DHBK10'

BANG3: DB'              '

END

Bạn đang đọc truyện trên: Truyen2U.Pro