⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex10-3.sdi

📁 《单片机原理实用教程——基于Proteus虚拟仿真》一书的配套光盘
💻 SDI
字号:
,,,;*********************************************************************/
,,,
000B,,,T_RST Bit P1.5 ;实时时钟复位线引脚
000B,,,T_CLK Bit P1.6 ;实时时钟时钟线引脚
000B,,,T_IO Bit P1.7 ;实时时钟数据线引脚
,,,
,,,SECOND EQU 30H
,,,MINUTE EQU 31H
,,,HOUR EQU 32H
,,,DAY EQU 33H
,,,MONTH EQU 34H
,,,WEEK EQU 35H
,,,YEARL EQU 36H
,,,
,,,;*********************************************************************/
,,,        ORG 0000H
0000,02 00 60,START,START:  LJMP MAIN
,,,        ORG 0060H
0060,75 81 60,MAIN,MAIN:   MOV SP,#60H                 ;修改堆栈
,,,;*********************************************************************
0063,75 30 55,,        MOV SECOND,#55H             ;初始时间设为23:59:55
0066,75 31 59,,        MOV MINUTE,#59H
0069,75 32 23,,        MOV HOUR,#23H
006C,75 33 31,,        MOV DAY,#31H                ;初始日期设为07年12月31日第一周
006F,75 34 12,,        MOV MONTH,#12H
0072,75 35 01,,        MOV WEEK,#01H
0075,75 36 07,,        MOV YEARL,#07H
0078,12 01 5F,,        LCALL SETDS1302
007B,12 01 FF,,                LCALL LCD_INIT              ;调用液晶模块初始化子程序
007E,7B 14,,        MOV R3,#20
0080,75 89 01,,        MOV TMOD,#01H
0083,75 8C 3C,,        MOV TH0,#3CH                ;置定时器初值(定时50ms)
0086,75 8A B0,,        MOV TL0,#0B0H
0089,D2 8C,,        SETB TR0                    ;启动定时器0
008B,10 8D 02,LP1,LP1:    JBC TF0,LP2                 ;查询计数溢出
008E,80 FB,,        SJMP LP1                    ;未到50 ms继续计数
0090,75 8C 3C,LP2,LP2:    MOV TH0,#3CH                ;重新置定时器初值
0093,75 8A B0,,        MOV TL0,#0B0H
0096,7A 81,,        MOV   R2,#81H               ;从第1行第2位开始,设置DDRAM地址
0098,12 02 34,,        LCALL WRTC
009B,90 00 BF,,        MOV   DPTR,#ZIFU1           ;指向显示字符代码首地址
009E,7C 06,,        MOV   R4,#06H
00A0,12 02 44,,        LCALL WP1                   ;第1行字符代码写入DDRAM
00A3,12 01 15,,        LCALL DISPYMD               ;显示年月日
00A6,7A C1,,        MOV   R2,#0C1H              ;设置第2行DDRAM地址
00A8,12 02 34,,        LCALL WRTC
00AB,90 00 C5,,        MOV   DPTR,#ZIFU2           ;指向显示字符代码首地址
00AE,7C 06,,        MOV   R4,#06H
00B0,12 02 44,,        LCALL WP1                   ;第1行字符代码写入DDRAM
00B3,12 00 CB,,        LCALL DISPHMS               ;显示时分秒
00B6,DB D3,,        DJNZ R3,LP1                 ;未到1s继续循环
00B8,12 01 BA,,        LCALL GET1302               ;每到1s从DS1302读取一次时间
00BB,7B 14,,        mov     r3,#20
00BD,80 CC,,        SJMP lp1
00BF,44 61 74 65,ZIFU1,ZIFU1:  DB "Date: "
00C5,54 69 6D 65,ZIFU2,ZIFU2:  DB "Time: "
,,,
,,,;*******************************************
00CB,E5 32,DISPHMS,DISPHMS:MOV     A,HOUR                  ;时分秒显示子程序
00CD,C4,,        SWAP    A
00CE,54 03,,        ANL     A,#03H
00D0,24 30,,                ADD     A,#30H
00D2,FA,,                MOV     R2,A
00D3,12 02 3C,,                LCALL   WRTD
00D6,E5 32,,        MOV     A,HOUR
00D8,54 0F,,        ANL     A,#0FH
00DA,24 30,,                ADD     A,#30H
00DC,FA,,                MOV             R2,A
00DD,12 02 3C,,                LCALL   WRTD
00E0,7A 2D,,                MOV     R2,#2DH
00E2,12 02 3C,,                LCALL   WRTD
00E5,E5 31,,        MOV     A,MINUTE                ;显示分
00E7,C4,,        SWAP    A
00E8,54 07,,        ANL     A,#07H
00EA,24 30,,                ADD A,#30H
00EC,FA,,                MOV R2,A
00ED,12 02 3C,,                LCALL WRTD
00F0,E5 31,,        MOV     A,MINUTE
00F2,54 0F,,        ANL     A,#0FH
00F4,24 30,,                ADD A,#30H
00F6,FA,,                MOV R2,A
00F7,12 02 3C,,                LCALL WRTD
00FA,7A 2D,,                MOV R2,#2DH
00FC,12 02 3C,,                LCALL WRTD
00FF,E5 30,,        MOV     A,SECOND                ;显示秒
0101,C4,,        SWAP    A
0102,54 07,,        ANL     A,#07H
0104,24 30,,                ADD A,#30H
0106,FA,,                MOV R2,A
0107,12 02 3C,,                LCALL WRTD
010A,E5 30,,        MOV     A,SECOND
010C,54 0F,,        ANL     A,#0FH
010E,24 30,,                ADD A,#30H
0110,FA,,                MOV R2,A
0111,12 02 3C,,                LCALL WRTD
0114,22,,        RET
,,,;*****************************************
0115,E5 36,DISPYMD,DISPYMD:MOV     A,YEARL         ;年月日显示子程序
0117,C4,,        SWAP    A
0118,54 03,,        ANL     A,#03H
011A,24 30,,                ADD     A,#30H
011C,FA,,                MOV     R2,A
011D,12 02 3C,,                LCALL   WRTD
0120,E5 36,,        MOV     A,YEARL
0122,54 0F,,        ANL     A,#0FH
0124,24 30,,                ADD             A,#30H
0126,FA,,                MOV             R2,A
0127,12 02 3C,,                LCALL   WRTD
012A,7A 2D,,                MOV     R2,#2DH
012C,12 02 3C,,                LCALL   WRTD
,,,
012F,E5 34,,        MOV     A,MONTH                  ;显示月
0131,C4,,        SWAP    A
0132,54 07,,        ANL     A,#07H
0134,24 30,,                ADD     A,#30H
0136,FA,,                MOV     R2,A
0137,12 02 3C,,                LCALL   WRTD
013A,E5 34,,        MOV     A,MONTH
013C,54 0F,,        ANL     A,#0FH
013E,24 30,,                ADD     A,#30H
0140,FA,,                MOV     R2,A
0141,12 02 3C,,                LCALL   WRTD
0144,7A 2D,,                MOV     R2,#2DH
0146,12 02 3C,,                LCALL   WRTD
0149,E5 33,,        MOV     A,DAY                    ;显示日
014B,C4,,        SWAP    A
014C,54 07,,        ANL     A,#07H
014E,24 30,,                ADD     A,#30H
0150,FA,,                MOV     R2,A
0151,12 02 3C,,                LCALL   WRTD
0154,E5 33,,        MOV     A,DAY
0156,54 0F,,        ANL     A,#0FH
0158,24 30,,                ADD     A,#30H
015A,FA,,                MOV             R2,A
015B,12 02 3C,,                LCALL   WRTD
015E,22,,        RET
,,,;*****************************************************************
015F,C2 95,SETDS1302,SETDS1302: CLR     T_RST                 ;设置DS1302初始时间,并启动计时
0161,00,,        nop
0162,C2 96,,        CLR     T_CLK
0164,00,,        nop
0165,D2 95,,        SETB    T_RST
0167,00,,        nop
0168,75 F0 8E,,        MOV     B,#8EH          ;写控制命令字
016B,12 01 DE,,        LCALL   INPUTBYTE
016E,75 F0 00,,        MOV     B,#00H          ;写保护关闭
0171,12 01 DE,,        LCALL   INPUTBYTE
0174,D2 96,,        SETB    T_CLK
0176,00,,        nop
0177,C2 95,,        CLR     T_RST
0179,78 30,,        MOV     R0,#SECOND      ;内存中的时间首地址
017B,79 80,,        MOV     R1,#80H         ;DS1302中的时间首地址
017D,7F 07,,        MOV     R7,#7           ;字节数
017F,C2 95,SETLOOP,SETLOOP:CLR     T_RST
0181,00,,        nop
0182,C2 96,,        CLR     T_CLK
0184,00,,        nop
0185,D2 95,,        SETB    T_RST
0187,00,,        nop
0188,89 F0,,        MOV     B,R1            ;写命令字
018A,12 01 DE,,        LCALL   INPUTBYTE
018D,E6,,        MOV     A,@R0           ;设置时间
018E,F5 F0,,        MOV     B,A
0190,12 01 DE,,        LCALL   INPUTBYTE
0193,08,,        INC     R0
0194,09,,        INC     R1
0195,09,,        INC     R1
0196,D2 96,,        SETB    T_CLK
0198,00,,        nop
0199,C2 95,,        CLR     T_RST
019B,00,,        nop
019C,DF E1,,        DJNZ    R7,SETLOOP
019E,C2 95,,        CLR     T_RST
01A0,00,,        nop
01A1,C2 96,,        CLR     T_CLK
01A3,00,,        nop
01A4,D2 95,,        SETB    T_RST
01A6,00,,        nop
01A7,75 F0 8E,,        MOV     B,#8EH
01AA,12 01 DE,,        LCALL   INPUTBYTE
01AD,75 F0 80,,        MOV     B,#80H          ;开写保护
01B0,12 01 DE,,        LCALL   INPUTBYTE
01B3,D2 96,,        SETB    T_CLK
01B5,00,,        nop
01B6,C2 95,,        CLR     T_RST
01B8,00,,        nop
01B9,22,,        RET
,,,;*****************************************************************
01BA,,GET1302,GET1302:                                                ;从DS1302读取时间
01BA,78 30,,        MOV     R0,#SECOND
01BC,79 81,,        MOV     R1,#81H        ;DS1302中读时间的首地址
01BE,7F 07,,        MOV     R7,#7
01C0,C2 95,GETLOOP,GETLOOP:CLR     T_RST
01C2,00,,        nop
01C3,C2 96,,        CLR     T_CLK
01C5,00,,        nop
01C6,D2 95,,        SETB    T_RST
01C8,00,,        nop
01C9,89 F0,,        MOV     B,R1
01CB,12 01 DE,,        LCALL   INPUTBYTE       ;写命令字
01CE,12 01 EF,,        LCALL   OUTPUTBYTE      ;读时间
01D1,F6,,        MOV     @R0,A           ;将从DS1302中读取的时间从内存中保存
01D2,08,,        INC     R0              ;修改地址指针
01D3,09,,        INC     R1
01D4,09,,        INC     R1
01D5,D2 96,,        SETB    T_CLK
01D7,00,,        nop
01D8,C2 95,,        CLR     T_RST
01DA,00,,        nop
01DB,DF E3,,        DJNZ    R7,GETLOOP
01DD,22,,        RET
,,,
,,,;*****************************************************************
01DE,7C 08,INPUTBYTE,INPUTBYTE:MOV     R4,#8                   ;向DS1302写一个字节
01E0,E5 F0,INPUTLOOP,INPUTLOOP:MOV     A,B
01E2,13,,        RRC     A
01E3,F5 F0,,        MOV     B,A
01E5,92 97,,        MOV     T_IO,C
01E7,D2 96,,        SETB    T_CLK
01E9,00,,        NOP
01EA,C2 96,,        CLR     T_CLK
01EC,DC F2,,        DJNZ    R4,INPUTLOOP
01EE,22,,        RET
,,,;*****************************************************************
,,,
01EF,E4,OUTPUTBYTE,OUTPUTBYTE:clr     a                      ;从DS1302读一个字节
01F0,C3,,        clr     c
01F1,7C 08,,        MOV     R4,#8
01F3,00,OUTPUTLOOP,OUTPUTLOOP:NOP
01F4,A2 97,,        MOV     C,T_IO
01F6,13,,        RRC     A
01F7,D2 96,,        SETB    T_CLK
01F9,00,,        NOP
01FA,C2 96,,        CLR     T_CLK
01FC,DC F5,,        DJNZ    R4,OUTPUTLOOP
01FE,22,,        RET
,,,
,,,;*****************************************************************
01FF,12 02 4E,LCD_INIT,LCD_INIT:       LCALL TIM1           ;LCD初始化子程序
0202,7A 38,,        MOV   R2,#38H        ;功能设置命令,设定8位字长,2行,5*7点阵
0204,12 02 34,,        LCALL WRTC           ;写入
0207,12 02 5E,,        LCALL TIM3           ;延时100us
020A,7A 38,,        MOV   R2,#38H
020C,12 02 34,,        LCALL WRTC           ;写入
020F,12 02 5E,,        LCALL TIM3           ;延时100us
0212,7A 38,,        MOV   R2,#38H
0214,12 02 34,,        LCALL WRTC           ;写入
0217,12 02 5E,,        LCALL TIM3           ;延时100us
021A,7A 01,,        MOV   R2,#01H        ;清屏命令
021C,12 02 34,,        LCALL WRTC           ;写入
021F,7A 06,,        MOV   R2,#06H        ;输入方式命令
0221,12 02 34,,        LCALL WRTC           ;写入
0224,7A 0E,,        MOV   R2,#0EH        ;开显示、光标不闪命令
0226,12 02 34,,        LCALL WRTC           ;写入
0229,22,,        RET
,,,;*****************************************************************
022A,75 A0 7F,WAIT,WAIT:   MOV  P2,#7FH     ;忙标志判断子程序
022D,78 F1,,        MOV  R0,#0F1H            ;读忙标志地址
022F,E2,,        MOVX A,@R0
0230,20 E7 F7,,        JB   ACC.7,WAIT
0233,22,,        RET
,,,
,,,;*****************************************************************
0234,12 02 2A,WRTC,WRTC:   LCALL WAIT          ;写指令代码子程序
0237,EA,,        MOV   A,R2
0238,78 F0,,        MOV   R0,#0F0H      ;写指令地址
023A,F2,,        MOVX  @R0,A
023B,22,,        RET
,,,
,,,;*****************************************************************
023C,12 02 2A,WRTD,WRTD:   LCALL WAIT          ;写数据子程序
023F,78 F2,,        MOV   R0,#0F2H      ;写数据地址
0241,EA,,        MOV   A,R2
0242,F2,,        MOVX  @R0,A
0243,22,,        RET
,,,;*****************************************************************
0244,E4,WP1,WP1:    CLR   A
0245,93,,        MOVC  A,@A+DPTR
0246,FA,,        MOV   R2,A
0247,12 02 3C,,        LCALL WRTD           ;写入1字节字模数据
024A,A3,,        INC   DPTR
024B,DC F7,,        DJNZ  R4,WP1
024D,22,,        RET
,,,
,,,;*****************************************************************
024E,7D 03,TIM1,TIM1:   MOV   R5,#03H     ;延时15ms子程序
0250,12 02 56,TT1,TT1:    LCALL TIM2
0253,DD FB,,        DJNZ  R5,TT1
0255,22,,        RET
,,,;*****************************************************************
0256,7C 32,TIM2,TIM2:   MOV   R4,#50      ;延时5ms子程序
0258,12 02 5E,TT2,TT2:    LCALL TIM3
025B,DC FB,,        DJNZ  R4,TT2
025D,22,,        RET
,,,;*****************************************************************
025E,7B 32,TIM3,TIM3:   MOV   R3,#50      ;延时100us子程序
0260,DB FE,TT3,TT3:    DJNZ  R3,TT3
0262,22,,        RET
,,,
000E,,,end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -