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