毕业设计单片机电子时钟设计Word文档格式.docx
《毕业设计单片机电子时钟设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《毕业设计单片机电子时钟设计Word文档格式.docx(46页珍藏版)》请在冰点文库上搜索。
确定变成结构和思路
综合各程序完成整体程序
编辑各个程序模块
用Proteus画出电路图
调试程序,进行修改
对仿真中出现的问题进行改正
画出仿真图进行仿真
准备器件、搭接电路
仿真成功
软硬件结合,完成任务书要求
验证硬件电路
成功
进行扩展
图整体设计思路
针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
如此,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方式,如此既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、按时程序。
运用这种方式,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
3主要元件的利用方式
下面就本次设计顶用到的主要元件的所有功能进行简单的介绍,包括AT89C51单片机、74LS07芯片、和数码管的特性和用法。
AT89C51单片机:
单片机的结构如下:
图单片机引脚图
在使历时VCC接电源电压,GND接地。
P0,P1,P2,P3可作为输入或输出端口,RST是复位输入,接复位电路。
XTAL1和XTAL2接复位电路。
这些能够在硬件设计部份表现出来。
7407驱动器
7407是集电极开路六正相高压驱动器,引脚1入2出,3进4出,5进6出,9进8出,11进10出,13进12出,7接地,14接高电平。
7407引脚图:
图7407引脚图
g
f
a
b
e
d
dp
c
8
7
10
9
6
1
2
3
4
5
数码管:
图数码管
利用共阴极数码管时将6个数码管按相同功能连接起来,3与8相连,当选通端所接管脚为低电平时该数码管选通。
单片机的P2口作为选通端,连接各数码管的3、8引脚轮流显示,连接时要加7407和上拉电阻。
单片机的P1口作为功能段,通高电平的引脚会使相应段亮起,一样的也要与7407和电阻连接利用。
4电路设计
整体设计
这次设计主如果应用单片机来设计电子时钟,硬件部份主要分以下电路模块:
显示电路用六个数码管别离显示小时(年份)、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的利用,使电路加倍简单。
单片机采用AT89C51系列,这种单片机应用简单,适合电子钟设计。
电路的整体设计框架如下:
单片机
输入部分
晶振和复位
输出部分
图电路模块图
分块设计
这部份介绍各模块电路的设计方式和功效,主要分为:
输入部份、输出部份、复位和晶振电路。
4.输入部份
在电子钟的输入部份,设置相应的置数功能,通过外部设备的输入,如按键,实现时间的修改。
除此之外,调整闹铃、按时、日期时也需要按键进行输入。
在选用输入端口时,将P3引脚与按键相连进行输入。
设计的输入部份如下:
图输入部份
各按键功能在后面的部份将会介绍到
4.输出部份(显示电路)
该部份电路图如下所示:
图显示部份
在实际电路中采用单个数码管相连进行显示,先把数码管的一、二、4、五、六、7、九、10对应相连,然后把各晶体管的3和8引脚各自相连,~别离接a~g,P2作为选通端~别离从左到右接各数码管的3、8端。
采用动态显示,即一名一名地轮流点亮列位显示器,因此~轮流置0。
持续时刻为1ms,这点在程序部份还会讲到。
4.晶振与复位电路:
图晶振与复位电路
5程序设计
程序思路
初始化
判断按键
显示
按下3键
按下1键
按下2键
若无按键
调时
调闹钟
调定时
显示所调时间
显示闹铃时间
显示定时时间
调整时限到或有其他输入
图程序设计思路
结合电路,程序的整体思路是:
一、点复位键后,进行时刻显示,从0时0分0秒开始。
2、按下按键1时,进行调时,现在按下4调整时,按下5调整分,若2秒钟未按键,则再也不等待,恢复走时,持续按键时大约秒步进1,下同。
3、按下2键时进行闹铃调整,用4、5键别离调时和分,现在只有前四位进行显示,即闹铃功能精准到分,2秒钟无按键则返回时刻显示,时刻抵达闹铃所按时刻时输出高电平,蜂鸣器响,按下按键2或3时蜂鸣器停止。
4、按3键时进行按时的设定,一样,别离通过4、5调整分和秒,若两秒未按键则不进行按时,设定以后再次按下3键则进行倒计时,倒计不时刻未到时若按下1键则进行时刻显示;
若倒计不时刻到则为高电平,蜂鸣器响。
按时的最大值为59分59秒。
程序设计步骤
在程序设计进程中,我碰到了很多困难,这部份也是让我学到很多东西的地方。
第一,我学习了按时器的相关知识,计数器的利用是很重要的组成部份[15],在那个设计当选择计数器T0。
T0的工作方式有:
方式0:
不推荐
方式1:
16位计数器,常常利用
方式2:
自动重装初值的8位按时/计数器
方式3:
T0相当于两个独立的8位按时/计数器
此程序采用方式1,方式1的按不时刻t为t=(216-M)*12/fosc。
其中M为按时器初值,fosc为12MHz,若M为0则t=65536*12/2*106=。
因此可取50ms为计时单位,初值M应为50*10-3*106=216-M。
M=15536=0=3CB0。
即按时器初值为TH0=03CH,TL0=0B0H。
按时器中断20次为一秒,这部份在中断程序顶用到。
第二,我参看了文献中的设计思路,做到胸有成竹后再进行具体的程序书写工作。
认真学习了教科书中关于汇编语言编程的问题,熟悉了汇编语言的编程方式和语法适应。
第三步就是进行具体的程序编写工作。
程序的主要模块
延迟程序
在动态扫描时,必然用到延迟程序,这里利用延迟1ms的程序,此程序需要反复挪用。
D_1MS:
MOVR7,#2
D_5:
MOVR2,#250
DJNZR2,$
DJNZR7,D_5
RET
中断服务子程序
中断服务程序中,整体思路是:
由于初值是3CB0H,所以装满按时器需要50ms的时刻,从而20次中断为一秒,一秒以后,判断是不是到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。
包括日期显示的功能也是如此。
另外,由于要实现倒计时功能,因此在中断程序中还要加入减一的寄放器,需要时将其进行显示。
基于以上考虑,以R3为倒计时中的秒,R4为倒计时的分,当秒加1时R3减一,减到0以后,秒赋值为59,分减一,直到分为0。
再显示走时部份。
流程框图如下:
给T0赋值
中断20次
R3赋值为60
分=0,秒=0,时加一
秒加一
R3、R4都为0时倒计时结束,蜂鸣器响,显示走时状态
秒=60
Y
秒=0时加1
N
时=24
分=60
分=0,秒=0,时=0
返回
R3=0
R3、R4减一
图中断程序思路
主程序
主程序主要对按键进行扫描,和判断按时和闹铃时刻是不是已到,若到则挪用声音程序,该段程序如下:
MAIN:
JNB,DATETZ;
按下0键时,显示日期并可对日期进行调整
JNB,ZSTZ1;
按下1键时,显示时刻,并可调时
JNB,NLTZ1;
按下2键进行闹铃设置
JNB,DSTZ;
按下3键进行按时设置
ACALLDISP;
MOVA,HOUR;
SUBBA,38H;
JZFEN;
AJMPDSPD2;
FEN:
MOVA,MINUTE;
SUBBA,37H;
JZSHENGYIN1;
DSPD2:
MOVA,R4;
JZS_PD;
AJMPMAIN;
S_PD:
MOVA,R3;
显示程序
6个晶体管轮流进行显示,别离显示1ms,这依赖的是人们视觉的惰性,该段程序如下:
DISP:
;
走时的显示程序,包括调不时的显示
MOVDPTR,#LEDTAB
MOVA,SECOND
MOVB,#10
DIVAB;
A存十位B存个位
MOVCA,@A+DPTR
MOVP1,A
CLRSEC_S
ACALLD_1MS;
显示秒十位
SETBSEC_S
MOVA,B
CLRSEC_G
显示秒个位
SETBSEC_G
……
以此类推,进行时和分的显示
另外,调闹铃和按不时刻、进行日期显示时,有各自的显示程序,但不能成为独立子程序,别离柔和在闹铃、按时、和日期程序中。
闹铃程序和按时程序
这两段程序别离包括了各自的显示、调整程序。
程序思路是对照,走时部份的程序,进行编写,包括显示程序,与显示时刻的程序是相似的,闹铃和按时的调整程序与走时调整程序相似。
程序调试
程序写完以后必需进行调试,以验证程序是不是正确。
在程序调试时,出现了很多问题,比如跳转距离太长、打错字母、逻辑有错等,发觉问题后,利用两天时刻进行了更正,但即便编译通过,最后也不必然能够实现功能。
以为程序的调试只能检查出语法错误,而不能检查出逻辑的错误。
要真正把程序写对,要通过仿真发觉而且更正错误。
6功能仿真
这部份工作可能碰到的困难是很多的,程序庞大极可能出现各类问题。
在仿真工作中,第一要对仿真软件有足够的了解并能够正确熟练地运用
软件介绍
在这部份工作顶用到了medwin3和Proteus两个软件,其中Medwin3用来编译程序并生成hex文件,装入Proteus仿真图的芯片中,通过仿真结果一步步进行调整最后达到预期的功能。
仿真进程:
仿真图的绘制
在利用Proteus进行仿真时,仿真图不用画出数码管驱动程序,其他部份与设计的硬件图相仿。
绘制结果如下:
图仿真图
功能的实现
在绘制仿真图以后,要向单片机装入程序,从而使单片机开始工作并带动整个电路工作,装入进程为:
点击单片机,选择所编译程序的输出hex文件,肯定即可。
现在单片机缘依照程序所设定的功能进行工作,在仿真进程中会碰到各类问题。
这里列出仿真结果:
(1)走时仿真:
图走时状态下的仿真结果
(2)闹钟设定的仿真:
图闹铃仿真结果
可见所定闹钟时刻为10点15分。
(3)按时钟倒计时的仿真:
图倒计时仿真
可见,倒计时进行到3分3秒。
7日历功能的实现
在设计的开始阶段,我主要考虑了日期的逻辑算法。
第一,要考虑年份是不是闰年,闰年的判断方式是:
将年份除以100,若能整除,则将年份除以400,若还能整除,则为闰年,若不能,则为平年;
若不能被100整除,则判断是不是能被4整除,若能,则为闰年,若不能则为平年。
只有2月与平、闰年相关,因此在闰年和平年的子程序中,要判断是不是2月,若是则在相应的年中进行日期的增加,若不是则转入平时的月份。
其中一、3、五、7、八、10、12月是每一个月31天,4、六、九、11月为每一个月30天。
在电路方面:
用按键的输入决定6个数码管显示日期仍是时刻,按键控制为:
按下1键时,显示日期,而且用4、五、6键别离调全年、月、日;
按下2键时,进行走时和时刻调整;
3键位闹铃键;
4键为按时键。
程序思路如下:
年份能否被100整除
年份是否能被4整除
年份是否能被400整除
平年
闰年
是不是2月
日>
=28之后返回为1
=29之后返回为1
若月份为1、3、5、7、8、10、12月则调用31天的程序
若月份为4、6、9、11则调用30天的程序
图扩展部份思路
按键形式:
图按键图示
结论
通过对数字时钟的设计,加倍深了对单片机功能的了解和各个模块程序的挪用,编程。
在实物设计时候碰到了更多的问题,比如芯片的质量问题不能取得保证。
由于用全能电路板搭建,飞线数量特别多,整个实物给人的印象十分复杂,在焊接的进程中不免出现各类错误,通过等的帮忙,最终实现了部份功能,在此对他们真挚的感激
附录完整程序
HOU_SBIT;
第一个数码管
HOU_GBIT;
第二个数码管
MIN_SBIT;
第三个数码管
MIN_GBIT;
第四个数码管
SEC_SBIT;
第五个数码管
SEC_GBIT;
第六个数码管
DAYEQU39H;
日期
MONTHEQU3AH;
月份
YEAREQU3BH;
年份
SECONDEQU30H;
秒
MINUTEEQU31H;
分
HOUREQU32H;
时
TIM_1EQU33H;
TIM_2EQU34H;
ORG0000H
LJMPCHUSHI
ORG000BH
LJMPTIMER0
ORG30H
CHUSHI:
MOVSECOND,#0;
MOVMINUTE,#0;
MOVHOUR,#0;
时刻的初值为000000
MOVDAY,#1;
MOVMONTH,#1;
MOVYEAR,#1;
日期的初值为000000
SETBHOU_S;
SETBHOU_G;
SETBMIN_S;
SETBMIN_G;
SETBSEC_S;
SETBSEC_G;
初始状态为1,都不显示
MOVR0,#0;
MOVR1,#12;
闹铃初始化
MOVR3,#0;
MOVR4,#1;
存储按不时刻,点击按时开始后,从所存时刻开始倒计时
MOVR5,#0;
MOVR6,#0;
设定按不时刻所用寄放器
MOV38H,#12;
MOV37H,#0;
存储所定闹铃,以便判断是不是闹铃时刻到
CLR;
MOVTIM_1,#10;
执行完后经历秒
MOVTIM_2,#2;
执行完后经历1秒
ANLTMOD,#0F0H
ORLTMOD,#01H;
按时器0为模式1
MOVTH0,#03CH
MOVTL0,#0B0H;
装入初值
SETBET0;
SETBTR0;
SETBEA;
允许中断
挪用显示程序
FMQPD:
判断按时是不是到零、闹铃时刻是不是已到
MOVA,HOUR;
SUBBA,38H;
判断时是不是到闹铃所按时刻,若到,则对分进行判断,若不到,则对按时进行判断
AJMPDSPDKQ
MOVA,MINUTE;
SUBBA,37H;
时和分都到闹铃时刻则蜂鸣器响
DSPDKQ:
判断是不是应该进行按不时刻的判断
MOVA,3CH;
3CH是引入的判断因子,当其为0时不对按不时刻是不是到0进行判断,从而不开启蜂鸣器
JNZDSPD2;
当3CH不是0时,跳转到按时判断程序
AJMPMAIN
MOVA,R4;
MOVA,R3;
DSTZ:
AJMPDSTZ1;
DATETZ:
AJMPDATETZ1;
SHENGYIN1:
MOV3CH,#1
SETB
ZSTZ1:
MOV35H,#60;
MOV36H,#10;
ZSTZ2:
DJNZ35H,ZSTZ2;
JNB,H_T;
JNB,M_T;
DJNZ36H,ZSTZ2;
H_T:
INCHOUR;
CJNEA,#24,ZSTZ1;
AJMPZSTZ1;
M_T:
INCMINUTE;
CJNEA,#60,ZSTZ1;
NLTZ1:
DEC38H
MOV35H,#100;
NLTZ2:
ACALLONE;
ACALLTWO;
DJNZ35H,NLTZ2;
JNB,NLXS2;
JNB,NLXS1;
DJNZ36H,NLTZ2;
NLXS1:
MOVDPTR,#LEDTAB;
INCR0;
MOV37H,R0;
CJNER0,#60,NLTZ2;
AJMPNLTZ2;
ONE:
MOVA,R0;
MOVB,#10;
MOVCA,@A+DPTR;
MOVP1,A;
CLRMIN_S;
MOVA,B;
CLRMIN_G;
SETBMIN_G