打印

时钟芯片DS1302不动

[复制链接]
5363|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cao2014|  楼主 | 2014-5-3 12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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;

初始化不对...

使用特权

评论回复
5
wangch_sh| | 2014-5-3 14:58 | 只看该作者
晶振起振了没有,示波器测下。

使用特权

评论回复
6
ZG11211| | 2014-5-3 18:48 | 只看该作者
本帖最后由 ZG11211 于 2014-5-3 18:51 编辑

初始化没有这么简单,需要写入秒分时日月星期年,再写入一个初始化标志,然后每次开机先检测初始化标志,如果没有了就证明1302断过电(后备电池),需要重新初始化,如果标志位正确,证明1302没断过电,可以正常读取时钟讯息。建议楼主去找个例程研究一下。

使用特权

评论回复
7
天风立马| | 2014-5-3 18:56 | 只看该作者
你确定你的读写函数正确?

使用特权

评论回复
8
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); //打开写保护
}
这是我修改的初始化,但时钟仍然不动,求帮助

使用特权

评论回复
9
ningling_21| | 2014-5-3 20:03 | 只看该作者
cao2014 发表于 2014-5-3 19:10
void ds1302_init()
{
  RST=0;

硬件有没问题?

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

使用特权

评论回复
10
cao2014|  楼主 | 2014-5-3 20:49 | 只看该作者
ningling_21 发表于 2014-5-3 20:03
硬件有没问题?

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

秒寄存器的最高位写1,什么意思?我初始化后Proteus仿真正常,但硬件只显示初始化时间不动

使用特权

评论回复
11
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);
}
这是我的读写函数,请帮忙看看有什么问题?谢谢

使用特权

评论回复
12
天风立马| | 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你看看有没有用.

使用特权

评论回复
13
通宵敲代码| | 2014-5-3 23:52 | 只看该作者
仿真坑死人啊!

时序!时序!时序!

使用特权

评论回复
14
cao2014|  楼主 | 2014-5-4 11:27 | 只看该作者
通宵敲代码 发表于 2014-5-3 23:52
仿真坑死人啊!

时序!时序!时序!

时序?怎么修改?

使用特权

评论回复
15
通宵敲代码| | 2014-5-4 12:46 | 只看该作者
cao2014 发表于 2014-5-4 11:27
时序?怎么修改?

看手册,按手册上来!

仿真能通过说明逻辑没问题,那只能是操作问题!

使用特权

评论回复
16
ayb_ice| | 2014-5-4 17:26 | 只看该作者
整个循环里ACC使用时间过长,死悄悄的

使用特权

评论回复
17
谷子的芝麻| | 2014-5-4 20:17 | 只看该作者
去掉RST=0;SCLK=0;试试

使用特权

评论回复
18
abbccc308| | 2014-5-4 21:10 | 只看该作者
ningling_21 发表于 2014-5-3 20:03
硬件有没问题?

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

秒最高位写1是停止吧,写0是运行:)

使用特权

评论回复
19
ningling_21| | 2014-5-4 21:58 | 只看该作者
abbccc308 发表于 2014-5-4 21:10
秒最高位写1是停止吧,写0是运行

不好意思,打错了...

使用特权

评论回复
20
cao2014|  楼主 | 2014-5-5 20:45 | 只看该作者
ayb_ice 发表于 2014-5-4 17:26
整个循环里ACC使用时间过长,死悄悄的

什么意思?求解释

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

17

帖子

0

粉丝