电子钟.docx
《电子钟.docx》由会员分享,可在线阅读,更多相关《电子钟.docx(21页珍藏版)》请在冰豆网上搜索。
电子钟
单片机技术课程设计说明书
数字电子钟
系、部:
电气与信息工程系
学生姓名:
指导教师:
职称讲师
专业:
电子信息工程
班级:
完成时间:
学号:
摘要
数字电子钟广泛应用于生活生产中,对其深入了解很有必要,在此用单片机设计了一个简单的数字电子钟。
本设计为基于AT89S52单片机,辅以必要的外围电路,用自制单片机实验板设计了一个简单的数字电子时钟。
在硬件方面,除了单片机外,用数码管来进行显示,LED采用动态扫描显示。
通过LED能够比较准确显示时、分、秒,四个简单的按键实现对时间的调整。
软件方面采用A51汇编语言编程。
整个电子钟系统能完成时间的显示,调时,调分,调秒,复位功能。
本次设计的电子钟采用独立式键盘,用共阳数码管显示,因为LED亮度较高,显示醒目所以此电子钟在部分场所推广很大。
关键词数字电子钟、AT89S52、汇编语言
1课题设计任务、功能要求及总体方案
1.1课题设计任务
本课程设计选题目为:
数字电子钟。
设计一个具有特定功能的电子钟。
1.2功能要求
设计的数字电子钟上电或按键复位后能自动显示系统提示符“P.”,进入时钟准备状态;第一次按数字电子钟启动,数字电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按数字电子钟调整键,则数字电子钟进入时钟调整状态,并且时间停止不动(闪烁状态),此时可分别利用各调整键调整时、分、秒,调整结束后可按调整键再次进入时钟运行状态。
1.3设计总体方案介绍及工作原理说明
本课程设计采用AT89S52单片机设计一个数字电子钟,通过两个4位LED数码管显示时、分、秒,并设有9个按键。
其中一个用于单片机的复位;一个为启动键,一个为调整键;还有两个分别为加,减键;其他键本课题暂不用。
电路分为5部分,分别为复位电路、键盘电路、时钟电路、显示电路和控制电路。
复位电路采用按键复位方式。
键盘电路采用独立式键盘。
时钟电路用12MHz的晶振产生时钟信号。
显示电路采用8个三极管驱动两个4位LED显示。
控制电路采用8位的AT89S52单片机作为CPU;原理是:
时钟用T0为时钟秒加1中断,时间常数位10MS,每100次加1S,T0用为时间加1中断。
其设计框图如图1.1所示:
图1.1设计方案框图
2数字电子钟硬件系统的设计
2.1硬件系统各模块功能简要介绍
2.1.1复位电路
复位是单片机的硬件初始化操作。
经复位操作后,单片机系统才能开始正常工作。
单片机上有复位引脚RST,用于外接复位电路,这里复位电路采用按键电平复位。
2.1.2时钟电路
单片机工作所需的同步时钟信号由以下两种方法获得:
由单片机片内时钟电路结合外部晶振、电容产生和直接从单片机外部引入脉冲信号。
这里用第一种方法产生时钟信号。
电路用12MHz的石英晶体和二个微调电容(为33pF)连接起来接到单片机的XTAL1和XTAL2引脚上。
2.1.3键盘电路
由于按键较少,所以此处使用独立式键盘,键盘接到单片机的P1口上,当键按下时,在其相应的口线上产生低电平信号,键松开时仍为高电平信号。
2.1.4显示电路
本显示电路采用三极管驱动两个4位数码管段位控端;用单片机的P2口控制位控;用单片机的P0口线作段控口,位、段控线上都串入470Ω的限流电阻。
3数字电子钟软件系统的设计
3.1数字电子钟使用单片机资源情况
在电子钟的编程过程中,单片机资源使用情况如下:
⑴寄存器:
通用寄存器的R0~R7;
⑵位地址:
20H(用于保存启动/调整键盘当前的状态);
⑶IO口线:
P0口(段控口),P2口(位控口),P1口(作键盘接口);
⑷堆栈栈底单元地址:
60H;
⑸定时器:
定时器0,定时器1,定时器2;
⑹显示缓冲单元:
40H~47H;
⑺秒分时对应储存单元:
32H~33H
⑻生成键码出口地址:
20H。
3.2数字电子钟软件系统各模块功能简要介绍
3.2.1显示模块
此处将显示程序编成一个子程序,要显示时调用显示子程序即可,显示程序中显示的是缓冲区中的内容再调数据表格中显示代码,程序中只要将要显示的内容在数据表中的位置送往显示缓冲区即可,就可以显示你所需要显示的内容。
3.2.2中断服务程序模块
程序中用了个定时器中断,所以有中断服务程序,是为了使秒自加而使用定时器中断,定时10MS循环100次到一秒以后,向CPU申请中断,使秒自加1。
秒满60秒分加1,分满60分时加1,时满24则显示全为0
3.2.3键盘模块
运用直接判断IO口线的方法编成键盘扫描程序,来完成用键盘监控程序的功能,总共用了四个键,分别为P1.0,P1.1,P1.2,P1.3其具体的功能P1.0:
时间调整;P1.1:
时间加;P1.2为时间减;P1.3为启动键。
使用键盘能够很准确的、快速的监控系统。
3.3系统软件程序流程框图
3.3.1主程序流程框图
主程序流程框图如图3.1所示:
图3.1主程序流程图
3.3.2中断服务程序流程框图
中断服务程序流程图如图3.2所示:
图3.2中断服务程序流程图
3.3.3加1子程序流程框图
加1子程序流程框图如图3.3所示:
图3.3加1子程序流程图
3.3.4减1子程序流程框图
加1子程序流程框图如图3.4所示:
图3.4减1子程序流程图
3.3.5键扫描子程序流程图框图
键扫描子程序流程图框图如图3.5
图3.5键扫子程序流程图
3.3.6显示子程序流程图框图
显示子程序流程图框图如图3.6
图3.6显示子程序流程图
3.4数字电子钟软件系统程序清单
程序清单详见附录A
4仿真与误差分析
4.1数字电子钟的设计结论及使用说明
本课程设计的目的是设计一个电子钟,通过原理图的绘制,PCB板的制作,最终做出的实物是成功的,能够达到预期的目的,以下本次所作电子钟的具体的使用说明:
电子钟上电后,最高位显示P.,按下启动,电子钟从0时0分0秒开始自动运行,再次按下调整键,电子钟运行停止,处于调整状态,按下加减键,可以实现时、分、秒加键1,这样可以实现时、分、秒的累加调整,再次按下调整键,电子钟自动运行起来,处于运行状态,调整结束。
4.2设计课题的仿真结果
如图4.1、4.2所示:
图4.1显示P.仿真结果
图4.2运行仿真结果
4.3设计课题的误差分析
本课程设计存在一定误差,引起误差原因主要是程序中定时后很多指令引起的时间误差。
经过测试10小时,时钟慢25秒,则每秒钟慢2.5/3600=0.6944MS,
因此每次需要中断的时间要比标准的中断时间要慢0.6944/20=0.03472MS.TH0TL0=65536-[(50-0.03472)*1000]/1=15570=3CD2H,所以将原来的初值改为TH0TL0=3CB0H改为TH0TL0=3CD2H。
4.4设计体会
本次做课程设计,从硬件方面说,我认为本次设计的重点在于单片机的最小系统,若单片机的最小系统不能正常工作,那后面一切都免谈;从软件方面说,我编程的思路就是从简单到难,一步一步实现各个功能。
这个电子钟的程序重点在于调整键功能程序和中断服务程序的编写,这两个小模块编好了,就很容易了。
在做课程设计的过程中,学到很多东西,比如说做PCB板的技术有了很大的提高,再比如说,自己通过编电子钟的程序,使自己对汇编指令的应用越来越熟练,编程的能力也有了较大提高。
在制作电子钟的过程中,遇到的问题都能尝试去自己解决,比如说调试程序,检查线路等等,使自己发现问题、解决问题的能力大大提高。
4.5教学建议
通过一个学期的单片机课,使我对单片机有了基本的了解。
在这里我只是觉得我们的动手能力还很欠缺,还得增加实践、提高动手能力。
为以后实际工作打下基础。
参考文献
[1]李广第,朱月秀,冷祖祁.单片机基础[M].第三版.北京:
航空航天大学出版社,2007.18-152
LiGuangdi,ZhuYuexiu,LengZuqi.Scmcbasis[M].Thethirdedition.Beijing:
Aerospaceuniversitypress,2007.18-152
[2]邱丽芳,彭志刚,胡汉辉.单片机原理与应用.第二版.北京:
人民邮电出版社,2009.7-259
QiuLifang,PengZhigang,HuHanhui.Single-chipmicrocomputerprincipleandapplication.Thesecondedition.Beijing:
Beijingpeople'stelephoneandpostalpress,2009.7-259
[3]夏宽理.程序设计[M].上海:
复旦大学出版社,2000.7.26~44
XiaKuangli.Programming[M].Shanghai:
FudanUniversityPress,2000.7.26~44
致谢
在本课程设计进行过程中得到吴老师的悉心指导,还有很多同学的帮助。
吴老师严谨求实的治学态度,踏实坚韧的工作精神,将使我终生受益。
在此,谨向老师和帮助我的同学致以诚挚的谢意和崇高的敬意。
附录
附录A
程序清单:
*************************************************************
;项目名称:
数字电子钟
;设计者:
刘金伟
;设计日期:
2010年12月28日
;*************************************************************
;堆栈栈底60H;
;*************************************************************
;DATA_CHANGE:
时间数据转换子程序(时间刷新)
;KEY_SET:
键设定子程序(K1-加键K2-减键)
;TIME_SET:
时间设定子程序(K4-时间调整键)
;TIMER0:
定时器0中断服务程序(负责计时)
;TIMER1:
定时器1中断服务程序(负责时间调整时闪烁)
;TIMER2:
定时器2中断服务程序(负责数码管显示)
;BEEP_BL:
蜂鸣器驱动子程序
;DELAY:
延时R5*10MS子程序(负责消抖)
;TABLE(共阳数码管字型代码表)
;Tabl(位控代码表)
;*************************************************************
;*K4-选择键K1-加键K2-减键K3-开始键
;*K4:
P1.0K1:
P1.1K2:
P1.2K3:
P1.3
;*************************************************************
HOUREQU31H;时存放单元
MINEQU32H;分存放单元
SECEQU33H;秒存放单元
MSECEQU34H;10MS计数值存放单元
NUMBERSEQU36H;TIMER1中断计数单元
COUNTEQU37H;设定值临时存放单元
MAX_NUMEQU38H;时间最大值存放单元
DISPLAYEQU40H;时间显示缓存单元
FLASHBIT20H.1;闪烁标志位
SEC_SBIT20H.2;设定秒标志位
MIN_SBIT20H.3;设定分标志位
HOUR_SBIT20H.4;设定时标志位
K1BITP1.1;健定义端口
K2BITP1.2
K3BITP1.3
K4BITP1.0
BEEPBITP3.1;蜂鸣器
ORG0000H
AJMPMAIN
ORG000BH;定时器0的中断向量地址
LJMPTIMER0
ORG001BH;定时器1的中断向量地址
LJMPTIMER1
ORG002BH;定时器1的中断向量地址
LJMPTIMER2
ORG0050H
;**********************************************************
MAIN:
MOVSP,#60H;设置堆栈指针
MOVP0,#0FFH;端口初始化
MOVP2,#0FFH
MOVSEC,#00;预置时间
MOVMIN,#00
MOVHOUR,#00
CLRHOUR_S
CLRMIN_S
CLRSEC_S
CLRFLASH
MOVR0,#DISPLAY;获得显示单元首地址
MOVR1,#0FEH;位码初值
MOVR2,#00H;计数单元清零
MOVTMOD,#11H;工作于方式1
MOVTH0,#0DCH;10ms定时常数
MOVTL0,#00H
MOVTH1,#4CH;50ms定时常数
MOVTL1,#00H
MOVT2CON,#00H;设置T2CON寄存器
MOVTH2,#0FCH;1ms定时常数
MOVTL2,#66H
SETBET0;允许定时/计数器0中断
SETBET1;允许定时/计数器1中断
SETBET2;允许定时/计数器2中断
SETBEA;开总中断
SETBTR2
;*********************************************************
;P.显示设定程序
;*********************************************************
LOOP0:
MOV40H,#0BH
MOV41H,#0BH
MOV42H,#0BH
MOV43H,#0BH
MOV44H,#0BH
MOV45H,#0BH
MOV46H,#0BH
MOV47H,#0CH
JNBP1.3,LOOP1
LJMPLOOP0
LOOP1:
MOV40H,#00H
MOV41H,#00H
MOV42H,#00H
MOV43H,#00H
MOV44H,#00H
MOV45H,#00H
MOV46H,#00H
MOV47H,#00H
SETBTR0
CLRTR1
LOOP:
ACALLDATA_CHANGE;时间数据转换
ACALLTIME_SET
AJMPLOOP
;*********************************************************
;时间数据转换子程序
;*********************************************************
DATA_CHANGE:
MOVC,SEC_S
ANLC,FLASH
JCS_BLANK;C=1,转移
MOVA,SEC;秒单元数据处理
MOVB,#10
DIVAB
MOVDISPLAY+1,A;秒十位
MOVDISPLAY,B;秒个位
AJMPD_CH1
S_BLANK:
MOVDISPLAY+1,#0BH;秒熄灭
MOVDISPLAY,#0BH
D_CH1:
MOVDISPLAY+2,#0AH;显示“-”
MOVC,MIN_S
ANLC,FLASH
JCM_BLANK;C=1,转移
MOVA,MIN;分单元数据处理
MOVB,#10
DIVAB
MOVDISPLAY+4,A;分十位
MOVDISPLAY+3,B;分个位
AJMPD_CH2
M_BLANK:
MOVDISPLAY+4,#0BH;分熄灭
MOVDISPLAY+3,#0BH
D_CH2:
MOVDISPLAY+5,#0AH;显示“-”
MOVC,HOUR_S
ANLC,FLASH
JCH_BLANK;C=1,转移
MOVA,HOUR;时单元数据处理
MOVB,#10
DIVAB
MOVDISPLAY+7,A;时十位
MOVDISPLAY+6,B;时个位
AJMPD_END
H_BLANK:
MOVDISPLAY+7,#0BH;时熄灭
MOVDISPLAY+6,#0BH
D_END:
RET
;**********************************************************
;键设定子函数
;K1-加键K2-减键
;**********************************************************
KEY_SET:
JBK1,K2_SET;加键
MOVR5,#2;延时20ms
ACALLDELAY
JBK1,K2_SET;第二次判断
ACALLBEEP_BL
MOVA,COUNT
CJNEA,MAX_NUM,SET_U;是否达到最大值
MOVCOUNT,#00H
AJMPKEY_SET_END
SET_U:
INCCOUNT;设定值加1
K2_SET:
JBK2,KEY_SET_END;减键
MOVR5,#2;延时20ms
ACALLDELAY
JBK2,KEY_SET_END;第二次判断
ACALLBEEP_BL
MOVA,COUNT
CJNEA,#00H,SET_D;是否达到最小值
MOVCOUNT,MAX_NUM
AJMPKEY_SET_END
SET_D:
DECCOUNT;设定值减1
KEY_SET_END:
RET
;**********************************************************
;时间设定子函数
;**********************************************************
TIME_SET:
JBK4,T_SET_END
MOVR5,#2
ACALLDELAY
JBK4,T_SET_END
CLRTR0
SETBTR1
MOVCOUNT,HOUR;读取现行时数据
MOVMAX_NUM,#23;时的最大值
SETBHOUR_S;置设定时标志位
ACALLBEEP_BL
H_SET1:
ACALLKEY_SET
MOVHOUR,COUNT;保存时设定值
ACALLDATA_CHANGE
JNBK4,M_SET1
JBHOUR,H_SET1
M_SET1:
MOVCOUNT,MIN;读取现行分数据
MOVMAX_NUM,#59;分的最大值
CLRHOUR_S;清设定时标志位
SETBMIN_S;置设定分标志位
ACALLBEEP_BL
M_SET2:
ACALLKEY_SET
MOVMIN,COUNT;保存分设定值
ACALLDATA_CHANGE
JNBK4,S_SET1
JBMIN_S,M_SET2
S_SET1:
MOVCOUNT,SEC;读取现行秒数据
MOVMAX_NUM,#59;秒的最大值
CLRMIN_S;清设定分标志位
SETBSEC_S;置设定秒标志位
ACALLBEEP_BL
S_SET2:
ACALLKEY_SET
MOVSEC,COUNT;保存秒设定值
ACALLDATA_CHANGE
JNBK4,S_SET3
JBSEC_S,S_SET2
S_SET3:
CLRSEC_S;清设定秒标志位
CLRFLASH;清闪烁标志位
SETBTR0
CLRTR1
ACALLBEEP_BL
T_SET_END:
RET
;*********************************************************
;定时器0的中断服务程序(负责计时)
;*********************************************************
TIMER0:
PUSHACC;入堆栈保护
PUSHPSW
MOVTH0,#0DCH;10ms定时常数
MOVTL0,#00H
INCMSEC;10ms计数值加1
MOVA,MSEC
CJNEA,#100,T_END;10ms×100=1秒
MOVMSEC,#00H;清计数器
INCSEC;秒加1
MOVA,SEC
CJNEA,#60,T_END
MOVSEC,#00H;秒单元清零
INCMIN;分加1
MOVA,MIN
CJNEA,#60,T_END
MOVMIN,#00H;分单元清零
INCHOUR;时加1
MOVA,HOUR
CJNEA,#24,T_END
MOVHOUR,#00H;时单元清零
T_END:
POPPSW;出堆栈
POPACC
RETI
;**********************************************************
;定时器1计时中断子程序
;每隔50MS中断一次
;**********************************************************
TIMER1:
PUSHACC;入堆栈保护
PUSHPSW
MOVTH1,#4CH;50ms定时常数
MOVTL1,#00H
INCNUMBERS
MOVA,NUMBERS
CJNEA,#8,T1_END;400ms
MOVNUMBERS,#0
CPLFLASH;闪烁标志取反
T1_END:
POPPSW;出堆栈
POPACC
RETI
;**********************************************************
;定时器2中断子程序(负责数码管显示)
;**********************************************************
TIMER2:
PUSHACC;入堆栈保护
PUSHPSW
CLRTF2;清中断标志
MOVTH2,#0FCH;1ms定时常数
MOVTL2,#66H
MOVA,R2
CJNEA,#08H,T2_CH1;判扫描次数
T2_CH1:
J