Thông báo

Collapse
No announcement yet.

Code+Simulation : Đồng hồ số hiển thị gian + nhiệt độ + báo thức

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

  • Code+Simulation : Đồng hồ số hiển thị gian + nhiệt độ + báo thức

    Xin chào các bác !

    Em đang làm project : " Đồng hồ số hiển thị gian + nhiệt độ + báo thức " dùng RTC DS1307 và LM35.

    Hiện tại em đã hoàn thành code của chương trình này bằng ASM.
    Chương trình có các chức năng cơ bản như sau:
    1. Hiển thị thời gian, ngày tháng năm theo lịch dương ( Bằng cách quét LED 7 thanh)
    2. Hiển thị nhiệt độ ( trong phần này có phần xử lý số liệu trích mẫu nhiệt độ để đưa ra kết quả)
    3. Cài đặt thời gian và báo thức bằng phím bấm

    Code:
       ; KHAI BAO BIEN BAN DAU
    ;====================================
    ;==== DINH NGHIA CAC THANH GHI ======
    ;====================================
    FLAG_MODE      DATA 30H
    FLAG_SET       DATA 31H
    FLAG_ALARM     DATA 32H
    PERCENT_SEC    DATA 33H
    VARI_JUMP      DATA 34H
    PULSE_JUMP     DATA 35H
    TEMP           DATA 36H
    SEC            DATA 37H
    MIN            DATA 38H
    HOUR           DATA 39H
    DAY            DATA 3AH
    DATE           DATA 3BH
    MONTH          DATA 3CH
    YEAR           DATA 3DH
    MIN_ALARM      DATA 3EH
    HOUR_ALARM     DATA 3FH
    D0_SEC         DATA 40H; Don vi cua giay
    D1_SEC         DATA 41H; Hang chuc cua giay
    D0_MIN         DATA 42H
    D1_MIN         DATA 43H
    D0_HOUR        DATA 44H
    D1_HOUR        DATA 45H
    D0_DATE        DATA 46H
    D1_DATE        DATA 47H
    D0_MONTH       DATA 48H
    D1_MONTH       DATA 49H
    D0_YEAR        DATA 4AH
    D1_YEAR        DATA 4BH
    D0_TEMP        DATA 4CH
    D1_TEMP        DATA 4DH
    D2_TEMP        DATA 4EH
    D0_MIN_ALARM   DATA 4FH
    D1_MIN_ALARM   DATA 50H
    D0_HOUR_ALARM  DATA 51H
    D1_HOUR_ALARM  DATA 52H
    
    ;====================================
    ;======= DINH NGHIA CAC BIT =========
    ;====================================
    CS              BIT    P2.4
    READ            BIT    P2.5
    WRITE           BIT    P2.6
    IR              BIT    P3.1
    REST_LED        BIT    P3.0
    SW_1            BIT    P3.2
    SW_2		    BIT	   P3.3
    SW_3		    BIT	   P3.4
    ALARM_BUZZ		BIT	   P3.5
    SCL             BIT    P3.6
    SDA             BIT    P3.7
    ;===================================
    ;====== DINH NGHIA CA HANG SO=======
    ;===================================
    LED_DATA        EQU  P0
    BYTE_W          EQU  11010000B; BYTE 0D0H DE THONG BAO THAO TAC GHI
    BYTE_R          EQU  11010001B; BYTE 0D01 DE THONG BAO THAO TAC DOC
    ADD_LOW         EQU  53H
    DATA_DS         EQU  54H
    
    
    ;========================================
    ORG 0000H
    LJMP INITIAL_ALL
    ;========================================
    ORG 000BH
    LJMP INTERRUPT_TIMER
    ;========================================
    
    
    
    ORG 0030H
    INITIAL_ALL:
    ;==================	KICH HOAT CHUONG TRINH NGAT
       MOV IE,#10001010B   
    ;=================  KICH HOAT TIMER
       MOV TMOD,#11H
       MOV TL0,#00H
       MOV TH0,#0DCH
       SETB TR0
    ;================
       MOV PERCENT_SEC  ,#0
       MOV VARI_JUMP    ,#0
       MOV PULSE_JUMP   ,#0
       MOV TEMP         ,#0
       MOV SEC          ,#0
       MOV MIN          ,#0
       MOV HOUR         ,#0
       MOV DAY          ,#0
       MOV DATE         ,#0
       MOV MONTH        ,#0
       MOV YEAR         ,#0
       MOV FLAG_SET     ,#0
       CLR ALARM_BUZZ
    READ_INTIAL_ALARM:
    ;============     Read FLAG_ALARM tu DS1307
       MOV    ADD_LOW,#08H
       LCALL  READ_BYTE
       MOV    A,DATA_DS
       CALL   BCD_HEX
       MOV    FLAG_ALARM,A
       LCALL  I2C_STOP
    ;=========== 	 Read MIN_ALARM tu DS1307
       MOV    ADD_LOW,#09H
       LCALL  READ_BYTE
       MOV    A,DATA_DS
       CALL   BCD_HEX
       MOV    MIN_ALARM,A
       LCALL  I2C_STOP
    ;===========    Read HOUR_ALARM tu DS1307
       MOV    ADD_LOW,#0AH
       LCALL  READ_BYTE
       MOV    A,DATA_DS
       CALL   BCD_HEX
       MOV    HOUR_ALARM,A
       LCALL  I2C_STOP
    ;===========================================
    MAIN:
    ;=========================================== Chuong Trinh tai day
       MOV   A,FLAG_MODE
       CJNE  A,#0,UPDATE_TIME_ALARM    
       LCALL READ_DATA_DS1307
       LCALL CHECK_ALARM_BUZZ
       LCALL DISPLAY_LED
       LCALL READ_DATA_ADC0804
       LCALL DISPLAY_LED
    UPDATE_TIME_ALARM:
    ;================= Flag MODE khac khong thi dang o che do cai dat gio va ba'o thu'c
       LCALL SCAN_KEY
       SJMP  MAIN
    
    ;========================================== 1. CHUONG TRINH DOC DU LIEU TU RTC DS1307 ================
    READ_DATA_DS1307:
    ;================================================= =READS SECONDS
       MOV   ADD_LOW,#00H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       LCALL BCD_HEX
       MOV   SEC,A
       LCALL I2C_STOP
    ;================================================= =READS MINUTES
       MOV   ADD_LOW,#01H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       LCALL BCD_HEX
       MOV   MIN,A
       LCALL I2C_STOP
    ;================================================= =READS HOURS
       MOV   ADD_LOW,#02H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       LCALL BCD_HEX
       MOV   HOUR,A
       LCALL I2C_STOP
    ;================================================= = READ DAY
       MOV   ADD_LOW,#03H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   DAY,A
       LCALL I2C_STOP
    ;================================================= = READ DATE 
       MOV   ADD_LOW,#04H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   DATE,A
       LCALL I2C_STOP
    ;================================================= = READ MONTH
       MOV   ADD_LOW,#05H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   MONTH,A
       LCALL I2C_STOP
    ;================================================= = READ YEAR
       MOV   ADD_LOW,#06H
       LCALL READ_BYTE
       MOV   A,DATA_DS
       CALL  BCD_HEX
       MOV   YEAR,A
       LCALL I2C_STOP
    RET
    
    
    ;=========================================================================
    ;===================         CHUONG TRINH CON GIAO TIEP I2C VOI DS1307            ===========
    ;===================== 1.1 CHUONG TRINH CON TAO " STOP CONDITIONAL " TRONG I2C =============
    I2C_STOP:
       CLR    SDA
       SETB   SCL
       NOP
       SETB   SDA
    RET
    ;==================== 1.2 CHUONG TRINH CON DE GHI DATA TRONG  I2C ==============
    WRITE_BYTE:
       CLR    SDA ;START BIT
       CLR    SCL
       MOV    A,#BYTE_W ;SEND CONTROL BYTE
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,WRITE_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       MOV    A,ADD_LOW ;SEND ADDRESS LOW
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,WRITE_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       MOV    A,DATA_DS ;SEND DATA
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,WRITE_BYTE ;LOOP UNTIL BUSY
       CLR    SDA
       CLR    SCL
       SETB   SCL ;STOP BIT
       SETB   SDA
    RET
    ;========================= CHUONG TRINH CON DE GUI 1 BYTE  TRONG I2C =======================
    LOOP_WRITE_BYTE:
       PUSH  02H
       MOV   R2,#08H
    LOOP_SEND:
       RLC   A
       MOV   SDA,C
       SETB  SCL
       CLR   SCL
       DJNZ  R2,LOOP_SEND
       POP 02H
    RET
    ;======================== 1.3 CHUONG TRINH CON DE DOC DATA TRONG  I2C  ============================
    READ_BYTE:
       CLR    SDA ;START BIT
       CLR    SCL
       MOV    A,#BYTE_W ;SEND CONTROL BYTE
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,READ_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       MOV    A,ADD_LOW ;SEND ADDRESS LOW
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,READ_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       SETB   SCL
       SETB   SDA
       CLR    SDA ;START BIT
       CLR    SCL
       MOV    A,#BYTE_R ;SEND CONTROL BYTE
       LCALL  LOOP_WRITE_BYTE
       SETB   SDA
       SETB   SCL
       JB     SDA,READ_BYTE ;LOOP UNTIL BUSY
       CLR    SCL
       LCALL  LOOP_READ
       SETB   SDA
       SETB   SCL
       CLR    SCL
       SETB   SCL ;STOP BIT
       SETB   SDA
    RET
    ;========================= CHUONG TRINH CON DE DOC 1 BYTE  TRONG I2C =======================
    LOOP_READ:  
       PUSH    02H
       MOV     R2,#08H
    LOOP_READ1:
       SETB    SCL
       MOV     C,SDA
       CLR     SCL
       RLC     A
       DJNZ    R2,LOOP_READ1
       MOV     DATA_DS,A
       POP     02H
    RET
    
    
    
    
    ;=====================================  2. Chuong trinh kiem tra bao thuc ===================
    CHECK_ALARM_BUZZ:
        MOV    A,FLAG_ALARM
        CJNE   A,#0,CHECK_HOUR_ALARM_BUZZ
        LJMP   ALARM_NOT_BUZZ
    CHECK_HOUR_ALARM_BUZZ:
        MOV    A,HOUR_ALARM
        CJNE   A,HOUR,EXIT_CHECK_ALARM_BUZZ
    CHECK_MIN_ALARM_BUZZ:
        MOV    A,MIN_ALARM
        CJNE   A,MIN,EXIT_CHECK_ALARM_BUZZ
        SETB   ALARM_BUZZ
    	SJMP   EXIT_CHECK_ALARM_BUZZ
    ALARM_NOT_BUZZ:
        CLR    ALARM_BUZZ
    EXIT_CHECK_ALARM_BUZZ:
    RET
    
    ;======================== 3.1 CHUONG TRINH DOC DU LIEU TU ADC 0804 ==============================
    READ_DATA_ADC0804:
        LCALL NHAPSOLIEU
        LCALL XULYSOLIEU
    ;======================== CHUONG TRINH NAY SU DUNG RAM TU VUNG 58H DEN 6FH DE TINH TOAN =========
    
    ;=============================3.1.1 NHAP 8 MAU SO LIEU VAO RAM===================================
    NHAPSOLIEU:  
       MOV   R0,#58H
    LOOPNSL:
       ACALL ADC
       MOV   @R0,A
       INC   R0
       CJNE  R0,#60H,LOOPNSL
    RET
    ;================================ CHUONG TRINH CON DOC DU LIEU TU ADC0804==============
    ADC:
       ACALL CONVERT
       ACALL READADC
    RET
    ;=================================
    CONVERT:
       SETB  IR 
       CLR   CS
       CLR   WRITE
       NOP
       SETB  WRITE
       SETB  CS
       JB    IR,$
    RET
    ;=================================
    READADC:
      CLR   CS
      CLR   READ
      SETB  READ
      MOV   A,P1
      CLR   READ
      SETB  CS
    RET
    ;======================== 3.2 CHUONG TRINH XU LIEU DU LIEU TREN 8051 ==============================
    XULYSOLIEU:
      LCALL TINHTBC
      LCALL XUATSOLIEU
    RET
    ;=======================3.2.1 TINH TRUNG BINH CONG ==============================
    TINHTBC:
      ACALL CHIATUNGMAU
      ACALL TINHTHUONGVAPHANDU
    RET
    ;======================= CHIA TUNG MAU SO LIEU CHO 8 ===================
    
    CHIATUNGMAU:
      MOV A,#58H
      MOV R0,#60H ; BAT DAU NGAN NHO CHUA THUONG 
      MOV R1,#68H ; BAT DAU NGAN NHO CHUA SO DU
    LOOPPC:
      MOV R7,A
      MOV B,R0
      MOV R0,A
      MOV A,@R0
      MOV R0,B
      MOV B,#8
      DIV AB
      MOV @R0,A
      MOV A,B
      MOV @R1,A
      MOV A,R7
      INC A
      INC R0
      INC R1
      CJNE R0,#68H,LOOPPC
    RET
    ;===================TINH THUONG VA PHAN DU THUC SU PHEP CHIA TRUNG BINH CONG ==============
    TINHTHUONGVAPHANDU:
      ACALL TINHPHANDUCUATRUNGBINHCONG8SO
      ACALL TINHTHUONGCUATRUNGBINHCONG8SO
    RET
    ;==========================================
    TINHPHANDUCUATRUNGBINHCONG8SO:
      MOV R1,#68H
      MOV A,#0
      MOV R5,#0
      MOV R7,#8
    LOOPTPD:
      MOV R6,A
      MOV A,@R1
      ADD A,R5
      MOV R5,A
      MOV A,R6
      INC R1
      CJNE R1,#70H,LOOPTPD
      MOV A,R5
      MOV B,#8
      DIV AB
      MOV R3,A; PHAN THEM VAO THUONG THUC SU CUA TRUNG BINH CONG
      MOV R4,B; PHAN DU THUC SU CUA TRUNG BINH CONG
    RET
    ;========================================
    TINHTHUONGCUATRUNGBINHCONG8SO:
      MOV R0,#60H
      MOV R7,#0
    LOOPTT:
      MOV A,@R0
      ADD A,R7
      MOV R7,A
      INC R0
      CJNE R0,#68H,LOOPTT
      MOV A,R7
      ADD A,R3
      MOV R3,A
    RET
    
    
    ;===================  3.2.2 XUAT SO LIEU =====================
    XUATSOLIEU:
       LCALL SAUDAUPHAY
       LCALL HANGTRAM
       LCALL HANGCHUCVADONVI
    RET
    ;====================================
    SAUDAUPHAY:
      MOV A,R4
      MOV B,#10
      MUL AB
      MOV B,#8
      DIV AB
      MOV D0_TEMP,A  
      MOV R5,B
    RET
    HANGTRAM:
      MOV A,R3
      MOV B,#100
      DIV AB
      MOV R1,A
      MOV R2,B
    RET
    HANGCHUCVADONVI:
      MOV A,R2
      MOV B,#10
      DIV AB
      MOV D2_TEMP,A
      MOV D1_TEMP,B
    RET
    ;==================================================================
    ;==================== 4.CHUONG TRINH HIEN THI =====================
    DISPLAY_LED:
       MOV   A,FLAG_MODE
    CHECK_FLAG_MODE_DISPLAY_0:
    ;========================== Kiem tra xem flag_mode dang o che do nao
      CJNE   A,#0,CHECK_FLAG_MODE_DISPLAY_1
      LCALL  DISPLAY_NORMAL
      LJMP   EXIT_DISPLAY_LED
    CHECK_FLAG_MODE_DISPLAY_1:
      CJNE   A,#1,CHECK_FLAG_MODE_DISPLAY_2
      LJMP   DISPLAY_BLINK_TIME
    CHECK_FLAG_MODE_DISPLAY_2:
      LJMP   DISPLAY_BLINK_ALARM
    ;======================================== MODE DISPLAY TIME
    DISPLAY_BLINK_TIME: 
    ;========================== Che do hien thi thoi gian co nha'y hoac khong nha'y
      MOV    A,VARI_JUMP
      CJNE   A,#0,CHECK_DISPLAY_BLINK_TIME
      LCALL  DISPLAY_NORMAL
      AJMP   EXIT_DISPLAY_LED
    CHECK_DISPLAY_BLINK_TIME:
      CALL   BLINK_TIME
      JMP    DISPLAY_BLINK_TIME
    EXIT_DISPLAY_LED :
    RET
    ;====================================  MODE DISPLAY ALARM
    DISPLAY_BLINK_ALARM:
      MOV    A,VARI_JUMP
      CJNE   A,#0,CHECK_DISPLAY_BLINK_ALARM
      LJMP   DISPLAY_ALARM_NORMAL
    CHECK_DISPLAY_BLINK_ALARM:
      LCALL  BLINK_ALARM
      LJMP    DISPLAY_BLINK_ALARM
    ;========================================= CHUONG TRINH CON NHAY MODE TIME=============
    DISPLAY_NORMAL:
    ;=================== Hien thi thoi gian khong nha'y
      LCALL DISPLAY_TEMP
      LCALL DISPLAY_SEC
      LCALL DISPLAY_MIN
      LCALL DISPLAY_HOUR
      LCALL DISPLAY_DAY
      LCALL DISPLAY_DATE
      LCALL DISPLAY_MONTH
      LCALL DISPLAY_YEAR
    RET
    ;=================================
    BLINK_TIME:
    ;================== Hien thi thoi gian co nha'y bang cach kiem tra gia tri flag_set
       MOV   A,FLAG_SET
    ;================== NHAY 2 LED PHUT =======
       CJNE  A,#1,CHECK_FLAG_BLINK_1 
       LCALL DISPLAY_SEC
    ;=====
       MOV   P2,#5
       LCALL DISPLAY_DOT_LED
       MOV   P2,#6
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED GIO =======
    CHECK_FLAG_BLINK_1 :
       MOV   A,FLAG_SET
       CJNE  A,#2,CHECK_FLAG_BLINK_2
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
    ;=====
       MOV   P2,#7
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY LED THU =======
    CHECK_FLAG_BLINK_2:
       MOV A,FLAG_SET
       CJNE A,#3,CHECK_FLAG_BLINK_3
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED NGAY =======
    CHECK_FLAG_BLINK_3:
       MOV   A,FLAG_SET
       CJNE  A,#4,CHECK_FLAG_BLINK_4
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
    ;=====
       MOV   P2,#13
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED THANG =======
    CHECK_FLAG_BLINK_4:
       MOV   A,FLAG_SET
       CJNE  A,#5,CHECK_FLAG_BLINK_5
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
    ;=====
       MOV   P2,#11
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_YEAR
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED NAM =======
    CHECK_FLAG_BLINK_5:
       MOV   A,FLAG_SET
       CJNE  A,#6,EXIT_BLINK
       LCALL DISPLAY_SEC
       LCALL DISPLAY_MIN
       LCALL DISPLAY_HOUR
       LCALL DISPLAY_DAY
       LCALL DISPLAY_DATE
       LCALL DISPLAY_MONTH
       LCALL DISPLAY_TEMP
    EXIT_BLINK:
    RET
    ;=================================	CHUONG TRINH CON HIEN THI CAC LED =============================
    DISPLAY_SEC:
       MOV    A,D0_SEC
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#3
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;==========
       MOV    A,D1_SEC
       MOV    DPTR,#MALED_NGUOC_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#4
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_MIN:
       MOV    A,D0_MIN
       MOV    DPTR,#MALED_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#5
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_MIN
       MOV    DPTR,#MALED_NGUOC_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#6
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_HOUR:
       MOV    A,D0_HOUR
       MOV    DPTR,#MALED_DP 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#7
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_HOUR
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#8
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;================================
    DISPLAY_DAY:
       MOV    A,DAY
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#15
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_DATE:
       MOV    A,D0_DATE
       MOV    DPTR,#MALED_DP
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#13
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_DATE
       MOV    DPTR,#MALED_NORMAL
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#14
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_MONTH:
       MOV    A,D0_MONTH
       MOV    DPTR,#MALED_DP
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#11
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    ;============
       MOV    A,D1_MONTH
       MOV    DPTR,#MALED_NORMAL 
       MOVC   A,@A+DPTR
       MOV    LED_DATA,A
       MOV    P2,#12
       SETB   REST_LED
       LCALL  DL
       CLR    REST_LED
    RET
    ;=================================
    DISPLAY_YEAR:
       MOV   A,D0_YEAR
       MOV   DPTR,#MALED_NORMAL 
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#9
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;============
       MOV   A,D1_YEAR
       MOV   DPTR,#MALED_NORMAL 
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#10
       SETB  REST_LED
       LCALL DL
       CLR REST_LED
    RET
    DISPLAY_TEMP:
       MOV   A,D0_TEMP
       MOV   DPTR,#MALED_NORMAL
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#0
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;============
       MOV   A,D1_TEMP
       MOV   DPTR,#MALED_DP 
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#1
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;=============
       MOV   A,D2_TEMP
       MOV   DPTR,#MALED_NORMAL  
       MOVC  A,@A+DPTR
       MOV   LED_DATA,A
       MOV   P2,#2
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;====================================== CHUONG TRINH CON MODE ALARM ===========================
    ;==================
    BLINK_ALARM:
    ;=================================
       MOV   A,FLAG_SET
       CJNE  A,#0,CHECK_FLAG_BLINK_ALARM_0
    DISPLAY_MODE_ALARM:
       LCALL DISPLAY_ALARM_AL
       LCALL DISPLAY_MIN_ALARM
       LCALL DISPLAY_HOUR_ALARM
       LCALL DISPLAY_TEMP
    
    ;================== NHAY 2 LED PHUT =======
    CHECK_FLAG_BLINK_ALARM_0:
       MOV  A,FLAG_SET
       CJNE  A,#1,CHECK_FLAG_BLINK_ALARM_1 
       LCALL DISPLAY_ALARM_AL
       LCALL DISPLAY_ALARM_ON_OFF
    ;=====
       MOV   P2,#6
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_HOUR_ALARM
       LCALL DISPLAY_TEMP
    ;================== NHAY 2 LED GIO =======
    CHECK_FLAG_BLINK_ALARM_1 :
       MOV   A,FLAG_SET
       CJNE  A,#2,EXIT_DISPLAY_FLAG_ALARM
       LCALL DISPLAY_ALARM_AL
       LCALL DISPLAY_ALARM_ON_OFF
       LCALL DISPLAY_MIN_ALARM
    ;=====
       MOV   P2,#7
       LCALL DISPLAY_DOT_LED
    ;=====
       LCALL DISPLAY_TEMP
    EXIT_DISPLAY_FLAG_ALARM:
    RET
    ;=================================
    DISPLAY_ALARM_NORMAL:
    ;===================== Hien thi o che do Alarm khong nha'y LED
        LCALL DISPLAY_ALARM_AL
        LCALL DISPLAY_ALARM_ON_OFF
        LCALL DISPLAY_MIN_ALARM
        LCALL DISPLAY_HOUR_ALARM
        LCALL DISPLAY_TEMP
    RET
    ;==============================
    DISPLAY_ALARM_AL:
    ;======================== TAO CHU A================ 
       MOV   LED_DATA,#88H
       MOV   P2,#14
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;======================= TAO CHU L=================
       MOV   LED_DATA,#0C7H
       MOV   P2,#13
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;===========================
    DISPLAY_ALARM_ON_OFF:
    ;============== Flag_alarm = 0 thi hien OFF, Flag_alarm=1 thi hien ON
       MOV   A,FLAG_ALARM
       CJNE  A,#0,DISPLAY_ALARM_ON
    DISPLAY_ALARM_OFF:
    ;======= TAO CHU 0======
       MOV   LED_DATA,#0C0H
       MOV   P2,#12
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;======== TAO CHU F =====
       MOV   LED_DATA,#8EH
       MOV   P2,#11
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;======= TAO CHU F ======
       MOV   LED_DATA,#8EH
       MOV   P2,#10
       SETB  REST_LED
       LCALL DL
       CLR REST_LED
    RET
    ;=====================
    DISPLAY_ALARM_ON:
    ;===================== TAO CHU 0===================
       MOV   LED_DATA,#0C0H
       MOV   P2,#12
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    ;=================== TAO CHU N=====================
       MOV   LED_DATA,#0C8H
       MOV   P2,#11
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;=====================
    DISPLAY_MIN_ALARM:
      MOV   A,D0_MIN_ALARM
      MOV   DPTR,#MALED_NORMAL 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#5
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    ;============
      MOV   A,D1_MIN_ALARM
      MOV   DPTR,#MALED_NGUOC_DP 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#6
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    RET
    ;==========================
    DISPLAY_HOUR_ALARM:
      MOV   A,D0_HOUR_ALARM
      MOV   DPTR,#MALED_DP 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#7
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    ;============
      MOV   A,D1_HOUR_ALARM
      MOV   DPTR,#MALED_NORMAL 
      MOVC  A,@A+DPTR
      MOV   LED_DATA,A
      MOV   P2,#8
      SETB  REST_LED
      LCALL DL
      CLR   REST_LED
    RET
    ;================
    DISPLAY_DOT_LED:
       MOV   LED_DATA,#07FH
       SETB  REST_LED
       LCALL DL
       CLR   REST_LED
    RET
    ;================================= CHUONG TRINH CON DELAY TRONG KHAU HIEN THI ================
    DL:
      MOV   R7,#200
      DJNZ  R7,$
    RET
    
    ;=============================== CHUONG TRINH CON CONVERT CAC KIEU DU LIEU =============
    BCD_HEX:
      MOV   B,#10H
      DIV   AB
      MOV   TEMP,B ;CAT HANG DON VI
      MOV   B,#10
      MUL   AB
      ADD   A,TEMP
    RET
    ;==========================================
    HEX_BCD:
    ;==========================================
      MOV  B,#10
      DIV  AB
      MOV  TEMP,B ;CAT HANG DON VI
      MOV  B,#10H
      MUL  AB
      ADD  A,TEMP
    RET
    ;===============================================================
    ;============================= CHUONG TRINH NGAT TIMER==========
    INTERRUPT_TIMER :
      INC  PULSE_JUMP
      INC  PERCENT_SEC ;DAT TIMER CHAY 1/100 GIAY
      MOV  TL0,#0H
      MOV  TH0,#0DCH
      SETB TR0
    ;===============
      PUSH ACC
      PUSH PSW ;THANH GHI TRANG TH?I CHUONG TR?NH
      PUSH B
    ;==========
      MOV  A,PULSE_JUMP ;TAO XUNG NHAP NHAY = 1/4 GIAY
      CJNE A,#25,INTERRUPT_TIMER_1
      MOV  PULSE_JUMP,#0
      INC  VARI_JUMP
      MOV  A,VARI_JUMP
      CJNE A,#3,INTERRUPT_TIMER_1
      MOV  VARI_JUMP,#0
    ;=========
    INTERRUPT_TIMER_1:
      MOV  A,PERCENT_SEC ;KIEM TRA BIEN PHAN_TRAM_GIAY - THOAT KHOI NGAT TIME0 NEU KHONG =
      CJNE A,#100,EXIT_INTERRUPT_TIMER
      MOV  PERCENT_SEC,#0 ;NEU = 100 TH? SET BIEN NAY = 0
    ;=========
    EXIT_INTERRUPT_TIMER:
      LCALL TACHSO
      POP   B
      POP   PSW
      POP   ACC
    RETI
    ;=====================================================================
    ;=====================================================================
    TACHSO:
    ;============ TACH GIAY	==========
       MOV A,SEC ;LAN LUOT CHIA CAC BIEN: GIAY, PHUT, GIO CHO 10
       MOV B,#10 ;DE TACH PHAN DON VI VA HANG CHUC RA, DE CAT RIENG VAO CAC BIEN TUONG UNG.
       DIV AB ;PHAN NGUYEN TRONG A, PHAN DU TRONG B
       MOV D1_SEC,A ;LUU LAI HANG CHUC GIAY
       MOV D0_SEC,B ;LUU LAI DON VI GIAY
    ;==========	 TACH PHUT	==========
       MOV A,MIN
       MOV B,#10
       DIV AB
       MOV D1_MIN,A
       MOV D0_MIN,B
    ;==========	  TACH PHUT	   ==========
       MOV A,HOUR
       MOV B,#10
       DIV AB
       MOV D1_HOUR,A
       MOV D0_HOUR,B
    ;==========	  TACH NGAY		==========
       MOV A,DATE
       MOV B,#10
       DIV AB
       MOV D1_DATE,A
       MOV D0_DATE,B
    ;==========	   TACH THANG	 ==========
       MOV A,MONTH
       MOV B,#10
       DIV AB
       MOV D1_MONTH,A
       MOV D0_MONTH,B
    ;==========	TACH NAM	   ==========
       MOV A,YEAR
       MOV B,#10
       DIV AB
       MOV D1_YEAR,A
       MOV D0_YEAR,B
    
    ;==========	 TACH PHUT CUA ALARM	==========
       MOV A,MIN_ALARM
       MOV B,#10
       DIV AB
       MOV D1_MIN_ALARM,A
       MOV D0_MIN_ALARM,B
    ;==========	  TACH GIO CUA ALARM   ==========
       MOV A,HOUR_ALARM
       MOV B,#10
       DIV AB
       MOV D1_HOUR_ALARM,A
       MOV D0_HOUR_ALARM,B
    RET
    ;====================================================================================================
    ;=======================================5. Chuong trinh kiem tra phim bam============================
    SCAN_KEY:
    ;==================================================
    SW1:
       JB   SW_1,SW2
       INC  FLAG_MODE
       MOV  A,FLAG_MODE
       CJNE A,#1,CHECK_MODE
       MOV  FLAG_SET,#1
       SJMP MODE_DONE
    CHECK_MODE:
       CJNE  A,#2,CHECK_MODE_OUT
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LCALL UPDATE_TIME
    INTIAL_MODE_ALARM:
       MOV   FLAG_SET,#0
       SJMP  MODE_DONE
    CHECK_MODE_OUT:
       CJNE   A,#3,MODE_DONE
       MOV    FLAG_MODE,#0
       LCALL  UPDATE_ALARM
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LJMP   NOKEY
    MODE_DONE:
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       SJMP   SW2
    ;=============================
    SW2:
       JB     SW_2,SW3
       MOV    A,FLAG_MODE
       CJNE   A,#1,MODE_ALARM
    ;=================
    MODE_TIME:
       INC    FLAG_SET
       MOV    A,FLAG_SET
       CJNE   A,#7,MODE_TIME_DONE
       MOV    FLAG_SET,#1
    MODE_TIME_DONE:
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LJMP   SW3
    ;==================
    MODE_ALARM:
       INC    FLAG_SET
       MOV    A,FLAG_SET
       CJNE   A,#3,MODE_ALARM_DONE
       MOV    FLAG_SET,#0
    MODE_ALARM_DONE:
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LCALL  DELAY_VIBRATION
       LJMP   SW3
    ;==================
    SW3:
      JB     SW_3,NOKEY
      MOV    A,FLAG_MODE ; CHECK MODE
      CJNE   A,#1,MODE_ALARM_INC
    ;================================
    MODE_TIME_INC:
      MOV    A,FLAG_SET ; CHECK DATA SET
    CHECK_MODE_TIME_INC:
    ;==================
    CHECK_MODE_TIME_INC_1:
      CJNE   A,#1,CHECK_MODE_TIME_INC_2
      LJMP   TIME_INC_MIN
    CHECK_MODE_TIME_INC_2:
      CJNE   A,#2,CHECK_MODE_TIME_INC_3
      LJMP   TIME_INC_HOUR
    CHECK_MODE_TIME_INC_3:
      CJNE   A,#3,CHECK_MODE_TIME_INC_4
      LJMP   TIME_INC_DAY
    CHECK_MODE_TIME_INC_4:
      CJNE   A,#1,CHECK_MODE_TIME_INC_5
      LJMP   TIME_INC_DATE
    CHECK_MODE_TIME_INC_5:
      CJNE   A,#1,CHECK_MODE_TIME_INC_6
      LJMP   TIME_INC_MONTH
    CHECK_MODE_TIME_INC_6:
      LJMP TIME_INC_YEAR
    ;============================================ 
    NOKEY:
      LCALL DISPLAY_LED
    RET
    ;======================== MODE TANG ALARM
    MODE_ALARM_INC:
      MOV   A,FLAG_SET
    CHECK_MODE_ALARM_INC:
    CHECK_MODE_ALARM_INC_0:
      CJNE  A,#0,CHECK_MODE_ALARM_INC_1
      LJMP  ALARM_INC_FLAG
    CHECK_MODE_ALARM_INC_1:
      CJNE  A,#1,CHECK_MODE_ALARM_INC_2
      LJMP  ALARM_INC_MIN
    CHECK_MODE_ALARM_INC_2:
      LJMP ALARM_INC_HOUR
    ;============================== CHUONG TRINH TANG CAC DATA CUA TIME ========================
    TIME_INC_MIN:
      INC    MIN 
      MOV    A,MIN
      CJNE   A,#60,DONE_TIME_INC_MIN
      MOV    MIN,#0
    DONE_TIME_INC_MIN:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;================
    TIME_INC_HOUR:
      INC   HOUR 
      MOV   A,HOUR
      CJNE  A,#24,DONE_TIME_INC_HOUR
      MOV   HOUR,#0
    DONE_TIME_INC_HOUR:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_DAY:
      INC   DAY 
      MOV   A,DAY
      CJNE  A,#8,DONE_TIME_INC_DAY
      MOV   DAY,#1
    DONE_TIME_INC_DAY:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_DATE:
      INC   DATE 
      MOV   A,DATE
      CJNE  A,#32,DONE_TIME_INC_DATE
      MOV   DATE,#1
    DONE_TIME_INC_DATE:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_MONTH:
      INC   MONTH 
      MOV   A,MONTH
      CJNE  A,#13,DONE_TIME_INC_MONTH
      MOV   MONTH,#1
    DONE_TIME_INC_MONTH:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;===============
    TIME_INC_YEAR:
      INC   YEAR 
      MOV   A,YEAR
      CJNE  A,#99,DONE_TIME_INC_YEAR
      MOV   YEAR,#0
    DONE_TIME_INC_YEAR:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;========================================= TANG CAC GIA TRI CUA ALARM============================
    ALARM_INC_FLAG :
      INC   FLAG_ALARM
      MOV   A,FLAG_ALARM
      CJNE  A,#2,DONE_ALARM_INC_FLAG
      MOV   FLAG_ALARM,#0
    DONE_ALARM_INC_FLAG:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;=============
    ALARM_INC_MIN:
      INC    MIN_ALARM 
      MOV    A,MIN_ALARM
      CJNE   A,#60,DONE_ALARM_INC_MIN
      MOV    MIN_ALARM,#0
    DONE_ALARM_INC_MIN:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;=============
    ALARM_INC_HOUR:
      INC   HOUR_ALARM 
      MOV   A,HOUR_ALARM
      CJNE  A,#24,DONE_ALARM_INC_HOUR
      MOV   HOUR_ALARM,#0
    DONE_ALARM_INC_HOUR:
      LCALL DELAY_VIBRATION
      LCALL DELAY_VIBRATION
      LJMP  NOKEY
    ;============================ CHUONG TRINH CAP NHAT THOI GIAN DA SET VAO DS1307  ==================
    UPDATE_TIME:
      MOV    DATA_DS,00H
      MOV    ADD_LOW,#00H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,MIN
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#01H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,HOUR
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#02H
      LCALL  WRITE_BYTE
    ;==========
      MOV   A,DAY
      LCALL HEX_BCD
      MOV   DATA_DS,A
      MOV   ADD_LOW,#03H
      LCALL WRITE_BYTE
    ;==========
      MOV   A,DATE
      LCALL HEX_BCD
      MOV   DATA_DS,A
      MOV   ADD_LOW,#04H
      LCALL WRITE_BYTE
    ;==========
      MOV    A,MONTH
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#05H
      LCALL  WRITE_BYTE
    ;==========
      MOV   A,YEAR
      LCALL HEX_BCD
      MOV   DATA_DS,A
      MOV   ADD_LOW,#06H
      LCALL WRITE_BYTE
    RET
    ;==========================
    UPDATE_ALARM:
      MOV    A,FLAG_ALARM
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#08H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,MIN_ALARM
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#09H
      LCALL  WRITE_BYTE
    ;==========
      MOV    A,HOUR_ALARM
      LCALL  HEX_BCD
      MOV    DATA_DS,A
      MOV    ADD_LOW,#0AH
      LCALL  WRITE_BYTE
    RET
    ;==========================
    DELAY_VIBRATION:
      PUSH   00H
      MOV    R0,#20
    LOOP_DELAY_VIBRATION:
      LCALL  DISPLAY_LED
      DJNZ   R0,LOOP_DELAY_VIBRATION
      POP    00H
    RET
    ;================================
    MALED_NORMAL  : DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
    MALED_DP      : DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
    MALED_NGUOC_DP: DB 40H,4FH,24H,06H,0BH,12H,10H,47H,00H,02H
    ;=================================
    END
    Mới học vi điều khiển được một thời gian, chưa có nhiều kinh nghiệm nên có nhiều sai sót.
    Mong các bác " check " lỗi giúp em với ạ.

    Link Code+Simulation : RTC_LM_FIXED_N_5_9.rar

    P/S: Khi làm project này em có tham khảo code đồng hồ số của bác PTCOM ở topic http://www.dientuvietnam.net/forums/...19/index2.html
    Last edited by 69PhamLai69; 06-09-2012, 22:04.

  • #2
    bạn ơi có sơ đồ nguyên lý k bạn cho mình xin tham khảo nha.

    Comment


    • #3
      bạn 69PhamLai69 co thể post so đồ nguyên lý + mô phỏng lên cho moi người tham khao ko ? (mình xài proteus 7.8sp2 mà nó cứ chạy tùm lum lên ah)
      mình mới học điện tử nên gà lắm

      Comment


      • #4
        thanks ban

        Comment


        • #5
          giúp gấp cái các pro ơi

          Tại sao mình làm cái đồng hồ mà lúc đầu xung ở chân số 7 của con ds1307 mình gắn với led thì nó nháy bình thường ~ nhưng do sơ ý mình làm 2 chân âm dương ở con 7805 bị chập thì cái led báo xung 1hz đó nó chỉ sáng chứ ko nháy nữa ! mình đã thay con ds1307 khác vào vẫn thế ! (
          mong các pro giúp đỡ mình với !
          mình đã thử thay con IC 89 khác cũng ko đc

          Comment


          • #6
            có code C không bạn! nhìn thấy code ASM mà rối cả mắt!

            Comment

            Về tác giả

            Collapse

            69PhamLai69 Tìm hiểu thêm về 69PhamLai69

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

            Collapse

            Đang tải...
            X