基于51单片机实现时间显示及闹钟设置

文章目录

  • 一、介绍
  • 二、原理
  • 三、步骤
  • 四、结果
  • 五、结果分析
  • 六、总结
  • 一、介绍

    本次为大学中的一次创新实验,当时老师叫我自己拿个单片机去玩,为了赶时间就做了个简单的时间显示和闹钟设置,因为比较简单所以也把代码附上了。

    二、原理

    1.单片机
    单片机内部内部资源:Flash——程序存储空间;RAM——数据存储空间;SFR——特殊功能寄存器。51单片机指的是兼容IntelMCS-51体系架构的一系列的单片机。下图为单片机电路。


    2.LED小灯
    LED即发光二极管,俗称 LED 小灯,板子上用的是普通的贴片发光二极管。这种二极管通常的正向导通电压是 1.8V 到 2.2V 之间, 工作电流一般在 1mA~20mA 之间。由于电源从正极到负极有电压差, 并且电路是导通的, 所以就会有电流通过, LED 小灯因为有了电流通过,所以就会直接发光。把右侧的原 GND 处接到单片机 P0.0 引脚上,那么单片机输出一个低电平,就可以让 LED 小灯发光了。
    下图为LED电路图。


    1. 74HC245芯片
      这个芯片的作用是电流缓冲器,可以稳定小灯和IO口之间的电流,达到稳定电路的作用。74HC245 是个双向缓冲器,1 引脚 DIR 是方向引脚,当这个引脚接高电平的时候,右侧所有的 B 编号的电压都等于左侧 A 编号对应的电压。如果 DIR 引脚接低电平,得到的效果是左侧 A 编号的电压都会等于右侧 B 编号对应的电压。使能引脚 19 脚 OE,叫做输出使能,这个引脚上边有一横,表明是低电平有效,当接了低电平后,74HC245 到双向缓冲器的作用,如果 OE 接了高电平,74HC245 功能不能实现出来。
      下图为74HC245功能图:

    2. 74HC138译码器
      这个芯片由简单的输入逻辑来控制输出逻辑,74HC138 有 1~6 一共是 6 个输入引脚,其中 4、5、6 这三个引脚是使能引脚。ENLED 输入低电平,ADDR3 位置输入高电平,这两个位置都是使能控制端口。
      下图为74HC38原理图:

    下图为74HC138真值表:

    5.定时器
    定时器是用来进行定时的。定时器内部有一个寄存器,让它开始计数后,这个寄存器的值每经过一个机器周期就会自动加1,一个机器周期的时间,也就是12/11059200 秒。16位的定时器,也就是2个字节,最大值就是65535, 那么加到65535 后,再加1就溢出,溢出后,这个值会直接变成0。
    下图为定时值存储寄存器:

    下图为TCON定时器控制寄存器的位分配:

    当TR1 =1定时器值就会每经过一个机器周期自动加1,当TR1 = 0,定时器就会停止加1,其值会保持不变化。TF1是一个标志位,他的作用是告知定时器溢出了。
    下图为TMOD——定时器模式寄存器的位分配:


    下图为定时器模式1示意图:

    时间的计算方法:
    晶振是11.0592M,时钟周期就是1/11059200,机器周期是12/11059200,假如要定时 20ms,就是 0.02 秒,经过18432个时间周期就可以得到0.02秒。16位定时器的溢出值是65536,给它一个初值47104,经过18432个时钟周期后溢出,TF0的值改变,刚好经过0.02s。

    6.数码管
    数码管分为共阳和共阴两种, 共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的, 阴极是公共端,由阳极来控制单个小灯的亮灭。数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8 个 LED 小灯组成的。
    下图为数码管原理图:

    开发板上一共有8个数码管,它们也都由74HC38控制三极管的导通来控制整个数码管的使能。
    下图为6个数码管示意图:

    下图为数码管硬件驱动原理图:

    下图为数码管真值表:

    多个数码管显示数字的时候,使用74HC38轮流点亮数码管(一个时刻内只有一个数码管是亮的) ,利用人眼的视觉暂留现象(也叫余辉效应) ,就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫做动态扫描。

    7.独立按键
    独立式按键4 条输入线接到单片机的 IO 口上,当按键 K1 按下时,+5V 通过电阻 R1 然后再通过按键 K1 最终进入 GND 形成一条通路,那么这条线路的全部电压都加到了 R1 这个电阻上, KeyIn1 这个引脚就是个低电平。当松开按键后,线路断开,就不会有电流通过,那么 KeyIn1 和+5V 就应该是等电位,是一个高电平。就可以通过 KeyIn1 这个 IO 口的高低电平来判断是否有按键按下。
    下图为独立式按键原理图:

    8.矩阵按键
    矩阵按键使用 8 个 IO 口来实现了 16 个按键。
    下图为矩阵按键原理图:

    通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开, 而是在闭合和断开的瞬间伴随了一连串的抖动。抖动时间是由按键的机械特性决定的, 一般都会在 10ms 以内, 为了确保程序对按键的一次闭合或者一次断开只响应一次, 必须进行按键的消抖处理。当检测到按键状态变化时, 不是立即去响应动作, 而是先等待闭合或断开稳定后再进行处理。按键消抖可分为硬件消抖和软件消抖。

    硬件消抖就是在按键上并联一个电容, 如下图所示, 利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。

    软件消抖就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。

    9.蜂鸣器
    蜂鸣器从结构区分分为压电式蜂鸣器和电磁式蜂鸣器。压电式为压电陶瓷片发音,电流比较小一些,电磁式蜂鸣器为线圈通电震动发音,体积比较小。 按照驱动方式分为有源蜂鸣器和无源蜂鸣器。如下图给了 BUZZ 引脚一个低电平,蜂鸣器就会直接响。 而无源蜂鸣器内部是不带振荡源的, 要让他响必须给 500Hz~4.5KHz 之间的脉冲频率信号来驱动它才会响。无源蜂鸣器声音频率可以控制,而音阶与频率又有确定的对应关系,因此就可以做出来“do re mi fa sol la si”的效果,可以用它制作出简单的音乐曲目。

    电路需要用三极管驱动,并且加了一个 100 欧的电阻作为限流电阻。此外还加了一个 D4 二极管,这个二极管叫做续流二极管。当三极管导通给蜂鸣器供电时,就会有导通电流流过蜂鸣器。电流经过 D4 和蜂鸣器自身的环路来消耗掉了,从而就避免了关断时由于电感电流造成的反向冲击。

    三、步骤

    1.Keil软件设置
    ① 新建工程

    ② 选择芯片型号

    ③ 新建文件并添加

    2.流水灯程序编写


    3.时间显示及闹钟设置程序编写


    4.矩阵按键主程序编写


    5.编译及下载程序
    点击keil软件的编译按钮,生成hex文件,使用STC-LSP软件将hex文件下载到单片机上。

    四、结果

    1.时间显示
    按下矩阵键盘1后,执行时间显示功能,由于数码管只有8位,所以从左边起第一位到第六位都显示时间,起始时间为23时59分50秒,经过10秒后,会自动归零,显示为0时0分0秒。


    在时间显示功能下,按下独立键盘K1,K2调整闹钟的小时部分,显示在数码管右边起第一第二位,如下图表示设置闹钟小时部分为23

    按下独立键盘K3、K4键调整闹钟的分钟部分,下图为调整闹钟分钟部分为59,所以设置的闹钟为23:59。当目前显示的时间为闹钟所设置的时间时,蜂鸣器就会响起,实现闹钟的功能。

    2.日期显示
    按下矩阵键盘2号键,执行日期显示程序,下图为显示日期为2021年1月6日
    由于只有4个按键,所以调整日历的时候K3、K4用于调整天数,K1、K2用于调整月份,当月份大于12时,年份自动加一,当月份小于1时,年份自动减一,实现了四个按键调整年月日的功能。



    3.流水灯显示
    增加流水灯显示提高气氛,如下图按下矩阵键盘3号键进行流水灯显示。

    五、结果分析

    本次实验使用定时器实现了时钟显示和日期显示,并能综合使用独立按键和矩阵按键实现多个功能,提高了该项目的实用性。闹钟设置则能实现按时提醒,丰富了应用场景。通过使用74HC245芯片稳定电流,达到保护电路的作用,使用74HC138译码器,实现数码管的同时显示,由于数码管显示速度过快会导致有残影,所以加上延时函数和p0=0x00语句来达到消影的效果。在进行按键函数编写时,按键往往存在抖动,所以为了提高按键的稳定性,需要进行按键消抖,矩阵按键用于功能选择,独立按键用于闹钟或者日期调整,这样做可以提高程序的实用性,但仍存在优化的空间。

    六、总结

     本次实验感觉工程量还是不小的,由于时间也比较紧迫,所以在这几段时间内都花了比较长的时间来做实验,前期主要是学习单片机各种芯片的功能,首先掌握了74HC245芯片的稳流功能,知道它在LED显示中的重要作用。为了实现数码管同时显示时间,需要用到数码管的动态扫描,所以也学习了数码管的知识。闹钟的实现这一块想了好久,因为没有足够的数码管来显示闹钟,最后折中想出用六个数码管显示时间,剩余的两位来显示闹钟的小时部分和分钟部分,当按下的按键要调整闹钟的小时时,则显示小时部分,当按下的按键要调整闹钟的分钟时,则显示分钟部分。一开始想通过点阵来显示日期,但发现8X8的点阵没办法显示完整的日期,最后还是显示在数码管上,通过矩阵按键来选择要显示的是时间还是日期。一开始编写代码的时候总是报错,但最后也通过软件的提示信息找出报错的原因,也学会了使用extern关键字来使用其他文件的函数,提高了程序各个文件的关联性,这次实验让自己学习到了很多东西,锻炼了使用C语言编写程序的能力,也是自己收获最大的一次实验,虽然实验过程中会犯错,但只有肯学习、肯下功夫,就没有解决不了的困难。
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于51单片机实现时间显示及闹钟设置

    发表评论