关于学习总线型外部资源(如1302时钟芯片)的问题,请大神们帮帮我!!!

2019-03-24 17:46发布

本人没有什么C语言的基础,凭着爱好自学的单片机,根据1302的时序图和自己的理解下了下面的程序,麻烦大神们帮我看看哪里有问题,我的问题出在哪里。学了快一周了,都还没有一点长进

/*****头文件*****/
#include <reg52.h>
/*****宏定义*****/
#define u8 unsigned char
#define u16 unsigned int
/*****延时函数*****/
void delay(u16 num)
{
u16 x,y;
for(x=num;x>0;x--)
  for(y=110;y>0;y--);
}
/*****定义变量端口号*****/
sbit sclk=P3^6;
sbit io=P3^4;
sbit ce=P3^5;
/*****读1302函数*****/
u8 read_1302()
{
u8 dat,dat1,wr;
sclk=0;
ce=1;
for(n=0;n<8;n++)
{
  wr=io;
  wr=wr&0x01;
  delay(5);
  sclk=1;
  delay(5);
  sclk=0;
  delay(5);
  wr>>=1;
  delay(5);
}
delay(15);
for(n=0;n<8;n++)
{
  io=dat1;
  dat1=dat1|0x00;
  delay(5);
  sclk=1;
  delay(5);
  sclk=0;
  delay(5);
  dat1<<=1;
  delay(5);
}
return dat;
}
/*****主函数*****/
void main()
{
P1=read_1302(0x81);
while(1)
{
  ;
}
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
流氓小哥
1楼-- · 2019-03-25 14:44
long521 发表于 2016-1-20 10:13
你的程序就是读出DS1302的秒的数据,然后,P1口把那字节显示一下,问题是你没有用8段码数组或者汇 ...

我是这么想的
根据时序图上面写的,要读取或写入必须先发送一个最高位为1的字节,单字节读是要让SCLK置低电平,然后CE置高电平,在SCLK的上升沿的时候写入数据,然后将IO上的数据按位与上0x01,用FOR语句一位一位的发送给芯片,此时芯片已经可以进行读写的操作了。开始读取数据。读的时候是在SCLK的下降沿读出的,这时按位或上0x00,用FOR语句一位一位的读回来,设定一个变量dat,存储读回来的位,让他转为以字节形式赋给P1口。

我这么说,不知道您能不能明白。因为我真的是0基础的,也许您听着可能会很费劲。
elvike
2楼-- · 2019-03-25 17:17
 精彩回答 2  元偷偷看……
流氓小哥
3楼-- · 2019-03-25 19:28
elvike 发表于 2016-1-20 10:40
楼主,你的程序编译是否有错误?

把程序改成下面这样,现在编译没有错误了。
u8 read_1302()
{
        u8 dat1,wr;
        sclk=0;
        ce=1;
        for(n=0;n<8;n++)
        {
                wr=io;
                wr=wr&0x01;
                delay(5);
                sclk=1;
                delay(5);
                sclk=0;
                delay(5);
                wr>>=1;
                delay(5);
        }
        delay(15);
        for(n=0;n<8;n++)
        {
                io=dat1;
                dat1=dat1|0x00;
                delay(5);
                sclk=1;
                delay(5);
                sclk=0;
                delay(5);
                dat1<<=1;
                delay(5);
        }
        return dat1;
}

/*****主函数*****/
void main()
{
        P1=read_1302();
        while(1)
        {
                ;
        }
}
elvike
4楼-- · 2019-03-25 21:37
流氓小哥 发表于 2016-1-20 10:47
把程序改成下面这样,现在编译没有错误了。
u8 read_1302()
{
        u8 dat1,wr;
        sclk=0;
        ce=1;
        for( ...

用单步调试,用万用表或者示波器确认每个语句都执行对了没,
流氓小哥
5楼-- · 2019-03-26 01:43
 精彩回答 2  元偷偷看……
辛昕
6楼-- · 2019-03-26 05:53
elvike 发表于 2016-1-20 10:30
楼上是搞推销的吗?

没这玩意调时序,就是扯淡。
纯粹碰运气,遇到好的例程就万事大吉,否则就压根没遮

一周热门 更多>