单片机课程设计电子万年历.docx

上传人:b****5 文档编号:6471983 上传时间:2023-01-06 格式:DOCX 页数:14 大小:19.77KB
下载 相关 举报
单片机课程设计电子万年历.docx_第1页
第1页 / 共14页
单片机课程设计电子万年历.docx_第2页
第2页 / 共14页
单片机课程设计电子万年历.docx_第3页
第3页 / 共14页
单片机课程设计电子万年历.docx_第4页
第4页 / 共14页
单片机课程设计电子万年历.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

单片机课程设计电子万年历.docx

《单片机课程设计电子万年历.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子万年历.docx(14页珍藏版)》请在冰豆网上搜索。

单片机课程设计电子万年历.docx

单片机课程设计电子万年历

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

——————电子万年日历系统

一、题目:

电子实时时钟/万年日历系统

二、功能要求:

1.基本要求:

⑴显示准确的北京时间(时、分、秒),可用24小时制式;

⑵随时可以调校时间。

2.发挥要求:

⑴增加公历日期显示功能(年、月、日),年号只显示最后两位;

⑵随时可以调校年、月、日;

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

三、方案考虑:

1、硬件方案:

⑴显示器采用6位LED数码管(共阳),可分别显示时间或日期;(通过KB键可切换)

⑵显示器的驱动采用动态扫描电路形式,以达到简化电路的目的。

但要注意所需的驱动电流比静态驱动时要大,因此要增加驱动电路。

可采用74LS244或者晶体管;其中74ls244是用来驱动段选码,晶体管是驱动位选码!

⑶采用“一键多用方案”,以减少按键数目。

本方案只采用了两个按键

⑷整体上要考虑:

结构简单、布局美观、操作方便、成本低廉。

2、设计电路图如下:

3、元件清单:

⑴89C511个

⑵IC座(40脚)3个(其中1个用于接插89C51、2个用于接插LED段数码管)。

⑶74LS2441个(用于驱动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μF1个(用于系统复位电路)。

⑵30pF2个(用于系统振荡电路)。

(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)调整流程图

程序编写如下:

;/////////////////////////////////////////////////////////

ORG0000H

LJMPSTART

ORG0003H

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

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

LJMPPROINT1

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

LJMPPROTIME

ORG0030H;主程序

TABLE:

DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0123456789

ORG0050H

START:

MOVTCON,#05H;中断初始化

MOVIE,#8DH

MOVTMOD,#10H

MOVTH1,#0eCH;定时器初始化

MOVTL1,#78H

MOV31H,#0AH;10秒

MOV32H,#1EH;30分

MOV33H,#09H;9点

MOV34H,#0AH;10号

MOV35H,#06H;6月

MOV36H,#05H;2005年

MOV37H,#14H

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

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

MOVR7,#00H;切换标志

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

MOV41H,#00H;十六进制转换BCD的低位

MOVR6,#00H;调时的位闪烁的时间间隔

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

movr3,#00h

SETBTR1;开始计时

AGAIN:

ACALLPROSHOW;显示

AJMPAGAIN

PROSHOW:

CJNER3,#00H,SHOWDATE;如果r3等于1就显示日期,等于0就显示时钟

CJNER7,#04H,DATE1;显示程序

AJMPSHOWDATE;showdate显示年月日

DATE1:

CJNER7,#05H,DATE2

AJMPSHOWDATE

DATE2:

CJNER7,#06H,SHOWCLOCK

AJMPSHOWDATE

showCLOCK:

MOVR0,33H;showclock显示时分秒,先显示时

ACALLPROHTOD

CJNER7,#01H,CLK1

INCR6

CJNER6,#03H,CLK2;若处于调时状态,则该位闪烁

MOVR6,#00H

CLK1:

clrP2.4

mova,41H

MOVP0,a;显示时的低位

ACALLDELAY3MS

CLK2:

SETBP2.4

CLRP2.5

mova,40H

MOVP0,a;显示时的高位

ACALLDELAY3MS

SETBP2.5

MOVR0,32H;显示分

ACALLPROHTOD

CJNER7,#02H,CLK3

INCR6

CJNER6,#03H,CLK4;若处于调时状态,则该位闪烁

MOVR6,#00H

CLK3:

CLRP2.2

mova,41H

MOVP0,a;显示分的低位

ACALLDELAY3MS

CLK4:

SETBP2.2

CLRP2.3

mova,40h

MOVP0,a;显示分的高位

ACALLDELAY3MS

SETBP2.3

MOVR0,31H;显示秒

ACALLPROHTOD

CJNER7,#03H,CLK5

INCR6

CJNER6,#03H,CLK6;若处于调时状态,则该位闪烁

MOVR6,#00H

CLK5:

CLRP2.0

mova,41H

MOVP0,a;显示秒的低位

ACALLDELAY3MS

CLK6:

SETBP2.0

CLRP2.1

mova,40h

MOVP0,a;显示秒的高位

ACALLDELAY3MS

SETBP2.1

RET

SHOWDATE:

MOVR0,36H;显示年

ACALLPROHTOD

CJNER7,#04H,DAY1

INCR6

CJNER6,#03H,DAY2;若处于调时状态,则该位闪烁

MOVR6,#00H

DAY1:

CLRP2.4

MOVP0,41H;显示年的低位

ACALLDELAY3MS

DAY2:

SETBP2.4

CLRP2.5

MOVP0,40H;显示年的高位

ACALLDELAY3MS

SETBP2.5

MOVR0,35H;显示月

ACALLPROHTOD

CJNER7,#05H,MONTH1

INCR6

CJNER6,#03H,MONTH2;若处于调时状态,则该位闪烁

MOVR6,#00H

MONTH1:

CLRP2.2

MOVP0,41H;显示月的低位

ACALLDELAY3MS

MONTH2:

SETBP2.2

CLRP2.3

MOVP0,40H;显示月的高位

ACALLDELAY3MS

SETBP2.3

MOVR0,34H;显示日

ACALLPROHTOD

CJNER7,#06H,YEAR1

INCR6

CJNER6,#03H,YEAR2;若处于调时状态,则该位闪烁

MOVR6,#00H

YEAR1:

CLRP2.0

MOVP0,41H

ACALLDELAY3MS

YEAR2:

SETBP2.0

CLRP2.1

MOVP0,40H

ACALLDELAY3MS

SETBP2.1

RET

PROHTOD:

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

MOVA,R0

MOVB,#0AH

DIVAB

MOVDPTR,#0030H

MOVCA,@A+DPTR

MOV40H,A

MOVA,B

MOVCA,@A+DPTR

MOV41H,A

POPACC

RET

DELAY3MS:

;DELAY3MS

MOV45H,#08H

DELAY1:

MOV46H,#0FFH

DELAY2:

DJNZ46H,DELAY2

DJNZ45H,DELAY1

RET

PROINT0:

CLREX0;切换键中断程序

MOVR3,#00H

ACALLPROSHOW

MOVC,P3.2

JCIEXIT0

MOVR1,#00H

INCR7

CJNER7,#07H,IEXIT0

MOVR7,#00H

INT01:

MOVC,P3.2

JCINT02

ACALLPROSHOW

AJMPINT01

INT02:

ACALLPROSHOW

IEXIT0:

SETBEX0

RETI

PROINT1:

CLREX1

ACALLPROSHOW

MOVC,P3.3

JCIEXIT1

LCALLISYEAR;判断平年闰年

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

MOVR1,#00H

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

INCR3

CJNER3,#02H,IEXIT1

MOVR3,#00H

AJMPIEXIT1

NEXT1:

movr3,#00h

CJNER7,#03H,NEXT2;修改秒位

INC31H

MOVA,31H

CJNEA,#3CH,INT11;遇60变0

MOV31H,#00H

AJMPIEXIT1

NEXT2:

CJNER7,#02H,NEXT3;修改分位

INC32H

MOVA,31H

CJNEA,#3CH,INT11;遇60变0

MOV31H,#00H

AJMPIEXIT1

NEXT3:

CJNER7,#01H,NEXT4;修改时位

INC33H

MOVA,33H

CJNEA,#18H,INT11;遇24变0

MOV33H,#00H

AJMPIEXIT1

NEXT4:

CJNER7,#06H,NEXT5;修改日

INC34H

MOVA,34H

CJNEA,49H,INT11;到月底就返回月初

MOV34H,#01H

AJMPIEXIT1

NEXT5:

CJNER7,#05H,NEXT6;修改月

INC35H

MOVA,35H

CJNEA,#0DH,INT11;十二月过后就跳回1月

MOV35H,#01H

AJMPIEXIT1

NEXT6:

CJNER7,#04H,INT11;修改年

INC36H

MOVA,36H

CJNEA,#64H,INT11

MOV36H,#00H

INT11:

MOVC,P3.3

JCINT12

ACALLPROSHOW

AJMPINT11

INT12:

ACALLPROSHOW

IEXIT1:

setbEX1

RETI

PROTIME:

MOVTMOD,#10H

MOVTH1,#3CH;定时器初始化

MOVTL1,#60H

setbtr1

INCR4

CJNER4,#0c8H,EXIT

MOVR4,#00H;计满1秒则清零

CJNER7,#00H,DIAOSHI

AJMPNORMAL

DIAOSHI:

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

CJNER1,#0AH,EXIT

MOVR7,#00H;到10秒则返回正常显示状态

MOVR1,#00H

AJMPEXIT

NORMAL:

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

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

INC31H

MOVA,31H;秒加一

CJNEA,#3CH,EXIT

MOV31H,#00H

INC32H;分加一

MOVA,32H

CJNEA,#3CH,EXIT

MOV32H,#00H

INC33H;时加一

MOVA,33H

CJNEA,#18H,EXIT

MOV33H,#00H

INC34H;日加一

MOVA,34H

CJNEA,49H,EXIT

MOV34H,#01H

INC35H;月加一

MOVA,35H

CJNEA,#0DH,EXIT

MOV35H,#01H

INC36H;年加一

MOVA,36H

CJNEA,#64H,EXIT

MOV36H,#00H

EXIT:

RETI

ISYEAR:

MOVA,36H;判断平闰年

MOVB,#04H

DIVAB

MOVA,B

CJNEA,#00H,EXITYEAR1

MOV48H,#01H;闰年

SJMPEXITYEAR

EXITYEAR1:

MOV48H,#00H;平年

EXITYEAR:

RETI

ISMONTH:

MOVA,35H;开始检查月份

CJNEA,#02H,NEXTMON1;判断二月

MOVR2,48H

CJNER2,#00H,RUNNIAN

MOV49H,#1DH;平年为28天,赋29给49h

AJMPEXITMONTH

RUNNIAN:

MOV49H,#1EH;闰年为29天,赋30天给49h

AJMPEXITMONTH

NEXTMON1:

CJNEA,#04H,NEXTMON2

AJMPXIAOYUE

NEXTMON2:

CJNEA,#06H,NEXTMON3

AJMPXIAOYUE

NEXTMON3:

CJNEA,#09H,NEXTMON4

AJMPXIAOYUE

NEXTMON4:

CJNEA,#0BH,DAYUE

XIAOYUE:

MOV49H,#1FH;四,六,九,十一月是小月,30天,但应该赋31天给比较值49h,

AJMPEXITMONTH

DAYUE:

MOV49H,#20H;其他月份为大月,31天,赋32天给49h

EXITMONTH:

RETI

END

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1