社区
单片机/工控
帖子详情
DS1302时钟芯片读出的时间与实时时间不一致,这是什么原因?
Dreamer_LX灵
2012-05-09 04:51:18
使用DS1302时钟芯片,用LED点阵显示屏显示时间,但是设置好初始时间后,显示时间是没问题的,就是显示的时间比实际时间慢很多,而且相差越来越大,这到底是怎么回事啊?求解答!
...全文
1717
9
打赏
收藏
DS1302时钟芯片读出的时间与实时时间不一致,这是什么原因?
使用DS1302时钟芯片,用LED点阵显示屏显示时间,但是设置好初始时间后,显示时间是没问题的,就是显示的时间比实际时间慢很多,而且相差越来越大,这到底是怎么回事啊?求解答!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ss115
2012-05-18
打赏
举报
回复
我是不知道怎么写这个程序,,头都是大的。
Dreamer_LX灵
2012-05-18
打赏
举报
回复
[Quote=引用 8 楼 的回复:]
我是不知道怎么写这个程序,,头都是大的。
[/Quote]
#include<STC12C5A32S2.h>
//位寻址寄存器定义
sbit ACC_0 = ACC^0;
sbit ACC_7 = ACC^7;
//管脚定义
sbit DS1302_CLK = P1^1; //实时时钟时钟线引脚
sbit DS1302_IO = P1^2; //实时时钟数据线引脚
sbit DS1302_RST = P1^3; //实时时钟复位线引脚
#if 1
void DS1302WriteByte(uchar dat) //实时时钟写入一字节(内部函数)
{
uchar i;
ACC = dat;
for(i=8; i>0; i--)
{
DS1302_IO = ACC_0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0;
ACC >>= 1;
}
}
uchar DS1302ReadByte() //实时时钟读取一字节(内部函数)
{
uchar i,dat1=0,dat2=0;
for(i=8; i>0; i--)
{
ACC >>= 1; //相当于汇编中的 RRC
ACC_7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0;
}
dat1 = ACC;
dat2 = dat1>>4; //数据进制转换
dat1 = dat1%16; //十六进制转十进制
dat1 = dat1+dat2*10;
return(dat1);
}
void Write1302(uchar cmd, uchar dat) //cmd: DS1302地址命令, dat: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302WriteByte(cmd); // 地址,命令
DS1302WriteByte(dat); // 写1Byte数据
DS1302_RST = 0;
DS1302_CLK = 1;
}
uchar Read1302(uchar cmd) //读取DS1302某地址的数据
{
uchar dat=0;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302WriteByte(cmd); //地址,命令
dat = DS1302ReadByte(); //读1Byte数据
DS1302_RST = 0;
DS1302_CLK = 1;
return(dat);
}
#endif
galle
2012-05-10
打赏
举报
回复
1
读时间不要太频繁!
Dreamer_LX灵
2012-05-10
打赏
举报
回复
现在正常了,晶振频率不对,用示波器看了下,不是32.768KHZ,居然是3.3768KHZ,换了个晶振就好了。还有确实是,如果读时间太频繁,显示好像更不上来显示。。。
Dreamer_LX灵
2012-05-10
打赏
举报
回复
[Quote=引用 4 楼 的回复:]
读时间不要太频繁!
[/Quote]
我把读时间改长后读,还是一样,比实际时间慢很多。。。
Mars
2012-05-10
打赏
举报
回复
如果晶振没有问题,很有可能是对时钟芯片操作不当引起的,如楼上:读时间太频繁!
Dreamer_LX灵
2012-05-09
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
接晶振了吗?要不就是LED点阵刷新费时太多,但如果相差越来越大说明程序有问题!
[/Quote]
应该跟LED点阵刷新没关系的,他们之间没有必然关系,我只是隔段时间把时间读出来显示而已。我还是先用示波器看一下晶振。。。
御猫
2012-05-09
打赏
举报
回复
接晶振了吗?要不就是LED点阵刷新费时太多,但如果相差越来越大说明程序有问题!
DS1302
时钟
芯片
电子
时钟
显示C程序
/******************************************************************************* * 标题: 试验数码管显示
时钟
* * * * 通过本例程了解
DS1302
时钟
芯片
的基本原理和使用 ,理解并掌握
DS1302
时钟
芯片
* * 驱动程序的编写以及实现数字字符在数码管中的显示。 * * ********************************************************************************/ #include
//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include
sbit SCK=P3^6; //
时钟
sbit SDA=P3^4; //数据 sbit RST = P3^5;//
DS1302
复位 sbit LS138A=P2^2; sbit LS138B=P2^3; sbit LS138C=P2^4; bit ReadRTC_Flag;//定义读
DS1302
标志 unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00 unsigned char l_tmpdisplay[8]; code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9 '-' '熄灭‘表 /******************************************************************/ /* 函数声明 */ /******************************************************************/ void Write_
Ds1302
_byte(unsigned char temp); void Write_
Ds1302
( unsigned char address,unsigned char dat ); unsigned char Read_
Ds1302
( unsigned char address ); void Read_RTC(void);//read RTC void Set_RTC(void); //set RTC void InitTIMER0(void);//inital timer0 /******************************************************************/ /* 主函数 */ /******************************************************************/ void main(void) { InitTIMER0(); //初始化定时器0 Set_RTC(); //写入
时钟
值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽 while(1) { if(ReadRTC_Flag) { ReadRTC_Flag=0; Read_RTC(); l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的显示,将数据分开 l_tmpdisplay[1]=l_tmpdate[2]&0x0f; l_tmpdisplay[2]=10; //加入"-" l_tmpdisplay[3]=l_tmpdate[1]/16; l_tmpdisplay[4]=l_tmpdate[1]&0x0f; l_tmpdisplay[5]=10; l_tmpdisplay[6]=l_tmpdate[0]/16; l_tmpdisplay[7]=l_tmpdate[0]&0x0f; } } } /******************************************************************/ /* 定时器0初始化 */ /******************************************************************/ void InitTIMER0(void) { TMOD|=0x01;//定时器设置 16位 TH0=0xef;//初始化值 TL0=0xf0; ET0=1; TR0=1; EA=1; } /******************************************************************/ /* 写一个字节 */ /******************************************************************/ void Write_
Ds1302
_Byte(unsigned char temp) { unsigned char i; for (i=0;i<8;i++) //循环8次 写入数据 { SCK=0; SDA=temp&0x01; //每次传输低字节 temp>>=1; //右移一位 SCK=1; } } /******************************************************************/ /* 写入
DS1302
*/ /******************************************************************/ void Write_
Ds1302
( unsigned char address,unsigned char dat ) { RST=0; _nop_(); SCK=0; _nop_(); RST=1; _nop_(); //启动 Write_
Ds1302
_Byte(address); //发送地址 Write_
Ds1302
_Byte(dat); //发送数据 RST=0; //恢复 } /******************************************************************/ /*
读出
DS1302
数据 */ /******************************************************************/ unsigned char Read_
Ds1302
( unsigned char address ) { unsigned char i,temp=0x00; RST=0; _nop_(); _nop_(); SCK=0; _nop_(); _nop_(); RST=1; _nop_(); _nop_(); Write_
Ds1302
_Byte(address); for (i=0;i<8;i++) //循环8次 读取数据 { if(SDA) temp|=0x80; //每次传输低字节 SCK=0; temp>>=1; //右移一位 _nop_(); _nop_(); _nop_(); SCK=1; } RST=0; _nop_(); //以下为
DS1302
复位的稳定
时间
_nop_(); RST=0; SCK=0; _nop_(); _nop_(); _nop_(); _nop_(); SCK=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); return (temp); //返回 } /******************************************************************/ /* 读
时钟
数据 */ /******************************************************************/ void Read_RTC(void) //读取 日历 { unsigned char i,*p; p=read_rtc_address; //地址传递 for(i=0;i<7;i++) //分7次读取 秒分时日月周年 { l_tmpdate[i]=Read_
Ds1302
(*p); p++; } } /******************************************************************/ /* 设定
时钟
数据 */ /******************************************************************/ void Set_RTC(void) //设定 日历 { unsigned char i,*p,tmp; for(i=0;i<7;i++){ //BCD处理 tmp=l_tmpdate[i]/10; l_tmpdate[i]=l_tmpdate[i]; l_tmpdate[i]=l_tmpdate[i]+tmp*16; } Write_
Ds1302
(0x8E,0X00); p=write_rtc_address; //传地址 for(i=0;i<7;i++) //7次写入 秒分时日月周年 { Write_
Ds1302
(*p,l_tmpdate[i]); p++; } Write_
Ds1302
(0x8E,0x80); } /******************************************************************/ /* 定时器中断函数 */ /******************************************************************/ void tim(void) interrupt 1 using 1 //中断,用于数码管扫描 { static unsigned char i,num; TH0=0xf5; TL0=0xe0; P0=table[l_tmpdisplay[i]]; //查表法得到要显示数字的数码段 switch(i) { case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; break; case 4:LS138A=0; LS138B=0; LS138C=1; break; case 5:LS138A=1; LS138B=0; LS138C=1; break; case 6:LS138A=0; LS138B=1; LS138C=1; break; case 7:LS138A=1; LS138B=1; LS138C=1; break; } i++; if(i==8) { i=0; num++; if(10==num) //隔段
时间
读取1302的数据。
时间
间隔可以调整 { ReadRTC_Flag=1; //使用标志位判断 num=0; } } }
DS1302
时钟
芯片
程序
DS1302
时钟
程序,包括写入,
读出
等等等等
实时
时钟
DS1302
-第1季第14部分
本课程是《朱有鹏老师单片机完全学习系列课程》第1季第14个课程,主要讲解了
实时
时钟
DS1302
芯片
的编程和使用,本课程的关键是引入了时序的概念,带领大家理解SPI的时序,会看时序图,会根据时序图进行编程、调试。
AT89C51设计LCD1602显示
DS1302
实时
日历
时钟
毕业论文文档+软件源码.rar
AT89C51设计LCD1602显示
DS1302
实时
日历
时钟
毕业论文文档+软件源码,单片机LCD毕业设计,有代码、仿真电路、设计报告,仿真使用的是proteus仿真,可直接加载HEX文件运行. 摘要 此次课程设计的要求是通过LCD与单片机的连接模块能够显示数字(如
时间
)、字符(如英文)和图形等,这就需要专门的
时钟
芯片
-----
DS1302
。
DS1302
是一种高性能、低功耗、带RAM的
实时
时钟
芯片
,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现MCS-51单片机对其进行读写操作,把
读出
的
时间
数据送到LCD1602上显示。程序运行时,必须先对LM044L进行初始设置,然后,通过单片机从
DS1302
中获取
时间
并通过LCD1602显示。同时,进行循环赋值,使LCD动态显示当前的
时间
。 关键字:AT89C51、
DS1302
,LCD1602显示器 一.设计任务和要求 1. 利用
DS1302
实现年月日时分秒,并用LCD显示。 2. 通过LCD模块与单片机的接口,能显示数字(如
时间
)、字符(如英文)。 3. 硬件设计部分,根据设计的任务选定合适的单片机,根据控制对象设计接口电路。设计的单元电路必须有工作原理,器件的作用,分析和计算过程; 4. 软件设计部分,根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单; 5.原理图设计部分,根据所确定的设计电路,利用Proteus工具软件绘制电路原理图。 6计算说明书部分包括方案论证报告打印版或手写版,程序流程图具体程序等 7. 图纸部分包括具体电路原理图打印版 8. 设计要求还包括利用一天
时间
进行资料查阅与学习讨论,利用5天
时间
在实验室进行分散设计,最后三天编写报告。最后一天进行成果验收。 二.方案论证 实现数字电子钟的设计有以下两种基本方案,现就两种基本方案的优劣进行具体论证,从而说明选择方案二的理由。 方案一:直接用单片机的内部定时器来实现
时间
。该方案以AT89C51单片机为主控
芯片
,以内部定时器产生的1s中断作为
时钟
的驱动,然后再通LCD液晶显示器来组成数字钟电路。但是此方案最大的缺点在于单片机89C51产生的1s中断存在误差,如果工作
时间
长的话,数字
时钟
显示的
时间
将会出现严重的偏差,不够精确。 方案二:使用串行接口
时钟
芯片
DS1302
设计
时钟
电路。该设计方案以AT89C51单片机为主控
芯片
,以串行
时钟
芯片
DS1302
为核心计时
芯片
,然后再通过一个LCD液晶显示器组成数字
时钟
电路。更重要的是,
DS1302
时钟
芯片
的加入大大提高了数字钟
时间
的准确性,而且该电路在断电后不丢失
时间
和数据信息时也使得该方案的研究与提升更具有开发的意义。 三.核心
芯片
功能介绍 1.AT89C51 AT89S51[3]美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4K BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及AT89C51引脚结构,
芯片
内集成了通用8位中央处理器和ISP Flash存储单元。单片机AT89S51强大的功能可为许多嵌入式控制应用系统提供高性价比的解决方案。 AT89C51
芯片
的引脚结构如图1所示: 1.1 功能特性概括: AT89S51提供以下标准功能:40个引脚、4K Bytes Flash片内程序存储器、128 Bytes的随机存取数据存储器(RAM)、32个外部双向输入/输出(I/O)口、5个中断优先级2层中断嵌套中断、2个数据指针、2个16位可编程定时/计数器、2个全双工串行通信口、看门狗(WDT)电路、片内振荡器及
时钟
电路。此外,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲模式下, 图1 AT89C51引脚图 CPU暂停工作,而RAM、定时/计数器、串行通信口、外中断系统可继续工作。掉电模式冻结振荡器而保存RAM的数据,停止
芯片
其它功能直至外中断激活或硬件复位。同时该
芯片
还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。
基于
DS1302
电子
时钟
的设计(1).doc
基于
DS1302
电子
时钟
的设计 【摘 要】针对电子
时钟
芯片
DS1302
的工作原理,本文对基于
DS1302
的电子
时钟
系统进行了硬 件和软件的设计。仿真结果表明,该设计的电子
时钟
电路简单,能完整地显示日期、星 期和
时间
,实用性较强。 【关键词】
DS1302
;AT89C51;
时钟
系统 The Design of Electronic Clock Based on
DS1302
FENG Da-jie (Automation Department, Hainan Normal University, Haikou Hainan, 571158) 【Abstract】According to the working principle of electronic clock chip
DS1302
, this paper has designed electronic clock system both in hardware and software. The result of simulation demonstrates that electronic clock system designed is of simple structure and can display date, week and time, and therefore the system is more practical. 【Key words】
DS1302
; AT89C51; Clock system 在很多单片机系统中都要求带有
实时
时钟
电路,如数据记录仪表、数字钟。本论文介 绍了利用
时钟
芯片
DS1302
来制作电子
时钟
。利用
时钟
芯片
DS1302
制作的电子
时钟
最大的 优点是精度高,能完整的提供秒、分、时、日、星期、月、年的信息,并且每个月的天 数和闰年的天数可自动调整。 1 电子
时钟
系统硬件电路设计
DS1302
电子
时钟
电路如图1所示,该系统主要由AT89C51单片机、
时钟
芯片
DS1302
及液 晶显示器1602 三大部分组成。在此系统中,
DS1302
是美国DALLAS公司推出的一种高性能,低功耗的实 时
时钟
芯片
。系统的工作原理是单片机通过读取
DS1302
寄存器的数据,然后将数据显示 在1602液晶显示器上。
DS1302
时钟
芯片
简介
DS1302
是DALLAS公司堆出的涓流充电
时钟
芯片
,可以通过串行接口与单片机进行通信 。
DS1302
与单片机之间的通信,仅需三根I/O线:复位(RET)、I/O数据线、串行
时钟
( SCLK),
DS1302
外部引脚如图2所示。 2 电子
时钟
系统软件设计 在软件设计方面,采用C 语言编写
DS1302
初始化、读写时序, LCD1602初始化及LCD1602显示子程序,软件流程图如图3所示。 2.1
DS1302
读写时序 在
DS1302
时钟
芯片
与单片机的通信过程中,一个
时钟
周期是一个上升沿序列,紧跟着 一个下降沿。对于数据的输入,在
时钟
周期的上升沿期间,数据必须正确;在
时钟
周期 的下降沿,数据位输出。如果RST的输入低电平,所有数据传输中止,I/O引脚变成高阻 状态,
DS1302
读写时序如图4所示。 采用英国Labcenter electronics 开发的Proteus 软件对该电子
时钟
系统进行仿真,仿真效果如图5所示,从
DS1302
中
读出
的数据通过LCD 1602显示出来,显示器的第一行显示日期和星期,第二行显示
时间
。仿真结果表明,该 电子
时钟
系统具有电路结构简单,能显示出日期、星期和
时间
。 【参考文献】 [1]刘坤,宋弋,赵红波,等.51 单片机C 语言应用开发技术大全[M].北京:人民邮电出版社,2008. [2]王明顺,吴省.可涓流充电的串行
实时
时钟
芯片
DS1302
及其应用设计[J]. 电子技术应用,1996,10. [3]何立民. 单片机应用系统设计[M]. 北京:北京航空航天大学出版社,1990:133-189. ----------------------- 基于
DS1302
电子
时钟
的设计(1)全文共2页,当前为第1页。 基于
DS1302
电子
时钟
的设计(1)全文共2页,当前为第2页。
单片机/工控
27,373
社区成员
28,771
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章