单片机课程设计数字钟实验报告.docx

上传人:b****5 文档编号:5717311 上传时间:2022-12-31 格式:DOCX 页数:24 大小:92.73KB
下载 相关 举报
单片机课程设计数字钟实验报告.docx_第1页
第1页 / 共24页
单片机课程设计数字钟实验报告.docx_第2页
第2页 / 共24页
单片机课程设计数字钟实验报告.docx_第3页
第3页 / 共24页
单片机课程设计数字钟实验报告.docx_第4页
第4页 / 共24页
单片机课程设计数字钟实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

单片机课程设计数字钟实验报告.docx

《单片机课程设计数字钟实验报告.docx》由会员分享,可在线阅读,更多相关《单片机课程设计数字钟实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

单片机课程设计数字钟实验报告.docx

单片机课程设计数字钟实验报告

单片机课程设计:

电子钟

一、实现功能

1、能够实现准确计时,以数字形式显示时、分、秒的时间。

2、小时以24小时计时形式,分秒计时为60进位,能够调节时钟时间。

3、闹钟功能,一旦走时到该时间,能以声或光的形式告警提示。

4、能够实现按键启动与停止功能。

5、能够实现整点报时功能。

6、能够实现秒表功能。

二、设计思路

1、芯片介绍

VCC:

电源。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚备选功能

RXD(串行输入口)

TXD(串行输出口)

/INT0(外部中断0)

/INT1(外部中断1)

T0(记时器0外部输入)

T1(记时器1外部输入)

/WR(外部数据存储器写选通)

/RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:

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

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

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

2、显示电路

就时钟而言,通常可采用液晶显示或数码管显示。

由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。

另外,89C2051本身无专门的液晶驱动接口,因此,本时钟采用数码管显示方式。

数码管作为一种主动显示器件,具有亮度高、价格便宜等优点,而且市场上也有专门的时钟显示组合数码管。

对于实时时钟而言,显示显然是另一个重要的环节。

通常LED显示有两种方式:

动态显示和静态显示。

静态显示的优点是程序简单、显示亮度有保证、单片机CPU的开销小,节约CPU的工作时间。

但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂。

需要几个LED就必须占有几个并行口,比较适用于LED数量较少的场合。

当然当LED数量较多的时候,可以使用单片机的串行口通过移位寄存器的方式加以解决,但程序编写比较麻烦。

LED动态显示硬件连接简单,但动态扫描的显示方式需要占有CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。

本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式。

此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:

显示电路用6个共阴数码管分别显示,小时、分钟和秒,通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。

单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。

针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,片内含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。

这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。

程序可分为闹钟的声音程序、时间显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序、整点报时等。

运用这种方法,关键在于各模块的兼容和配合,以免各模块不匹配会出现意想不到的错误。

首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。

这是前期准备工作。

第二部分是硬件部分:

依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。

第三部分是软件部分:

先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。

第四部分是软件画图部分:

设计好电路后进行画图,包括电路图和仿真图的绘制。

第五部分是软件仿真部分:

软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。

在已经正确的设计基础上,添加额外的功能!

在设计的的过程中,主要采用分块设计的方法,进行分块调试在进行整体组合。

在设计实时显示时间和秒表时主要是时间的计算,才能精确计时间,和两个定时器的优先级问题才能进行两个模块的切换。

三、设计流程图

 

保护现场

重装定时器初值

循环次数减1

满20次

秒单元加1

60s到

秒单元清0,分单元加1

60分到

分单元清0,时单元加1

24小时到

时单元清0

 

恢复现场

 

返回

计时模块流程图

 

 

四、设计功能模块

1、时间调整模块

s4按键按下(进入时间调整状态,判断S4键,若再次按下开始进行小时调整,每次按下s4键时小时加一,若S4键未按下判断S0键是否按下,若S0键按下,分钟加一,若S0未按下,判断S1键,若s1键按下,返回主程序,进行时间与闹钟的切换。

2、闹钟模块

若S0键按下,开启闹钟,进入闹钟判断模块,若满足闹钟的分钟与时钟的分钟相等,并且闹钟的小时与时钟的小时相等,进入喇叭响应模块。

S0键释放则关闭闹钟。

3、秒表模块

若S2键()按下,进入秒表模块,显示秒表初始值。

若S5键按下,显示秒表初始值并开始秒表计时。

若弹起S5键则停止秒表计数并复位。

若弹起S2键重新进行时间显示。

4、整点报时模块

26H中存放整点报时的标志位,若时间模块中存放分钟的地址中数为60,则将存放小时的数传递给A并使A自增1,若A不等于0,,进入喇叭响应模块,若A为0返回主程序。

5、时钟定时模块

定时50ms,定时为T0方式1,初始值TH0=3CHTL0=0B0H,

X==15536

6、秒表定时模块

由于使用两个定时器,T0的自然优先级高于T1的,所以在执行秒表按键时,T1的优先级应高于T0,应对IP进行设置,使IP为08H。

定时10ms,定时为T1方式1,初始值TH0=0FCHTL0=18H,

X==64536

7、

延时模块

延时25ms

DELAY:

MOVR4,#015H

DL00:

MOVR5,#0FFH

DL11:

MOVR6,#9H

DL12:

DJNZR6,DL12

DJNZR5,DL11

DJNZR4,DL00

RET

四、proteus程序仿真图

五、仿真结果分析

通过S1、S0、S3和S4四个按键,对时间进行修改和闹钟的设置,S0控制闹钟的启动和停止。

通过S2来进入秒表模式,按下S5进行秒表正确计时。

弹起

S5和S2进入时间显示。

按下S1键显示闹钟,松开后显示时间;按进入时间修改模式,再按S4键时间的时加1,按S2分加1,调整结束后按下S1恢复正常显示;按下S3键进入闹钟修改模式,再按S3键闹钟的时加1,按S2分加1,调整结束后按下S1恢复正常显示。

六、设计心得体会

本次课程设计,即将告一段落,但收获却是弥足珍贵。

一分耕耘,一分收获。

部亲自去尝试,你很难去体验那份开心。

我们经过了这半年对单片机由一无所知到逐步了解,现在开始了一些小的制作。

课程设计是一项好的方向,让我们去自我提高,很有裨益。

实验开始前,同组的同伴就开始了收集资料,尝试着去努力实现一些功能。

起初,我对单片机知道很少,还是经过看看细节性的东西,才渐渐有些入门。

当然,实验的过程中也遇到了许多的难题。

1、实现电子钟的数码显示,在这一过程中,显示部分总是会出现这样那样的问题。

2、按键问题

我的设计中,大部分功能选择是通过按键开关实现的。

在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间很不方便。

但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。

有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及。

本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少。

3、定时/计数器的使用问题。

在实验过程中多次运用到定时器T0\T1,我们在使用时忽略了中断的优先级,从而使同级的中断存在时,而不能很好的达到目的。

程序:

ORG0000H

LJMPSTART

ORG000BH

LJMPTIME

ORG001BH

LJMPTIMEA

;********初始化*********

START:

MOVSP,#50H

MOV20H,#00H;定义秒

MOV21H,#00H;定义分

MOV22H,#00H;定义时

MOV23H,#01H;定义闹钟分钟

MOV24H,#01H;定义闹钟小时

MOV25H,#00H

MOV26H,#00H

MOV30H,#00H;时间SECOND送显缓冲区

MOV31H,#00H

MOV32H,#00H;时间MINUTE送显缓冲区

MOV33H,#00H

MOV34H,#00H;时间HOUR送显缓冲区

MOV35H,#00H

MOV36H,#01H;闹钟分钟送显缓冲区

MOV37H,#00H

MOV38H,#01H;闹钟小时十位送显缓冲区

MOV39H,#00H;闹钟小时个位送显缓冲区

MOV50H,#00H;按键次数

MOV27H,#00H;秒表最低两位

MOV28H,#00H;秒表秒计数单元

MOV29H,#00H;秒表分计数单元

MOVTMOD,#11H;16位计数器

MOVTH0,#03CH;赋初值

MOVTL0,#0B0H

MOVTH1,#0FCH;赋初值

MOVTL1,#018H

MOVIE,#8AH;中断允许

SETBTR0;启动T0

MOVR2,#14H

MOVR1,#0AH

MOVP2,#0FFH

;*********主程序**********

MAIN:

JB,GB

LCALLTIMEPRO;调用闹钟判断

GB:

LCALLDISPLAY1;调用时间显示

JB,M1;=1时转移S4没有按下

LCALLSETTIME;调用SETTIME调时子程序

LJMPMAIN

M1:

JB,M2;P1=1时转移   S3

LCALLSETATIME;调用SETATIME子程序

LJMPMAIN

M2:

JB,M4;=1时转移S1

LCALLLOOKATIME;调用LOOKATIME显示闹钟子程序

LJMPMAIN

M4:

JB,M5;=1时转移主程序

LCALLDISPLAY1;调用秒表显示

LCALLLOOK

M5:

LJMPMAIN

;*********存时间程序**********

M7:

MOVA,20H

MOVB,#0AH

DIVAB

MOV31H,A;将A的低4位存入31单元

MOV30H,B;将A的高4位存入30单元

MOVA,21H

MOVB,#0AH

DIVAB

MOV33H,A;将A的低4位存入33单元

MOV32H,B;将A的高4位存入32单元

MOVA,22H

MOVB,#0AH

DIVAB

MOV35H,A;将A的低4位存入35单元

MOV34H,B

M8:

RET

;*********秒表送出始值到显示缓冲区**********

MJ:

MOV27H,#00H

MOV28H,#00H

MOV29H,#00H

MOVA,27H

MOVB,#0AH

DIVAB

MOV31H,A;将A的低4位存入31单元

MOV30H,B;将A的高4位存入30单元

MOVA,28H

MOVB,#0AH

DIVAB

MOV33H,A;将A的低4位存入33单元

MOV32H,B;将A的高4位存入32单元

MOVA,29H

MOVB,#0AH

DIVAB

MOV35H,A;将A的低4位存入35单元

MOV34H,B

MK:

RET

;*********延时子程序********

LOOK:

LCALLDISPLAY1

MM1:

JNB,LER

LCALLM7

LCALLMJ

CLRTR1

CLRPT1

LCALLDISPLAY1

LJMPM6

LER:

MOVIP,#08H

SETBTR1

LCALLDISPLAY1

M6:

RET

;***********时间调整*******

SETTIME:

;设置时间

L0:

LCALLDISPLAY1

JB,L1;=1时转移

MOVC,

JCMM1

LCALLDELAY1;延时

JCMM1

MSTOP1:

MOVC,;为0时转移

JNCMSTOP1

LCALLDELAY1;延时

MOVA,50H

INC50H

CJNEA,#00H,HJ1

LJMPL0

HJ1:

INC22H;小时自加一

MOVA,22H

CJNEA,#18H,GO12;小时计数循环 

MOV22H,#00H;复位

MOV34H,#00H

MOV35H,#00H

LJMPL0

L1:

JB,L2;=1时转移

MOVC,

JCL1

LCALLDELAY1;延时

JCL1

MSTOP2:

MOVC,;=0时转移

JNCMSTOP2

LCALLDELAY1;延时

MOVC,

JNCMSTOP2

INC21H;分钟加一

MOVA,21H

CJNEA,#3CH,GO11;分钟计数循环

MOV21H,#00H;复位

MOV32H,#00H

MOV33H,#00H

LJMPL0

GO11:

MOVB,#0AH

DIVAB

MOV32H,B;将A的低4位存入32单元

MOV33H,A;将A的高4位存入33单元

LJMPL0

GO12:

MOVB,#0AH

DIVAB

MOV34H,B;将A的低4位存入34单元

MOV35H,A;将A的高4位存入35单元

LJMPL0

L2:

JB,L0;=1时转移

MOVC,

JCL2

LCALLDELAY1;延时

MOVC,

JCL2

STOP1:

MOVC,;=0时转移

JNCSTOP1

LCALLDELAY1;延时

MOVC,

JNCSTOP1

MOV50H,#00H

MMM:

LJMPMAIN

;*******设置闹钟*******

SETATIME:

LCALLDISPLAY2;调用DISPLAY2显示闹钟

N0:

LCALLDISPLAY2

MM2:

JB,N1;=1时转移

MOVC,

JCMM2

LCALLDELAY1;延时

JCMM2

MSTOP3:

MOVC,;=0时转移

JNCMSTOP3

LCALLDELAY1;延时

MOVA,50H

INC50H

CJNEA,#00H,HJ2

LJMPN0

HJ2:

INC24H;小时加一

MOVA,24H

CJNEA,#24,GO22;小时计数循环

MOV24H,#00H;复位

MOV38H,#00H

MOV39H,#00H

LJMPN0

N1:

JB,N2;=1时转移

MOVC,

JCN1

LCALLDELAY1;延时

JCN1

MSTOP4:

MOVC,;=0时转移

JNCMSTOP4

LCALLDELAY1;延时

MOVC,

JNCMSTOP4

INC23H;分钟加一

MOVA,23H

CJNEA,#60,GO21;分钟计数循环

MOV23H,#00H;复位

MOV36H,#00H

MOV37H,#00H

LJMPN0

GO21:

MOVB,#0AH

DIVAB

MOV36H,B;将A的低4位存入36单元

MOV37H,A;将A的高4位存入37单元

LJMPN0

GO22:

MOVB,#0AH

DIVAB

MOV38H,B;将A的低4位存入38单元

MOV39H,A;将A的高4位存入39单元

LJMPN0

N2:

JB,N0;=1时转移

MOVC,

JCN2

LCALLDELAY1;延时

MOVC,

JCN2

STOP2:

MOVC,

JNCSTOP2

LCALLDELAY1

MOVC,

JNCSTOP2

MOV50H,#00H

LJMPMAIN

;*******闹钟判断*****************

TIMEPRO:

MOVA,21H

MOVB,23H

CJNEA,B,BK;判断定时闹钟的分钟

MOVA,22H

MOVB,24H

CJNEA,B,BK;判断定时闹钟的小时

SETB

MOVC,

LCALLTIMEOUT;调用TIMEOUT

BK:

RET

;**************喇叭报警*****************

TIMEOUT:

CLR26H

X1:

LCALLBZ;调用喇叭响应程序

CLR;调用喇叭响应程序结束

LCALLDELAY;延时

CLR

LJMPDISPLAY1

BZ:

MOVC,

MOV,C

CLR

MOVR7,#0FFH;喇叭响应时间

T2:

MOVR6,#0FFH

T3:

DJNZR6,T3

DJNZR7,T2

SETB

RET

;*************显示闹钟时间************

LOOKATIME:

LCALLDISPLAY2

MM:

JNB,LOOKATIME

LCALLDELAY1

LJMPMAIN

DELAY1:

MOVR4,#15H;时间延时

DL001:

MOVR5,#0FFH

DL111:

DJNZR5,DL111

DJNZR4,DL001

RET

;***********定时**************

TIME:

PUSHACC;保护现场

PUSHPSW

MOVTH0,#03CH;初值

MOVTL0,#0B0H

DJNZR2,RET0

MOVR2,#14H

MOVA,20H

INCA;秒自加一

CJNEA,#3CH,GO1;秒计数循环

MOV20H,#0;复位

MOV30H,#0

MOV31H,#0

MOVA,21H

INCA;分钟自加一

CJNEA,#3CH,GO2

SETB26H

JB26H,AA

AA:

LCALLTIMEOUT1

CLR26H;分钟计数循环

MOV21H,#0H;复位

MOV32H,#0

MOV33H,#0

MOVA,22H

INCA;小时自加一

CJNEA,#18H,GO3;小时计数循环

MOV22H,#00H;复位

MOV34H,#0

MOV35H,#0

AJMPRET0

GO1:

MOV20H,A

MOVB,#0AH

DIVAB

MOV31H,A;将A的低4位存入31单元

MOV30H,B;将A的高4位存入30单元

AJMPRET0

GO2:

MOV21H,A

MOVB,#0AH

DIVAB

MOV33H,A;将A的低4位存入33单元

MOV32H,B;将A的高4位存入32单元

AJMPRET0

GO3:

MOV22H,A

MOVB,#0AH

DIVAB

MOV35H,A;将A的低4

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

当前位置:首页 > 医药卫生 > 基础医学

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

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