第三届 电子设计大赛参赛作品资料
作品名称
单片机万年历
作者
机与信息工程系
电测 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
- 基于51单片机万年历设计 > 单片机万年历
-
单片机万年历
下载该文档 文档格式:PDF 更新时间:2014-03-01 下载次数:0 点击次数:1
- 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
-
PDF格式下载
- 更多文档...
-
上一篇:领取成绩通知书介绍信
下一篇:2006年省直部门职称外语成绩通知书名单(2)
点击查看更多关于基于51单片机万年历设计的相关文档
- 您可能感兴趣的
- 基于单片机万年历 基于单片机的万年历 单片机万年历 电子万年历的设计 java万年历课程设计 51万年历 基于单片机的设计 单片机课程设计 单片机毕业设计
- 大家在找
-
- · 3gp格式教学街舞视频
- · 护理导论历年试题
- · 三菱电梯配件价格
- · 百度开心农场com种菜
- · 硫酸庆大霉素颗粒
- · 2012湖南特岗教师招聘
- · 安徽经济技术学校视频
- · 工段长管理丛书
- · 建筑提升机生产厂家
- · pic单片机信号电压
- · 固体废弃物处置记录
- · 腰椎间盘突出锻炼图片
- · chemdraw11.0
- · 海南师范大学家教中心
- · 西安地铁二号线开通
- · 广西玉林国庆天气预报
- · 鲁提辖拳打镇关西教参
- · 农村发展现状调研
- · 天津赶集网租房
- · 机械毕业实习报告图
- · 承德会计之家网站
- · 中青年干部培训班通讯录
- · 鑴帿鑴╅湁纰屾椹寸煕椴佹灇鑴宠姃椴佺褰曡劃褰曡劰鑴濇
- · 2011成考专升本教材
- · 2012奥迪a4缺点
- · 吉林省磐石市政府
- · 基层党建创新项目参考
- · 变频恒压供水系统
- · cec无锡冠军杯
- · 八进制数转十进制
- · 广州数控车床仿真软件
- · 028seo.cn
- · 山东临沂塑料制品厂
- · 口腔颌面外科
- · 农村劳动力转移培训
- · 2011七夕张翰郑爽视频
- · 经济法第二版课后答案
- · 福田交通枢纽
- · 学前教育毕业论文范文
- · 对机械认识的论文
- 赞助商链接