• 基于51单片机万年历设计 > 单片机万年历
  • 单片机万年历

    免费下载 下载该文档 文档格式:PDF   更新时间:2014-03-01   下载次数:0   点击次数:1
    第三届 电子设计大赛参赛作品资料
    作品名称
    单片机万年历
    作者
    机与信息工程系
    电测 0510 刘锦钫
    1
    1.功能介绍
    此万年历是根据时钟芯片 DS1302 和温度传感器 DS18B20 而设计。可以显示 2000 年到 2099 年的日期、时间,在断电后由板上电池供电,确保断电后时钟芯片 能继续工作,同时也可以通过按键调整时间。通过读出温度传感器的数据,可以 显示 0~99 摄氏度的温度,精 为 1 摄氏度,误差为+/-0.5 摄氏度。
    2.流程图
    程序开始
    定义管脚和寄存器
    设置定时初值和 寄存器初值
    初始化时钟芯片
    读时钟芯片
    温度芯片复位及读出数据
    更新农历 更新星期
    显示
    判键
    2
    3.元件功能图
    (1).温度传感器 DQ 为数字信号输入/输出端; GND 为电源地;VDD 为外接供电电源输入端(在寄生电源 接线方式时接地)。每一次读写之前都要对 DS18B20 进行复位,复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操作。复 位要求主 CPU 将数据线下拉 500 微秒,然后释放, DS18B20 收到信号后等待 16~60 微秒左右,后发出 60~240 微秒的存在低脉冲,主 CPU 收到此信号表示 复位成功。
    (2). DS1302 是一种高性能、低功耗、带 RAM 的实时时钟电路,它可以对年、月、 日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为 2.5V~5.5V。 与 CPU 的连接需要三 ,即 SCLK(7)、I/O(6)、RST(5)。在控制指令字输入后 的下一个 SCLK 时钟的上升沿时, 数据被写入 DS1302, 数据输入从低 位即位 0 开始。同样,在紧跟 8 位 的控制指令字后的下一个 SCLK 脉 冲的下降沿读出 DS1302 的数据, 读出数据时从低位 0 位到高位 7。
    4.按键功能
    KEY1 KEY2 KEY3 选位 加1 减1
    5.电路原理图
    3
    6.电路程序
    T_CLK Bit T_IO Bit T_RST Bit dat msb lsb Bit equ equ P1.4 P1.5 P1.6 p1.7 5ch 5dh ;时钟线引脚 ;数据线引脚 ;复位线引脚 ;18B20 的数据端口 ;温度高八位 ;温度低八位 org ajmp Second Minute start_year equ equ equ 50h 51h 01 0000h main ;定时器 T0 入口 ;定时器 T1 入口 temp_Byte3 temp_Byte4 temp_Byte5 time_week DATA 39h DATA 3Ah DATA 3Bh DATA 40h ;星期天
    org 000bh ljmp lt0 org 001bh ljmp lt1
    time_year time_month time_date
    DATA 56h DATA 54h DATA 53h
    ;公历日期 main:
    org
    0050h
    setb dat mov mov sp,#60h lsb,#0 msb,#0 ;传感器低字节 ;传感器高字节
    CONvert_yeAr
    DATA 30h
    ;转换后农历日期
    mov
    CONvert_mONth DATA 31h CONvert_dAte DATA 32h mov mov temp_Byte1 temp_Byte2 DATA 37h DATA 38h 50MS mov th0,#3ch tmod,#11h ;置定时器工作方式 1 tl0,#0b0h ;置定时器 T0 初值,约
    4
    mov mov setb setb setb mov mov
    tl1,#0b0h ;置定时器 T1 初值 th1,#03ch ea et0 et1 r2,#0ah r3,#0c8h ;启动中断总允许 ;启动定时器 T0 ;启动定时器 T1 ;反复 10 次中断,时间 0.5S ;反复 200 中断,时间 10S ; 秒 ; 分 ; 时 ; 日 ; 月 ; 周 ; 年 jia0:
    lcall BCDH jnb p3.3,jia0 jnb p3.4,jian0 jnb p3.2,aj1 sjmp j0 jnb p3.3,jia0 mov r3,#0c8h inc a
    mov mov mov mov mov mov mov
    50h,#30h 51h,#30h 52h,#12h 53h,#28h 54h,#05h 55h,#01h 56h,#07h
    cjne a,#3ch,zbcd0 mov a,#00h sjmp zbcd0 jian0: jnb p3.4,jian0 mov r3,#0c8h dec a cjne a,#0ffh,zbcd0 mov a,#3bh
    mov mov mov mov
    4ah,#01h 4bh,#01h 4ch,#01h 4dh,#01h
    ;调整分钟闪烁标志 ;调整小时闪烁标志 ;调整日闪烁标志 ;调整月闪烁标志
    zbcd0: lcall HBCD mov 51h,a sjmp j0 l00: ljmp loop1
    ;lcall set1302 ;调用时钟芯片初始化程序 loop: Lcall Get1302 Lcall xian Lcall ds1820 读温度程序 Lcall xian Lcall CONvert Lcall xian lcall GetWeek Lcall xian jnb ajmp p3.2,aj0 loop 调 整 分 钟 程 序 ;判键 ;调用更新星期程序 ;调用更新农历程序 ;调用读时钟芯片程序 ;调用显示程序 ;调用温度初始化及
    ;*************调整时程序******************* aj1: jnb p3.2,aj1 mov 4ah,#01h mov r1,#4bh mov r3,#0c8h setb tr0 setb tr1 j1: lcall xian jbc 00h,l01 mov a,52h lcall BCDH jnb p3.3,jia1 jnb p3.4,jian1 ;时调整
    ;*************
    jnb p3.2,aj2 sjmp j1 jia1: jnb p3.3,jia1 mov r3,#0c8h inc a cjne a,#24,zbcd1 mov a,#00h
    ******************** aj0: jnb p3.2,aj0 mov r1,#4ah mov r3,#0c8h setb tr0 setb tr1 j0: lcall xian jbc 00h,l00 mov a,51h ;分调整
    sjmp zbcd1 jian1: jnb p3.4,jian1 mov r3,#0c8h
    5
    dec a cjne a,#0ffh,zbcd1 mov a,#17h zbcd1: lcall HBCD mov 52h,a sjmp j1 l01: ljmp loop1 ;*************调整日程序******************* aj2: jnb p3.2,aj2 mov 4bh,#01h mov r1,#4ch mov r3,#0c8h setb tr0 setb tr1 j2: lcall xian jbc 00h,l02 mov a,53h lcall BCDH jnb p3.3,jia2 jnb p3.4,jian2 jnb p3.2,aj3 sjmp j2 jia2: jnb p3.3,jia2 mov r3,#0c8h inc a cjne a,#32,zbcd2 mov a,#01h sjmp zbcd2 jian2: jnb p3.4,jian2 mov r3,#0c8h dec a cjne a,#00h,zbcd2 mov a,#1f h zbcd2: lcall HBCD mov 53h,a sjmp j2 l02: ljmp loop1 ;*************调整月程序******************* aj3: jnb p3.2,aj3 mov 4ch,#01h mov r1,#4dh mov r3,#0c8h setb tr0 setb tr1 ;日调整
    j3:
    lcall xian jbc 00h,l03 mov a,54h lcall BCDH jnb p3.3,jia3 jnb p3.4,jian3 jnb p3.2,aj5 sjmp j3
    ;月调整
    jia3:
    jnb p3.3,jia3 mov r3,#0c8h inc a cjne a,#13,zbcd3 mov a,#01h sjmp zbcd3
    jian3: jnb p3.4,jian3 mov r3,#0c8h dec a cjne a,#00h,zbcd3 mov a,#0ch zbcd3: lcall HBCD mov 54h,a sjmp j3 l03: ljmp loop1 ;改 DS1302 并返回
    aj5: LOOP
    jnb p3.2,aj5
    Lcall Set1302 loop1: mov mov mov mov 4ah,#01h 4bh,#01h 4ch,#01h 4dh,#01h ;按键跳出初始化标志
    clr tr0 clr tr1 ljmp loop
    ;按键跳出关中断
    ;******************************* * ;数码管显示子程序 xian: mov dptr,#tab1 mov r0,#50h mov a,@r0 anl a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#0f3h ;秒个位
    6
    call D1MS
    anl
    a,#00001111b
    movc a,@a+dptr mov a,@r0 swap a anl a,#00001111b mov p0,a mov p2,#0f7h call D1MS ;时十位
    movc a,@a+dptr mov p0,a mov p2,#0f2h call D1MS ;秒十位 zri: mov r6,4ch cjne r6,#01h,zyue mov r0,#53h mov dptr,#tab1 mov r6,4ah cjne r6,#01h,zshi mov r0,#51h mov dptr,#tab1 mov a,@r0 anl a,#00001111b mov a,@r0 anl a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#6fh call D1MS ;日个位
    movc a,@a+dptr mov p0,a mov p2,#0f5h call D1MS ;分个位 mov dptr,#tab1 mov a,@r0 swap a anl mov dptr,#tab1 mov a,@r0 swap a anl a,#00001111b a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#5fh call D1MS ;日十位
    movc a,@a+dptr mov p0,a mov p2,#0f4h call D1MS ;分钟十位 zyue:mov r6,4dh cjne r6,#01h,zhou mov r0,#54h mov dptr,#tab1 zshi: mov r6,4bh cjne r6,#01h,zri mov r0,#52h mov dptr,#tab1 mov a,@r0 anl a,#00001111b mov a,@r0 anl a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#8fh call D1MS ;月个位
    movc a,@a+dptr mov p0,a mov p2,#0f6h call D1MS ;时个位 mov dptr,#tab1 mov a,@r0 swap a anl mov dptr,#tab1 mov a,@r0 swap a a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#7fh ;月十位
    7
    call D1MS ;农历显示 zhou: mov a,40h cjne a,#00h,tiao mov a,#08h tiao:movc a,@a+dptr mov p0,a mov p2,#4fh call D1MS mov p2,#9fh mov dptr,#tab1 mov a,@r0 mov r0,#56h mov a,@r0 anl a,#00001111b swap a anl a,#00001111b ;周 mov r0,#32h mov dptr,#tab1 mov a,@r0 anl a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#3fh call D1MS ;农历日个位
    movc a,@a+dptr mov p0,a ;年个位 mov p2,#2fh call D1MS ;农历日十位
    movc a,@a+dptr mov p0,a clr p1.0 call D1MS setb p1.0
    mov r0,#31h mov dptr,#tab1
    mov a,@r0 swap a anl a,#00001111b
    mov a,@r0 anl a,#00001111b
    movc a,@a+dptr mov p0,a ;年十位 mov p2,#1fh call D1MS ;农历月个位
    movc a,@a+dptr mov p0,a clr p1.3 call D1MS setb p1.3
    mov dptr,#tab1 mov a,@r0
    mov a,#00h movc a,@a+dptr mov p0,a clr p1.2 call D1MS setb p1.2 ;年百位
    swap a anl a,#00001111b
    movc a,@a+dptr mov p0,a mov p2,#0fh call D1MS 温度显示子程序 mov a,59h ;农历月十位
    mov a,#02h movc a,@a+dptr mov p0,a clr p1.1 call D1MS setb p1.1 ;年千位
    ;
    MOVC A,@A+DPTR mov p0,a mov p2,#0f0h lcall D1MS ;开温度个位 ;显示 1ms
    8
    MOV mov a,5ah ;取十位数 护
    B,
    #80H
    ;控制,WP=1,写保
    MOVC A,@A+DPTR mov p0,a mov p2,#0f1h lcall D1MS mov p2,#9fh ret ;开温度十位
    LCALL RTInputByte SETB CLR RET ;******************************************* ** ;子程序名:Get1302 能:从 DS1302 读时间 明: 用:RTInputByte,RTOutputByte 入 口 参 数 : 时 间 保 存 T_CLK T_RST
    ;***************************************** Set1302: CLR CLR SETB MOV T_RST T_CLK T_RST B, #8EH ;控制寄存器
    ;功 ;说 ;调 ;
    在:Second,Minute,Hour,Day,Month,Week.YearL ;出口参数:无
    LCALL RTInputByte MOV WP=0 LCALL RTInputByte SETB CLR MOV MOV 时 日 月 星期 年 MOV S13021: CLR CLR SETB MOV 日 月 星期 年 地址 LCALL RTInputByte MOV MOV A, B, @R0 A ;写秒数据 R1, T_RST T_CLK T_RST B, R1 ;写秒 分 时 #80H ;秒写地址 T_CLK T_RST R0, R7, #Second; #7 ;秒 分 B, #00H ;写操作前
    ;影响资源:A B R0 R1 R4 R7 ;设 计:zhaojunjie
    ;******************************************* **** Get1302: MOV MOV MOV G13021: CLR CLR SETB MOV 日 月 星期 年 地址 LCALL RTInputByte LCALL RTOutputByte MOV INC INC INC SETB CLR DJNZ RET ;******************************************* @R0, R0 R1 R1 T_CLK T_RST R7, G13021 A ;秒 R0, R7, R1, T_RST T_CLK T_RST B, R1 ;秒 分 时 #Second; #7 #81H ;秒地址
    LCALL RTInputByte INC INC INC SETB CLR DJNZ CLR CLR SETB MOV R0 R1 R1 T_CLK T_RST R7, T_RST T_CLK T_RST B, #8EH ;控制寄存器 S13021
    ****** ;功 能:写 1302 一字节 (内部子程序)
    ;******************************************* *** RTInputByte: MOV R4, #8
    LCALL RTInputByte
    9
    Inbit1:
    MOV RRC MOV MOV SETB CLR DJNZ RET
    A, A B, T_IO,
    B
    ret ;====================================== A C ===================== ;码转换 shaomiao: mov a,lsb anl a,#00001111b mov dptr,#tab2 movc a,@a+dptr 数变成十进制 ;查表,十六进制小 ;低字节送累加器 ;保留小数部分
    T_CLK T_CLK R4, Inbit1
    ;******************************************* *** ;功 能:读 1302 一字节 (内部子程序)
    mov 57h,a 小数位 57h mov a,lsb anl a,#0f0h
    ;送显示
    ======
    ;******************************************* ***** RTOutputByte: MOV Outbit1: MOV RRC SETB CLR DJNZ RET ;====================================== ===== ds1820: call init ; 初 始 化 R4, C, A T_CLK T_CLK R4, Outbit1 #8 T_IO
    ;低字节送累加器 ;去掉小数位 ;交换高低 4 位 ;送个位数 ;高字节送累加器 ;去除高 5 位 ;交换高低 4 位 ;组成完整字节 ;除数 ;除以 100 得到百位 ;送显示
    swap a mov 5bh,a mov a,msb anl a,#07h swap a orl a,5bh mov b,#100 div ab mov 58h,a ============百位 58h mov a,#10 xch a,b div ab 个位 A 是商,B 是余数
    ;除数 ;交换 ab ;除以 10 得到十位和 ;送显示 ;送显示
    =========================== mov a,#0cch call write mov a,#44h call write call shaomiao call init = mov a,#0cch call write mov a,#0beh call write call read mov lsb,a LSB call read mov msb,a MSB ;从传感器读温度 ;温度值高位字节送 ;温度值低位字节送 ;============================ ;跳过 rom 命令的指令代码 ;发跳过 rom 命令 ;启动转换命令的指令代码 ;发启动转换命令
    mov 59h,a ==========十位 59h mov 5ah,b ==========个位 5ah ret
    ;====================================== ============================= ;初始化子程序 INIT: SETB DAT MOV R7,#200 INI11:CLR DAT DJNZ R7,INI11 持续 3μs×200=600μs SETB DAT 改为输入 MOV R7,#30 ;主机释放总线, ;主机发复位脉冲 ;总线恢复 ;循环次数
    10
    DJNZ R7,$ μs×30=60μs CLR C ORL C,DAT 变低(存在脉冲)吗? JC INIT 好,重新初始化 MOV R7,#80 INI13:ORL C,DAT JC INI14 变高,初始化成功 DJNZ R7,INI13 持续 3μs×80=240μs SJMP INIt INI14:MOV R7,#240 DJNZ R7,$ 少 2μs×240=480μs RET
    ;DS18B20 等待 2
    SETB DAT DJNZ R6,$
    ; 设为输入 ;等待 8μs ;主机按位依次读入
    ;初始状态 ;DS18B20 数据线 ;DS18B20 未准备
    MOV C,DAT DS18B20 的数据 RRC A MOV R6,#25 DJNZ R6,$ 60μs DJNZ R7,RD11
    ;读取的数据移入 A
    ;保证读过程持续
    ;读完一个字节的数
    ;DS18B20 数据线
    据,存入 A 中 SETB DAT ;恢复
    ;数据线低电平可
    RET ;*******************************************
    ;初始化失败,重来 ;DS18B20 应答最
    **************** ;5 毫秒延时子程序 delay5ms:mov r5,#10 delay: mov r4,#80 djnz r4,$ djnz r5,delay ret ;******************************************* ;r5,r4 的值不可以变!! !
    ;====================================== ============================== ;写传感器 18B20 子程序 WRITE:MOV R7,#8 WR11:SETB DAT MOV R6,#8 RRC A 中移到 CY CLR DAT DJNZ R6,$ MOV DAT,C 次送给 DS18B20 MOV R6,#20 DJNZ R6,$ 持续 60μs DJNZ R7,WR11 字节继续 SETB DAT RET ;====================================== =============================== ;读传感器子程序 READ:MOV R7,#8 RD11:CLR DAT nop MOV R6,#4 ;低电平持续 2μs ;循环 8 次, 读一个字节 CON_02: ;恢复 表定位 ;未送完一个 ;保证写过程 ;等待 16μs ;命令字按位依 ;写入位从 A ;循环 8 次, 写一个字节
    **************** ;以下为公历转农历子程序 CONvert: MOV A,time_year ;将年月日转化为 HEX 格式 MOV B,#16 DIV AB MOV CONvert_yeAr,B MOV B,#10 MUL AB ADD A,CONvert_yeAr MOV CONvert_yeAr,A MOV A,time_month MOV C,ACC.7 MOV f0,C ;f0 暂存世纪标志,仅用于数据
    CLR ACC.7 JNB ACC.4,CON_02 CLR ACC.4 ;ACC.4 为 1 表示大于 10 月 ADD A,#10 MOV CONvert_mONth,A MOV A,time_date MOV B,#16 DIV AB
    11
    MOV CONvert_dAte,B MOV B,#10 MUL AB ADD A,CONvert_dAte MOV CONvert_dAte,A MOV dptr,#mONth_dAtA ;以下定位本年 数据在表格中的位置 MOV A,CONvert_yeAr JB f0,CON_06 ;当前为 19 世纪年跳转 ADD A,#100 ;从 19 世纪起定义表格起 始年,20 世纪要加 100 年 CON_06: CLR C SUBB A,#stArt_yeAr MOV B,#3 ;表格每年 3 字节 MUL AB ADD A,dpl MOV dpl,A MOV A,B ADDC A,dph MOV dph,A MOV A,#2 MOVC A,@A+dptr ;读本年表格最后一 字节(春节日期) CLR ACC.7 ;ACC.7 是闰年第 13 个月 大小,在此不用 MOV B,#32 DIV AB MOV temp_Byte1,A ;春节月份 MOV temp_Byte2,B ;春节日 ; 以下 当前日期距元旦天数 MOV temp_Byte3,#0 ;设距元旦天数高位 为0 MOV A,CONvert_mONth CJNE A,#10,CON_08 CON_08: JC CON_09 ;9 月以前日子数小于 256 天,高字节为 0 MOV temp_Byte3,#1 CON_09: MOV A,CONvert_yeAr ANL A,#03h ;ACC 为除 4 的余数 JNZ CON_10 ;转常年处理 ; 年除 4 余数为 0 是闰年 MOV A,CONvert_mONth LCALL get_ruN_dAys_lOw ;取得闰年过 去月的天数的低字节 CON_26:
    SJMP CON_12 CON_10: MOV A,CONvert_mONth LCALL get_dAys_lOw ;取得常年过去月 的天数的低字节 CON_12: MOV B,CONvert_dAte DEC B ;因为日期从 1 日起,而不是 0 日起 ADD A,B ;过去的整月天数加当月天数 MOV temp_Byte4,A JNC CON_14 INC temp_Byte3 ;temp_Byte3,temp_Byte4 分 别 为 公 历 年过去的天数的高低字节 ; 以下求春节距元旦天数,因肯定小于 256 天所以 只用一字节表示 CON_14: MOV A,temp_Byte1 LCALL get_dAys_lOw ;春节不会在 3 月 份,不用考虑闰年 DEC A ;因为日期从 1 日起 ADD A,temp_Byte2 MOV temp_Byte5,A ;temp_Byte5,为春节 距元旦天数 MOV A,CONvert_mONth CJNE A,temp_Byte1,CON_20 ;转换月与 春节月比较 MOV A,CONvert_dAte CJNE A,temp_Byte2,CON_20 ;转换日与 春节日比较 CON_20: JC CON_22 LJMP CON_60 ;当前日大于等于春节日 期,公历年与农历年同年份 CON_22: MOV A,CONvert_yeAr ;不到春节,农历 年比公历年低一年 JNZ CON_24 MOV A,#100 ;年有效数 0-99 CON_24: DEC A MOV CONvert_yeAr,A MOV A,dpl CLR C SUBB A,#3 MOV dpl,A JNC CON_26 DEC dph ;表格指针指向上一年 MOV A,temp_Byte5 CLR C
    12
    SUBB A,temp_Byte4 MOV temp_Byte3,A ;temp_Byte3 中为当 前日离春节的天数 MOV CONvert_mONth,#12 ;农历月为 12 月 CLR f0 ;1901-2099 年没有闰 12 月,清闰 月标志 CLR A MOVC A,@A+dptr ANL A,#0f0h SWAP A; MOV temp_Byte4,A ;temp_Byte4 中为闰月 JZ CON_30 ;没有闰月转移 MOV A,#2 ;有闰月,取第 13 个月天数 MOVC A,@A+dptr MOV C,ACC.7 MOV A,#1 MOVC A,@A+dptr RLC A ;ACC 中为最后 6 个月的大小值 SJMP CON_34 CON_30: MOV A,#1 MOVC A,@A+dptr ;ACC 中为最后 6 个 月的大小值 CON_34: CON_40: MOV temp_Byte5,A MOV A,temp_Byte5 RRC A MOV temp_Byte5,A JC CON_42 MOV B,#29 ;小月 29 天 SJMP CON_44 CON_42: CON_44: MOV B,#30 ;大月 30 天 MOV A,temp_Byte3 CLR C SUBB A,B JZ CON_46 ; 够减,就是农历日 1 日 JNC CON_50 ;不够减一月天数,结束农历月调整 CPL A ;求补取绝对值 INC A CON_46: INC A ;加 1 即为农历日 MOV B,#10 ;转换并保存农历日,月,年 DIV AB SWAP A ORL A,B MOV CONvert_dAte,A 志 CON_54: 减 CON_50:
    MOV A,CONvert_mONth MOV B,#10 DIV AB SWAP A ORL A,B MOV C,f0 MOV ACC.7,C MOV CONvert_mONth,A MOV A,CONvert_yeAr MOV B,#10 DIV AB SWAP A ORL A,B MOV CONvert_yeAr,A RET ;结束转换 MOV temp_Byte3,A ;temp_Byte3 存减 去一月后的天数 JB f0,CON_52 ;是闰月,前推一月,月份不
    DEC CONvert_mONth; CON_52: MOV A,CONvert_mONth CJNE A,temp_Byte4,CON_54 CPL f0 ;当前月与闰月相同,更改闰月标
    SJMP CON_40
    CON_60: MOV A,temp_Byte4 ;春节日小于当前日, 农历年同公历年 CLR C SUBB A,temp_Byte5 MOV temp_Byte4,A JNC CON_62 DEC temp_Byte3 ;temp_Byte3 temp_Byte4 中为公历日离春节的天数 CON_62: 月 CLR A MOVC A,@A+dptr MOV temp_Byte5,A ANL A,#0f0h SWAP A; XCH A,temp_Byte5 CLR f0 ;第一个月肯定不是闰月 ANL A,#0fh MOV temp_Byte1,A MOV CONvert_mONth,#1 ;农历月为 1
    13
    MOV A,#1 MOVC A,@A+dptr MOV temp_Byte2,A ANL A,#0f0h ORL A,temp_Byte1 SWAP A MOV temp_Byte1,A MOV A,#2 MOVC A,@A+dptr MOV C,ACC.7 MOV A,temp_Byte2 ANL A,#0fh SWAP A MOV ACC.3,C; MOV temp_Byte2,A CON_70: MOV A,temp_Byte2 RLC A MOV temp_Byte2,A MOV A,temp_Byte1 RLC A MOV temp_Byte1,A JC CON_72 MOV B,#29 ;小月 29 天处理 SJMP CON_74 CON_72: CON_74: MOV B,#30 ;大月 30 天 MOV A,temp_Byte4 CLR C SUBB A,B JNC CON_78 ;低字节够减跳转 MOV B,A ;低字节不够减, B 暂存减后结果, MOV A,temp_Byte3 JZ CON_76 ;高字节为 0,不够减 DEC temp_Byte3 MOV temp_Byte4,B SJMP CON_80 CON_76: MOV A,temp_Byte4 ;不够减结束月调整 LJMP CON_46 ;转日期加 1 后,处理并保 存转换后农历年月日 CON_78: MOV temp_Byte4,A ;temp_Byte3 temp_Byte4 天数为减去一月后天数 CON_80: MOV A,CONvert_mONth CJNE A,temp_Byte5,CON_82 CPL f0 标志 ;当前月与闰月相同,更改闰月 月份加 1
    JNB f0,CON_82 ;更改标志后是非闰月,
    SJMP CON_70 CON_82: INC CONvert_mONth; SJMP CON_70 get_dAys_lOw:MOVC A,@A+PC ;取得常年过去月 的天数的低字节 RET DB 0,31,59,90,120,151,181,212,243,17,48,78 get_ruN_dAys_lOw:MOVC A,@A+PC ;取得闰年过 去月的天数的低字节 RET DB 0,31,60,91,121,152,182,213,244,18,49,79 mONth_dAtA: ;公历年对应的农历数据 DB 004h,0Aeh,053h; 1901; DB 00Ah,057h,048h; 1902 DB 055h,026h,0Bdh; 1903 DB 00dh,026h,050h; 1904 DB 00dh,095h,044h; 1905 DB 046h,0AAh,0B9h; 1906 DB 005h,06Ah,04dh; 1907 DB 009h,0Adh,042h; 1908 DB 024h,0Aeh,0B6h; 1909 DB 004h,0Aeh,04Ah; 1910 DB 06Ah,04dh,0Beh; 1911 DB 00Ah,04dh,052h; 1912 DB 00dh,025h,046h; 1913 DB 05dh,052h,0BAh; 1914 DB 00Bh,054h,04eh; 1915 DB 00dh,06Ah,043h; 1916 DB 029h,06dh,037h; 1917 DB 009h,05Bh,04Bh; 1918 DB 074h,09Bh,0C1h; 1919 DB 004h,097h,054h; 1920 DB 00Ah,04Bh,048h; 1921 DB 05Bh,025h,0BCh; 1922 DB 006h,0A5h,050h; 1923 DB 006h,0d4h,045h; 1924 DB 04Ah,0dAh,0B8h; 1925 DB 002h,0B6h,04dh; 1926 DB 009h,057h,042h; 1927
    14
    DB 024h,097h,0B7h; 1928 DB 004h,097h,04Ah; 1929 DB 066h,04Bh,03eh; 1930 DB 00dh,04Ah,051h; 1931 DB 00eh,0A5h,046h; 1932 DB 056h,0d4h,0BAh; 1933 DB 005h,0Adh,04eh; 1934 DB 002h,0B6h,044h; 1935 DB 039h,037h,038h; 1936 DB 009h,02eh,04Bh; 1937 DB 07Ch,096h,0Bfh; 1938 DB 00Ch,095h,053h; 1939 DB 00dh,04Ah,048h; 1940 DB 06dh,0A5h,03Bh; 1941 DB 00Bh,055h,04fh; 1942 DB 005h,06Ah,045h; 1943 DB 04Ah,0Adh,0B9h; 1944 DB 002h,05dh,04dh; 1945 DB 009h,02dh,042h; 1946 DB 02Ch,095h,0B6h; 1947 DB 00Ah,095h,04Ah; 1948 DB 07Bh,04Ah,0Bdh; 1949 DB 006h,0CAh,051h; 1950 DB 00Bh,055h,046h; 1951 DB 055h,05Ah,0BBh; 1952 DB 004h,0dAh,04eh; 1953 DB 00Ah,05Bh,043h; 1954 DB 035h,02Bh,0B8h; 1955 DB 005h,02Bh,04Ch; 1956 DB 08Ah,095h,03fh; 1957 DB 00eh,095h,052h; 1958 DB 006h,0AAh,048h; 1959 DB 07Ah,0d5h,03Ch; 1960 DB 00Ah,0B5h,04fh; 1961 DB 004h,0B6h,045h; 1962 DB 04Ah,057h,039h; 1963 DB 00Ah,057h,04dh; 1964 DB 005h,026h,042h; 1965 DB 03eh,093h,035h; 1966 DB 00dh,095h,049h; 1967 DB 075h,0AAh,0Beh; 1968 DB 005h,06Ah,051h; 1969 DB 009h,06dh,046h; 1970 DB 054h,0Aeh,0BBh; 1971
    DB 004h,0Adh,04fh; 1972 DB 00Ah,04dh,043h; 1973 DB 04dh,026h,0B7h; 1974 DB 00dh,025h,04Bh; 1975 DB 08dh,052h,0Bfh; 1976 DB 00Bh,054h,052h; 1977 DB 00Bh,06Ah,047h; 1978 DB 069h,06dh,03Ch; 1979 DB 009h,05Bh,050h; 1980 DB 004h,09Bh,045h; 1981 DB 04Ah,04Bh,0B9h; 1982 DB 00Ah,04Bh,04dh; 1983 DB 0ABh,025h,0C2h; 1984 DB 006h,0A5h,054h; 1985 DB 006h,0d4h,049h; 1986 DB 06Ah,0dAh,03dh; 1987 DB 00Ah,0B6h,051h; 1988 DB 009h,037h,046h; 1989 DB 054h,097h,0BBh; 1990 DB 004h,097h,04fh; 1991 DB 006h,04Bh,044h; 1992 DB 036h,0A5h,037h; 1993 DB 00eh,0A5h,04Ah; 1994 DB 086h,0B2h,0Bfh; 1995 DB 005h,0ACh,053h; 1996 DB 00Ah,0B6h,047h; 1997 DB 059h,036h,0BCh; 1998 DB 009h,02eh,050h; 1999 DB 00Ch,096h,045h; 2000 DB 04dh,04Ah,0B8h; 2001 DB 00dh,04Ah,04Ch; 2002 DB 00dh,0A5h,041h; 2003 DB 025h,0AAh,0B6h; 2004 DB 005h,06Ah,049h; 2005 DB 07Ah,0Adh,0Bdh; 2006 DB 002h,05dh,052h; 2007 DB 009h,02dh,047h; 2008 DB 05Ch,095h,0BAh; 2009 DB 00Ah,095h,04eh; 2010 DB 00Bh,04Ah,043h; 2011 DB 04Bh,055h,037h; 2012 DB 00Ah,0d5h,04Ah; 2013 DB 095h,05Ah,0Bfh; 2014 DB 004h,0BAh,053h; 2015
    15
    DB 00Ah,05Bh,048h; 2016 DB 065h,02Bh,0BCh; 2017 DB 005h,02Bh,050h; 2018 DB 00Ah,093h,045h; 2019 DB 047h,04Ah,0B9h; 2020 DB 006h,0AAh,04Ch; 2021 DB 00Ah,0d5h,041h; 2022 DB 024h,0dAh,0B6h; 2023 DB 004h,0B6h,04Ah; 2024 DB 069h,057h,03dh; 2025 DB 00Ah,04eh,051h; 2026 DB 00dh,026h,046h; 2027 DB 05eh,093h,03Ah; 2028 DB 00dh,053h,04dh; 2029 DB 005h,0AAh,043h; 2030 DB 036h,0B5h,037h; 2031 DB 009h,06dh,04Bh; 2032 DB 0B4h,0Aeh,0Bfh; 2033 DB 004h,0Adh,053h; 2034 DB 00Ah,04dh,048h; 2035 DB 06dh,025h,0BCh; 2036 DB 00dh,025h,04fh; 2037 DB 00dh,052h,044h; 2038 DB 05dh,0AAh,038h; 2039 DB 00Bh,05Ah,04Ch; 2040 DB 005h,06dh,041h; 2041 DB 024h,0Adh,0B6h; 2042 DB 004h,09Bh,04Ah; 2043 DB 07Ah,04Bh,0Beh; 2044 DB 00Ah,04Bh,051h; 2045 DB 00Ah,0A5h,046h; 2046 DB 05Bh,052h,0BAh; 2047 DB 006h,0d2h,04eh; 2048 DB 00Ah,0dAh,042h; 2049 DB 035h,05Bh,037h; 2050 DB 009h,037h,04Bh; 2051 DB 084h,097h,0C1h; 2052 DB 004h,097h,053h; 2053 DB 006h,04Bh,048h; 2054 DB 066h,0A5h,03Ch; 2055 DB 00eh,0A5h,04fh; 2056 DB 006h,0B2h,044h; 2057 DB 04Ah,0B6h,038h; 2058 DB 00Ah,0Aeh,04Ch; 2059
    DB 009h,02eh,042h; 2060 DB 03Ch,097h,035h; 2061 DB 00Ch,096h,049h; 2062 DB 07dh,04Ah,0Bdh; 2063 DB 00dh,04Ah,051h; 2064 DB 00dh,0A5h,045h; 2065 DB 055h,0AAh,0BAh; 2066 DB 005h,06Ah,04eh; 2067 DB 00Ah,06dh,043h; 2068 DB 045h,02eh,0B7h; 2069 DB 005h,02dh,04Bh; 2070 DB 08Ah,095h,0Bfh; 2071 DB 00Ah,095h,053h; 2072 DB 00Bh,04Ah,047h; 2073 DB 06Bh,055h,03Bh; 2074 DB 00Ah,0d5h,04fh; 2075 DB 005h,05Ah,045h; 2076 DB 04Ah,05dh,038h; 2077 DB 00Ah,05Bh,04Ch; 2078 DB 005h,02Bh,042h; 2079 DB 03Ah,093h,0B6h; 2080 DB 006h,093h,049h; 2081 DB 077h,029h,0Bdh; 2082 DB 006h,0AAh,051h; 2083 DB 00Ah,0d5h,046h; 2084 DB 054h,0dAh,0BAh; 2085 DB 004h,0B6h,04eh; 2086 DB 00Ah,057h,043h; 2087 DB 045h,027h,038h; 2088 DB 00dh,026h,04Ah; 2089 DB 08eh,093h,03eh; 2090 DB 00dh,052h,052h; 2091 DB 00dh,0AAh,047h; 2092 DB 066h,0B5h,03Bh; 2093 DB 005h,06dh,04fh; 2094 DB 004h,0Aeh,045h; 2095 DB 04Ah,04eh,0B9h; 2096 DB 00Ah,04dh,04Ch; 2097 DB 00dh,015h,041h; 2098 DB 02dh,092h,0B5h; 2099 DB 00dh,053h,049h; 2100 ;以下子程序用于从当前公历日期,推算星期, GetWeek: MOV A,time_yeAr MOV B,#16
    16
    DIV AB MOV temp_Byte1,B MOV B,#10 MUL AB ADD A,temp_Byte1 MOV temp_Byte1,A ;temp_Byte1=年 MOV A,time_month JB ACC.7,getw02 MOV A,#100 ADD A,temp_Byte1 MOV temp_Byte1,A MOV A,time_month CLR ACC.7 getw02: JNB ACC.4,getw04 ADD A,#10 CLR ACC.4 getw04:MOV temp_Byte2,A ;temp_Byte2=月 MOV A,time_date MOV B,#16 DIV AB MOV temp_Byte3,B MOV B,#10 MUL AB ADD A,temp_Byte3 MOV temp_Byte3,A ;temp_Byte3=日 MOV A,temp_Byte1; ANL A,#03h JNZ getw10 MOV A,temp_Byte2 CJNE A,#3,getw06 getw06: JNC getw10 DEC temp_Byte3 闰年,日减 1 getw10: MOV A,temp_Byte2; LCALL get_CorreCt ADD A,temp_Byte1 MOV B,#7 DIV AB 除7 的 ;余数不先做这一步有可能 数据溢出 MOV A,temp_Byte1 ANL A,#0fCh ;B 放年加校 数之和后 D码 ;取月校正表数据 ;月大于 2 转移 ;份小于等于 2,又是 位 ;非闰年转移 整数***** BCDH: D1MS: ;20 世纪年+100
    RR A RR A ADD A,B ADD A,temp_Byte3 MOV B,#7 DIV AB MOV time_week,B RET get_COrreCt:MOVC A,@A+PC RET DB 0,3,3,6,1,4,6,2,5,0,3,5 ret ;以上年除 4 即闰年数
    MOV R7,#80 DJNZ R7,$ RET
    ;****单字节B 码整数转换成单字节十六进制
    MOV B,#10H ;分离十位个位 DIV AB MOV R6,B ;暂存个位
    MOV B,#10 ;将十位转换成十六进制 MUL AB ADD A,R6 RET ;****单字节十六进制整数转换成单字节B 码 整数***** HBCD: 中 DIV AB MOV R6,A MOV A,#10 ;余数继续分离十位和个 MOV B,#100 ;分离出百位,存放在 R6 ;按十六进制加上个位
    XCH
    A,B
    DIV AB SWAP A ORL A,B ;将十位和个位拼装成BC
    RET ;**********定时器 T0 处理程序*************** lt0: push a push psw mov tl0,#0b0h mov th0,#3ch
    17
    djnz r3,goret0 mov r3,#0c8h clr tr0 setb 00h goret0:pop psw pop a reti ;**********定时器 T1 处理程序*************** lt1: push a push psw mov tl1,#0b0h mov th1,#3ch djnz r2,goret1
    mov r2,#0ah mov a,@r1 cpl a mov @r1,a goret1:pop psw pop a reti ;******************************************* tab1:db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh tab2:db 00h,01h,01h,02h,03h,03h,04h,04h,05h,06h,06h,07h,0 8h,08h,09h,09h end
    18
  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PDF格式下载
  • 您可能感兴趣的
  • 基于单片机万年历  基于单片机的万年历  单片机万年历  电子万年历的设计  java万年历课程设计  51万年历  基于单片机的设计  单片机课程设计  单片机毕业设计