Lập trình assembly chip Intel 8051 (AT89S52)

Mình đang làm btl thiết kế mạch đo khoảng cách sử dụng module SR-04 và hiển thị trên 1 màn LCD


Tuy nhiên mình được chỗ bán mạch đưa code cho thì lại không chạy được trên emu8086 ạ
Mọi người check giúp mình xem code này có sai ở đâu và sửa như nào ạ? Và nếu không thì dùng compiler nào để chạy code và nạp code vào chip ạ?
(Mình cũng mù mịt về assem lắm ạ)

RS EQU P2.6               ; dinh nghia RS la P2.7
RW EQU P2.5               ; dinh nghia RW la P2.6
E  EQU P2.7               ; dinh nghia E la P2.5
ORG 00H                   ; origin
      MOV DPTR,#LUT       ; di chuyen dia chi bat dau LUT vao DPTR
      CLR P3.0            ; xoa P3.0(output)
      SETB P3.1           ; set p3.1(input)
      MOV TMOD,#00100001B ; sets Timer1 la Mode2 timer va Timer0 la Mode1 timer
 MAIN:ACALL DINT          ; goi ham DINT
      ACALL TEXT1         ; goi ham TEXT1
      MOV TL1,#200D       ; gan TL1 = 200
      MOV TH1,#200D       ; gan TH1 = 200
      MOV A,#00000000B    ; gan A
      SETB P3.0           ; sets P3.0(trigger)
      ACALL DELAY1        ; goi ham DELAY1 (1uS)
      CLR P3.0            ; xoa P3.0
      HERE: JNB P3.1,HERE ; lap lai o day cho den khi chan echo nhan duoc giu lieu
 BACK:SETB TR1            ; bat dau Timer1
HERE1:JNB TF1,HERE1       ; lap lai o day cho den khi Timer1 tran
      CLR TR1             ; dung Timer1
      CLR TF1             ; xoa co Timer 1
      INC A               ; Tang A
      JB P3.1,BACK        ; Nhay den ham BACK neu echo van con
      MOV R7,A            ; luu gia tri A -> R7
      ACALL SPLIT         ; goi ham SPLIT
      ACALL LINE2         ; goi ham LINE2 : dua con tro xuong dong 2
      ACALL TEXT3         ; goi ham TEXT2
      ACALL LEVEL         ; goi ham LEVEL
      ACALL TEXT2         ; goi ham TEXT2
      ACALL DELAY2        ; goi ham DELAY2(1S)
      SJMP MAIN           ; Quay lai ham MAIN

DELAY1: MOV R6,#2D        ; Gan gia tri tai R6 bang 2D
LABEL1: DJNZ R6,LABEL1    ; R6 --, va lap den khi R6 = 0
        RET               ; Quay lai ham chinh

DELAY2:MOV R0,#15D        ; R0 = 15
BACK1: MOV TH0,#00000000B ; TH0 = 00000000B 
       MOV TL0,#00000000B ; TL0 = 00000000B 
       SETB TR0           ; Bat dau dem Timer0
HERE2: JNB TF0,HERE2      ; Lap den khi tran timer 0
       CLR TR0            ; dung Timer0
       CLR TF0            ; Xoa co tran timer 0
       DJNZ R0,BACK1      ; Lap lai 15 lan de delay 1s
       RET                ; Quay lai ham chinh

TEXT1: MOV A,#"K" ; Ham nay in ra chu 'KTVXL PTIT'
       ACALL DISPLAY
       MOV A,#"T"
       ACALL DISPLAY
       MOV A,#"V"
       ACALL DISPLAY
       MOV A,#"X"
       ACALL DISPLAY
       MOV A,#"L"
       ACALL DISPLAY
       MOV A,#" "
       ACALL DISPLAY
       MOV A,#"P"
       ACALL DISPLAY
       MOV A,#"T"
       ACALL DISPLAY
       MOV A,#"I"
       ACALL DISPLAY
       MOV A,#"T"
       ACALL DISPLAY
       RET
    RET                   ; Quay lai ham chinh

 TEXT2:  MOV A,#'c'       ; Ham nay in ra chu 'cm'
    ACALL DISPLAY
    MOV A,#'m'
    ACALL DISPLAY
    RET

 TEXT3:MOV A,#"D" ; Ham nay in ra chu 'Distances : '
       ACALL DISPLAY
       MOV A,#"i"
       ACALL DISPLAY
       MOV A,#"s"
       ACALL DISPLAY
       MOV A,#"t"
       ACALL DISPLAY
       MOV A,#"a"
       ACALL DISPLAY
       MOV A,#"n"
       ACALL DISPLAY
       MOV A,#"c"
       ACALL DISPLAY
       MOV A,#"e"
       ACALL DISPLAY
       MOV A,#":"
       ACALL DISPLAY
       MOV A,#" "
       RET                ; Quay lai ham chinh

                          ; ham split muc dich de tach gia tri ra thanh cac chu so 
                          ; Vd 321 -> R3 = 1, R2 = 2, R1 = 3 
SPLIT:MOV B,#10D          ; gan B = 10
      DIV AB              ; chia A cho B, phan du duoc luu trong B
      MOV R3,B            ; Gan R3 = ket qua phep chia
      MOV B,#10D          ; gan B = 10
      DIV AB              ; lap lai tuong tu
      MOV R2,B            ; ...
      MOV R1,A            ; ...
      RET                 ; Quay lai ham chinh

LEVEL:MOV A,R1            ; Gan gia tri A = gia tri cua R1 (So thu nhat)
      ACALL ASCII         ; Ep kieu sang char
      ACALL DISPLAY       ; goi ham hien thi ra
      MOV A,R2            ; Gan gia tri A = gia tri cua R2 (So so thu 2)
      ACALL ASCII         ; Ep kieu sang char
      ACALL DISPLAY       ; goi ham hien thi ra
      MOV A,R3            ; Gan gia tri A = gia tri cua R3 (So so thu 3)
      ACALL ASCII         ; Ep kieu sang char
      ACALL DISPLAY       ; goi ham hien thi ra
      RET                 ; Quay lai ham chinh

 DINT:MOV A,#0CH          ; bat hien thi lcd,con tro tat
    ACALL CMD             
    MOV A,#01H            ; xoa man hinh
    ACALL CMD             
    MOV A,#06H            ; tang con tro
    ACALL CMD             
    MOV A,#80H            ; di chuyen con tro den dau dong 1
    ACALL CMD             
    MOV A,#3CH            ; bat dong 2
    ACALL CMD             
    RET                   ; Quay lai ham chinh

LINE2:MOV A,#0C0H         ; Nhay xuong dong 2 vi tri 0
    ACALL CMD             
    RET                   ; Quay lai ham chinh

CMD: MOV P0,A             ; di chuyen du lieu den Port 0
    CLR RS                ; Xoa chan RS
    CLR RW                ; Xoa chan RW
    SETB E                ; set chan Enable
    CLR E                 ; Xoa chan Enable
    ACALL DELAY           ; goi ham delay
    RET                   ; Quay lai ham chinh

DISPLAY:MOV P0,A          ; di chuyen du lieu den Port 0
    SETB RS               ; set chan RS
    CLR RW                ; Xoa chan RW cua LCD
    SETB E                ; set chan Enable cua LCD
    CLR E                 ; xoa chan Enable cua LCD
    ACALL DELAY           ; goi ham delay
    RET                   ; Quay lai ham chinh

DELAY: CLR E              ; xoa chan E cua LCD
    CLR RS                ; xoa chan RS cua LCD
    SETB RW               ; sets RW pin cua LCD
    MOV P0,#0FFH          ; sets P0 la input
    SETB E                ; sets E pin cua LCD
    MOV A,P0              ; gan P0 = A
    JB ACC.7,DELAY        ; Lap lai DELAY neu ACC.7 == 1
    CLR E                 ; xoa E pin cua LCD
    CLR RW                ; xoa RW pin cua LCD
    RET                   ; Quay lai ham chinh

ASCII: MOVC A,@A+DPTR     ; Ghi de gia tri trong A thanh ki tu ascii
       RET                ; Quay lai ham chinh

LUT: DB  48D              ; ascii cua "0"
     DB  49D              ; ascii cua "1"
     DB  50D              ; ascii cua "2"
     DB  51D              ; ascii cua "3"
     DB  52D              ; ascii cua "4"
     DB  53D              ; ascii cua "5"
     DB  54D              ; ascii cua "6"
     DB  55D              ; ascii cua "7"
     DB  56D              ; ascii cua "8"
     DB  57D              ; ascii cua "9"

    END                   ; Ket thuc chuong trinh

Không biết bạn @trantuk50 còn là học sinh hay là sinh viên năm mấy nhỉ?
Bạn phân biệt được 8051 và 8086 chứ?
Bạn có biết emu8086 là gì không?
Nếu bạn chưa bao giờ code assembly/nạp code thì tại sao bạn lại chọn đề tài này làm bài tập lớn?

3 Likes

Em là sv năm 3, em cũng biết là 8051 và 8086 mó khác nhau, nhưng trong chương trình học bọn em chỉ học assem basic trên emu8086, còn btl là do thầy yêu cầu mua vi điều khiển và tự làm code để đo thông số ạ. Em cũng đã tìm hiểu 1 vài compiler cho code assem mà chưa tìm đc ạ. Mong mn có thể hướng dẫn :((

ASM nó dài và ai cũng ngại. Cách cù nhây là viết code C compile ra hex kèm cả ASM -> ASM.

3 Likes

Tốt nhất là bạn code bằng C ấy, chứ làm cái driver cho LCD, ultrasound sensor bằng asm đủ chết rồi.

2 Likes

Nếu thầy chỉ dạy cơ bản asm của 8086 mà bắt làm bài như vầy, thì mình khuyên thật là bạn nên đóng góp với thầy là bài tập này quá sức đi. Từ 8086 mà chuyển qua code 8051 đã là quá đáng rồi, huống hồ còn phải làm mạch rồi nạp code nữa. Gần như là những việc bất khả thi nếu không có kiến thức nền về nó.

Còn quay lại code kia, nhìn screenshot thì có vẻ là proteus nhỉ? Nếu đúng thì nó có sẵn tính năng simulator, bạn có thể dán code asm kia thẳng vào con chip 8051 để biết nó chạy ra sao (đọc sơ thì thấy map chân cũng có vẻ đúng rồi nên chắc là sẽ chạy được với mạch trong hình luôn)

Như mọi người nói, bạn nên code bằng C thay vì asm, và IDE phổ biến nhất có lẽ là KeilC, http://dammedientu.vn/bai-1-huong-dan-tao-project-voi-keilc-lap-trinh-8051/

4 Likes

mọi người có ai có cách để chạy được đoạn code kia không ạ :< tks

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?