课程设计基于51单片机的数字时钟.docx

上传人:b****2 文档编号:12654395 上传时间:2023-04-21 格式:DOCX 页数:18 大小:82.67KB
下载 相关 举报
课程设计基于51单片机的数字时钟.docx_第1页
第1页 / 共18页
课程设计基于51单片机的数字时钟.docx_第2页
第2页 / 共18页
课程设计基于51单片机的数字时钟.docx_第3页
第3页 / 共18页
课程设计基于51单片机的数字时钟.docx_第4页
第4页 / 共18页
课程设计基于51单片机的数字时钟.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

课程设计基于51单片机的数字时钟.docx

《课程设计基于51单片机的数字时钟.docx》由会员分享,可在线阅读,更多相关《课程设计基于51单片机的数字时钟.docx(18页珍藏版)》请在冰豆网上搜索。

课程设计基于51单片机的数字时钟.docx

课程设计基于51单片机的数字时钟

[课程设计]基于51单片机的数字时钟

[]51

单片计算机即单片微型计算机。

(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。

他体积小,成本低,功能强,广泛应用于智能产

品和工业自动化上。

而51单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设

计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

系统由AT89C51、LED数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。

系统的功能选择由SB0、SB1、SB2、SB3、SB4完成。

其中SB0为时间校对,定时器调整功能键,按SB0进入调整状态。

SB1为功能切换键。

第一轮按动SB1依次进入一路、二路、三路定时时间设置提示程序,按SB3进入各路定时调整状态。

定时时间到,二极管发亮。

到了关断时间后灭掉。

如果不进入继续按SB1键,依次进入时间年?

位校对、?

月?

位校对、?

日?

位校对、?

时?

位校对、?

分?

位校对、?

秒?

位校对状态。

不管是进入那种状态,按动SB2皆可以使被调整位进行不进位增量加1变化。

各预置量设置完成后,系统将所有的设置存入RAM中,按SB1退出调整状态。

上电后,

系统自动进入计时状态,起始于?

00?

时?

00?

分。

SB4为年月日显示转换键,可使原来显

示时分秒转换显示年月日。

1.

电原理图见附图1。

由6个共阴极的数码管组成时、分、秒的显示。

P0口的8条数据线P0.0至P0.7分别与两个CD4511译码的ABCD口相接,P2口的P2.0至P2.2分别通过电阻R10至R13与VT1至VT3的基极相连接。

这样通过P0口送出一个存储单元的高位、低位

BCD显示代码,通过P2口送出扫描选通代码轮流点亮LED1至LED6,就会将要显示的数据在数码管中显示出来。

从P0口输出的代码是BCD码,从P2口输出的就是位选码。

是扫描显示原理。

2

键盘是人与微机打交道的主要设备,按键的读取容易引起误动作。

可采用软件去抖动的方法

处理,软件的触点在闭合和断开的时候会产生抖动,这时触点的逻辑电平是不稳定的,如不

采取妥善处理的话,将引起按键命令错误或重复执行,在这里采用软件延时的方法来避开抖

动,延时时间20ms.

3

按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反

复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应

程序。

利用连击功能,能实现快速调时操作。

本系统的主程序主要完成时间显示和定时输出判断功能。

而年月日显示和各时间单元进位,

时间设定时,调定时间设定时等功能全部在中断服务程序中完成。

1

由前述可知,从P2口输出位选码,从P0口输出段选码,LED就会显示出数字来。

但P0口的输出的数据是要BCD码,各存储单元存储的是二进制数,也就是和要显示出的字符表

的含义是不一致的。

可见,将要显示的存储单元的数据直接送到P0口去驱动LED数码管显示是不能正确表达的,必须在系统内部将要显示的数据经过BCD码行转换后,将各个单

元数据的段选代码送入P0口,给CD4511译码后去驱动数码管显示。

具体转换过程如下:

我们先将要显示的数据装入累加器A中,再将A中的数据转换成高低两位的BCD码,再放回A中,然后将A中的值输出。

如:

有一个单元存储了45这样一位数,则需转换成四位的BCD码:

(0100)(0101)然后放入A中。

A中BCD码,高位四位代表?

4?

低四位代

表?

5?

同时送给两个译码器中,译码后?

45?

字就在两个LED中显示出来。

2

时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。

计数器T0打开后,进入计时,满100毫秒后,重装定时。

中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位,24小时满后,天单元进位。

这样然后根据进率,得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LED中显示出来,实现时钟计时功能。

累加是用指令INC来实现的。

进入中断服务程序以后,执行PUSHPSW和PUSHA将程序状态寄存器PSW的内容和累加器A中的数据保存起来,这便是所

谓的?

保护现场?

.以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。

在软件的控

制之下,堆栈可在片内RAM中的任一区间设定,而堆栈的数据存取与一般的RAM存取又有区别,对它的操作,要遵循?

后进先出?

的原则。

3

系统的另一功能就是实现对执行设备的定时开关控制,其主要控制思想是这样的:

先将执行设备开启的时间和关闭时间置入RAM某一单元,在计时主程序当中执行几条比较指令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条CLR指令,将对应的那路P3置为高电位,开启;如果当前计时时间与执行设备设定的关闭时间相等,就执行

SETB

对应的P3置低电位,二极管截止,。

实现此控制功能用到的比较指令为CJNEA,#direct,rel,其转移条件是累加器A中的值与立即数不等则转移。

1、谢自美,《电子线路设计、实验、测试》武汉:

华中理工大学出版社,20002、何书森、何华斌《实用数字电路原理与设计速成》福州:

福建科学技术出版社,2000.63、白驹衍,《单片计算机及应用》北京:

电子工业出版社,1999.2五:

程序

SECEQU32H;秒即时时间\伪指令

MINEQU31H;分LJMPSHOW

HOUREQU30H;时

DAYEQU35H;日ORG000BH;计数中断T0、方式1MONEQU34H;月LJMPTIMEYEAREQU33H;年ORG0013HMIN_1EQU41H;分定时器1路、开存储单LJMPCHANGE;调整时间、定时、INT1元(SB0键)HOUR_1EQU42H;时;------主程序DAY_1EQU43H;ORG0030HMON_1EQU44H;MAIN:

YEAR_1EQU45H;

;--------初始化付值MIN_11EQU40H;分定时器1路、关存储

MOVYEAR,#02单元

MOVMON,#05HOUR_11EQU46H;时

MOVDAY,#01DAY_11EQU47H;日

MOVHOUR,#00MON_11EQU48H;月

MOVMIN,#00YEAR_11EQU49H;年

MOVSEC,#00

CLR40H;定时单元1路清零;***********************CLR41H

CLR42H

CLR43HORG0000HCLR44H

CLR45H

ljmpMAINCLR46H

ORG0003H;中断转换显示年月日、INT0CLR47H

(SB4键)CLR48H

CLR49H

;-------开中断

MOVTMOD,#01H;计数、模式1、T0CJNEA,DAY_1,LOOP_1MOVTL0,#0B0H;100SM计数定时MOVA,HOURMOVTH0,#3CH;CJNEA,HOUR_1,LOOP_1clrp3.0MOVA,MINMOV20H,#0AH;10次*100SMCJNEA,MIN_1,LOOP_1SETBPT0;T0为最高级CPLP3.0SETBTR0;允许计数;---------关SETBET0;允许T0中断LOOP_1:

SETBEX0;允许INT0中断

MOVA,YEARSETBEX1;允许INT1中断

SETBEA;开总中断

;------显示、定时器启动判断CJNEA,YEAR_11,LOOP;年比较

LOOP:

MOVA,MON

CJNEA,MON_11,LOOPMOVR1,#30H;存储单元

MOVA,DAYMOVR4,#01H;位选通

CJNEA,DAY_11,LOOPMOVR3,#03H;三组显示

MOVA,HOURNEXT:

CJNEA,HOUR_11,LOOP

MOVA,MINMOVA,@R1;CJNEA,MIN_11,LOOP

CPLP3.0MOVB,#10;将存储单元转换成两高低两LJMPLOOP组的BCD码;-----年月日显示中断子程序

SHOW:

DIVAB

SWAPA

ORLA,B

PUSHPSWMOVP0,A;输出

MOVP2,R4

INCR1;下一单元pushACCMOVA,R4;PUSHBRLA;位移PUSH01HMOVR4,APUSH02HLCALLDE5SM;延时0.5SMPUSH03HDJNZR3,NEXT;全扫描显示一偏PUSH04H;------判断定时输出(只编写了一路)MOVR2,#0FFH;中断扫描次数

CJNER7,#88H,LOOP;是8则开,否则、定TURN:

MOVR1,#33H

时已关、转MOVR4,#01H;---------开MOVR3,#03HMOVA,YEARNEXT_1:

CJNEA,YEAR_1,LOOP_1;年比较,不等转

MOVA,MONMOVA,@R1CJNEA,MON_1,LOOP_1

MOVA,DAY

MOVB,#10

MOVR6,HOURDIVAB

CJNER6,#25,OUTSWAPA

MOVHOUR,#00ORLA,B

INCDAYMOVP0,A

MOVR5,MONMOVP2,R4

CJNER5,#1,MON_22;是否1月、不是转2INCR1

月RLA

MOVR5,DAYMOVR4,A

CJNER5,#32,OUT;本月是否益出LCALLDE5SM

INCMONDJNZR3,NEXT_1

MOVDAY,#1DJNZR2,TURN;反复显示一定时间后返回

LJMPOUTPOP04H

OUT:

POP03H

POP06HPOP02H

POP01H

POPBPOPBPOPACCPOPACCPOPPSWPOPPSWRETIRETI;-----计数中断服务子程序MON_22:

TIME:

PUSHPSW

MOVR5,MONPUSHACC

CJNER5,#2,MON_33;是否2月、不是转3PUSHB

月PUSH06H

MOVA,YEAR;判断是否瑞年MOVTH0,#3CH;重装计数

MOVB,#4MOVTL0,#0BH;

DIVABDJNZ20H,OUT;转到中断跳出pop程序

MOVA,BMOV20H,#0AH;重装:

100*10=1000

JNZOUT_1;不是则转(A不为零则转);-----进位程序

MOVR5,DAYINCSEC

CJNER5,#30,OUT;如是瑞年、判断是否到MOVR6,SEC;

29天CJNER6,#60,OUT;比较

INCMONMOVSEC,#00;

MOVDAY,#1

LJMPOUT

OUT_1:

INCMIN

MOVR6,MINMOVR5,DAYCJNER6,#60,OUT

MOVMIN,#00

CJNER5,#29,OUT;平年二月判断INCHOUR

LJMPOUTINCMON

MON_77:

MOVDAY,#1MOVR5,MONLJMPOUT

MON_33:

MOVR5,MONCJNER5,#7,MON_88

MOVR5,DAY

CJNER5,#32,L1CJNER5,#3,MON_44

INCMONMOVR5,DAY

MOVDAY,#1CJNER5,#32,OUT

L1:

LJMPOUTINCMON

MON_88:

MOVDAY,#1

LJMPOUT

MON_44:

MOVR5,MONMOVR5,MONCJNER5,#8,MON_99

MOVR5,DAY

CJNER5,#32,L2CJNER5,#4,MON_55

INCMONMOVR5,DAY

MOVDAY,#1CJNER5,#31,OUT

L2:

LJMPOUTINCMON

MON_99:

MOVDAY,#1

LJMPOUT

MON_55:

MOVR5,MONMOVR5,MONCJNER5,#9,MON_00

MOVR5,DAY

CJNER5,#31,L3CJNER5,#5,MON_66

INCMONMOVR5,DAY

MOVDAY,#1CJNER5,#32,OUT

L3:

LJMPOUTINCMON

MON_00:

MOVDAY,#1

LJMPOUT

MON_66:

MOVR5,MONMOVR5,MONCJNER5,#10,MON_AA

MOVR5,DAY

CJNER5,#32,L4CJNER5,#6,MON_77

INCMONMOVR5,DAY

MOVDAY,#1CJNER5,#31,OUT

L4:

LJMPOUTINCMON

MON_AA:

MOVDAY,#1

MOVR5,MONMOVB,#10

DIVAB

SWAPACJNER5,#11,MON_BB

ORLA,BMOVR5,DAY

MOVP0,ACJNER5,#31,L5

MOVP2,#02HINCMON

LCALLREADMOVDAY,#1

LCALLDE250SML5:

LJMPOUT

CJNEA,01H,MON_111MON_BB:

CJNEA,#0FBH,KEY2_8;按SB2转月调整

LJMPDAY_111

KEY2_8:

MOVR5,DAY

CJNEA,#0FDH,MON_111CJNER5,#32,L6

INCYEAR

MOVMON,#1INCMON_1;1路月单元加1MOVDAY,#1MOVR5,MON_1

L6:

LJMPOUTCJNER5,#13,MON_111;益出;-------按SB2\定时器年单元加1子程序MOVMON_1,#01H

SB3_2:

LJMPSHOW_2;二路没编返回AJMPMON_111;转到月显SB3_3:

LJMPSHOW_3;三路没编返回;_------日单元加1子程序SB3_1:

DAY_111:

MOVA,YEAR_1;调时年单元MOVA,DAY_1;调时日单元显示提示MOVB,#10MOVB,#10

DIVABDIVAB

SWAPASWAPA

ORLA,BORLA,B

MOVP0,AMOVP0,A

MOVP2,#01HMOVP2,#04H

LCALLREADLCALLREAD

LCALLDE250SMLCALLDE250SM

CJNEA,01H,SB3_1CJNEA,01H,DAY_111

CJNEA,#0FBH,KEY2_7;按SB2转年调整CJNEA,#0FBH,KEY2_9;按SB2转日调整LJMPMON_111;按SB1往下调月单元LJMPHOUR_111

KEY2_7:

CJNEA,#0FDH,SB3_1KEY2_9:

CJNEA,#0FDH,DAY_111

INCYEAR_1;1路年单元加1INCDAY_1;1组日单元加1MOVR5,YEAR_1MOVR5,DAY_1

CJNER5,#09,SB3_1;益出CJNER5,#32,DAY_111;益出MOVYEAR_1,#00HMOVDAY_1,#01H

AJMPSB3_1;AJMPDAY_111;转到日显;-------月单元加1子程序;-------按SB2时单元加1子程序MON_111:

HOUR_111:

MOVA,MON_1;调时月单元显示MOVA,HOUR_1;调时时单元显示提示

MOVB,#10SWAPA

DIVABORLA,B

SWAPAMOVP0,A

ORLA,BMOVP2,#01H

MOVP0,ALCALLREAD

MOVP2,#01HLCALLDE250SM

LCALLREADCJNEA,01H,OFF_CH

LCALLDE250SMCJNEA,#0FBH,KEY2_F7;按SB2转年调

CJNEA,01H,HOUR_111整CJNEA,#0FBH,KEY2_10;按SB2转时调LJMPMON_OFF;按SB1往下调月单元

整KEY2_F7:

CJNEA,#0FDH,OFF_CHLJMPMIN_111INCYEAR_11;1路年单元加1

KEY2_10:

CJNEA,#0FDH,HOUR_111MOVR5,YEAR_11

INCHOUR_1CJNER5,#09,OFF_CH;益出MOVR5,HOUR_1MOVYEAR_11,#00H

CJNER5,#24,HOUR_111;益出AJMPOFF_CH;

MOVHOUR_1,#00H;-------月单元加1子程序AJMPHOUR_111;转到时显MON_OFF:

;-------分单元加1子程序MOVA,MON_11;调时月单元显示MIN_111:

MOVB,#10

MOVA,MIN_1;调时分单元、并显示提示DIVAB

MOVB,#10SWAPA

DIVABORLA,B

SWAPAMOVP0,A

ORLA,BMOVP2,#02H

MOVP0,ALCALLREAD

MOVP2,#02HLCALLDE250SM

LCALLREADCJNEA,01H,MON_OFF

LCALLDE250SMCJNEA,#0FBH,KEY2_F8;按SB2转月调

CJNEA,01H,MIN_111整CJNEA,#0FBH,KEY2_11;按SB2转分调LJMPDAY_OFF

整KEY2_F8:

AJMPOFF_CH;按SB3往下调定时:

关单

KEY2_11:

CJNEA,#0FDH,MIN_111CJNEA,#0FDH,MON_OFFINCMIN_1;1路分单元加1

MOVR5,MIN_1

INCMON_11;1路月单元加1CJNER5,#60,MIN_111;益处

MOVR5,MON_11MOVMIN_1,#00H

CJNER5,#13,MON_OFF;益出AJMPMIN_111;转到分显

MOVMON_11,#01H年单元调整

AJMPMON_OFF;转到月显OFF_CH:

MOVA,YEAR_11;调时年单元

;_------日单元加1子程序MOVB,#10

DAY_OFF:

DIVAB

MOVA,DAY_11;调时日单元显示提示

MOVB,#10DIVAB

DIVABSWAPA

SWAPAORLA,B

ORLA,BMOVP0,A

MOVP0,AMOVP2,#02H

MOVP2,#04HLCALLREAD

LCALLREADLCALLDE250SM

LCALLDE250SMCJNEA,01H,MIN_OFF

CJNEA,01H,DAY_OFFCJNEA,#0FBH,KEY2_F11;按SB2转分调CJNEA,#0FBH,KEY2_F9;按SB2转日调整

整LJMPON_1;按SB3往下调定时:

开与关LJMPHOUR_OFFKEY2_F11:

CJNEA,#0FDH,MIN_OFF

KEY2_F9:

CJNEA,#0FDH,DAY_OFFINCMIN_11;1路分单元加1INCDAY_11;1组日单元加1MOVR5,MIN_11

MOVR5,DAY_11CJNER5,#60,MIN_OFF;益处CJNER5,#32,DAY_OFF;益出MOVMIN_11,#00H

MOVDAY_11,#01HLJMPMIN_OFF;转到分显AJMPDAY_OFF;转到日显;-------开、关定时;-------按SB2时单元加1子程序ON_1:

CJNEA,#0FBH,MIN_OFF

HOUR_OFF:

K1:

MOVA,#88H

MOVR7,AMOVA,HOUR_11;调时时单元显示提示MOVP0,AMOVB,#10MOVP2,#0FFH;三组都显示开DIVABLCALLREADSWAPALCALLDE250SMORLA,BCJNEA,01H,ON_1;去抖后比较MOVP0,ACJNEA,#0FBH,KEY2_12;按SB2转关MOVP2,#01HLJMPOUT_A;按SB3调出、处于开状态LCALLREADKEY2_12:

CJNEA,#0FDH,K1LCALLDE250SMk2:

MOVA,#00H;显示0关CJNEA,01H,HOUR_OFFMOVR7,ACJNEA,#0FBH,KEY2_F10;按SB2转时MOVP0,A调整MOVP2,#0FFH;LJMPMIN_OFF

KEY2_F10:

CJNEA,#0FDH,HOUR_OFF

INCHOUR_11LCALLREAD

MOVR5,HOUR_11

CJNER5,#24,HOUR_OFF;益出LCALLDE250S

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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