ds1302在12864上显示时间,不走,与我的初始时间不一样

2019-07-15 19:57发布

发下我的程序,大家 看看哪有错误
#define uchar unsigned char
#define  unit unsigned int
#define           write_second 0x80
#define           write_minute        0x82
#define           write_hour        0x84
#define           read_second  0x83
#define           read_minute        0x85
#define           read_hour        0x8e
sbit SCLK=P3^3;
sbit SDA=P3^4;
sbit RST=P3^5;
uchar hour=23;minute=59;second=58;
void delay1(uchar x)
{
   uchar i;
   while(x--)
   for(i=0;i<110;i++);
}







void DS1302WriteByte(uchar dat)
{
uchar i;


for(i=0;i<8;i++
{
SDA=dat&0x01
delay1(2);
SCLK=1
delay1(2);
dat>>=1;
SCLK=0;
}
}


uchar DS1302ReadByte()
{
uchar i,dat;
delay1(2);
for(i=0;i<8;i++)
{
dat>>=1;
if(SDA==1
dat|=0x80;

delay1(2);
SCLK=0;
delay1(2);
}
return dat;
}


/*每次发起数据传输之前,要复位ds1302*/


void resetds1302(void)
{
         RST=0;
         SCLK=0;
         RST=1;
}
/*写数据前清除写保护*/
void cleards1302wp(void)
{
           resetds1302();
           RST=1;
           DS1302WriteByte(0X8E);
           DS1302WriteByte(0);
           SDA=0;
           RST=0;
}
/*写完数据设置写保护*/


void setds1302wp(void)
{
         resetds1302();
         RST=1;
         DS1302WriteByte(0X8E);
           DS1302WriteByte(0X80);
           SDA=0;
           RST=0;
}


uchar DS1302Read(uchar addr)
{
     uchar tmp=0;
     resetds1302();
     RST=1;
     DS1302WriteByte(addr);
         tmp=DS1302ReadByte();
         SDA=0;
         RST=0;
         return tmp;


}


void  DS1302Write(uchar addr,uchar dat)
{
    resetds1302;
        RST=1;
        DS1302WriteByte(addr);
        DS1302WriteByte(dat);
        SDA=0;
        RST=0;


}




void set_time(uchar addr,uchar time)
{
     uchar tmp;
         tmp=time/10;
         time=time%10;
         time=time+tmp*16;
         cleards1302wp();
     DS1302Write(addr,time);
     setds1302wp();
}


void read_time(uchar addr,uchar time)
{
        time=DS1302Read(addr);


}
void dispalytime(uchar addr,uchar time)
{
          uchar shi,ge;
          shi=time/16;
          ge=time%16;
          com(addr);
          dat(0x30+shi);
          dat(0x30+ge);
}




void  main()
{
  set_time(write_hour,hour);
         set_time(write_minute,minute);
         set_time(write_second,second);
    while(1)
        {  


          read_time(read_hour,hour);
          dispalytime(0x90,hour);
          read_time(read_minute,minute);
          dispalytime(0x92,minute);
          read_time(read_second,second);
          dispalytime(0x94,second);
       }
}


com(),dat()  是12864 显示所需子函数.  硬件上一开始显示初始值,完后马上显示17 : 3; : 3:
这算是乱码吗?且时间不变化,
硬件上没有在晶振处加电容   谁有能用的程序给一份  但是大多数都是这样的吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
依然落叶飘零
1楼-- · 2019-07-16 01:41
我弄了好几个小时都没有弄出来。还是提几点。
第一:直接将hour=0x23;minute=0x59;second=0x58;保存进ds1302就是时间23:59:58
        读取出来的数值shi=time/16;ge=time%16;这样转换就行了。
第二:DS1302ReadByte()这个函数for里面是有SCLK=0;没有SCLK=1。不产生脉冲。
第三:刚才说的,你这个函数有问题
  1. void read_time(uchar addr,uchar time)
  2. {
  3.         time=DS1302Read(addr);
  4. }
复制代码
调用这个函数read_time(read_hour,hour);是不改变hour的值的。
例如下面这个函数
  1. #include <reg52.h>

  2. unsigned char a=1,b=2;
  3. void add(unsigned char i,unsigned char j)
  4. {
  5.         j = i+3;
  6. }
  7. void  main()
  8. {
  9.         add(a,b);         
  10. }
复制代码
调用add(a,b)运行后b的值是不改变的依然是b=2,而不是b=4。
实参向形参的数据传递是“值传递”,只由实参传送给形参,而不能由形参传回给实参。
调用这个函数只是将a,b的值传给i,j。运算后的值是不能传回给a,b的。
同理read_time(read_hour,hour);调用这个函数,只是将read_hour,hour的值传给参数uchar addr,uchar time。程序运行后hour的值是不改变的。 最佳答案
Mr.thanks
2楼-- · 2019-07-16 05:49
您看看这个吧

1820 1302.rar 下载积分: 积分 -1 分

76.24 KB, 下载次数: 110, 下载积分: 积分 -1 分

ethu_11
3楼-- · 2019-07-16 11:08
12864显示程序,可以直接加载的

12864液晶显示.zip 下载积分: 积分 -1 分

2.5 KB, 下载次数: 86, 下载积分: 积分 -1 分

lxc007
4楼-- · 2019-07-16 16:30
 精彩回答 2  元偷偷看……
lxc007
5楼-- · 2019-07-16 17:10
ethu_11 发表于 2014-4-30 18:35
12864显示程序,可以直接加载的

为什么我的时间一直不走   ,有的程序完全没有bcd转化这也行?  而有的直接连设置时间也没有.
还有上面传的程序中ACC是什么?不懂啊
依然落叶飘零
6楼-- · 2019-07-16 19:51
你程序问题多多。第一:uchar hour=23;minute=59;second=58;你这个定义错了。你这样定义hour是uchar,minute和second都是int,应该是uchar hour=23,minute=59,second=58;
第二;你的C语言有点不过关。
  1. void read_time(uchar addr,uchar time)
  2. {
  3.         time=DS1302Read(addr);
  4. }
复制代码
这个函数有点问题。例如read_time(read_hour,hour);这个语句,他运行的结果是不改变hour的值的。
楼主再去看看形参和实参的关系。实参向形参的数据传递是“值传递”,只由实参传送给形参,而不能由形参传回给实参。可以不要这个函数,主函数读取小时改为hour=DS1302Read(read_hour)。
第三:我猜楼主的数据处理也有问题。17 : 3; : 3:显示这个并不是没有规律的他就是23:59:58的十六进制显示。就是17:3B:3A写进去LCD1602就显示为17 : 3; : 3:

一周热门 更多>