5095|9

34

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DS1302时钟不能调整 [复制链接]

DS1302 可以正常显示时间,但是不能调整时间(调整后的时钟写入DS1302的程序还没写),看不出来时钟调整那块出了什么问题,大家帮忙看看吧 !谢谢
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char 
#define uint unsigned int

uchar ,flag;
uint hour,min,sec,;
uchar m[3];  //秒,分,时寄存器初始值

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40} ;

sbit DIO=P3^4;
sbit SCL=P3^6;
sbit CE=P3^5;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit k4=P3^3;
sbit ACC_7=ACC^7; //最好用ACC,不然有问题
/*----------宏定义读写 秒,分,时,日期的寄存器地址和控制字-----*/
#define write_sec        0x80
#define write_min        0x82
#define write_hour       0x84
#define write_day        0x86
#define write_month      0x88
#define write_week       0x8a
#define write_year       0x8c
#define read_second      0x81
#define read_minute      0x83
#define read_hour        0x85
#define read_day         0x87
#define read_month       0x89
#define read_week        0x8B
#define read_year        0x8D
#define write_protect    0x8E
void delay()
{
  uchar i,j;
  for(i=0;i<10;i++)
     for(j=0;j<10;j++);
}

void writebyte(uchar dat)
{
     uchar i,tmp;
  tmp=dat;   
  SCL=0;
  for(i=8;i>0;i--)  
 {
   DIO=tmp&0x01;
   SCL=0;
 SCL=1;
tmp>>=1;
 }
  
}
void writedata(uchar add,uchar dat)
{
CE=0;
SCL=0;
CE=1;
writebyte(add);
 writebyte(dat);
   SCL=1;
CE=0;
}
uchar readdata(uchar add)
{
uchar j,dat;
 CE=0;    //终止传输
SCL=0;
CE=1;  //开始传输
writebyte(add);
 for(j=8;j>0;j--)
   {   
  dat>>=1;
  SCL=1;  
 SCL=0;
  if(DIO)dat|=0x80;    
}
 SCL=1;
 CE=0;
 return dat;
}


void dis()
{
     uint a,b,c;
if(flag==0)
{
hour=m[2];
min=m[1];
sec=m[0];
a=hour=(hour/16)*10+hour%16;
b=min=(min/16)*10+min%16;
c=sec=(sec/16)*10+sec%16;
}
if(flag==1)
 {
   a=hour;
     b=min;
 c=0;
 }
P0=table[a/10];
P2=0;
delay();

P0=table[a%10];
P2=1;
delay();

P0=0x40;
P2=2;
delay();

P0=table[b/10];
P2=3;
delay();

P0=table[b%10];
P2=4;
delay();

P0=0x40;
P2=5;
delay();

P0=table[c/10];
P2=6;
delay();

P0=table[c%10];
P2=7;
delay();
}
void delay1()
{
uchar i,j;
       for(i=0;i<10;i++)
         for(j=0;j<20;j++)dis();
}
void key()
 {
     
    dis();
  if(k1==0)
delay1();
if(k1==0)flag++;
  if(flag==1)
      {  
   
                     if(k2==0)
    delay1();
  if(k2==0)hour++ ;
    if(hour>24)hour=0;
  if(k3==0)
              delay1();
            if(k3==0)hour-- ;
  if(hour<0)hour=23;
  dis(); 
}     
 
 if(flag==2)
  {
 
                          if(k2==0)
         delay1();
  if(k2==0)min++ ;
    if(hour>59)min=0;
  if(k3==0)
              delay1();
            if(k3==0)min-- ;
  if(hour<0)hour=59;
dis();
}    
  
  if(flag=3)flag=0;
 
   

 
  }  

void init()
{
       writedata(0x8e,0x00); //WP=0 写操作
writedata(0x80,0x00);//0x80是写秒数据此处写进"00"秒
writedata(0x82,0x59);//0x82是写分数据
writedata(0x84,0x23);//0x84是写时数据
writedata(0x8e,0x80); //WP=1 写保护 
}
void main()
{
  uchar i,add;
    init();
while(1)
{
  add=0x81;
for(i=0;i<3;i++)
{
    m=readdata(add);
add+=2;
}
key();
}
此帖出自51单片机论坛

最新回复

调完时间后 你没有写入到芯片  所以还是读回原来的时间。  详情 回复 发表于 2012-5-27 12:51
点赞 关注
 

回复
举报

315

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
void key()
{
 dis();
 if(k1==0)
 {
  delay1();
     if(k1==0)
   flag++;
 }
 if(flag==1)
 {
  if(k2==0)
  {
      delay1();
     if(k2==0)
   {
    hour++;
       if(hour>23)
     hour=0;
   }
  }
   if(k3==0)
  {
         delay1();
            if(k3==0)
   {
    hour--;
         if(hour>23)
     hour=23;
   }
  }
    dis();
 }    
 
 if(flag==2)
 {
  if(k2==0)
        {
   delay1();
   if(k2==0)
   {
    min++ ;
       if(min>59)
     min=0;
   }
  }
    if(k3==0)
  {
         delay1();
            if(k3==0)
   {
    min-- ;
     if(min>59)
    min=59;
   }
  }
  dis();   
   }
 if(flag==3)
  flag=0;
}
  [ 本帖最后由 孤獨の快樂 于 2012-1-12 23:42 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 

提醒下,min和hour都是uint,不会小于0的······

其实uchar就可以了,又不会超过255,BCD码8位也够

[ 本帖最后由 孤獨の快樂 于 2012-1-12 15:56 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳 孤獨の快樂 的帖子

现在主要是按键时,不能达到我所要的效果,不能调节时钟,改怎么解决呢?
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

5
 

原帖由 skyman_liu 于 2012-1-12 17:33 发表 现在主要是按键时,不能达到我所要的效果,不能调节时钟,改怎么解决呢?

你的按键程序有问题,我2L不就有写程序了吗

此帖出自51单片机论坛
 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 5楼 孤獨の快樂 的帖子

那个程序还是不行啊,和我的程序运行效果一样的,都不能调节时钟,教我下怎么改吧 ,谢谢
此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

7
 

原帖由 skyman_liu 于 2012-1-12 21:49 发表 那个程序还是不行啊,和我的程序运行效果一样的,都不能调节时钟,教我下怎么改吧 ,谢谢

你确定你有加时间写入DS1302的程序?

此帖出自51单片机论坛
 
 
 

回复

315

帖子

0

TA的资源

五彩晶圆(初级)

8
 

我改了下程序,仿真可以显示了

说明:1.之所以加了个E1使能端,因为段码改变时不关位选,数码管显示会错误。(实际不知道怎么样,起码我仿真会有问题)

           2.P1=flag只是为了知道此时flag是多少

           3.按键得按一会儿才会有作用,估计是延时太久了,你可以自己改改

           4.其余应该能理解,有问题再问吧

ds1302.rar

57.32 KB, 下载次数: 24

此帖出自51单片机论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(初级)

9
 
你做按键调整的时候买有开保护,不开保护怎么能写进数据呢?
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

10
 
调完时间后 你没有写入到芯片  所以还是读回原来的时间。
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表