Thông báo

Collapse
No announcement yet.

Mạch đo nhịp tim dùng at89c51

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

  • Mạch đo nhịp tim dùng at89c51

    Mình đang làm mô phỏng mạch đo nhịp tim hiển thị số. Mình dùng nguồn SIN để làm tín hiệu đầu vào. Nguồn SIN 2mV khuếch đại 2000 lần rùi qua các bộ lọc loại bỏ tần số nhiễu. Cuối cùng qua một mạch so sánh trễ để chuyển từ tín hiệu sin sang tín hiệu xung đưa vào ngõ P3.5 89C51 để đếm. Phần mềm mình đếm xung trong 15s rùi nhân 4 ra nhịp đập trong một phút. Hiện tại mình vẫn chưa mô phỏng được trên proteus 8.0. Mình gửi phần cứng với code( CODE tham khảo trên mạng) lên , mong các bạn giúp đỡ. Mình sắp bảo vệ đồ án rùi. Cảm ơn các bạn !!!Click image for larger version

Name:	Capture11.jpg
Views:	1
Size:	121.3 KB
ID:	1419873
    CODE :
    ORG 000H // origin
    MOV DPTR,#LUT // moves starting address of LUT to DPTR
    MOV P1,#00000000B // sets P1 as output port
    MOV P0,#00000000B // sets P0 as output port
    MAIN: MOV R6,#230D // loads register R6 with 230D
    SETB P3.5 // sets P3.5 as input port
    MOV TMOD,#01100001B // Sets Timer1 as Mode2 counter & Timer0 as Mode1 timer
    MOV TL1,#00000000B // loads TL1 with initial value
    MOV TH1,#00000000B // loads TH1 with initial value
    SETB TR1 // starts timer(counter) 1
    BACK: MOV TH0,#00000000B // loads initial value to TH0
    MOV TL0,#00000000B // loads initial value to TL0
    SETB TR0 // starts timer 0
    HERE: JNB TF0,HERE // checks for Timer 0 roll over
    CLR TR0 // stops Timer0
    CLR TF0 // clears Timer Flag 0
    DJNZ R6,BACK
    CLR TR1 // stops Timer(counter)1
    CLR TF0 // clears Timer Flag 0
    CLR TF1 // clears Timer Flag 1
    ACALL DLOOP // Calls subroutine DLOOP for displaying the count
    SJMP MAIN // jumps back to the main loop
    DLOOP: MOV R5,#252D
    BACK1: MOV A,TL1 // loads the current count to the accumulator
    MOV B,#4D // loads register B with 4D
    MUL AB // Multiplies the TL1 count with 4
    MOV B,#100D // loads register B with 100D
    DIV AB // isolates first digit of the count
    SETB P1.0 // display driver transistor Q1 ON
    ACALL DISPLAY // converts 1st digit to 7seg pattern
    MOV P0,A // puts the pattern to port 0
    ACALL DELAY
    ACALL DELAY
    MOV A,B
    MOV B,#10D
    DIV AB // isolates the second digit of the count
    CLR P1.0 // display driver transistor Q1 OFF
    SETB P1.1 // display driver transistor Q2 ON
    ACALL DISPLAY // converts the 2nd digit to 7seg pattern
    MOV P0,A
    ACALL DELAY
    ACALL DELAY
    MOV A,B // moves the last digit of the count to accumulator
    CLR P1.1 // display driver transistor Q2 OFF
    SETB P1.2 // display driver transistor Q3 ON
    ACALL DISPLAY // converts 3rd digit to 7seg pattern
    MOV P0,A // puts the pattern to port 0
    ACALL DELAY // calls 1ms delay
    ACALL DELAY
    CLR P1.2
    DJNZ R5,BACK1 // repeats the subroutine DLOOP 100 times
    MOV P0,#11111111B
    RET

    DELAY: MOV R7,#250D // 1ms delay
    DEL1: DJNZ R7,DEL1
    RET

    DISPLAY: MOVC A,@A+DPTR // gets 7seg digit drive pattern for current value in A
    CPL A
    RET
    LUT: DB 3FH // LUT starts here
    DB 06H
    DB 5BH
    DB 4FH
    DB 66H
    DB 6DH
    DB 7DH
    DB 07H
    DB 7FH
    DB 6FH
    END
    code.txtMO PHONG PROTEUS.zip

  • #2
    Về mạch khuyếch đại hay so sánh thì mình không biết, nhưng bạn đã thử cân chỉnh từng tầng 1 chưa? cái phần đếm xung về sau này có thể dùng 1 "nguồn tạo xung" trên proteus để kiểm tra xem đã chạy chuẩn chưa? Phần tạo xung kích vào chân T1 có thể dùng đếm xung với đo dạng xung ở ngay trong proteus đó. Cứ cân chỉnh từng phần 1 kiểu gì cũng được.

    Comment


    • #3
      cảm ơn bạn, bạn có thể giải thích giúp mình doạn code này không???
      DLOOP: MOV R5,#252D
      BACK1: MOV A,TL1 // loads the current count to the accumulator
      MOV B,#4D // loads register B with 4D
      MUL AB // Multiplies the TL1 count with 4
      MOV B,#100D // loads register B with 100D
      DIV AB // isolates first digit of the count
      SETB P1.0 // display driver transistor Q1 ON
      ACALL DISPLAY // converts 1st digit to 7seg pattern
      MOV P0,A // puts the pattern to port 0
      ACALL DELAY
      ACALL DELAY
      MOV A,B
      MOV B,#10D
      DIV AB // isolates the second digit of the count
      CLR P1.0 // display driver transistor Q1 OFF
      SETB P1.1 // display driver transistor Q2 ON
      ACALL DISPLAY // converts the 2nd digit to 7seg pattern
      MOV P0,A
      ACALL DELAY
      ACALL DELAY
      MOV A,B // moves the last digit of the count to accumulator
      CLR P1.1 // display driver transistor Q2 OFF
      SETB P1.2 // display driver transistor Q3 ON
      ACALL DISPLAY // converts 3rd digit to 7seg pattern
      MOV P0,A // puts the pattern to port 0
      ACALL DELAY // calls 1ms delay
      ACALL DELAY
      CLR P1.2
      DJNZ R5,BACK1 // repeats the subroutine DLOOP 100 times
      MOV P0,#11111111B
      RET

      DELAY: MOV R7,#250D // 1ms delay
      DEL1: DJNZ R7,DEL1
      RET

      DISPLAY: MOVC A,@A+DPTR // gets 7seg digit drive pattern for current value in A
      CPL A
      RET

      CODE mình lấy trên mạng nên không biết có đúng k nữa. tks

      Comment


      • #4
        Nguyên văn bởi huy39 Xem bài viết
        cảm ơn bạn, bạn có thể giải thích giúp mình doạn code này không???
        DLOOP: MOV R5,#252D
        BACK1: MOV A,TL1 // loads the current count to the accumulator
        MOV B,#4D // loads register B with 4D
        MUL AB // Multiplies the TL1 count with 4
        MOV B,#100D // loads register B with 100D
        DIV AB // isolates first digit of the count
        SETB P1.0 // display driver transistor Q1 ON
        ACALL DISPLAY // converts 1st digit to 7seg pattern
        MOV P0,A // puts the pattern to port 0
        ACALL DELAY
        ACALL DELAY
        MOV A,B
        MOV B,#10D
        DIV AB // isolates the second digit of the count
        CLR P1.0 // display driver transistor Q1 OFF
        SETB P1.1 // display driver transistor Q2 ON
        ACALL DISPLAY // converts the 2nd digit to 7seg pattern
        MOV P0,A
        ACALL DELAY
        ACALL DELAY
        MOV A,B // moves the last digit of the count to accumulator
        CLR P1.1 // display driver transistor Q2 OFF
        SETB P1.2 // display driver transistor Q3 ON
        ACALL DISPLAY // converts 3rd digit to 7seg pattern
        MOV P0,A // puts the pattern to port 0
        ACALL DELAY // calls 1ms delay
        ACALL DELAY
        CLR P1.2
        DJNZ R5,BACK1 // repeats the subroutine DLOOP 100 times
        MOV P0,#11111111B
        RET

        DELAY: MOV R7,#250D // 1ms delay
        DEL1: DJNZ R7,DEL1
        RET

        DISPLAY: MOVC A,@A+DPTR // gets 7seg digit drive pattern for current value in A
        CPL A
        RET

        CODE mình lấy trên mạng nên không biết có đúng k nữa. tks
        Chắc chắn là không rồi vì mình không code ASM, nếu để ý đọc thì chắc cũng sẽ hiểu được thôi, nhưng mà nếu như thế thì thà bạn chịu khó ngồi đọc còn hơn. Ngồi đọc xong nháp nó ra giấy xem nó chạy thế nào là ok ngay thôi, đằng nào thì bạn vẫn phải học những cái này để sau này dùng trả bào thầy cô mà.

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...
        X