Thông báo

Collapse
No announcement yet.

xin gop y

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

  • xin gop y

    mình có bài tập VXL này:
    Một ứng dụng được phát triển dựa trên bộ vi điều khiển AT89S51 có giao diện với người dùng như hình vẽ:
    - Khi mới bật điện, LED bảy đoạn hiển thị giá trị (VALUE) bằng 0.
    - ADJ., SET, và CLEAR đều là những nút nhấn thường hở.
    - Bất kể lúc nào nút CLEAR được nhấn thả, giá trị trên LED sẽ bằng 0.
    - Bất kể lúc nào nút SET được nhấn thả, giá trị trên LED sẽ bằng 5.
    - Bất kể lúc nào nút ADJ. được nhấn thả, giá trị trên LED sẽ tăng lên một đơn vị và tự dừng lại. Nếu đang là 9, nhấn thả ADJ. sẽ chuyển giá trị về bằng 0.
    a) Vẽ sơ đồ mạch nguyên lý hoàn chỉnh.
    b) Vẽ lưu đồ giải thuật.
    Viết chương trình hợp ngữ

    Cách giải quyết cuả mình như sau:
    i)ban đầu phải kiểm tra và chống dội cho nút nhấn xem nút có được nhấn để nhận lệnh không?
    ii) sau đó với lần lượt các nút như ADJ được nhấn thành công thì ta tăng giá trị lên 1 cho LED.
    Iii)nút SET được nhấn thì phải đưa ngay ra LED số 5
    iiii) dùng phương pháp tra bảng với con trỏ DPTR vì yêu cầu là giải mã bằng phần mền vì thế ta cứ xuất ra giá trị cho port 1(led được nối trực tiếp vào port 1)
    nhưng mình có những thắc mắc nhỏ sau:
    1) nút CLEAR như mình thiết kế trên là gắn vào RST thì khi lập trình mình phải mô tả như thế nào?
    2) Các bạn có đóng góp ý kiến nào cho pp giải bài này ? giúp mình với nhé.
    Đây là phương án của mình:
    hinh minh hoa:


  • #2
    day la chuong trinh minh viet thu,cac ban gop y dum nhe
    org 000h
    LED7DOAN equ p1
    adj bit p2.0
    set bit p2.1

    clr A
    MOV DPTR,#500H


    ;KIEM TRA NUT NHAN ADJ
    X0:
    MOV A,@A+DPTR ;DAM BAO NEU KHONG NHAN THI LED HIEN SO 0 VI A BAN DAU LA 0
    MOV LED7DOAN,#A
    JB ADJ,X2 ; KIEM TRA XEM ADJ CO DUOC NHAN HAY KHONG?
    CALL T50MS
    JB ADJ,X0 ; CO CON NHAN NUT HAY KHONG?
    INC A
    CJNE A,#10,X1; SO SANH NEU BANG 10 THI PHAI QUAY LAI GIA TRI 0
    MOV A,#0
    JMP X1
    X1: MOVC A,@A+DPTR
    JNB ADJ,$ ; XEM NUT NHAN DA DUOC BUONG RA CHUA?
    CALL T50MS
    JMP X0 ; QUAY LAI VI TRI DAU DE KIEM TRA LAI NUT ADJ

    ;KIEM TRA NUT NHAN SET

    X2:
    JB SET,NOFIX

    CALL T50MS
    JB SET,X2
    MOV A,#5
    MOVC A,@A + DPTR
    JNB SET,$ ;XEM CO CON NHAN NUT HAY KHONG?
    MOV LED7DOAN,#A
    CALL T50MS
    JMP X0 ;THUC HIEN LAI 1 VONG KIEM TRA TU NET NHAN ADJ BAN DAU

    NOFIX: ; NEU KHONG NHAN GI THI PHAI GIU NGUYEN TRANG THAI
    MOV LED7DOAN,#A
    JMP X0

    T50MS: ;CHUONG TRINH TRI HOAN CUA CHONG DOI DUNG TIMER0 CHEDO 16 BIT TAO "50 LAN THOI GIAN 1MS"
    MOV R7,#50
    L: MOV TMOD,#01h
    MOV TH0,HIGH(-500)
    MOV TL0,LOW(-500)
    SET TR0
    JNB TF0,$ ;CHO DEN KHI CO TRAN THI XOA
    CLR TR0
    CLR TF0
    DJNZ R7,L ; PHAI THUC HIEN 50 LAN THOI GIAN 50*1MS
    RET


    ORG 500H ; THUC HIEN NOI LED TRUC TIEP VAO P1 ANOD CHUNG

    DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H ;CHI DINH NGHIA CHO 9 SO

    END

    Comment


    • #3
      - u ở đây đưa lun nút RST làm nút CLR .Cũng đc , ko sao hết . Nhưng nếu có 2 led đếm thì khi nhấn RST , cả 2 đều về 00 , trong khi BT yêu cầu chỉ có led đơn vị về 0 , led chục vẫn giữ giá trị thì sao ? -->Cách tốt nhất nên dùng nút CLR riêng .
      - Mạch mô phỏng trên proteus thì nút nhấn đc gắn vậy , chứ thực tế tui sợ đọc đầu vào các chân P2.0 , P2.1 khó lám -->Nên dùng trở 10k treo lên +vcc ở các nút bấm để nhận mức dễ dàng.
      - Bài này đơn giản mà . Quét phím gọi chương trình thui chứ có j ghê gớm đâu. Nếu viết = C thì bài này trong vòng 10 phút.

      Comment


      • #4
        chỉ có 1 led đơn thôi bạn ạ.vì thế nên dùng nút rst mà tớ vẫn chưa hiếu nút này tác động như thế nào khi lập trình.vì mới học nên mình viết bằng assem.nếu bạn có thể xem giúp mình chương trình mình viết có đúng khong?

        Comment


        • #5
          Tôi chắc chắn với bạn rằng, trên thực tế mạch của bạn không chạy. Bởi vì nếu muốn vi điều khiển chạy thì trước hết nó phải được reset. Thời gian reset it nhất là 2us ---> bạn phải sửa lại mạch reset như nhà sản xuất cung cấp. Khi reset thì vi điều khiển sẽ thực hiện lệnh từ địa chỉ 000H ---> bạn không cần phải lập trình cho nút CLR.

          Đây là đoạn code của tôi viết:

          SET BIT P2.1
          ADJ BIT P2.2
          ......ORG 000H
          ......MOV R0,#0
          TD:.MOV A,R0
          ......MOV DPTR,#500H
          ......MOVC A,@A+DPTR
          ......MOV P1,A
          ......JB SET,X1
          ......LCALL DELAY ;CHỐNG DỘI
          ......MOV R0,#5
          ......JMP TD
          X1:
          ......JB ADJ,TD
          ......LCALL DELAY ;CHỐNG DỘI
          ......INC R0
          ......CJNE R0,#10,X2
          ......MOV R0,#0
          X2: JMP TD

          ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

          DELAY:
          .......MOV R1,#0FFH
          .......DJNZ R1,$
          RET

          ;XXXXXXXX
          ORG 500H
          DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H ,82H, 0F8H, 80H, 90H

          END
          Last edited by sangthai; 05-12-2008, 17:20.

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X