万年历单片机课程设计报告

时间:2019-05-15 00:20:26下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《万年历单片机课程设计报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《万年历单片机课程设计报告》。

第一篇:万年历单片机课程设计报告

课程设计报告 任务和设计要求

首先要学会安装软件,要熟悉会使用。系统设计 系统框图 硬件设计 3.1 电路原理图

课程设计报告

课程设计报告

课程设计报告

3.2 主要单元电路

3.3 元件清单 软件设计 4.1 程序流程图

课程设计报告

4.2程序清单

TIME_WEEK DATA 52H TIME_YEAR DATA 5DH TIME_MONTH DATA 5EH TIME_DATA DATA 5FH YEARH DATA 36H YEAR DATA 35H MONTH DATA 34H DAY DATA 33H HOUR DATA 32H MINUTE DATA 31H SEC DATA 30H

课程设计报告

AAA BIT P3.0 BBB BIT P3.1 AA BIT P3.3 BB BIT P3.4 CC BIT P3.5 BL BIT P3.2 BZ1 BIT 21H.0 TIMES DATA

20H COM

DATA

P1 ORG

0000H LJMP

START ORG

0003H RETI ORG

000BH LJMP INTT0 ORG

0013H RETI ORG

001BH RETI ORG

0023H RETI START:

课程设计报告

MOV

R0,#30H MOV

R7,#9 CLEETE: MOV

@R0,#00H INC

R0 DJNZ

R7,CLEETE MOV

TIMES,#00H MOV

TMOD,#01H MOV

TL0,#0C0H MOV

TH0,#63H 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 SETB

TR0 MOV

R4,#19 START1:

课程设计报告

CALL

DISP JNB

AA,SETMM1 JMP

START1 SETMM1: CALL

SETMM JMP START1 SETMM: CALL

DISP CALL

DISP JB AA,SETMM0 SETMM2: JNB AA,SETMM3 CLR ET0 CLR TR0 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 SETMM0: 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 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 INC000: JB

TIMES.0, INC001 JB

TIMES.1, INC002 JB

TIMES.2, INC003 JB

TIMES.3, INC004 JB

TIMES.4, INC005 JMP

INCOUT INC005: CJNE A, #99H, INCOUT MOV

A,#00H JMP

INCOUT INC004: CJNE A, # 13H, INCOUT MOV

A,#01H JMP

INCOUT

课程设计报告

INC003: CJNE A,# 32H ,INCOUT MOV

A,#01H JMP

INCOUT INC002: CJNE A,#24H,INCOUT MOV

A,#00H JMP

INCOUT INC001: CJNE A,# 60H , INCOUT MOV

A,#00H INCOUT: RET INTT0: PUSH

ACC PUSH

PSW ORL TL0,#0C0H MOV

TH0,#63H DJNZ R4 , CLKE111 JMP

LOOP11 CLKE111: JMP

CLKE

课程设计报告

LOOP11: MOV

R4,#19H 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 DB

30H,31H,30H DB

31H,31H,30H DB

00H,00H,00H DB

00H,00H,00H DB

31H,30H,31H CLK1: CLR C SUBB A,DAY JNC

CLKE MOV

A,MONTH CJNE A,#2,CLK3 MOV

A,YEAR ANL A,#13H JNB

ACC.4,CLK2

课程设计报告

ADD

A,#2 CLK2: ANL A,#3 JNZ

CLK3 MOV

A,DAY XRL A,#29H JZ

CLKE CLK3: MOV

DAY,#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 DISP99: MOV

R1,#40H MOV

R0,#30H MOV

R2,#9 DISP1: MOV A,@R0 ANL A,#0FH MOV @R1,A MOV A,@R0 SWAP A ANL A,#0FH INC R1 MOV @R1,A DJNZ R2,DISP2 CALL DISPLAY

课程设计报告

MOV R0,23H POP ACC POP PSW RET DISP2: INC R1 INC R0 JMP DISP1 DISPLAY: MOV R1,#40H MOV R5,#19 SETB AAA PLAY: SETB BBB NOP CLR BBB CLR AAA MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV COM,A CALL DL1MS

课程设计报告

MOV COM,#0FFH DJNZ R5,PLAY1 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 DL1MS: MOV 25H,R7 MOV 24H,R6 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 CONVERT_DATE DATA 37H TEMP_BYTE1 DATA 57H TEMP_BYTE2 DATA 58H TEMP_BYTE3 DATA 59H TEMP_BYTE4 DATA 5AH TEMP_BYTE5 DATA 5BH 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 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 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 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 MOV B, #32 DIV AB MOV TEMP_BYTE1,A MOV TEMP_BYTE2,B MOV TEMP_BYTE3,#0 MOV A,CONVERT_MONTH CJNE A,#10,CON_08 CON_08:JC CON_09 MOV TEMP_BYTE3,#1 CON_09:MOV A,CONVERT_YEAR ANL A,#03H JNZ CON_10 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 ADD A,B MOV TEMP_BYTE4,A JNC CON_14 INC TEMP_BYTE3 CON_14:MOV A,TEMP_BYTE1 LCALL GET_DAYS_LOW DEC A ADD A,TEMP_BYTE2 MOV TEMP_BYTE5,A 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

课程设计报告

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 MOV CONVERT_MONTH,#12 CLR F0 CLR A MOVC A,@A+DPTR ANL A,#0F0H SWAP A;MOV TEMP_BYTE4,A JZ CON_30 MOV A, #2 MOVC A , @A+DPTR

课程设计报告

MOV C, ACC.7 MOV A, #1 MOVC A, @A+DPTR RLC A SJMP CON_34 CON_30:MOV A, #1 MOVC A, @A+DPTR CON_34:MOV TEMP_BYTE5, A CON_40:MOV A, TEMP_BYTE5 RRC A MOV TEMP_BYTE5, A JC CON_42 MOV B, #29 SJMP CON_44 CON_42:MOV B, #30 CON_44:MOV A, TEMP_BYTE3 CLR C SUBB A, B JZ CON_46 JNC CON_50 CPL A INC A

课程设计报告

CON_46: INC A MOV B, #10 DIV AB SWAP A 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 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 CON_62:MOV CONVERT_MONTH, #1 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 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

课程设计报告

SJMP CON_74 CON_72:MOV B, #30 CON_74:MOV A, TEMP_BYTE4 CLR C SUBB A,B JNC CON_78 MOV B, A MOV A, TEMP_BYTE3 JZ CON_76 DEC TEMP_BYTE3 MOV TEMP_BYTE4, B SJMP CON_80 CON_76:MOV A, TEMP_BYTE4 LJMP CON_46

CON_78:MOV TEMP_BYTE4, A CON_80:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE5, CON_82 CPL F0 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 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;2090

课程设计报告

DB 00DH, 053H, 049H;2100 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 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

课程设计报告

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 MOV A ,TEMP_BYTE1 ANL A, #03H JNZ GETW10 MOV A, TEMP_BYTE2 CJNE A, #3,GETW06 GETW06: JNC GETW10 DEC TEMP_BYTE3 GETW10: MOV A,TEMP_BYTE2 LCALL GET_CORRECT ADD A, TEMP_BYTE1 MOV B, #7 DIV AB

MOV A, TEMP_BYTE1

课程设计报告

ANL A, #0FCH RR A RR A ADD A, B ADD A, TEMP_BYTE3 MOV B, #7 DIV AB MOV A, B CJNE A, #0,OUTOUT MOV B, #8 OUTOUT: 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 END 系统仿真及调试

课程设计报告 仿真结果及分析

课程设计报告

上图为运行时的显示,左边两个数码管显示器显示的是年、月、日,中间的显示的是时、分、秒,右边显示的是农历日期以及星期。若想要调试时间,可通过右下方两个并联开关调试,左边开关调试数码管显示位置,右边的调试增1。此刻是2013年11月29日下午15:02,星期五,时间准确。训练体会

在整个单片机课程设计中,想要做出这个完整的设计过程,必须突破几个难点:

1、元件得找准却,6路驱动可以用74LS244代替。

2、连线不能连错,对应的输入输出端标上序号。

3、程序代码不能敲错。

4、由于单管显示的星期数不稳定,可以采用双管显示。参考文献:单片机课程设计指导。

第二篇:单片机课程设计-电子万年历

单片机及接口技术综合实验

——————电子万年日历系统一、题目:电子实时时钟/万年日历系统

二、功能要求:

1. 基本要求:

⑴ 显示准确的北京时间(时、分、秒),可用24小时制式; ⑵ 随时可以调校时间。

2. 发挥要求:

⑴ 增加公历日期显示功能(年、月、日),年号只显示最后两位; ⑵ 随时可以调校年、月、日;

⑶ 允许通过转换功能键转换显示时间或日期。

三、方案考虑:

1、硬件方案:

⑴ 显示器采用6位LED数码管(共阳),可分别显示时间或日期;(通过KB键可切换)⑵ 显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码!⑶采用“一键多用方案”,以减少按键数目。本方案只采用了两个按键 ⑷ 整体上要考虑:结构简单、布局美观、操作方便、成本低廉。

2、设计电路图如下:

3、元件清单:

⑴ 89C51

1个

⑵ IC座(40脚)

3个(其中1个用于接插89C51、2个用于接插LED段数码管)。⑶ 74LS244

1个(用于驱动6个共阳的LED段数码管)。⑷ IC座(20脚)

1个(用于接插74LS244)。(5)显示器:LED_8段数码管(共阳型)6个三极管:

(6)PNP(8550)

6个(用于驱动6个共阳型LED段数码管)。

(7)微型开关:

3个(其中1个用于复位电路、其它用于键盘)。(8)晶体振荡器(12MHz):1个(用于振荡电路)。(9)电阻器:

⑴ 3KΩ

1个(用于系统复位电路)。

⑵ 1KΩ

6个(用作PNP三极管基极电阻)。⑶ 100Ω

7个(驱动器用作74LS244输出限流电阻)。(10)电容器:

⑴ 10μF

1个(用于系统复位电路)。⑵ 30 pF

2个(用于系统振荡电路)。(11)其它:

⑴ 万能电路板(10×15):

1块 ⑵ 焊锡条:

2米 ⑶ 带插头、座的电源端子:

1条 ⑷ 各种颜色外皮的导线:

各1米(12)工具:

1.电烙铁:

1把 2.剪钳:

1把 3.镊子:

1把 4.万用表:

1个(13)设备:

编程器(MEP300或TOP851)

6个

4、软件方案:

只使用第一组工作寄存器,功能分布如下:

⑴ “时钟”基准时间由单片机内部定时中断来提供,定时时间应该乘以一个整数得到“秒”,且不宜太长或太短,最长不能超过16位定时器的最长定时时间,最短不能少于定时中断服务程序的执行时间。一般来说,基准时间越短,越有利于提高时钟运行的精确度。本实验定时5mS。乘以一个整数200得到“1秒”.⑵ 用一个计数器(R4)对定时中断的次数进行计数,从而可以实现“秒”定时,同理可以实现“分”定时和“时”定时,甚至于“日”、“月”、“年”定时。

⑶ 显示器采用动态驱动时要注意到:LED的 “启辉时间”和 “余辉时间”。驱动信号的维持时间必须大于启辉时间;而驱动信号的间歇时间必须小于余辉时间。“启辉时间”和 “余辉时间”与驱动电流的大小有关,驱动电流越大,启辉时间越短,而余辉时间越长。但是,驱动电流的大小受到驱动电路的驱动能力和LED极限功耗的限制。本实验采用了74ls244和晶体管8550驱动,并进行适当的延时3ms解决上述问题。

⑷ LED的余辉时间使动态驱动显示得到保证,但也要注意到它在更新显示内容时,可能造成显示字符的混乱模糊。为此,在把“更新显示内容”写入显示器之前,必须把所有的LED熄灭,即要把一个“熄灭驱动信号”先写入显示器。

⑸对于按键的处理,采用中断。产生中断后先判有无按键被按下,还要考虑到“去抖动影响”问题,可采用软件延迟法解决这个问题,延迟时间至少10mS。而单纯进行软件延时的话会令到显示管产生断续的情况,故调用显示程序作为延时时间。这样就合理地处理好这两者的矛盾了。

⑹ 把键盘的按键分两种情况来处理,操作简单。

调整时间时,先按下KA键,(KA键为选择调整位置的键,如选调整秒或分),而此时的KB键只是用来加一操作。在调整时间状态下,若在十秒内检测到没有任何按键按下,则返回正常显示时钟状态。

而不调整时间,即不按下KA键,KB的键只用来切换显示日期和时钟。⑺ 对于自动识别“月大、月小”和“平年、闰年”的问题,主要考虑: ① 月大、月小:

1~7月:逢单月为31天;逢双月为30天,其中2月另行处理。8~12月:逢单月为30天;逢双月为31天。②平年、闰年:

仅仅处理2月份的天数:平年的2月份天数为28天,闰年的2月份天数为29天。

5、程序流程图如下:(1)电子时钟计算程序图

(2)调整流程图

程序编写如下:

;///////////////////////////////////////////////////////// ORG 0000H

LJMP START ORG 0003H LJMP PROINT0

;int0用来切换时钟调整位置

ORG 0013H

;用来调整时间,只加不减 LJMP PROINT1

ORG 001BH

;5ms的延迟,计数200次则为1秒

LJMP PROTIME

ORG 0030H

;主程序

TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

;0 1 2 3 4 5 6 7 8 9

ORG 0050H

START: MOV TCON,#05H

;中断初始化

MOV IE ,#8DH MOV TMOD,#10H MOV TH1,#0eCH

;定时器初始化

MOV TL1,#78H

MOV 31H,#0AH

;10秒 MOV 32H,#1EH;30分 MOV 33H,#09H;9点 MOV 34H,#0AH MOV 35H,#06H MOV 36H,#05H MOV 37H,#14H

;10号;6月;2005年

;R7 存放切换标志 0 NORMAL , 1 HOUR ,2 MINUTE ,3 SECOND ,4 YEAR,5 MONTH,6 DAY

MOV R1,#00H

;确定在调时不按键的最长时间,10秒后返回normal状态

MOV R7,#00H

;切换标志

MOV 40H,#00H

;十六进制转换BCD的高位 MOV 41H,#00H

;十六进制转换BCD的低位

MOV R6,#00H

;调时的位闪烁的时间间隔

MOV R4,#00H

;用来计数5ms的中断次数,200次则一秒

mov r3,#00h

SETB TR1

;开始计时 AGAIN:

ACALL PROSHOW

;显示

AJMP AGAIN

PROSHOW:

CJNE R3,#00H,SHOWDATE

;如果r3等于1就显示日期,等于0就显示时钟 CJNE R7,#04H,DATE1

;显示程序

AJMP SHOWDATE

;showdate显示年月日 AJMP SHOWDATE DATE1: CJNE R7,#05H,DATE2 DATE2: CJNE R7,#06H,SHOWCLOCK AJMP SHOWDATE

showCLOCK: MOV R0,33H

;showclock显示时分秒,先显示时

ACALL PROHTOD

CJNE R7,#01H,CLK1 INC R6

CJNE R6,#03H,CLK2

;若处于调时状态,则该位闪烁

MOV R6 ,#00H CLK1: clr P2.4 mov a,41H MOV P0, a

;显示时的低位 ACALL DELAY3MS CLK2: SETB P2.4 CLR P2.5 mov a,40H

MOV P0,a

;显示时的高位 ACALL DELAY3MS SETB P2.5

MOV R0,32H

;显示分 ACALL PROHTOD CJNE R7,#02H,CLK3 INC R6

CJNE R6,#03H,CLK4

;若处于调时状态,则该位闪烁

MOV R6,#00H CLK3: CLR P2.2

mov a,41H MOV P0, a

;显示分的低位 ACALL DELAY3MS CLK4:

SETB P2.2 CLR P2.3 mov a,40h MOV P0,a

;显示分的高位 ACALL DELAY3MS SETB P2.3

MOV R0,31H

;显示秒

ACALL PROHTOD CJNE R7,#03H,CLK5 INC R6

CJNE R6,#03H,CLK6

MOV R6,#00H CLK5: CLR P2.0 mov a,41H MOV P0, a

ACALL DELAY3MS CLK6: SETB P2.0 CLR P2.1 mov a,40h MOV P0,a

ACALL DELAY3MS SETB P2.1

RET

SHOWDATE: MOV R0,36H

ACALL PROHTOD CJNE R7,#04H,DAY1 INC R6

CJNE R6,#03H,DAY2

MOV R6,#00H DAY1: CLR P2.4 MOV P0,41H

ACALL DELAY3MS DAY2: SETB P2.4 CLR P2.5 MOV P0,40H

ACALL DELAY3MS SETB P2.5

MOV R0,35H

ACALL PROHTOD CJNE R7,#05H,MONTH1

;若处于调时状态,则该位闪烁

;显示秒的低位

;显示秒的高位

;显示年

;若处于调时状态,则该位闪烁;显示年的低位

;显示年的高位

;显示月

INC R6

CJNE R6,#03H,MONTH2

;若处于调时状态,则该位闪烁

MOV R6,#00H MONTH1: CLR P2.2 MOV P0,41H

;显示月的低位

ACALL DELAY3MS MONTH2: SETB P2.2

CLR P2.3 MOV P0,40H

;显示月的高位

ACALL DELAY3MS SETB P2.3

MOV R0,34H

ACALL PROHTOD CJNE R7,#06H,YEAR1 INC R6

CJNE R6,#03H,YEAR2

MOV R6,#00H YEAR1: CLR P2.0

MOV P0,41H

ACALL DELAY3MS YEAR2: SETB P2.0 CLR P2.1 MOV P0,40H

ACALL DELAY3MS SETB P2.1

RET

PROHTOD:PUSH ACC

MOV A,R0 MOV B,#0AH DIV AB MOV DPTR,#0030H MOVC A,@A+DPTR MOV 40H,A MOV A,B MOVC A,@A+DPTR MOV 41H,A POP ACC RET

;显示日

;若处于调时状态,则该位闪烁

;十六进制数转换成bcd码,且可以直接输出p0口

DELAY3MS:

;DELAY3MS MOV 45H,#08H DELAY1: MOV 46H,#0FFH DELAY2: DJNZ 46H,DELAY2 DJNZ 45H,DELAY1 RET

PROINT0:

CLR EX0

;切换键中断程序 MOV R3,#00H ACALL PROSHOW MOV C,P3.2 JC IEXIT0 MOV R1,#00H INC R7 CJNE R7,#07H,IEXIT0

MOV R7,#00H INT01: MOV C,P3.2 JC INT02 ACALL PROSHOW AJMP INT01 INT02: ACALL PROSHOW IEXIT0: SETB EX0 RETI

PROINT1:CLR EX1

ACALL PROSHOW MOV C,P3.3 JC IEXIT1 LCALL ISYEAR

;判断平年闰年

LCALL ISMONTH

;判断月份,确定最大日数

MOV R1,#00H CJNE R7,#00H,NEXT1

;若不是调时状态,按此键就是切换显示日期、时钟

INC R3 CJNE R3,#02H,IEXIT1 MOV R3,#00H AJMP IEXIT1 NEXT1: mov r3,#00h

CJNE R7,#03H,NEXT2

;修改秒位 INC 31H MOV A,31H CJNE A,#3CH,INT11

;遇60变0 MOV 31H,#00H AJMP IEXIT1

NEXT2: CJNE R7,#02H,NEXT3

;修改分位

INC 32H MOV A,31H

CJNE A,#3CH,INT11

;遇60变0 MOV 31H,#00H AJMP IEXIT1 NEXT3: CJNE R7,#01H,NEXT4

;修改时位

INC 33H MOV A,33H CJNE A,#18H,INT11

;遇24变0 MOV 33H,#00H AJMP IEXIT1 NEXT4: CJNE R7,#06H,NEXT5

;修改日

INC 34H MOV A,34H CJNE A,49H,INT11

;到月底就返回月初 MOV 34H,#01H AJMP IEXIT1

NEXT5: CJNE R7,#05H,NEXT6

;修改月

INC 35H

MOV A,35H CJNE A,#0DH,INT11

;十二月过后就跳回1月 MOV 35H,#01H AJMP IEXIT1 NEXT6: CJNE R7,#04H,INT11

;修改年

INC 36H

MOV A,36H CJNE A,#64H,INT11

MOV 36H,#00H MOV C,P3.3 INT11: JC INT12 ACALL PROSHOW AJMP INT11 INT12: ACALL PROSHOW IEXIT1: setb EX1

RETI PROTIME:

MOV TMOD,#10H MOV TH1,#3CH

;定时器初始化 MOV TL1,#60H setb tr1 INC R4

CJNE R4,#0c8H,EXIT

MOV R4,#00H

;计满1秒则清零 CJNE R7,#00H,DIAOSHI

AJMP NORMAL DIAOSHI:INC R1

;调时不按键的最长时间为10秒,在此期间又键按下重新计时

CJNE R1,#0AH,EXIT MOV R7,#00H

;到10秒则返回正常显示状态 MOV R1,#00H AJMP EXIT

NORMAL:ACALL ISYEAR

;判断平闰年,返回标志48h,0为平年,1为闰年

ACALL ISMONTH

;判断哪个月,返回该月的最大日数,存放在49h

INC 31H

MOV A,31H

;秒加一 CJNE A,#3CH,EXIT MOV 31H,#00H

INC 32H

;分加一 MOV A,32H CJNE A,#3CH,EXIT MOV 32H,#00H INC 33H

;时加一 MOV A,33H CJNE A,#18H,EXIT MOV 33H,#00H INC 34H

MOV A,34H CJNE A,49H,EXIT MOV 34H,#01H INC 35H

MOV A,35H CJNE A,#0DH,EXIT MOV 35H,#01H INC 36H

MOV A,36H CJNE A,#64H,EXIT MOV 36H,#00H;年加一;月加一;日加一 EXIT:

RETI

ISYEAR: MOV A,36H;判断平闰年

MOV B,#04H

DIV AB MOV A,B CJNE A,#00H,EXITYEAR1 MOV 48H,#01H

;闰年 SJMP EXITYEAR MOV 48H,#00H

;平年 EXITYEAR1: EXITYEAR: RETI

ISMONTH:

MOV A,35H

;开始检查月份 CJNE A,#02H,NEXTMON1

;判断二月 MOV R2,48H

CJNE R2,#00H,RUNNIAN MOV 49H,#1DH

;平年为28天,赋29给49h AJMP EXITMONTH RUNNIAN:MOV 49H,#1EH

;闰年为29天,赋30天给49h

AJMP EXITMONTH

NEXTMON1: CJNE A,#04H,NEXTMON2

AJMP XIAOYUE

NEXTMON2:CJNE A,#06H,NEXTMON3 AJMP XIAOYUE

NEXTMON3:CJNE A,#09H,NEXTMON4 AJMP XIAOYUE NEXTMON4:CJNE A,#0BH,DAYUE XIAOYUE: MOV 49H,#1FH

;四,六,九,十一月是小月,30天,但应该赋31天给比较值49h,AJMP EXITMONTH DAYUE: MOV 49H,#20H

;其他月份为大月,31天,赋32天给49h EXITMONTH: RETI END

第三篇:EDA万年历课程设计报告

《EDA技术及其应用》

实 训 报 告

班 级 姓 名 学 号 指导教师

目 录

一 设计要求......................................2

1.0 设计目的及意义.................................2 1.1 设计要求.......................................2

二 设计流程:....................................2

2.0 原理框图.......................................2 2.1 VHDL设计思路...................................3

三 VHDL程序......................................3

3.0 天计数模块......................................6 3.1 月计数模块.....................................7 3.2 年计数模块......................................9 3.3 调时控制模块..................................11 3.4 译码模块......................................12 3.5 扫描模块........................................12

四 心得体会.....................................14 4.0................................................14 五 附录...........................................15 5.0 顶层文件......................................15

一、设计目的及意义

1.0 设计目的及意义

在掌握EDA理论知识的基础上进一步了解EDA开发软件QuartusII的使

entity tian is port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end tian;

architecture one of tian is

signal q1:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);signal ab:std_logic_vector(1 downto 0);begin

process(clk,pan)

begin

if clk'event and clk='1'

then q1<=q1+1;

if q1=9 then q1<=“0000”;q2<=q2+1;

end if;case pan is when “00”=> if q2=3 and q1=1 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';

end if;when “01”=> if q2=3 and q1=0 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';

end if;when “10”=> if q2=2 and q1=8 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';

end if;when “11”=> if q2=2 and q1=9 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';

end if;when others=>null;end case;end if;end process;T1(3 downto 0)<=q1;T1(6 downto 4)<=q2;end one;3.1 月计数模块

when others=>null;end case;end if;Y1(3 downto 0)<=q1;Y1(6 downto 4)<=q2;end process;end behav;

3.2 年计数模块

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity nian is port(clk :in std_logic;n1:out std_logic_vector(6 downto 0);

run:out std_logic);end entity;

architecture one of nian is signal q1,q3:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);

begin process(clk)

begin if clk'event and clk='1' then

q1<=q1+1;q3<=q3+1;

if q1=9 then q2<=q2+1;q1<=“0000”;end if;if q3=3 then q3<=“0000”;run<='1';else run<='0';end if;

if q1=9 and q2<=7 then q1<=“0001”;q2<=“000”;end if;

end if;end process;

sel:out std_logic_vector(2 downto 0));end seltime;architecture fun of seltime is signal count:std_logic_vector(2 downto 0);begin sel<=count;process(clk1)begin if(clk1'event and clk1='1')then if(count>=“101”)then count<=“000”;else count<=count+1;end if;end if;case count is when “000”=>daout<=tian(3 downto 0);dp<='0';when“001”=>daout(3)<='0';daout(2 downto 0)<=tian(6 downto 4);dp<='0';when “010”=>daout<=yue(3 downto 0);dp<='1';when“011”=>daout(3)<='0';daout(2 downto 0)<=yue(6 downto 4);dp<='0';when “100”=>daout<=nian(3 downto 0);dp<='1';when others=>daout(3 downto 2)<=“00”;daout(2 downto 0)<=nian(6 downto 4);dp<='0';end case;end process;end fun;

3.5 译码模块

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity led is port(ledi:in std_logic_vector(3 downto 0);ledo:out std_logic_vector(6 downto 0));

次万年历实训我们是四个人作为一个团队,在实训过程中,有时候一个人在编写程序时出现一点很小的错误(例如:程序中少了一个分号或者少了一个字母)就会导致整个程序编译不能通过,而四个人在一起,出现错误时一起去寻找,总会有一个人及时发现错误的,发现后及时纠正错误,然后继续开展下面的工作。这样三个人互相协作,共同努力,各自发挥自身的优势,这样工作便能顺利的进行下去,如果是一个人单独去完成,在出现错误的时候自己要想发现错误便需要很长的时间才能发现,这样很浪费时间,浪费时间的结果就是直接导致工作效率低。而在如今的社会工作中,许多公司企业都要求应聘者要有很好的团队合作精神,工作时要有高效的工作效率。因此,在这次实训中我也切身体会到了团队合作的重要性。

实训是对每个学生综合能力的检验是让我们能够更好的巩固专业知识,积累工作经验,掌握工作技能。通过这次实训,让我深深的体会到要想做好每一件事情,除了自己平时要有一定的专业知识外,还需要一定的实践动手能力,操作能力,说实话,这次实训让我学到了很多东西,也明白了很多事情。在此还要感谢王老师耐心、认真的指导。谢谢薛老师!

五、附录

5.0 顶层文件

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nianli is port(clk,clkdsp:in std_logic;k1,k2:in std_logic;dpout,d10,d20:out std_logic;ledout :out std_logic_vector(6 downto 0);sel1:out std_logic_vector(2 downto 0));

end entity;architecture one of nianli is component tian port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end component;component yue port(clk,run:in std_logic;cout:out std_logic;pan:out std_logic_vector(1 downto 0);

第四篇:单片机万年历实训报告

单片机万年历实训报告

部:电气自动化系

级:13电信2班

名:周祝福

指导老师:黄丽英、侯聪玲

实训时间:2015年1月19日~23日

用AT89C51与LCD1602设计 的可调式电子日历时钟

一、总体设计

1.1、设计目的

为巩固所学的单片机知识,把所学理论运用到实践中,用LCD1602与AT89C51 设计可调式电子日历时钟。

1.2、设计要求

(1)显示:年、月、日、时、分、秒和星期;

(2)设置年、月、日、时、分、秒和星期的初始状态;

(3)能够用4个按键调整日历时钟的年、月、日、时、分、秒和星期 ;

完成可调式电子日历时钟的硬件和软件的设计,包括单片机的相关内容;日历时钟模块的设计,液晶显示模块的设计,按键模块的设计。控制程序的编写等。

1.3、系统基本方案选择和论证

1.3.1、单片机芯片的选择方案

方案一:

采用89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容。方案二:

采用STC12C5A60S2系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合。但造价较高。1.3.2、显示模块选择方案和论证:

方案一:

采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用显示数字显得太浪费,且价格也相对较高。所以不用此种作为显示。方案二:

采用LED数码管动态扫描,虽然LED数码管价格适中,但要显示多个数字所需要的个数偏多,功耗较大,显示出来的只是拼音,而不是汉字。所以也不用此种作为显示。方案三:

采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量字符,且视觉效果较好,外形美观。LCD1602可实现显示2行十六个字符。1.3.4、电路设计最终方案决定

综上各方案所述,对此次作品的方案选定:采用80C51作为主控制系统; LCD1602液晶带汉字库显示屏作为显示部分。

二、硬件设计

2.1、电路设计模块图如图

AT89C51 块按键控制模LCD162

2.3、用proteus仿真软件仿真并抓图。

三、软件设计

3.1、画出各个函数流程图。

3.1.1、LCD1602液晶显示控制流程图如图

入口 对1602初始化写入显示设置命令 延时一段时间 检查忙标志 BF= 7>? 设置字符显示位置 延时一段时间 向1602中写入数据 LCD显示内容 返回主程序

是 3.1.2、调时函数控制流程如图

开始 控制键有效,调整年 控制键有效,调整月 等待按键程序 等待按键程序 加有效 减有效 加有效 减有效 年加 1 年减 1 月加 1 月减 1 控制键有效,调整日 控制键有效,调整星期 等待按键程序 等待按键程序 加有效 减有效 加有效 减有效 日加 1 日减 1 星期加 1 星期减 1 控制键有效,调整时 等待按键程序 加有效 时加 1 减有效 时减 1 控制键有效,调整分 等待按键程序 加有效 分加 1 减有效 分减 1 按键有效跳出调时程序,进入主循环

实训心得:通过为期一周的单片机实训,是我们对这门课有了许多新的了解,弥补了在课堂上学习的不足。相信这对我们以后的学习和工作都会有很大的帮助。我们一定要在最短的时间里对这些不足加以改正!在试训中有苦有甜,当我们为一个很难攻破的程序找出路时,心情烦躁,感觉自己很不可理喻,当程序一点一点编好后,自己从心底感觉到一点小小的安慰,看着自己的成果。感觉很欣慰。总而言之,单片机课程设计对于我们有很大的帮助,我们从中受益匪浅。

程序代码。

#include #define uchar unsigned char #define uint unsigned int

uchar a,count,S1num,xqnum;uchar yue,ri,shi,fen,miao;uint nian;

sbit lcdrs=P2^5;sbit lcdrw=P2^4;sbit lcden=P2^3;

sbit S1=P3^0;

//定义键--进入设置 sbit S2=P3^1;

//定义键--增大 sbit S3=P3^2;

//定义键--减小 sbit S4=P3^3;

//定义键--退出设置

uchar code table0[]=“2015-01-11 SUN”;uchar code table1[]=“00:00:00”;uchar code xingqi[][3]={“MON”,“TUE”,“WED”,“THU”,“FRI”,“SAT”,“SUN”};

void delay(uint z){ uint x,y;for(x=z;x>0;x--)

for(y=110;y>0;y--);}

/************************************************** 1602液晶显示器模块

*************************************************/ void write_com(uchar com)

//液晶写指令 { lcdrw=0;lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}

void write_data(uchar dat)

//液晶写数据 { lcdrw=0;lcdrs=1;P0=dat;delay(5);lcden=1;delay(5);lcden=0;}

/******************************************** 年月日写入1602函数

********************************************/ void write_sfm(uchar add,uchar dat)

//写时分秒函数 { uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+0x40+add);write_data(0x30+shi);write_data(0x30+ge);} void write_yr(uchar add,uchar dat)

//写月日函数 { uchar shi,ge;shi=dat/10;ge=dat%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);} void write_nian(uchar add,uint dat)

//写年函数 { uint qian,bai,shi,ge;qian=dat/1000;bai=dat%1000/100;shi=dat%100/10;ge=dat%10;write_com(0x80+add);write_data(0x30+qian);write_data(0x30+bai);write_data(0x30+shi);write_data(0x30+ge);} /*************************************************** 1602初始化

***************************************************/ void init_lcd()

//液晶初始化 { lcden=0;

nian=2015;yue=1;ri=11;shi=0;

//初始shi、fen、miao fen=0;miao=0;

write_com(0x38);

//设置16x2显示,5x7点阵,8位数据口

write_com(0x0c);

//设置开显示,不显示光标

write_com(0x06);

//写一个字符后地址指针加1 write_com(0x01);

//显示清0,数据指针清0 }

void init()

//初始化函数 { init_lcd();

//液晶初始化

write_com(0x80);

//设置显示初始坐标

for(a=0;a<14;a++)

//显示年月日初始值

{

write_data(table0[a]);

delay(5);} write_com(0x80+0x40);

//设置显示初始坐标

for(a=0;a<8;a++)

//显示时分秒初始值

{

write_data(table1[a]);

delay(5);}

write_nian(0,nian);write_sfm(6,miao);

//分别将shi、fen、miao送去液晶显示

write_sfm(3,fen);write_sfm(0,shi);

count=0;xqnum=0;S1num=0;

//初始化全局变量count

TMOD=0x01;

//设置定时器0工作模式1 TH0=(65535-50000)/256;

//定时器装初始值

TL0=(65535-50000)%256;EA=1;

//开总中断

ET0=1;

//开定时器0中断

TR0=1;

//启动定时器0 }

/************************************************** 独立键盘

*************************************************/ void keyscan(){ if(S1==0){

delay(5);

//确认定义键被按下

if(S1==0)

{

S1num++;

//定义键S1按下次数记录

while(!S1);

//释放按键确认

if(S1num==1)//S1按下一次时

{

TR0=0;

//关闭定时器

write_com(0xc0+7);//光标定位到秒位置

write_com(0x0f);//光标闪烁

}

if(S1num==2)

//S1按下两次时

{

write_com(0xc0+4);//光标定位到分位置

}

if(S1num==3)

//S1按下三次时

{

write_com(0xc0+1);

//光标定位到时位置

}

if(S1num==4)

//S1按下四次时

{

write_com(0x80+13);

//光标定位到星期位置

}

if(S1num==5)

//S1按下五次时

{

write_com(0x80+9);

//光标定位到日位置

}

if(S1num==6)

//S1按下六次时

{

write_com(0x80+6);

//光标定位到月位置

}

if(S1num==7)

//S1按下七次时

{

write_com(0x80+3);

//光标定位到年位置

}

if(S1num==8)

//S1按下八次时

{

S1num=0;

//S1记录按键次数清零

TR0=1;

//开启定时器

write_com(0x0c);

//取消光标闪烁

} } } if(S1num!=0)

//只有定义键按下后S2、S3、S4才有效 { if(S2==0){

delay(5);

//防抖

if(S2==0)

//确认按键被按下

{

while(!S2);

//释放按键确认

if(S1num==1)//S1按下一次时

{

miao++;

//调整秒加1

if(miao==60)//满60清零

miao=0;

write_sfm(6,miao);

//每调节一次送液晶显示一次

write_com(0x80+0x40+6);

//显示位置重新回到调节处

}

if(S1num==2)

//S1按下两次时

{

fen++;

//调整分加1 if(fen==60)

fen=0;write_sfm(3,fen);write_com(0x80+0x40+3);} if(S1num==3)

//S1按下三次时 { shi++;

//调整时加1 if(shi==24)

shi=0;write_com(0x80+0x40);write_sfm(0,shi);} if(S1num==4)

{ xqnum++;if(xqnum==7)

xqnum=0;write_com(0x80+0x0b);for(a=0;a<3;a++){

write_data(xingqi[xqnum][a]);

delay(5);} } if(S1num==5)

{ ri++;if(yue==2){

if(nian%400==0)

{

if(ri==30)

{

ri=1;

}

}

if(nian%400!=0)

{

if(ri==29)

{

ri=1;

}

//星期加调整

//日加调整

} } else if(yue<=7){

if(yue%2==0&yue!=2)

{

if(ri==31)

{

ri=1;

}

}

else if(yue%2!=0&yue!=2)

{

if(ri==32)

{

ri=1;

}

} } else if(yue>=8){

if(yue%2==0)

{

if(ri==32)

{

ri=1;

}

}

else if(yue%2!=0)

{

if(ri==31)

{

ri=1;

}

} } write_yr(8,ri);} if(S1num==6)

{ yue++;if(yue==13)

yue=1;write_yr(5,yue);

//月加调整

}

if(S1num==7)

//年加调整

{

nian++;

if(nian==2019)

nian=2014;

write_nian(0,nian);

} } } if(S3==0){ delay(5);if(S3==0)

//确认按键被按下

{

while(!S3);

if(S1num==1)

{

miao--;

//调整秒减1

if(miao==-1)

//减到00后再减重新设置为59

miao=59;

write_sfm(6,miao);

write_com(0x80+0x40+6);

}

if(S1num==2)

{

fen--;

//调整分减1

if(fen==-1)

fen=59;

write_sfm(3,fen);

write_com(0x80+0x40+3);

}

if(S1num==3)

{

shi--;

//调整时减1

if(shi==-1)

shi=23;

write_sfm(0,shi);

write_com(0x80+0x40);

}

if(S1num==4)

{

xqnum--;

//调整星期减一

if(xqnum==-1)

xqnum=6;write_com(0x80+0x0b);for(a=0;a<3;a++){

write_data(xingqi[xqnum][a]);

delay(5);} } if(S1num==5)

//调整日 { ri--;

if(yue==2){

if(nian%400==0)

{

if(ri==0)

{

ri=29;

}

}

if(nian%400!=0)

{

if(ri==0)

{

ri=28;

}

} } else if(yue<=7)

{

if(yue%2==0&yue!=2)

{

if(ri==0)

{

ri=30;

}

}

else if(yue%2!=0&yue!=2)

{

if(ri==0)

{

ri=31;

}

}

}

else if(yue>=8)

{

if(yue%2==0)

{

if(ri==0)

{

ri=31;

}

}

else if(yue%2!=0)

{

if(ri==0)

{

ri=30;

}

}

}

write_yr(8,ri);

}

if(S1num==6)

{

yue--;

if(yue==0)

yue=12;

write_yr(5,yue);

}

if(S1num==7)

{

nian--;

if(nian==2013)

nian=2018;

write_nian(0,nian);

} } } if(S4==0)

{ delay(5);if(S4==0){

S1num=0;

TR0=1;

write_com(0x0c);

//调整月

//调整年

//退出设置、开启中断

}

} } }

/************************************************** 定时器0 *************************************************/ void timer0()interrupt 1

//定时器0中断服务程序 { TH0=(65535-50000)/256;

//重装定时器初始值

TL0=(65535-50000)%256;count++;

//中断次数累加

if(count==20)

//20次50毫秒即一秒

{

count=0;

miao++;

if(miao==60)

//秒加到60时分进位

{

miao=0;

fen++;

if(fen==60)

//分加到60时时进位

{

fen=0;

shi++;

if(shi==24)

//时加到24时清0

{

shi=0;

xqnum++;

ri++;

if(yue==2)

//如果是二月

{

if(nian%400==0)

//闰年判断

{

if(ri==30)

{

ri=1;

yue++;

write_yr(5,yue);

}

}

if(nian%400!=0)

//平年判断

{

if(ri==29)

{

ri=1;

yue++;

write_yr(5,yue);

}

}

}

else if(yue<=7&yue!=2)

//一月到七月

{

if(yue%2==0)//偶数月(除二月)

{

if(ri==31)

{

ri=1;

yue++;

}

}

else if(yue%2!=0)

//奇数月

{

if(ri==32)

{

ri=1;

yue++;

}

}

write_yr(5,yue);

}

else if(yue>=8)

//八月到12月

{

if(yue%2==0)//偶数月(除二月)

{

if(ri==32)

{

ri=1;

yue++;

if(yue==13)

//如果判断月份为12月,则加一后重新定义月份为1

{

yue=1;

nian++;

write_nian(0,nian);

}

write_yr(5,yue);

}

}

else if(yue%2!=0)

//奇数月

{

if(ri==31)

{

ri=1;

yue++;

write_yr(5,yue);

}

}

}

write_yr(8,ri);

if(xqnum==7)

//星期写入

xqnum=0;

write_com(0x80+0x0b);

for(a=0;a<3;a++)

{

write_data(xingqi[xqnum][a]);

delay(5);

}

}

write_sfm(0,shi);

//重新写入数据

}

write_sfm(3,fen);

//重新写入数据

}

write_sfm(6,miao);

//重新写入数据

} } /************************************************* 主函数

*************************************************/ void main(){ init();while(1){

keyscan();

//不停的检测按键是否被按下

} }

第五篇:万年历C语言课程设计报告

程序实践报告

任务分配:

1、头文件,定义常量,全局变量,自定义函数和打印输出模块。即1~50和140~290

2、功能控制模块和一部分日历显示模块,即50~140和290~400

3、一部分日历显示模块和键值获取模块,即400~

1、基本思路

功能模块图

本系统包括4个模块,分别是功能控制模块、打印输出模块、日历显示模块和键值获取模块。(1)功能控制模块。该模块用于实现日期有效性检查、判断是否是闰年和返回指定日期对应的星期。

(2)打印输出模块。该模块主要是进行输出显示,包括打印指定个数的空格、打印分隔线、打印用户使用手册、打印当前日期对应的星期以及打印给定的星期。

(3)日历显示模块。该模块是系统的核心模块,是用来显示指定日期所在月份的月历。(4)键值获取模块。该模块接受键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。

日历显示模块

日历显示是系统的核心模块,它控制着日历的生成和显示。其实现流程如图所示。程序输入的是包含年月日(year,month和day)的日期,输出month所在月份的月历,并突出显示day所在的日期和year是否是闰年的标识。程序首先根据year判断其是否是闰年,如果是则需要将该年2月份的天数设置为29天,接着判断day是否超过month所在月份的最大天数,如果超过则显示系统日期所在的月历。然后进行星期输出的判断,如果输出的是该月的第一个星期,则判断该星期中还有几天在本月(如,该月1号是星期五,则表示该月第一个星期中只有两天在本月,星期一到星期四在上月,则星期一到星期四在本月就不输出,仅有空格表示),输出空格。输出完第一周后,接着输出第二到第五(或者六)周,每周7天。在输出过程中,如果遇到了day所在的日期,则突出显示。

键值获取流程图

键值获取实现的是从键盘调整日期并显示调整后的月历。其实现流程如图所示。系统首先判断从键盘输入的值,如果是右移键,表示增加月份。此时,如果当前月份是12月,则增加月份后就进入下一年的一月;如果是左移键,表示减少月份。此时,如果当前月份是1月,则减少月份后就进入上一年的12月;如果是上移键表示增加年份,直接年份加1即可;如果是下移键表示减少奶奶分,直接年份减1即可;如果是向上翻页键表示减小日期。如果是1月1号,则减少日期后进入上一年的12月31号,如果是某一个月的1号,则减小日期后进入上一月的最后一天;如果是向下翻页键表示增加日期。如果是12月31号,则增加日期后进入到下一年的1月1号,如果是某一个月的最后一天,则增加日期后进入到下一个月的第一天;如果是Q/q键表示查询日期,此时将输出提示信息,提示用户输入查询日期。在用户输入查询日期后,系统就爱那个调用日期检查函数对输入日期的合法性进行检测,如果输入日期不合格,则提示错误信息并显示当前系统日期所在月的月历;如果是空格键表示重置,显示当前系统日期所在月的月历;如果是Esc键表示退出系统,按此键后,系统将询问用户是否确定退出,在得到确定回答(用户输入Y/y)后将退出系统。

2、函数功能描述

1)checkDate()函数原型:void checkDate()checkDate()函数用于检查输入日期的合法性,包括检查输入日期中的年、月、日部分。对于

年,检查其是否是负数或者是0;对于月,检查其是否是范围在1~12中的值;对于日,检查其是否是范围在1~31中的值。如果有一个部分不合法,则程序提示用户。2)isLeapyear()函数原型:int isLeapyear(int year)isLeapyear()函数用于判断制定月份是否是闰年。参数year为待判断的年份。3)getWeek()函数原型:int getWeek(int year,int month,int day)getWeek()函数用于计算并返回给定日期对应的星期。其中参数year、month和day都为整型,分别表示输入的年、月和日。4)printSpace()函数原型:void printSpace(int n)printSpace()函数用于输出制定个数的空格。其中整型参数n表示需要输出的空格的个数。5)printSepatator()函数原型:void printSeparator()printSeparator()函数用于在制定位置输出用户使用手册。输出位置在函数中已经设定。7)printWeek()函数原型:void printWeek()printWeek()函数用于输出当前日期对应的星期,即由 currentYear,currentMonth和currentDay确定的日期对应的星期。该函数首先调用getWeek()函数返回当前日期对应的星期。8)printWeek2()函数原型:void printWeek2(int week)printWeek2()函数用于根据制定值输出星期。参数week是一个整型变量,其值可取0到6,分别表示星期一到星期日。8)showCalendar()函数原型:void showCalendar(int year,int month,int day)showCalendar()函数用于显示日历。参数year,month和day分别表示年、月和日。该函数显示year所在年是否是闰年,显示month所在月的月历,突出显示day所在日的日期。

10)getKeyValue()函数原型:void getKeyValue()getKeyValue()函数用于获取键盘的输入。根据键盘的输入(上下移键、左右移键、上下翻页键、Q/q键)调整当前日期,并显示当前日期所在月的月历等。

4、遇到的问题和相应的解决措施

1.dos.h头文件不能在常用的Visual C++里使用。若使用Turbo C,则键入的汉字无法显示,且无法复制粘贴。

解决措施:经过上网查询和询问同学,知道了导致问题的原因,但若把dos.h在visual c++中换成time.h,过程太复杂,很难实现。最后,我们跟同学借了一个win-TC,是C语言程序,且可以使用中文和进行复制粘贴;2.键入程序代码的时候显示“非法字符’?(0xa3)在showCalender函数中”

解决措施:把showCalender函数全部检查一遍也没有找出问题所在,然后咨询老师,经验丰富的老师一眼看出函数中的一个左括号是用拼音输出的,不是英文;3.程序可以运行,但应该只显示一个向下箭头的地方显示了三行,且覆盖了其他的字符。

解决措施:认真的又检查了一遍,发现“指定输出字符为向下的箭头”的函数中,_CX=01,写成了_CH=01;4.万年历需要获取系统时间,不知从何下手。

解决措施:经查阅资料,得知应用:currentYear=sysTime.da_year;

currentMnth=sysTime.da_mon;

currentDay=sysTime.da_day;

5、心得体会

经历了这次课程设计的设计和制作的整个过程,我们才发现我们知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,小case,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我们九牛二虎之力,不说其他的,只说时间上面,我们就花费了大把的时间,当然我们也从中体会了很多平时不能收获的东西。经过一个多月的自主上机和三个多星期的大作业编写,我们一队三人的齐心努力,查阅书籍,上网查询等各种途径,完成了这次的大作业编写。其中遇到了很多问题,一一解决的过程让我们学会了很多,当然有很多最初的构想没有实现,这也是我们的遗憾之处。

这次作课程设计我们也是收获很大,我们更深入的体会到团队的重要性,通过自学学到了更多C语言的编译,如插入颜色,读取系统时间等,这会是我们终身的财富。

首先,我们对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我们学会用了。其次,我们这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我们学到了一些书本中学不到的知识,让我们长了见识。同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。这次的万年历设计,虽然我们自己觉的很有的成就感,但是这必竟是我们第一次C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我们一定会做的更好。

同时也感谢老师们的耐心讲解与指导,我们期待下一次可以做的更好!

【程序代码】 /*加载头文件*/ #include #include #include #include #include #include #include

/*定义常量*/ /*左移键*/ #define LEFT 0x4b00 /*右移键*/ #define RIGHT 0x4d00 /*下移键*/ #define DOWN 0x5000 /*上移键*/

#define UP 0x4800 /*向上翻页键*/ #define PAGEUP 0x4900 /*向下翻页键*/ #define PAGEDOWN 0x5100 /*小写字母q*/ #define QLOWER 0x1071 /*大写字母Q*/ #define QUPPER 0x1051 /*空格键*/ #define SPACE 0x3920 /*Esc键*/ #define ESC 0x011b

/*定义全局变量*/ struct date sysTime;int currentYear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;

/*--------------------------自定义函数-------------------------*/ void checkDate();int isLeapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printSaparator();void printUsage();void printWeek();void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyValue();

welcome(){ int i, graphdriver,graphmode,size,page;char s[30];graphdriver=DETECT;initgraph(&graphdriver,&graphmode,“");cleardevice();setbkcolor(BLUE);

setviewport(40,40,600,440,1);setfillstyle(1,2);setcolor(YELLOW);rectangle(1,1,560,400);floodfill(50,50,14);rectangle(20,20,540,380);setfillstyle(1,13);

/*

开图视口

*/ /*

用绿色填画出的矩形框

*/

floodfill(2l,300,14);setcolor(BLACK);settextstyle(1,0,6);/*

用淡洋红色填画出的矩形框

*/ /*

设要显示字符串的字形方向,尺寸

*/ outtextxy(100,60,”Welcom you“);setviewport(100,150,540,380,0);/*

又开一窗口 */ setcolor(14);setfillstyle(1,10);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);/*

用深蓝色填充

*/ sprintf(s,”Hey girl!Do you want to know?“);

/*

将字符串存到 s 字符数组*/

setcolor(1);settextstyle(10,0,10);/*

设选用字形 4,放大 3 倍,水平设置

*/ outtextxy(110,80,s);

/*

显示 s 字符串

*/ getch();closegraph();} /*功能控制模块*/ /*检查日期有效性函数*/ void checkDate(){ /*如果给定的日期中年份部分为负数或者0*/ if(currentYear<=0){ gotoxy(1,27);printf(”The year should be a positive number!n“);gotoxy(1,28);printf(”Press any key to comtinue.......“);getchar();

getchar();/*以当前系统时间重新赋值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果给定的日期中月份部分为负数,为0或者大于12*/ if(currentMonth>12||currentMonth<1){gotoxy(1,27);printf(”The month should be a number between 1 and 12!n“);gotoxy(1,28);printf(”Press any key to continue......“);getchar();getchar();/*以当前系统时间重新赋值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果给定的日期中天数部分为负数,为0或者大于31*/ if(currentDay>31||currentDay<1){ gotoxy(1,27);printf(”The day should be a number between 1 and 31!n“);gotoxy(1,28);printf(”Press any key to continue......“);getchar();getchar();/*以当前系统时间重新赋值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} }

/*判断是否是闰年函数*/ int isLeapyear(int year){

/*闰年的判断:(1)year被4整除,并且year不被100整除

或(2)year被4整除,并且被400整除*/

if(year%4==0&&year%100||year%400==0)

return 1;

else

return 0;} /*根据给定日期计算星期函数*/ int getWeek(int year,int month,int day){

int leapFlag;

int week;

int i;

/*该数组用于保存每个月的天数*/

int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int count=0;

/*判断给定年份是否是闰年*/

leapFlag=isLeapyear(year);

/*如果是闰年则2月份的日期应该为29天*/

if(leapFlag==1)

a[2]++;

/*计算从给定年份的1月1日到给定月份的1号之间的天数*/

for(i=1;i

{

count+=a[i];

}

/*计算从给定年份的1月1日到给定日期之间的天数*/

count+=day;

/*计算星期*/

week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7;

return week;}

/*打印输出模块*/ /*输出指定个数空格函数*/ void printSpace(int n){

int i;

for(i=0;i

printf(” “);}

/*输出分割线函数*/ void printSeparator(){

int i;

for(i=0;i<38;i++)

{

printf(”=“);

}

printf(”n“);}

/*输出使用方法函数*/ void printUsage(){

gotoxy(45,3);

/*设定字体颜色*/

textcolor(YELLOW);

/*送格式化输出至屏幕*/

cprintf(”-----------Usage-----------“);

gotoxy(45,5);

textcolor(YELLOW);

cprintf(”YEAR“);

gotoxy(50,5);

printf(” Up key()to increase;n“);

gotoxy(50,7);

printf(” Down key()to decrease.n“);

gotoxy(45,9);

textcolor(YELLOW);

cprintf(”MONTH:“);

gotoxy(50,9);

printf(” Right key()to increase;n“);

gotoxy(50,11);

printf(” Left key()to decrease.n“);

gotoxy(45,13);

textcolor(YELLOW);

cprintf(”DAY“);

gotoxy(50,13);

printf(” PageDown key to increase;n“);

gotoxy(50,15);

printf(” PageUp key to decrease.n“);

gotoxy(45,17);

textcolor(YELLOW);

cprintf(”QUERY“);

gotoxy(50,17);

printf(” Q/q keyn“);

textcolor(YELLOW);

gotoxy(45,19);

cprintf(”RESET“);

gotoxy(50,19);

printf(” SPACE key.n“);

gotoxy(45,21);

textcolor(YELLOW);

cprintf(”EXIT“);

gotoxy(50,21);

printf(” Esc keyn“);

gotoxy(59,5);

/*设置寄存器,表示在指定位置输出一次指定的字符*/

_CX=01;

_AH=0xa;

/*指定输出字符为向上的箭头*/

_AL=24;

/*产生一次中断,输出向上的箭头*/

geninterrupt(0x10);

gotoxy(61,7);

_CX=01;

_AH=0xa;

/*指定输出字符为向下的箭头*/

_AL=25;

geninterrupt(0x10);

gotoxy(62,9);

_CX=01;

_AH=0xa;

_AL=26;

/*指定输出字符为向右的箭头*/

geninterrupt(0x10);

gotoxy(61,11);

_CX=01;

_AH=0xa;

/*指定输出字符为向左的箭头*/

_AL=27;

geninterrupt(0x10);

/*还原字体颜色*/

textcolor(7);}

/*根据系统日期输出星期函数*/ void printWeek(){

int day;

/*根据日期获得星期*/

day=getWeek(currentYear,currentMonth,currentDay);

textcolor(11);

/*输出星期,0表示星期天,1表示星期一„„6表示星期六*/

if(day==0)

cprintf(”%d-%d-%d,Sunday!“,currentYear,currentMonth,currentDay);

if(day==1)

cprintf(”%d-%d-%d,Monday!“,currentYear,currentMonth,currentDay);

if(day==2)

cprintf(”%d-%d-%d,Tuesday!“,currentYear,currentMonth,currentDay);

if(day==3)

cprintf(”%d-%d-%d,Wednesday!“,currentYear,currentMonth,currentDay);

if(day==4)

cprintf(”%d-%d-%d,Thursday!“,currentYear,currentMonth,currentDay);

if(day==5)

cprintf(”%d-%d-%d,Friday!“,currentYear,currentMonth,currentDay);

if(day==6)

cprintf(”%d-%d-%d,Saterday!“,currentYear,currentMonth,currentDay);

textcolor(7);}

/*输出指定星期函数*/ void printWeek2(int week){

if(week==0)

cprintf(”,Sunday“);

if(week==1)

cprintf(”,Monday“);

if(week==2)

cprintf(”,Tuesday“);

if(week==3)

cprintf(”,Wendesday“);

if(week==4)

cprintf(”,Thursday“);

if(week==5)

cprintf(”,Friday“);

if(week==6)

cprintf(”,Staturday“);}

/*日历显示模块*/ /*显示日历函数*/ void showCalendar(int year,int month,int day){

int i;

int j;

/*输出的日期*/

int outDay;

int leapFlag;

/*本月第一个星期中,在上月的天数*/

int dayLastMon;

int week;

/*该数组用于保存每个月的天数*/

int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

outDay=0;

dayLastMon=0;

week=0;

/*判断给定年份是否是闰年*/

leapFlag=isLeapyear(year);

/*如果是闰年则2月应该是29天*/

if(leapFlag==1)

{

a[2]++;

}

/*如果给定的日期中,天数大于该月的最大天数*/

if(day>a[month])

{

printf(”The number of this month's day is %d at most!n“,a[month]);

printf(”press any key to continue.....n“);

getchar();

getchar();

/*以当前系统时间重新赋值*/

year=sysTime.da_year;

month=sysTime.da_mon;

day=sysTime.da_day;

currentYear=sysTime.da_year;

currentMonth=sysTime.da_mon;

currentDay=sysTime.da_day;

}

/*当前月的天数*/

n_currentMon=a[month];

/*上一月的天数*/

n_lastMon=a[month-1];

/*根据给定日期,获取给定月份1号的星期*/

week=dayLastMon=getWeek(year,month,1);

/*清除文本模式窗口*/

clrscr();

printf(”nThe calendar of %d:“,year);

textcolor(10);

/*显示给定是否是闰年*/

if(leapFlag==1)

cprintf(”[leap year]“,year);

if(leapFlag==0)

cprintf(”[not leap year]“,year);

printf(”n“);

textcolor(7);

printSeparator();

textcolor(YELLOW);

/*输出月份提示,1~12分别表示1月到12月*/

switch(month)

{

case 1:

cprintf(”January 1“);

break;

case 2:

cprintf(”Fabruary 2“);

break;

case 3:

cprintf(”March 3“);

break;

case 4:

cprintf(”April 4“);

break;

case 5:

cprintf(”May 5“);

break;

case 6:

cprintf(”June 6“);

break;

case 7:

cprintf(”July 7“);

break;

case 8:

cprintf(”August 8“);

break;

case 9:

cprintf(”September 9“);

break;

case 10:

cprintf(”October 10“);

break;

case 11:

cprintf(”November 11“);

break;

case 12:

cprintf(”December 12“);

break;

}

textcolor(7);

printf(”nn“);

textcolor(13);

cprintf(”Sun Mon Tue Wed Thu Fri Sat“);

textcolor(7);

printf(”nn“);

/*因为一个月中最多跨度6个星期,所以循环从0到5*/

for(i=0;i<6;i++)

{

/*如果是该月的第一星期*/

if(i==0)

{

/*第一个星期中还要7-daylastmon天本月,有daylastmon天在上个月,所以输出

daylastmon*4个空格符,每个日期在日历中占用4个空格*/

printSpace(dayLastMon*4);

/*剩余在本月的第一个星期中的天数为7-dayLastmon*/

for(j=0;j<7-dayLastMon;j++)

{

/*到达day的前一天时,输出++outDay*/

if(outDay==day-1)

{

/*黄色字体突出显示*/

textcolor(YELLOW);

cprintf(”[%d]“,++outDay);

textcolor(7);

}

/*到达day当天时,并且不是星期天*/

else if(outDay==day&&week!=0)

{

printf(”%3d“,++outDay);

}

/*到达day当天时,并且是星期天*/

else

{

printf(”%4d“,++outDay);

}

/*计算当天的星期,如果前一天时星期六(6),当天时星期天(0),其他情况则直

接星期加1*/

week=(week<6)?week+1:0;

}

printf(”nn“);

}

/*如果不是该月的第一个星期*/

else

{

/*则输出该星期中的7天*/

for(j=0;j<7;j++)

{

/*输出的天数小于该月的最大天数*/

if(outDay

{

/*到达day的前一天时,输出++outDay*/

if(outDay==day-1)

{

/*输出一位数字*/

if(outDay<9)

{

textcolor(YELLOW);

cprintf(”[%d]“,++outDay);

textcolor(7);

}

/*输出两位数字*/

else

{

textcolor(YELLOW);

cprintf(”[%2d]“,++outDay);

textcolor(7);

}

}

/*到达day当天时,并且不是星期天*/

else if(outDay==day && week!=0)

{

printf(”%3d“,++outDay);

}

/*到达day当天时,并且是星期天*/

else

{

printf(”%4d“,++outDay);

}

}

/*计算当天星期*/

week=(week<6)?week+1:0;

}

printf(”nn“);

if(outDay==a[month])break;} } /*输出分割线*/ printSeparator();

/*输出当前选择的日期和星期*/ printf(”The day you choose is:nn“);printWeek();gotoxy(1,22);textcolor(10);cprintf(”--------------------n“);textcolor(7);

/*输出系统日期和星期*/ printf(”nToday is: %d-%d-%d“,sysTime.da_year,sysTime.da_mon,sysTime.da_day);printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));printf(”nn“);/*显示按键操作*/ printUsage();gotoxy(1,25);}

/*键值获取模块*/ /*通过键盘调整日期函数*/ void getKeyValue()

{ int key;char ch;/*默认显示当前系统日期和星期*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentYear,currentMonth,currentDay);

while(1){

/*获取键值,根据键值调整日历输出*/

key=bioskey(0);

/*右移键,增加月份*/

if(key==RIGHT)

{

/*月份值在1~12之间,则直接加1*/

if(currentMonth<12 && currentMonth>=1)

{

currentMonth++;

}

/*如果月份为12,则加1后进位,即年份加1,月份变为1*/

else

{

currentYear++;

currentMonth=1;

} } /*左移键,减少月份*/ if(key==LEFT){

/*月份值在1~12之间,则直接减1*/

if(currentMonth<=12 && currentMonth>1)

{

currentMonth--;

}

/*如果月份为1,则减1后,到上一年,月份变为12*/

else

{

currentYear--;

currentMonth=12;

} } /*上移键,增加年份*/

if(key==UP){

currentYear++;} /*下移键,减少年份*/ if(key==DOWN){

currentYear--;} /*上移键,减少天数*/ if(key==PAGEUP){

/*当前日不是该月的第一天,则天数直接减1*/

if(currentDay!=1)

{

currentDay--;

}

/*当前日是该月的第一天,并且是该年的第一个月(即1月1日),则天数减1后,变为上一年的最后一个月的最后一天(即12月31日)*/

else if(currentDay==1 && currentMonth==1)

{

currentYear--;

currentMonth=12;

currentDay=31;

}

/*当前日是该年中某一个月的第一天,则天数减一后,变为上个月的最后一天*/

else

{

currentMonth--;

currentDay=n_lastMon;

} } /*下移键,增加天数*/ if(key==PAGEDOWN){

/*当前日不是该月的最后一天,则天数直接加1*/

if(n_currentMon!=currentDay)

{

currentDay++;

}

/*当前日是该年的最后一天(即12月31日),则天数加1后,变为下一年的第一个月的第一天(即1月1日)*/

else if(n_currentMon==currentDay && currentMonth==12)

{

currentYear++;

currentMonth=1;

currentDay=1;

}

/*当前日是该年中某一个月的最后一天,则天数加1后,变为下个月的第一天*/

else

{

currentMonth++;

currentDay=1;

} }

/*Q或者q键,表示查询指定日期的星期*/ if(key==QLOWER||key==QUPPER){

{

printf(”Input date(eg,%d-%d-%d):“,sysTime.da_year,sysTime.da_mon,sysTime.da_day);

scanf(”%d-%d-%d“,¤tYear,¤tMonth,¤tDay);

checkDate();

}

}

/*空格键,重置到系统日期*/

if(key==SPACE)

{

currentYear=sysTime.da_year;

currentMonth=sysTime.da_mon;

currentDay=sysTime.da_day;

}

/*Esc键退出系统*/

if(key==ESC)

{

printf(”Do you really want to quit?(Y/N)“);

ch=getchar();

if(ch=='y'||ch=='Y')

break;

}

showCalendar(currentYear,currentMonth,currentDay);

} }

void printtext(unsigned char *temp[],int i){

setcolor(4);

/*设置颜色*/

settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);/*设置字符的字体,方向和大小*/

outtextxy(100,40+i*50,temp[i]);

/*在所指定的坐标出显示字符串*/ } /*主函数*/ void main(){

int i,graphdriver,graphmode;

unsigned char *temp[4];

int freq[96]={659,587,659,587,659,494,587,523,440,330,440,494,330,494,523,659,587,659,587,659,494,587,523,440,330,440,494,330,523,494,440,440,494,523,587,659,659,330,699,659,587,587,330,659,587,523,523,330,587,523,494,494};

int dely[96]={50,50,50,50,50,50,50,50,100,50,50,100,50,50,100,50,50,50,50,50,50,50,50,100,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100};

graphdriver=DETECT;

graphmode=0;

temp[0]=”Welcome!“;

temp[1]=”Please press any key to start the music......“;

temp[2]=”Do you like it?“;

temp[3]=”Press any key to end the music!“;

temp[4]=”Welcome to calendar“;

initgraph(&graphdriver,&graphmode,”");

/*系统初始化*/

cleardevice();

/*清除屏幕*/

settextjustify(LEFT_TEXT,CENTER_TEXT);

/*设置字符排列方式*/

for(i=0;i<2;i++)

printtext(temp,i);

getch();

for(i=2;i<4;i++)

printtext(temp,i);

i=0;

while(i<96&&!kbhit())

{

sound(freq[i]);

/*扬声器根据频率发声*/

delay(1100*dely[i]);

/*声音延时*/

i++;

}

nosound();

/*关闭扬声器*/

printtext(temp,4);

getch();

closegraph();

welcome();

window(1,1,80,25);

textbackground(0);

textcolor(WHITE);

/*清除文本模式窗口*/

clrscr();

/*设置屏幕显示方式*/

_AL=03;

_AH=0;

geninterrupt(0x10);

getdate(&sysTime);

getKeyValue();}

/*关闭图形模式*/

下载万年历单片机课程设计报告word格式文档
下载万年历单片机课程设计报告.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    单片机课程设计报告

    单片机课程设计报告 课程名称:单片机原理及接口课程设计 题目:基于 学院:电气信息学院 专业班级:测控技术与仪器 姓名:江让 学号: 指导老师:刘升老师  时间: C51单片机的ADC0809数模......

    单片机课程设计报告

    单片机课程设计报告题目:小直流电机调速实验教学单位: 机 电 工 程 系专业: 机械设计制造及其自动化班级: 0803班学号: 0811050342姓名: 程怀虎2011 年 11月(以下内容用宋体,五号,单......

    单片机课程设计报告

    DS18B20测温及按键控制 课 程 设 计 课程名称 单片机基础课程设计 题目名称 18B20测温及按键控制 学生学院 **** 专业班级 **** 班号 **** 学生组员 ****** 指导教师 *****......

    单片机课程设计报告

    课程设计报告 题 目: 自动滴灌系统设计 课程名称: 单片机原理及应用 学 院: 信息工程学院专 业: 计算机科学与技术 班 级: 2014 级计本 1 班学生姓名: *** 学 号: 201403031......

    单片机课程设计报告

    《单片机原理与接口技术》 课程设计报告 设计题目: 基于80C51单片机系统实验板的制作 与程序设计专业:应用电子专业班级: 11应电班姓名: 丁文俊指导教师: 余静老师2013 年 5 月2......

    单片机课程设计实习报告

    单片机课程设计实习报告 课程 2009-06-09 23:23:55 阅读1900 评论2 字号:大中小 订阅 实训任务: 做单一灯的左移右移,八个发光二极管L1-L8分别接在单片机的P1.0→P1.2→P1.3......

    单片机课程设计报告[5篇]

    《单片机课程设计报告》 学校:专业:班级: 姓名: 学号: 指导教师: 摘要 由于单片机体积小、成本低、使用方便,所以被广泛地应用于仪器仪表、现场数据的采集和控制。通过本次课程......

    单片机计算器课程设计报告

    大连民族学院2007级电子信息工程专业单片机系统课程设计报告 机电信息工程学院 单片机系统课程设计报告 完成日期:2010年5月31日 系: 专业: 班级: 设计题目: 学生姓名: 指导教师:......