Thông báo

Collapse
No announcement yet.

Giúp đỡ về code ASM điều khiển tốc độ nháy của đèn LED bằng phím bấm !

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp đỡ về code ASM điều khiển tốc độ nháy của đèn LED bằng phím bấm !

    Chào các anh chị và các bạn trong diễn đàn. Như trong phần tiêu đề em đã trình bày: Em muốn nhờ các anh chị và các bạn trong diễn đàn trợ giúp em về phần code ASM, lập trình điều khiển tốc độ nhấp nháy của đèn LED bằng phím bấm (mô phỏng bằng Proteus).
    - Về phần cứng:
    kết nối khá đơn giản, em có 16 con LED đơn, Anot của các LED được nối lần lượt tới các chân của port 0 và port 2 của VĐK 8051, các Catot được nối MASS. 2 phím bấm được đặt tên là NHANH và CHẬM được nối lần lượt tới P3.2 và P3.3 của VĐK, đầu còn lại của phím bầm được nối MASS.
    - Yêu cầu đặt ra là:
    khi cấp nguồn cho VĐK hoạt động thì các LED sáng - tắt (nhấp nháy) ở một tốc độ nhất định, tốc độ này được giữ nguyên cho đến khi nào bấm phím NHANH hoặc CHẬM thì nó mới được thay đổi. Nếu phím NHANH được bấm thì các LED nhấp nháy nhanh, cứ mỗi lần bấm phím thì tốc độ nháy của LED lại tăng lên (tăng lên đến 1 giới hạn nhất định do người lập trình đặt ra). Ngược lại mỗi lần bấm phím CHẬM thì tốc độ nháy của LED chậm lại (cũng chỉ chậm đến một mức độ nhất định).
    - Dựa trên yêu cầu trên em có ý tưởng viết code như sau:
    + Trong code, em sử dụng ngắt ngoài 0 và 1 để phát hiện phím bấm.
    + Em dùng một biến đếm đặt tên là "count", biến này có tác dụng chỉ ra vị trí của các mã thời gian.
    + Mã thời gian: chính là số lần lặp lại của một khoảng thời gian đã trễ được định trước (thời gian trễ này được tạo ra bởi timer 0). Mã thời gian này được nạp vào trong thanh ghi R0 khi thực hiện vòng lặp. Khi biến đếm count thay đổi thì mã thời gian thay đổi tương ứng.
    => Khi có phím bấm ngắt tương ứng với phím bấm được kích hoạt sẽ thay đổi giá trị biến đếm count => mã thời gian thay đổi => R0 thay đổi => thời gian delay thay đổi => tốc độ nháy của LED thay đổi.
    Dưới đây là code ASM thực hiện ý tưởng trên nhưng nó hoạt động không đúng mục đích (tốc độ nháy led không được thay đổi khi bấm phím) mà em vẫn chưa tìm ra lỗi (có file mô phỏng ở dưới).
    Code:
    ;===============================
    ; Dung VDK AT89C51, thach anh 12Mhz    ;
    ; 16 led duoc noi voi p0 va p2        ;
    ; 2 nut bam dieu khien toc do nhay cua led:    ;
    ;    - NHANH noi voi p3.2        ;
    ;    - CHAM noi voi p3.3        ;
    ; Cac Led duoc noi Catot chung, Led sang khi    ;
    ; tin hieu xuat ra o cac chan VDK la muc 1.    ;
    ;===============================
        NHANH    bit    p3.2
        CHAM    bit    p3.3
        value    equ    -20000    ; 20ms
        count    equ    07fh    ; dia chi bien dem 07fh
    ;
        org    0h
        sjmp    start
        org    03h        ; vecto ngat ngoai 0
        ljmp    ex0_isr        ; trinh phuc vu ngat ngoai 0
        org    13h        ; vecto ngat ngoai 1
        ljmp    ex1_isr        ; trinh phuc vu ngat ngoai 1
    ;
        org    30h        ; dia chi bat dau chuong trinh chinh
    start:    mov    p0, #0        ; tat tat ca cac led
        mov    p2, #0
        setb    p3.2        ; thiet lap p3.2, p3.3
        setb    p3.3        ; lam dau vao
        mov    tmod, #01h    ; timer 0 che do 1 (16-bits)
        setb    ie.7        ; cho phep ngat toan cuc
        setb    ie.0        ; cho phep ngat ngoai 0
        setb    ie.2        ; ngat ngoai 1
        setb    it0        ; kich ngat
        setb    it1        ; theo suon am
        mov    count, #09    ; nap bien dem bang 9 (0 <= count <= 18)
        mov    r0, #50        ; khoi dong so lan lap thoi tgian delay voi gia tri ban dau la 50
        mov    dptr, #ma_tg    ; dat con tro o bang ma thoi gian
    back:    mov    p0, #0ffh        ; tat ca cac led sang
        mov    p2, #0ffh        ;
        call    delay        ; ct tre tao thoi gian sang
        mov    p0, #0h        ; tat tat ca cac led
        mov    p2, #0h
        call    delay        ; ct tre tao thoi gian tat
        sjmp    back        ; lap lai
    ;
    ;--------------------------------------------
    ; Trinh phuc vu ngat ngoai 0
    ;--------------------------------------------
    ex0_isr:
        clr    a        ; xoa Acc
        dec    count        ; nut NHANH dc bam: giam bien dem thoi gian
        mov    a, count        ; Acc = count
        cjne    a, #255, skip    ; Count = -1 (255) ?
        inc    count        ; dung: tang Count len 1 dv (Acc = 0)
        inc    a        ; 
    skip:    movc    a, @a+dptr    ; Acc khac -1: nap ma thoi gian vao Acc 
        mov    r0, a        ; dua ma thoi gian vao r0 va
        reti            ; thoat khoi ngat
    ;--------------------------------------------
    ; Trinh phuc vu ngat ngoai 1
    ;--------------------------------------------
    ex1_isr:
        clr    a        ; xoa Acc
        inc    count        ; nut CHAM dc bam: tang bien dem thoi gian
        mov    a, count        ; Acc = count
        cjne    a, #19, skip1    ; Count = 19 ?
        dec    count        ; dung: giam count di 1 dv
        dec    a
    skip1:    movc    a, @a+dptr
        mov    r0, a        ; dua ma thoi gian vao r0 va
        reti            ; thoat khoi ngat
    ;--------------------------------------------
    delay:
        push    00
    ll:    mov    th0, #high value
        mov    tl0, #low value
        setb    tr0
        jnb    tf0, $
        clr    tr0
        clr    tf0
        djnz    r0, ll
        pop    00
        ret
    ;--------------------------------------------
    ma_tg:    ;count    0,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
    ;        |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
        db    5,10,15,20,25,30,25,40,45,50,55,60,65,70,75,80,85,90,100
    ;--------------------------------------------
        end

    Nhờ mọi người sửa giúp hoặc có ý tưởng nào hay thì chỉ cho em với.
    Em xin chân thành cảm ơn!

    Attached Files
    Last edited by Ck33spkt; 05-07-2012, 20:15.

  • #2
    Các cao thủ chạy đâu hết rồi !!

    Comment


    • #3
      mới có mấy tiếng mà chú la lối om sòm quá
      anh code C có được không, tại dạo này lười dùng ASM lắm

      Comment


      • #4
        Nguyên văn bởi kidteam Xem bài viết
        mới có mấy tiếng mà chú la lối om sòm quá
        anh code C có được không, tại dạo này lười dùng ASM lắm
        Hơn tuần rồi bác ơi.
        Em cám ơn bác nhưng code C em đọc không hiểu gì hết
        !

        Comment


        • #5
          sorry
          anh không để ý ngày
          anh tưởng có mấy tiếng

          Comment


          • #6
            Nguyên văn bởi Ck33spkt Xem bài viết
            Chào các anh chị và các bạn trong diễn đàn. Như trong phần tiêu đề em đã trình bày: Em muốn nhờ các anh chị và các bạn trong diễn đàn trợ giúp em về phần code ASM, lập trình điều khiển tốc độ nhấp nháy của đèn LED bằng phím bấm (mô phỏng bằng Proteus).
            - Về phần cứng:
            - Yêu cầu đặt ra là:
            - Dựa trên yêu cầu trên em có ý tưởng viết code như sau:

            Dưới đây là code ASM thực hiện ý tưởng trên nhưng nó hoạt động không đúng mục đích (tốc độ nháy led không được thay đổi khi bấm phím) mà em vẫn chưa tìm ra lỗi (có file mô phỏng ở dưới).
            Code:
            ;===============================
            ; Dung VDK AT89C51, thach anh 12Mhz    ;
            ; 16 led duoc noi voi p0 va p2        ;
            ; 2 nut bam dieu khien toc do nhay cua led:    ;
            ;    - NHANH noi voi p3.2        ;
            ;    - CHAM noi voi p3.3        ;
            ; Cac Led duoc noi Catot chung, Led sang khi    ;
            ; tin hieu xuat ra o cac chan VDK la muc 1.    ;
            ;===============================
                NHANH    bit    p3.2
                CHAM    bit    p3.3
                value    equ    -20000    ; 20ms
                count    equ    07fh    ; dia chi bien dem 07fh
            ;
                org    0h
                sjmp    start
                org    03h        ; vecto ngat ngoai 0
                ljmp    ex0_isr        ; trinh phuc vu ngat ngoai 0
                org    13h        ; vecto ngat ngoai 1
                ljmp    ex1_isr        ; trinh phuc vu ngat ngoai 1
            ;
                org    30h        ; dia chi bat dau chuong trinh chinh
            start:    mov    p0, #0        ; tat tat ca cac led
                mov    p2, #0
                setb    p3.2        ; thiet lap p3.2, p3.3
                setb    p3.3        ; lam dau vao
                mov    tmod, #01h    ; timer 0 che do 1 (16-bits)
                setb    ie.7        ; cho phep ngat toan cuc
                setb    ie.0        ; cho phep ngat ngoai 0
                setb    ie.2        ; ngat ngoai 1
                setb    it0        ; kich ngat
                setb    it1        ; theo suon am
                mov    count, #09    ; nap bien dem bang 9 (0 <= count <= 18)
                mov    r0, #50        ; khoi dong so lan lap thoi tgian delay voi gia tri ban dau la 50
                mov    dptr, #ma_tg    ; dat con tro o bang ma thoi gian
            back:    mov    p0, #0ffh        ; tat ca cac led sang
                mov    p2, #0ffh        ;
                call    delay        ; ct tre tao thoi gian sang
                mov    p0, #0h        ; tat tat ca cac led
                mov    p2, #0h
                call    delay        ; ct tre tao thoi gian tat
                sjmp    back        ; lap lai
            ;
            ;--------------------------------------------
            ; Trinh phuc vu ngat ngoai 0
            ;--------------------------------------------
            ex0_isr:
                clr    a        ; xoa Acc
                dec    count        ; nut NHANH dc bam: giam bien dem thoi gian
                mov    a, count        ; Acc = count
                cjne    a, #255, skip    ; Count = -1 (255) ?
                inc    count        ; dung: tang Count len 1 dv (Acc = 0)
                inc    a        ; 
            skip:    movc    a, @a+dptr    ; Acc khac -1: nap ma thoi gian vao Acc 
                mov    r0, a        ; dua ma thoi gian vao r0 va
                reti            ; thoat khoi ngat
            ;--------------------------------------------
            ; Trinh phuc vu ngat ngoai 1
            ;--------------------------------------------
            ex1_isr:
                clr    a        ; xoa Acc
                inc    count        ; nut CHAM dc bam: tang bien dem thoi gian
                mov    a, count        ; Acc = count
                cjne    a, #19, skip1    ; Count = 19 ?
                dec    count        ; dung: giam count di 1 dv
                dec    a
            skip1:    movc    a, @a+dptr
                mov    r0, a        ; dua ma thoi gian vao r0 va
                reti            ; thoat khoi ngat
            ;--------------------------------------------
            delay:
                push    00
            ll:    mov    th0, #high value
                mov    tl0, #low value
                setb    tr0
                jnb    tf0, $
                clr    tr0
                clr    tf0
                djnz    r0, ll
                pop    00
                ret
            ;--------------------------------------------
            ma_tg:    ;count    0,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
            ;        |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
                db    5,10,15,20,25,30,25,40,45,50,55,60,65,70,75,80,85,90,100
            ;--------------------------------------------
                end

            Nhờ mọi người sửa giúp hoặc có ý tưởng nào hay thì chỉ cho em với.
            Em xin chân thành cảm ơn!

            delay:
            ll: mov th0, #high value
            mov tl0, #low value
            setb tr0
            jnb tf0, $
            clr tr0
            clr tf0
            djnz r0, ll
            ;khi r0 =0 gọi delay lần nữa thì delay luôn có giá trị 255*delay(time0)
            ret
            code:
            Code:
                           ;===============================
                    ; Dung VDK AT89C51, thach anh 12Mhz    ;
                    ; 16 led duoc noi voi p0 va p2        ;
                    ; 2 nut bam dieu khien toc do nhay cua led:    ;
                    ;    - NHANH noi voi p3.2        ;
                    ;    - CHAM noi voi p3.3        ;
                    ; Cac Led duoc noi Catot chung, Led sang khi    ;
                    ; tin hieu xuat ra o cac chan VDK la muc 1.    ;
                    ;===============================
                        NHANH    bit    p3.2
                        CHAM    bit    p3.3
                        value    equ    -20000    ; 20ms
                        count    equ    07fh    ; dia chi bien dem 07fh
                                ;
                        org    0h
                        sjmp    start
                        org    03h        ; vecto ngat ngoai 0
                        ljmp    ex0_isr        ; trinh phuc vu ngat ngoai 0
                        org    13h        ; vecto ngat ngoai 1
                        ljmp    ex1_isr        ; trinh phuc vu ngat ngoai 1
                    ;
                        org    30h        ; dia chi bat dau chuong trinh chinh
                    start:    mov    p0, #0        ; tat tat ca cac led
                        mov    p2, #0
                        setb    p3.2        ; thiet lap p3.2, p3.3
                        setb    p3.3        ; lam dau vao
                        mov    tmod, #01h    ; timer 0 che do 1 (16-bits)
                        setb    ie.7        ; cho phep ngat toan cuc
                        setb    ie.0        ; cho phep ngat ngoai 0
                        setb    ie.2        ; ngat ngoai 1
                        setb    it0        ; kich ngat
                        setb    it1        ; theo suon am
                        mov    count, #09    ; nap bien dem bang 9 (0 <= count <= 18)
                           mov r1,#50 //luu toc do
                        mov    r0, #50        ; khoi dong so lan lap thoi tgian delay voi gia tri ban dau la 50
                        mov    dptr, #ma_tg    ; dat con tro o bang ma thoi gian
                    back:    mov    p0, #0ffh        ; tat ca cac led sang
                        mov    p2, #0ffh        ;
                        call    delay        ; ct tre tao thoi gian sang
                        mov    p0, #0h        ; tat tat ca cac led
                        mov    p2, #0h
                        call    delay        ; ct tre tao thoi gian tat
                        sjmp    back        ; lap lai
                    ;
                    ;--------------------------------------------
                    ; Trinh phuc vu ngat ngoai 0
                    ;--------------------------------------------
                    ex0_isr:
                        clr    a        ; xoa Acc
                        dec    count        ; nut NHANH dc bam: giam bien dem thoi gian
                        mov    a, count        ; Acc = count
                        cjne    a, #255, skip    ; Count = -1 (255) ?
                        inc    count        ; dung: tang Count len 1 dv (Acc = 0)
                        inc    a        ; 
                    skip:    movc    a, @a+dptr    ; Acc khac -1: nap ma thoi gian vao Acc 
                         mov r1,a;lưu tốc độ mới
                        reti            ; thoat khoi ngat
                    ;--------------------------------------------
                    ; Trinh phuc vu ngat ngoai 1
                    ;--------------------------------------------
                    ex1_isr:
                        clr    a        ; xoa Acc
                        inc    count        ; nut CHAM dc bam: tang bien dem thoi gian
                        mov    a, count        ; Acc = count
                        cjne    a, #19, skip1    ; Count = 19 ?
                        dec    count        ; dung: giam count di 1 dv
                        dec    a
                    skip1:    movc    a, @a+dptr
                        mov r1,a;lưu tốc độ mới
                        reti            ; thoat khoi ngat
                    ;--------------------------------------------
                    delay:
                      ;  push    00 bỏ dòng này
                    ll: mov    th0, #high value
                        mov    tl0, #low value
                        setb    tr0
                        jnb    tf0, $
                        clr    tr0
                        clr    tf0
                        djnz    r0, ll
                        mov a, r1
                        mov r0,a;lạp lại tốc độ nháy
                        ; pop    00 bỏ dòng này
                        ret
                    ;--------------------------------------------
                    ma_tg:    ;count    0,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
                    ;        |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
                        db    5,10,15,20,25,30,25,40,45,50,55,60,65,70,75,80,85,90,100
                    ;--------------------------------------------
                        end
            |

            Comment


            • #7
              Nguyên văn bởi tdm Xem bài viết
              delay:
              ll: mov th0, #high value
              mov tl0, #low value
              setb tr0
              jnb tf0, $
              clr tr0
              clr tf0
              djnz r0, ll
              ;khi r0 =0 gọi delay lần nữa thì delay luôn có giá trị 255*delay(time0)
              ret
              code:
              Code:
                             ;===============================
                      ; Dung VDK AT89C51, thach anh 12Mhz    ;
                      ; 16 led duoc noi voi p0 va p2        ;
                      ; 2 nut bam dieu khien toc do nhay cua led:    ;
                      ;    - NHANH noi voi p3.2        ;
                      ;    - CHAM noi voi p3.3        ;
                      ; Cac Led duoc noi Catot chung, Led sang khi    ;
                      ; tin hieu xuat ra o cac chan VDK la muc 1.    ;
                      ;===============================
                          NHANH    bit    p3.2
                          CHAM    bit    p3.3
                          value    equ    -20000    ; 20ms
                          count    equ    07fh    ; dia chi bien dem 07fh
                                  ;
                          org    0h
                          sjmp    start
                          org    03h        ; vecto ngat ngoai 0
                          ljmp    ex0_isr        ; trinh phuc vu ngat ngoai 0
                          org    13h        ; vecto ngat ngoai 1
                          ljmp    ex1_isr        ; trinh phuc vu ngat ngoai 1
                      ;
                          org    30h        ; dia chi bat dau chuong trinh chinh
                      start:    mov    p0, #0        ; tat tat ca cac led
                          mov    p2, #0
                          setb    p3.2        ; thiet lap p3.2, p3.3
                          setb    p3.3        ; lam dau vao
                          mov    tmod, #01h    ; timer 0 che do 1 (16-bits)
                          setb    ie.7        ; cho phep ngat toan cuc
                          setb    ie.0        ; cho phep ngat ngoai 0
                          setb    ie.2        ; ngat ngoai 1
                          setb    it0        ; kich ngat
                          setb    it1        ; theo suon am
                          mov    count, #09    ; nap bien dem bang 9 (0 <= count <= 18)
                             mov r1,#50 //luu toc do
                          mov    r0, #50        ; khoi dong so lan lap thoi tgian delay voi gia tri ban dau la 50
                          mov    dptr, #ma_tg    ; dat con tro o bang ma thoi gian
                      back:    mov    p0, #0ffh        ; tat ca cac led sang
                          mov    p2, #0ffh        ;
                          call    delay        ; ct tre tao thoi gian sang
                          mov    p0, #0h        ; tat tat ca cac led
                          mov    p2, #0h
                          call    delay        ; ct tre tao thoi gian tat
                          sjmp    back        ; lap lai
                      ;
                      ;--------------------------------------------
                      ; Trinh phuc vu ngat ngoai 0
                      ;--------------------------------------------
                      ex0_isr:
                          clr    a        ; xoa Acc
                          dec    count        ; nut NHANH dc bam: giam bien dem thoi gian
                          mov    a, count        ; Acc = count
                          cjne    a, #255, skip    ; Count = -1 (255) ?
                          inc    count        ; dung: tang Count len 1 dv (Acc = 0)
                          inc    a        ; 
                      skip:    movc    a, @a+dptr    ; Acc khac -1: nap ma thoi gian vao Acc 
                           mov r1,a;lưu tốc độ mới
                          reti            ; thoat khoi ngat
                      ;--------------------------------------------
                      ; Trinh phuc vu ngat ngoai 1
                      ;--------------------------------------------
                      ex1_isr:
                          clr    a        ; xoa Acc
                          inc    count        ; nut CHAM dc bam: tang bien dem thoi gian
                          mov    a, count        ; Acc = count
                          cjne    a, #19, skip1    ; Count = 19 ?
                          dec    count        ; dung: giam count di 1 dv
                          dec    a
                      skip1:    movc    a, @a+dptr
                          mov r1,a;lưu tốc độ mới
                          reti            ; thoat khoi ngat
                      ;--------------------------------------------
                      delay:
                        ;  push    00 bỏ dòng này
                      ll: mov    th0, #high value
                          mov    tl0, #low value
                          setb    tr0
                          jnb    tf0, $
                          clr    tr0
                          clr    tf0
                          djnz    r0, ll
                          mov a, r1
                          mov r0,a;lạp lại tốc độ nháy
                          ; pop    00 bỏ dòng này
                          ret
                      ;--------------------------------------------
                      ma_tg:    ;count    0,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
                      ;        |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
                          db    5,10,15,20,25,30,25,40,45,50,55,60,65,70,75,80,85,90,100
                      ;--------------------------------------------
                          end
              khi giảm R0 về 0 thì gọi là thứ 2 R0 vẫn là giá trị delay ban đầu vì đầu của delay đã cất R0 vào stack rồi cuối delay lại đc lôi ra.
              Vấn đề là chủ thớt cất giá trị ko hợp lý. Chương trình chạy phần lớn thời gian là làm công việc delay, khi đó R0 có giá trị bất kì, giả sử r0 trong delay đang là 40d, nếu có ngắt, R0 lại đc nạp giá trị mới. Nhưng lúc này lại đang trong delay (dưới lệnh PUSH) thì R0 mới ko đc cập nhật. Vì thế R0 luôn ở giá trị ban đầu là 50d.
              Chủ thớt cần dùng biến phụ để lưu giá trị thời gian mới rồi nạp cho R0 giá trị của biến phụ ở đầu CT delay.
              Last edited by chung1608; 15-07-2012, 10:21.

              Comment


              • #8
                Nguyên văn bởi chung1608 Xem bài viết
                khi giảm R0 về 0 thì gọi là thứ 2 R0 vẫn là giá trị delay ban đầu vì đầu của delay đã cất R0 vào stack rồi cuối delay lại đc lôi ra.
                Vấn đề là chủ thớt cất giá trị ko hợp lý. Chương trình chạy phần lớn thời gian là làm công việc delay, khi đó R0 có giá trị bất kì, giả sử r0 trong delay đang là 40d, nếu có ngắt, R0 lại đc nạp giá trị mới. Nhưng lúc này lại đang trong delay (dưới lệnh PUSH) thì R0 mới ko đc cập nhật. Vì thế R0 luôn ở giá trị ban đầu là 50d.
                Chủ thớt cần dùng biến phụ để lưu giá trị thời gian mới rồi nạp cho R0 giá trị của biến phụ ở đầu CT delay.
                OK.đụng phải cao thủ ASM rồi ,nhưng theo tôi không nên lạm dụng stack quá có lúc nó tràn thì chít....
                |

                Comment


                • #9
                  Nguyên văn bởi tdm Xem bài viết
                  delay:
                  ll: mov th0, #high value
                  mov tl0, #low value
                  setb tr0
                  jnb tf0, $
                  clr tr0
                  clr tf0
                  djnz r0, ll
                  ;khi r0 =0 gọi delay lần nữa thì delay luôn có giá trị 255*delay(time0)
                  ret
                  code:
                  Code:
                                 ;===============================
                          ; Dung VDK AT89C51, thach anh 12Mhz    ;
                          ; 16 led duoc noi voi p0 va p2        ;
                          ; 2 nut bam dieu khien toc do nhay cua led:    ;
                          ;    - NHANH noi voi p3.2        ;
                          ;    - CHAM noi voi p3.3        ;
                          ; Cac Led duoc noi Catot chung, Led sang khi    ;
                          ; tin hieu xuat ra o cac chan VDK la muc 1.    ;
                          ;===============================
                              NHANH    bit    p3.2
                              CHAM    bit    p3.3
                              value    equ    -20000    ; 20ms
                              count    equ    07fh    ; dia chi bien dem 07fh
                                      ;
                              org    0h
                              sjmp    start
                              org    03h        ; vecto ngat ngoai 0
                              ljmp    ex0_isr        ; trinh phuc vu ngat ngoai 0
                              org    13h        ; vecto ngat ngoai 1
                              ljmp    ex1_isr        ; trinh phuc vu ngat ngoai 1
                          ;
                              org    30h        ; dia chi bat dau chuong trinh chinh
                          start:    mov    p0, #0        ; tat tat ca cac led
                              mov    p2, #0
                              setb    p3.2        ; thiet lap p3.2, p3.3
                              setb    p3.3        ; lam dau vao
                              mov    tmod, #01h    ; timer 0 che do 1 (16-bits)
                              setb    ie.7        ; cho phep ngat toan cuc
                              setb    ie.0        ; cho phep ngat ngoai 0
                              setb    ie.2        ; ngat ngoai 1
                              setb    it0        ; kich ngat
                              setb    it1        ; theo suon am
                              mov    count, #09    ; nap bien dem bang 9 (0 <= count <= 18)
                                 mov r1,#50 //luu toc do
                              mov    r0, #50        ; khoi dong so lan lap thoi tgian delay voi gia tri ban dau la 50
                              mov    dptr, #ma_tg    ; dat con tro o bang ma thoi gian
                          back:    mov    p0, #0ffh        ; tat ca cac led sang
                              mov    p2, #0ffh        ;
                              call    delay        ; ct tre tao thoi gian sang
                              mov    p0, #0h        ; tat tat ca cac led
                              mov    p2, #0h
                              call    delay        ; ct tre tao thoi gian tat
                              sjmp    back        ; lap lai
                          ;
                          ;--------------------------------------------
                          ; Trinh phuc vu ngat ngoai 0
                          ;--------------------------------------------
                          ex0_isr:
                              clr    a        ; xoa Acc
                              dec    count        ; nut NHANH dc bam: giam bien dem thoi gian
                              mov    a, count        ; Acc = count
                              cjne    a, #255, skip    ; Count = -1 (255) ?
                              inc    count        ; dung: tang Count len 1 dv (Acc = 0)
                              inc    a        ; 
                          skip:    movc    a, @a+dptr    ; Acc khac -1: nap ma thoi gian vao Acc 
                               mov r1,a;lưu tốc độ mới
                              reti            ; thoat khoi ngat
                          ;--------------------------------------------
                          ; Trinh phuc vu ngat ngoai 1
                          ;--------------------------------------------
                          ex1_isr:
                              clr    a        ; xoa Acc
                              inc    count        ; nut CHAM dc bam: tang bien dem thoi gian
                              mov    a, count        ; Acc = count
                              cjne    a, #19, skip1    ; Count = 19 ?
                              dec    count        ; dung: giam count di 1 dv
                              dec    a
                          skip1:    movc    a, @a+dptr
                              mov r1,a;lưu tốc độ mới
                              reti            ; thoat khoi ngat
                          ;--------------------------------------------
                          delay:
                            ;  push    00 bỏ dòng này
                          ll: mov    th0, #high value
                              mov    tl0, #low value
                              setb    tr0
                              jnb    tf0, $
                              clr    tr0
                              clr    tf0
                              djnz    r0, ll
                              mov a, r1
                              mov r0,a;lạp lại tốc độ nháy
                              ; pop    00 bỏ dòng này
                              ret
                          ;--------------------------------------------
                          ma_tg:    ;count    0,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18
                          ;        |  |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
                              db    5,10,15,20,25,30,25,40,45,50,55,60,65,70,75,80,85,90,100
                          ;--------------------------------------------
                              end
                  Nguyên văn bởi chung1608 Xem bài viết
                  khi giảm R0 về 0 thì gọi là thứ 2 R0 vẫn là giá trị delay ban đầu vì đầu của delay đã cất R0 vào stack rồi cuối delay lại đc lôi ra.
                  Vấn đề là chủ thớt cất giá trị ko hợp lý. Chương trình chạy phần lớn thời gian là làm công việc delay, khi đó R0 có giá trị bất kì, giả sử r0 trong delay đang là 40d, nếu có ngắt, R0 lại đc nạp giá trị mới. Nhưng lúc này lại đang trong delay (dưới lệnh PUSH) thì R0 mới ko đc cập nhật. Vì thế R0 luôn ở giá trị ban đầu là 50d.
                  Chủ thớt cần dùng biến phụ để lưu giá trị thời gian mới rồi nạp cho R0 giá trị của biến phụ ở đầu CT delay.
                  Em cảm ơn các bác đã giúp đỡ. Em đã sửa được code trên rồi !

                  Comment


                  • #10
                    các bạn cho mình hỏi mình muốn khi bấm nút thì chương trình dang chay dừng lại thì làm thế nào ?
                    = = === ===
                    = = =
                    ====== = = = = = ===
                    = = = = = = = = =
                    = = ==== = = = = =

                    Comment


                    • #11
                      Nguyên văn bởi hungbom Xem bài viết
                      các bạn cho mình hỏi mình muốn khi bấm nút thì chương trình dang chay dừng lại thì làm thế nào ?
                      Bạn có biết làm cho nó chạy không? Nếu bạn làm được cho nó chạy rồi thì dừng lại còn đơn giản hơn nhiều

                      Comment


                      • #12
                        Nguyên văn bởi hungbom Xem bài viết
                        các bạn cho mình hỏi mình muốn khi bấm nút thì chương trình dang chay dừng lại thì làm thế nào ?
                        bạn sử dụng ngắt ngoài như chủ thớt,ngắt ngoài gồm có ngắt INT0 và INT1.
                        chú ý là khj bật ngắt ngớ MOV IE,#XXXXXXXXH chứ đừng có setb thanh IE nhé.
                        INT0: MOV IE,#10000001H
                        INT1: MOV IE,#10000100H
                        nói chung là đọc sách

                        Comment

                        Về tác giả

                        Collapse

                        Ck33spkt Tìm hiểu thêm về Ck33spkt

                        Bài viết mới nhất

                        Collapse

                        Đang tải...
                        X