橘子阿小 发表于 2021-12-13 15:48

大神们,有没有PIC18单片机读写ds1302d的程序

本帖最后由 pzsh 于 2021-12-14 14:34 编辑

大神们,有没有PIC18单片机读写ds1302d的程序
我在网上找的的读写程序读不到初始化时间
谢谢

橘子阿小 发表于 2021-12-13 17:00

uchar shijian;
uchards[]={50,59,23,10,10,1,16};
//向DS1302写数据
void Write_Ds1302_Byte(unsignedchar 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=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);
                add=add+2;
        }
        Write_Ds1302(0x8e,0x80);
}
main()
{
while(1){
Read_Time();
    fen.DAT=shijian;
    shi.DAT=shijian;
      
    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

橘子阿小 发表于 2021-12-14 15:25
问题已解决

请分享解决之道

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

说明时序有问题。
页: [1] 2
查看完整版本: 大神们,有没有PIC18单片机读写ds1302d的程序