基于AT89C51单片机的多功能电子万年历的设计

更新时间:2024-05-24 08:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机应用系统设计

课 题: 基于AT89C51单片机的多功能电子万年

历的设计

姓 名:

班 级: 学 号: 指导老师: 日 期:

单片机课程设计

目录

一.绪言……………………………………………………………3

二.系统总体方案设计……………….………………………………3

三.硬件系统设计:…………………….……………………….4

四.系统软件设计………………….……………………………5

五.设计总结……………………………………………………8

六.参考文献……………………………………………………8

七.附录………………………………………………………….9

2

单片机课程设计

一.绪论

随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。

万年历是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,但是所有这些,都是以钟表数字化为基础的。因此,研究万年历及扩大其应用,有着非常现实的意义。

本系统采用了以广泛使用的单片机技术为核心,软硬件结合,使硬件部分大为简化,提高了系统稳定性,并采用LED显示电路、键盘电路,使人机交互简便易行。

二.系统总体方案设计 1. 系统设计硬件框图

振荡电路 LED显示频 按键调节 AT89C51 DS1302

2. 实现的基本原理

在本实验中,我引用了DS1302的时,分,秒功能,当时计数字24时通过74LS164给

模块年月日进位,当日模块对应其相应月份进行向月进位时,就给月进位,当月满12时,给年进位。

3

单片机课程设计 三.硬件系统设计 1.元器件介绍 名称 DS1302 图形 功能 U181VCC1X1VCC22 可以对年、月、日、周日、时、分、秒进行计时,且具有闰年补偿等多种功能 576RSTSCLKI/OX2DS13023 3 74LS164 U498RSRG8C1/->12&1D45610111213 74LS164是一个串行输入并行输出的移位寄存器,并带有清除端。其中; Q0—Q7 并行输出端 。 A,B串行输入端。 MR 清除端, 为0时,输出清零。 CP 时钟输入端。 74LS164 AT89C51 U219XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD39383736353433322122232425262728101112131415161722222222at89c51单片机是美国ATMEL公司生产的低电压,高性能CMOS 8位单片机,片内含4K bytes的可反复擦写的Flash只读程序存储器和128bytes的随机数据存储器(RAM),器件采用ATMEL公司的高密度,非易失性存储技术生产,兼容标准MCS-51指令系统。功能强大的at89c51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。 18XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51 4 单片机课程设计

2.硬件原理图

ABCDEFGHJK00D?年12月日星期月日小时分秒LED-BLUE12R3580U3RSRG8C1/->&1D31011121374LS16434R2580U4RSRG8C1/->4&1D1011574LS16412135RP1619U2XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516172021222324252627RESPACK-8R1580U5RSRG8C1/->618XTAL2&RSTU01:A4009U01:B4009U01:D4009U01:C4009U01:E4009U01:F4009U02:A40091DU02:B4009293031VCC1X1VCC2117P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51X1RSTSCLKI/ODS130232678HZX274LS1641213PSENALEEABAT11.5VU1107889FILE NAME:DESIGN TITLE:PATH:BY:9万年厉.DSNDATE:2009-6-16C:\\Documents and Settings\\wufeng\\桌面万年历万C:\\Documents and Settings\\wufeng\\桌面万年历万年厉.DSN1of万年厉1REV:TIME:0:21:00PAGE:ABCDEFGHJK

四.系统软件设计

仿真过程

1、打开PROTEUS软件,并出画单片机电子万年历具体运行电路图。 3、检查所画电路运行图,确保没有错误以后,加载源程序。

4、加载完成后,单击电路图框下的开始按钮,进行仿真,观察LED数码管现实情况,此时LED数码管开始显示数字。调节开关进行时间的调节。当秒的显示间隔快与或慢与实际间隔时,调节石英晶体震荡器的频率参数,从而使秒的间隔达到标准。然后检查电路其它问题,并对其的各参数进行调整,使之正确。 仿真结果

通过对源程序的编译,改正了其中的很多错误,然后运行,保证源程序的正确性。然后按原理图选择正确合理的电器元件,画出正确的电路图,加载源程序运行,顺利实现了单片机数字电子钟的“小时”、“分钟”、“秒”的显示。

1主程序流程图设计

5

单片机课程设计

CLR P0.6

MOV DS1302_ADDR,#8EH

MOV DS1302_DATA,#00H ;允许协 LCALL WRITE

MOV DS1302_ADDR,#90H

MOV DS1302_DATA,#0A6H ;1302充电,充电电流.1mA lcall write

SETB ET0 ; SETB TR0

main1: MOV DS1302_ADDR,#8DH ;READ OUT YEAR LCALL READ

MOV TIME_YEAR,DS1302_DATA

MOV DS1302_ADDR,#8BH ;READ OUT WEEK LCALL READ

MOV WEEK,DS1302_DATA

MOV DS1302_ADDR,#89H ;READ OUT MONTH LCALL READ

MOV TIME_MONTH,DS1302_DATA

MOV DS1302_ADDR,#87H ;READ OUT DAY LCALL READ

MOV TIME_DAY,DS1302_DATA

MOV DS1302_ADDR,#85H ;READ OUT HOUR LCALL READ

MOV HOUR,DS1302_DATA

MOV DS1302_ADDR,#83H ;READ OUT MINTUE LCALL READ

MOV MINTUE,DS1302_DATA

MOV DS1302_ADDR,#81H ;READ OUT SECOND LCALL READ

MOV SECOND,DS1302_DATA

MOV R0,TIME_YEAR ;存 LCALL DIVIDE MOV 7BH,R1 MOV 4BH,R1 MOV 7CH,R2 MOV 4CH,R2

MOV 78H,WEEK MOV 48H,WEEK

MOV R0,TIME_MONTH ; 打开秒闪定时器 年分离,送显示缓月分离,送显示缓

11

单片机课程设计

LCALL DIVIDE MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2 MOV 4AH,R2

MOV R0,TIME_DAY ;日分离,送显示缓存 LCALL DIVIDE MOV 76H,R1 MOV 46H,R1 MOV 77H,R2 MOV 47H,R2

MOV R0,HOUR ; LCALL DIVIDE MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,R2

MOV R0,MINTUE ; LCALL DIVIDE MOV 72H,R1 MOV 42H,R1 MOV 73H,R2 MOV 43H,R2

MOV R0,SECOND ; LCALL DIVIDE MOV 70H,R1 MOV 40H,R1 MOV 71H,R2 MOV 41H,R2

LCALL GENGXIN ; MOV R0,CONVERT_MONTH ; LCALL DIVIDE MOV 5BH,R1 MOV 52H,R1 MOV 5CH,R2 MOV 53H,R2

MOV R0,CONVERT_DATE LCALL DIVIDE MOV 59H,R1 MOV 50H,R1 MOV 5AH,R2 MOV 51H,R2 LCALL GETWEEK

12

小时分离,送显示缓存 分分离,送显示缓存 秒分离,送显示缓存 更新农历程序

农历月分离,送显示缓存 单片机课程设计

MOV 78H,WEEK LCALL DISPLAY

GOON:JNB P1.1,SETGG ;调整日历 ;JNB P1.4,QIDONG ;启动秒钟指示灯 ; LCALL QIDONG AAA: JNB F0,SSS

CLR P1.0 ;闰月,则p1.0清,指示灯亮 LJMP MAIN1

SSS: SETB P1.0 ;非闰月,则p1.0置位,指示灯灭 LJMP MAIN1 SETGG: LJMP SETG

QIDONG: LCALL DISPLAY ; ;JNB P1.4,QIDONG ; LCALL QIDONG

CPL 30H ;30 JB 30H,ON CLR TR0 CLR ET0 AJMP QDOUT ON: SETB TR0 SETB ET0 QDOUT: AJMP AAA

;***************************** ;* ;*****************************

INTT2: PUSH ACC ; PUSH PSW ; CLR ET0 ; CLR TR0 ; MOV A,#0B7H ; ADD A,TL0 ; MOV TL0,A ; MOV A,#3CH ; ADDC A,TH0 ;

MOV TH0,A ; SETB TR0 ; CLR PSW.4 DJNZ R7,INTT2OUT MOV R7,#10 CPL 20H JB 20H,S1

SETB P0.7 ; AJMP INTT2OUT

秒钟指示灯开启/关闭 秒灯闪烁程序 * 累加器入栈保护 状态字入栈保护 关T0中断允许 关闭定时器T0

中断响应时间同步修正 低位初值修正

重装初值(低位修正值) 高位初值修正 重装初值(高位修正值) 开启定时器T0 秒指示灯闪烁 13

单片机课程设计

S1:

CLR P0.7

INTT2OUT: POP PSW ;出栈 POP ACC SETB ET0 RETI

;********************************* ;* 写程序 * ;********************************* WRITE: CLR SCLK NOP SETB RST NOP

MOV A,DS1302_ADDR MOV R4,#8

WRITE1: RRC A ;送地址给 NOP NOP CLR SCLK NOP NOP NOP MOV IO,C

SETB SCLK ;送入地址在时钟上升沿有效 NOP NOP NOP NOP

DJNZ R4,WRITE1 CLR SCLK NOP

MOV A,DS1302_DATA MOV R4,#8 WRITE2: RRC A

NOP ;送数据给,时钟上升沿,数据输入 CLR SCLK NOP NOP MOV IO,C NOP NOP NOP SETB SCLK NOP

14

单片机课程设计

NOP

DJNZ R4,WRITE2 CLR RST RET

;******************************* ;* 读程序 * ;******************************* READ: CLR SCLK NOP NOP SETB RST NOP

MOV A,DS1302_ADDR MOV R4,#8 READ1: RRC A NOP MOV IO,C NOP NOP NOP

SETB SCLK ;送入地址在时钟上升沿有效 NOP NOP NOP ;CLR SCLK CLR SCLK NOP NOP

DJNZ R4,READ1 MOV R4,#8 READ2: CLR SCLK NOP NOP NOP MOV C,IO NOP NOP NOP NOP

NOP ;从ds1302中读取数据,时钟下降沿有效 RRC A NOP NOP NOP

15

单片机课程设计

NOP SETB SCLK NOP

DJNZ R4,READ2 MOV DS1302_DATA,A CLR RST RET

;******************************* ;* 公历设置程序 * ;******************************* SETG: CLR TR0 CLR ET0 SETB TR1 SETB ET1 CLR 08H CLR 09H CLR 0AH CLR 0BH CLR 0CH CLR 0DH CLR 0EH CLR 0FH

MOV DS1302_ADDR,#8EH

MOV DS1302_DATA,#00H ; LCALL WRITE

MOV DS1302_ADDR,#80H

MOV DS1302_DATA,#80H ;1302 LCALL WRITE GWAIT: LCALL DISPLAY JNB P1.1,GWAIT

SETG1: LCALL DISPLAY JNB P1.1,SETGMON

JNB P1.3,GADDYEAR JNB P1.4,GDECYEAR JNB F0,SSSYEAR

CLR P1.0 ; LJMP SETG1 SSSYEAR: SETB P1.0 AJMP SETG1 SETGMON: AJMP SETG2

GADDYEAR: MOV R7,66H ; 16

允许写 停止振荡 闰月,则p1.1清,指示灯亮年加

单片机课程设计

LCALL ADD1 MOV 66H,A

GADDYEAR1: LCALL GETWEEK ;年加同时换算出星期 LCALL YMD ;转换农历月日 MOV DS1302_ADDR,#8CH ;年值送 MOV DS1302_DATA,66H LCALL WRITE

MOV DS1302_ADDR,#8AH ;星期值送 MOV DS1302_DATA,64H LCALL WRITE MOV R0,66H

LCALL DIVIDE ; MOV 4BH,R1 MOV 7BH,R1 MOV 4CH,R2 MOV 7CH,R2 MOV R0,64H

LCALL DIVIDE ; MOV 48H,week MOV 78H,week WAIT1: LCALL DISPLAY JNB P1.3,WAIT1 AJMP SETG1

GDECYEAR: MOV R7,66H ; LCALL DEC1 MOV 66H,A

LCALL GETWEEK ; LCALL YMD ; MOV DS1302_ADDR,#8CH ; MOV DS1302_DATA,66H LCALL WRITE

MOV DS1302_ADDR,#8AH ; MOV DS1302_DATA,64H LCALL WRITE MOV R0,66H

LCALL DIVIDE ; MOV 4BH,R1 MOV 7BH,R1 MOV 4CH,R2 MOV 7CH,R2 MOV R0,64H

17

年分离送显示缓冲 星期分离送显示缓冲 年减 年减同时换算出星期 转换农历月日 年值送 星期值送 年分离送显示缓冲 单片机课程设计

LCALL DIVIDE ;星期分离送显示缓冲 MOV 48H,week MOV 78H,week WAIT2: LCALL DISPLAY JNB P1.4,WAIT2 AJMP SETG1

SETG2: SETB 0AH ;调月时闪标志 GWAIT3: LCALL DISPLAY JNB P1.1,GWAIT3 SETG3: LCALL DISPLAY JNB P1.1,SETGDAY JNB P1.3,GADDMONTH JNB P1.4,GDECMONTH JNB P1.2,JUMPYEAR JNB F0,SSSMONTH

CLR P1.0 ; LJMP SETG3 SSSMONTH: SETB P1.0

AJMP SETG3 JUMPYEAR: LCALL DISPLAY CLR 0AH

JNB P1.2,JUMPYEAR AJMP SETG1 SETGDAY: AJMP SETG4

GADDMONTH: MOV R7,65H ; LCALL ADD1 MOV 65H,A

CJNE A,#13H,GADDMONTH1 MOV 65H,#01H

GADDMONTH1: LCALL GETWEEK ; LCALL YMD ; MOV DS1302_ADDR,#88H ; MOV DS1302_DATA,65H LCALL WRITE

MOV DS1302_ADDR,#8AH ; MOV DS1302_DATA,64H LCALL WRITE

MOV R0,65H

LCALL DIVIDE ; MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2

18

闰月,则p1.1清,指示灯亮月加 月加同时换算出星期 转换农历月日 月值送 星期值送 月分离送显示缓冲 单片机课程设计

MOV 4AH,R2 MOV R0,64H

LCALL DIVIDE ;星期分离送显示缓冲 MOV 48H,week MOV 78H,week WAIT4: LCALL DISPLAY JNB P1.3,WAIT4 AJMP SETG3

GDECMONTH:MOV R7,65H ; LCALL DEC1 MOV 65H,A

CJNE A,#00H,GDECMONTH1 MOV 65H,#12H

GDECMONTH1: LCALL GETWEEK ; LCALL YMD ; MOV DS1302_ADDR,#88H ; MOV DS1302_DATA,65H LCALL WRITE

MOV DS1302_ADDR,#8AH ; MOV DS1302_DATA,64H LCALL WRITE

MOV R0,65H

LCALL DIVIDE ; MOV 79H,R1 MOV 49H,R1 MOV 7AH,R2 MOV 4AH,R2 MOV R0,64H

LCALL DIVIDE ; MOV 48H,week MOV 78H,week WAIT5: LCALL DISPLAY JNB P1.4,WAIT5 AJMP SETG3

SETG4: SETB 0BH ; GWAIT6: LCALL DISPLAY JNB P1.1,GWAIT6 SETG5: LCALL DISPLAY JNB P1.1,SETGHOUR JNB P1.3,GADDDAY JNB P1.4,SETGDDAY JNB P1.2,JUMPMONTH

19

月减 月减同时换算出星期转换农历月日 月值送 星期值送 月分离送显示缓冲 星期分离送显示缓冲 调日时闪标志 单片机课程设计

JNB F0,SSSDATE

CLR P1.0 ;闰月,则p1.1清,指示灯亮 LJMP SETG5 SSSDATE: SETB P1.0

AJMP SETG5 JUMPMONTH: LCALL DISPLAY CLR 0BH

JNB P1.2,JUMPMONTH AJMP SETG3 SETGHOUR: AJMP SETG6 SETGDDAY: AJMP GDECDAY GADDDAY: MOV A,65H CJNE A,#01H,FEB

LCALL MMONTH ; AJMP GADDDAY1

FEB: CJNE A,#02H,MARCH

MOV R3,66H ; LCALL ZH ;BCD MOV A,R3 JZ RFEB

MOV R7,63H ; LCALL ADD1 MOV 63H,A CJNE A,#29H,FEB1 MOV 63H,#01 FEB1: AJMP GADDDAY1

RFEB: MOV R7,63H ; LCALL ADD1 MOV 63H,A CJNE A,#30H,FEB2 MOV 63H,#01 FEB2: AJMP GADDDAY1

MARCH: CJNE A,#03H,APRIL

LCALL MMONTH ; AJMP GADDDAY1 APRIL: CJNE A,#04H,MAY

LCALL LMONTH ; AJMP GADDDAY1 MAY: CJNE A,#05H,JUNE

LCALL MMONTH ; 20

一月日加 二月日加 码转换成HEX 平年二月有天 闰年二月有天 三月加 四月加 五月加

单片机课程设计

AJMP GADDDAY1 JUNE: CJNE A,#06H,JULY

LCALL LMONTH ;六月加 AJMP GADDDAY1 JULY: CJNE A,#07H,AUGUST

LCALL MMONTH ;七月加 AJMP GADDDAY1

AUGUST: CJNE A,#08H,SEPTEMBER

LCALL MMONTH ;八月加 AJMP GADDDAY1 SEPTEMBER:CJNE A,#09H,OCTOBER

LCALL LMONTH ; AJMP GADDDAY1 OCTOBER: CJNE A,#10H,NOVEMBER

LCALL MMONTH ; AJMP GADDDAY1 NOVEMBER: CJNE A,#11H,DECEMBER

LCALL LMONTH ; AJMP GADDDAY1 DECEMBER: CJNE A,#12H,ERROR

LCALL MMONTH ; AJMP GADDDAY1 ERROR: AJMP WAIT7

GADDDAY1: LCALL GETWEEK

LCALL YMD ; MOV DS1302_ADDR,#86H ; MOV DS1302_DATA,63H LCALL WRITE

MOV DS1302_ADDR,#8AH ; MOV DS1302_DATA,64H LCALL WRITE MOV R0,63H

LCALL DIVIDE ; MOV 76H,R1 MOV 46H,R1 MOV 77H,R2 MOV 47H,R2 MOV R0,64H

LCALL DIVIDE ; MOV 48H,week MOV 78H,week

WAIT7: LCALL DISPLAY

21

九月加 十月加 十一月加 十二月加 转换农历月日 日值送 星期值送 日分离送显示缓冲 星期分离送显示缓冲 单片机课程设计

JNB P1.3,WAIT7 AJMP SETG5

;***************************************************************************************** GDECDAY: mov A,65H CJNE A,#01H,DFEB

LCALL DMMONTH ;一月日减 AJMP GDECDAY1 DFEB: CJNE A,#02H,DMARCH

MOV R3,66H ;二月日减 LCALL ZH ;BCD MOV A,R3 JZ DRFEB

MOV R7,63H ; LCALL DEC1 MOV 63H,A CJNE A,#00H,DFEB1 MOV 63H,#28H DFEB1: AJMP GDECDAY1

DRFEB: MOV R7,63H ; LCALL DEC1 MOV 63H,A CJNE A,#00H,DFEB2 MOV 63H,#29H DFEB2: AJMP GDECDAY1 DMARCH: CJNE A,#03H,DAPRIL

LCALL DMMONTH ; AJMP GDECDAY1

DAPRIL: CJNE A,#04H,DMAY

LCALL DLMONTH ; AJMP GDECDAY1

DMAY: CJNE A,#05H,DJUNE

LCALL DMMONTH ; AJMP GDECDAY1

DJUNE: CJNE A,#06H,DJULY

LCALL DLMONTH ; AJMP GDECDAY1

DJULY: CJNE A,#07H,DAUGUST

LCALL DMMONTH ; AJMP GDECDAY1

22

码转换成HEX 平年二月有天 闰年二月有天 三月减 四月减 五月减 六月减 七月减 单片机课程设计

DAUGUST:CJNE A,#08H,DSEPTEMBER

LCALL DMMONTH ;八月减 AJMP GDECDAY1

DSEPTEMBER:CJNE A,#09H,DOCTOBER

LCALL DLMONTH ;九月减 AJMP GDECDAY1

DOCTOBER:CJNE A,#10H,DNOVEMBER

LCALL DMMONTH ; AJMP GDECDAY1

DNOVEMBER:CJNE A,#11H,DDECEMBER

LCALL DLMONTH ; AJMP GDECDAY1

DDECEMBER: CJNE A,#12H,DERROR

LCALL DMMONTH ; AJMP GDECDAY1 DERROR: AJMP WAIT8

GDECDAY1: LCALL GETWEEK

LCALL YMD ; MOV DS1302_ADDR,#86H ; MOV DS1302_DATA,63H LCALL WRITE

MOV DS1302_ADDR,#8AH ; MOV DS1302_DATA,64H LCALL WRITE MOV R0,63H

LCALL DIVIDE ; MOV 76H,R1 MOV 46H,R1 MOV 77H,R2 MOV 47H,R2 MOV R0,64H

LCALL DIVIDE ; MOV 48H,week MOV 78H,week WAIT8: LCALL DISPLAY JNB P1.4,WAIT8 AJMP SETG5

SETG6: SETB 0CH ; GWAIT9: LCALL DISPLAY

23

十月减 十一减加 十二月减 转换农历月日 日值送 星期值送 日分离送显示缓冲 星期分离送显示缓冲调小时时闪标志 单片机课程设计

JNB P1.1,GWAIT9 SETG9: LCALL DISPLAY JNB P1.1,SETG10 JNB P1.3,GADDHOUR JNB P1.4,GDECHOUR JNB P1.2,JUMPDATE AJMP SETG9 JUMPDATE: LCALL DISPLAY CLR 0CH

JNB P1.2,JUMPDATE AJMP SETG5

GADDHOUR: MOV R7,62H ; LCALL ADD1 MOV 62H,A

CJNE A,#24H,GADDHOUR1 MOV 62H,#00H

GADDHOUR1: MOV DS1302_ADDR,#84H ; MOV DS1302_DATA,62H LCALL WRITE MOV R0,62H

LCALL DIVIDE ; MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,R2 WAIT10: LCALL DISPLAY JNB P1.3,WAIT10 AJMP SETG9

GDECHOUR: MOV R7,62H ; LCALL DEC1 MOV 62H,A

CJNE A,#99H,GDECHOUR1 MOV 62H,#23H

GDECHOUR1: MOV DS1302_ADDR,#84H ; MOV DS1302_DATA,62H LCALL WRITE MOV R0,62H

LCALL DIVIDE ; MOV 74H,R1 MOV 44H,R1 MOV 75H,R2 MOV 45H,R2

24

小时加 小时值送 小时分离送显示缓冲小时减 小时值送 小时分离送显示缓冲 单片机课程设计

WAIT11: LCALL DISPLAY JNB P1.4,WAIT11 AJMP SETG9

SETG10: SETB 0DH ;调分时闪标志 GWAIT12: LCALL DISPLAY JNB P1.1,GWAIT12 SETG11: LCALL DISPLAY JNB P1.1,SETGOUT JNB P1.3,GADDMINTUE JNB P1.4,GDECMINTUE JNB P1.2,JUMPHOUR AJMP SETG11 JUMPHOUR: LCALL DISPLAY CLR 0DH

JNB P1.2,JUMPHOUR AJMP SETG9

GADDMINTUE: MOV R7,61H ; LCALL ADD1 MOV 61H,A

CJNE A,#60H,GADDMINTUE1 MOV 61H,#00H

GADDMINTUE1: MOV DS1302_ADDR,#82H ; MOV DS1302_DATA,61H LCALL WRITE MOV R0,61H

LCALL DIVIDE ; MOV 72H,R1 MOV 42H,R1 MOV 73H,R2 MOV 43H,R2 WAIT13: LCALL DISPLAY JNB P1.3,WAIT13 AJMP SETG11

GDECMINTUE: MOV R7,61H ; LCALL DEC1 MOV 61H,A

CJNE A,#99H,GDECMINTUE1 MOV 61H,#59H

GDECMINTUE1: MOV DS1302_ADDR,#82H ; MOV DS1302_DATA,61H LCALL WRITE MOV R0,61H

LCALL DIVIDE ; MOV 72H,R1

25

分加 分值送 分分离送显示缓冲 分减 分值送 分分离送显示缓冲

单片机课程设计

MOV 42H,R1 MOV 73H,R2 MOV 43H,R2 WAIT14: LCALL DISPLAY JNB P1.4,WAIT14 AJMP SETG11

SETGOUT: LCALL DISPLAY JNB P1.1,SETGOUT LCALL GENGXIN MOV DS1302_ADDR,#80H

MOV DS1302_DATA,#00H ;1302振荡 LCALL WRITE

MOV DS1302_ADDR,#8EH

MOV DS1302_DATA,#80H ; LCALL WRITE CLR 08H CLR 09H CLR 0AH CLR 0BH CLR 0CH CLR 0DH

CLR ET1

CLR TR1 ; SETB ET0 SETB TR0 LJMP MAIN1

;*********************************** ;* ;*********************************** INTT1: PUSH ACC PUSH PSW GFLASH: CPL 0FH JB 0FH,GFLASH1

MOV 7CH,4CH ; MOV 7BH,4BH ;MOV A,4AH ;CJNE A,#0,TMONTH ;MOV 4AH,#0BH TMONTH:MOV 7AH,4AH MOV 79H,49H

闪动调时程序 * 26

晶振开始禁止写入 关闭定时器 全部显示

单片机课程设计

MOV 78H,WEEK ;MOV A,47H ;CJNE A,#0,TDATE ;MOV 47H,#0BH TDATE: MOV 77H,47H MOV 76H,46H ;MOV A,45H ;CJNE A,#0,THOUR ;MOV 45H,#0AH THOUR:MOV 75H,45H MOV 74H,44H MOV 73H,43H MOV 72H,42H MOV 71H,41H MOV 70H,40H

; MOV 50H,59H ; ; MOV A,5AH ; CJNE A,#0,TNDATE ; MOV 5AH,#0BH ; TNDATE:MOV 51H,5AH

; MOV 52H,5BH ; MOV A,5CH ; CJNE A,#0,TNMONTH ; MOV 5CH,#0BH ; TNMONTH:

; MOV 53H,5CH GFLASHOUT: POP PSW POP ACC RETI

GFLASH1: JB 0AH,GFLASH2 ; MOV 7CH,#0AH MOV 7BH,#0AH

;MOV 78H,#0AH ; ;MOV 50H,#0AH ; ; MOV 51H,#0AH ; MOV 52H,#0AH ; MOV 53H,#0AH AJMP GFLASHOUT

GFLASH2: JB 0BH,GFLASH3 ; MOV 7AH,#0AH MOV 79H,#0AH

;MOV 78H,#0AH ; 27

农历月日 调年闪 调年时星期闪农历月日闪烁调月闪 调月时星期闪

单片机课程设计

;MOV 50H,#0AH ;农历月日闪烁 ;MOV 51H,#0AH ;MOV 52H,#0AH ; MOV 53H,#0AH LJMP GFLASHOUT

GFLASH3: JB 0CH,GFLASH4 ;调日闪 MOV 77H,#0AH MOV 76H,#0AH

;MOV 78H,#0AH ;调日时星期闪 ;MOV 50H,#0AH ; ;MOV 51H,#0AH ;MOV 52H,#0AH ;MOV 53H,#0AH LJMP GFLASHOUT

GFLASH4: JB 0DH,GFLASH5 ; MOV 75H,#0AH MOV 74H,#0AH LJMP GFLASHOUT

GFLASH5: ; MOV 73H,#0AH MOV 72H,#0AH LJMP GFLASHOUT

;********************************* ;* 加程序 * ;********************************* ADD1: MOV A,R7 ADD A,#01H DA A RET

;********************************* ;* 减程序 * ;********************************* DEC1: MOV A,R7 ADD A,#99H DA A RET

;********************************* ;* 大小月加调整程序 * ;*********************************

MMONTH: MOV R7,63H ; LCALL ADD1 MOV 63H,A

CJNE A,#32H,MGOOUT

28

农历月日闪烁 调小时闪 调分钟闪 大月日加 单片机课程设计

MOV 63H,#01H MGOOUT: RET

LMONTH:MOV R7,63H ;小月日加 LCALL ADD1 MOV 63H,A

CJNE A,#31H,LGOOUT MOV 63H,#01H LGOOUT:RET

;********************************* ;* 大小月减调整程序 * ;*********************************

DMMONTH:MOV R7,63H ;大月日减 LCALL DEC1 MOV 63H,A

CJNE A,#00H,DMGOOUT MOV 63H,#31H DMGOOUT: RET

DLMONTH:MOV R7,63H ;小月日减 LCALL DEC1 MOV 63H,A

CJNE A,#00H,DLGOOUT MOV 63H,#30H DLGOOUT:RET ; *************************** ; * 公历年月日推算星期 * ; ***************************

; 以下子程序用于从当前公历日期, 推算星期,

; 入口:time_yeAr,time_month ,time_date , 定义公历年月日,BCD 码, 其中月的 ;BIT7 表示世纪,0 表示20 世纪,1 表示19 世纪, 与PCF8563 一致

; 出口time_week, 0-6 表示星期日- 星期六, 与PCF8563 一致, 程序不改变入口数据 ; 使用资源:ACC,B,psw,temp_Byte1,temp_Byte2,temp_Byte3 GetWeek: MOV A,time_year MOV B,#16 DIV AB

MOV week_Byte1,B MOV B,#10 MUL AB

ADD A,week_Byte1

MOV week_Byte1,A ;temp_Byte1= 年 MOV A,time_month

29

单片机课程设计

JB ACC.7,getw02

MOV A,#100 ADD A,week_Byte1

MOV week_Byte1,A ;20 世纪年+100 MOV A,time_month CLR ACC.7

getw02: JNB ACC.4,getw04 ADD A,#10 CLR ACC.4

getw04: MOV week_Byte2,A ;temp_Byte2= 月 MOV A,time_day MOV B,#16 DIV AB

MOV week_Byte3,B MOV B,#10 MUL AB

ADD A,week_Byte3

MOV week_Byte3,A ;temp_Byte3= 日 MOV A,week_Byte1; ANL A,#03h

JNZ getw10 ; 非闰年转移 MOV A,week_Byte2 CJNE A,#3,getw06

getw06: JNC getw10 ; 月大于2 转移

DEC week_Byte3 ; 份小于等于2, 又是闰年, 日减1 getw10: MOV A,week_Byte2;

LCALL get_CorreCt ; 取月校正表数据 ADD A,week_Byte1 MOV B,#7

DIV AB ;B 放年加校正日数之和后除7 的余数不先做这一步 ; 有可能数据溢出 MOV A,week_Byte1 ANL A,#0fCh RR A

RR A ; 以上年除4 即闰年数 ADD A,B

ADD A,week_Byte3 MOV B,#7 DIV AB MOV week,B MOV A,WEEK CJNE A,#0,GOBACK MOV B,#07H

30

单片机课程设计

GOBACK: MOV WEEK,B RET

get_COrreCt: MOVC A,@A+PC RET

DB 0,3,3,6,1,4,6,2,5,0,3,5

31

本文来源:https://www.bwwdw.com/article/gwo7.html

Top