Thảo luận Lập trình Asm cơ bản cho 8051

NgoHungCuong

http://ngohungcuong.com
#1
Thực sự kid thấy asm không thú vị bằng C
kid giờ cũng ít xài Asm lắm nhưng trên 4rum vẫn còn có những bạn xài Asm
và cũng để thử nghiệm cái Compiler asm do kid viết
kid mở luồng này thảo luận về lập trình asm cơ bản cho 8051
kid xài programmer's notepad để soạn thảo và compiler do chính kid viết (chưa biết đặt tên là gì nữa :D:D:D)
Programmer's Notepad
http://pnotepad.googlecode.com/files/pn2342350_multilang.exe
và Compiler
Thảo luận - Viết Phần Mềm Biên Dịch Mã 8051 | Cộng đồng cơ điện tử Việt Nam | Mechatronics
 

NgoHungCuong

http://ngohungcuong.com
#2
lập trình IO
kid làm với 89c51 nhé (chạy được với 89s51, 89c52, 89s52)
các chân được mắc với led đơn 5v qua chân led qua trở 330-470 về chân vđk
như vậy bạn ghi 1 ra chân VĐK thì led tắt và ghi 0 thì led sáng
code
Mã:
;chuong trinh bat tat led don
;Coder: Ngo Hung Cuong
//chu thich cach 2
//================================================
/=================================================
/chu thich cach 3
/-------------------------------------------------
.code
org        0x0000
    ljmp    main
    org    0x0030
main:
    mov        p0,    #0b00000000
    mov        p1,        #0b11110000
    mov        p2,        #0b10101010
    mov        p3,        #0b01010101
here:
    ljmp    here    //vong lap vo han
.endcode
.end
Photo0074.jpg
 

NgoHungCuong

http://ngohungcuong.com
#3
thêm phần IO nữa
đọc nút nhấn
:D:D:D
code
Mã:
.code
org        0x0000
    ljmp    main
org    0x0030
main:
    ;lien tuc kiem tra xem nut co duoc bam hay khong
    ;neu nut duoc bam thi cho cho nha ra moi dao gia tri
    jb        p1_0,        main
    ;neu khong duoc bam thi quay lai kiem tra tiep
wait:
    ;truong hop duoc bam thi cho nha ra moi thoi
    jnb        p1_0,        wait
    cpl        p1_1
    ljmp    main
.endcode
.end
New Bitmap Image.JPG
New Bitmap Image2.JPG
New Bitmap Image3.JPG

file hex và mô phỏng đính kèm :D:D:D
 

Đính kèm

NgoHungCuong

http://ngohungcuong.com
#4
cơ bản 8051 cũng chỉ có vài cái cần tìm hiểu
kid sẽ lần lượt duyệt qua các tính năng cơ bản
ví dụ tiếp theo bộ định thời
code
Mã:
;chuong trinh su dung bo dinh thoi de delay
;coder: Ngo Hung Cuong
;compiler: Kidteam ASM for 8051
//=============================================
.code
org        0x0000
    ljmp    start
org        0x0030
start:
    lcall    init
main:
    mov        p1, #0xff
    lcall    delay
    mov        p1, #0
    lcall    delay
    ljmp    main
init:
    mov        tmod,    #01;bo dinh thoi 0 che do 1 - 16 bit khong dat truoc
    ret
delay:
    mov        th0,    #0x3c
    mov        tl0,    #0xb0
    setb    tr0
wait:
    jnb        tf0,    wait
    clr        tr0
    clr        tf0
    ret
.endcode
.end
New Bitmap Image.JPG
kết quả
New Bitmap Image2.JPG
file mô phỏng và code, hex có trong tập tin đính kèm
 

Đính kèm

NgoHungCuong

http://ngohungcuong.com
#5
tiếp theo là truyền thông nối tiếp
kid sẽ viết 1 chương trình nhỏ test UART tích hợp sẵn trong 8051
chắc có lẽ tối nay kid mới post được
giờ đi tắm cái đã, Tuyên Quang giờ này lạnh rồi
updating...
giờ kid post tiếp cái vụ truyền thông nối tiếp
chương trình sẽ liên tục gửi các ký tự a
code
Mã:
    .code
        org 0x0000
            ljmp main
        org 0x0030
DELAY:
    MOV    R6, #100
    CHUAHET:
        MOV    R7, #255
    CHUAHET1:
        DJNZ    R7, CHUAHET1
        DJNZ    R6, CHUAHET
RET
 
GUI:
        CLR    TI
        MOV    SBUF, A
    DANGGUI:
        JNB    TI, DANGGUI
        CLR    TI
RET
 
NHAN:
        CLR    RI
    DANGNHAN:
        JNB    RI, DANGNHAN
        MOV    A, SBUF
        CLR    RI
RET
 
main:
    MOV    TMOD, #0x20
    MOV    TH1, #0xfd
    MOV    TL1, #0xfd
    MOV    SCON, #0x50
    SETB    TR1   
 
BATDAUGUI:
    MOV        A, #97
    lCALL    GUI   
    lCALL    DELAY
    lJMP        BATDAUGUI
    .endcode
    .end
New Bitmap Image.JPG
kết quả
New Bitmap Image2.JPG
file mô phỏng và toàn bộ code trong file đính kèm
 

Đính kèm

NgoHungCuong

http://ngohungcuong.com
#6
phần tiếp theo kid sẽ ví dụ một chút về ngắt
như vậy là coi như xong về 8051
con chip này chắc cũng chỉ có bấy nhiêu là đủ rồi
:D:D:D
code
Mã:
;chuong trinh ngat thoi gian Timer 0
;coder: Ngo Hung Cuong
;compiler: Kidteam ASM for 8051 v0.1
;:D:D:D
//==================================
.code
org        0x0000
    ljmp    main
org        0x000b
    ;dia chi ngat timer 0
    ljmp    t0_isr
org        0x0030
main:
    lcall    init
here:
    ljmp    here
init:
    ;chuong trinh con khoi tao
    ;timer 0 che do 1 16bit khong co dat truoc
    mov        tmod,    #1
    mov        th0,    #0x3c
    mov        tl0,    #0xb0
    setb    ea        //cho phep ngat toan cuc
    setb    et0        //cho phep ngat timer 0
    setb    tr0        //cho phep timer 0 hoat dong
    ret
t0_isr:
    ;chuong tring ngat chinh
    clr        tr0   
    xrl        p1,        #0xff
    mov        th0,    #0x3c
    mov        tl0,    #0xb0
    setb    tr0
    reti
.endcode
.end
//==================================
New Bitmap Image1.JPG
kết quả
New Bitmap Image2.JPG
file mô phỏng và code, hex có trong file đính kèm
như vậy là kid đã dạo qua hầu hết các tính năng của 8051 :D:D:D
tất cả code được compile bằng Kidteam ASM for 8051 v0.1 :D:D:D
 

Đính kèm

NgoHungCuong

http://ngohungcuong.com
#8
Các bạn bổ sung nội dung băm xung điều khiển LED cho anh em học hỏi với. Cảm ơn các bạn nhiều.
chắc có lẽ ý bạn là điều độ rộng xung để làm led sáng theo kiểu sao băng của ledimm đây mà
để tớ xem lại cái code led sáng dần gửi bạn nhé
:D:D:D
tớ mới làm hôm rồi điều chỉnh led sáng các cấp độ mà
update: đã gửi code C bên luồng lập trình 8051 bằng C
 

huytapdi

Học sinh phổ thông
#9
em la người mới học asm,thầy kid giúp em giải bài toán theo sơ đồ nay với.em làm hoài vẫn ko được.mong dc thầy giúp .cám ơn

 

NgoHungCuong

http://ngohungcuong.com
#10
kid chưa hiểu ý bạn lắm
theo ý kid thì là thế này bạn xem có đúng không nhé
nếu s1 không được ấn thì tắt bất chấp s2, s3
nếu s3 được ấn thì không làm gì cả bất chấp s1, s2
xét s1 được ấn và s3 không được ấn
còn lại 2 khả năng:
s2 ấn: nháy chậm
s2 không ấn nháy nhanh
nếu đúng như vậy thì bạn tham khảo code sau
Mã:
; coder: Ngo Hung Cuong
; compiler: kidteam ASM for 8051 v0.1
; 13/10/2012
.define
    sw1        p1_0
    sw2        p1_1
    sw3        p1_2
    led1    p3_0
    led2    p3_1
    led3    p3_2
    led4    p3_3
.enddefine
;-------------------------------------------
.code
 
org        0x0000
    ljmp    main
//==========================================
org        0x0030
main:
    lcall    init
loop:
    jnb        sw1,    cont
//s1 khong duoc an thi tat tat ca bat chap s2 s3
    clr        led1
    clr        led2
    clr        led3
    clr        led4
    ljmp    loop
cont:
//s3 duoc an thi khong lam gi ca
    jb        sw3,    cont1
    ljmp    loop
//chac chan la s1 dang duoc an va s3 khong an
//kiem tra 2 truong hop
cont1:
    jb        sw2,    nhanh
    mov        a,        #1 ;che do cham
    ljmp    chay
nhanh:
    mov        a,        #0 ; che do nhanh
chay:
    setb    led1
    setb    led2
    setb    led3
    setb    led4
    lcall    delay
    clr        led1
    clr        led2
    clr        led3
    clr        led4
    lcall    delay
    ljmp    loop
//==========================================
init:
    setb    sw1
    setb    sw2
    setb    sw3
    clr        led1
    clr        led2
    clr        led3
    clr        led4
    mov        a,        #0
    ret
//==========================================
delay:
    cjne    a,        #1,        not0
    lcall    delay_fast
not0:
    lcall    delay_fast
    ret
//==========================================
delay_fast: 
    MOV    R2,        #100
DL5:       
    MOV    R1,        #250           
DL4:
    NOP
    NOP
    DJNZ    R1,        DL4
    DJNZ    R2,        DL5
    RET
//==========================================
 
.endcode
.end
 

Đính kèm

Quảng cáo Google