打印

ds1302 +pic18f4550 有问题

[复制链接]
1954|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiejh|  楼主 | 2011-3-20 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么在示波器上可以显示05啊,06啊这样的数据,但是在仿真状态下观察变量的值却一直为0,程序如下:
#include <p18f4550.h>
#define sda_in PORTEbits.RE1
#define sda_out LATEbits.LATE1
#define sck LATEbits.LATE0
#define rest LATAbits.LATA2  
uchar readbyte()
{
uchar i,j,num;
j=0;
TRISEbits.TRISE1=1;
for(i=8;i>0;i--)
{
  sda_in=1;
  num >>=1;
  if(sda_in)
   num|=0x80;
  else
   num&=0x7f;
  sck=1;
  Nop();
  Nop();
  sck=0;
}
TRISEbits.TRISE1=0;
return num;
}
void writebyte(uchar addr)
{
uchar i,j=0;
for(i=8;i>0;i--)
{
  if(addr & 0x01)
   sda_out=1;
  else
   sda_out=0;
  sck=1;
  Nop();
  Nop();
  sck=0;
  addr >>=1;
}
}
uchar read(uchar addr)
{
uchar num;
rest=1;
writebyte(addr);
num=readbyte();
rest=0;
return num;
}
void write(uchar addr,uchar num)
{
rest=1;
writebyte(addr);
writebyte(num);
rest=0;
}
void ds_init()
{

sck=0;
//LATEbits.LATE0=0;
rest=1;
TRISEbits.TRISE0=0;
TRISEbits.TRISE1=0;
TRISAbits.TRISA2=0;
write(0x8e,0x0);  /* 允许写入单个数据字节 */
write(0x80,0x0);  /* ch=0 */
write(0xfe,0x0);  
}
void main(void)
{
uchar t;
// sys_init();
// pwm1();
  ds_init();
  
  write(0x82,0x12);//
  write(0x84,0x07);//
//  write(0x8e,0x80);
SetTimer();
  while(1)
{
//  write(0x82,0x12);//min=59
  xxx[0]=read(0x83);
  if(xxx[0]==0)
  {
    TRISCbits.TRISC1=0; //点亮第2个LED
   PORTCbits.RC1=~PORTCbits.RC1;
  }
}
}
而去晶振一直没有用示波器测出来,请教大虾们

相关帖子

沙发
tiejh|  楼主 | 2011-3-20 15:58 | 只看该作者
就是在主循环里面的while里面,xxx【0】=read(0x83), 0x83的值和开始用0x82写入的值05都可以从示波器上读出,而且过一分钟后就读出06,再过一分钟读出07,(一直都是在仿真状态下),0x83这个数据确实是在sck的上升沿读出的,05 就是不在上升沿,而是在sck低电平的时候读出的,纳闷了

使用特权

评论回复
板凳
tiejh|  楼主 | 2011-3-20 16:03 | 只看该作者
哦,里面有个SetTimer();要注释掉,这个是用于设置年、星期、月、日、时、分、秒的

使用特权

评论回复
地板
岛岛| | 2011-8-20 18:11 | 只看该作者
搞出来没

使用特权

评论回复
5
huise2008| | 2011-8-22 21:55 | 只看该作者
else
   num&=0x7f;
多余

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝