打印

DS1302 读出的数据全1 或者全0 求指点

[复制链接]
6035|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
岛岛|  楼主 | 2011-8-21 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用示波器能看到在读数的时候 秒是变化的(正好60s走一个周期)也就是说ds1302工作了并且正确 但是ds1302数据输入输出线在时钟(sck)的高电平一定是高电平 ;怀疑没配置好不知那里的问题
配置如下
#define sda_in  PORTEbits.RE1
#define sda_out LATEbits.LATE1
#define sck LATEbits.LATE2
#define rest LATAbits.LATA4
我看E口如果有同时读写 应该像上面的配置 但是看示波器波形在(时钟sck)写高电平的时候明显影响了sda的输入(也变成了高) 在sck低电平的时候,数据线的数据是正常变化的.
沙发
NE5532| | 2011-8-21 19:36 | 只看该作者
用的是硬口还是软件模拟的?

使用特权

评论回复
板凳
岛岛|  楼主 | 2011-8-21 20:36 | 只看该作者
软件模拟

使用特权

评论回复
地板
NE5532| | 2011-8-21 21:00 | 只看该作者
找个电阻来上拉以及下拉SDA端口,看读回来的是不是FF和00,注意读数据的时候端口有么有切换回输入状态。

使用特权

评论回复
5
岛岛|  楼主 | 2011-8-22 09:30 | 只看该作者
都加了不行

使用特权

评论回复
6
岛岛|  楼主 | 2011-8-22 10:03 | 只看该作者
#include <p18f4680.h>
#define sda_in  PORTEbits.RE1
#define sda_out LATEbits.LATE1
#define sck LATEbits.LATE2
#define rest LATAbits.LATA4
void uart_initial();



unsigned char readbyte()
{
unsigned char i,j,num;
j=0;
TRISEbits.TRISE1=1;
sda_in=1;
for(i=0;i<8;i++)
{
  
  num >>=1;
  if(sda_in==1)
   num|=0x80;
  else
   num&=0x7f;
  sck=1;
  Nop();
  Nop();
  sck=0;
  Nop();
  Nop();
}
TRISEbits.TRISE1=0;
return num;
}





void writebyte(unsigned char addr)
{
unsigned char i,j=0;
for(i=0;i<8;i++)
{
  if(addr & 0x01)
   sda_out=1;
  else
   sda_out=0;
  sck=1;
  Nop();
  Nop();
  sck=0;
  addr >>=1;
  Nop();
  Nop();
}
}



unsigned char read(unsigned char addr)
{
unsigned char num;
rest=1;
writebyte(addr);
num=readbyte();
rest=0;
return num;
}




void write(unsigned char addr,unsigned char num)
{
rest=1;
writebyte(addr);
writebyte(num);
rest=0;
}




void ds_init()
{

sck=0;

rest=1;
Nop();
Nop();


rest=0;
TRISEbits.TRISE1=0;
TRISEbits.TRISE2=0;
TRISAbits.TRISA4=0;
write(0x8e,0x0);  
write(0x80,0x0);
write(0xfe,0x0);  

}




void main(void)
{
unsigned char t;
int i;
unsigned char a;
// sys_init();
// pwm1();
  ds_init();
uart_initial();





  write(0x80,0x27);//
  write(0x82,0x27);//
  write(0x84,0x07);//
//  write(0x8e,0x80);
//SetTimer();

//  write(0x82,0x12);//min=59
while(1)
{
  a=read(0x81);

while(!PIR1bits.TXIF);
for(i=0;i<1000;i++)
;
    TXREG =a;
PIR1bits.TXIF=1;
for(i=0;i<1000;i++)
;
  
}  
}

使用特权

评论回复
7
岛岛|  楼主 | 2011-8-22 10:03 | 只看该作者
这是程序

使用特权

评论回复
8
岛岛|  楼主 | 2011-8-22 10:05 | 只看该作者
现在读出的全是0   但是示波器能看到在计时

使用特权

评论回复
9
aaron96031| | 2011-8-22 10:54 | 只看该作者
换个1302 看看,要不就是 你的时序, 注意看 DS1302 CLK 的要求

使用特权

评论回复
10
gurong60| | 2011-8-22 13:37 | 只看该作者
楼主,ds1302有的需要在数据时钟线上加10k的上拉电阻

使用特权

评论回复
11
岛岛|  楼主 | 2011-8-22 13:49 | 只看该作者
加过也没反映    示波器是能看到时钟线的 只是在时钟引脚高电平时数据线肯定是高电平 怀疑单片机没配置好

使用特权

评论回复
12
NE5532| | 2011-8-22 15:17 | 只看该作者
8层端口状态问题了。

使用特权

评论回复
13
岛岛|  楼主 | 2011-8-22 19:48 | 只看该作者
多谢各位指点 换了个端口 搞定!

使用特权

评论回复
14
dogglove| | 2011-8-25 18:10 | 只看该作者
应该是端口没有设置好

使用特权

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

本版积分规则

25

主题

61

帖子

2

粉丝