1.研究背景
单片机LCD1602设计的可调式电子钟的研究背景主要涉及利用单片机技术来控制LCD1602显示屏,以实现一个功能完善的电子钟。该设计的核心是选取适合的单片机作为控制芯片,常用的有STC89C52单片机 。通过绘制电路原理图,设计者能够将单片机最小系统与外设单元(如LCD1602)相互连接,从而实现时钟的显示和调节功能。这项研究的背景在于现代生活中对时间精确度和便捷性的需求不断增加。电子钟作为一种常见的时间显示设备,在家庭、办公场所以及各种公共场所中都有广泛的应用。因此,研究人员希望通过设计一个可调式的电子钟,使用户能够方便地调整时间和闹钟设置,以满足不同场合的需求。
2. 功能需求分析
单片机LCD1602设计的可调式电子钟的主要功能包括实时显示当前时间,并且允许用户进行手动调节。LCD显示屏当中显示年月日周秒等相关信息,用户可以通过单片机的按键来实现对时间的调制。
3.系统总体设计
3.1系统整体框架
LCD1602设计的可调式电子钟系统是由单片机最小系统为核心模块的,加上按键和LCD1602显示屏为功能模块,LCD1602显示屏用于时间的显示,按键是对时间年月时分秒进行调节。
3.2硬件设计
包括LCD1602显示屏、时钟芯片(如DS1302)、按键模块、电源模块等。LCD1602显示屏用于显示时间,时钟芯片用于提供精确的时间信息,按键模块用于设置时间和切换显示模式,电源模块为整个系统提供稳定的电源。
3.3软件设计
主程序流程图如图4所示.如图所示首先对整个系统进行初始化,在初始化过程当中包含了对中断的初始化,对LCD的初始化,对DS1302的初始化。
4.系统详细设计
4.1中断子程序
此中断为下降沿触发,按下按键K3后进入中断程序。在中断程序当中,设置一个变量SetState,当一按下就对其进行取反操作。,后如果为反(SetState == 1)时对DS1302进行初始化,让其停止工作,即达成按下按键后电子钟停止功能的操作。相关子程序的逻辑框架图如图五所示。
4.2按键子程序
按键程序分为两个部分,在按下K3后K1与K2才能 执行相应的功能,K3为让电子钟停止,K1,K2为调节电子钟。K2为在相应的挡位进行加一,K1为换挡位。
4.3LCD1602显示程序
1602液晶显示子程序主要是对内部控制指令进行指定如液晶初始化,显示空白,读,写,判断液晶是否忙及指定字符的位置等函数构成。液晶显示子程序流程图如图4-4所示。首先进行液晶初始化,再写地址命令到LCD,然后放发送字符串,最终液晶显示。
5.源码
5.1主函数部分
//用LCD1602设计的可调式电子钟
//设计目标:LCD1602显示实时时钟,可用按键调整时间
//主函数
#include "reg51.h"
#include "lcd.h"
#include "ds1302.h"
#include "Key.h"
#include "LCDdisplay.h"
void main()
{
Int0Configuration();
LcdInit();
Ds1302Init();
while(1)
{
ScanKey();
LcdDisplay();
}
}
5.2功能按键部分
#include "Key.h"
unsigned char SetState,SetPlace;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
void ScanKey()
{
unsigned char i;
if(SetState==0)
{
Ds1302ReadTime();
}
else
{
if(K1==0)
{
Delay10ms();
if(K1==0)
{
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
while((i<50)&&(K1==0))
{
Delay10ms();
i++;
}
i=0;
}
if(K2==0)
{
Delay10ms();
if(K2==0)
{
TIME[SetPlace]++;
if((TIME[SetPlace]&0x0f)>9)
{
TIME[SetPlace]=TIME[SetPlace]+6;
}
if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小时只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=0x7)&&(SetPlace==5)) //周只能到7
{
TIME[SetPlace]=1;
}
}
while((i<50)&&(K2==0)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
}
void Int0Configuration()
{
IT0=1;
EX0=1;
EA=1;
}
void Int0() interrupt 0
{
Delay10ms();
if(K3==0)
{
SetState=~SetState;
SetPlace=0;
Ds1302Init();
}
}
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
5.3LCD显示部分
#include "lcd.h"
#include "ds1302.h"
void LcdDisplay()
{
LcdWriteCom(0x80+0X40);
LcdWriteData('0'+TIME[2]/16); //时
LcdWriteData('0'+(TIME[2]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[1]/16); //分
LcdWriteData('0'+(TIME[1]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[0]/16); //秒
LcdWriteData('0'+(TIME[0]&0x0f));
LcdWriteCom(0x80);
LcdWriteData('2');
LcdWriteData('0');
LcdWriteData('0'+TIME[6]/16); //年
LcdWriteData('0'+(TIME[6]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[4]/16); //月
LcdWriteData('0'+(TIME[4]&0x0f));
LcdWriteData('-');
LcdWriteData('0'+TIME[3]/16); //日
LcdWriteData('0'+(TIME[3]&0x0f));
LcdWriteCom(0x8D);
LcdWriteData('0'+(TIME[5]&0x07)); //星期
}
6.系统测试
LCD1602可调电子钟仿真视频
工程详细代码+仿真图
链接:https://pan.baidu.com/s/1pnbz2twpCVz34GIPF6xHZg?pwd=mfb5
提取码:mfb5
大家也可以关注个人公众号里面有计算机相关课程的期末复习资料和课设