时钟芯片DS1302不动

[复制链接]
5977|19
 楼主| cao2014 发表于 2014-5-3 12:04 | 显示全部楼层 |阅读模式
proteus仿真中时钟正常运行,但在硬件中,1602显示2000-01-01     00:00:00静止不动是怎么回事?
ZG11211 发表于 2014-5-3 13:08 | 显示全部楼层
DS1302未初始化或者说未被正确初始化
 楼主| cao2014 发表于 2014-5-3 14:28 | 显示全部楼层
ZG11211 发表于 2014-5-3 13:08
DS1302未初始化或者说未被正确初始化

void ds1302_init()
{
  RST=0;
  SCLK=0;
  write_1302(0x8e,0x00); //允许写,禁止写保护
  write_1302(0x8e,0x80); //打开写保护
}
这是时钟DS1302初始化程序,在proteus仿真中时钟正常运行,时间和电脑同步
ningling_21 发表于 2014-5-3 14:54 | 显示全部楼层
cao2014 发表于 2014-5-3 14:28
void ds1302_init()
{
  RST=0;

初始化不对...
wangch_sh 发表于 2014-5-3 14:58 | 显示全部楼层
晶振起振了没有,示波器测下。
ZG11211 发表于 2014-5-3 18:48 | 显示全部楼层
本帖最后由 ZG11211 于 2014-5-3 18:51 编辑

初始化没有这么简单,需要写入秒分时日月星期年,再写入一个初始化标志,然后每次开机先检测初始化标志,如果没有了就证明1302断过电(后备电池),需要重新初始化,如果标志位正确,证明1302没断过电,可以正常读取时钟讯息。建议楼主去找个例程研究一下。
天风立马 发表于 2014-5-3 18:56 | 显示全部楼层
你确定你的读写函数正确?
 楼主| cao2014 发表于 2014-5-3 19:10 | 显示全部楼层
ZG11211 发表于 2014-5-3 18:48
初始化没有这么简单,需要写入秒分时日月星期年,再写入一个初始化标志,然后每次开机先检测初始化标志,如 ...

void ds1302_init()
{
  RST=0;
  SCLK=0;
  write_1302(0x8e,0x00); //允许写,禁止写保护
  write_1302(0x80,0x00); //向DS1302内写秒寄存器80H写入初始秒数据00
  write_1302(0x82,0x00);//向DS1302内写分寄存器82H写入初始分数据00
  write_1302(0x84,0x12);//向DS1302内写小时寄存器84H写入初始小时数据12
  write_1302(0x8a,0x04);//向DS1302内写周寄存器8aH写入初始周数据4
  write_1302(0x86,0x07);//向DS1302内写日期寄存器86H写入初始日期数据07
  write_1302(0x88,0x01);//向DS1302内写月份寄存器88H写入初始月份数据01
  write_1302(0x8c,0x10);//向DS1302内写年份寄存器8cH写入初始年份数据10
  write_1302(0x8e,0x80); //打开写保护
}
这是我修改的初始化,但时钟仍然不动,求帮助
ningling_21 发表于 2014-5-3 20:03 | 显示全部楼层
cao2014 发表于 2014-5-3 19:10
void ds1302_init()
{
  RST=0;

硬件有没问题?

秒寄存器的最高位写1后,时钟开始运行。
 楼主| cao2014 发表于 2014-5-3 20:49 | 显示全部楼层
ningling_21 发表于 2014-5-3 20:03
硬件有没问题?

秒寄存器的最高位写1后,时钟开始运行。

秒寄存器的最高位写1,什么意思?我初始化后Proteus仿真正常,但硬件只显示初始化时间不动
 楼主| cao2014 发表于 2014-5-3 21:05 | 显示全部楼层
天风立马 发表于 2014-5-3 18:56
你确定你的读写函数正确?

/******************向1302写一个字节*******************/
void write_byte(uchar dat)
{
        ACC=dat;
        RST=1;
        for(a=8;a>0;a--)
        {
                IO=ACC0;
                SCLK=0;
                SCLK=1;
                ACC=ACC>>1;
        }
}
/*****************读取1302一个字节*******************/
uchar read_byte()
{
        RST=1;
        for(a=8;a>0;a--)
        {
                ACC7=IO;
                SCLK=1;
                SCLK=0;
                ACC=ACC>>1;
        }
        return (ACC);
}
/******************向1302写入数据****************/
void write_1302(uchar add,uchar dat)
{
        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        write_byte(dat);
        SCLK=1;
        RST=0;
}
/***************读取1302数据*******************/
uchar read_1302(uchar add)
{
        uchar temp;
        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        temp=read_byte();
        SCLK=1;
        RST=0;
        return(temp);
}
这是我的读写函数,请帮忙看看有什么问题?谢谢
天风立马 发表于 2014-5-3 21:09 | 显示全部楼层
cao2014 发表于 2014-5-3 21:05
/******************向1302写一个字节*******************/
void write_byte(uchar dat)
{

应该没问题.http://see.xidian.edu.cn/cpp/html/1950.html你看看有没有用.
通宵敲代码 发表于 2014-5-3 23:52 | 显示全部楼层
仿真坑死人啊!

时序!时序!时序!
 楼主| cao2014 发表于 2014-5-4 11:27 | 显示全部楼层
通宵敲代码 发表于 2014-5-3 23:52
仿真坑死人啊!

时序!时序!时序!

时序?怎么修改?
通宵敲代码 发表于 2014-5-4 12:46 | 显示全部楼层
cao2014 发表于 2014-5-4 11:27
时序?怎么修改?

看手册,按手册上来!

仿真能通过说明逻辑没问题,那只能是操作问题!
ayb_ice 发表于 2014-5-4 17:26 | 显示全部楼层
整个循环里ACC使用时间过长,死悄悄的
谷子的芝麻 发表于 2014-5-4 20:17 | 显示全部楼层
去掉RST=0;SCLK=0;试试
abbccc308 发表于 2014-5-4 21:10 | 显示全部楼层
ningling_21 发表于 2014-5-3 20:03
硬件有没问题?

秒寄存器的最高位写1后,时钟开始运行。

秒最高位写1是停止吧,写0是运行:)
ningling_21 发表于 2014-5-4 21:58 | 显示全部楼层
abbccc308 发表于 2014-5-4 21:10
秒最高位写1是停止吧,写0是运行

不好意思,打错了...
 楼主| cao2014 发表于 2014-5-5 20:45 | 显示全部楼层
ayb_ice 发表于 2014-5-4 17:26
整个循环里ACC使用时间过长,死悄悄的

什么意思?求解释
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部