[PIC®/AVR®/dsPIC®产品] 大神们,有没有PIC18单片机读写ds1302d的程序

[复制链接]
 楼主| 橘子阿小 发表于 2021-12-13 15:48 | 显示全部楼层 |阅读模式
本帖最后由 pzsh 于 2021-12-14 14:34 编辑

大神们,有没有PIC18单片机读写ds1302d的程序
我在网上找的的读写程序读不到初始化时间
谢谢
 楼主| 橘子阿小 发表于 2021-12-13 17:00 | 显示全部楼层
uchar shijian[7];
uchar  ds[]={50,59,23,10,10,1,16};
//向DS1302写数据
void Write_Ds1302_Byte(unsigned  char temp)
{
        unsigned char i;
        for (i=0;i<8;i++)            
        {
                SCK=0;
                SDA=temp&0x01;
                temp>>=1;
                SCK=1;
        }
}  

//读取DS1302指定地址中的数据
unsigned char Read_Ds1302 ( unsigned char address )
{
        unsigned char i,temp=0x00;
        uchar dat_low,dat_high;
        RST=0;
        NOP();
        SCK=0;
        NOP();
        RST=1;
        NOP();
        Write_Ds1302_Byte(address);
        for (i=0;i<8;i++)        
        {               
                SCK=0;
                temp>>=1;       
                if(SDA)
                temp|=0x80;       
                SCK=1;
        }
        RST=0;
        NOP();
        RST=0;
        SCK=0;
        NOP();
        SCK=1;
        NOP();
        SDA=0;
        NOP();
        SDA=1;
        NOP();
        dat_high=temp/16;
        dat_low=temp%16;
        temp=dat_high*10+dat_low;       
        return (temp);                       
}
//向DS1302写地址和数据
void Write_Ds1302( unsigned char address,unsigned char dat )     
{
        uchar num;
        RST=0;
        NOP();
        SCK=0;
        NOP();
        RST=1;       
           NOP();
        Write_Ds1302_Byte(address);       
        num=(dat/10<<4)|(dat%10);
        Write_Ds1302_Byte(num);               
        RST=0;
}
//将数据存储到指定数组中
void Read_Time()
{
        uchar i;
        uchar add=0x81;
        Write_Ds1302(0x8e,0x00);
        for(i=0;i<7;i++)
        {
                shijian[i]=Read_Ds1302(add);
                add=add+2;
        }
       
        Write_Ds1302(0x8e,0x80);
}
void DSInit()
{
        uchar i;
        uchar add=0x80;
        Write_Ds1302(0x8e,0x00);
        for(i=0;i<7;i++)
        {
                Write_Ds1302(add,ds[i]);
                add=add+2;
        }
        Write_Ds1302(0x8e,0x80);
}
main()
{
while(1){
Read_Time();
    fen.DAT=shijian[0];
    shi.DAT=shijian[1];
        
    DisplayMainPage(1);//LCD液晶屏显示
    CLRWDT();}
以上代码是DS1302读写程序
但是我在主函数读取不到数据,main函数我是简写,不用太关注main函数
hu9jj 发表于 2021-12-13 18:28 | 显示全部楼层
您可以用逻辑分析仪或者示波器观察一下I2C的时序,要将时序调整到允许的范围才行。
 楼主| 橘子阿小 发表于 2021-12-14 08:36 | 显示全部楼层
hu9jj 发表于 2021-12-13 18:28
您可以用逻辑分析仪或者示波器观察一下I2C的时序,要将时序调整到允许的范围才行。 ...

这两样都没有
我想问一下,用把IO口在设置成输入或输出口
pzsh 发表于 2021-12-14 14:33 | 显示全部楼层
网友发布过的:  https://bbs.21ic.com/icview-2827856-1-1.html  我也没有验证过还
hu9jj 发表于 2021-12-14 14:35 | 显示全部楼层
橘子阿小 发表于 2021-12-14 08:36
这两样都没有
我想问一下,用把IO口在设置成输入或输出口

数据端口肯定是要按照需要动态地设置成输入(读操作)或输出(写操作)。
尽管DS1302的I2C操作对时序要求不高,但也不能相差太大,否则就无法正确传输数据,除非您使用硬件I2C操作。所以在业余条件下,至少需要配置一个逻辑分析仪,网上有30元左右的逻辑分析仪,类似优盘大小,抓取数据在电脑上显示,建议配置一个。
 楼主| 橘子阿小 发表于 2021-12-14 15:25 | 显示全部楼层
问题已解决
lcczg 发表于 2021-12-15 11:04 | 显示全部楼层

请分享解决之道
nawu 发表于 2022-1-7 19:37 | 显示全部楼层
这个需要什么方式进行读取呢
drer 发表于 2022-1-7 19:39 | 显示全部楼层
应该按照手册的时序要求来吧
gwsan 发表于 2022-1-7 19:40 | 显示全部楼层
请问楼主如何解决的问题啊
kxsi 发表于 2022-1-7 19:41 | 显示全部楼层
这是什么通讯方式啊
qcliu 发表于 2022-1-7 19:43 | 显示全部楼层
楼主分享一下吧
bestwell 发表于 2022-3-4 20:12 | 显示全部楼层
单线通信而已
hilahope 发表于 2022-3-4 20:34 | 显示全部楼层
DS1302初始化和读取的程序?
cemaj 发表于 2022-3-4 20:49 | 显示全部楼层
有PIC单片机都是通用的吧。   
wilhelmina2 发表于 2022-3-6 13:54 | 显示全部楼层
把延时整一整就行了。   
xiaoyaodz 发表于 2022-3-6 14:55 | 显示全部楼层
https://wenku.baidu.com/view/5e8565116c175f0e7cd1370c.html
uiint 发表于 2022-3-6 17:20 | 显示全部楼层
使用的是多大的晶振呢   
averyleigh 发表于 2022-3-6 17:57 | 显示全部楼层
说明时序有问题。  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

152

帖子

1

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

65

主题

152

帖子

1

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