首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[已修复]万年历电路+程序+proteus仿真

[已修复]万年历电路+程序+proteus仿真


WgyEQlL3.jpg

[此贴子已经被作者于2008-10-27 17:26:11编辑过]

人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
~~想要电路仿真原理图和程序源代码的朋友把  邮箱  留下来~~
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
我要
chenchao8848@sohu.com
希望能够在不久的将来有次合作的机会  群:18994538 QQ: 364304745  个人主页:http://ldmcu.shangwusou.com/
好的,我这几天之内 会传上来的。。。单位机子有点问题,所以请大家耐心
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
~~~只要有一个人喜欢我就会发上来,呵呵,
原程序来自 --- www.01mcu.com ---
之所以制作加引号是因为我尚未在硬件中实现,只是用模拟软件试验了一下。应该还是靠得住。此模拟软件我已经模拟过其他项目,且硬件试验也都完全符合软件的模拟运行效果。
运行时间我调整在2005年12月1日。对应农历已经试验了几次其他日期经核实无误,可信。但是更多的对应没做测试,例如闰年闰月等。
制作说明:晶振12M,三片74164,原程序介绍用2051我如何也做不到 HEX 文件已经接近4K,看来可能性不大。只能用51了。
下面把运行图片发上来,详细电路图纸见PDF文件。原程序如下,附带HEX文件。

[此贴子已经被作者于2008-10-27 17:19:31编辑过]

人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876

万年历全部资料--Proteus仿真电路图加程序:

SMGedEHY.rar (84.27 KB)

[此贴子已经被作者于2008-10-27 17:20:42编辑过]

人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
包裹就在上面,如果没有proteus仿真软件怎么办?或者有proteus软件但还没用过怎么办?
没关系,可以对着图看程序吧。。程序也在包裹内。。
time_week data 52h ;星期存放单元
time_year data 5dh ;年份低两位存放单元(bcd码)
time_month data 5eh ;月份存放单元(bcd码)
time_data data 5fh ;日存放单元(bcd码)
yearh data 36h ;年份高两位
year data 35h ;年份低两位存放单元(bcd码)
month data 34h ;月份存放单元(bcd码)
day data 33h ;日存放单元(bcd码)
hour data 32h ;时存放单元(bcd码)
minute data 31h ;分存放单元(bcd码)
sec data 30h ;秒存放单元(bcd码)
aaa bit p3.0 ;显示位(74ls164 数据)
bbb bit p3.1 ;显示脉冲(74ls164时钟)
aa bit p3.3 ;时间调整按钮
bb bit p3.4 ;加1调整
cc bit p3.5 ;闹钟调整
bl bit p3.2 ;闹钟输出
bz1 bit 21h.0
times data 20h ;调时标志
com data p1 ;段码数据
; 定时器T0溢出周期为40MS,T0为秒计数用
1口 为字符输出口,采用共阳显示管。
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中断入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断程序
LJMP INTT0 ;跳至INTTO执行
ORG 0013H ;外中断1中断程序入口
RETI ;外中断1中断返回
ORG 001BH ;定时器T1中断程序入口
RETI
ORG 0023H ;串行中断程序入口地址
RETI ;串行中断程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START: ;主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov r0,#30h ;清30H-38H共11个内存单元
mov r7,#9 ;9个字节
cleete:
mov @r0,#00h ;www.01mcu.com
inc r0
djnz r7,cleete
mov times,#00h ;清调时标志
mov tmod,#01h ;设T0为16位定时器
mov tl0,#0c0h ;40ms定时初值(T0计时用)
mov th0,#63h ;40ms定时初值
mov sec,#0
mov minute,#0h
mov hour,#0h
mov day,#01h
mov month,#01h
mov year,#01h
mov yearh,#20h
setb ea ;总中断开放
setb et0 ;允许T0中断
setb tr0 ;开启T0定时器
mov r4,#19 ;1秒定时用(40ms×25)
START1:
call disp ;调用显示子程序
jnb aa,setmm1 3.3口为0时转时间调整程序
jmp start1 3.3口为1时跳回START1
SETMM1:
call setmm ;调时间调整程序SETMM
jmp start1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETMM: ;时间调整程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call disp
call disp
jb aa,setmmo ;是干扰跳过
setmm2:
jnb aa,setmm3
clr et0
clr tr0 ;关t0中断
mov sec,#0 ;秒清零
mov times,#01h ;分开始调整
mov r0,#minute ;
setmm4:
nop
inc22:
call offl ;灭显示
call inc11 ;加调整
call disp
jb aa,inc22
call disp
jb aa,inc22
inc r0
mov a,times
rl a
mov times,a
jnb times.5,setmm4 ;继续调整下一数据
setmm12:
jnb aa,setmm11
setmmo:
setb tr0
setb et0 ;调整完成开始计时
ret
setmm11:
call disp
jmp setmm12
setmm3:
call disp
jmp setmm2 ;避免调整时无显示
inc11:
mov r3,#40
inc111:
mov a,@r0
jb bb,inc17
add a,#1 ;加1
da a
call inc000 ;数据比较
inc13:
jnb bb,inc14
inc17:
mov @r0,a ;存入调整后的数据
call disp
djnz r3,inc111
ret
inc14:
call disp
jmp inc13
offl: ;灭显示
mov 22h,@r0
mov r6,#10
off1:
mov r7,#10
off2:
mov @r0,#0aah ;放入熄灭码
call disp
djnz r7,off2
djnz r6,off1
mov @r0,22h
ret
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
inc000: ;比较子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
jb times.0,inc001 ;分比较
jb times.1,inc002 ;时比较
jb times.2,inc003 ;日比较
jb times.3,inc004 ;月比较
jb times.4,inc005 ;年比较
jmp incout ;完成www.01mcu.com
inc005:
cjne a,#99h,incout
mov a,#00h ;超过99年为00年
jmp incout
inc004:
cjne a,#13h,incout
mov a,#01h ;超过12月为1月
jmp incout
inc003:
cjne a,#32h,incout
mov a,#01h ;超过31天为1日
jmp incout
inc002:
cjne a,#24h,incout
mov a,#00h ;超过23时为0时
jmp incout
inc001:
cjne a,#60h,incout
mov a,#00h ;超过59分为0分
incout:
ret ;返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTT0: ;1秒计时程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
push acc ;累加器入栈保护
push psw ;状态字入栈保护
orl tl0,#0c0h ;低8位初值修正
mov th0,#63h ;高8位初值修正
djnz r4,clke111 ;25次中断未到
jmp loop11
clke111:
jmp clke
loop11:
mov r4,#19h ;25次中断到(1秒)重赋初值
mov a,sec ;调整秒
add a,#1
da a
mov sec,a
cjne a,#60h,clke99 ;整分否
mov sec,#0 ;清秒
mov a,minute ;调整分
add a,#1
da a
mov minute,a
clk0:
cjne a,#60h,clke ;整点否
mov minute,#0 ;清分
mov a,hour ;调整时
add a,#1
da a
mov hour,a
cjne a,#24h,clke ;零点否
mov hour,#0 ;清时
mov a,day ;调整日期
add a,#1
da a
mov day,a
mov a,month ;查阅本月最大日期
inc a
movc a,@a+pc
sjmp clk1
db 31h,28h,31h ;对应月份编码:01h,02h,03h
db 30h,31h,30h ;对应月份编码:04h,05h,06h
db 31h,31h,30h ;对应月份编码:07h,08h,09h
db 00h,00h,00h ;对应无效月份编码:0ah,0bh,0ch
db 00h,00h,00h ;对应无效月份编码:0dh,0eh,0fh
db 31h,30h,31h ;对应月份编码:10h,11h,12h
clk1:
clr c
subb a,day
jnc clke ;本月未满
mov a,month
cjne a,#2,clk3 ;是二月
mov a,year
anl a,#13h ;保留年份中非4的整数部分
jnb acc.4,clk2
add a,#2
clk2:
anl a,#3 ;能否被4整除
jnz clk3 ;非闰年
mov a,day
xrl a,#29h
jz clke ;闰年二月可以有29日
clk3:
mov day,#1 ;调整到下个月的1日
mov a,month
add a,#1
da a
mov month,a
cjne a,#13h,clke
mov month,#1 ;调整到下一年的一月份
mov a,year ;调整年份
add a,#1
da a
mov year,a
clke99:
call CONvert ;农历转换子程序
clke: ;时钟调整完毕,处理其它定时任务
pop psw
pop acc
reti ;完成
;;;;;;;;;;;;;;;;;;;;
disp: ;显示寄存器处理
;;;;;;;;;;;;;;;;;;;;
push psw
push acc
mov 23h,r0 ;保存r0
disp99:
mov r1,#40h ;显示寄存器首址
mov r0,#30h ;待处理寄存器首址
mov r2,#9 ;处理n次
disp1:
mov a,@r0 ;低寄存器1内容存入a
anl a,#0fh
mov @r1,a ;将a的值存入显示寄存器1
mov a,@r0 ;低寄存器1内容存入a
swap a
anl a,#0fh
inc r1 ;r1地址加1
mov @r1,a ;将A的值存入显示寄存器2
djnz r2,disp2 ;处理完n次,没有地址加1
call display
mov r0,23h ;www.01mcu.com
pop acc
pop psw
ret
disp2:
inc r1
inc r0
jmp disp1
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
;以下为公历转农历子程序
CONvert:
mov a,year
mov time_year,a
mov a,month
mov time_month,a
mov a,day
mov time_data,a
MOV A,time_year ;将年月日转化为HEX 格式
;www.01mcu.com
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
JNB ACC.4,CON_02
CLR ACC.4 ;ACC.4 为1 表示大于10 月
ADD A,#10
CON_02: MOV CONvert_mONth,A
MOV A,time_data
MOV B,#16
DIV AB
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
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
;www.01mcu.com
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(9 月份过去的整月为8 个月)
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 ;取得闰年过去月的天数的低字节
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
;www.01mcu.com
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 ;表格指针指向上一年
CON_26: MOV A,temp_Byte5
CLR C
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: MOV temp_Byte5,A
CON_40: MOV A,temp_Byte5
RRC A
MOV temp_Byte5,A
JC CON_42
MOV B,#29 ;小月29 天
SJMP CON_44
CON_42: MOV B,#30 ;大月30 天
CON_44: 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
;www.01mcu.com
ORL A,B
MOV CONvert_dAte,A
MOV A,CONvert_mONth
MOV B,#10
DIV AB
SWAP A
ORL A,B
MOV CONvert_mONth,A
MOV A,CONvert_yeAr
MOV B,#10
DIV AB
SWAP A
ORL A,B
MOV CONvert_yeAr,A
call week ;星期转换子程序?
RET ;结束转换
CON_50: 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 ;当前月与闰月相同,更改闰月标志
CON_54: 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: MOV CONvert_mONth,#1 ;农历月为1 月
CLR A
MOVC A,@A+dptr
MOV temp_Byte5,A
ANL A,#0f0h
SWAP A;
XCH A,temp_Byte5 ;temp_Byte5 中为闰月,ACC 为当年农历表第一字节
CLR f0 ;第一个月肯定不是闰月
ANL A,#0fh
MOV temp_Byte1,A
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 ;以上temp_Byte1,temp_Byte2 各BIT 存农历年大小
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: MOV B,#30 ;大月30 天
CON_74: MOV A,temp_Byte4
CLR C
SUBB A,B
JNC CON_78 ;低字节够减跳转
MOV B,A ;低字节不够减, B 暂存减后结果,
MOV A,temp_Byte3
;www.01mcu.com
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 ;当前月与闰月相同,更改闰月标志
JNB f0,CON_82 ;更改标志后是非闰月,月份加1
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
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
display: ;显示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 显示数据在40H-51H单元内,用19位LED共阳数码管显示,P1口输出段码数据,
;每个LED数码管亮1MS;时间再逐位循环。
mov r1,#40h ;指向显示数据首址
mov r5,#19 ;显示19个数据
setb aaa
play:
setb bbb
nop
clr bbb ;移一位
clr aaa ;清零
mov a,@r1 ;取显示数据到A
mov dptr,#tab ;取段码表地址
movc a,@a+dptr ;查显示数据对应段码
mov com,a ;段码放入P1口
call dl1ms ;显示1ms
mov com,#0ffh 1口复位
djnz r5,play1 ;www.01mcu.com
clr bbb
setb aaa
ret ;返回
play1:
inc r1 ;显示下一位
jmp play
TAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0a3h,8eh,0abh
;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9""不亮""o""f""n";后面三个在调闹钟时用
dl1ms:
mov 25h,r7
mov 24h,r6 ;保存r6,r7
mov r7,#20
ds1:
mov r6,#10
djnz r6,$
djnz r7,ds1
mov r7,25h
mov r6,24h
ret
;下面还有

;下面的程序是我在网上找到的并做了删减及修改了一点,我可没这个能力自己编出来
;以下三单元存转换后农历日期与入口单元重叠,如要保留入口信息,请重定义?
start_year equ 01
CONvert_yeAr DATA 5ch
CONvert_mONth DATA 38h ;BIT7 为1 表示闰月
CONvert_dAte DATA 37h
temp_Byte1 DATA 57h
temp_Byte2 DATA 58h
temp_Byte3 DATA 59h
temp_Byte4 DATA 5Ah
temp_Byte5 DATA 5Bh
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
DB 0,31,60,91,121,152,182,213,244,18,49,79
mONth_dAtA:
;公历年对应的农历数据,每年三字节,
;格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小
;第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小
;月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天).
;第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日
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
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
;以下子程序用于从当前公历日期,推算星期,
;入口:time_yeAr,time_month ,time_data ,定义公历年月日,BCD 码,其中月的
;以下子程序用于从当前公历日期,推算星期,
;入口:time_yeAr,time_month ,time_date ,定义公历年月日,BCD 码,其中月的
;年份存入r5,月份存入r6,日期存入r7(bcd码
;www.01mcu.com
time_week1 data 52h
week:
MOV A,time_yeAr
MOV B,#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 ;20 世纪年+100
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_data
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 ;月大于2 转移
DEC temp_Byte3 ;份小于等于2,又是闰年,日减1
getw10: MOV A,temp_Byte2;
LCALL get_CorreCt ;取月校正表数据
ADD A,temp_Byte1
MOV B,#7
DIV AB ;B 放年加校正日数之和后除7 的余数不先做这一步
;有可能数据溢出
MOV A,temp_Byte1
ANL A,#0fCh
RR A
RR A ;以上年除4 即闰年数
ADD A,B
ADD A,temp_Byte3
MOV B,#7
DIV AB
mov a,b
cjne a,#0,outout
mov b,#8
outout: ;星期日显示8
MOV time_week1,B
RET
get_COrreCt:
MOVC A,@A+PC
RET
DB 0,3,3,6,1,4,6,2,5,0,3,5
end

get_COrreCt:
MOVC A,@A+PC
RET
DB 0,3,3,6,1,4,6,2,5,0,3,5
end
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
程序结束。。
人要保持斗志,并有疯狂的追求,生活才会精彩! QQ:24387110 手机:13871563876
zcllom  你太可爱了!
日初,整装而发;日暮,满载而归。
这么好的东东,没办法不顶的,哈哈
我想要电子万年历设计的电路仿真原理图和程序源代码或它的设计流程,谢谢.
116189723@qq.com
三人行必有我师,我虚心向各位讨教关于电子方面的知识.
返回列表