基于89C51单片机电子数字时钟的设计.docx

上传人:b****8 文档编号:9655150 上传时间:2023-02-05 格式:DOCX 页数:25 大小:253.65KB
下载 相关 举报
基于89C51单片机电子数字时钟的设计.docx_第1页
第1页 / 共25页
基于89C51单片机电子数字时钟的设计.docx_第2页
第2页 / 共25页
基于89C51单片机电子数字时钟的设计.docx_第3页
第3页 / 共25页
基于89C51单片机电子数字时钟的设计.docx_第4页
第4页 / 共25页
基于89C51单片机电子数字时钟的设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

基于89C51单片机电子数字时钟的设计.docx

《基于89C51单片机电子数字时钟的设计.docx》由会员分享,可在线阅读,更多相关《基于89C51单片机电子数字时钟的设计.docx(25页珍藏版)》请在冰豆网上搜索。

基于89C51单片机电子数字时钟的设计.docx

基于89C51单片机电子数字时钟的设计

 

摘要

本次实训是基于AT89C51单片机电子钟的设计,对时、分、秒的显示的控制,时、分、秒用六位数码管显示LED数码管时钟电路采用24小时计时方式。

该电路采用AT89C51单片机,使用5V电池供电,只使用一个按键进行复位状态的控制以及正常显示等状态。

LED显示采用静态扫描方式实现,采用6M晶振。

最常见的电子钟通常使用单片机模块控制,一种用单片机原理实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有硬件成本低、计时准确、更长的使用寿命特点,因此得到了广泛的使用。

本次设计通过用单片机为主控制,通过电路仿真而实现。

首先使用ProteusProfessional软件进行绘制硬件电路图,用keil软件进行编程与调试,最终生成hex文件,传入单片机内部,从而实现仿真效果。

 

第一章电子时钟的总体设计

1.1设计目的

1.1.1课程设计使我们能够深入理解单片机系统的工作原理接口电路的设计及调试方法,培养综合运用所学理论知识分析和解决实际问题的能力。

1.1.2AT89C51芯片的串口功能利用六片8位并行输出串行移位寄存器74LS164,实现时,分,秒的显示。

1.1.3用keil软件进行编程与调试利用Proteus7Professional软件进行绘制硬件电路图且进行仿真。

1.2设计任务

1.2.1根据具体题目要求,设计以单片机为控制核心的测量系统或控制系统,完成对指定目标或对象的测量及控制。

1.2.2设计单片机与测量及控制对象的接口并进行硬件调试。

1.2.3针对要求测量或控制的对象完成程序的编制。

1.2.4硬件软件联调,完成题目所要求的功能。

1.2.5设计能支持时、分、秒的时钟,时钟要具有时间调整功能。

1.3设计思路

电子钟的计时器的硬件电路如图所示,采用AT89C51单片机,最小化应用设计;此次设计,我们采用静态显示的方案来完成电子钟的设计。

采用共阳八段LED显示器,用74LS164来驱动LED数码管,采用6M晶振,有利于提高计时的精确性。

主要功能:

设计一个时钟系统,时钟时间在六位数码管上进行显示,从左到右依次为“时:

分:

秒”。

 

一上电,数码管显示起始时间为0时0分0秒,即数码管显示00.00.00,以后每秒钟时钟系统加1,最大显示值为23.59.59。

本次设计中,我们只用到了一个按键,此按键是用来控制电路复位的,我们将设计好的复位电路直接接在单片机的复位引脚(RST)上,这样程序在运行过程中就会自动查询该引脚上的电平,当该引脚电平为高电平时,则电路恢复初始状态,反之,则程序正常运行。

第二章硬件系统的设计

2.1电路原理图设计

2.1.1电子钟的硬件电路框图

2.2AT89C51引脚及其功能

2.2.1AT89C51的原理及说明

AT89C51是美国Intel公司生产的低电压,高性能CHMOS8位单片机,片内含4kbytes的可反复擦写的只读程序存储器(PEROM)和蔼可亲128bytes的随机存取数据存储器(RAM),器件采用Intel公司的高密度、非易失性存储技术生产,片内置通用4位中央处理器(CPU)和Flash存储单元,功能强大AT89C51单片机适合于许多较为复杂控制应用场合。

AT89C51引脚图

2.2.2引脚功能

Vcc(40):

电源电压GND(20):

接地

P3.0RXD(串行输入口)P3.1TXD(串行输出口)

RST(9):

复位信号输入端。

当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1(18):

振荡器反相放大器的及内部时钟发生器的输入端。

XTAL2(19):

振荡器反相放大器的输出端。

通过XTAL1、XTAL2外接晶振后,即可构成自激振荡器,驱动内部时钟发生器向主机提供时钟信号。

2.3驱动部件

本设计的驱动电路采用74LS164,74LS164是最常见的移位寄存器,移位寄存器是暂时记忆数据的“寄存器”,其特征是具有将数据向左或向右移动的功能。

移位寄存器有各种形式。

按存数据的位数有4位、8位等,按“输入/输出数据”形式有“串入/串出”、“串入/并出”、“并入/串出”、“并入/并入”等。

图3(a)是串行输入/并行(串行)输出移位寄存器74LS164的管脚排列图。

其功能表见表2所示。

74LS164有两个串行数据DA、DB输入端,使用时一般把它们连在一起;

为清零输入端,低电平有效,当该端加入低电平时,寄存器输出Q0~Q7全为低电平。

在正常情况下,清零输入端接高电平,当CP信号上升沿到来时,数据右移一位;Q0~Q7为并行数据输出端,同时Q7端也是串行数据输出端,对于串行输入的数据,最后进入的从Q0输出。

CP为移位脉冲。

最先输入的从Q7输出,

74LS164管脚图

74LS164真值表

2.4显示部分

由于系统要显示的内容较简单,显示量不多,所以选用数码管既方便又经济。

LED有共阴极和共阳极两种。

如图4所示。

二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。

一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。

当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。

为了保护各段LED不被损坏,需外加限流电阻。

LED数码管结构原理图

需说明的是当用数据口连接LED数码管a~dp引脚时,不同的连接方法,各段码位与显示段有不同的对应关系。

通常数据口的D0位与a段连接,D1位与b段连接,……D7位与dp段连接,如表3所示,表4为用于LED数码管显示的十六进制数和空白字符与P的显示段码。

LED显示段码

字型

共阳极段码

共阴极段码

字型

共阳极段码

共阴极段码

0

C0H

3FH

9

90H

6FH

1

F9H

06H

A

88H

77H

2

A4H

5BH

B

83H

7CH

3

BOH

4FH

C

C6H

39H

4

99H

66H

D

A1H

5EH

5

92H

6DH

E

86H

79H

6

82H

7DH

F

84H

71H

7

F8H

07H

空白

FFH

00H

8

80H

7FH

P

8CH

73H

注:

(1)本表所列各字符的显示段码均为小数点不亮的情况。

(2)“空白”字符即没有任何显示。

 

第三章软件系统的设计

本次实训的软件部分由主程序,静态显示子程序,中断服务程序,时、分、秒加1子程序,时、分、秒单元清零子程序组成。

3.1电子钟的主程序

本设计中,计时采用定时器T0中断完成,其余状态循环调用显示子程序,当端口开关按下时,转入相应功能程序。

其主程序执行流程见下图。

主程序代码如下:

;主程序使用资源:

R3,6位显示的指针。

;R0,显示缓冲地址指针。

;DPTR,段码表指针。

START:

MOVSP,#60H;设置堆栈

MOVCOUNT,#00H

MOVTMOD,#01H;T0,方式1,定时100ms

MOVTH0,#3CH

MOVTL0,#0B0H

SETBEA;开放T0中断

SETBET0

SETBTR0;启动T0

MOVSCON,#00H;串口方式0

MOVR3,#06H

MOVDPTR,#TABLE

MOVR0,#30H

MOVSEC,#0;秒,分,时清0

MOVMIN,#0

MOVHOUR,#0

MOVSECL,#00H;显示缓冲区单元清0

MOVSECH,#00H

MOVMINL,#00H

MOVMINH,#00H

MOVHOURL,#00H

MOVHOURH,#00H

DISP1:

MOVA,@R0;初始化显示00.00.00

MOVCA,@A+DPTR

MOVSBUF,A

WAIT1:

JNBTI,WAIT1

CLRTI

INCR0

DJNZR3,DISP1

MOVR0,#30H

MOVR3,#06H

LOOP:

SJMPLOOP

3.2电子钟的显示子序

显示子程序代码如下:

;---显示子程序---

;入口参数:

(R0)=显示缓冲区地址

;(R3)=显示位数

;占用资源:

ACC,DPTR,R0,R3

DISP:

MOVA,@R0

MOVCA,@A+DPTR

CJNER3,#2,A1

ANLA,#7FH

A1:

MOVSBUF,A

WAIT:

JNBTI,WAIT

CLRTI

INCR0

DJNZR3,DISP

MOVR0,#30H

MOVR3,#06H

POPPSW

POPACC

RETI

3.3定时器中断服务程序

定时器TO用于时间计时,定时溢出中断周期设为100ms,中断进入后,判断是否到1秒钟,到了,则调用加法子程序对秒进行加1处理,处理完后返回断点地址,同时判断秒是否到了60秒,到了则对秒单元清零,同时对分进行加1操作,同样对分进行判断,到60分则对分单元清零,同时对时加1,同样也对时进行判断,到24小时,则对时单元清零,最后中断返回。

T0中断服务程序执行流程见下图:

 

保护现场

赋初值

N

Y

秒值加1

N

Y

秒清0

分加1

N

Y

分清0

小时加1

N

Y

小时清0

恢复现场

中断服务程序如下:

;---中断服务子程序----

TIMER0:

PUSHACC;保护现场

PUSHPSW

MOVTH0,#3CH;赋初值

MOVTL0,#0B0H

INCCOUNT;秒计时单元增1,10次到1秒

MOVA,COUNT

XRLA,#10;1秒到否?

JZT0_0

T0_01:

POPPSW;恢复现场

POPACC

RETI

T0_0:

MOVCOUNT,#00H;1秒到

INCSEC;秒单元增1

MOVA,SEC

XRLA,#60;60秒(1分钟)到否?

JZT0_1

MOVA,SEC;转换为BCD码

MOVB,#10

DIVAB

MOVSECL,B;秒的个位存入SECL

MOVSECH,A;秒的十位存入SECH

LJMPDISP;转显示子程序

T0_1:

MOVSEC,#00H;1分到,秒单元清0

MOVSECL,#00H;秒个位清0

MOVSECH,#00H;秒十位清0

INCMIN;分单元加1

MOVA,MIN

XRLA,#60

JZT0_2;1分到否?

MOVA,MIN

MOVB,#10;分转换为BCD码

DIVAB

MOVMINL,B;存分的个位

MOVMINH,A;存分的十位

LJMPDISP;转显示子程序

T0_2:

MOVMIN,#00H;1分到,分单元清0

MOVMINL,#00H;分个位清0

MOVMINH,#00H;分十位清0

INCHOUR;时单元加1

MOVA,HOUR

XRLA,#24

JZT0_3;1小时到否?

MOVA,HOUR;时转换为BCD码

MOVB,#10

DIVAB

MOVHOURL,B;存时个位

MOVHOURH,A;存时十位

LJMPDISP;转显示子程序

T0_3:

MOVHOUR,#00H;时单元清0

MOVHOURL,#00H;时个位清0

MOVHOURH,#00H;时十位清0

LJMPDISP;转显示子程序

TABLE:

DB02H,9FH,24H,0CH,99H,48H,40H,1EH,01H,08H//0123456789

END

3.4电子时钟设计程序清单

;时钟,计数初值00.00.00静态显示,定时100ms

;---内存单元分配---

SECLEQU30H//秒

SECHEQU31H

MINLEQU32H//分

MINHEQU33H

HOURLEQU34H//小时

HOURHEQU35H

SECEQU36H

MINEQU37H

HOUREQU38H

COUNTEQU39H//计时到1秒;1s=10×100ms

ORG0000H

LJMPSTART

ORG000BH

LJMPTIMER0

ORG0030H

;主程序。

使用资源:

R3,6位显示的指针。

;R0,显示缓冲地址指针。

;DPTR,段码表指针。

START:

MOVSP,#60H;设置堆栈

MOVCOUNT,#00H

MOVTMOD,#01H;T0,方式1,定时100ms

MOVTH0,#3CH

MOVTL0,#0B0H

SETBEA;开放T0中断

SETBET0

SETBTR0;启动T0

MOVSCON,#00H;串口方式0

MOVR3,#06H

MOVDPTR,#TABLE

MOVR0,#30H

MOVSEC,#0;秒,分,时清0

MOVMIN,#0

MOVHOUR,#0

MOVSECL,#00H;显示缓冲区单元清0

MOVSECH,#00H

MOVMINL,#00H

MOVMINH,#00H

MOVHOURL,#00H

MOVHOURH,#00H

DISP1:

MOVA,@R0;初始化显示00.00.00

MOVCA,@A+DPTR

MOVSBUF,A

WAIT1:

JNBTI,WAIT1

CLRTI

INCR0

DJNZR3,DISP1

MOVR0,#30H

MOVR3,#06H

LOOP:

SJMPLOOP

;---显示子程序---

;入口参数:

(R0)=显示缓冲区地址

;(R3)=显示位数

;占用资源:

ACC,DPTR,R0,R3

DISP:

MOVA,@R0

MOVCA,@A+DPTR

CJNER3,#2,A1

ANLA,#7FH

A1:

MOVSBUF,A

WAIT:

JNBTI,WAIT

CLRTI

INCR0

DJNZR3,DISP

MOVR0,#30H

MOVR3,#06H

POPPSW

POPACC

RETI

;---中断服务子程序----

TIMER0:

PUSHACC;保护现场

PUSHPSW

MOVTH0,#3CH;赋初值

MOVTL0,#0B0H

INCCOUNT;秒计时单元增1,10次到1秒

MOVA,COUNT

XRLA,#10;1秒到否?

JZT0_0

T0_01:

POPPSW;恢复现场

POPACC

RETI

T0_0:

MOVCOUNT,#00H;1秒到

INCSEC;秒单元增1

MOVA,SEC

XRLA,#60;60秒(1分钟)到否?

JZT0_1

MOVA,SEC;转换为BCD码

MOVB,#10

DIVAB

MOVSECL,B;秒的个位存入SECL

MOVSECH,A;秒的十位存入SECH

LJMPDISP;转显示子程序

T0_1:

MOVSEC,#00H;1分到,秒单元清0

MOVSECL,#00H;秒个位清0

MOVSECH,#00H;秒十位清0

INCMIN;分单元加1

MOVA,MIN

XRLA,#60

JZT0_2;1分到否?

MOVA,MIN

MOVB,#10;分转换为BCD码

DIVAB

MOVMINL,B;存分的个位

MOVMINH,A;存分的十位

LJMPDISP;转显示子程序

T0_2:

MOVMIN,#00H;1分到,分单元清0

MOVMINL,#00H;分个位清0

MOVMINH,#00H;分十位清0

INCHOUR;时单元加1

MOVA,HOUR

XRLA,#24

JZT0_3;1小时到否?

MOVA,HOUR;时转换为BCD码

MOVB,#10

DIVAB

MOVHOURL,B;存时个位

MOVHOURH,A;存时十位

LJMPDISP;转显示子程序

T0_3:

MOVHOUR,#00H;时单元清0

MOVHOURL,#00H;时个位清0

MOVHOURH,#00H;时十位清0

LJMPDISP;转显示子程序

TABLE:

DB02H,9FH,24H,0CH,99H,48H,40H,1EH,01H,08H//0123456789

END

3.5程序进行编译仿真

3.5.189C51程序

根据AT89C51单片机灌电流能力强,拉电流能力弱的特点,我们选用共阳数码管。

将AT89C51的P3.0~P3.1分别与74LS164的数据输入口和时钟信号输入口相连,74LS164是8位串入并出移位寄存器,负责将P3.0输出的串行数据转换成并行信号。

显然,这种方式显示同样的位数使用单片机的口线大大减少,即可以让LED当前时间数值,数码管显示器有二种工作方式,即静态显示方式和动态扫描显示方式。

为节省端口,本系统采用静态扫描显示方式。

系统的时分显示部件由6只7段共阳LED数码管构成,前两只用于时的显示,中间两只用于分的显示,最后两只用于秒的显示。

每个LED数码管由相对应的74LS164驱动,数码管的a,b,c,d,e,f,g,h,分别分别74LS164的QA,QB,QC,QD,QE,QF,QH相连。

具体设计ptotues仿真原理图及实物PCB图见下图所示:

protues仿真:

3.5.2用PROTEUSISIS进行电子万年历的仿真测试

添加Keil中编写的代码文件

单击工具栏中的Source→Add/RemoveSourcefiles...,弹出一个对话框,分别单击“New”,然后选择在Keil中编写的数字电压表.ASM汇编语言程序,单击“OK”,完成添加代码文件。

编译源程序,生成.HEX目标代码文件

单击Source→BuildAll。

如果编译结果没有错误,

图5-8

加载.HEX目标代码文件

通过如图5-9所示的对话框,选择刚才编译生成的.HEX文件。

设置使单片机的运行频率为6MHz。

对仿真结果的调试功能

由于使用的是汇编语言编写的程序,如果在测量的时候测量值显示错误,说明程序中存在问题,这个问题只用在仿真测量的时候才能被发现,这时可以使用PROTEUS对程序进行调试。

单击

按钮,再单击菜单栏中的Debug,可以在最下面选择打开内存观察窗口,寄存器值观察窗口,汇编语言源代码窗口等等。

在汇编语言源代码窗口中,也可以在所需要设置断点的语句前双击设置断点,当设置断点的时候,程序运行到所设断点处停止,从而可以在内存、寄存器等的值的变化,从而找出程序出错的地方。

第四章对89C51设计的电子时钟的总结

本次课程设计是用AT89C51单片机CPU及LCM1602设计一个数字时钟,经过一个星期的调试,结果满足设计要求,验证无误。

通过单片机硬件电路的调试,实现了预先设定的功能,设计主要用到的元件不多,最主要的是程序也比较长比较麻烦,同时也遇到了少量困难,尤其是关于校时模块的设计实现。

关于显示模块,在以前的实验中做过,所以问题很容易解决。

学以致用,将从书本上学到的知识应用于实践,学会了初步的电子电路仿真设计,虽然过程中遇到了一些困难,但是在解决这些问题的过程无疑也是对自己自身专业素质的一种提高。

当最终调试成功的时候也是对自己的一种肯定。

此次的设计作业不仅增强了自己在专业设计方面的信心,鼓舞了自己,更是一次兴趣的培养,为自己以后的学习方向的明确了重点。

另外在这次实验中我们遇到了不少的问题针对不同的问题我们采取不同的解决方法,最终一一解决设计中遇到的问题。

在我们曾经遇到不懂的问题时,利用网上的资源,搜索查找得到需要的信息。

参考文献

[1]《微型计算机原理与接口技术》[M].赵长德.北京:

机械工业出版社,1999:

98-350.

[2]《单片机的原理与接口技术》[M].苏平.北京:

电子工业出版社,2006:

1-113.

[3]《微型计算机原理》[M].王忠民.西安:

西安科技大学出版社,2003:

15-55.

[4]《计算机组成原理》[M].胡戴明.北京:

经济科学出版社,2005:

43-56.

[5]《单片机外围器件使用手册》[M].纪宗南.北京:

北京航空航天大学出版社,622-655.

[6]《模拟电子技术》[M]周雪.西安:

西安电子科技大学出版社,2005:

81-95.

[7]《电子与模拟电子技术》[M].左金生.北京:

电子工业出版社,2004:

105-131.

[8]《单片机开发环境μVision2的开发指南》[M].尹勇.北京:

北京航空航天大学出版社,2004:

173-199.

[9]《单片机系统Proteus设计与仿真》[M].张斌武.北京:

电子工业出版社,2005:

52-89.

[10]《单片机应用系统设计系统配置与接口技术》[M].何立民.北京航空航天大学出版社,2001年

[11]《单片机实验与实践教程》(三)[M].周立功.北京航空航天大学出版社,2006年

[12]《单片机原理及其接口技术》(第3版)[M].胡汉才.清华大学出版社,2010年

[13]《单片机原理及其接口技术学习辅导与实践教程>[M].胡汉才.清华大学出版社,2010年

[14]《例说51单片机(C语言版)》[M].张义和.人民邮电出版社,2008年

[15]《基于PROTEUS的电路及单片机设计与仿真》(第2

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1