找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3245|回复: 1
收起左侧

原创的单片机数字时钟设计与调试 含源程序 仿真 软硬件解释得很详细

[复制链接]
ID:579259 发表于 2019-12-9 17:38 | 显示全部楼层 |阅读模式

利用单片机、若干个按键和6位数码管,构建时分秒实时时钟。要求:(1)时间累进最小单位为秒,数码管为动态显示,共阳共阴不限;(2)具有时钟设置功能,参照如下要求设置:A、“设置”键按下,进入设置状态;B、“选择/移位”键按下,选定对时、对分、对秒设置;C、用上、下键(或加、减键)对选定的时、分、秒进行设置,设定起点时间;D、“确认”键按下后,从设定的起点时刻开始,实现时分秒时钟;E、“取消”键按下后,本次所有设置无效,仍从“设置”按下前时刻开始计时。

我们用单片机的P0口的连接数码管的段码线, P2口连接数码管的位选线,P1.0口为设置按键,P1.1口为选择/移位按键,P1.2口为加一按键,P1.3口为减一按键,P1.4口为确认按键,P1.5口为取消按键。单片机上电之后定时器T0开始计时,按下设置按键后进入设置模式,按下不同的按键对应设计要求的不同效果。

1.2 分析

根据题目,我们需要实现时分秒时钟功能,并且进入设置模式后,按下不同的按键能够进行不同的设置操作,从而实现更改时分秒的值等操作。因此,我们将总原理图分为单片机最小系统模块、独立按键模块、数码管显示模块、数码管锁存驱动模块等四个模块。单片机最小系统为主控板处理信息;独立按键模块来实现按键信息的输入;数码管显示模块用来根据独立按键模块不同按键按下时读取的键值来进行段选和位选,从而完成时钟显示功能;数码管驱动模块用来增加数码管的驱动能力,并且作为锁存器,当输入的数据消失时,在芯片的输出端数据仍然保持。

2.方案设计
2.1 系统总体框图
图2.1 系统总体框图
2.2 系统总体框图描述

              AT89C51:作为主控芯片,来处理接收到的按键信息,并控制数码管显示相应的数值。

              晶振电路:单片机晶振的作用是为系统提供基本的时钟信号,通常一个系统共用一个晶振,便于各部分保持同步。没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。

              复位电路:在上电或复位的过程中,控制单片机的复位状态,这段时间让单片机保持复位状态,而不是一上电或刚复位完毕就工作,防止单片机发出错误的指令、执行错误操作,也可以提高电磁兼容性能。

              按键控制电路:通过独立按键来进行对标志位和引脚高低电平的判断,“设置”键按下,进入设置状态;“选择/移位”键按下,选定对时、对分、对秒设置;用上、下键(或加、减键)对选定的时、分、秒进行设置,设定起点时间;“确认”键按下后,从设定的起点时刻开始,实现时分秒时钟;“取消”键按下后,本次所有设置无效,仍从“设置”按下前时刻开始计时。

              数码管显示电路:采用共阴极数码管,单片机通过I/O输出高低电平信号,从而使数码管点亮不同的段,显示不同的数字,实现时钟功能。

数码管驱动锁存电路:74HC573包含八路3态输出的非反转透明锁存器,是一种高性能硅栅CMOS器件。SL74HC573跟LS/AL573的管脚一样。器件的输入是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。


3. 硬件设计
3.1 主要元器件介绍
3.1.1 独立按键

独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。本次课设只需要6个独立按键来实现功能,因此不会有太大的影响。

独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。

根据设计要求:按下设置按键后进入设置模式,此时按下不同的按键,进行不同的操作,比如移位选择时分秒、加一减一等操作。只需将P1.0口为设置按键,P1.1口为选择/移位按键,P1.2口为加一按键,P1.3口为减一按键,P1.4口为确认按键,P1.5口为取消按键。通过按键扫描函数不断扫描键值来判断是否进入相应的设置模式。

在独立按键处理过程中,一旦检测到有按键闭合与确认按键已经稳定闭合期间,通过调用10-20ms延时子程序避开按键抖动问题。由于按键是机械器件,按下或者松开时有固定的机械抖动,抖动图如图所示:

图3.1 按键抖动图

按键去抖分为硬件去抖和软件去抖,硬件去抖最简单的是按键两端并联电容,容量根据实验而定。软件去抖使用方便不增加硬件成本,容易调试,所以现在处理按键抖动问题大部分选择软件去抖。软件去抖操作步骤如下:

①检测到按键按下后进行10-15ms延时,用于跳过这个抖动区域。

②延时后再检测按键状态,如果没有按下表明是抖动或者干扰造成,如果仍旧按下,可以认为是真正的按下。并进行对应的操作。

③同样按键释放后也要进行去抖动延时,延时后检测按键是否真正松开。

3.1.2 8位极数码管

要显示8位数码管,需控制:8个公共端COM(位选线)和8*8个段引脚(段选线)。段选线选择显示字型,位选线控制着该数码管的亮或灭。根据控制方式不同,分为静态显示和动态显示。

静态显示就是显示驱动电路具有输出锁存功能,单片机将所有要显示的数据送出后就不再控制LED,直到下一次显示时再传送一次新的显示数据。静态显示的数据稳定,占用的CPU时间少。静态显示中,每一个显示器都要占用单独的具有锁存功能的I/O接口,该接口用于笔划段字型代码。这样单片机只要把要显示的字形代码发送到接口电路,该字段就可以显示发送的字形。要显示新的数据时,单片机再发送新的字形码。另一种方法是动态扫指显示。动态扫描方法是用其接口电路把所有显示器的8个笔画段a-h同名端连在一起,而每一个显示器的公共极COM各自独立的受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM段,而这一段是由I/O控制的,由单片机决定何时显示哪一位了。

动态扫描用分时的方法轮流控制各个显示器的COM端,使各个显示器轮流点亮。在轮流点壳扫描过程中,每位显示器的点壳时间极为短暂,但由于人的视觉暂留现象及余晖效应,给人的感觉就是一串稳定的显示数据。

图3.2 数码管引脚图
3.1.3 74HC573锁存器

74HC573包含八路3态输出的非反转透明锁存器,是一种高性能硅栅CMOS器件。SL74HC573跟LS/AL573的管脚一样。器件的输入是和标准CMOS输出兼容的,加上拉电阻他们能和LS/ALSTTL输出兼容。当锁存使能端LE为高时,这些器件的锁存对于数据是透明的(也就是说输出同步)。当锁存使能变低时,符合建立时间和保持时间的数据会被锁存。

图3.3 74HC573引脚图

3.2 原理图及功能电路介绍
3.2.1 单片机最小系统
图3.4 单片机最小系统
3.2.2 独立按键
图3.5 独立键盘电路图
3.2.3 锁存器
图3.5 锁存器电路图
3.2.4 8位数码管显示
图3.6 数码管显示电路图
4.软件设计
4.1 程序流程图
图4.1 主程序流程图

图4.2 按键扫描函数程序流程图         图4.3 中断服务子程序流程图

4.2程序流程图说明

首先,对单片机最小系统及所需要的各种参数进行初始化,包括I/O口初始化、按键以及定时器初始化,单片机上电之后定时器便开始计时,当按键扫描函数扫描到“设置”键按下时,停止计时,存储初始计时时间,当“移位”键按下时,判断“加”或者“减”按键是否被按下,通过“移位”和“加”“减”键来设定自己想要的时间后,按下“确认”键从设定时间开始计时。按下“取消”键则从初始计时时间开始计时。

5.仿真调试
5.1 调试方案

本次设计软件编程方面,采用模块化编程的思想,主要有三个模块:数码管显示模块、按键扫描模块、定时器计时模块。首先,编写数码管显示函数模块。数码管采用动态扫描的方式,先送位码,再送段码,然后再消隐。调试阶段,数码管正常显示。其次,编写定时器计数模块。我们采用定时器T0,方式1,定时50ms,采用长定时,定时20次,即为1s,采用中断方式。在中断服务子程序中,根据日常时分秒的进制关系,对时分秒变量进行处理。

5.2 调试过程

在调试阶段,数码管显示不出时间,一直处于黑屏,后来发现,可能是数码管消隐的问题,将相关语句注释掉,即可正常显示时间运行。最后编写按键扫描模块。我们先定义定时器启停标志位flag,通过标志位控制定时器的TR0,从而控制定时器的启停。在设置按键里,只需将标志位flag置1,即可停止定时器,进入设置状态。在选择/移位按键里,我们循环改变之前定义的mark标志位,即可选择相应的时间位。在增减按键里,我们需要对时间位数值进行自增或自减,并且做好相应的上下界的处理。由于if语句使得语句过于冗余,因此此处采用冒号表达式,这样看起来更简洁明了些。在取消按键里,由于需要记忆之前的时间,所以,在这之前我们定义一个存放时间值的数组。在设置按键里,将初始时间存放在数组里,然后在取消按键里,对时间进行重新赋初始值,然后在将flag标志位置0。在确认按键里,我们只需要将flag标志位置0,从而再次启动定时计数器。在调试阶段,虽然功能能够正常使用,但出现了按键之间的冲突。例如,在数字钟计时阶段,可以通过按键来修改数值,所以,我们需要对按键进行相应的互锁,让不同时刻按键的功能失效或再次生效。我们可以利用之前定义的flag标志位,在功能按键里进行判断,当定时器停止计时,修改数值的功能键才有效。

此时,按键扫描模块的按键功能不会冲突,达到了预期的效果。

但本次设计仍然存在一些问题,就是按键按下后,数码管会黑屏,原因是我们的按键做了按键松开检测,如果按键按下一直不放,会在此处出现死循环。而采用这一措施,是为了保证每次按键按下都执行一次的功能。其次,考虑到数码管显示不如LCD好控制(或者说稳定),我们没有加移位调整时的时间位闪烁功能,可能操作起来缺少点体验感。

5.3 Proteus仿真截图
5.3.1 定时器定时

如图,单片机上电之后定时器立即开始工作,以秒为最小单位显示时间。

图5.3.1 定时器开始工作
5.3.2 进入设置模式

如图,定时器进入设置模式后,定时器暂停工作,定时值不变。

图5.3.2 进入设置模式
5.3.3选择/移位操作
如图,按下“选择/移位”按键后,首先对时进行设置
图5.3.3 选择/移位操作
5.3.4时位加一
如图,按下“加”按键之后时钟的时会加一。
图5.3.4 时位加一
5.3.5分位加一
如图,再次按下“选择/移位”,对分位进行设置,按下加一键后分位加一。
图5.3.5 分位加一
5.3.6秒位加一
如图,再次按下“选择/移位”,对秒位进行设置,按下加一键后秒位加一。
图5.3.6 秒位加一
5.3.7仿真的局限性

仿真截图无法表现出数码管在动态显示时钟的状态。




完整的Word格式文档51黑下载地址:

单片机课设.docx (1.06 MB, 下载次数: 30)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:579259 发表于 2019-12-9 17:39 | 显示全部楼层
所有代码,原理图仿真,代码均为原创
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表