搜索
bottom↓
回复: 5

为什么我读的DS1302数据隔一个数就出现一个乱码

[复制链接]

出0入0汤圆

发表于 2010-11-2 16:28:14 | 显示全部楼层 |阅读模式
为什么我读的DS1302数据隔一个数就出现一个乱码  比如显示01完是个乱码 然后是03 然后就是乱码 然后05。乱码   07 乱码  。。这样一直下去 有知道为什么的吗
程序如下
#include <reg52.h>
#include <DS1302.H>
sbit DS1302_data=P3^7;
sbit  DS1302_cs=P3^5;
sbit DS1302_clk=P3^6;
sbit wei=P2^7;
sbit duan=P2^6;
xdata table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
xdata table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
table3[]={0,0,6,0,6,0};


//#include "intrins.h"

unsigned char year,month,date,hour,minute,second,week,a,b,c,i,j;
//unsigned char display_buffer[6];
void delay()
{
        for(i=0;i<50;i++)
        {for(j=0;j<10;j++);
        }

}
void short_ds1302_delay();//短延时
void long_ds1302_delay();//长延时
void DS1302_write(unsigned char DS1302_temp);  //写入一个字节
unsigned char DS1302_read(void);        //读一字节
void DS1302_init();//ds1302初始化
void DS1302_write_time(int command,int dat);//写入second or minute or hour......        or 写入一个命令
unsigned char DS1302_read_time(int command);//读取second or minute or hour......

void short_ds1302_delay()
{
  unsigned char i;
  for(i=0;i<5;i++);
}

void long_ds1302_delay()
{
  unsigned char i;
  for(i=0;i<25;i++);
}

void DS1302_write(unsigned char DS1302_temp)  //写入一个字节
{
  unsigned char i,temp;
  long_ds1302_delay();
  temp=DS1302_temp;
  for(i=0;i<8;i++)
  {
    DS1302_data=temp&0x01;
        short_ds1302_delay();
        DS1302_clk=1;
        short_ds1302_delay();
        DS1302_clk=0;
        temp=temp>>1;
  }
}

unsigned char DS1302_read(void)        //读一字节
{
  unsigned char i,temp;
  long_ds1302_delay();
  temp=0;
  for(i=0;i<8;i++)
  {
    temp=temp>>1;
        if(DS1302_data==1)
          temp=temp+0x80;
        DS1302_clk=1;
        short_ds1302_delay();
        DS1302_clk=0;
        short_ds1302_delay();
  }
  return temp;
}
/*
/////////写操作设置,当a=0x80时禁止写操作,a=0x00时允许////////////////

void DS1302_write_able(unsigned char a)
{
  DS1302_cs=0;

  DS1302_clk=0;
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(0x8e);
  DS1302_data=1;
  DS1302_write(a);
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;
}

/////////读操作设置,当a=0x80时禁止读操作,a=0x00时允许////////////////

void DS1302_read_able(unsigned char a)
{
  DS1302_cs=0;

  DS1302_clk=0;
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(0x8f);
  DS1302_data=1;
  DS1302_write(a);
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;
}
*/
////////////////////ds1302初始化////////////////////////
void DS1302_init()
{
  unsigned char i;
  DS1302_write_time(0x8e,0x00);           //允许写操作

  DS1302_cs=0;

  DS1302_clk=0;
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(0x81);
  DS1302_data=1;
  i=DS1302_read();
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;
  second=((i>>4)&0x07)*10+(i&0x0f);

  DS1302_clk=0;
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(0x80);
  DS1302_data=1;
  DS1302_write(0x7f&i);
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;       
  
  DS1302_clk=0;                         //充电设置
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(0x90);
  DS1302_data=1;
//  DS1302_write(0xa6);           //允许充电,一个二极管 4k电阻
  DS1302_write(0x00);           //禁止充电
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;         
   
  DS1302_write_time(0x8e,0x80);           //禁止写操作
}

unsigned char DS1302_read_time(int command)//读取second or minute or hour......
{
  unsigned char i;
  DS1302_clk=0;
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(command);
  DS1302_data=1;
  i=DS1302_read();
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;
  return i;
}
void DS1302_readdate()
{
  unsigned char i;
  DS1302_cs=0;

  //读取second
  i=DS1302_read_time(0x81);
  second=((i>>4)&0x07)*10+(i&0x0f);

  //读取分minute
  i=DS1302_read_time(0x83);
  minute=((i>>4)&0x07)*10+(i&0x0f);

  //读取时hour
  i=DS1302_read_time(0x85);
  hour=((i>>4)&0x03)*10+(i&0x0f);

  //读取日date
  i=DS1302_read_time(0x87);
  date=((i>>4)&0x03)*10+(i&0x0f);

  //读取月份month
  i=DS1302_read_time(0x89);
  month=((i>>4)&0x01)*10+(i&0x0f);

  //读取周week
  i=DS1302_read_time(0x8b);
  week=i&0x07;

  //读取年份year
  i=DS1302_read_time(0x8d);
  year=((i>>4)&0x0f)*10+(i&0x0f);
}


void DS1302_write_time(int command,int dat)//写入second or minute or hour......        or 写入一个命令
{
  DS1302_clk=0;
  short_ds1302_delay();
  DS1302_cs=1;
  DS1302_write(command);
  DS1302_data=1;
  DS1302_write(dat);
  DS1302_cs=0;
  short_ds1302_delay();
  DS1302_clk=1;
}

void DS1302_writedate()
{

  DS1302_write_time(0x8e,0x00);           //允许写操作
  DS1302_cs=0;

  //写second
  DS1302_write_time(0x80,0x7f&(((second/10)<<4)+(second%10)));

  //minute
  DS1302_write_time(0x82,0x7f&(((minute/10)<<4)+(minute%10)));

  //hour
  DS1302_write_time(0x84,0x3f&(((hour/10)<<4)+(hour%10)));

  //date
  DS1302_write_time(0x86,0x3f&(((date/10)<<4)+(date%10)));

  //month
  DS1302_write_time(0x88,0x1f&(((month/10)<<4)+(month%10)));

  //week
  DS1302_write_time(0x8a,0x07&week);

  //year
  DS1302_write_time(0x8c,((year/10)<<4)+(year%10));

  DS1302_write_time(0x8e,0x80);           //禁止写操作
}
main()
{
DS1302_init();
  DS1302_write_time(0x8e,0x00);           //允许写操作
  DS1302_cs=0;

  //写second
DS1302_write_time(0x80,0x7f&(((second/10)<<4)|(second%10)));

  DS1302_write_time(0x8e,0x80);           //禁止写操作
while(1){  a=DS1302_read_time(0x81);

  //second=((a&0x07)>>4)*10+(a&0x0f);
                b=(a&0x70)>>4;
                 c=a&0x0f;

        wei=1;
                        P0=table1[0];
                        wei=0;
                        duan=1;
                       
                //        t=table3;
                        P0=table2;
                        duan=0;
                        delay();
                               
               

               
               
               
                wei=1;
                        P0=table1[1];
                        wei=0;
                        duan=1;
       
                       
                //        t=table3;
                        P0=table2[c];
                        duan=0;       
                                delay();
}}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-11-29 15:05:38 | 显示全部楼层
时序!!时序!!

出0入0汤圆

发表于 2010-11-29 23:15:38 | 显示全部楼层
楼上说的时序问题

或者

IO接口没有上拉。。。。。。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2013-12-25 23:41:00 | 显示全部楼层
我也遇到这个问题了  和时序有啥关系啊亲们

出0入0汤圆

发表于 2013-12-25 23:47:29 | 显示全部楼层
是因为很蛋疼的使用了累加器A么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 05:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表