社区
单片机/工控
帖子详情
51单片机+ds1302 的 电子钟加日历怎么做啊
fl_job
2009-09-16 11:46:20
向各位大虾请教,51单片机+ds1302 的 电子钟加日历 的程序应该怎么设计啊?
...全文
282
7
打赏
收藏
51单片机+ds1302 的 电子钟加日历怎么做啊
向各位大虾请教,51单片机+ds1302 的 电子钟加日历 的程序应该怎么设计啊?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dceacho
2009-09-22
打赏
举报
回复
只要弄明白怎样操作DS1302和HT1621,然后有LCD的逻辑图就可以自己做了
czh5880
2009-09-22
打赏
举报
回复
如何设计单片机的闹钟子程序呢?
wky1419
2009-09-20
打赏
举报
回复
这个还是比较简单的啊!!
#define IN_DS1302
//#ifndef include "config.h"
#i nclude "config.h"
//#endif
/*********************************************************************/
/* 实时时钟模块 时钟芯片型号:DS1302 */
/**/
/*********************************************************************/
#define T_RST 0x00004000 /* P0.14 实时时钟复位线引脚 */
#define T_IO 0x00008000 /* P0.15 实时时钟数据线引脚 */
#define T_CLK 0x00010000 /* P0.16 实时时钟时钟线引脚 */
#define T_INCON 0x00014000 /* 定义写端口设置字 */
#define T_OUTCON 0x0001c000 /* 定义读端口设置字 */
void Hold(uint32 dly)
{
for(; dly>0; dly--);
}
void v_InitDS1302(void)
{
IO0DIR = T_OUTCON;
}
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uint8 ucDa)
{
uint8 i;
for(i=8; i>0; i--)
{
if((ucDa&0x01) != 0)
IO0SET = T_IO;
else
IO0CLR = T_IO;
Hold(10);
IO0SET = T_CLK;
Hold(20);
IO0CLR = T_CLK;
Hold(10);
ucDa >>= 1; /*相当于汇编中的 RRC */
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ucDa
***********************************************************************/
uint8 uc_RTOutputByte(void)
{
uint8 i;
uint8 ucDa=0;
IO0DIR = T_INCON;
for(i=8; i>0; i--)
{
Hold(10);
ucDa >>= 1; /*相当于汇编中的 RRC */
if((IO0PIN&T_IO) !=0 )///////////////
ucDa += 0x80;
IO0SET = T_CLK;
Hold(20);
IO0CLR = T_CLK;
Hold(10);
}
IO0DIR = T_OUTCON;
return(ucDa);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uint8 ucAddr, uint8 ucDa)
{
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(ucAddr); /* 地址,命令 */
v_RTInputByte(ucDa); /* 写1Byte数据*/
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uint8 uc_R1302(uint8 ucAddr)
{
uint8 ucDa;
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(ucAddr); /* 地址,命令 */
ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
return(ucDa);
}
/********************************************************************
*
* 名称: v_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_BurstW1302T(uint8 *pSecDa)
{
uint8 i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i=8;i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
v_RTInputByte(*pSecDa);/* 写1Byte数据*/
pSecDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(uint8 *pSecDa)
{
uint8 i;
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
pSecDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstW1302R(uint8 *pReDa)
{
uint8 i;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31;i>0;i--) /*31Byte 寄存器数据 */
{
v_RTInputByte(*pReDa); /* 写1Byte数据*/
pReDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstR1302R(uint8 *pReDa)
{
uint8 i;
IO0CLR = T_RST; /*T_RST = 0;*/
IO0CLR = T_CLK; /*T_CLK = 0;*/
Hold(40);
IO0SET = T_RST; /*T_RST = 1;*/
v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
pReDa++;
}
IO0SET = T_CLK; /*T_CLK = 1;*/
IO0CLR = T_RST; /*T_RST = 0;*/
Hold(40);
}
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uint8 *pSecDa)
{
uint8 i;
uint8 ucAddr = 0x80;
v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7;i>0;i--)
{
v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */
pSecDa++;
ucAddr +=2;
}
v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uint8 ucCurtime[])
{
uint8 i;
uint8 ucAddr = 0x81;
for (i=0;i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
lbing7
2009-09-20
打赏
举报
回复
我被DS1302里的BCD码郁闷了不少时间
这个坛子里也有一哥们发过一贴关于DS1302调试的
你可以搜一下
fl_job
2009-09-20
打赏
举报
回复
谢谢了
vincent101
2009-09-17
打赏
举报
回复
这个百度一下多得数不清,不过最好还是自己看器件手册耐心写,这才叫做学习。
基于
51单片机
的数字
电子钟
本文介绍了一款基于
51单片机
的
电子钟
设计,包括硬件选择如
DS1302
时钟芯片、DS18B20温度传感器、液晶显示屏和按键,以及软件流程和系统调试。设计中考虑了时间设置、温度显示、闹钟功能,并针对
DS1302
读取时间问题提出了解决方案。
基于
51单片机
的
电子钟
万年历LCD1602显示
本文详细介绍了一款基于
51单片机
的
电子钟
万年历设计,使用LCD1602液晶屏显示时间和日期,
DS1302
芯片记录
日历
,包含按键设置、闹钟功能及报警机制。通过Keil编译器,C语言实现,并提供完整源代码和仿真资源。
51单片机
DS1302
时钟
本文围绕
51单片机
DS1302
时钟展开,介绍其实现功能为在数码管显示电子时钟。详细阐述了
DS1302
芯片,包括简介、控制寄存器、
日历
/时钟寄存器、读写时序及BCD码。还说明了硬件原理,如芯片管脚连接等,最后给出软件编写的程序框架。
51单片机
|
DS1302
时钟实验
本文详细介绍了
51单片机
与
DS1302
时钟芯片的交互,包括
DS1302
的特性、管脚功能、操作时序以及在硬件和软件设计中的应用。通过
DS1302
的读写函数,实现了数码管显示实时时间的功能。
【普中】基于
51单片机
电子钟
万年历LCD显示设计
本文详细介绍了基于
51单片机
的
电子钟
万年历设计,包括LCD显示、
DS1302
时间管理、按键控制、Proteus仿真过程、实物烧录步骤以及Keil编译的C语言程序。设计报告涵盖了硬件结构、功能模块和详细操作指南。
单片机/工控
27,522
社区成员
28,798
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章