打印
[C语言]

前段时间刚买的DS1302时钟模块,请用过的大大帮看看

[复制链接]
1880|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一叶倾城wwq 于 2018-8-24 23:50 编辑

或者直接就没驱动好,就没读出,在LCD上一直显示小写字母oo,贴上驱动程序:
/*********************************************
FunctionName: Write1302
FunctionInfo: DS1302时钟写地址数据(选择时分秒的地址写数据)
Input:        addr dat
Output:       no
注:  控制字总是从最低位开始输出.在控制字指令输入后的下一个SCLK时钟的上升沿时,
    数据被写入DS1302,数据输入从最低位(0位)开始
**********************************************/
void Write1302(uchar addr,uchar dat)
{
  uchar i,temp;
  DS_CE = 0;   //CE引脚为低,数据传送中止
  DS_SCLK=0;   //清零时钟总线
  DS_CE = 1;   //CE引脚为高,逻辑控制有效

  for ( i=8; i>0; i-- ) //发送地址
  {
    DS_SCLK = 0;
    temp = addr;
    DS_DATA = (bit)(temp&0x01); //每次传输低字节
    addr >>= 1; //右移一位
    DS_SCLK = 1;
  }

  for ( i=8; i>0; i-- ) //发送数据
  {
    DS_SCLK = 0;
    temp = dat;
    DS_DATA = (bit)(temp&0x01);
    dat >>= 1;
    DS_SCLK = 1;
  }
  DS_CE = 0;
}


/*********************************************
FunctionName: Read1302
FunctionInfo: DS1302时钟读数据
Input:        addr
Output:      dat1
注:  控制字总是从最低位开始输出.在控制字指令输入后的下一个SCLK时钟的上升沿时,
    数据被写入DS1302,数据输入从最低位(0位)开始
**********************************************/
uchar Read1302 (uchar addr)
{
  uchar i,temp,dat1,dat2;
  uchar temp1;  //后来加的代替demo里的ACC位寻址
  DS_CE = 0;
  DS_SCLK=0;
  DS_CE = 1;

  for ( i=8; i>0; i-- ) //发送地址
  {
    DS_SCLK = 0;
    temp = addr;
    DS_DATA = (bit)(temp&0x01); //每次传输低字节
    addr >>= 1; //右移一位
    DS_SCLK = 1;
  }

  for ( i=8; i>0; i-- ) //读取数据
  {
    temp1 =DS_DATA;
    DS_SCLK = 1;
    temp1>>=1;
    DS_SCLK = 0;
  }
  DS_CE = 0;
  dat1 = temp1;
  dat2 = dat1/16; //数据进制转换
  dat1 = dat1%16; //十六进制转十进制
  dat1 = dat1+dat2*10;
  return (dat1);
}

/*********************************************
FunctionName: Init1302
FunctionInfo: 初始化DS1302
Input:        no
Output:       no
注:
**********************************************/
void init1302(void)
{
  Write1302 (WRITE_PROTECT,0X00); //禁止写保护
  Write1302 (WRITE_SECOND, 0x56); //秒位初始化
  Write1302 (WRITE_MINUTE, 0x34); //分钟初始化
  Write1302 (WRITE_HOUR,   0x12); //小时初始化
  Write1302 (WRITE_PROTECT,0x80); //允许写保护
}

//测试函数
void read_1302_timer(void)
{
   uchar tab[2]={0,0};
   lcdWriteCom(0x01); //显示清屏   
   uchar second,minute,hour,day,moth,year;
   second = Read1302(READ_SECOND);
   tab[0] = second / 10;
   tab[1] = second % 10;
   lcd1602_whereDisplay(1,0,tab[0]);
   lcd1602_whereDisplay(1,1,tab[1]);
   CLRWDT();
   lcd1602_whereDisplay(1,2,"              ");
}

读出oo.png (86.28 KB )

读出oo.png

DS1302模块.png (96.47 KB )

DS1302模块.png
评论
一叶倾城wwq 2018-8-25 10:51 回复TA
@xyz549040622 :三只控制脚上都上拉了 
xyz549040622 2018-8-25 10:49 回复TA
这个模块I2C上应该是没有上拉电阻的吧,记住,一定要上拉。 

相关帖子

沙发
xyz549040622| | 2018-8-25 11:04 | 只看该作者
1.在LCD上一直显示小写字母oo,LCD的驱动是好的吗?这点是否经过测,因为即使读取失败,读出来的也应该是85这些数字,不应该是oo的。
2.看了看我以前1302的代码,初始化的时候给秒位写了个0的。
void Initial_DS1302(void)
{
        unsigned char Second=Read1302(DS1302_SECOND);
//        SYSTEMTIME DS1302_InitTime = {18,5,1,2,0,0,0};
        SYSTEMTIME DS1302_InitTime = {57,59,23,4,31,12,18};       
        if(Second&0x80)
        {       
                DS1302_SetProtect(0);
                Write1302(DS1302_SECOND,0);
        }
        DS1302_SetTime(&DS1302_InitTime);
}

着重看看那个if语句

使用特权

评论回复
板凳
一叶倾城wwq|  楼主 | 2018-8-25 11:19 | 只看该作者
xyz549040622 发表于 2018-8-25 11:04
1.在LCD上一直显示小写字母oo,LCD的驱动是好的吗?这点是否经过测,因为即使读取失败,读出来的也应该是85 ...

LCD驱动是好的,已经测试过了,可能是我的时间变量并未初始化过,然后我的时钟驱动不行,把未初始化变量里的垃圾信息读出来显示了,我是怀疑我的驱动程序有问题,但一时半会又看不出来,得好好调一下

使用特权

评论回复
地板
xyz549040622| | 2018-8-25 11:22 | 只看该作者
一叶倾城wwq 发表于 2018-8-25 11:19
LCD驱动是好的,已经测试过了,可能是我的时间变量并未初始化过,然后我的时钟驱动不行,把未初始化变量 ...

时序很简单,怕是数据处理出了问题,建议先用串口往出发,一步步追踪数据。

使用特权

评论回复
5
一叶倾城wwq|  楼主 | 2018-8-25 11:34 | 只看该作者
xyz549040622 发表于 2018-8-25 11:22
时序很简单,怕是数据处理出了问题,建议先用串口往出发,一步步追踪数据。 ...

很有可能,下班回去试试

使用特权

评论回复
6
一路向北lm| | 2018-8-25 12:52 | 只看该作者
读写函数没问题就OK  先测试下LCD1602  看下效果

使用特权

评论回复
7
ningling_21| | 2018-8-25 13:11 | 只看该作者
一叶倾城wwq 发表于 2018-8-25 11:19
LCD驱动是好的,已经测试过了,可能是我的时间变量并未初始化过,然后我的时钟驱动不行,把未初始化变量 ...

读取的second 是多少?

使用特权

评论回复
8
gx_huang| | 2018-8-25 13:38 | 只看该作者
你是什么MCU?
读取数据时,难道不需要把数据线置为输入,或者51芯片的准双向的置1?

使用特权

评论回复
评论
一叶倾城wwq 2018-8-25 13:43 回复TA
多谢您提醒了我,多半是这个原因,MCU:pic18f46k22 
9
一叶倾城wwq|  楼主 | 2018-8-25 13:40 | 只看该作者
gx_huang 发表于 2018-8-25 13:38
你是什么MCU?
读取数据时,难道不需要把数据线置为输入,或者51芯片的准双向的置1? ...

一语惊醒梦中人啊,忘了切换IO口配置了,哎呀

使用特权

评论回复
10
一叶倾城wwq|  楼主 | 2018-8-25 13:42 | 只看该作者
一路向北lm 发表于 2018-8-25 12:52
读写函数没问题就OK  先测试下LCD1602  看下效果

读出数据不对,我忘了切换IO口输入输出了

使用特权

评论回复
11
一叶倾城wwq|  楼主 | 2018-8-25 13:44 | 只看该作者
ningling_21 发表于 2018-8-25 13:11
读取的second 是多少?

就没读出来,忘了切换IO口配置了,第一次用这芯片自己做东西

使用特权

评论回复
12
一叶倾城wwq|  楼主 | 2018-8-25 13:46 | 只看该作者
等回去修改下再试试,多谢各位提醒,不然走死胡同里了

使用特权

评论回复
13
xyz549040622| | 2018-8-25 14:52 | 只看该作者
一叶倾城wwq 发表于 2018-8-25 13:44
就没读出来,忘了切换IO口配置了,第一次用这芯片自己做东西

晕,这么low的错误。

使用特权

评论回复
评论
一叶倾城wwq 2018-8-25 15:57 回复TA
@一叶倾城wwq :抱歉,是我没说清楚,哈哈 
一叶倾城wwq 2018-8-25 15:13 回复TA
思维还没转化过来,晚上修改下再试试,我也是挺不好意思的 
14
duhemayi| | 2018-8-27 08:15 | 只看该作者
这?不先找找自己原因!!

使用特权

评论回复
15
一叶倾城wwq|  楼主 | 2018-8-27 09:12 | 只看该作者
duhemayi 发表于 2018-8-27 08:15
这?不先找找自己原因!!

一下子思路还没转过来,现在读出数据了,只是数据处理还有点问题,但至少向前迈进了一点点

使用特权

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

本版积分规则

80

主题

1341

帖子

11

粉丝