标题:
采用DS12CR887时钟芯片驱动的51单片机数字时钟,lcd1602显示
[打印本页]
作者:
51hei学习技术中
时间:
2017-3-16 02:53
标题:
采用DS12CR887时钟芯片驱动的51单片机数字时钟,lcd1602显示
基于51单片机数字时钟,网上一般都是用51单片机+ds1302做的精度没有我这个好,这次是采用DS12CR887时钟芯片,1602液晶显示,经过本人测试成功.特发布在51黑电子论坛.
0.png
(64.25 KB, 下载次数: 80)
下载附件
2017-3-16 02:49 上传
完整源码下载:
51-clock.rar
(75.05 KB, 下载次数: 37)
2017-3-16 02:52 上传
点击文件名下载附件
下载积分: 黑币 -5
DS12CR887的驱动
程序:
/*
* RTC.c
*
* Created: 12/3
* Author: 詹磊
*/
#include"File_h\main.h"
#include"File_h\LCD1602.h"
#include"File_h\key.h"
#include"File_h\RTC.h"
//-------------------------------------------//
//函数名:写DS12CR887数据函数
//入口:Addre:所写数据的地址
// Data:需要写入的数据
//出口:Void
//功能:写DS12CR887内数据
//-------------------------------------------//
void WriteDS12CR887(unsigned char Addre,unsigned char Data)
{
DS12CR887_DS=1;
DS12CR887_RW=1;
DS12CR887_AS=1;
DS12CR887_DataPutIO=Addre;
DS12CR887_CS=0;
DS12CR887_AS=0;
DS12CR887_DataPutIO=Data;
DS12CR887_RW=0;
DS12CR887_RW=1;
DS12CR887_CS=1;
DS12CR887_AS=1;
}
//-------------------------------------------//
//函数名:读DS12CR887数据函数
//入口:Addre:所读数据的地址
//出口:unsigned char :所读出的数据
//功能:读DS12CR887内数据
//-------------------------------------------//
unsigned char ReadDS12CR887(unsigned char Addre)
{
unsigned char ds_date;
DS12CR887_RW=1;
DS12CR887_DS=1;
DS12CR887_AS=1;
DS12CR887_DataPutIO=Addre;
DS12CR887_CS=0;
DS12CR887_AS=0;
DS12CR887_DataPutIO=0xff;
DS12CR887_DS=0;
ds_date=DS12CR887_DataPutIO;
DS12CR887_DS=1;
DS12CR887_CS=1;
DS12CR887_AS=1;
return ds_date;
}
//-------------------------------------------//
//函数名:时钟芯片始化
//入口:Void
//出口:Void
//功能:配置相关寄存器等
//-------------------------------------------//
void RTC_Init()
{
/*
WriteDS12CR887(0x00,0x57);
WriteDS12CR887(0x02,0x59);
WriteDS12CR887(0x04,0x23);
WriteDS12CR887(0x06,0x07);
WriteDS12CR887(0x07,0x30);
WriteDS12CR887(0x08,0x12);
WriteDS12CR887(0x09,0x01);
*/
///*
WriteDS12CR887(0x00,57);
WriteDS12CR887(0x02,59);
WriteDS12CR887(0x04,23);
WriteDS12CR887(0x06,07);
WriteDS12CR887(0x07,30);
WriteDS12CR887(0x08,12);
WriteDS12CR887(0x09,01);
//*/
WriteDS12CR887(0x0A,0x20);
WriteDS12CR887(0x0B,0x06);
}
//-------------------------------------------//
//函数名:读时钟数据函数
//入口:*tp:所读时间数据的结构体指针
// *dp:所读日期数据的结构体指针
//出口:Void
//功能:读时钟数据
//-------------------------------------------//
void GetRTC_Data(TimeData *tp,DateData *dp)
{
tp->second=ReadDS12CR887(0x00);
tp->minute=ReadDS12CR887(0x02);
tp->hour=ReadDS12CR887(0x04);
dp->day=ReadDS12CR887(0x06);
dp->date=ReadDS12CR887(0x07);
dp->month=ReadDS12CR887(0x08);
dp->year=ReadDS12CR887(0x09);
}
//-------------------------------------------//
//函数名:调时间数据函数
//入口:*tp:所写时间数据的结构体指针
//出口:Void
//功能:调时间数据
//-------------------------------------------//
void WriteRTC_TimeData(TimeData *tp)
{
WriteDS12CR887(0x00,tp->second);
WriteDS12CR887(0x02,tp->minute);
WriteDS12CR887(0x04,tp->hour);
}
//-------------------------------------------//
//函数名:调日期数据函数
//入口:*dp:所写日期数据的结构体指针
//出口:Void
//功能:调日期数据
//-------------------------------------------//
void WriteRTC_DateData(DateData *dp)
{
WriteDS12CR887(0x06,dp->day);
WriteDS12CR887(0x07,dp->date);
WriteDS12CR887(0x08,dp->month);
WriteDS12CR887(0x09,dp->year);
}
//-------------------------------------------//
//函数名:调闹钟数据函数
//入口:*atp:所写闹钟数据的结构体指针
//出口:Void
//功能:调闹钟数据
//-------------------------------------------//
void WriteRTC_AlarmData(TimeData *atp)
{
WriteDS12CR887(0x01,atp->second);
WriteDS12CR887(0x03,atp->minute);
WriteDS12CR887(0x05,atp->hour);
}
复制代码
按键驱动程序:
/*
* key.c
*
* Created: 12/3
* Author: 詹磊
*/
#include"File_h\main.h"
#include"File_h\LCD1602.h"
#include"File_h\key.h"
#include"File_h\RTC.h"
//-------------------------------------------//
bit KEY_flag=0;
bit LongKEY_flag=0,LongKEY_START=1;
unsigned char KeyBuffer[KeyBufferSize]={0,0,0,0}; //键盘缓存区数组
unsigned char KeyIndexW=0; //键盘缓存队列写入指针
unsigned char KeyIndexR=0; //键盘缓存队列读取指针
unsigned char KeyCount=0; //键盘缓存队列内记录的按键次数
//-------------------------------------------//
//函数名:按键始化
//入口:Void
//出口:Void
//功能:配置按键IO口模式等
//-------------------------------------------//
void InitKey()
{
KEYControl|=KEYFullValue;
}
//-------------------------------------------//
//函数名:按键压栈函数
//入口:Key:需要压入按键缓存的键值
//出口:Void
//功能:将一次键值压入按键缓存中
//-------------------------------------------//
void KeyInBuffer(unsigned char Key)
{
bit tempEA;
if(KeyCount>=KeyBufferSize) //缓存已满,放弃本次按键
return;
tempEA=EA;
EA=0; //涉及共享数据,关中断
KeyCount++;
KeyBuffer[KeyIndexW]=Key;
if(++KeyIndexW>=KeyBufferSize) //如果队列头指针越界,循环队列
KeyIndexW=0;
EA=tempEA; //开中断
}
//-------------------------------------------//
//函数名:按键出栈函数
//入口:Void
//出口:unsigned char 返回键值
//功能:从键盘缓存中读取一次键值,调用一次会把按键缓存中所调用的那个按键的键值删除
//-------------------------------------------//
unsigned char GetKey()
{
uchar Key;
bit tempEA;
if(KeyCount==0)
return 0;
tempEA=EA;
EA=0; //涉及共享数据,关中断
KeyCount--;
Key=KeyBuffer[KeyIndexR];
if(++KeyIndexR>=KeyBufferSize) //如果队列头指针越界,循环队列
KeyIndexR=0;
EA=tempEA; //开中断
return Key;
}
//-------------------------------------------//
//函数名:按键扫描函数
//入口:Void
//出口:Void
//功能:扫描IO口按键输入情况,如果有按键事件,那么就保存键值到按键堆栈区中
//-------------------------------------------//
void CheckKey()
{
static unsigned char KeyTemp,KeyStateTime;
unsigned int temp;
unsigned char timeTemp;
if((TestKey!=KEYFullValue)&&(KEY_flag!=1)) //查询是否有按键按下
{
for(temp=KeyDelayTime;temp>0;temp--) //延时消抖
if(TestKey==KEYFullValue)
return;
if(TestKey!=KEYFullValue) //消抖后检测按键是否还按下;如果是,
//则说明是有效按键;如果不是,
//则认为抖动
{
LongKEY_START=1; //长按开始标志
KEY_flag=1; //标志有按键按下
KeyTemp=KEYControl&KEYFullValue; //记录键值
}
}
if((TestKey==KEYFullValue)&&(KEY_flag==1)&&(LongKEY_flag==0)) //松手且之前有按键按下去过,但未响应过长按键
{
KEY_flag=0;
switch(KeyTemp) //键值压栈
{
case KEY1:KeyInBuffer(1);
break;
case KEY2:KeyInBuffer(2);
break;
case KEY3:KeyInBuffer(3);
break;
case KEY4:KeyInBuffer(4);
break;
case KEY5:KeyInBuffer(5);
break;
case KEY6:KeyInBuffer(6);
break;
/*case KEY7:
break;
case KEY8:
break;*/
default:
break;
}
}
else if((TestKey!=KEYFullValue)&&(KEY_flag==1)) //如果消抖完成且一直按键按着
{
KeyStateTime++; //那么按键状态时间自++
if(LongKEY_START)
timeTemp=LongKeyActionTime;
else
timeTemp=KeyStateTimeFull;
if(KeyStateTime>timeTemp) //检测按键状态时间是否达到所需时间
{
LongKEY_flag=1; //长按键标志置位,表示响应长按键
KeyStateTime=0; //清除按键状态时间,为下次做准备
LongKEY_START=0;
switch(KeyTemp) //键值压栈
{
case KEY1:KeyInBuffer(0x81);
break;
case KEY2:KeyInBuffer(0x82);
break;
case KEY3:KeyInBuffer(0x83);
break;
case KEY4:KeyInBuffer(0x84);
break;
case KEY5:KeyInBuffer(0x85);
break;
case KEY6:KeyInBuffer(0x86);
break;
/*case KEY7:
break;
case KEY8:
break;*/
default:
break;
}
}
}
if((LongKEY_flag==1)&&(TestKey==KEYFullValue)) //如果响应过长按键,且按键现在松开了
{
KEY_flag=0;
KeyStateTime=0;
LongKEY_flag=0;
}
}
复制代码
作者:
dzbj
时间:
2017-3-16 09:34
已经下载收藏 慢慢学习 感谢分享
作者:
lxa0
时间:
2017-3-16 19:06
没有硬件接线图吗?
作者:
maya593
时间:
2017-7-12 12:39
努力赚黑比啊!
作者:
aiii66
时间:
2019-3-1 16:27
下载学习中
作者:
sunnywu503
时间:
2019-3-1 19:38
可惜没有硬件接线图,试着从源码查看,只能逐一实验单片机脚看看能否接的对
。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1