打印
[PIC®/AVR®/dsPIC®产品]

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

[复制链接]
1958|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
橘子阿小|  楼主 | 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口在设置成输入或输出口

使用特权

评论回复
5
pzsh| | 2021-12-14 14:33 | 只看该作者
网友发布过的:  https://bbs.21ic.com/icview-2827856-1-1.html  我也没有验证过还

使用特权

评论回复
6
hu9jj| | 2021-12-14 14:35 | 只看该作者
橘子阿小 发表于 2021-12-14 08:36
这两样都没有
我想问一下,用把IO口在设置成输入或输出口

数据端口肯定是要按照需要动态地设置成输入(读操作)或输出(写操作)。
尽管DS1302的I2C操作对时序要求不高,但也不能相差太大,否则就无法正确传输数据,除非您使用硬件I2C操作。所以在业余条件下,至少需要配置一个逻辑分析仪,网上有30元左右的逻辑分析仪,类似优盘大小,抓取数据在电脑上显示,建议配置一个。

使用特权

评论回复
7
橘子阿小|  楼主 | 2021-12-14 15:25 | 只看该作者
问题已解决

使用特权

评论回复
8
lcczg| | 2021-12-15 11:04 | 只看该作者

请分享解决之道

使用特权

评论回复
9
nawu| | 2022-1-7 19:37 | 只看该作者
这个需要什么方式进行读取呢

使用特权

评论回复
10
drer| | 2022-1-7 19:39 | 只看该作者
应该按照手册的时序要求来吧

使用特权

评论回复
11
gwsan| | 2022-1-7 19:40 | 只看该作者
请问楼主如何解决的问题啊

使用特权

评论回复
12
kxsi| | 2022-1-7 19:41 | 只看该作者
这是什么通讯方式啊

使用特权

评论回复
13
qcliu| | 2022-1-7 19:43 | 只看该作者
楼主分享一下吧

使用特权

评论回复
14
bestwell| | 2022-3-4 20:12 | 只看该作者
单线通信而已

使用特权

评论回复
15
hilahope| | 2022-3-4 20:34 | 只看该作者
DS1302初始化和读取的程序?

使用特权

评论回复
16
cemaj| | 2022-3-4 20:49 | 只看该作者
有PIC单片机都是通用的吧。   

使用特权

评论回复
17
wilhelmina2| | 2022-3-6 13:54 | 只看该作者
把延时整一整就行了。   

使用特权

评论回复
18
xiaoyaodz| | 2022-3-6 14:55 | 只看该作者
https://wenku.baidu.com/view/5e8565116c175f0e7cd1370c.html

使用特权

评论回复
19
uiint| | 2022-3-6 17:20 | 只看该作者
使用的是多大的晶振呢   

使用特权

评论回复
20
averyleigh| | 2022-3-6 17:57 | 只看该作者
说明时序有问题。  

使用特权

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

本版积分规则

65

主题

152

帖子

1

粉丝