作息时间系统设计.docx
《作息时间系统设计.docx》由会员分享,可在线阅读,更多相关《作息时间系统设计.docx(23页珍藏版)》请在冰豆网上搜索。
作息时间系统设计
作息时间系统设计
一、设计目的
熟悉单片机语言,可以熟练的应用其完成基本设计,为以后的应用打下坚实的基础。
二、设计要求
1、显示时间(时、分、秒);
2、规定的作息时间给出闹钟信号;
3、手动输入作息时间表
三、设计原理
(一)、软件部分
本次软件部分采用结构化模块程序设计。
分为主程序、控制子程序、INT0和INT1中断控制子程序、T0中断服务子程序、显示程序五个部分。
整体程序见附录1
主程序流程图见图3-1
图3-1主程序流程图
1、主程序功能介绍
1.1程序内容如下
MAIN:
MOVSP,#5AH;堆栈指针
MOVSTONE_S,#60H;秒计数基制
MOVSTONE_M,#60H;分计数基制
MOVSTONE_T,#24H;时计数基制
MOVTIME,#00H
MOVMINUTE,#00H
MOVSECOND,#00H
MOVTMOD,#01H;设定时器T0工作方式1
MOVTL0,#0CAH;置T0初值
MOVTH0,#7DH
SETBEA;开中断
SETBET0;定时器T0中断允许
SETBEX0;外部中断0允许
SETBEX1;外部中断1允许
MOVTCON,#10H;启动定时器T0
LOOP:
LCALLDSUP;调显示
SJMPLOOP
1.2功能介绍
主程序的主要功能是设置时、分、秒的计数基制和设定定时器T0的工作方式。
此外还有开中断即定时器T0中断允许、外部中断1允许、外部中断0允许,启动定时器T0,调显示子程序等功能。
具体工作方式为:
首先对时、分、秒计时单元进行计数基制设定,再将定时器T0设定在工作方式1,对其进行置初值,开总中断,然后定时器T0中断允许、外部中断1允许、外部中断0允许,启动定时器T0,最后调显示子程序。
2、控制程序介绍
2.1、流程图见图3-2
图3-2控制程序流程图
2.2、控制程序内容如下
LOOP1:
MOVDPTR,#100CH
MOVADDRESS,DPL
LOOP4:
MOVDPL,ADDRESS
MOVR3,#04H
LOOP2:
INCDPTR
DJNZR3,LOOP2
MOVADDRESS,DPL
MOVR3,#03H;时,分,秒共3次
CLRA
MOVCA,@A+DPTR;取控制码
JZLOOP3;若A=0,则数据区结束
MOVSTONE_N,A;保存控制码
LOOP5:
INCDPTR;修改数据区时间单元指针
CLRA
MOVCA,@A+DPTR;读数据区时间
MOVNUMBER2,A;暂存
MOVA,29H;读计时单元时间
CJNEA,NUMBER2,LOOP4;比较时间
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVNUMBER2,A;暂存
MOVA,28H;读计时单元时间
CJNEA,NUMBER2,LOOP4;比较时间
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVNUMBER2,A;暂存
MOVA,27H;读计时单元时间
CJNEA,NUMBER2,LOOP4;比较时间;3次循环
MOVA,STONE_N;恢复控制码
MOVP2,A;由P2口输出
LOOP3:
RET
2.3、控制程序功能介绍
控制程序实现的主要功能是将当前时、分、秒分别与控制码进行比较,从而实现相应的功能控制。
具体工作方式为:
首先取出控制码,先将当前时与控制码进行比较若当前时等于控制码则将其值保存且时单元加1指向下一位分单元进行分单元的比较,若当前时不等于控制码则返回继续扫描比较。
时比较过后将分单元的值与控制码中的值进行比较,流程同时单元。
同样进行秒单元的比较。
最后若时、分、秒的当前值都与控制码中的时、分、秒相同,则将控制码保存送至P2口执行相应的打铃、息铃、播音、息音功能。
若不等则返回继续扫描比较。
3、INT0和INT1中断服务程序介绍
3.1、INT0和INT1中断服务程序流程图见图3-3
表格1
图3-3INT0/和INT1中断服务程序流程图
3.2、INT0和INT1中断服务程序内容如下
;INT0中断服务程序
INT00:
CLREX0;INTO中断关闭
PUSHACC
JNBP3.2,$;消除键抖动
INCMINUTE;分单元加1
MOVA,MINUTE;十进制调整
ADDA,#00H
DAA
MOVMINUTE,A
SUBBA,#60H;不等于计数基制则转DSUP2
JCDSUP2
MOVMINUTE,#00H;相等则分单元清零
DSUP2:
LCALLDSUP
POPACC
SETBEX0;开INT0中断
RETI;中断返回
;INT1中断服务程序
INT11:
CLREX1;INT1中断关闭
PUSHACC
JNBP3.3,$;消除键抖动
INCTIME;时单元加1
MOVA,TIME;十进制调整
ADDA,#00H
DAA
MOVTIME,A
SUBBA,#24H;不等于计数基制则转DSUP3
JCDSUP3
MOVTIME,#00H;相等则时单元清零
DSUP3:
LCALLDSUP;调用显示子程序
POPACC
SETBEX1;开INT1中断
RETI;中断返回
3.3、程序功能介绍
INT0和INT1中断服务程序实现的主要功能是调时和调分。
INT0调分,INT1调时。
当按键S0和S1每按下一次相应分和时数值就会加1,从而实现对时间的调整。
4、T0中断服务程序介绍
4.1、T0中断程序流程图如下
图3-4T0中断程序流程图
4.2、T0中断程序内容如下
CLOCK:
PUSHPSW;保护
PUSHACC
SETBRS0;选择工作寄存器组1
MOVTL0,#0CAH;重装初值
MOVTH0,#7DH
INCCOUNT;0.1s单元加1
MOVA,COUNT;取0.1s单元内容
CJNEA,#0AH,DONE;不等于10则转DONE
MOVCOUNT,#00H;等于则清零
MOVR0,#SECOND;指向秒计数单元
MOVR1,#STONE_S;指向秒计数单元基制
MOVR3,#03H;循环3次(秒,分,时)
LOOP0:
MOVA,@R0;取计时单元值
ADDA,#01H;十进制调整
DAA
MOV@R0,A;送回计时单元
MOVNUMBER1,@R1;暂存
CJNEA,NUMBER1,DONE0;不等于计数基制则转出
MOV@R0,#00H;等于则清零
INCR0;指向下一个技术单元
INCR1;指向下一个技术单元基制
DJNZR3,LOOP0;秒,分,时3次循环
DONE0:
LCALLLOOP1;调用控制子程序
DONE:
POPACC;恢复
POPPSW
RETI
(4.3、程序功能介绍
T0中断服务程序主要实现的功能是计时。
即通过定时器T0产生中断来实现计时。
可将T0设置成定时器工作方式1,并且以10ms为基本计时单元,每10ms产生一次中断,利用软件对中断进行累加计数。
当定时器产生100次中断后(即1s后),秒单元加1。
以此类推,当秒计数单元为60时对其清零同时分单元加1。
当分单元计数满60时,分单元清零同时时单元加1。
当时单元满24时,全部清零,重新计数以此循环。
5、显示程序介绍
5.1、显示程序流程图见图3-5
图3-5显示程序流程图
5.2、程序内容如下
DSUP:
MOVR0,#4FH;准备向缓冲区放数据
MOVA,SECOND
ACALLPTDS;放入秒值
MOVA,MINUTE
ACALLPTDS;放入分值
MOVA,TIME
ACALLPTDS;放入时值
MOVR0,#4AH;指向缓冲区首地址
MOVR2,#7FH;左边第一位开始显示
DSUP1:
ORLP0,#0FCH;关各数码管
MOVA,@R0;取显示缓冲区中的数
MOVP1,A;送出字形BCD码
MOVA,R2;取字位码
ANLP0,A;送字位码
MOVR3,#00H
DSUP4:
DJNZR3,DSUP4;延时
ORLP0,#0FCH;关各数码管
INCR0;修改显示缓冲区指针
CLRC;为移位作准备
MOVA,R2;取字位码
RRA;右移一位,为显示下一位做准备
MOVR2,A;存位码
JBACC.1,DSUP1;不到最后一位则继续
RET
;----------------------------------------------------
;向缓冲区送入数据
PTDS:
MOVR1,A;暂存
ACALLPTDS1;低四位放入缓冲区
MOVA,R1;取出原数
SWAPA;高四位放入低四位中
PTDS1:
ANLA,#0FH;放入显示缓冲区
MOV@R0,A
DECR0;缓冲区地址指针减1
RET
5.3、程序功能介绍
显示程序主要实现的功能是将段码和位码送至数码管进行显示。
(二)、硬件部分
1、整体电路
图1硬件电路接线图
2、整体功能介绍
本次课程设计所用的元件主要有80C51单片机、CD4511译码驱动器、74LS04六反相器、6位七段LED数码管显示。
其中CD4511主要功能是将来自80C51的P1.0-P1.3的时、分、秒的BCD码当前值进行译码,然后送至6位数码管进行显示。
51单片机的P0.2-P0.7端口主要将来自控制信号的位码送至6位数码管进行显示。
74LS04主要控制播音和打铃。
3、其他电路介绍
3.1、51单片机硬件资源分配
P0.0接S0调分按钮
P0.1接S1调时按钮
P0.2-P0.7接6位LED数码管的6-1端
P1.0-P1.3接CD4511的A-D端
P2.0接播音
P2.4接打铃
3.2、控制电路功能介绍
本次设计控制部分主要有按键S0、S1,51单片机及6位LED数码管组成。
其主要功能是对时和分进行调整使其与标准时间保持一致。
S0调分,S1调时。
当按键每按下一次数码管上时或分就加1显示,从而实现校正功能。
控制框图见图2-6。
图32按键控制电路框图
3.3译码驱动电路功能介绍
译码驱动电路部分主要有CD4511译码驱动器构成。
其基本结构框图见图2-7。
图2-7译码驱动电路结构框图
CD4511的A-D脚分别与51单片机的P1.0-P1.3口相接,将接受来的时、分、秒BCD码进行译码后在经其QA-QG脚将段码送至数码管,驱动数码管显示数据。
3.4、BCD码介绍
用四位二进制代码来表示一位十进制数,称为二--十进制编码,简称BCD(BinaryCodedDecimal)码。
根据代码的每一位是否有权值BCD码可分为有权码和无权码两类,应用最多的是8421BCD码,无权码用得较多的是余三码和格雷码,我们通常所说的BCD码指的是8421BCD码。
这些编码跟十进制数对应的关系见表2-2。
表2-2十进制数与其他数码之间的关系
十进制数
8421BCD码
余3码
格雷码
0
0000
0011
0000
1
0001
0100
0001
2
0010
0101
0011
3
0011
0110
0010
4
0100
0111
0110
5
0101
1000
1110
6
0110
1001
1010
7
0111
1010
1000
8
1000
1011
1100
9
1001
1100
0100
8421BCD码中的“8421”表示从高到低各位二进制位对应的权值分别为8、4、2、1,将各二进制位与权值相乘,并将乘积相加就得相应的十进制数。
例如,8421BCD码“0111”,0×8+1×4+1×2+1×1=7D,其中D表示十进制(Decimal)数。
值得特别注意的是,8421BCD码只有0000~1001共十个,而1010、1011...等等不是8421BCD码!
!
余三码是在8421BCD码的基础上,把每个数的代码加上0011(对应十进制数3)后得到的。
格雷码的编码规则是相邻的两代码之间只有一位二进制位不同。
不管是8421BCD码还是余三码还是格雷码,总是4个二进制位对应一个十进制数,如十进制数18对应的8421BCD码就是00011000。
压缩的BCD码用4个二进制位来表示十进制数,上面提到的就是压缩的BCD码。
而非压缩BCD码用一个字节(八个二进制位)表示一位十进制数,高4位总是0000,低4位的0000~1001表示相应的十进制数。
例如,十进制数87D,采用非压缩8421BCD码表示为二进制数是0000100000000111B。
这种非压缩BCD码主要用于非数值计算的应用领域中。
四、测试结果
当9:
00时,开始灯亮
当15秒后,灯熄灭
五、心得体会
通过这次的硬件课程设计,我们学到了很多的课本以外的知识,同时也复习了课本的知识。
在收获的同时,我们也深刻的了解到了,即使书本上的知识掌握的再好,在将它付诸实践时还是会遇到各种各样的问题。
这次课程设计就是一次对自己所学知识的总结和应用,使我们对微机原理这门课程有了更深的了解。
本次实验对于我们来说是一次很难得的锻炼机会。
为了实现本次实验,我们需要从一个模型从项目选择、方案选择和论证电路设计、元器件选择等到软硬件的设计及实现,再到最终的测试和调试整个工作过程,了解并掌握了系统设计时软件、硬件以及软硬件联合设计、制作和调试。
因此,无论是在理论方面,还是实际动手能力方面都有很大提高。
但同时,我们也发现我们存在着很多欠缺之处,在以后的学习中,我们一定会再接再厉,更多的掌握这方面的知识、技能,为以后走进更高的学习领域或工作岗位打下基础。
经过几天的奋斗,我们把以前不牢靠的知识基础被再一次夯实,对于微型计算机原理和接口技术有了更进一步的把握和理解。
最终我们的设计顺利的通过,但是由于我们的能力有限,时间有限,有一些功能并不能按照我们最初的设想完成。
所以我们不会满足,为了更好的适应接下来的学习与应用,我们会利用更多的课余时间来学习和应用我们已经掌握了的知识,将这些作为将来的技术学习基础。
参考文献
[1]周荷琴吾秀清主编《微机原理与接口技术》合肥:
中国科学技术出版社
[2]李恩林陈斌生主编《微机接口技术300例》北京:
机械工业出版社2003
[3]《微机原理与接口技术实验与实践教程》汤书森清华大学出版社
[4]《硬件课程设计大纲》马海波中国矿业大学计算机学院
[5]《硬件课程指导书》马海波,刘厚泉中国矿业大学计算机学
附录1
本次课程设计程序
;变量定义区
;-------------------------------------------------------
COUNTEQU26H;0.1s计数单元
SECONDEQU27H;秒计数单元
MINUTEEQU28H;分计数单元
TIMEEQU29H;时计数单元
COUNT_TEQU2AH;计时单元加1暂存器
STONE_SEQU2BH;存放秒计数基制
STONE_MEQU2CH;存放分计数机制
STONE_TEQU2DH;存放时计数机制
ADDRESSEQU2EH;保存数据区地址暂存器
STONE_NEQU3AH;控制码存储单元
NUMBER1EQU38H;数据暂存单元
NUMBER2EQU3BH;数据暂存单元
;4AH~4FH显示缓冲区
;---------------------------------------------------------
ORG0000H
LJMPMAIN;转主程序
ORG0003H
LJMPINT00;转INT0中断服务程序
ORG000BH
LJMPCLOCK;转T0中断服务程序
ORG0013H
LJMPINT11;转INT1中断服务程序
;----------------------------------------------------------
;主程序
MAIN:
MOVSP,#5AH;堆栈指针
MOVSTONE_S,#60H;秒计数机制
MOVSTONE_M,#60H;分计数机制
MOVSTONE_T,#24H;时计数机制
MOVTIME,#00H
MOVMINUTE,#00H
MOVSECOND,#00H
MOVTMOD,#01H;设定时器T0工作方式1
MOVTL0,#0CAH;置T0初值
MOVTH0,#7DH
SETBEA;开中断
SETBET0;定时器T0中断允许
SETBEX0;外部中断0允许
SETBEX1;外部中断1允许
MOVTCON,#10H;启动定时器T0
LOOP:
LCALLDSUP;调显示
SJMPLOOP
;-----------------------------------------------------------
;显示程序
DSUP:
MOVR0,#4FH;准备向缓冲区放数据
MOVA,SECOND
ACALLPTDS;放入秒值
MOVA,MINUTE
ACALLPTDS;放入分值
MOVA,TIME
ACALLPTDS;放入时值
MOVR0,#4AH;指向缓冲区首地址
MOVR2,#7FH;左边第一位开始显示
DSUP1:
ORLP0,#0FCH;关各数码管
MOVA,@R0;取显示缓冲区中的数
MOVP1,A;送出字形BCD码
MOVA,R2;取字位码
ANLP0,A;送字位码
MOVR3,#00H
DSUP4:
DJNZR3,DSUP4;延时
ORLP0,#0FCH;关各数码管
INCR0;修改显示缓冲区指针
CLRC;为移位作准备
MOVA,R2;取字位码
RRA;右移一位,为显示下一位做准备
MOVR2,A;存位码
JBACC.1,DSUP1;不到最后一位则继续
RET
;----------------------------------------------------
;向缓冲区送入数据
PTDS:
MOVR1,A;暂存
ACALLPTDS1;低四位放入缓冲区
MOVA,R1;取出原数
SWAPA;高四位放入低四位中
PTDS1:
ANLA,#0FH;放入显示缓冲区
MOV@R0,A
DECR0;缓冲区地址指针减1
RET
;-------------------------------------------------------
;控制程序
LOOP1:
MOVDPTR,#100CH
MOVADDRESS,DPL
LOOP4:
MOVDPL,ADDRESS
MOVR3,#04H
LOOP2:
INCDPTR
DJNZR3,LOOP2
MOVADDRESS,DPL
MOVR3,#03H;时,分,秒共3次
CLRA
MOVCA,@A+DPTR;取控制码
JZLOOP3;若A=0,则数据区结束
MOVSTONE_N,A;保存控制码
LOOP5:
INCDPTR;修改数据区时间单元指针
CLRA
MOVCA,@A+DPTR;读数据区时间
MOVNUMBER2,A;暂存
MOVA,29H;读计时单元时间
CJNEA,NUMBER2,LOOP4;比较时间
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVNUMBER2,A;暂存
MOVA,28H;读计时单元时间
CJNEA,NUMBER2,LOOP4;比较时间
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVNUMBER2,A;暂存
MOVA,27H;读计时单元时间
CJNEA,NUMBER2,LOOP4;比较时间;3次循环
MOVA,STONE_N;恢复控制码
MOVP2,A;由P2口输出
LOOP3:
RET
;----------