单片机 ds1302 隔2秒显示一次时间

我把从1302取到的秒的BCD码直接送到单片机P0口,在proteus上模拟为什么只显示偶数
?时间是对的。。。。奇数不显示,求大佬帮忙看一下。。。
#include <reg51.h>
#include <intrins.h>
sbit IO = P1^0;
sbit RST = P1^2;
sbit SCLK = P1^1;
sbit C1 = P2^0;
sbit C2 = P2^1;
sbit C3 = P2^2;
unsigned code write_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
unsigned code read_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
unsigned time[7]={0x12,0x12,0x12,0x01,0x01,0x20,0x00};
void write(unsigned char addr,unsigned char dat)
{
unsigned char i, j;
RST = 0 ;
_nop_();
SCLK = 0 ;
_nop_();
RST = 1 ;
_nop_();
_nop_();
for (i=0;i<8;i++)
{
IO = addr&0x01;
addr>>=1;
SCLK = 1 ;
_nop_();
_nop_();
SCLK=0;
_nop_();
}
for(j=0;j<8;j++)
{

IO=dat&0x01;
dat>>=1;
SCLK = 1 ;
_nop_();
SCLK = 0 ;
_nop_();
}
RST = 0 ;
_nop_();
}
unsigned char read (unsigned char addr)
{
unsigned char i,dat = 0 ;

RST = 0 ;
_nop_();
SCLK = 0 ;
_nop_();
RST = 1 ;
_nop_();
_nop_();
for(i=0;i<8;i++)
{
IO = addr&0x01;
addr>>=1;
SCLK = 1 ;
_nop_();
SCLK = 0 ;
_nop_();
}
_nop_();
for (i=0;i<7;i++)
{
SCLK = 1 ;
_nop_();
SCLK = 0 ;
_nop_();
dat>>=1;
if(IO==1)
dat=dat|0x80;
}
RST = 0 ;
_nop_();
SCLK = 1 ;
_nop_();
IO = 0 ;
_nop_();
IO = 1 ;
_nop_();
return dat;
}
void ds1302_init()
{
unsigned char k;
write(0x8e,0x00);
for (k=0;k<7;k++)
{
write(write_addr[k],time[k]);
}
write(0x8e,0x80);
}
void read_time()
{
unsigned char n ;
for (n=0;n<7;n++)
{
time[n]=read(read_addr[n]);
}
}
void main(void)
{
ds1302_init();
while(1)
{
read_time();
P0=time[0];

}
}

Proteus仿真时,如果研究一下从DS1302中读到的数据,以秒为例,就会发现,随着时间的推移,秒的最低位是不变的,变的是第2位。也就是说,第2位变化了1,秒的整体就会变化2。所以,这时要把读到的数据右移1位,屏蔽到最低位,然后再把低4位作为秒显示的个位,高3位作为秒显示的十位,显示就正常了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-11-18
印象中ds1302没有这种功能的使用方法,你可以用定时器定一段时间读一次。
别一款时钟芯片
ds12887
却是有这种功能的,它有一个中断管脚,可以配置成每秒输出一个中断,甚至每天中断输出,刚好符合你想要的功能。
第2个回答  2017-11-14
我之前在实物调试的时候出现过这种问题的.后来是加了上拉电阻解决的.
懂事电子设计 Vgz本回答被网友采纳
第3个回答  2017-11-13
七言律诗遣悲怀三首·其一(元稹)
第4个回答  2017-11-13
江乡故人偶集客舍(戴叔伦)

...与DS1302显示的时间不一致,且秒针每2秒变化一次,且秒的十位会大于...
DS1302的数据显示存在16进制转换的问题,这个要特别注意。 另外不要随便抄所以每次都要上电后复位一次。如果你不是的话,估计就是读值没读出来。

ds1302 用led显示 秒一直显示的是85,分会跳动,但每隔一分钟显示一次85...
...你说总时间是对的,那秒也就是对的,可能是你读时间的频率不对,...每隔一秒读一次DS1302,实际效果很好,每秒都会初刷新 ...

单片机与数码管显示DS1302的时分秒,出现闪烁
那要看你是如何刷新数码管的了,刷得太慢会闪烁的。一般来说,无论你有多少个数码管,总的扫描时间不要超过30ms左右。那么如果有8个管,则每个管扫描时间为30\/8=3.75ms左右;若有5个管,则每个管扫描时间不要超过6ms左右,明白了嘛?

单片机,ds1302时钟电路显示问题,时间一直跳变(在开发板上实验的正常...
将显示程序的每一位之后的延时时间缩短,试试应该可以解决。

DS1302做的单片机万年历时钟秒有时会2秒跳是什么原因
是在修改时间的时候吗?加一次加了两秒,减一次减了两秒? 如果不是,那可能是延时长了

ds1302单片机实现数字钟秒表\/时钟转换功能
ds1302单片机实现数字钟秒表\/时钟转换功能 数字钟——要求用6位数码管,显示时,分,秒,以24小时计时方式,使用按键开关\/现时分调整,秒表\/时钟转换功能,最好用DS1302芯片。要有原理图... 数字钟——要求用6位数码管,显示时, 分, 秒,以24小时计时方式,使用按键开关\/现时分调整,秒表\/时钟转换功能,最好用DS1302...

实现实时时钟在数码管上显示时间
实现实时时钟在数码管上显示时间的实验涉及到DS1302实时时钟模块的应用,DS1302是一种串行接口的实时时钟芯片,其内部具备日历时钟功能。芯片通过简单的串行接口与微处理器通信,提供秒数、分钟、小时、星期、日期、月份和年份信息。该芯片设计为低功耗运行,数据和时钟信息在1μs内保留。DS1302芯片使用同步...

每1秒钟获取一次ds1302 的时间 但要求准确 避免在单片机主循环里每次...
印象中DS1302没有这种功能的使用方法,你可以用定时器定一段时间读一次。别一款时钟芯片 DS12887 却是有这种功能的,它有一个中断管脚,可以配置成每秒输出一个中断,甚至每天中断输出,刚好符合你想要的功能。

时钟芯片DS1302实时显示时间的软硬件
LCD也可以更换为LED,例如LCM101,它是一款由北京卫信杰科技发展有限公司生产的10位多功能8段液晶显示模块,内置看门狗、时钟发生器和蜂鸣器驱动电路,具有低功耗特性,工作电压在2.4V~3.3V之间,显示效果清晰。实现DS1302实时时间功能的流程如4所示,微处理器通过发送命令字节控制DS1302,其中D7为写保护位...

ds1302时钟芯片工作原理
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5....

相似回答