本设计的主要任务是计时和显示。
设计任务的具体要求如下:
- 计时:第一种是通过单片机内部的定时器/计数器来实现为软时钟。第二种是通过专用的硬件时钟芯片来实现为硬时钟。
- 显示:第一种是数码管显示,分为静态显示和动态显示,动态显示需要占用cpu大量时间来运行,不需要复杂的驱动程序,制作成本不高。第二种是LCD1602液晶显示,能显示出较多的信息并且数字清晰,应用广泛,但是不便于观察。
总设计思路阐述
1.时钟方案设计及选择:目前有DS3231、DS302、DS12C887三种时钟芯片。本次设计选择DS3231,
需要应用IC总线协议。
2.核心控制区设计方案:选用STC89C51作为核心控制单元。
3.显示原件:采用LCD1602液晶显示。
4.键盘设置:设计为时、分、秒的调整按键。
5.控制继电器:选择5V/1A继电器,驱动LCD液晶显示。
6.外围电路:复位电路,晶振。
7.时钟时序问题
代码如下:
/*******************************************************************************
实验名 :高精度时钟显示和控制
使用的IO : P3^0 SDA
P3^1 SCL
实验效果:1602 显示时钟,按S4进入时钟设置并暂停时钟,按S1选择时钟设置的时分秒日月周年,按S3使时间加一
*******************************************************************************/
#include<reg51.h>
#include"lcd.h"
#include"ds3231.h"
sbit K1=P3^5;//按键IO口定义
sbit K2=P3^4;
sbit K3=P3^3;
sbit K4=P3^2;
void Int0Configuration();//外部中断初始化函数声明
void LcdDisplay();//LCD初始化函数声明
unsigned char SetState,SetPlace;
void Delay10ms(void); //10ms延迟函数
/*******************************************************************************
* 函数名 : main
* 函数功能 : 主函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void main()
{
unsigned char i;
Int0Configuration();//外部中断初始化
LcdInit();//LCD初始化
DS3231_Init();//DS3231模块初始化
while(1)
{
if(SetState==0)//标志位为0时读取时间
{
DS3231_Read_time();
}
else
{
if(K1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(K1==0)
{
while(!K1);//检测是否松手
SetPlace++;
if(SetPlace>=7)
SetPlace=0;
}
}
if(K2==0) //检测按键K2是否按下
{
Delay10ms(); //消除抖动
if(K2==0)
{
while(!K2);//松手检测
TIME[SetPlace]++;
if((TIME[SetPlace]>=60)&&(SetPlace<2)) //分秒只能到60
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=24)&&(SetPlace==2)) //小时只能到23
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=32)&&(SetPlace==3)) //日只能到31
{
TIME[SetPlace]=0;
}
if((TIME[SetPlace]>=13)&&(SetPlace==4)) //月只能到12
{
TIME[SetPlace]=0;
}
if((TIME[S