基于51单片机的LCD1602电子时钟

摘要:
51系列单片机是各单片机中最为典型和最有代表性的一种。由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。本次设计的数字电子时钟采用了STC89C52芯片进行控制,使用DS1302时钟芯片产生时钟数据,通过LCD1602液晶显示屏进行刷新显示。同时,使用4*4矩阵键盘,可以进行日期和时间的调整,且操作简单,计时误差小,显示亮度高,具有良好的实用价值。

一.电子时钟的功能及原理
1.本设计采用时钟芯片,通过单片机对其输出的时间数据进行年、月、日、时、分、秒的解码,并将解码后的数据送到显示屏进行显示。单片机使用定时器T0,每定时2ms后,单片机便产生一个的计时溢出中断,在中断服务函数对矩阵按键进行动态扫描,这样既避免了按键消抖,又减轻了CPU的工作载荷。
2.此外,为了提高电子时钟的实用性,本课题还添加了一个矩阵键盘和蜂鸣器,通过矩阵键盘来调整时间,16个按键分别为‘0~9数字键’、‘设置键’、‘esc键’、‘增加键’、‘减少键’、‘向左键’、‘向右键’。 单片机确定有按键按下,在蜂鸣器控制脚产生一个高电平,使蜂鸣器发出“嘀”的一声,以此来说明按下的动作被执行了。
3.同时电子时钟具有报时的功能,当时间到了整点,比如到了10点钟时,蜂鸣器会连续发出10个响声,表示现在是10点正;当时间到了某点30分时,蜂鸣器会响一声,表示现在是某时半点。

二.电子时钟的硬件设计
1.总体硬件框图
在这里插入图片描述
2 电子时钟硬件系统主要模块功能简要介绍
(1)单片机:本次设计采用AT89C52芯片,低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。256字节RAM, 32 位I/O 口线,与工业80C51 产品指令和引脚完全兼容。价格较低,能满足本次设计的要求
在这里插入图片描述
(2) 电源和复位模块:AT89C52需5V电压,所以可以采用USB接口的5V电源对其供电,复位电路可采用上电复位、按键电平复位、按键脉冲复位3种,本次采用按键电平复位。
(3)显示模块:该模块由LCD1602液晶显示屏组成,共有16个引脚,其中有11个需与单片机相接,工作控制引脚分别接于单片机的P2.4-P2.6脚,数据引脚接于单片机的P0.0-P0.7口上,使用可调电阻实现对显示屏文字清析度的调节。
在这里插入图片描述
(4)矩阵键盘模块:键盘由16个按键组成,行脚分别接在单片机的P1.0-P1.3口,列脚分别接在单片机P1.4-P1.7口上。
在这里插入图片描述
(5)DS1302时钟模块:为了保证同步工作方式的思想,单片机必须有时钟信号,以使其系统在时钟信号的控制下按时序协调工作。
在这里插入图片描述
(6)总体实物图
在这里插入图片描述
3. 电子时钟元器件清单
在这里插入图片描述
三.电子时钟软件系统的设计

1 电子时钟软件系统主要模块功能简要介绍
(1) 主程序:主程序的主要功能是进行定时器/计数器,显示缓冲区的初始化,显示,以及判断是否有功能键按下,判断按下的键并调相应的键功能程序。
(2) 键功能程序:键功能程序的主要功能是执行对应的功能,主要对16个按键进行编码,当单片机得到按下的键的编码,单片机便会跳转到相应的子程序执行相应的功能。
(3) 中断服务程序:中断服务程序的主要功能是进行计时操作和按键扫描,程序开始进行按键检测,然后判断计数溢出是否满了100次,若不满100次则表明没有到达最小的刷新时间,则中断结束;若满100次表明已到达了刷新时间,则将刷新时间标志位置1,进行时间的刷新。

2 电子时钟软件系统程序流程框图
在这里插入图片描述
3.主程序代码

void main()
{
    InitLCD1602(); //初始化 lcd1602
    InitDS1302(); //初始化 DS1302
    ConfgiTimer0(2); //初始化定时器,并定时 2ms
    Delay_nms(10);
    buz = 0;
    LcdShowStr(0,0,"Date:20 - - ");
    LcdShowStr(0,1,"Time: : : ");
    while(1)
    {
        KeyDriver();//检测按键动作
        if (flag200ms == 1 && (setTimeIndex == 0)) //每 200ms 且 setTimeIndex==0 处于非设定时间状态时刷新一次时间显示
        {
            flag200ms = 0;
            GetTimeFromDS1302(&timeBuf); //从 DS1302 中获取时间到 timeBuf 结构体指针变量的成员中
            if(timeBuf.sec != psec) //当前秒值和上一次的秒值不相等
            {
                RefreshLcdShowTime();//刷新时间显示
                psec = timeBuf.sec;//备份当前的秒值(秒寄存器值)
                On_Timr_Alarm();
            }
        }
    }
}

源码下载:关注公众号,首页回复“电子时钟”获取电子时钟的源码工程
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lin5103151/article/details/84996285