数字钟单片机报告Word格式.docx
《数字钟单片机报告Word格式.docx》由会员分享,可在线阅读,更多相关《数字钟单片机报告Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
因此,研究数字钟及其扩展应用有着非常现实的意义。
基于数字钟在人们生活中的重要性和广泛应用以及目前学的单片机、电力电子等技术,我们组决定做一个实用的数字钟!
2功能指标设计
准确计时,以数字形式显示时、分、秒的时间,小时计时要求为“24翻1”,分和秒的计时要求为60进位,要有校正时间电路,可以分别对时及分进行单独校时,使其校正到标准时间。
3作品方案设计
3.1总体方案的选择
3.1.1方案一
本方案完全用软件仿真实现数字时钟。
原理为:
在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;
若秒值达到60,则将其清零,并将相应的分字节值加1;
若分值达到60,则清零分字节,并将时字节值加1;
若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
系统由AT89C51、LED数码管、按键、发光二极管等部分构成,能实现时间的调整、定时时间的设定,输出等功能。
系统的功能选择由SB0、SB1、SB2、SB3、SB4完成。
其中SB0为时间校对,定时器调整功能键,按SB0进入调整状态。
SB1为功能切换键。
第一轮按动SB1依次进入一路、二路、三路定时时间设置提示程序,按SB3进入各路定时调整状态。
定时时间到,二极管发亮。
到了关断时间后灭掉。
如果不进入继续按SB1键,依次进入时间¡
年¡
位校对、¡
月¡
位校对、¡
日¡
时¡
分¡
秒¡
位校对状态。
不管是进入那种状态,按动SB2皆可以使被调整位进行不进位增量加1变化。
各预置量设置完成后,系统将所有的设置存入RAM中,按SB1退出调整状态。
上电后,系统自动进入计时状态,起始于¡
00¡
分。
SB4为年月日显示转换键,可使原来显示时分秒转换显示年月日。
3.3.2方案二
本方案采用Dallas公司的专用时钟芯片DS12887A。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
基于硬件的考虑,本设计采用方案一完成数字时钟的功能。
3.2控制方案
先将执行设备开启的时间和关闭时间置入RAM某一单元,在计时主程序当中执行几条比较指令,如果当前计时时间与执行设备的设定开启时间相等,就执行一条CLR指令,将对应的那路P3置为高电位,开启;
如果当前计时时间与执行设备设定的关闭时间相等,就执行SETB对应的P3置低电位,二极管截止,。
实现此控制功能用到的比较指令为CJNEA,#direct,rel,其转移条件是累加器A中的值与立即数不等则转移。
3.3显示方案
电原理图见附图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口输出的就是位选码。
这是扫描显示原理。
3.4连击功能的实现
按下某键时,对应的功能键解释程序得到执行,如操作者没有释放按键,则对应的功能会反复执行,好象连续执行,在这里我们采用软件延时250ms,当按键没释放则执行下一条对应程序。
利用连击功能,能实现快速调时操作。
3.5数据与代码转换
由前述可知,从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中显示出来。
3.6计时功能的实现与中断服务程序
时间的运行依靠定时中断子程序对时钟单元数值进位调整来实现的。
计数器T0打开后,进入计时,满100毫秒后,重装定时。
中断一次,满一秒后秒进位,满60秒后即为1分钟,分钟单元进位,60分到了后,时单元进位,24小时满后,天单元进位。
这样然后根
据进率,得到年、月、日、时、分、秒存储单元的值,并经译码后,通过扫描程序送LE
D中显示出来,实现时钟计时功能。
累加是用指令INC来实现的。
进入中断服务程序以后,执行PUSHPSW和PUSHA将程序状态寄存器PSW的内容和累加器A中的数据保存起来,这便是所谓的¡
保护现场¡
.以保护现场和恢复现场时存取关键数据的存储区叫做堆栈。
在软件的控制之下,堆栈可在片内RAM中的任一区间设定,而堆栈的数据存取与一般的RAM存取又有区别,对它的操作,要遵循¡
后进先出¡
的原则
4硬件设计
4.1显示模块电路图
5软件设计
5.1主程序流程图
5.2定时中断程序流程图
5.3调时功能流程图
附录1系统电路图
附录2系统软件代码
SECEQU32H;
秒即时时间\伪指令
MINEQU31H;
分
HOUREQU30H;
时
DAYEQU35H;
日
MONEQU34H;
月
YEAREQU33H;
年
MIN_1EQU41H;
分定时器1路、开存储单元
HOUR_1EQU42H;
DAY_1EQU43H;
MON_1EQU44H;
YEAR_1EQU45H;
MIN_11EQU40H;
分定时器1路、关存储单元
HOUR_11EQU46H;
DAY_11EQU47H;
MON_11EQU48H;
YEAR_11EQU49H;
;
***********************
ORG0000H
ljmpMAIN
ORG0003H;
中断转换显示年月日、INT0(SB4键)
LJMPSHOW
ORG000BH;
计数中断T0、方式1
LJMPTIME
ORG0013H
LJMPCHANGE;
调整时间、定时、INT1(SB0键)
------主程序
ORG0030H
MAIN:
--------初始化付值
MOVYEAR,#02
MOVMON,#05
MOVDAY,#01
MOVHOUR,#00
MOVMIN,#00
MOVSEC,#00
CLR40H;
定时单元1路清零
CLR41H
CLR42H
CLR43H
CLR44H
CLR45H
CLR46H
CLR47H
CLR48H
CLR49H
-------开中断
MOVTMOD,#01H;
计数、模式1、T0
MOVTL0,#0B0H;
100SM计数定时
MOVTH0,#3CH;
clrp3.0
MOV20H,#0AH;
10次*100SM
SETBPT0;
T0为最高级
SETBTR0;
允许计数
SETBET0;
允许T0中断
SETBEX0;
允许INT0中断
SETBEX1;
允许INT1中断
SETBEA;
开总中断
------显示、定时器启动判断
LOOP:
MOVR1,#30H;
存储单元
MOVR4,#01H;
位选通
MOVR3,#03H;
三组显示
NEXT:
MOVA,@R1;
MOVB,#10;
将存储单元转换成两高低两组的BCD码
DIVAB
SWAPA
ORLA,B
MOVP0,A;
输出
MOVP2,R4
INCR1;
下一单元
MOVA,R4;
RLA;
位移
MOVR4,A
LCALLDE5SM;
延时0.5SM
DJNZR3,NEXT;
全扫描显示一偏
------判断定时输出(只编写了一路)
CJNER7,#88H,LOOP;
是8则开,否则、定时已关、转
---------开
MOVA,YEAR
CJNEA,YEAR_1,LOOP_1;
年比较,不等转关
MOVA,MON
CJNEA,MON_1,LOOP_1
MOVA,DAY
CJNEA,DAY_1,LOOP_1
MOVA,HOUR
CJNEA,HOUR_1,LOOP_1
MOVA,MIN
CJNEA,MIN_1,LOOP_1
CPLP3.0
---------关
LOOP_1:
CJNEA,YEAR_11,LOOP;
年比较
CJNEA,MON_11,LOOP
CJNEA,DAY_11,LOOP
CJNEA,HOUR_11,LOOP
CJNEA,MIN_11,LOOP
LJMPLOOP
-----年月日显示中断子程序
SHOW:
PUSHPSW
pushACC
PUSHB
PUSH01H
PUSH02H
PUSH03H
PUSH04H
MOVR2,#0FFH;
中断扫描次数
TURN:
MOVR1,#33H
MOVR4,#01H
MOVR3,#03H
NEXT_1:
MOVA,@R1
MOVB,#10
MOVP0,A
INCR1
RLA
MOVR4,A
LCALLDE5SM
DJNZR3,NEXT_1
DJNZR2,TURN;
反复显示一定时间后返回
POP04H
POP03H
POP02H
POP01H
POPB
POPACC
POPPSW
RETI
-----计数中断服务子程序
TIME:
PUSHACC
PUSH06H
MOVTH0,#3CH;
重装计数
MOVTL0,#0BH;
DJNZ20H,OUT;
转到中断跳出pop程序
重装:
100*10=1000
-----进位程序
INCSEC
MOVR6,SEC;
CJNER6,#60,OUT;
比较
MOVSEC,#00;
INCMIN
MOVR6,MIN
CJNER6,#60,OUT
INCHOUR
MOVR6,HOUR
CJNER6,#25,OUT
MOVHOUR,#00
INCDAY
MOVR5,MON
CJNER5,#1,MON_22;
是否1月、不是转2月
MOVR5,DAY
CJNER5,#32,OUT;
本月是否益出
INCMON
MOVDAY,#1
LJMPOUT
OUT:
POP06H
MON_22:
CJNER5,#2,MON_33;
是否2月、不是转3月
MOVA,YEAR;
判断是否瑞年
MOVB,#4
MOVA,B
JNZOUT_1;
不是则转(A不为零则转)
MOVR5,DAY
CJNER5,#30,OUT;
如是瑞年、判断是否到29天
MOVDAY,#1
OUT_1:
CJNER5,#29,OUT;
平年二月判断
MOVDAY,#1
MON_33:
CJNER5,#3,MON_44
CJNER5,#32,OUT
MON_44:
CJNER5,#4,MON_55
CJNER5,#31,OUT
MON_55:
MOVR5,MON
CJNER5,#5,MON_66
MOVR5,DAY
CJNER5,#32,OUT
MON_66:
CJNER5,#6,MON_77
MON_77:
CJNER5,#7,MON_88
CJNER5,#32,L1
L1:
LJMPOUT
MON_88:
CJNER5,#8,MON_99
CJNER5,#32,L2
L2:
MON_99:
CJNER5,#9,MON_00
CJNER5,#31,L3
L3:
MON_00:
CJNER5,#10,MON_AA
CJNER5,#32,L4
L4:
MON_AA:
CJNER5,#11,MON_BB
CJNER5,#31,L5
L5:
MON_BB:
CJNER5,#32,L6
INCYEAR
MOVMON,#1
L6:
-------按SB2\定时器年单元加1子程序
SB3_2:
LJMPSHOW_2;
二路没编返回
SB3_3:
LJMPSHOW_3;
三路没编返回
SB3_1:
MOVA,YEAR_1;
调时年单元
MOVB,#10
ORLA,B
MOVP2,#01H
LCALLREAD
LCALLDE250SM
CJNEA,01H,SB3_1
CJNEA,#0FBH,KEY2_7;
按SB2转年调整
LJMPMON_111;
按SB1往下调月单元
KEY2_7:
CJNEA,#0FDH,SB3_1
INCYEAR_1;
1路年单元加1
MOVR5,YEAR_1
CJNER5,#09,SB3_1;
益出
MOVYEAR_1,#00H
AJMPSB3_1;
-------月单元加1子程序
MON_111:
MOVA,MON_1;
调时月单元显示
MOVP2,#02H
CJNEA,01H,MON_111
CJNEA,#0FBH,KEY2_8;
按SB2转月调整
LJMPDAY_111
KEY2_8:
CJNEA,#0FDH,MON_111
INCMON_1;
1路月单元加1
MOVR5,MON_1
CJNER5,#13,MON_111;
MOVMON_1,#01H
AJMPMON_111;
转到月显
_------日单元加1子程序
DAY_111:
MOVA,DAY_1;
调时日单元显示提示
MOVP2,#04H
CJNEA,01H,DAY_111
CJNEA,#0FBH,KEY2_9;
按SB2转日调整
LJMPHOUR_111
KEY2_9:
CJNEA,#0FDH,DAY_111
INCDAY_1;
1组日单元加1
MOVR5,DAY_1
CJNER5,#32,DAY_111;
MOVDAY_1,#01H
AJMPDAY_111;
转到日显
-------按SB2时单元加1子程序
HOUR_111:
MOVA,HOUR_1;
调时时单元显示提示
CJNEA,01H,HOUR_111
CJNEA,#0FBH,KEY2_10;
按SB2转时调整
LJMPMIN_111
KEY2_10:
CJNEA,#0FDH,HOUR_111
INCHOUR_1
MOVR5,HOUR_1
CJNER5,#24,HOUR_111;
MOVHOUR_1,#00H
AJMPHOUR_111;
转到时显
-------分单元加1子程序
MIN_111:
MOVA,MIN_1;
调时分单元、并显示提示
CJNEA,01H,MIN_111
CJNEA,#0FBH,KEY2_11;
按SB2转分调整
AJMPOFF_CH;
按SB3往下调定时:
关单元
KEY2_11:
CJNEA,#0FDH,MIN_111
INCMIN_1;
1路分单元加1
MOVR5,MIN_1
CJNER5,#60,MIN_111;
益处
MOVMIN_1,#00H
AJMPMIN_111;
转到分显
年单元调整
OFF_CH:
MOVA,YEAR_11;
CJNEA,01H,OFF_CH
CJNEA,#0FBH,KEY2_F7;
LJMPMON_OFF;
KEY2_F7:
CJNEA,#0FDH,OFF_CH
INCYEAR_11;
MOVR5,YEAR_11
CJNER5,#09,OFF_CH;
MOVYEAR_11,#00H
MON_OFF:
MOVA,MON_11;
CJN